// Copyright 2013 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_CDM_CDM_WRAPPER_H_ #define MEDIA_CDM_CDM_WRAPPER_H_ #include <stdint.h> #include "base/check.h" #include "base/feature_list.h" #include "base/memory/raw_ptr.h" #include "media/base/media_switches.h" #include "media/cdm/api/content_decryption_module.h" #include "media/cdm/cdm_helpers.h" #include "media/cdm/supported_cdm_versions.h" namespace media { namespace { cdm::VideoDecoderConfig_2 ToVideoDecoderConfig_2( const cdm::VideoDecoderConfig_3& config) { … } } // namespace // Returns a pointer to the requested CDM upon success. // Returns NULL if an error occurs or the requested |cdm_interface_version| or // |key_system| is not supported or another error occurs. // The caller should cast the returned pointer to the type matching // |cdm_interface_version|. // Caller retains ownership of arguments and must call Destroy() on the returned // object. CreateCdmFunc; // CdmWrapper wraps different versions of ContentDecryptionModule interfaces and // exposes a common interface to the caller. // // The caller should call CdmWrapper::Create() to create a CDM instance. // CdmWrapper will first try to create a CDM instance that supports the latest // CDM interface (ContentDecryptionModule). If such an instance cannot be // created (e.g. an older CDM was loaded), CdmWrapper will try to create a CDM // that supports an older version of CDM interface (e.g. // ContentDecryptionModule_*). Internally CdmWrapper converts the CdmWrapper // calls to corresponding ContentDecryptionModule calls. // // Since this file is highly templated and default implementations are short // (just a shim layer in most cases), everything is done in this header file. // // TODO(crbug.com/41363203): After pepper CDM support is removed, this file can // depend on media/ and we can clean this class up, e.g. pass in CdmConfig. class CdmWrapper { … }; // Template class that does the CdmWrapper -> CdmInterface conversion. Default // implementations are provided. Any methods that need special treatment should // be specialized. template <int CdmInterfaceVersion> class CdmWrapperImpl : public CdmWrapper { … }; // Specialization for cdm::ContentDecryptionModule_10 methods. template <> cdm::Status CdmWrapperImpl<10>::InitializeVideoDecoder( const cdm::VideoDecoderConfig_3& video_decoder_config) { … } // static CdmWrapper* CdmWrapper::Create(CreateCdmFunc create_cdm_func, const char* key_system, uint32_t key_system_size, GetCdmHostFunc get_cdm_host_func, void* user_data) { … } } // namespace media #endif // MEDIA_CDM_CDM_WRAPPER_H_