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