1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file. 4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/renderer/media/chrome_key_systems.h" 6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <string> 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <vector> 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/logging.h" 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/string16.h" 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/string_split.h" 131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/common/render_messages.h" 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/cdm/renderer/widevine_key_systems.h" 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/public/renderer/render_thread.h" 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_ANDROID) 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/cdm/renderer/android_key_systems.h" 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. 23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// The following must be after widevine_cdm_version.h. 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_MIN_GLIBC_VERSION) 27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <gnu/libc-version.h> 28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/version.h" 29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)using content::KeySystemInfo; 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing content::SupportedCodecs; 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static bool IsPepperCdmAvailable( 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& pepper_type, 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<base::string16>* additional_param_names, 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<base::string16>* additional_param_values) { 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool is_available = false; 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) content::RenderThread::Get()->Send( 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ChromeViewHostMsg_IsInternalPluginAvailableForMimeType( 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) pepper_type, 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &is_available, 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) additional_param_names, 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) additional_param_values)); 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return is_available; 48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// External Clear Key (used for testing). 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)static void AddExternalClearKey( 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<KeySystemInfo>* concrete_key_systems) { 53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static const char kExternalClearKeyKeySystem[] = 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "org.chromium.externalclearkey"; 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static const char kExternalClearKeyDecryptOnlyKeySystem[] = 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "org.chromium.externalclearkey.decryptonly"; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static const char kExternalClearKeyFileIOTestKeySystem[] = 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "org.chromium.externalclearkey.fileiotest"; 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static const char kExternalClearKeyInitializeFailKeySystem[] = 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "org.chromium.externalclearkey.initializefail"; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static const char kExternalClearKeyCrashKeySystem[] = 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "org.chromium.externalclearkey.crash"; 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static const char kExternalClearKeyPepperType[] = 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "application/x-ppapi-clearkey-cdm"; 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<base::string16> additional_param_names; 671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<base::string16> additional_param_values; 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!IsPepperCdmAvailable(kExternalClearKeyPepperType, 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &additional_param_names, 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &additional_param_values)) { 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return; 721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) KeySystemInfo info(kExternalClearKeyKeySystem); 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu info.supported_codecs = content::EME_CODEC_WEBM_ALL; 77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS) 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu info.supported_codecs |= content::EME_CODEC_MP4_ALL; 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif // defined(USE_PROPRIETARY_CODECS) 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) info.pepper_type = kExternalClearKeyPepperType; 82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) concrete_key_systems->push_back(info); 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Add support of decrypt-only mode in ClearKeyCdm. 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info.key_system = kExternalClearKeyDecryptOnlyKeySystem; 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) concrete_key_systems->push_back(info); 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A key system that triggers FileIO test in ClearKeyCdm. 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info.key_system = kExternalClearKeyFileIOTestKeySystem; 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) concrete_key_systems->push_back(info); 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // A key system that Chrome thinks is supported by ClearKeyCdm, but actually 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // will be refused by ClearKeyCdm. This is to test the CDM initialization 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // failure case. 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) info.key_system = kExternalClearKeyInitializeFailKeySystem; 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) concrete_key_systems->push_back(info); 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A key system that triggers a crash in ClearKeyCdm. 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info.key_system = kExternalClearKeyCrashKeySystem; 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) concrete_key_systems->push_back(info); 102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE) 1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// This function finds "codecs" and parses the value into the vector |codecs|. 1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Converts the codec strings to UTF-8 since we only expect ASCII strings and 1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// this simplifies the rest of the code in this file. 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GetSupportedCodecsForPepperCdm( 1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::vector<base::string16>& additional_param_names, 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::vector<base::string16>& additional_param_values, 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<std::string>* codecs) { 1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(codecs->empty()); 1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK_EQ(additional_param_names.size(), additional_param_values.size()); 1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (size_t i = 0; i < additional_param_names.size(); ++i) { 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (additional_param_names[i] == 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::ASCIIToUTF16(kCdmSupportedCodecsParamName)) { 1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const base::string16& codecs_string16 = additional_param_values[i]; 1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string codecs_string; 1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!base::UTF16ToUTF8(codecs_string16.c_str(), 1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) codecs_string16.length(), 1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &codecs_string)) { 1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DLOG(WARNING) << "Non-UTF-8 codecs string."; 1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Continue using the best effort conversion. 1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::SplitString(codecs_string, 1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) kCdmSupportedCodecsValueDelimiter, 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) codecs); 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)static void AddPepperBasedWidevine( 134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<KeySystemInfo>* concrete_key_systems) { 135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(WIDEVINE_CDM_MIN_GLIBC_VERSION) 136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Version glibc_version(gnu_get_libc_version()); 137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(glibc_version.IsValid()); 138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (glibc_version.IsOlderThan(WIDEVINE_CDM_MIN_GLIBC_VERSION)) 139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return; 140d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif // defined(WIDEVINE_CDM_MIN_GLIBC_VERSION) 141d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<base::string16> additional_param_names; 1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<base::string16> additional_param_values; 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!IsPepperCdmAvailable(kWidevineCdmPluginMimeType, 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &additional_param_names, 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &additional_param_values)) { 147d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DVLOG(1) << "Widevine CDM is not currently available."; 148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return; 149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 150d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<std::string> codecs; 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetSupportedCodecsForPepperCdm(additional_param_names, 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) additional_param_values, 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &codecs); 155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SupportedCodecs supported_codecs = content::EME_CODEC_NONE; 1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (size_t i = 0; i < codecs.size(); ++i) { 1580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (codecs[i] == kCdmSupportedCodecVorbis) 1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu supported_codecs |= content::EME_CODEC_WEBM_VORBIS; 1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (codecs[i] == kCdmSupportedCodecVp8) 1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu supported_codecs |= content::EME_CODEC_WEBM_VP8; 1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (codecs[i] == kCdmSupportedCodecVp9) 1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu supported_codecs |= content::EME_CODEC_WEBM_VP9; 164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS) 1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (codecs[i] == kCdmSupportedCodecAac) 1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu supported_codecs |= content::EME_CODEC_MP4_AAC; 1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (codecs[i] == kCdmSupportedCodecAvc1) 1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu supported_codecs |= content::EME_CODEC_MP4_AVC1; 169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif // defined(USE_PROPRIETARY_CODECS) 1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 171d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cdm::AddWidevineWithCodecs(cdm::WIDEVINE, 173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) supported_codecs, 174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) concrete_key_systems); 175d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif // defined(WIDEVINE_CDM_AVAILABLE) 177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif // defined(ENABLE_PEPPER_CDMS) 178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void AddChromeKeySystems(std::vector<KeySystemInfo>* key_systems_info) { 180d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 181d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AddExternalClearKey(key_systems_info); 182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE) 184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AddPepperBasedWidevine(key_systems_info); 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif // defined(WIDEVINE_CDM_AVAILABLE) 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif // defined(ENABLE_PEPPER_CDMS) 187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_ANDROID) 189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cdm::AddAndroidWidevine(key_systems_info); 190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif // defined(OS_ANDROID) 191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 192