cdm_adapter.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "media/cdm/ppapi/cdm_adapter.h"
68bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cdm/ppapi/cdm_file_io_impl.h"
88bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "media/cdm/ppapi/cdm_helpers.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cdm/ppapi/cdm_logging.h"
100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "media/cdm/ppapi/supported_cdm_versions.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_console.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(CHECK_DOCUMENT_URL)
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/cpp/dev/url_util_dev.h"
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/cpp/instance_handle.h"
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // defined(CHECK_DOCUMENT_URL)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(NDEBUG)
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  #define DLOG_TO_CONSOLE(message) LogToConsole(message);
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  #define DLOG_TO_CONSOLE(message) (void)(message);
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsMainThread() {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pp::Module::Get()->core()->IsMainThread();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Posts a task to run |cb| on the main thread. The task is posted even if the
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// current thread is the main thread.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PostOnMain(pp::CompletionCallback cb) {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pp::Module::Get()->core()->CallOnMainThread(0, cb, PP_OK);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Ensures |cb| is called on the main thread, either because the current thread
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is the main thread or by posting it to the main thread.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CallOnMain(pp::CompletionCallback cb) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(tomfinegan): This is only necessary because PPAPI doesn't allow calls
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // off the main thread yet. Remove this once the change lands.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsMainThread())
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cb.Run(PP_OK);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostOnMain(cb);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Configures a cdm::InputBuffer. |subsamples| must exist as long as
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |input_buffer| is in use.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConfigureInputBuffer(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const pp::Buffer_Dev& encrypted_buffer,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PP_EncryptedBlockInfo& encrypted_block_info,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<cdm::SubsampleEntry>* subsamples,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm::InputBuffer* input_buffer) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(subsamples);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(!encrypted_buffer.is_null());
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_buffer->data = static_cast<uint8_t*>(encrypted_buffer.data());
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  input_buffer->data_size = encrypted_block_info.data_size;
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PP_DCHECK(encrypted_buffer.size() >= input_buffer->data_size);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PP_DCHECK(encrypted_block_info.key_id_size <=
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            arraysize(encrypted_block_info.key_id));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_buffer->key_id_size = encrypted_block_info.key_id_size;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  input_buffer->key_id = input_buffer->key_id_size > 0 ?
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      encrypted_block_info.key_id : NULL;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PP_DCHECK(encrypted_block_info.iv_size <= arraysize(encrypted_block_info.iv));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_buffer->iv_size = encrypted_block_info.iv_size;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  input_buffer->iv = encrypted_block_info.iv_size > 0 ?
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      encrypted_block_info.iv : NULL;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  input_buffer->num_subsamples = encrypted_block_info.num_subsamples;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (encrypted_block_info.num_subsamples > 0) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    subsamples->reserve(encrypted_block_info.num_subsamples);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (uint32_t i = 0; i < encrypted_block_info.num_subsamples; ++i) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      subsamples->push_back(cdm::SubsampleEntry(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          encrypted_block_info.subsamples[i].clear_bytes,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          encrypted_block_info.subsamples[i].cipher_bytes));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_buffer->subsamples = &(*subsamples)[0];
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_buffer->timestamp = encrypted_block_info.tracking_info.timestamp;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_DecryptResult CdmStatusToPpDecryptResult(cdm::Status status) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (status) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case cdm::kSuccess:
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PP_DECRYPTRESULT_SUCCESS;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case cdm::kNoKey:
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PP_DECRYPTRESULT_DECRYPT_NOKEY;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case cdm::kNeedMoreData:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PP_DECRYPTRESULT_NEEDMOREDATA;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case cdm::kDecryptError:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PP_DECRYPTRESULT_DECRYPT_ERROR;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case cdm::kDecodeError:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PP_DECRYPTRESULT_DECODE_ERROR;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_NOTREACHED();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PP_DECRYPTRESULT_DECODE_ERROR;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_DecryptedFrameFormat CdmVideoFormatToPpDecryptedFrameFormat(
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm::VideoFormat format) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (format) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case cdm::kYv12:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PP_DECRYPTEDFRAMEFORMAT_YV12;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case cdm::kI420:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PP_DECRYPTEDFRAMEFORMAT_I420;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PP_DECRYPTEDFRAMEFORMAT_UNKNOWN;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)PP_DecryptedSampleFormat CdmAudioFormatToPpDecryptedSampleFormat(
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    cdm::AudioFormat format) {
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  switch (format) {
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case cdm::kAudioFormatU8:
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return PP_DECRYPTEDSAMPLEFORMAT_U8;
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case cdm::kAudioFormatS16:
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return PP_DECRYPTEDSAMPLEFORMAT_S16;
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case cdm::kAudioFormatS32:
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return PP_DECRYPTEDSAMPLEFORMAT_S32;
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case cdm::kAudioFormatF32:
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return PP_DECRYPTEDSAMPLEFORMAT_F32;
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case cdm::kAudioFormatPlanarS16:
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return PP_DECRYPTEDSAMPLEFORMAT_PLANAR_S16;
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case cdm::kAudioFormatPlanarF32:
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return PP_DECRYPTEDSAMPLEFORMAT_PLANAR_F32;
1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    default:
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return PP_DECRYPTEDSAMPLEFORMAT_UNKNOWN;
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cdm::AudioDecoderConfig::AudioCodec PpAudioCodecToCdmAudioCodec(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_AudioCodec codec) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (codec) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_AUDIOCODEC_VORBIS:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::AudioDecoderConfig::kCodecVorbis;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_AUDIOCODEC_AAC:
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::AudioDecoderConfig::kCodecAac;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::AudioDecoderConfig::kUnknownAudioCodec;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cdm::VideoDecoderConfig::VideoCodec PpVideoCodecToCdmVideoCodec(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_VideoCodec codec) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (codec) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VIDEOCODEC_VP8:
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::VideoDecoderConfig::kCodecVp8;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VIDEOCODEC_H264:
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::VideoDecoderConfig::kCodecH264;
157a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case PP_VIDEOCODEC_VP9:
158a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return cdm::VideoDecoderConfig::kCodecVp9;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::VideoDecoderConfig::kUnknownVideoCodec;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cdm::VideoDecoderConfig::VideoCodecProfile PpVCProfileToCdmVCProfile(
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_VideoCodecProfile profile) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (profile) {
167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case PP_VIDEOCODECPROFILE_NOT_NEEDED:
168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return cdm::VideoDecoderConfig::kProfileNotNeeded;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VIDEOCODECPROFILE_H264_BASELINE:
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::VideoDecoderConfig::kH264ProfileBaseline;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VIDEOCODECPROFILE_H264_MAIN:
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::VideoDecoderConfig::kH264ProfileMain;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VIDEOCODECPROFILE_H264_EXTENDED:
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::VideoDecoderConfig::kH264ProfileExtended;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VIDEOCODECPROFILE_H264_HIGH:
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::VideoDecoderConfig::kH264ProfileHigh;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VIDEOCODECPROFILE_H264_HIGH_10:
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::VideoDecoderConfig::kH264ProfileHigh10;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VIDEOCODECPROFILE_H264_HIGH_422:
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::VideoDecoderConfig::kH264ProfileHigh422;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VIDEOCODECPROFILE_H264_HIGH_444_PREDICTIVE:
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::VideoDecoderConfig::kH264ProfileHigh444Predictive;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::VideoDecoderConfig::kUnknownVideoCodecProfile;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cdm::VideoFormat PpDecryptedFrameFormatToCdmVideoFormat(
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_DecryptedFrameFormat format) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (format) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_DECRYPTEDFRAMEFORMAT_YV12:
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::kYv12;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_DECRYPTEDFRAMEFORMAT_I420:
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::kI420;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::kUnknownVideoFormat;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cdm::StreamType PpDecryptorStreamTypeToCdmStreamType(
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_DecryptorStreamType stream_type) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (stream_type) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_DECRYPTORSTREAMTYPE_AUDIO:
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::kStreamTypeAudio;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_DECRYPTORSTREAMTYPE_VIDEO:
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return cdm::kStreamTypeVideo;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_NOTREACHED();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cdm::kStreamTypeVideo;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace media {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)CdmAdapter::CdmAdapter(PP_Instance instance, pp::Module* module)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : pp::Instance(instance),
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::ContentDecryptor_Private(this),
2208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS)
2218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      output_protection_(this),
2228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      platform_verification_(this),
2238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      challenge_in_progress_(false),
2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      output_link_mask_(0),
2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      output_protection_mask_(0),
2268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      query_output_protection_in_progress_(false),
2278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allocator_(this),
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      cdm_(NULL),
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      deferred_initialize_audio_decoder_(false),
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      deferred_audio_decoder_config_id_(0),
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      deferred_initialize_video_decoder_(false),
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      deferred_video_decoder_config_id_(0) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback_factory_.Initialize(this);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)CdmAdapter::~CdmAdapter() {}
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool CdmAdapter::CreateCdmInstance(const std::string& key_system) {
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PP_DCHECK(!cdm_);
2418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  cdm_ = make_linked_ptr(CdmWrapper::Create(
2428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      key_system.data(), key_system.size(), GetCdmHost, this));
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool success = cdm_ != NULL;
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string message = "CDM instance for " + key_system +
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              (success ? "" : " could not be") + " created.";
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DLOG_TO_CONSOLE(message);
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CDM_DLOG() << message;
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return success;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// No errors should be reported in this function because the spec says:
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// "Store this new error object internally with the MediaKeys instance being
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// created. This will be used to fire an error against any session created for
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// this instance." These errors will be reported during session creation
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// (CreateSession()) or session loading (LoadSession()).
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(xhwang): If necessary, we need to store the error here if we want to
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// support more specific error reporting (other than "Unknown").
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void CdmAdapter::Initialize(const std::string& key_system) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(!key_system.empty());
26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  PP_DCHECK(key_system_.empty() || (key_system_ == key_system && cdm_));
26368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!cdm_ && !CreateCdmInstance(key_system))
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  PP_DCHECK(cdm_);
26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  key_system_ = key_system;
26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::CreateSession(uint32_t session_id,
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const std::string& content_type,
273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               pp::VarArrayBuffer init_data) {
274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Initialize() doesn't report an error, so CreateSession() can be called
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // even if Initialize() failed.
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!cdm_) {
277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OnSessionError(session_id, cdm::kUnknownError, 0);
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(CHECK_DOCUMENT_URL)
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PP_URLComponents_Dev url_components = {};
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const pp::URLUtil_Dev* url_util = pp::URLUtil_Dev::Get();
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!url_util) {
285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OnSessionError(session_id, cdm::kUnknownError, 0);
286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pp::Var href = url_util->GetDocumentURL(
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      pp::InstanceHandle(pp_instance()), &url_components);
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PP_DCHECK(href.is_string());
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PP_DCHECK(!href.AsString().empty());
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PP_DCHECK(url_components.host.begin);
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PP_DCHECK(0 < url_components.host.len);
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // defined(CHECK_DOCUMENT_URL)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  cdm_->CreateSession(session_id,
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      content_type.data(),
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      content_type.size(),
299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      static_cast<const uint8_t*>(init_data.Map()),
300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      init_data.ByteLength());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CdmAdapter::LoadSession(uint32_t session_id,
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             const std::string& web_session_id) {
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Initialize() doesn't report an error, so LoadSession() can be called
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // even if Initialize() failed.
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!cdm_) {
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OnSessionError(session_id, cdm::kUnknownError, 0);
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  cdm_->LoadSession(session_id, web_session_id.data(), web_session_id.size());
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::UpdateSession(uint32_t session_id,
316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               pp::VarArrayBuffer response) {
317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const uint8_t* response_ptr = static_cast<const uint8_t*>(response.Map());
318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const uint32_t response_size = response.ByteLength();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!response_ptr || response_size <= 0) {
321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OnSessionError(session_id, cdm::kUnknownError, 0);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  cdm_->UpdateSession(session_id, response_ptr, response_size);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::ReleaseSession(uint32_t session_id) {
328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  cdm_->ReleaseSession(session_id);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: In the following decryption/decoding related functions, errors are NOT
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reported via KeyError, but are reported via corresponding PPB calls.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::Decrypt(pp::Buffer_Dev encrypted_buffer,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const PP_EncryptedBlockInfo& encrypted_block_info) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(!encrypted_buffer.is_null());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Release a buffer that the caller indicated it is finished with.
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  allocator_.Release(encrypted_block_info.tracking_info.buffer_id);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cdm::Status status = cdm::kDecryptError;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LinkedDecryptedBlock decrypted_block(new DecryptedBlockImpl());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cdm_) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm::InputBuffer input_buffer;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<cdm::SubsampleEntry> subsamples;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ConfigureInputBuffer(encrypted_buffer, encrypted_block_info, &subsamples,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         &input_buffer);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = cdm_->Decrypt(input_buffer, decrypted_block.get());
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PP_DCHECK(status != cdm::kSuccess ||
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              (decrypted_block->DecryptedBuffer() &&
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               decrypted_block->DecryptedBuffer()->Size()));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CallOnMain(callback_factory_.NewCallback(
3568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &CdmAdapter::DeliverBlock,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decrypted_block,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      encrypted_block_info.tracking_info));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::InitializeAudioDecoder(
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PP_AudioDecoderConfig& decoder_config,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp::Buffer_Dev extra_data_buffer) {
3651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PP_DCHECK(!deferred_initialize_audio_decoder_);
3661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PP_DCHECK(deferred_audio_decoder_config_id_ == 0);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cdm::Status status = cdm::kSessionError;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cdm_) {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm::AudioDecoderConfig cdm_decoder_config;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_decoder_config.codec =
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PpAudioCodecToCdmAudioCodec(decoder_config.codec);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_decoder_config.channel_count = decoder_config.channel_count;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_decoder_config.bits_per_channel = decoder_config.bits_per_channel;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_decoder_config.samples_per_second = decoder_config.samples_per_second;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_decoder_config.extra_data =
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<uint8_t*>(extra_data_buffer.data());
3771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    cdm_decoder_config.extra_data_size = extra_data_buffer.size();
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = cdm_->InitializeAudioDecoder(cdm_decoder_config);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (status == cdm::kDeferredInitialization) {
3821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    deferred_initialize_audio_decoder_ = true;
3831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    deferred_audio_decoder_config_id_ = decoder_config.request_id;
3841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
3851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
3861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CallOnMain(callback_factory_.NewCallback(
3888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &CdmAdapter::DecoderInitializeDone,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_DECRYPTORSTREAMTYPE_AUDIO,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decoder_config.request_id,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status == cdm::kSuccess));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::InitializeVideoDecoder(
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PP_VideoDecoderConfig& decoder_config,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp::Buffer_Dev extra_data_buffer) {
3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PP_DCHECK(!deferred_initialize_video_decoder_);
3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PP_DCHECK(deferred_video_decoder_config_id_ == 0);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cdm::Status status = cdm::kSessionError;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cdm_) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm::VideoDecoderConfig cdm_decoder_config;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_decoder_config.codec =
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PpVideoCodecToCdmVideoCodec(decoder_config.codec);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_decoder_config.profile =
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PpVCProfileToCdmVCProfile(decoder_config.profile);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_decoder_config.format =
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PpDecryptedFrameFormatToCdmVideoFormat(decoder_config.format);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_decoder_config.coded_size.width = decoder_config.width;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_decoder_config.coded_size.height = decoder_config.height;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_decoder_config.extra_data =
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<uint8_t*>(extra_data_buffer.data());
4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    cdm_decoder_config.extra_data_size = extra_data_buffer.size();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = cdm_->InitializeVideoDecoder(cdm_decoder_config);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (status == cdm::kDeferredInitialization) {
4171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    deferred_initialize_video_decoder_ = true;
4181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    deferred_video_decoder_config_id_ = decoder_config.request_id;
4191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
4201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CallOnMain(callback_factory_.NewCallback(
4238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &CdmAdapter::DecoderInitializeDone,
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_DECRYPTORSTREAMTYPE_VIDEO,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decoder_config.request_id,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status == cdm::kSuccess));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DeinitializeDecoder(PP_DecryptorStreamType decoder_type,
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     uint32_t request_id) {
4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PP_DCHECK(cdm_);  // InitializeXxxxxDecoder should have succeeded.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cdm_) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_->DeinitializeDecoder(
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PpDecryptorStreamTypeToCdmStreamType(decoder_type));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CallOnMain(callback_factory_.NewCallback(
4388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &CdmAdapter::DecoderDeinitializeDone,
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decoder_type,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::ResetDecoder(PP_DecryptorStreamType decoder_type,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              uint32_t request_id) {
4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PP_DCHECK(cdm_);  // InitializeXxxxxDecoder should have succeeded.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cdm_)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdm_->ResetDecoder(PpDecryptorStreamTypeToCdmStreamType(decoder_type));
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  CallOnMain(callback_factory_.NewCallback(&CdmAdapter::DecoderResetDone,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           decoder_type,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           request_id));
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DecryptAndDecode(
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_DecryptorStreamType decoder_type,
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp::Buffer_Dev encrypted_buffer,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PP_EncryptedBlockInfo& encrypted_block_info) {
4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PP_DCHECK(cdm_);  // InitializeXxxxxDecoder should have succeeded.
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Release a buffer that the caller indicated it is finished with.
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  allocator_.Release(encrypted_block_info.tracking_info.buffer_id);
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cdm::InputBuffer input_buffer;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<cdm::SubsampleEntry> subsamples;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cdm_ && !encrypted_buffer.is_null()) {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ConfigureInputBuffer(encrypted_buffer,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         encrypted_block_info,
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         &subsamples,
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         &input_buffer);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cdm::Status status = cdm::kDecodeError;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (decoder_type) {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_DECRYPTORSTREAMTYPE_VIDEO: {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LinkedVideoFrame video_frame(new VideoFrameImpl());
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (cdm_)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status = cdm_->DecryptAndDecodeFrame(input_buffer, video_frame.get());
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CallOnMain(callback_factory_.NewCallback(
4798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          &CdmAdapter::DeliverFrame,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          status,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          video_frame,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          encrypted_block_info.tracking_info));
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_DECRYPTORSTREAMTYPE_AUDIO: {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LinkedAudioFrames audio_frames(new AudioFramesImpl());
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (cdm_) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status = cdm_->DecryptAndDecodeSamples(input_buffer,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               audio_frames.get());
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CallOnMain(callback_factory_.NewCallback(
4938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          &CdmAdapter::DeliverSamples,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          status,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          audio_frames,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          encrypted_block_info.tracking_info));
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_NOTREACHED();
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)cdm::Buffer* CdmAdapter::Allocate(uint32_t capacity) {
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return allocator_.Allocate(capacity);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::SetTimer(int64_t delay_ms, void* context) {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: doesn't really need to run on the main thread; could just as well run
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on a helper thread if |cdm_| were thread-friendly and care was taken.  We
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only use CallOnMainThread() here to get delayed-execution behavior.
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Module::Get()->core()->CallOnMainThread(
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delay_ms,
5168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      callback_factory_.NewCallback(&CdmAdapter::TimerExpired, context),
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_OK);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::TimerExpired(int32_t result, void* context) {
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(result == PP_OK);
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cdm_->TimerExpired(context);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)double CdmAdapter::GetCurrentWallTimeInSeconds() {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pp::Module::Get()->core()->GetTime();
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::OnSessionCreated(uint32_t session_id,
530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  const char* web_session_id,
531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  uint32_t web_session_id_length) {
532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  PostOnMain(callback_factory_.NewCallback(
533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      &CdmAdapter::SendSessionCreatedInternal,
534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      session_id,
535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      std::string(web_session_id, web_session_id_length)));
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::OnSessionMessage(uint32_t session_id,
539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  const char* message,
540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  uint32_t message_length,
541a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  const char* destination_url,
542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  uint32_t destination_url_length) {
543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  PostOnMain(callback_factory_.NewCallback(
544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      &CdmAdapter::SendSessionMessageInternal,
545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      session_id,
546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      std::vector<uint8>(message, message + message_length),
547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      std::string(destination_url, destination_url_length)));
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::OnSessionReady(uint32_t session_id) {
551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PostOnMain(callback_factory_.NewCallback(
552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      &CdmAdapter::SendSessionReadyInternal, session_id));
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::OnSessionClosed(uint32_t session_id) {
556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  PostOnMain(callback_factory_.NewCallback(
557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      &CdmAdapter::SendSessionClosedInternal, session_id));
558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::OnSessionError(uint32_t session_id,
561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                cdm::MediaKeyError error_code,
562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                uint32_t system_code) {
563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  PostOnMain(callback_factory_.NewCallback(
564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      &CdmAdapter::SendSessionErrorInternal,
565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      session_id,
566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      error_code,
567a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      system_code));
568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::SendSessionCreatedInternal(int32_t result,
571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            uint32_t session_id,
572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            const std::string& web_session_id) {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(result == PP_OK);
574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  pp::ContentDecryptor_Private::SessionCreated(session_id, web_session_id);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::SendSessionMessageInternal(int32_t result,
578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            uint32_t session_id,
579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            const std::vector<uint8>& message,
580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            const std::string& default_url) {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(result == PP_OK);
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pp::VarArrayBuffer message_array_buffer(message.size());
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (message.size() > 0) {
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    memcpy(message_array_buffer.Map(), message.data(), message.size());
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  pp::ContentDecryptor_Private::SessionMessage(
589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      session_id, message_array_buffer, default_url);
590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::SendSessionReadyInternal(int32_t result, uint32_t session_id) {
593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  PP_DCHECK(result == PP_OK);
594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  pp::ContentDecryptor_Private::SessionReady(session_id);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::SendSessionClosedInternal(int32_t result,
598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                           uint32_t session_id) {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(result == PP_OK);
600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  pp::ContentDecryptor_Private::SessionClosed(session_id);
601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::SendSessionErrorInternal(int32_t result,
604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                          uint32_t session_id,
605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                          cdm::MediaKeyError error_code,
606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                          uint32_t system_code) {
607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PP_DCHECK(result == PP_OK);
608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  pp::ContentDecryptor_Private::SessionError(
609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      session_id, error_code, system_code);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DeliverBlock(int32_t result,
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const cdm::Status& status,
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const LinkedDecryptedBlock& decrypted_block,
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const PP_DecryptTrackingInfo& tracking_info) {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(result == PP_OK);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DecryptedBlockInfo decrypted_block_info;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decrypted_block_info.tracking_info = tracking_info;
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  decrypted_block_info.tracking_info.timestamp = decrypted_block->Timestamp();
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  decrypted_block_info.tracking_info.buffer_id = 0;
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  decrypted_block_info.data_size = 0;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decrypted_block_info.result = CdmStatusToPpDecryptResult(status);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Buffer_Dev buffer;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (decrypted_block_info.result == PP_DECRYPTRESULT_SUCCESS) {
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PP_DCHECK(decrypted_block.get() && decrypted_block->DecryptedBuffer());
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!decrypted_block.get() || !decrypted_block->DecryptedBuffer()) {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_NOTREACHED();
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decrypted_block_info.result = PP_DECRYPTRESULT_DECRYPT_ERROR;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PpbBuffer* ppb_buffer =
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          static_cast<PpbBuffer*>(decrypted_block->DecryptedBuffer());
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffer = ppb_buffer->buffer_dev();
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      decrypted_block_info.tracking_info.buffer_id = ppb_buffer->buffer_id();
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      decrypted_block_info.data_size = ppb_buffer->Size();
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::ContentDecryptor_Private::DeliverBlock(buffer, decrypted_block_info);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DecoderInitializeDone(int32_t result,
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       PP_DecryptorStreamType decoder_type,
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       uint32_t request_id,
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool success) {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(result == PP_OK);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::ContentDecryptor_Private::DecoderInitializeDone(decoder_type,
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      request_id,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      success);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DecoderDeinitializeDone(int32_t result,
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         PP_DecryptorStreamType decoder_type,
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         uint32_t request_id) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::ContentDecryptor_Private::DecoderDeinitializeDone(decoder_type,
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                        request_id);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DecoderResetDone(int32_t result,
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  PP_DecryptorStreamType decoder_type,
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  uint32_t request_id) {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::ContentDecryptor_Private::DecoderResetDone(decoder_type, request_id);
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DeliverFrame(
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32_t result,
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const cdm::Status& status,
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const LinkedVideoFrame& video_frame,
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PP_DecryptTrackingInfo& tracking_info) {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(result == PP_OK);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DecryptedFrameInfo decrypted_frame_info;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decrypted_frame_info.tracking_info.request_id = tracking_info.request_id;
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  decrypted_frame_info.tracking_info.buffer_id = 0;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decrypted_frame_info.result = CdmStatusToPpDecryptResult(status);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Buffer_Dev buffer;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (decrypted_frame_info.result == PP_DECRYPTRESULT_SUCCESS) {
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!IsValidVideoFrame(video_frame)) {
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_NOTREACHED();
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decrypted_frame_info.result = PP_DECRYPTRESULT_DECODE_ERROR;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PpbBuffer* ppb_buffer =
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          static_cast<PpbBuffer*>(video_frame->FrameBuffer());
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffer = ppb_buffer->buffer_dev();
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      decrypted_frame_info.tracking_info.timestamp = video_frame->Timestamp();
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      decrypted_frame_info.tracking_info.buffer_id = ppb_buffer->buffer_id();
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      decrypted_frame_info.format =
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          CdmVideoFormatToPpDecryptedFrameFormat(video_frame->Format());
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      decrypted_frame_info.width = video_frame->Size().width;
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      decrypted_frame_info.height = video_frame->Size().height;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decrypted_frame_info.plane_offsets[PP_DECRYPTEDFRAMEPLANES_Y] =
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          video_frame->PlaneOffset(cdm::VideoFrame::kYPlane);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decrypted_frame_info.plane_offsets[PP_DECRYPTEDFRAMEPLANES_U] =
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          video_frame->PlaneOffset(cdm::VideoFrame::kUPlane);
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decrypted_frame_info.plane_offsets[PP_DECRYPTEDFRAMEPLANES_V] =
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          video_frame->PlaneOffset(cdm::VideoFrame::kVPlane);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decrypted_frame_info.strides[PP_DECRYPTEDFRAMEPLANES_Y] =
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          video_frame->Stride(cdm::VideoFrame::kYPlane);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decrypted_frame_info.strides[PP_DECRYPTEDFRAMEPLANES_U] =
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          video_frame->Stride(cdm::VideoFrame::kUPlane);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decrypted_frame_info.strides[PP_DECRYPTEDFRAMEPLANES_V] =
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          video_frame->Stride(cdm::VideoFrame::kVPlane);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::ContentDecryptor_Private::DeliverFrame(buffer, decrypted_frame_info);
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DeliverSamples(int32_t result,
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const cdm::Status& status,
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const LinkedAudioFrames& audio_frames,
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const PP_DecryptTrackingInfo& tracking_info) {
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(result == PP_OK);
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PP_DecryptedSampleInfo decrypted_sample_info;
7191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  decrypted_sample_info.tracking_info = tracking_info;
7201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  decrypted_sample_info.tracking_info.timestamp = 0;
7211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  decrypted_sample_info.tracking_info.buffer_id = 0;
7221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  decrypted_sample_info.data_size = 0;
7231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  decrypted_sample_info.result = CdmStatusToPpDecryptResult(status);
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Buffer_Dev buffer;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (decrypted_sample_info.result == PP_DECRYPTRESULT_SUCCESS) {
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PP_DCHECK(audio_frames.get() && audio_frames->FrameBuffer());
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!audio_frames.get() || !audio_frames->FrameBuffer()) {
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_NOTREACHED();
7311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      decrypted_sample_info.result = PP_DECRYPTRESULT_DECRYPT_ERROR;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PpbBuffer* ppb_buffer =
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          static_cast<PpbBuffer*>(audio_frames->FrameBuffer());
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffer = ppb_buffer->buffer_dev();
7361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      decrypted_sample_info.tracking_info.buffer_id = ppb_buffer->buffer_id();
7371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      decrypted_sample_info.data_size = ppb_buffer->Size();
7381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      decrypted_sample_info.format =
7391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          CdmAudioFormatToPpDecryptedSampleFormat(audio_frames->Format());
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pp::ContentDecryptor_Private::DeliverSamples(buffer, decrypted_sample_info);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool CdmAdapter::IsValidVideoFrame(const LinkedVideoFrame& video_frame) {
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!video_frame.get() ||
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !video_frame->FrameBuffer() ||
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (video_frame->Format() != cdm::kI420 &&
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       video_frame->Format() != cdm::kYv12)) {
7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CDM_DLOG() << "Invalid video frame!";
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PpbBuffer* ppb_buffer = static_cast<PpbBuffer*>(video_frame->FrameBuffer());
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (uint32_t i = 0; i < cdm::VideoFrame::kMaxPlanes; ++i) {
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int plane_height = (i == cdm::VideoFrame::kYPlane) ?
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        video_frame->Size().height : (video_frame->Size().height + 1) / 2;
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cdm::VideoFrame::VideoPlane plane =
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<cdm::VideoFrame::VideoPlane>(i);
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (ppb_buffer->Size() < video_frame->PlaneOffset(plane) +
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             plane_height * video_frame->Stride(plane)) {
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(NDEBUG)
7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CdmAdapter::LogToConsole(const pp::Var& value) {
7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PP_DCHECK(IsMainThread());
7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const PPB_Console* console = reinterpret_cast<const PPB_Console*>(
7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pp::Module::Get()->GetBrowserInterface(PPB_CONSOLE_INTERFACE));
7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  console->Log(pp_instance(), PP_LOGLEVEL_LOG, value.pp_var());
7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // !defined(NDEBUG)
7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::SendPlatformChallenge(
7811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const char* service_id, uint32_t service_id_length,
7821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const char* challenge, uint32_t challenge_length) {
7838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS)
7848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  PP_DCHECK(!challenge_in_progress_);
7858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Ensure member variables set by the callback are in a clean state.
7878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  signed_data_output_ = pp::Var();
7888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  signed_data_signature_output_ = pp::Var();
7898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  platform_key_certificate_output_ = pp::Var();
7908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  pp::VarArrayBuffer challenge_var(challenge_length);
7928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  uint8_t* var_data = static_cast<uint8_t*>(challenge_var.Map());
7938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  memcpy(var_data, challenge, challenge_length);
7948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string service_id_str(service_id, service_id_length);
7968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  int32_t result = platform_verification_.ChallengePlatform(
7978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      pp::Var(service_id_str), challenge_var, &signed_data_output_,
7988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &signed_data_signature_output_, &platform_key_certificate_output_,
7998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      callback_factory_.NewCallback(&CdmAdapter::SendPlatformChallengeDone));
8008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  challenge_var.Unmap();
8018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (result == PP_OK_COMPLETIONPENDING) {
8028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    challenge_in_progress_ = true;
8038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
8048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
8058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Fall through on error and issue an empty OnPlatformChallengeResponse().
8078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  PP_DCHECK(result != PP_OK);
8088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
8098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  cdm::PlatformChallengeResponse response = {};
8118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  cdm_->OnPlatformChallengeResponse(response);
8128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
8138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::EnableOutputProtection(uint32_t desired_protection_mask) {
8158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS)
8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int32_t result = output_protection_.EnableProtection(
8178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      desired_protection_mask, callback_factory_.NewCallback(
8188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          &CdmAdapter::EnableProtectionDone));
8198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Errors are ignored since clients must call QueryOutputProtectionStatus() to
8218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // inspect the protection status on a regular basis.
8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (result != PP_OK && result != PP_OK_COMPLETIONPENDING)
8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CDM_DLOG() << __FUNCTION__ << " failed!";
8258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
8268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
8278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::QueryOutputProtectionStatus() {
8298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS)
8308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  PP_DCHECK(!query_output_protection_in_progress_);
8318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  output_link_mask_ = output_protection_mask_ = 0;
8338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const int32_t result = output_protection_.QueryStatus(
8348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &output_link_mask_,
8358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &output_protection_mask_,
8368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      callback_factory_.NewCallback(
8378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          &CdmAdapter::QueryOutputProtectionStatusDone));
8388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (result == PP_OK_COMPLETIONPENDING) {
8398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    query_output_protection_in_progress_ = true;
8408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
8418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
8428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Fall through on error and issue an empty OnQueryOutputProtectionStatus().
8448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  PP_DCHECK(result != PP_OK);
8458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
8468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  cdm_->OnQueryOutputProtectionStatus(0, 0);
8488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
8498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void CdmAdapter::OnDeferredInitializationDone(cdm::StreamType stream_type,
8511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                              cdm::Status decoder_status) {
8521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  switch (stream_type) {
8531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case cdm::kStreamTypeAudio:
8541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      PP_DCHECK(deferred_initialize_audio_decoder_);
8551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CallOnMain(
8561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          callback_factory_.NewCallback(&CdmAdapter::DecoderInitializeDone,
8571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                        PP_DECRYPTORSTREAMTYPE_AUDIO,
8581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                        deferred_audio_decoder_config_id_,
8591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                        decoder_status == cdm::kSuccess));
8601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      deferred_initialize_audio_decoder_ = false;
8611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      deferred_audio_decoder_config_id_ = 0;
8621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
8631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case cdm::kStreamTypeVideo:
8641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      PP_DCHECK(deferred_initialize_video_decoder_);
8651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CallOnMain(
8661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          callback_factory_.NewCallback(&CdmAdapter::DecoderInitializeDone,
8671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                        PP_DECRYPTORSTREAMTYPE_VIDEO,
8681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                        deferred_video_decoder_config_id_,
8691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                        decoder_status == cdm::kSuccess));
8701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      deferred_initialize_video_decoder_ = false;
8711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      deferred_video_decoder_config_id_ = 0;
8721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
8731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
8741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
8751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The CDM owns the returned object and must call FileIO::Close() to release it.
8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)cdm::FileIO* CdmAdapter::CreateFileIO(cdm::FileIOClient* client) {
8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return new CdmFileIOImpl(client, pp_instance());
8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS)
8828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::SendPlatformChallengeDone(int32_t result) {
8838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  challenge_in_progress_ = false;
8848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (result != PP_OK) {
8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CDM_DLOG() << __FUNCTION__ << ": Platform challenge failed!";
8878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    cdm::PlatformChallengeResponse response = {};
8888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    cdm_->OnPlatformChallengeResponse(response);
8898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
8908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
8918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  pp::VarArrayBuffer signed_data_var(signed_data_output_);
8938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  pp::VarArrayBuffer signed_data_signature_var(signed_data_signature_output_);
8948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string platform_key_certificate_string =
8958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      platform_key_certificate_output_.AsString();
8968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  cdm::PlatformChallengeResponse response = {
8988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    static_cast<uint8_t*>(signed_data_var.Map()),
8991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    signed_data_var.ByteLength(),
9008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
9018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    static_cast<uint8_t*>(signed_data_signature_var.Map()),
9021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    signed_data_signature_var.ByteLength(),
9038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
9048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    reinterpret_cast<const uint8_t*>(platform_key_certificate_string.c_str()),
9051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    static_cast<uint32_t>(platform_key_certificate_string.length())
9068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  };
9078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  cdm_->OnPlatformChallengeResponse(response);
9088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
9098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  signed_data_var.Unmap();
9108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  signed_data_signature_var.Unmap();
9118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
9128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
9138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::EnableProtectionDone(int32_t result) {
9148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Does nothing since clients must call QueryOutputProtectionStatus() to
9158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // inspect the protection status on a regular basis.
9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CDM_DLOG() << __FUNCTION__ << " : " << result;
9178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
9188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
9198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::QueryOutputProtectionStatusDone(int32_t result) {
9208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  PP_DCHECK(query_output_protection_in_progress_);
9218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  query_output_protection_in_progress_ = false;
9228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
9238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Return a protection status of none on error.
9248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (result != PP_OK)
9258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    output_link_mask_ = output_protection_mask_ = 0;
9268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
9278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  cdm_->OnQueryOutputProtectionStatus(output_link_mask_,
9288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                      output_protection_mask_);
9298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
9308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
9318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void* GetCdmHost(int host_interface_version, void* user_data) {
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!host_interface_version || !user_data)
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
936c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  COMPILE_ASSERT(
937c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      cdm::ContentDecryptionModule::Host::kVersion == cdm::Host_4::kVersion,
938c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      update_code_below);
9390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
9400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Ensure IsSupportedCdmHostVersion matches implementation of this function.
9410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Always update this DCHECK when updating this function.
9420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // If this check fails, update this function and DCHECK or update
9430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // IsSupportedCdmHostVersion.
944c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
9450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  PP_DCHECK(
9460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // Future version is not supported.
947c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      !IsSupportedCdmHostVersion(cdm::Host_4::kVersion + 1) &&
9480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // Current version is supported.
949c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      IsSupportedCdmHostVersion(cdm::Host_4::kVersion) &&
950c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // Include all previous supported versions (if any) here.
951c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // No supported previous versions.
9520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // One older than the oldest supported version is not supported.
953c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      !IsSupportedCdmHostVersion(cdm::Host_4::kVersion - 1));
9540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  PP_DCHECK(IsSupportedCdmHostVersion(host_interface_version));
9550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
9568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  CdmAdapter* cdm_adapter = static_cast<CdmAdapter*>(user_data);
9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CDM_DLOG() << "Create CDM Host with version " << host_interface_version;
9588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  switch (host_interface_version) {
9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case cdm::Host_4::kVersion:
9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return static_cast<cdm::Host_4*>(cdm_adapter);
9618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    default:
9628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      PP_NOTREACHED();
9638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      return NULL;
9648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This object is the global object representing this plugin library as long
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as it is loaded.
9698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class CdmAdapterModule : public pp::Module {
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
9718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  CdmAdapterModule() : pp::Module() {
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This function blocks the renderer thread (PluginInstance::Initialize()).
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Move this call to other places if this may be a concern in the future.
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INITIALIZE_CDM_MODULE();
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual ~CdmAdapterModule() {
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DeinitializeCdmModule();
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual pp::Instance* CreateInstance(PP_Instance instance) {
9818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return new CdmAdapter(instance, this);
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CdmFileIOImpl::ResourceTracker cdm_file_io_impl_resource_tracker;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
988ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace media
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp {
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory function for your specialization of the Module object.
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Module* CreateModule() {
9948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return new media::CdmAdapterModule();
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace pp
998