cdm_adapter.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ppapi/cpp/private/uma_private.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(CHECK_DOCUMENT_URL) 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/cpp/dev/url_util_dev.h" 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/cpp/instance_handle.h" 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif // defined(CHECK_DOCUMENT_URL) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(NDEBUG) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) #define DLOG_TO_CONSOLE(message) LogToConsole(message); 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) #define DLOG_TO_CONSOLE(message) (void)(message); 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsMainThread() { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pp::Module::Get()->core()->IsMainThread(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Posts a task to run |cb| on the main thread. The task is posted even if the 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// current thread is the main thread. 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PostOnMain(pp::CompletionCallback cb) { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp::Module::Get()->core()->CallOnMainThread(0, cb, PP_OK); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Ensures |cb| is called on the main thread, either because the current thread 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is the main thread or by posting it to the main thread. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CallOnMain(pp::CompletionCallback cb) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(tomfinegan): This is only necessary because PPAPI doesn't allow calls 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // off the main thread yet. Remove this once the change lands. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsMainThread()) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cb.Run(PP_OK); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostOnMain(cb); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Configures a cdm::InputBuffer. |subsamples| must exist as long as 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |input_buffer| is in use. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConfigureInputBuffer( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const pp::Buffer_Dev& encrypted_buffer, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_EncryptedBlockInfo& encrypted_block_info, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<cdm::SubsampleEntry>* subsamples, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm::InputBuffer* input_buffer) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(subsamples); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(!encrypted_buffer.is_null()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_buffer->data = static_cast<uint8_t*>(encrypted_buffer.data()); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) input_buffer->data_size = encrypted_block_info.data_size; 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PP_DCHECK(encrypted_buffer.size() >= input_buffer->data_size); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_DCHECK(encrypted_block_info.key_id_size <= 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arraysize(encrypted_block_info.key_id)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_buffer->key_id_size = encrypted_block_info.key_id_size; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) input_buffer->key_id = input_buffer->key_id_size > 0 ? 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encrypted_block_info.key_id : NULL; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_DCHECK(encrypted_block_info.iv_size <= arraysize(encrypted_block_info.iv)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_buffer->iv_size = encrypted_block_info.iv_size; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) input_buffer->iv = encrypted_block_info.iv_size > 0 ? 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encrypted_block_info.iv : NULL; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) input_buffer->num_subsamples = encrypted_block_info.num_subsamples; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (encrypted_block_info.num_subsamples > 0) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subsamples->reserve(encrypted_block_info.num_subsamples); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32_t i = 0; i < encrypted_block_info.num_subsamples; ++i) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subsamples->push_back(cdm::SubsampleEntry( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypted_block_info.subsamples[i].clear_bytes, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypted_block_info.subsamples[i].cipher_bytes)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_buffer->subsamples = &(*subsamples)[0]; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_buffer->timestamp = encrypted_block_info.tracking_info.timestamp; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_DecryptResult CdmStatusToPpDecryptResult(cdm::Status status) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (status) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case cdm::kSuccess: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTRESULT_SUCCESS; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case cdm::kNoKey: 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTRESULT_DECRYPT_NOKEY; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case cdm::kNeedMoreData: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTRESULT_NEEDMOREDATA; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case cdm::kDecryptError: 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTRESULT_DECRYPT_ERROR; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case cdm::kDecodeError: 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTRESULT_DECODE_ERROR; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NOTREACHED(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTRESULT_DECODE_ERROR; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_DecryptedFrameFormat CdmVideoFormatToPpDecryptedFrameFormat( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm::VideoFormat format) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (format) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case cdm::kYv12: 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTEDFRAMEFORMAT_YV12; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case cdm::kI420: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTEDFRAMEFORMAT_I420; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTEDFRAMEFORMAT_UNKNOWN; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)PP_DecryptedSampleFormat CdmAudioFormatToPpDecryptedSampleFormat( 1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) cdm::AudioFormat format) { 1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (format) { 1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case cdm::kAudioFormatU8: 1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return PP_DECRYPTEDSAMPLEFORMAT_U8; 1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case cdm::kAudioFormatS16: 1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return PP_DECRYPTEDSAMPLEFORMAT_S16; 1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case cdm::kAudioFormatS32: 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return PP_DECRYPTEDSAMPLEFORMAT_S32; 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case cdm::kAudioFormatF32: 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return PP_DECRYPTEDSAMPLEFORMAT_F32; 1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case cdm::kAudioFormatPlanarS16: 1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return PP_DECRYPTEDSAMPLEFORMAT_PLANAR_S16; 1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case cdm::kAudioFormatPlanarF32: 1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return PP_DECRYPTEDSAMPLEFORMAT_PLANAR_F32; 1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) default: 1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return PP_DECRYPTEDSAMPLEFORMAT_UNKNOWN; 1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cdm::AudioDecoderConfig::AudioCodec PpAudioCodecToCdmAudioCodec( 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AudioCodec codec) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (codec) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_AUDIOCODEC_VORBIS: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::AudioDecoderConfig::kCodecVorbis; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_AUDIOCODEC_AAC: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::AudioDecoderConfig::kCodecAac; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::AudioDecoderConfig::kUnknownAudioCodec; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cdm::VideoDecoderConfig::VideoCodec PpVideoCodecToCdmVideoCodec( 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_VideoCodec codec) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (codec) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_VIDEOCODEC_VP8: 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::VideoDecoderConfig::kCodecVp8; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_VIDEOCODEC_H264: 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::VideoDecoderConfig::kCodecH264; 158a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch case PP_VIDEOCODEC_VP9: 159a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return cdm::VideoDecoderConfig::kCodecVp9; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::VideoDecoderConfig::kUnknownVideoCodec; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cdm::VideoDecoderConfig::VideoCodecProfile PpVCProfileToCdmVCProfile( 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_VideoCodecProfile profile) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (profile) { 168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch case PP_VIDEOCODECPROFILE_NOT_NEEDED: 169a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return cdm::VideoDecoderConfig::kProfileNotNeeded; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_VIDEOCODECPROFILE_H264_BASELINE: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::VideoDecoderConfig::kH264ProfileBaseline; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_VIDEOCODECPROFILE_H264_MAIN: 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::VideoDecoderConfig::kH264ProfileMain; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_VIDEOCODECPROFILE_H264_EXTENDED: 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::VideoDecoderConfig::kH264ProfileExtended; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_VIDEOCODECPROFILE_H264_HIGH: 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::VideoDecoderConfig::kH264ProfileHigh; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_VIDEOCODECPROFILE_H264_HIGH_10: 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::VideoDecoderConfig::kH264ProfileHigh10; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_VIDEOCODECPROFILE_H264_HIGH_422: 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::VideoDecoderConfig::kH264ProfileHigh422; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_VIDEOCODECPROFILE_H264_HIGH_444_PREDICTIVE: 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::VideoDecoderConfig::kH264ProfileHigh444Predictive; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::VideoDecoderConfig::kUnknownVideoCodecProfile; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cdm::VideoFormat PpDecryptedFrameFormatToCdmVideoFormat( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptedFrameFormat format) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (format) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_DECRYPTEDFRAMEFORMAT_YV12: 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::kYv12; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_DECRYPTEDFRAMEFORMAT_I420: 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::kI420; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::kUnknownVideoFormat; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cdm::StreamType PpDecryptorStreamTypeToCdmStreamType( 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType stream_type) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (stream_type) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_DECRYPTORSTREAMTYPE_AUDIO: 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::kStreamTypeAudio; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_DECRYPTORSTREAMTYPE_VIDEO: 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::kStreamTypeVideo; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NOTREACHED(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cdm::kStreamTypeVideo; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)cdm::SessionType PpSessionTypeToCdmSessionType(PP_SessionType session_type) { 215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (session_type) { 216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_SESSIONTYPE_TEMPORARY: 217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return cdm::kTemporary; 218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_SESSIONTYPE_PERSISTENT: 219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return cdm::kPersistent; 220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) default: 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_NOTREACHED(); 222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return cdm::kTemporary; 223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)PP_CdmExceptionCode CdmExceptionTypeToPpCdmExceptionType(cdm::Error error) { 227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (error) { 228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case cdm::kNotSupportedError: 229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PP_CDMEXCEPTIONCODE_NOTSUPPORTEDERROR; 230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case cdm::kInvalidStateError: 231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PP_CDMEXCEPTIONCODE_INVALIDSTATEERROR; 232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case cdm::kInvalidAccessError: 233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PP_CDMEXCEPTIONCODE_INVALIDACCESSERROR; 234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case cdm::kQuotaExceededError: 235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PP_CDMEXCEPTIONCODE_QUOTAEXCEEDEDERROR; 236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case cdm::kUnknownError: 237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PP_CDMEXCEPTIONCODE_UNKNOWNERROR; 238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case cdm::kClientError: 239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PP_CDMEXCEPTIONCODE_CLIENTERROR; 240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case cdm::kOutputError: 241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PP_CDMEXCEPTIONCODE_OUTPUTERROR; 242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) default: 243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_NOTREACHED(); 244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PP_CDMEXCEPTIONCODE_UNKNOWNERROR; 245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 250ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace media { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)CdmAdapter::CdmAdapter(PP_Instance instance, pp::Module* module) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : pp::Instance(instance), 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::ContentDecryptor_Private(this), 2558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS) 2568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) output_protection_(this), 2578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) platform_verification_(this), 2588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) output_link_mask_(0), 2598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) output_protection_mask_(0), 2608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) query_output_protection_in_progress_(false), 261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uma_for_output_protection_query_reported_(false), 262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uma_for_output_protection_positive_result_reported_(false), 2638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allocator_(this), 2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) cdm_(NULL), 2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_initialize_audio_decoder_(false), 2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_audio_decoder_config_id_(0), 2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_initialize_video_decoder_(false), 2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_video_decoder_config_id_(0) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_factory_.Initialize(this); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)CdmAdapter::~CdmAdapter() {} 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool CdmAdapter::CreateCdmInstance(const std::string& key_system) { 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_DCHECK(!cdm_); 2778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) cdm_ = make_linked_ptr(CdmWrapper::Create( 2788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) key_system.data(), key_system.size(), GetCdmHost, this)); 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool success = cdm_ != NULL; 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string message = "CDM instance for " + key_system + 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (success ? "" : " could not be") + " created."; 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DLOG_TO_CONSOLE(message); 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CDM_DLOG() << message; 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return success; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// No errors should be reported in this function because the spec says: 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// "Store this new error object internally with the MediaKeys instance being 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// created. This will be used to fire an error against any session created for 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// this instance." These errors will be reported during session creation 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// (CreateSession()) or session loading (LoadSession()). 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(xhwang): If necessary, we need to store the error here if we want to 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// support more specific error reporting (other than "Unknown"). 296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void CdmAdapter::Initialize(const std::string& key_system) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(!key_system.empty()); 29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PP_DCHECK(key_system_.empty() || (key_system_ == key_system && cdm_)); 29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(CHECK_DOCUMENT_URL) 3010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PP_URLComponents_Dev url_components = {}; 3020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const pp::URLUtil_Dev* url_util = pp::URLUtil_Dev::Get(); 3030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!url_util) 3040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 3050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch pp::Var href = url_util->GetDocumentURL(pp::InstanceHandle(pp_instance()), 3060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &url_components); 3070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PP_DCHECK(href.is_string()); 3080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string url = href.AsString(); 3090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PP_DCHECK(!url.empty()); 3100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string url_scheme = 3110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch url.substr(url_components.scheme.begin, url_components.scheme.len); 3120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (url_scheme != "file") { 3130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Skip this check for file:// URLs as they don't have a host component. 3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PP_DCHECK(url_components.host.begin); 3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PP_DCHECK(0 < url_components.host.len); 3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif // defined(CHECK_DOCUMENT_URL) 3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!cdm_ && !CreateCdmInstance(key_system)) 3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 32268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PP_DCHECK(cdm_); 32368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) key_system_ = key_system; 32468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 32568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::CreateSession(uint32_t promise_id, 327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& init_data_type, 328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pp::VarArrayBuffer init_data, 329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_SessionType session_type) { 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Initialize() doesn't report an error, so CreateSession() can be called 3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // even if Initialize() failed. 332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(jrummell): Remove this code when prefixed EME gets removed. 333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(jrummell): Verify that Initialize() failing does not resolve the 334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // MediaKeys.create() promise. 3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!cdm_) { 336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RejectPromise(promise_id, 337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm::kInvalidStateError, 338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 0, 339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "CDM has not been initialized."); 3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm_->CreateSession(promise_id, 344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) init_data_type.data(), 345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) init_data_type.size(), 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<const uint8_t*>(init_data.Map()), 347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) init_data.ByteLength(), 348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PpSessionTypeToCdmSessionType(session_type)); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::LoadSession(uint32_t promise_id, 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& web_session_id) { 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Initialize() doesn't report an error, so LoadSession() can be called 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // even if Initialize() failed. 355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(jrummell): Remove this code when prefixed EME gets removed. 356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(jrummell): Verify that Initialize() failing does not resolve the 357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // MediaKeys.create() promise. 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!cdm_) { 359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RejectPromise(promise_id, 360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm::kInvalidStateError, 361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 0, 362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "CDM has not been initialized."); 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm_->LoadSession(promise_id, web_session_id.data(), web_session_id.size()); 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::UpdateSession(uint32_t promise_id, 370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id, 371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pp::VarArrayBuffer response) { 372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const uint8_t* response_ptr = static_cast<const uint8_t*>(response.Map()); 373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const uint32_t response_size = response.ByteLength(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_DCHECK(!web_session_id.empty()); 376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_DCHECK(response_ptr); 377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_DCHECK(response_size > 0); 378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm_->UpdateSession(promise_id, 380f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_session_id.data(), 381f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_session_id.length(), 382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) response_ptr, 383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) response_size); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 386f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::ReleaseSession(uint32_t promise_id, 387f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id) { 388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm_->ReleaseSession( 389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, web_session_id.data(), web_session_id.length()); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: In the following decryption/decoding related functions, errors are NOT 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reported via KeyError, but are reported via corresponding PPB calls. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::Decrypt(pp::Buffer_Dev encrypted_buffer, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_EncryptedBlockInfo& encrypted_block_info) { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(!encrypted_buffer.is_null()); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Release a buffer that the caller indicated it is finished with. 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) allocator_.Release(encrypted_block_info.tracking_info.buffer_id); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm::Status status = cdm::kDecryptError; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LinkedDecryptedBlock decrypted_block(new DecryptedBlockImpl()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cdm_) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm::InputBuffer input_buffer; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<cdm::SubsampleEntry> subsamples; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureInputBuffer(encrypted_buffer, encrypted_block_info, &subsamples, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &input_buffer); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status = cdm_->Decrypt(input_buffer, decrypted_block.get()); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_DCHECK(status != cdm::kSuccess || 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (decrypted_block->DecryptedBuffer() && 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypted_block->DecryptedBuffer()->Size())); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallOnMain(callback_factory_.NewCallback( 4178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &CdmAdapter::DeliverBlock, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_block, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypted_block_info.tracking_info)); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::InitializeAudioDecoder( 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_AudioDecoderConfig& decoder_config, 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Buffer_Dev extra_data_buffer) { 4261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PP_DCHECK(!deferred_initialize_audio_decoder_); 4271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PP_DCHECK(deferred_audio_decoder_config_id_ == 0); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm::Status status = cdm::kSessionError; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cdm_) { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm::AudioDecoderConfig cdm_decoder_config; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_decoder_config.codec = 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpAudioCodecToCdmAudioCodec(decoder_config.codec); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_decoder_config.channel_count = decoder_config.channel_count; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_decoder_config.bits_per_channel = decoder_config.bits_per_channel; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_decoder_config.samples_per_second = decoder_config.samples_per_second; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_decoder_config.extra_data = 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<uint8_t*>(extra_data_buffer.data()); 4381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) cdm_decoder_config.extra_data_size = extra_data_buffer.size(); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status = cdm_->InitializeAudioDecoder(cdm_decoder_config); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status == cdm::kDeferredInitialization) { 4431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_initialize_audio_decoder_ = true; 4441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_audio_decoder_config_id_ = decoder_config.request_id; 4451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 4461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 4471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallOnMain(callback_factory_.NewCallback( 4498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &CdmAdapter::DecoderInitializeDone, 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DECRYPTORSTREAMTYPE_AUDIO, 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_config.request_id, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status == cdm::kSuccess)); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::InitializeVideoDecoder( 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_VideoDecoderConfig& decoder_config, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Buffer_Dev extra_data_buffer) { 4581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PP_DCHECK(!deferred_initialize_video_decoder_); 4591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PP_DCHECK(deferred_video_decoder_config_id_ == 0); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm::Status status = cdm::kSessionError; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cdm_) { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm::VideoDecoderConfig cdm_decoder_config; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_decoder_config.codec = 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpVideoCodecToCdmVideoCodec(decoder_config.codec); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_decoder_config.profile = 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpVCProfileToCdmVCProfile(decoder_config.profile); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_decoder_config.format = 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpDecryptedFrameFormatToCdmVideoFormat(decoder_config.format); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_decoder_config.coded_size.width = decoder_config.width; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_decoder_config.coded_size.height = decoder_config.height; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_decoder_config.extra_data = 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<uint8_t*>(extra_data_buffer.data()); 4731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) cdm_decoder_config.extra_data_size = extra_data_buffer.size(); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status = cdm_->InitializeVideoDecoder(cdm_decoder_config); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status == cdm::kDeferredInitialization) { 4781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_initialize_video_decoder_ = true; 4791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_video_decoder_config_id_ = decoder_config.request_id; 4801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 4811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 4821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallOnMain(callback_factory_.NewCallback( 4848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &CdmAdapter::DecoderInitializeDone, 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DECRYPTORSTREAMTYPE_VIDEO, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_config.request_id, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status == cdm::kSuccess)); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DeinitializeDecoder(PP_DecryptorStreamType decoder_type, 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id) { 4924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PP_DCHECK(cdm_); // InitializeXxxxxDecoder should have succeeded. 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cdm_) { 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_->DeinitializeDecoder( 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpDecryptorStreamTypeToCdmStreamType(decoder_type)); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallOnMain(callback_factory_.NewCallback( 4998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &CdmAdapter::DecoderDeinitializeDone, 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_type, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id)); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::ResetDecoder(PP_DecryptorStreamType decoder_type, 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id) { 5064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PP_DCHECK(cdm_); // InitializeXxxxxDecoder should have succeeded. 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cdm_) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm_->ResetDecoder(PpDecryptorStreamTypeToCdmStreamType(decoder_type)); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CallOnMain(callback_factory_.NewCallback(&CdmAdapter::DecoderResetDone, 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_type, 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id)); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DecryptAndDecode( 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Buffer_Dev encrypted_buffer, 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_EncryptedBlockInfo& encrypted_block_info) { 5194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PP_DCHECK(cdm_); // InitializeXxxxxDecoder should have succeeded. 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Release a buffer that the caller indicated it is finished with. 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) allocator_.Release(encrypted_block_info.tracking_info.buffer_id); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm::InputBuffer input_buffer; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<cdm::SubsampleEntry> subsamples; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cdm_ && !encrypted_buffer.is_null()) { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureInputBuffer(encrypted_buffer, 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypted_block_info, 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &subsamples, 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &input_buffer); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdm::Status status = cdm::kDecodeError; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (decoder_type) { 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_DECRYPTORSTREAMTYPE_VIDEO: { 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LinkedVideoFrame video_frame(new VideoFrameImpl()); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cdm_) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status = cdm_->DecryptAndDecodeFrame(input_buffer, video_frame.get()); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallOnMain(callback_factory_.NewCallback( 5408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &CdmAdapter::DeliverFrame, 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status, 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_frame, 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypted_block_info.tracking_info)); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_DECRYPTORSTREAMTYPE_AUDIO: { 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LinkedAudioFrames audio_frames(new AudioFramesImpl()); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cdm_) { 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status = cdm_->DecryptAndDecodeSamples(input_buffer, 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_frames.get()); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallOnMain(callback_factory_.NewCallback( 5548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &CdmAdapter::DeliverSamples, 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status, 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_frames, 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypted_block_info.tracking_info)); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NOTREACHED(); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)cdm::Buffer* CdmAdapter::Allocate(uint32_t capacity) { 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return allocator_.Allocate(capacity); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::SetTimer(int64_t delay_ms, void* context) { 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: doesn't really need to run on the main thread; could just as well run 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on a helper thread if |cdm_| were thread-friendly and care was taken. We 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only use CallOnMainThread() here to get delayed-execution behavior. 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Module::Get()->core()->CallOnMainThread( 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delay_ms, 5778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) callback_factory_.NewCallback(&CdmAdapter::TimerExpired, context), 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_OK); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::TimerExpired(int32_t result, void* context) { 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(result == PP_OK); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cdm_->TimerExpired(context); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 586f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// cdm::Host_4 methods 587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)double CdmAdapter::GetCurrentWallTimeInSeconds() { 589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return GetCurrentTime(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::OnSessionCreated(uint32_t session_id, 593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* web_session_id, 594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32_t web_session_id_length) { 595f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id = cdm_->LookupPromiseId(session_id); 596f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm_->AssignWebSessionId(session_id, web_session_id, web_session_id_length); 597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnResolveNewSessionPromise(promise_id, web_session_id, web_session_id_length); 598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnSessionMessage(uint32_t session_id, 601f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char* message, 602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t message_length, 603f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char* destination_url, 604f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t destination_url_length) { 605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string web_session_id = cdm_->LookupWebSessionId(session_id); 606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnSessionMessage(web_session_id.data(), 607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_session_id.length(), 608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) message, 609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) message_length, 610f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) destination_url, 611f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) destination_url_length); 612f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 613f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 614f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnSessionReady(uint32_t session_id) { 615f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id = cdm_->LookupPromiseId(session_id); 616f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (promise_id) { 617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnResolvePromise(promise_id); 618f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string web_session_id = cdm_->LookupWebSessionId(session_id); 620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnSessionReady(web_session_id.data(), web_session_id.length()); 621f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 623f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnSessionClosed(uint32_t session_id) { 625f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id = cdm_->LookupPromiseId(session_id); 626f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string web_session_id = cdm_->LookupWebSessionId(session_id); 627f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm_->DropWebSessionId(web_session_id); 628f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (promise_id) { 629f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnResolvePromise(promise_id); 630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 631f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnSessionClosed(web_session_id.data(), web_session_id.length()); 632f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 634f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 635f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnSessionError(uint32_t session_id, 636f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm::MediaKeyError error_code, 637f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t system_code) { 638f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id = cdm_->LookupPromiseId(session_id); 639f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 640f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Existing cdm::MediaKeyError don't map to DOM error names. Convert them 641f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // into non-standard names so that the prefixed API can extract them. 642f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(jrummell): Remove this conversion and the inverse when CDM4 is gone. 643f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm::Error error; 644f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (error_code) { 645f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case cdm::kPrefixedClientError: 646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error = cdm::kClientError; 647f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) break; 648f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case cdm::kPrefixedOutputError: 649f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error = cdm::kOutputError; 650f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) break; 651f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case cdm::kPrefixedUnknownError: 652f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) default: 653f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error = cdm::kUnknownError; 654f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) break; 655f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 657f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (promise_id) { 658f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RejectPromise(promise_id, error, system_code, std::string()); 659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 660f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string web_session_id = cdm_->LookupWebSessionId(session_id); 661f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnSessionError(web_session_id.data(), 662f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_session_id.length(), 663f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error, 664f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) system_code, 665f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NULL, 666f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 0); 667f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 668f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 670f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// cdm::Host_5 methods 671f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 672f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)cdm::Time CdmAdapter::GetCurrentTime() { 673f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return pp::Module::Get()->core()->GetTime(); 674f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 675f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 676f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnResolvePromise(uint32_t promise_id) { 677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PostOnMain(callback_factory_.NewCallback( 678f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &CdmAdapter::SendPromiseResolvedInternal, promise_id)); 679f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 680f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 681f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnResolveNewSessionPromise(uint32_t promise_id, 682f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char* web_session_id, 683f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t web_session_id_length) { 684f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PostOnMain(callback_factory_.NewCallback( 685f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &CdmAdapter::SendPromiseResolvedWithSessionInternal, 686f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, 687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string(web_session_id, web_session_id_length))); 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnRejectPromise(uint32_t promise_id, 691f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm::Error error, 692f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t system_code, 693f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char* error_message, 694f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t error_message_length) { 695f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RejectPromise(promise_id, 696f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error, 697f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) system_code, 698f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string(error_message, error_message_length)); 699f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 700f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 701f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::RejectPromise(uint32_t promise_id, 702f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm::Error error, 703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t system_code, 704f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& error_message) { 705f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PostOnMain(callback_factory_.NewCallback( 706f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &CdmAdapter::SendPromiseRejectedInternal, 707f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, 708f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SessionError(error, system_code, error_message))); 709f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 710f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnSessionMessage(const char* web_session_id, 712f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t web_session_id_length, 713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* message, 714a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32_t message_length, 715a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* destination_url, 716a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32_t destination_url_length) { 717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PostOnMain(callback_factory_.NewCallback( 718a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &CdmAdapter::SendSessionMessageInternal, 719f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string(web_session_id, web_session_id_length), 720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<uint8>(message, message + message_length), 721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string(destination_url, destination_url_length))); 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 724f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnSessionKeysChange(const char* web_session_id, 725f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t web_session_id_length, 726f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool has_additional_usable_key) { 727f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(jrummell): Implement this event in subsequent CL 728f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // (http://crbug.com/370251). 729f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_NOTREACHED(); 730f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 731f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 732f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnExpirationChange(const char* web_session_id, 733f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t web_session_id_length, 734f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm::Time new_expiry_time) { 735f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(jrummell): Implement this event in subsequent CL 736f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // (http://crbug.com/370251). 737f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_NOTREACHED(); 738f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 739f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 740f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnSessionReady(const char* web_session_id, 741f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t web_session_id_length) { 742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PostOnMain(callback_factory_.NewCallback( 743f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &CdmAdapter::SendSessionReadyInternal, 744f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string(web_session_id, web_session_id_length))); 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 747f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnSessionClosed(const char* web_session_id, 748f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t web_session_id_length) { 749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PostOnMain(callback_factory_.NewCallback( 750f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &CdmAdapter::SendSessionClosedInternal, 751f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string(web_session_id, web_session_id_length))); 752a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 754f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::OnSessionError(const char* web_session_id, 755f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t web_session_id_length, 756f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm::Error error, 757f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t system_code, 758f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char* error_message, 759f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t error_message_length) { 760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PostOnMain(callback_factory_.NewCallback( 761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &CdmAdapter::SendSessionErrorInternal, 762f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string(web_session_id, web_session_id_length), 763f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SessionError(error, 764f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) system_code, 765f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string(error_message, error_message_length)))); 766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 768f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Helpers to pass the event to Pepper. 769f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 770f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::SendPromiseResolvedInternal(int32_t result, 771f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(result == PP_OK); 773f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pp::ContentDecryptor_Private::PromiseResolved(promise_id); 774f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 775f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 776f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::SendPromiseResolvedWithSessionInternal( 777f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int32_t result, 778f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id, 779f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id) { 780f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_DCHECK(result == PP_OK); 781f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pp::ContentDecryptor_Private::PromiseResolvedWithSession(promise_id, 782f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_session_id); 783f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 784f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 785f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::SendPromiseRejectedInternal(int32_t result, 786f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id, 787f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const SessionError& error) { 788f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_DCHECK(result == PP_OK); 789f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pp::ContentDecryptor_Private::PromiseRejected( 790f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, 791f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CdmExceptionTypeToPpCdmExceptionType(error.error), 792f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error.system_code, 793f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error.error_description); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void CdmAdapter::SendSessionMessageInternal( 79746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int32_t result, 798f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id, 79946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::vector<uint8>& message, 80046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& destination_url) { 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(result == PP_OK); 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp::VarArrayBuffer message_array_buffer(message.size()); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (message.size() > 0) { 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memcpy(message_array_buffer.Map(), message.data(), message.size()); 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 808a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pp::ContentDecryptor_Private::SessionMessage( 809f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_session_id, message_array_buffer, destination_url); 810a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 811a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 812f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmAdapter::SendSessionReadyInternal(int32_t result, 813f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id) { 814a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PP_DCHECK(result == PP_OK); 815f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pp::ContentDecryptor_Private::SessionReady(web_session_id); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 818a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::SendSessionClosedInternal(int32_t result, 819f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id) { 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(result == PP_OK); 821f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pp::ContentDecryptor_Private::SessionClosed(web_session_id); 822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 823f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 824a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CdmAdapter::SendSessionErrorInternal(int32_t result, 825f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id, 826f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const SessionError& error) { 827f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PP_DCHECK(result == PP_OK); 828a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pp::ContentDecryptor_Private::SessionError( 829f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_session_id, 830f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CdmExceptionTypeToPpCdmExceptionType(error.error), 831f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error.system_code, 832f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error.error_description); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DeliverBlock(int32_t result, 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const cdm::Status& status, 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LinkedDecryptedBlock& decrypted_block, 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_DecryptTrackingInfo& tracking_info) { 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(result == PP_OK); 840116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PP_DecryptedBlockInfo decrypted_block_info = {}; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_block_info.tracking_info = tracking_info; 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypted_block_info.tracking_info.timestamp = decrypted_block->Timestamp(); 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypted_block_info.tracking_info.buffer_id = 0; 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypted_block_info.data_size = 0; 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_block_info.result = CdmStatusToPpDecryptResult(status); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Buffer_Dev buffer; 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decrypted_block_info.result == PP_DECRYPTRESULT_SUCCESS) { 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_DCHECK(decrypted_block.get() && decrypted_block->DecryptedBuffer()); 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!decrypted_block.get() || !decrypted_block->DecryptedBuffer()) { 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NOTREACHED(); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_block_info.result = PP_DECRYPTRESULT_DECRYPT_ERROR; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpbBuffer* ppb_buffer = 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<PpbBuffer*>(decrypted_block->DecryptedBuffer()); 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypted_block_info.tracking_info.buffer_id = ppb_buffer->buffer_id(); 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypted_block_info.data_size = ppb_buffer->Size(); 859116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 860116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch buffer = ppb_buffer->TakeBuffer(); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::ContentDecryptor_Private::DeliverBlock(buffer, decrypted_block_info); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DecoderInitializeDone(int32_t result, 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id, 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success) { 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(result == PP_OK); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::ContentDecryptor_Private::DecoderInitializeDone(decoder_type, 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id, 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DecoderDeinitializeDone(int32_t result, 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id) { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::ContentDecryptor_Private::DecoderDeinitializeDone(decoder_type, 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DecoderResetDone(int32_t result, 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id) { 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::ContentDecryptor_Private::DecoderResetDone(decoder_type, request_id); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DeliverFrame( 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result, 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const cdm::Status& status, 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LinkedVideoFrame& video_frame, 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_DecryptTrackingInfo& tracking_info) { 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(result == PP_OK); 896116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PP_DecryptedFrameInfo decrypted_frame_info = {}; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_frame_info.tracking_info.request_id = tracking_info.request_id; 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypted_frame_info.tracking_info.buffer_id = 0; 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_frame_info.result = CdmStatusToPpDecryptResult(status); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Buffer_Dev buffer; 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decrypted_frame_info.result == PP_DECRYPTRESULT_SUCCESS) { 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsValidVideoFrame(video_frame)) { 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NOTREACHED(); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_frame_info.result = PP_DECRYPTRESULT_DECODE_ERROR; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpbBuffer* ppb_buffer = 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<PpbBuffer*>(video_frame->FrameBuffer()); 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypted_frame_info.tracking_info.timestamp = video_frame->Timestamp(); 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypted_frame_info.tracking_info.buffer_id = ppb_buffer->buffer_id(); 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypted_frame_info.format = 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CdmVideoFormatToPpDecryptedFrameFormat(video_frame->Format()); 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypted_frame_info.width = video_frame->Size().width; 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypted_frame_info.height = video_frame->Size().height; 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_frame_info.plane_offsets[PP_DECRYPTEDFRAMEPLANES_Y] = 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_frame->PlaneOffset(cdm::VideoFrame::kYPlane); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_frame_info.plane_offsets[PP_DECRYPTEDFRAMEPLANES_U] = 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_frame->PlaneOffset(cdm::VideoFrame::kUPlane); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_frame_info.plane_offsets[PP_DECRYPTEDFRAMEPLANES_V] = 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_frame->PlaneOffset(cdm::VideoFrame::kVPlane); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_frame_info.strides[PP_DECRYPTEDFRAMEPLANES_Y] = 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_frame->Stride(cdm::VideoFrame::kYPlane); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_frame_info.strides[PP_DECRYPTEDFRAMEPLANES_U] = 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_frame->Stride(cdm::VideoFrame::kUPlane); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypted_frame_info.strides[PP_DECRYPTEDFRAMEPLANES_V] = 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_frame->Stride(cdm::VideoFrame::kVPlane); 929116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 930116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch buffer = ppb_buffer->TakeBuffer(); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 933116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::ContentDecryptor_Private::DeliverFrame(buffer, decrypted_frame_info); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::DeliverSamples(int32_t result, 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const cdm::Status& status, 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LinkedAudioFrames& audio_frames, 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_DecryptTrackingInfo& tracking_info) { 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(result == PP_OK); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 943116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PP_DecryptedSampleInfo decrypted_sample_info = {}; 9441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) decrypted_sample_info.tracking_info = tracking_info; 9451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) decrypted_sample_info.tracking_info.timestamp = 0; 9461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) decrypted_sample_info.tracking_info.buffer_id = 0; 9471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) decrypted_sample_info.data_size = 0; 9481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) decrypted_sample_info.result = CdmStatusToPpDecryptResult(status); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Buffer_Dev buffer; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (decrypted_sample_info.result == PP_DECRYPTRESULT_SUCCESS) { 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_DCHECK(audio_frames.get() && audio_frames->FrameBuffer()); 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!audio_frames.get() || !audio_frames->FrameBuffer()) { 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NOTREACHED(); 9561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) decrypted_sample_info.result = PP_DECRYPTRESULT_DECRYPT_ERROR; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpbBuffer* ppb_buffer = 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<PpbBuffer*>(audio_frames->FrameBuffer()); 960116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) decrypted_sample_info.tracking_info.buffer_id = ppb_buffer->buffer_id(); 9621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) decrypted_sample_info.data_size = ppb_buffer->Size(); 9631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) decrypted_sample_info.format = 9641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CdmAudioFormatToPpDecryptedSampleFormat(audio_frames->Format()); 965116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 966116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch buffer = ppb_buffer->TakeBuffer(); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) pp::ContentDecryptor_Private::DeliverSamples(buffer, decrypted_sample_info); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool CdmAdapter::IsValidVideoFrame(const LinkedVideoFrame& video_frame) { 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!video_frame.get() || 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !video_frame->FrameBuffer() || 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (video_frame->Format() != cdm::kI420 && 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_frame->Format() != cdm::kYv12)) { 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CDM_DLOG() << "Invalid video frame!"; 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpbBuffer* ppb_buffer = static_cast<PpbBuffer*>(video_frame->FrameBuffer()); 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (uint32_t i = 0; i < cdm::VideoFrame::kMaxPlanes; ++i) { 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int plane_height = (i == cdm::VideoFrame::kYPlane) ? 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_frame->Size().height : (video_frame->Size().height + 1) / 2; 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cdm::VideoFrame::VideoPlane plane = 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<cdm::VideoFrame::VideoPlane>(i); 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ppb_buffer->Size() < video_frame->PlaneOffset(plane) + 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plane_height * video_frame->Stride(plane)) { 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(NDEBUG) 9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CdmAdapter::LogToConsole(const pp::Var& value) { 10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PP_DCHECK(IsMainThread()); 10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const PPB_Console* console = reinterpret_cast<const PPB_Console*>( 10025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp::Module::Get()->GetBrowserInterface(PPB_CONSOLE_INTERFACE)); 10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) console->Log(pp_instance(), PP_LOGLEVEL_LOG, value.pp_var()); 10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // !defined(NDEBUG) 10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::SendPlatformChallenge( 10081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const char* service_id, uint32_t service_id_length, 10091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const char* challenge, uint32_t challenge_length) { 10108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS) 10118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pp::VarArrayBuffer challenge_var(challenge_length); 10128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) uint8_t* var_data = static_cast<uint8_t*>(challenge_var.Map()); 10138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) memcpy(var_data, challenge, challenge_length); 10148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string service_id_str(service_id, service_id_length); 1016116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1017116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch linked_ptr<PepperPlatformChallengeResponse> response( 1018116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new PepperPlatformChallengeResponse()); 1019116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int32_t result = platform_verification_.ChallengePlatform( 1021116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pp::Var(service_id_str), 1022116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch challenge_var, 1023116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &response->signed_data, 1024116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &response->signed_data_signature, 1025116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &response->platform_key_certificate, 1026116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback_factory_.NewCallback(&CdmAdapter::SendPlatformChallengeDone, 1027116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch response)); 10288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) challenge_var.Unmap(); 1029116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (result == PP_OK_COMPLETIONPENDING) 10308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 10318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Fall through on error and issue an empty OnPlatformChallengeResponse(). 10338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PP_DCHECK(result != PP_OK); 10348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif 10358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1036116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cdm::PlatformChallengeResponse platform_challenge_response = {}; 1037116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cdm_->OnPlatformChallengeResponse(platform_challenge_response); 10388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 10398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::EnableOutputProtection(uint32_t desired_protection_mask) { 10418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS) 10425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32_t result = output_protection_.EnableProtection( 10438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) desired_protection_mask, callback_factory_.NewCallback( 10448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &CdmAdapter::EnableProtectionDone)); 10458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Errors are ignored since clients must call QueryOutputProtectionStatus() to 10478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // inspect the protection status on a regular basis. 10485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (result != PP_OK && result != PP_OK_COMPLETIONPENDING) 10505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CDM_DLOG() << __FUNCTION__ << " failed!"; 10518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif 10528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 10538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::QueryOutputProtectionStatus() { 10558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS) 10568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PP_DCHECK(!query_output_protection_in_progress_); 10578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) output_link_mask_ = output_protection_mask_ = 0; 10598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const int32_t result = output_protection_.QueryStatus( 10608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &output_link_mask_, 10618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &output_protection_mask_, 10628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) callback_factory_.NewCallback( 10638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &CdmAdapter::QueryOutputProtectionStatusDone)); 10648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (result == PP_OK_COMPLETIONPENDING) { 10658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) query_output_protection_in_progress_ = true; 1066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ReportOutputProtectionQuery(); 10678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 10688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 10698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Fall through on error and issue an empty OnQueryOutputProtectionStatus(). 10718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PP_DCHECK(result != PP_OK); 10728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif 10738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) cdm_->OnQueryOutputProtectionStatus(0, 0); 10758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 10768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void CdmAdapter::OnDeferredInitializationDone(cdm::StreamType stream_type, 10781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) cdm::Status decoder_status) { 10791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (stream_type) { 10801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case cdm::kStreamTypeAudio: 10811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PP_DCHECK(deferred_initialize_audio_decoder_); 10821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CallOnMain( 10831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) callback_factory_.NewCallback(&CdmAdapter::DecoderInitializeDone, 10841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PP_DECRYPTORSTREAMTYPE_AUDIO, 10851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_audio_decoder_config_id_, 10861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) decoder_status == cdm::kSuccess)); 10871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_initialize_audio_decoder_ = false; 10881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_audio_decoder_config_id_ = 0; 10891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 10901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case cdm::kStreamTypeVideo: 10911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PP_DCHECK(deferred_initialize_video_decoder_); 10921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CallOnMain( 10931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) callback_factory_.NewCallback(&CdmAdapter::DecoderInitializeDone, 10941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PP_DECRYPTORSTREAMTYPE_VIDEO, 10951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_video_decoder_config_id_, 10961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) decoder_status == cdm::kSuccess)); 10971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_initialize_video_decoder_ = false; 10981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) deferred_video_decoder_config_id_ = 0; 10991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 11001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 11011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 11021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The CDM owns the returned object and must call FileIO::Close() to release it. 11045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)cdm::FileIO* CdmAdapter::CreateFileIO(cdm::FileIOClient* client) { 11055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new CdmFileIOImpl(client, pp_instance()); 11065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS) 1109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void CdmAdapter::ReportOutputProtectionUMA(OutputProtectionStatus status) { 1110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pp::UMAPrivate uma_interface_(this); 1111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uma_interface_.HistogramEnumeration( 1112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "Media.EME.OutputProtection", status, OUTPUT_PROTECTION_MAX); 1113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void CdmAdapter::ReportOutputProtectionQuery() { 1116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (uma_for_output_protection_query_reported_) 1117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 1118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ReportOutputProtectionUMA(OUTPUT_PROTECTION_QUERIED); 1120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uma_for_output_protection_query_reported_ = true; 1121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void CdmAdapter::ReportOutputProtectionQueryResult() { 1124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (uma_for_output_protection_positive_result_reported_) 1125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 1126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Report UMAs for output protection query result. 1128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uint32_t external_links = (output_link_mask_ & ~cdm::kLinkTypeInternal); 1129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!external_links) { 1131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ReportOutputProtectionUMA(OUTPUT_PROTECTION_NO_EXTERNAL_LINK); 1132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uma_for_output_protection_positive_result_reported_ = true; 1133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 1134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const uint32_t kProtectableLinks = 1137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cdm::kLinkTypeHDMI | cdm::kLinkTypeDVI | cdm::kLinkTypeDisplayPort; 1138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_unprotectable_link_connected = external_links & ~kProtectableLinks; 1139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_hdcp_enabled_on_all_protectable_links = 1140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch output_protection_mask_ & cdm::kProtectionHDCP; 1141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!is_unprotectable_link_connected && 1143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch is_hdcp_enabled_on_all_protectable_links) { 1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ReportOutputProtectionUMA( 1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OUTPUT_PROTECTION_ALL_EXTERNAL_LINKS_PROTECTED); 1146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uma_for_output_protection_positive_result_reported_ = true; 1147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 1148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Do not report a negative result because it could be a false negative. 1151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Instead, we will calculate number of negatives using the total number of 1152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // queries and success results. 1153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1155116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid CdmAdapter::SendPlatformChallengeDone( 1156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int32_t result, 1157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const linked_ptr<PepperPlatformChallengeResponse>& response) { 11588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (result != PP_OK) { 11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CDM_DLOG() << __FUNCTION__ << ": Platform challenge failed!"; 1160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cdm::PlatformChallengeResponse platform_challenge_response = {}; 1161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cdm_->OnPlatformChallengeResponse(platform_challenge_response); 11628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 11638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 11648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pp::VarArrayBuffer signed_data_var(response->signed_data); 1166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pp::VarArrayBuffer signed_data_signature_var(response->signed_data_signature); 11678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string platform_key_certificate_string = 1168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch response->platform_key_certificate.AsString(); 11698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cdm::PlatformChallengeResponse platform_challenge_response = { 1171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static_cast<uint8_t*>(signed_data_var.Map()), 1172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) signed_data_var.ByteLength(), 1173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static_cast<uint8_t*>(signed_data_signature_var.Map()), 1174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) signed_data_signature_var.ByteLength(), 1175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) reinterpret_cast<const uint8_t*>(platform_key_certificate_string.data()), 1176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static_cast<uint32_t>(platform_key_certificate_string.length())}; 1177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cdm_->OnPlatformChallengeResponse(platform_challenge_response); 11788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) signed_data_var.Unmap(); 11808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) signed_data_signature_var.Unmap(); 11818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 11828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::EnableProtectionDone(int32_t result) { 11848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Does nothing since clients must call QueryOutputProtectionStatus() to 11858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // inspect the protection status on a regular basis. 11865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CDM_DLOG() << __FUNCTION__ << " : " << result; 11878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 11888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CdmAdapter::QueryOutputProtectionStatusDone(int32_t result) { 11908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PP_DCHECK(query_output_protection_in_progress_); 11918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) query_output_protection_in_progress_ = false; 11928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Return a protection status of none on error. 11948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (result != PP_OK) 11958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) output_link_mask_ = output_protection_mask_ = 0; 1196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else 1197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ReportOutputProtectionQueryResult(); 11988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) cdm_->OnQueryOutputProtectionStatus(output_link_mask_, 12008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) output_protection_mask_); 12018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 12028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif 12038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)CdmAdapter::SessionError::SessionError(cdm::Error error, 1205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t system_code, 1206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string error_description) 1207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : error(error), 1208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) system_code(system_code), 1209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error_description(error_description) { 1210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void* GetCdmHost(int host_interface_version, void* user_data) { 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!host_interface_version || !user_data) 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch COMPILE_ASSERT( 1217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cdm::ContentDecryptionModule::Host::kVersion == cdm::Host_5::kVersion, 1218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch update_code_below); 12190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 12200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Ensure IsSupportedCdmHostVersion matches implementation of this function. 12210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Always update this DCHECK when updating this function. 12220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // If this check fails, update this function and DCHECK or update 12230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // IsSupportedCdmHostVersion. 1224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 12250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PP_DCHECK( 12260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Future version is not supported. 1227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) !IsSupportedCdmHostVersion(cdm::Host_5::kVersion + 1) && 12280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Current version is supported. 1229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IsSupportedCdmHostVersion(cdm::Host_5::kVersion) && 1230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Include all previous supported versions (if any) here. 1231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IsSupportedCdmHostVersion(cdm::Host_4::kVersion) && 12320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // One older than the oldest supported version is not supported. 1233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !IsSupportedCdmHostVersion(cdm::Host_4::kVersion - 1)); 12340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PP_DCHECK(IsSupportedCdmHostVersion(host_interface_version)); 12350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 12368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CdmAdapter* cdm_adapter = static_cast<CdmAdapter*>(user_data); 12375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CDM_DLOG() << "Create CDM Host with version " << host_interface_version; 12388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) switch (host_interface_version) { 12395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case cdm::Host_4::kVersion: 12405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return static_cast<cdm::Host_4*>(cdm_adapter); 1241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case cdm::Host_5::kVersion: 1242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return static_cast<cdm::Host_5*>(cdm_adapter); 12438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) default: 12448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PP_NOTREACHED(); 12458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return NULL; 12468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This object is the global object representing this plugin library as long 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as it is loaded. 12518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class CdmAdapterModule : public pp::Module { 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 12538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CdmAdapterModule() : pp::Module() { 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function blocks the renderer thread (PluginInstance::Initialize()). 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move this call to other places if this may be a concern in the future. 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INITIALIZE_CDM_MODULE(); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual ~CdmAdapterModule() { 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DeinitializeCdmModule(); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual pp::Instance* CreateInstance(PP_Instance instance) { 12638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return new CdmAdapter(instance, this); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 12675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CdmFileIOImpl::ResourceTracker cdm_file_io_impl_resource_tracker; 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace media 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp { 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory function for your specialization of the Module object. 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Module* CreateModule() { 12768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return new media::CdmAdapterModule(); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace pp 1280