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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/content_decryptor_private.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring>  // memcpy
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_var.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_content_decryptor_private.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppp_content_decryptor_private.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance_handle.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/logging.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module_impl.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/var.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ppapi/cpp/var_array.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kPPPContentDecryptorInterface[] =
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void Initialize(PP_Instance instance,
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                PP_Var key_system_arg) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* object =
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!object)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Var key_system_var(pp::PASS_REF, key_system_arg);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!key_system_var.is_string())
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  static_cast<ContentDecryptor_Private*>(object)->Initialize(
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      key_system_var.AsString());
4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SetServerCertificate(PP_Instance instance,
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          uint32_t promise_id,
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          PP_Var server_certificate_arg) {
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void* object =
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!object)
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pp::Var server_certificate_var(server_certificate_arg);
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!server_certificate_var.is_array_buffer())
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pp::VarArrayBuffer server_certificate(server_certificate_var);
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<ContentDecryptor_Private*>(object)
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->SetServerCertificate(promise_id, server_certificate);
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CreateSession(PP_Instance instance,
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   uint32_t promise_id,
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   PP_Var init_data_type_arg,
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   PP_Var init_data_arg,
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   PP_SessionType session_type) {
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void* object =
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!object)
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  pp::Var init_data_type_var(pp::PASS_REF, init_data_type_arg);
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!init_data_type_var.is_string())
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Var init_data_var(pp::PASS_REF, init_data_arg);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!init_data_var.is_array_buffer())
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::VarArrayBuffer init_data_array_buffer(init_data_var);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static_cast<ContentDecryptor_Private*>(object)
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ->CreateSession(promise_id,
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      init_data_type_var.AsString(),
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      init_data_array_buffer,
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      session_type);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LoadSession(PP_Instance instance,
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                 uint32_t promise_id,
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 PP_Var web_session_id_arg) {
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void* object =
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!object)
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  pp::Var web_session_id_var(web_session_id_arg);
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!web_session_id_var.is_string())
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static_cast<ContentDecryptor_Private*>(object)
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ->LoadSession(promise_id, web_session_id_var.AsString());
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UpdateSession(PP_Instance instance,
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   uint32_t promise_id,
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   PP_Var web_session_id_arg,
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   PP_Var response_arg) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* object =
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!object)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  pp::Var web_session_id_var(web_session_id_arg);
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!web_session_id_var.is_string())
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  pp::Var response_var(response_arg);
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!response_var.is_array_buffer())
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  pp::VarArrayBuffer response(response_var);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static_cast<ContentDecryptor_Private*>(object)
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ->UpdateSession(promise_id, web_session_id_var.AsString(), response);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CloseSession(PP_Instance instance,
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  uint32_t promise_id,
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  PP_Var web_session_id_arg) {
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void* object =
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!object)
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pp::Var web_session_id_var(web_session_id_arg);
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!web_session_id_var.is_string())
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<ContentDecryptor_Private*>(object)
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->CloseSession(promise_id, web_session_id_var.AsString());
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RemoveSession(PP_Instance instance,
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   uint32_t promise_id,
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   PP_Var web_session_id_arg) {
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void* object =
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!object)
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pp::Var web_session_id_var(web_session_id_arg);
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!web_session_id_var.is_string())
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<ContentDecryptor_Private*>(object)
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->RemoveSession(promise_id, web_session_id_var.AsString());
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GetUsableKeyIds(PP_Instance instance,
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     uint32_t promise_id,
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     PP_Var web_session_id_arg) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* object =
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!object)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  pp::Var web_session_id_var(web_session_id_arg);
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!web_session_id_var.is_string())
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static_cast<ContentDecryptor_Private*>(object)
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->GetUsableKeyIds(promise_id, web_session_id_var.AsString());
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Decrypt(PP_Instance instance,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             PP_Resource encrypted_resource,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             const PP_EncryptedBlockInfo* encrypted_block_info) {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pp::Buffer_Dev encrypted_block(encrypted_resource);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* object =
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!object)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<ContentDecryptor_Private*>(object)->Decrypt(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      encrypted_block,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *encrypted_block_info);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeAudioDecoder(
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PP_AudioDecoderConfig* decoder_config,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Resource extra_data_resource) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pp::Buffer_Dev extra_data_buffer(extra_data_resource);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* object =
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!object)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<ContentDecryptor_Private*>(object)->InitializeAudioDecoder(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *decoder_config,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extra_data_buffer);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeVideoDecoder(
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PP_VideoDecoderConfig* decoder_config,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Resource extra_data_resource) {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pp::Buffer_Dev extra_data_buffer(extra_data_resource);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* object =
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!object)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<ContentDecryptor_Private*>(object)->InitializeVideoDecoder(
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *decoder_config,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extra_data_buffer);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeinitializeDecoder(PP_Instance instance,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         PP_DecryptorStreamType decoder_type,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint32_t request_id) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* object =
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!object)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<ContentDecryptor_Private*>(object)->DeinitializeDecoder(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decoder_type,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ResetDecoder(PP_Instance instance,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  PP_DecryptorStreamType decoder_type,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  uint32_t request_id) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* object =
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!object)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<ContentDecryptor_Private*>(object)->ResetDecoder(decoder_type,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                               request_id);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DecryptAndDecode(PP_Instance instance,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      PP_DecryptorStreamType decoder_type,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      PP_Resource encrypted_resource,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const PP_EncryptedBlockInfo* encrypted_block_info) {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pp::Buffer_Dev encrypted_buffer(encrypted_resource);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* object =
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!object)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<ContentDecryptor_Private*>(object)->DecryptAndDecode(
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      decoder_type,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      encrypted_buffer,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *encrypted_block_info);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPP_ContentDecryptor_Private ppp_content_decryptor = {
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &Initialize,
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &SetServerCertificate,
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &CreateSession,
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &LoadSession,
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &UpdateSession,
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &CloseSession,
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &RemoveSession,
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &GetUsableKeyIds,
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &Decrypt,
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &InitializeAudioDecoder,
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &InitializeVideoDecoder,
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &DeinitializeDecoder,
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &ResetDecoder,
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &DecryptAndDecode};
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <> const char* interface_name<PPB_ContentDecryptor_Private>() {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PPB_CONTENTDECRYPTOR_PRIVATE_INTERFACE;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentDecryptor_Private::ContentDecryptor_Private(Instance* instance)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : associated_instance_(instance) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Module::Get()->AddPluginInterface(kPPPContentDecryptorInterface,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &ppp_content_decryptor);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance->AddPerInstanceObject(kPPPContentDecryptorInterface, this);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentDecryptor_Private::~ContentDecryptor_Private() {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Instance::RemovePerInstanceObject(associated_instance_,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    kPPPContentDecryptorInterface,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    this);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptor_Private::PromiseResolved(uint32_t promise_id) {
294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->PromiseResolved(
296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        associated_instance_.pp_instance(), promise_id);
297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptor_Private::PromiseResolvedWithSession(
301f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    uint32_t promise_id,
302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::string& web_session_id) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    pp::Var web_session_id_var(web_session_id);
305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->PromiseResolvedWithSession(
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        associated_instance_.pp_instance(),
307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        promise_id,
308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        web_session_id_var.pp_var());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ContentDecryptor_Private::PromiseResolvedWithKeyIds(
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    uint32_t promise_id,
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<std::vector<uint8_t> >& key_ids) {
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (has_interface<PPB_ContentDecryptor_Private>()) {
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pp::VarArray key_ids_array = pp::VarArray();
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    key_ids_array.SetLength(key_ids.size());
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (size_t i = 0; i < key_ids.size(); ++i) {
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const std::vector<uint8_t>& entry = key_ids[i];
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pp::VarArrayBuffer array_buffer(entry.size());
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      memcpy(array_buffer.Map(), &entry[0], entry.size());
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      key_ids_array.Set(i, array_buffer);
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    get_interface<PPB_ContentDecryptor_Private>()->PromiseResolvedWithKeyIds(
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        associated_instance_.pp_instance(), promise_id, key_ids_array.pp_var());
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptor_Private::PromiseRejected(
330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    uint32_t promise_id,
331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PP_CdmExceptionCode exception_code,
332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    uint32_t system_code,
333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& error_description) {
334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    pp::Var error_description_var(error_description);
336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->PromiseRejected(
337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        associated_instance_.pp_instance(),
338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        promise_id,
339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        exception_code,
340f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        system_code,
341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        error_description_var.pp_var());
342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
34546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ContentDecryptor_Private::SessionMessage(
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& web_session_id,
34746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    pp::VarArrayBuffer message,
34846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string& destination_url) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    pp::Var web_session_id_var(web_session_id);
35146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    pp::Var destination_url_var(destination_url);
352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->SessionMessage(
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        associated_instance_.pp_instance(),
354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        web_session_id_var.pp_var(),
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        message.pp_var(),
35646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        destination_url_var.pp_var());
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ContentDecryptor_Private::SessionKeysChange(
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& web_session_id,
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool has_additional_usable_key) {
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (has_interface<PPB_ContentDecryptor_Private>()) {
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pp::Var web_session_id_var(web_session_id);
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    get_interface<PPB_ContentDecryptor_Private>()->SessionKeysChange(
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        associated_instance_.pp_instance(),
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        web_session_id_var.pp_var(),
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        PP_FromBool(has_additional_usable_key));
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ContentDecryptor_Private::SessionExpirationChange(
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& web_session_id,
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PP_Time new_expiry_time) {
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (has_interface<PPB_ContentDecryptor_Private>()) {
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pp::Var web_session_id_var(web_session_id);
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    get_interface<PPB_ContentDecryptor_Private>()->SessionExpirationChange(
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        associated_instance_.pp_instance(),
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        web_session_id_var.pp_var(),
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new_expiry_time);
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
384f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptor_Private::SessionReady(const std::string& web_session_id) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
386f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    pp::Var web_session_id_var(web_session_id);
387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->SessionReady(
388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        associated_instance_.pp_instance(), web_session_id_var.pp_var());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptor_Private::SessionClosed(
393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& web_session_id) {
394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
395f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    pp::Var web_session_id_var(web_session_id);
396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->SessionClosed(
397f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        associated_instance_.pp_instance(), web_session_id_var.pp_var());
398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContentDecryptor_Private::SessionError(
402f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& web_session_id,
403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PP_CdmExceptionCode exception_code,
404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    uint32_t system_code,
405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& error_description) {
406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    pp::Var web_session_id_var(web_session_id);
408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    pp::Var error_description_var(error_description);
409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->SessionError(
410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        associated_instance_.pp_instance(),
411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        web_session_id_var.pp_var(),
412f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        exception_code,
413f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        system_code,
414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        error_description_var.pp_var());
415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentDecryptor_Private::DeliverBlock(
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp::Buffer_Dev decrypted_block,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PP_DecryptedBlockInfo& decrypted_block_info) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->DeliverBlock(
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        associated_instance_.pp_instance(),
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        decrypted_block.pp_resource(),
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &decrypted_block_info);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentDecryptor_Private::DecoderInitializeDone(
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_DecryptorStreamType decoder_type,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t request_id,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->DecoderInitializeDone(
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        associated_instance_.pp_instance(),
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        decoder_type,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_id,
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PP_FromBool(success));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentDecryptor_Private::DecoderDeinitializeDone(
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_DecryptorStreamType decoder_type,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t request_id) {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->DecoderDeinitializeDone(
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        associated_instance_.pp_instance(),
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        decoder_type,
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_id);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentDecryptor_Private::DecoderResetDone(
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_DecryptorStreamType decoder_type,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t request_id) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->DecoderResetDone(
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        associated_instance_.pp_instance(),
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        decoder_type,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_id);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentDecryptor_Private::DeliverFrame(
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp::Buffer_Dev decrypted_frame,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PP_DecryptedFrameInfo& decrypted_frame_info) {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->DeliverFrame(
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        associated_instance_.pp_instance(),
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        decrypted_frame.pp_resource(),
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &decrypted_frame_info);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentDecryptor_Private::DeliverSamples(
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp::Buffer_Dev audio_frames,
4771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const PP_DecryptedSampleInfo& decrypted_sample_info) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_ContentDecryptor_Private>()) {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_ContentDecryptor_Private>()->DeliverSamples(
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        associated_instance_.pp_instance(),
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        audio_frames.pp_resource(),
4821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        &decrypted_sample_info);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace pp
487