1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "media/cdm/library_cdm/mock_library_cdm.h"
6 
7 #include <string>
8 
9 #include "base/logging.h"
10 #include "media/cdm/library_cdm/cdm_host_proxy.h"
11 #include "media/cdm/library_cdm/cdm_host_proxy_impl.h"
12 
13 namespace media {
14 
15 namespace {
16 static MockLibraryCdm* g_mock_library_cdm = nullptr;
17 }  // namespace
18 
19 // static
GetInstance()20 MockLibraryCdm* MockLibraryCdm::GetInstance() {
21   return g_mock_library_cdm;
22 }
23 
24 template <typename HostInterface>
MockLibraryCdm(HostInterface * host,const std::string & key_system)25 MockLibraryCdm::MockLibraryCdm(HostInterface* host,
26                                const std::string& key_system)
27     : cdm_host_proxy_(new CdmHostProxyImpl<HostInterface>(host)) {}
28 
~MockLibraryCdm()29 MockLibraryCdm::~MockLibraryCdm() {
30   DCHECK(g_mock_library_cdm);
31   g_mock_library_cdm = nullptr;
32 }
33 
GetCdmHostProxy()34 CdmHostProxy* MockLibraryCdm::GetCdmHostProxy() {
35   return cdm_host_proxy_.get();
36 }
37 
Initialize(bool allow_distinctive_identifier,bool allow_persistent_state,bool use_hw_secure_codecs)38 void MockLibraryCdm::Initialize(bool allow_distinctive_identifier,
39                                 bool allow_persistent_state,
40                                 bool use_hw_secure_codecs) {
41   cdm_host_proxy_->OnInitialized(true);
42 }
43 
CreateMockLibraryCdm(int cdm_interface_version,const char * key_system,uint32_t key_system_size,GetCdmHostFunc get_cdm_host_func,void * user_data)44 void* CreateMockLibraryCdm(int cdm_interface_version,
45                            const char* key_system,
46                            uint32_t key_system_size,
47                            GetCdmHostFunc get_cdm_host_func,
48                            void* user_data) {
49   DVLOG(1) << __func__;
50   DCHECK(!g_mock_library_cdm);
51 
52   std::string key_system_string(key_system, key_system_size);
53 
54   // We support CDM_10 and CDM_11.
55   using CDM_10 = cdm::ContentDecryptionModule_10;
56   using CDM_11 = cdm::ContentDecryptionModule_11;
57 
58   if (cdm_interface_version == CDM_10::kVersion) {
59     CDM_10::Host* host = static_cast<CDM_10::Host*>(
60         get_cdm_host_func(CDM_10::Host::kVersion, user_data));
61     if (!host)
62       return nullptr;
63 
64     DVLOG(1) << __func__ << ": Create ClearKeyCdm with CDM_10::Host.";
65     g_mock_library_cdm = new MockLibraryCdm(host, key_system_string);
66     return static_cast<CDM_10*>(g_mock_library_cdm);
67   }
68 
69   if (cdm_interface_version == CDM_11::kVersion) {
70     CDM_11::Host* host = static_cast<CDM_11::Host*>(
71         get_cdm_host_func(CDM_11::Host::kVersion, user_data));
72     if (!host)
73       return nullptr;
74 
75     DVLOG(1) << __func__ << ": Create ClearKeyCdm with CDM_11::Host.";
76     g_mock_library_cdm = new MockLibraryCdm(host, key_system_string);
77     return static_cast<CDM_11*>(g_mock_library_cdm);
78   }
79 
80   return nullptr;
81 }
82 
83 }  // namespace media
84