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(&timestamp, 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