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/check.h"
10 #include "base/logging.h"
11 #include "media/cdm/library_cdm/cdm_host_proxy.h"
12 #include "media/cdm/library_cdm/cdm_host_proxy_impl.h"
13 
14 namespace media {
15 
16 namespace {
17 static MockLibraryCdm* g_mock_library_cdm = nullptr;
18 }  // namespace
19 
20 // static
GetInstance()21 MockLibraryCdm* MockLibraryCdm::GetInstance() {
22   return g_mock_library_cdm;
23 }
24 
25 template <typename HostInterface>
MockLibraryCdm(HostInterface * host,const std::string & key_system)26 MockLibraryCdm::MockLibraryCdm(HostInterface* host,
27                                const std::string& key_system)
28     : cdm_host_proxy_(new CdmHostProxyImpl<HostInterface>(host)) {}
29 
~MockLibraryCdm()30 MockLibraryCdm::~MockLibraryCdm() {
31   DCHECK(g_mock_library_cdm);
32   g_mock_library_cdm = nullptr;
33 }
34 
GetCdmHostProxy()35 CdmHostProxy* MockLibraryCdm::GetCdmHostProxy() {
36   return cdm_host_proxy_.get();
37 }
38 
Initialize(bool allow_distinctive_identifier,bool allow_persistent_state,bool use_hw_secure_codecs)39 void MockLibraryCdm::Initialize(bool allow_distinctive_identifier,
40                                 bool allow_persistent_state,
41                                 bool use_hw_secure_codecs) {
42   cdm_host_proxy_->OnInitialized(true);
43 }
44 
CreateMockLibraryCdm(int cdm_interface_version,const char * key_system,uint32_t key_system_size,GetCdmHostFunc get_cdm_host_func,void * user_data)45 void* CreateMockLibraryCdm(int cdm_interface_version,
46                            const char* key_system,
47                            uint32_t key_system_size,
48                            GetCdmHostFunc get_cdm_host_func,
49                            void* user_data) {
50   DVLOG(1) << __func__;
51   DCHECK(!g_mock_library_cdm);
52 
53   std::string key_system_string(key_system, key_system_size);
54 
55   // We support CDM_10 and CDM_11.
56   using CDM_10 = cdm::ContentDecryptionModule_10;
57   using CDM_11 = cdm::ContentDecryptionModule_11;
58 
59   if (cdm_interface_version == CDM_10::kVersion) {
60     CDM_10::Host* host = static_cast<CDM_10::Host*>(
61         get_cdm_host_func(CDM_10::Host::kVersion, user_data));
62     if (!host)
63       return nullptr;
64 
65     DVLOG(1) << __func__ << ": Create ClearKeyCdm with CDM_10::Host.";
66     g_mock_library_cdm = new MockLibraryCdm(host, key_system_string);
67     return static_cast<CDM_10*>(g_mock_library_cdm);
68   }
69 
70   if (cdm_interface_version == CDM_11::kVersion) {
71     CDM_11::Host* host = static_cast<CDM_11::Host*>(
72         get_cdm_host_func(CDM_11::Host::kVersion, user_data));
73     if (!host)
74       return nullptr;
75 
76     DVLOG(1) << __func__ << ": Create ClearKeyCdm with CDM_11::Host.";
77     g_mock_library_cdm = new MockLibraryCdm(host, key_system_string);
78     return static_cast<CDM_11*>(g_mock_library_cdm);
79   }
80 
81   return nullptr;
82 }
83 
84 }  // namespace media
85