15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/content_decryptor_delegate.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_helpers.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/numerics/safe_conversions.h" 11bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_buffer_impl.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "media/base/audio_buffer.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/audio_decoder_config.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/bind_to_current_loop.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "media/base/cdm_promise.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/channel_layout.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/data_buffer.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decoder_buffer.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/decrypt_config.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_decoder_config.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_frame.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_util.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_resource.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/var.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/var_tracker.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_buffer_api.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using media::CdmPromise; 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using media::Decryptor; 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using media::MediaKeys; 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using media::NewSessionCdmPromise; 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using media::SimpleCdmPromise; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::ArrayBufferVar; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PpapiGlobals; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::ScopedPPResource; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::StringVar; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::EnterResourceNoLock; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Buffer_API; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fills |resource| with a PPB_Buffer_Impl and copies |data| into the buffer 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// resource. The |*resource|, if valid, will be in the ResourceTracker with a 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// reference-count of 0. If |data| is NULL, sets |*resource| to NULL. Returns 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// true upon success and false if any error happened. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MakeBufferResource(PP_Instance instance, 51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const uint8* data, 52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t size, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PPB_Buffer_Impl>* resource) { 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT0("media", "ContentDecryptorDelegate - MakeBufferResource"); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(resource); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!data || !size) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!data && !size); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource = NULL; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PPB_Buffer_Impl> buffer( 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPB_Buffer_Impl::CreateResource(instance, size)); 65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!buffer.get()) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BufferAutoMapper mapper(buffer.get()); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!mapper.data() || mapper.size() < size) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(mapper.data(), data, size); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *resource = buffer; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copies the content of |str| into |array|. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if copy succeeded. Returns false if copy failed, e.g. if the 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |array_size| is smaller than the |str| length. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <uint32_t array_size> 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CopyStringToArray(const std::string& str, uint8 (&array)[array_size]) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (array_size < str.size()) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(array, str.data(), str.size()); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fills the |block_info| with information from |encrypted_buffer|. 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if |block_info| is successfully filled. Returns false 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// otherwise. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool MakeEncryptedBlockInfo( 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_EncryptedBlockInfo* block_info) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(xhwang): Fix initialization of PP_EncryptedBlockInfo here and 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // anywhere else. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(block_info, 0, sizeof(*block_info)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) block_info->tracking_info.request_id = request_id; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // EOS buffers need a request ID and nothing more. 103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (encrypted_buffer->end_of_stream()) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(encrypted_buffer->data_size()) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "DecryptConfig is set on an empty buffer"; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) block_info->tracking_info.timestamp = 110ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch encrypted_buffer->timestamp().InMicroseconds(); 111ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch block_info->data_size = encrypted_buffer->data_size(); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const media::DecryptConfig* decrypt_config = 114ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch encrypted_buffer->decrypt_config(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CopyStringToArray(decrypt_config->key_id(), block_info->key_id) || 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !CopyStringToArray(decrypt_config->iv(), block_info->iv)) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) block_info->key_id_size = decrypt_config->key_id().size(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) block_info->iv_size = decrypt_config->iv().size(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decrypt_config->subsamples().size() > arraysize(block_info->subsamples)) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) block_info->num_subsamples = decrypt_config->subsamples().size(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32_t i = 0; i < block_info->num_subsamples; ++i) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) block_info->subsamples[i].clear_bytes = 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypt_config->subsamples()[i].clear_bytes; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) block_info->subsamples[i].cipher_bytes = 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypt_config->subsamples()[i].cypher_bytes; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_AudioCodec MediaAudioCodecToPpAudioCodec(media::AudioCodec codec) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (codec) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::kCodecVorbis: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_AUDIOCODEC_VORBIS; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::kCodecAAC: 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_AUDIOCODEC_AAC; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_AUDIOCODEC_UNKNOWN; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_VideoCodec MediaVideoCodecToPpVideoCodec(media::VideoCodec codec) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (codec) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::kCodecVP8: 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_VIDEOCODEC_VP8; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::kCodecH264: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_VIDEOCODEC_H264; 154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch case media::kCodecVP9: 155a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return PP_VIDEOCODEC_VP9; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_VIDEOCODEC_UNKNOWN; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_VideoCodecProfile MediaVideoCodecProfileToPpVideoCodecProfile( 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media::VideoCodecProfile profile) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (profile) { 164a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // TODO(xhwang): VP8 and VP9 do not have profiles. Clean up 165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // media::VideoCodecProfile and remove these two cases. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::VP8PROFILE_MAIN: 167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch case media::VP9PROFILE_MAIN: 168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return PP_VIDEOCODECPROFILE_NOT_NEEDED; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::H264PROFILE_BASELINE: 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_VIDEOCODECPROFILE_H264_BASELINE; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::H264PROFILE_MAIN: 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_VIDEOCODECPROFILE_H264_MAIN; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::H264PROFILE_EXTENDED: 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_VIDEOCODECPROFILE_H264_EXTENDED; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::H264PROFILE_HIGH: 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_VIDEOCODECPROFILE_H264_HIGH; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::H264PROFILE_HIGH10PROFILE: 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_VIDEOCODECPROFILE_H264_HIGH_10; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::H264PROFILE_HIGH422PROFILE: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_VIDEOCODECPROFILE_H264_HIGH_422; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::H264PROFILE_HIGH444PREDICTIVEPROFILE: 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_VIDEOCODECPROFILE_H264_HIGH_444_PREDICTIVE; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_VIDEOCODECPROFILE_UNKNOWN; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_DecryptedFrameFormat MediaVideoFormatToPpDecryptedFrameFormat( 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media::VideoFrame::Format format) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (format) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::VideoFrame::YV12: 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTEDFRAMEFORMAT_YV12; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case media::VideoFrame::I420: 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTEDFRAMEFORMAT_I420; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTEDFRAMEFORMAT_UNKNOWN; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Decryptor::Status PpDecryptResultToMediaDecryptorStatus( 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptResult result) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (result) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_DECRYPTRESULT_SUCCESS: 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return Decryptor::kSuccess; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_DECRYPTRESULT_DECRYPT_NOKEY: 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return Decryptor::kNoKey; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_DECRYPTRESULT_NEEDMOREDATA: 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return Decryptor::kNeedMoreData; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_DECRYPTRESULT_DECRYPT_ERROR: 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return Decryptor::kError; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_DECRYPTRESULT_DECODE_ERROR: 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return Decryptor::kError; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return Decryptor::kError; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_DecryptorStreamType MediaDecryptorStreamTypeToPpStreamType( 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::StreamType stream_type) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (stream_type) { 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case Decryptor::kAudio: 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTORSTREAMTYPE_AUDIO; 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case Decryptor::kVideo: 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTORSTREAMTYPE_VIDEO; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_DECRYPTORSTREAMTYPE_VIDEO; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)media::SampleFormat PpDecryptedSampleFormatToMediaSampleFormat( 2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PP_DecryptedSampleFormat result) { 2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (result) { 2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case PP_DECRYPTEDSAMPLEFORMAT_U8: 2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return media::kSampleFormatU8; 2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case PP_DECRYPTEDSAMPLEFORMAT_S16: 2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return media::kSampleFormatS16; 2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case PP_DECRYPTEDSAMPLEFORMAT_S32: 2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return media::kSampleFormatS32; 2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case PP_DECRYPTEDSAMPLEFORMAT_F32: 2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return media::kSampleFormatF32; 2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case PP_DECRYPTEDSAMPLEFORMAT_PLANAR_S16: 2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return media::kSampleFormatPlanarS16; 2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case PP_DECRYPTEDSAMPLEFORMAT_PLANAR_F32: 2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return media::kSampleFormatPlanarF32; 2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) default: 2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NOTREACHED(); 2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return media::kUnknownSampleFormat; 2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)PP_SessionType MediaSessionTypeToPpSessionType( 254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MediaKeys::SessionType session_type) { 255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (session_type) { 256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case MediaKeys::TEMPORARY_SESSION: 257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PP_SESSIONTYPE_TEMPORARY; 258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case MediaKeys::PERSISTENT_SESSION: 259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PP_SESSIONTYPE_PERSISTENT; 260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) default: 261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NOTREACHED(); 262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PP_SESSIONTYPE_TEMPORARY; 263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)MediaKeys::Exception PpExceptionTypeToMediaException( 267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_CdmExceptionCode exception_code) { 268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (exception_code) { 269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_CDMEXCEPTIONCODE_NOTSUPPORTEDERROR: 270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return MediaKeys::NOT_SUPPORTED_ERROR; 271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_CDMEXCEPTIONCODE_INVALIDSTATEERROR: 272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return MediaKeys::INVALID_STATE_ERROR; 273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_CDMEXCEPTIONCODE_INVALIDACCESSERROR: 274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return MediaKeys::INVALID_ACCESS_ERROR; 275f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_CDMEXCEPTIONCODE_QUOTAEXCEEDEDERROR: 276f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return MediaKeys::QUOTA_EXCEEDED_ERROR; 277f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_CDMEXCEPTIONCODE_UNKNOWNERROR: 278f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return MediaKeys::UNKNOWN_ERROR; 279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_CDMEXCEPTIONCODE_CLIENTERROR: 280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return MediaKeys::CLIENT_ERROR; 281f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PP_CDMEXCEPTIONCODE_OUTPUTERROR: 282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return MediaKeys::OUTPUT_ERROR; 283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) default: 284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NOTREACHED(); 285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return MediaKeys::UNKNOWN_ERROR; 286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 287f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentDecryptorDelegate::ContentDecryptorDelegate( 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance pp_instance, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPP_ContentDecryptor_Private* plugin_decryption_interface) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : pp_instance_(pp_instance), 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_decryption_interface_(plugin_decryption_interface), 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next_decryption_request_id_(1), 2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch audio_samples_per_second_(0), 2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch audio_channel_count_(0), 29923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) audio_channel_layout_(media::CHANNEL_LAYOUT_NONE), 300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) next_promise_id_(1), 3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) weak_ptr_factory_(this) { 3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) weak_this_ = weak_ptr_factory_.GetWeakPtr(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochContentDecryptorDelegate::~ContentDecryptorDelegate() { 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SatisfyAllPendingCallbacksOnError(); 307bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 308bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentDecryptorDelegate::Initialize( 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& key_system, 311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const media::SessionMessageCB& session_message_cb, 312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const media::SessionReadyCB& session_ready_cb, 313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const media::SessionClosedCB& session_closed_cb, 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const media::SessionErrorCB& session_error_cb, 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Closure& fatal_plugin_error_cb) { 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!key_system.empty()); 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(key_system_.empty()); 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) key_system_ = key_system; 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) session_message_cb_ = session_message_cb; 321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) session_ready_cb_ = session_ready_cb; 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) session_closed_cb_ = session_closed_cb; 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) session_error_cb_ = session_error_cb; 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fatal_plugin_error_cb_ = fatal_plugin_error_cb; 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) plugin_decryption_interface_->Initialize( 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp_instance_, StringVar::StringToPPVar(key_system_)); 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentDecryptorDelegate::InstanceCrashed() { 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fatal_plugin_error_cb_.Run(); 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SatisfyAllPendingCallbacksOnError(); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptorDelegate::CreateSession( 336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& init_data_type, 337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const uint8* init_data, 338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int init_data_length, 339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MediaKeys::SessionType session_type, 340f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<NewSessionCdmPromise> promise) { 341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id = SavePromise(promise.PassAs<CdmPromise>()); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var init_data_array = 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar( 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) init_data_length, init_data); 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) plugin_decryption_interface_->CreateSession( 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp_instance_, 347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, 348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StringVar::StringToPPVar(init_data_type), 349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) init_data_array, 350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MediaSessionTypeToPpSessionType(session_type)); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 353f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptorDelegate::LoadSession( 354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id, 355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<NewSessionCdmPromise> promise) { 356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id = SavePromise(promise.PassAs<CdmPromise>()); 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) plugin_decryption_interface_->LoadSession( 358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pp_instance_, promise_id, StringVar::StringToPPVar(web_session_id)); 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptorDelegate::UpdateSession( 362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id, 363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const uint8* response, 364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int response_length, 365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<SimpleCdmPromise> promise) { 366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id = SavePromise(promise.PassAs<CdmPromise>()); 367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PP_Var response_array = 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar( 369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) response_length, response); 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) plugin_decryption_interface_->UpdateSession( 371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pp_instance_, 372f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, 373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StringVar::StringToPPVar(web_session_id), 374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) response_array); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptorDelegate::ReleaseSession( 378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id, 379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<SimpleCdmPromise> promise) { 380f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id = SavePromise(promise.PassAs<CdmPromise>()); 381f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) plugin_decryption_interface_->ReleaseSession( 382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) pp_instance_, promise_id, StringVar::StringToPPVar(web_session_id)); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(xhwang): Remove duplication of code in Decrypt(), 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DecryptAndDecodeAudio() and DecryptAndDecodeVideo(). 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentDecryptorDelegate::Decrypt( 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::StreamType stream_type, 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Decryptor::DecryptCB& decrypt_cb) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(3) << "Decrypt() - stream_type: " << stream_type; 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |{audio|video}_input_resource_| is not being used by the plugin 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // now because there is only one pending audio/video decrypt request at any 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // time. This is enforced by the media pipeline. 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PPB_Buffer_Impl> encrypted_resource; 397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!MakeMediaBufferResource( 398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stream_type, encrypted_buffer, &encrypted_resource) || 399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !encrypted_resource.get()) { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource pp_resource(encrypted_resource.get()); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t request_id = next_decryption_request_id_++; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << "Decrypt() - request_id " << request_id; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_EncryptedBlockInfo block_info = {}; 408ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(encrypted_buffer->decrypt_config()); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!MakeEncryptedBlockInfo(encrypted_buffer, request_id, &block_info)) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is only one pending decrypt request at any time per stream. This is 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enforced by the media pipeline. 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (stream_type) { 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case Decryptor::kAudio: 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_decrypt_cb_.Set(request_id, decrypt_cb); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case Decryptor::kVideo: 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_decrypt_cb_.Set(request_id, decrypt_cb); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetBufferToFreeInTrackingInfo(&block_info.tracking_info); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 429a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch plugin_decryption_interface_->Decrypt(pp_instance_, pp_resource, &block_info); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentDecryptorDelegate::CancelDecrypt( 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::StreamType stream_type) { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(3) << "CancelDecrypt() - stream_type: " << stream_type; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::DecryptCB decrypt_cb; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (stream_type) { 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case Decryptor::kAudio: 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Release the shared memory as it can still be in use by the plugin. 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The next Decrypt() call will need to allocate a new shared memory 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // buffer. 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_input_resource_ = NULL; 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decrypt_cb = audio_decrypt_cb_.ResetAndReturn(); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case Decryptor::kVideo: 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Release the shared memory as it can still be in use by the plugin. 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The next Decrypt() call will need to allocate a new shared memory 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // buffer. 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_input_resource_ = NULL; 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decrypt_cb = video_decrypt_cb_.ResetAndReturn(); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!decrypt_cb.is_null()) 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decrypt_cb.Run(Decryptor::kSuccess, NULL); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentDecryptorDelegate::InitializeAudioDecoder( 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const media::AudioDecoderConfig& decoder_config, 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Decryptor::DecoderInitCB& init_cb) { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AudioDecoderConfig pp_decoder_config; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_decoder_config.codec = 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaAudioCodecToPpAudioCodec(decoder_config.codec()); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_decoder_config.channel_count = 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media::ChannelLayoutToChannelCount(decoder_config.channel_layout()); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_decoder_config.bits_per_channel = decoder_config.bits_per_channel(); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_decoder_config.samples_per_second = decoder_config.samples_per_second(); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_decoder_config.request_id = next_decryption_request_id_++; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch audio_samples_per_second_ = pp_decoder_config.samples_per_second; 4777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch audio_channel_count_ = pp_decoder_config.channel_count; 47823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) audio_channel_layout_ = decoder_config.channel_layout(); 4797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PPB_Buffer_Impl> extra_data_resource; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!MakeBufferResource(pp_instance_, 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decoder_config.extra_data(), 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decoder_config.extra_data_size(), 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &extra_data_resource)) { 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource pp_resource(extra_data_resource.get()); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_decoder_init_cb_.Set(pp_decoder_config.request_id, init_cb); 490a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch plugin_decryption_interface_->InitializeAudioDecoder( 491a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch pp_instance_, &pp_decoder_config, pp_resource); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentDecryptorDelegate::InitializeVideoDecoder( 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const media::VideoDecoderConfig& decoder_config, 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Decryptor::DecoderInitCB& init_cb) { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_VideoDecoderConfig pp_decoder_config; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_decoder_config.codec = 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaVideoCodecToPpVideoCodec(decoder_config.codec()); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_decoder_config.profile = 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaVideoCodecProfileToPpVideoCodecProfile(decoder_config.profile()); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_decoder_config.format = 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaVideoFormatToPpDecryptedFrameFormat(decoder_config.format()); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_decoder_config.width = decoder_config.coded_size().width(); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_decoder_config.height = decoder_config.coded_size().height(); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_decoder_config.request_id = next_decryption_request_id_++; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PPB_Buffer_Impl> extra_data_resource; 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!MakeBufferResource(pp_instance_, 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decoder_config.extra_data(), 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decoder_config.extra_data_size(), 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &extra_data_resource)) { 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource pp_resource(extra_data_resource.get()); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_decoder_init_cb_.Set(pp_decoder_config.request_id, init_cb); 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) natural_size_ = decoder_config.natural_size(); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 521a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch plugin_decryption_interface_->InitializeVideoDecoder( 522a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch pp_instance_, &pp_decoder_config, pp_resource); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentDecryptorDelegate::DeinitializeDecoder( 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::StreamType stream_type) { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelDecode(stream_type); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 530effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (stream_type == Decryptor::kVideo) 531effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch natural_size_ = gfx::Size(); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(tomfinegan): Add decoder deinitialize request tracking, and get 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stream type from media stack. 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_decryption_interface_->DeinitializeDecoder( 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance_, MediaDecryptorStreamTypeToPpStreamType(stream_type), 0); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ContentDecryptorDelegate::ResetDecoder(Decryptor::StreamType stream_type) { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelDecode(stream_type); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(tomfinegan): Add decoder reset request tracking. 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_decryption_interface_->ResetDecoder( 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance_, MediaDecryptorStreamTypeToPpStreamType(stream_type), 0); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentDecryptorDelegate::DecryptAndDecodeAudio( 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Decryptor::AudioDecodeCB& audio_decode_cb) { 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |audio_input_resource_| is not being used by the plugin now 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // because there is only one pending audio decode request at any time. 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is enforced by the media pipeline. 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PPB_Buffer_Impl> encrypted_resource; 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!MakeMediaBufferResource( 557a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Decryptor::kAudio, encrypted_buffer, &encrypted_resource)) { 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The resource should not be NULL for non-EOS buffer. 562ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!encrypted_buffer->end_of_stream() && !encrypted_resource.get()) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t request_id = next_decryption_request_id_++; 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << "DecryptAndDecodeAudio() - request_id " << request_id; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_EncryptedBlockInfo block_info = {}; 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!MakeEncryptedBlockInfo(encrypted_buffer, request_id, &block_info)) { 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetBufferToFreeInTrackingInfo(&block_info.tracking_info); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is only one pending audio decode request at any time. This is 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // enforced by the media pipeline. If this DCHECK is violated, our buffer 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // reuse policy is not valid, and we may have race problems for the shared 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // buffer. 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_decode_cb_.Set(request_id, audio_decode_cb); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource pp_resource(encrypted_resource.get()); 582a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch plugin_decryption_interface_->DecryptAndDecode( 583a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch pp_instance_, PP_DECRYPTORSTREAMTYPE_AUDIO, pp_resource, &block_info); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentDecryptorDelegate::DecryptAndDecodeVideo( 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Decryptor::VideoDecodeCB& video_decode_cb) { 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |video_input_resource_| is not being used by the plugin now 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // because there is only one pending video decode request at any time. 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is enforced by the media pipeline. 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PPB_Buffer_Impl> encrypted_resource; 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!MakeMediaBufferResource( 595a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Decryptor::kVideo, encrypted_buffer, &encrypted_resource)) { 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The resource should not be 0 for non-EOS buffer. 600ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!encrypted_buffer->end_of_stream() && !encrypted_resource.get()) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t request_id = next_decryption_request_id_++; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << "DecryptAndDecodeVideo() - request_id " << request_id; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN0( 606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "media", "ContentDecryptorDelegate::DecryptAndDecodeVideo", request_id); 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_EncryptedBlockInfo block_info = {}; 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!MakeEncryptedBlockInfo(encrypted_buffer, request_id, &block_info)) { 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetBufferToFreeInTrackingInfo(&block_info.tracking_info); 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only one pending video decode request at any time. This is enforced by the 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // media pipeline. If this DCHECK is violated, our buffer 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // reuse policy is not valid, and we may have race problems for the shared 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // buffer. 6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_decode_cb_.Set(request_id, video_decode_cb); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(tomfinegan): Need to get stream type from media stack. 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource pp_resource(encrypted_resource.get()); 623a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch plugin_decryption_interface_->DecryptAndDecode( 624a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch pp_instance_, PP_DECRYPTORSTREAMTYPE_VIDEO, pp_resource, &block_info); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 628f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptorDelegate::OnPromiseResolved(uint32 promise_id) { 629f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<CdmPromise> promise = TakePromise(promise_id); 630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (promise) { 631f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SimpleCdmPromise* simple_promise( 632f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static_cast<SimpleCdmPromise*>(promise.get())); 633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) simple_promise->resolve(); 634f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 635f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 637f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptorDelegate::OnPromiseResolvedWithSession( 638f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 promise_id, 639f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Var web_session_id) { 640f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<CdmPromise> promise = TakePromise(promise_id); 641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 642f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StringVar* web_session_id_string = StringVar::FromPPVar(web_session_id); 643f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(web_session_id_string); 644f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 645f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (promise) { 646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NewSessionCdmPromise* session_promise( 647f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static_cast<NewSessionCdmPromise*>(promise.get())); 648f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) session_promise->resolve(web_session_id_string->value()); 649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 650f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptorDelegate::OnPromiseRejected( 653f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 promise_id, 654f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_CdmExceptionCode exception_code, 655f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 system_code, 656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Var error_description) { 657f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StringVar* error_description_string = StringVar::FromPPVar(error_description); 658f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(error_description_string); 659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 660f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<CdmPromise> promise = TakePromise(promise_id); 661f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (promise) { 662f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise->reject(PpExceptionTypeToMediaException(exception_code), 663f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) system_code, 664f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error_description_string->value()); 665f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 668f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptorDelegate::OnSessionMessage(PP_Var web_session_id, 669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Var message, 670f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Var destination_url) { 671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (session_message_cb_.is_null()) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 674f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StringVar* web_session_id_string = StringVar::FromPPVar(web_session_id); 675f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(web_session_id_string); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 677f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ArrayBufferVar* message_array_buffer = ArrayBufferVar::FromPPVar(message); 678f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<uint8> message_vector; 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (message_array_buffer) { 680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const uint8* data = static_cast<const uint8*>(message_array_buffer->Map()); 681f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) message_vector.assign(data, data + message_array_buffer->ByteLength()); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 684f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StringVar* destination_url_string = StringVar::FromPPVar(destination_url); 685f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(destination_url_string); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GURL verified_gurl = GURL(destination_url_string->value()); 688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!verified_gurl.is_valid() && !verified_gurl.is_empty()) { 689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DLOG(WARNING) << "SessionMessage default_url is invalid : " 690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) << verified_gurl.possibly_invalid_spec(); 69146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) verified_gurl = GURL::EmptyGURL(); // Replace invalid destination_url. 692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 694f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) session_message_cb_.Run( 695f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_session_id_string->value(), message_vector, verified_gurl); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 698f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptorDelegate::OnSessionReady(PP_Var web_session_id) { 699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (session_ready_cb_.is_null()) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 702f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StringVar* web_session_id_string = StringVar::FromPPVar(web_session_id); 703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(web_session_id_string); 704f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 705f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) session_ready_cb_.Run(web_session_id_string->value()); 706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 708f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptorDelegate::OnSessionClosed(PP_Var web_session_id) { 709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (session_closed_cb_.is_null()) 710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 712f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StringVar* web_session_id_string = StringVar::FromPPVar(web_session_id); 713f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(web_session_id_string); 714f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 715f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) session_closed_cb_.Run(web_session_id_string->value()); 716a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 718f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptorDelegate::OnSessionError( 719f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Var web_session_id, 720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_CdmExceptionCode exception_code, 721f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 system_code, 722f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Var error_description) { 723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (session_error_cb_.is_null()) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 726f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StringVar* web_session_id_string = StringVar::FromPPVar(web_session_id); 727f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(web_session_id_string); 728f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 729f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StringVar* error_description_string = StringVar::FromPPVar(error_description); 730f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(error_description_string); 731f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 732f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) session_error_cb_.Run(web_session_id_string->value(), 733f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PpExceptionTypeToMediaException(exception_code), 734f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) system_code, 735f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) error_description_string->value()); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentDecryptorDelegate::DecoderInitializeDone( 739a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PP_DecryptorStreamType decoder_type, 740a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t request_id, 741a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PP_Bool success) { 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decoder_type == PP_DECRYPTORSTREAMTYPE_AUDIO) { 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the request ID is not valid or does not match what's saved, do 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nothing. 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (request_id == 0 || !audio_decoder_init_cb_.Matches(request_id)) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_decoder_init_cb_.ResetAndReturn().Run(PP_ToBool(success)); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (request_id == 0 || !video_decoder_init_cb_.Matches(request_id)) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!success) 7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) natural_size_ = gfx::Size(); 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_decoder_init_cb_.ResetAndReturn().Run(PP_ToBool(success)); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentDecryptorDelegate::DecoderDeinitializeDone( 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id) { 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(tomfinegan): Add decoder stop completion handling. 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentDecryptorDelegate::DecoderResetDone( 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id) { 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(tomfinegan): Add decoder reset completion handling. 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentDecryptorDelegate::DeliverBlock( 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource decrypted_block, 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_DecryptedBlockInfo* block_info) { 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(block_info); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FreeBuffer(block_info->tracking_info.buffer_id); 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t request_id = block_info->tracking_info.request_id; 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << "DeliverBlock() - request_id: " << request_id; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the request ID is not valid or does not match what's saved, do nothing. 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request_id == 0) { 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "DeliverBlock() - invalid request_id " << request_id; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::DecryptCB decrypt_cb; 7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (audio_decrypt_cb_.Matches(request_id)) { 7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decrypt_cb = audio_decrypt_cb_.ResetAndReturn(); 7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (video_decrypt_cb_.Matches(request_id)) { 7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decrypt_cb = video_decrypt_cb_.ResetAndReturn(); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "DeliverBlock() - request_id " << request_id << " not found"; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::Status status = 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpDecryptResultToMediaDecryptorStatus(block_info->result); 8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (status != Decryptor::kSuccess) { 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decrypt_cb.Run(status, NULL); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResourceNoLock<PPB_Buffer_API> enter(decrypted_block, true); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!enter.succeeded()) { 8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decrypt_cb.Run(Decryptor::kError, NULL); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BufferAutoMapper mapper(enter.object()); 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!mapper.data() || !mapper.size() || 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mapper.size() < block_info->data_size) { 8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decrypt_cb.Run(Decryptor::kError, NULL); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(tomfinegan): Find a way to take ownership of the shared memory 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // managed by the PPB_Buffer_Dev, and avoid the extra copy. 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<media::DecoderBuffer> decrypted_buffer( 820a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch media::DecoderBuffer::CopyFrom(static_cast<uint8*>(mapper.data()), 821a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch block_info->data_size)); 822a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch decrypted_buffer->set_timestamp( 823a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::TimeDelta::FromMicroseconds(block_info->tracking_info.timestamp)); 8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decrypt_cb.Run(Decryptor::kSuccess, decrypted_buffer); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use a non-class-member function here so that if for some reason 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ContentDecryptorDelegate is destroyed before VideoFrame calls this callback, 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// we can still get the shared memory unmapped. 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void BufferNoLongerNeeded( 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<PPB_Buffer_Impl>& ppb_buffer, 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Closure buffer_no_longer_needed_cb) { 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppb_buffer->Unmap(); 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer_no_longer_needed_cb.Run(); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Enters |resource|, maps shared memory and returns pointer of mapped data. 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns NULL if any error occurs. 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static uint8* GetMappedBuffer(PP_Resource resource, 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PPB_Buffer_Impl>* ppb_buffer) { 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterResourceNoLock<PPB_Buffer_API> enter(resource, true); 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!enter.succeeded()) 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8* mapped_data = static_cast<uint8*>(enter.object()->Map()); 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!enter.object()->IsMapped() || !mapped_data) 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t mapped_size = 0; 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!enter.object()->Describe(&mapped_size) || !mapped_size) { 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enter.object()->Unmap(); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *ppb_buffer = static_cast<PPB_Buffer_Impl*>(enter.object()); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mapped_data; 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentDecryptorDelegate::DeliverFrame( 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource decrypted_frame, 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_DecryptedFrameInfo* frame_info) { 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(frame_info); 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t request_id = frame_info->tracking_info.request_id; 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << "DeliverFrame() - request_id: " << request_id; 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the request ID is not valid or does not match what's saved, do nothing. 8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (request_id == 0 || !video_decode_cb_.Matches(request_id)) { 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "DeliverFrame() - request_id " << request_id << " not found"; 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FreeBuffer(frame_info->tracking_info.buffer_id); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT_ASYNC_END0( 876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "media", "ContentDecryptorDelegate::DecryptAndDecodeVideo", request_id); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::VideoDecodeCB video_decode_cb = video_decode_cb_.ResetAndReturn(); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::Status status = 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpDecryptResultToMediaDecryptorStatus(frame_info->result); 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (status != Decryptor::kSuccess) { 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!frame_info->tracking_info.buffer_id); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_decode_cb.Run(status, NULL); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PPB_Buffer_Impl> ppb_buffer; 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8* frame_data = GetMappedBuffer(decrypted_frame, &ppb_buffer); 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!frame_data) { 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FreeBuffer(frame_info->tracking_info.buffer_id); 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_decode_cb.Run(Decryptor::kError, NULL); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size frame_size(frame_info->width, frame_info->height); 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(frame_info->format, PP_DECRYPTEDFRAMEFORMAT_YV12); 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<media::VideoFrame> decoded_frame = 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::VideoFrame::WrapExternalYuvData( 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::VideoFrame::YV12, 902ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch frame_size, 903ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::Rect(frame_size), 904ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch natural_size_, 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame_info->strides[PP_DECRYPTEDFRAMEPLANES_Y], 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame_info->strides[PP_DECRYPTEDFRAMEPLANES_U], 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame_info->strides[PP_DECRYPTEDFRAMEPLANES_V], 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame_data + frame_info->plane_offsets[PP_DECRYPTEDFRAMEPLANES_Y], 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame_data + frame_info->plane_offsets[PP_DECRYPTEDFRAMEPLANES_U], 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame_data + frame_info->plane_offsets[PP_DECRYPTEDFRAMEPLANES_V], 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMicroseconds( 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame_info->tracking_info.timestamp), 9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::BindToCurrentLoop( 914ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&BufferNoLongerNeeded, 915ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ppb_buffer, 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&ContentDecryptorDelegate::FreeBuffer, 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) weak_this_, 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame_info->tracking_info.buffer_id)))); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_decode_cb.Run(Decryptor::kSuccess, decoded_frame); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentDecryptorDelegate::DeliverSamples( 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource audio_frames, 9251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const PP_DecryptedSampleInfo* sample_info) { 9261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(sample_info); 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FreeBuffer(sample_info->tracking_info.buffer_id); 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const uint32_t request_id = sample_info->tracking_info.request_id; 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << "DeliverSamples() - request_id: " << request_id; 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the request ID is not valid or does not match what's saved, do nothing. 9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (request_id == 0 || !audio_decode_cb_.Matches(request_id)) { 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "DeliverSamples() - request_id " << request_id << " not found"; 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::AudioDecodeCB audio_decode_cb = audio_decode_cb_.ResetAndReturn(); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Decryptor::AudioBuffers empty_frames; 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::Status status = 9441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PpDecryptResultToMediaDecryptorStatus(sample_info->result); 9455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (status != Decryptor::kSuccess) { 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_decode_cb.Run(status, empty_frames); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) media::SampleFormat sample_format = 9511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PpDecryptedSampleFormatToMediaSampleFormat(sample_info->format); 9521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::AudioBuffers audio_frame_list; 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!DeserializeAudioFrames(audio_frames, 9551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) sample_info->data_size, 9561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) sample_format, 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &audio_frame_list)) { 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "CDM did not serialize the buffer correctly."; 9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_decode_cb.Run(Decryptor::kError, empty_frames); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_decode_cb.Run(Decryptor::kSuccess, audio_frame_list); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(xhwang): Try to remove duplicate logic here and in CancelDecrypt(). 9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentDecryptorDelegate::CancelDecode(Decryptor::StreamType stream_type) { 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (stream_type) { 9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case Decryptor::kAudio: 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Release the shared memory as it can still be in use by the plugin. 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The next DecryptAndDecode() call will need to allocate a new shared 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // memory buffer. 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_input_resource_ = NULL; 9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!audio_decode_cb_.is_null()) 9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_decode_cb_.ResetAndReturn().Run(Decryptor::kSuccess, 9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::AudioBuffers()); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case Decryptor::kVideo: 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Release the shared memory as it can still be in use by the plugin. 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The next DecryptAndDecode() call will need to allocate a new shared 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // memory buffer. 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_input_resource_ = NULL; 9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!video_decode_cb_.is_null()) 9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_decode_cb_.ResetAndReturn().Run(Decryptor::kSuccess, NULL); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ContentDecryptorDelegate::MakeMediaBufferResource( 9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::StreamType stream_type, 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PPB_Buffer_Impl>* resource) { 995f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT0("media", "ContentDecryptorDelegate::MakeMediaBufferResource"); 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // End of stream buffers are represented as null resources. 998ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (encrypted_buffer->end_of_stream()) { 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *resource = NULL; 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(stream_type == Decryptor::kAudio || stream_type == Decryptor::kVideo); 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PPB_Buffer_Impl>& media_resource = 10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (stream_type == Decryptor::kAudio) ? audio_input_resource_ 10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : video_input_resource_; 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1008ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const size_t data_size = static_cast<size_t>(encrypted_buffer->data_size()); 1009868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!media_resource.get() || media_resource->size() < data_size) { 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Either the buffer hasn't been created yet, or we have one that isn't big 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // enough to fit |size| bytes. 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Media resource size starts from |kMinimumMediaBufferSize| and grows 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // exponentially to avoid frequent re-allocation of PPB_Buffer_Impl, 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // which is usually expensive. Since input media buffers are compressed, 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // they are usually small (compared to outputs). The over-allocated memory 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should be negligible. 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const uint32_t kMinimumMediaBufferSize = 1024; 1019868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) uint32_t media_resource_size = 1020868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) media_resource.get() ? media_resource->size() : kMinimumMediaBufferSize; 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (media_resource_size < data_size) 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media_resource_size *= 2; 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(2) << "Size of media buffer for " 10255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << ((stream_type == Decryptor::kAudio) ? "audio" : "video") 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " stream bumped to " << media_resource_size 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " bytes to fit input."; 1028a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch media_resource = 1029a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PPB_Buffer_Impl::CreateResource(pp_instance_, media_resource_size); 1030868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!media_resource.get()) 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1034868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BufferAutoMapper mapper(media_resource.get()); 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!mapper.data() || mapper.size() < data_size) { 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media_resource = NULL; 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1039ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch memcpy(mapper.data(), encrypted_buffer->data(), data_size); 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *resource = media_resource; 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentDecryptorDelegate::FreeBuffer(uint32_t buffer_id) { 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (buffer_id) 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) free_buffers_.push(buffer_id); 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentDecryptorDelegate::SetBufferToFreeInTrackingInfo( 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_DecryptTrackingInfo* tracking_info) { 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(tracking_info->buffer_id, 0u); 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (free_buffers_.empty()) 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracking_info->buffer_id = free_buffers_.front(); 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) free_buffers_.pop(); 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool ContentDecryptorDelegate::DeserializeAudioFrames( 10627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PP_Resource audio_frames, 10637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t data_size, 10641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) media::SampleFormat sample_format, 10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Decryptor::AudioBuffers* frames) { 10667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(frames); 10677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EnterResourceNoLock<PPB_Buffer_API> enter(audio_frames, true); 10687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!enter.succeeded()) 10697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 10707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BufferAutoMapper mapper(enter.object()); 10727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!mapper.data() || !mapper.size() || 10737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mapper.size() < static_cast<uint32_t>(data_size)) 10747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 10757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(jrummell): Pass ownership of data() directly to AudioBuffer to avoid 10777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // the copy. Since it is possible to get multiple buffers, it would need to be 10787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // sliced and ref counted appropriately. http://crbug.com/255576. 10797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const uint8* cur = static_cast<uint8*>(mapper.data()); 10807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t bytes_left = data_size; 10817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const int audio_bytes_per_frame = 10831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) media::SampleFormatToBytesPerChannel(sample_format) * 10841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) audio_channel_count_; 10855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (audio_bytes_per_frame <= 0) 10865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 10871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 10881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Allocate space for the channel pointers given to AudioBuffer. 1089a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::vector<const uint8*> channel_ptrs(audio_channel_count_, 1090a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<const uint8*>(NULL)); 10917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch do { 10927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int64 timestamp = 0; 10937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int64 frame_size = -1; 10947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const size_t kHeaderSize = sizeof(timestamp) + sizeof(frame_size); 10957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (bytes_left < kHeaderSize) 10977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 10987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch memcpy(×tamp, cur, sizeof(timestamp)); 11007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cur += sizeof(timestamp); 11017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bytes_left -= sizeof(timestamp); 11027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch memcpy(&frame_size, cur, sizeof(frame_size)); 11047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cur += sizeof(frame_size); 11057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bytes_left -= sizeof(frame_size); 11067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // We should *not* have empty frames in the list. 11087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (frame_size <= 0 || 11095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bytes_left < base::checked_cast<size_t>(frame_size)) { 11107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 11117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 11127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Setup channel pointers. AudioBuffer::CopyFrom() will only use the first 11141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // one in the case of interleaved data. 11151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const int size_per_channel = frame_size / audio_channel_count_; 11161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (int i = 0; i < audio_channel_count_; ++i) 11171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) channel_ptrs[i] = cur + i * size_per_channel; 11181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 11191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const int frame_count = frame_size / audio_bytes_per_frame; 11207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<media::AudioBuffer> frame = media::AudioBuffer::CopyFrom( 11211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) sample_format, 112223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) audio_channel_layout_, 1123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch audio_channel_count_, 112423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) audio_samples_per_second_, 11257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch frame_count, 11261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &channel_ptrs[0], 1127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::TimeDelta::FromMicroseconds(timestamp)); 11287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch frames->push_back(frame); 11297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cur += frame_size; 11317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bytes_left -= frame_size; 11327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } while (bytes_left > 0); 11337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 11357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 11367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentDecryptorDelegate::SatisfyAllPendingCallbacksOnError() { 11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!audio_decoder_init_cb_.is_null()) 11395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_decoder_init_cb_.ResetAndReturn().Run(false); 11405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!video_decoder_init_cb_.is_null()) 11425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_decoder_init_cb_.ResetAndReturn().Run(false); 11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_input_resource_ = NULL; 11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_input_resource_ = NULL; 11465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!audio_decrypt_cb_.is_null()) 11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_decrypt_cb_.ResetAndReturn().Run(media::Decryptor::kError, NULL); 11495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!video_decrypt_cb_.is_null()) 11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_decrypt_cb_.ResetAndReturn().Run(media::Decryptor::kError, NULL); 11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!audio_decode_cb_.is_null()) { 11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const media::Decryptor::AudioBuffers empty_frames; 11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_decode_cb_.ResetAndReturn().Run(media::Decryptor::kError, 11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) empty_frames); 11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!video_decode_cb_.is_null()) 11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_decode_cb_.ResetAndReturn().Run(media::Decryptor::kError, NULL); 1161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Reject all outstanding promises. 1163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (PromiseMap::iterator it = promises_.begin(); it != promises_.end(); 1164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ++it) { 1165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) it->second->reject( 1166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media::MediaKeys::UNKNOWN_ERROR, 0, "Failure calling plugin."); 1167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promises_.clear(); 1169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)uint32_t ContentDecryptorDelegate::SavePromise(scoped_ptr<CdmPromise> promise) { 1172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id = next_promise_id_++; 1173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promises_.add(promise_id, promise.Pass()); 1174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return promise_id; 1175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)scoped_ptr<CdmPromise> ContentDecryptorDelegate::TakePromise( 1178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id) { 1179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PromiseMap::iterator it = promises_.find(promise_id); 1180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (it == promises_.end()) 1181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return scoped_ptr<CdmPromise>(); 1182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return promises_.take_and_erase(it); 11835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 118558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} // namespace content 1186