Home | History | Annotate | Download | only in proxy
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ppapi/proxy/ppp_video_decoder_proxy.h"
      6 
      7 #include "ppapi/proxy/host_dispatcher.h"
      8 #include "ppapi/proxy/plugin_globals.h"
      9 #include "ppapi/proxy/plugin_resource_tracker.h"
     10 #include "ppapi/proxy/ppapi_messages.h"
     11 #include "ppapi/proxy/ppb_video_decoder_proxy.h"
     12 #include "ppapi/thunk/enter.h"
     13 #include "ppapi/thunk/ppb_video_decoder_dev_api.h"
     14 #include "ppapi/thunk/thunk.h"
     15 
     16 namespace ppapi {
     17 namespace proxy {
     18 
     19 namespace {
     20 
     21 void ProvidePictureBuffers(PP_Instance instance, PP_Resource decoder,
     22                            uint32_t req_num_of_bufs,
     23                            const PP_Size* dimensions,
     24                            uint32_t texture_target) {
     25   HostResource decoder_resource;
     26   decoder_resource.SetHostResource(instance, decoder);
     27 
     28   HostDispatcher::GetForInstance(instance)->Send(
     29       new PpapiMsg_PPPVideoDecoder_ProvidePictureBuffers(
     30           API_ID_PPP_VIDEO_DECODER_DEV,
     31           decoder_resource, req_num_of_bufs, *dimensions, texture_target));
     32 }
     33 
     34 void DismissPictureBuffer(PP_Instance instance, PP_Resource decoder,
     35                           int32_t picture_buffer_id) {
     36   HostResource decoder_resource;
     37   decoder_resource.SetHostResource(instance, decoder);
     38 
     39   HostDispatcher::GetForInstance(instance)->Send(
     40       new PpapiMsg_PPPVideoDecoder_DismissPictureBuffer(
     41           API_ID_PPP_VIDEO_DECODER_DEV,
     42           decoder_resource, picture_buffer_id));
     43 }
     44 
     45 void PictureReady(PP_Instance instance, PP_Resource decoder,
     46                   const PP_Picture_Dev* picture) {
     47   HostResource decoder_resource;
     48   decoder_resource.SetHostResource(instance, decoder);
     49 
     50   HostDispatcher::GetForInstance(instance)->Send(
     51       new PpapiMsg_PPPVideoDecoder_PictureReady(
     52           API_ID_PPP_VIDEO_DECODER_DEV, decoder_resource, *picture));
     53 }
     54 
     55 void NotifyError(PP_Instance instance, PP_Resource decoder,
     56                  PP_VideoDecodeError_Dev error) {
     57   HostResource decoder_resource;
     58   decoder_resource.SetHostResource(instance, decoder);
     59 
     60   // It's possible that the error we're being notified about is happening
     61   // because the instance is shutting down. In this case, our instance may
     62   // already have been removed from the HostDispatcher map.
     63   HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
     64   if (dispatcher) {
     65     dispatcher->Send(
     66       new PpapiMsg_PPPVideoDecoder_NotifyError(
     67           API_ID_PPP_VIDEO_DECODER_DEV, decoder_resource, error));
     68   }
     69 }
     70 
     71 static const PPP_VideoDecoder_Dev video_decoder_interface = {
     72   &ProvidePictureBuffers,
     73   &DismissPictureBuffer,
     74   &PictureReady,
     75   &NotifyError
     76 };
     77 
     78 }  // namespace
     79 
     80 PPP_VideoDecoder_Proxy::PPP_VideoDecoder_Proxy(Dispatcher* dispatcher)
     81     : InterfaceProxy(dispatcher),
     82       ppp_video_decoder_impl_(NULL) {
     83   if (dispatcher->IsPlugin()) {
     84     ppp_video_decoder_impl_ = static_cast<const PPP_VideoDecoder_Dev*>(
     85         dispatcher->local_get_interface()(PPP_VIDEODECODER_DEV_INTERFACE));
     86   }
     87 }
     88 
     89 PPP_VideoDecoder_Proxy::~PPP_VideoDecoder_Proxy() {
     90 }
     91 
     92 // static
     93 const PPP_VideoDecoder_Dev* PPP_VideoDecoder_Proxy::GetProxyInterface() {
     94   return &video_decoder_interface;
     95 }
     96 
     97 bool PPP_VideoDecoder_Proxy::OnMessageReceived(const IPC::Message& msg) {
     98   if (!dispatcher()->IsPlugin())
     99     return false;
    100 
    101   bool handled = true;
    102   IPC_BEGIN_MESSAGE_MAP(PPP_VideoDecoder_Proxy, msg)
    103     IPC_MESSAGE_HANDLER(PpapiMsg_PPPVideoDecoder_ProvidePictureBuffers,
    104                         OnMsgProvidePictureBuffers)
    105     IPC_MESSAGE_HANDLER(PpapiMsg_PPPVideoDecoder_DismissPictureBuffer,
    106                         OnMsgDismissPictureBuffer)
    107     IPC_MESSAGE_HANDLER(PpapiMsg_PPPVideoDecoder_PictureReady,
    108                         OnMsgPictureReady)
    109     IPC_MESSAGE_HANDLER(PpapiMsg_PPPVideoDecoder_NotifyError,
    110                         OnMsgNotifyError)
    111     IPC_MESSAGE_UNHANDLED(handled = false)
    112   IPC_END_MESSAGE_MAP()
    113   DCHECK(handled);
    114   return handled;
    115 }
    116 
    117 void PPP_VideoDecoder_Proxy::OnMsgProvidePictureBuffers(
    118     const HostResource& decoder,
    119     uint32_t req_num_of_bufs,
    120     const PP_Size& dimensions,
    121     uint32_t texture_target) {
    122   PP_Resource plugin_decoder = PluginGlobals::Get()->plugin_resource_tracker()->
    123       PluginResourceForHostResource(decoder);
    124   if (!plugin_decoder)
    125     return;
    126   CallWhileUnlocked(ppp_video_decoder_impl_->ProvidePictureBuffers,
    127                     decoder.instance(),
    128                     plugin_decoder,
    129                     req_num_of_bufs,
    130                     &dimensions,
    131                     texture_target);
    132 }
    133 
    134 void PPP_VideoDecoder_Proxy::OnMsgDismissPictureBuffer(
    135     const HostResource& decoder, int32_t picture_id) {
    136   PP_Resource plugin_decoder = PluginGlobals::Get()->plugin_resource_tracker()->
    137       PluginResourceForHostResource(decoder);
    138   if (!plugin_decoder)
    139     return;
    140   CallWhileUnlocked(ppp_video_decoder_impl_->DismissPictureBuffer,
    141                     decoder.instance(),
    142                     plugin_decoder,
    143                     picture_id);
    144 }
    145 
    146 void PPP_VideoDecoder_Proxy::OnMsgPictureReady(
    147     const HostResource& decoder, const PP_Picture_Dev& picture) {
    148   PP_Resource plugin_decoder = PluginGlobals::Get()->plugin_resource_tracker()->
    149       PluginResourceForHostResource(decoder);
    150   if (!plugin_decoder)
    151     return;
    152   CallWhileUnlocked(ppp_video_decoder_impl_->PictureReady,
    153                     decoder.instance(),
    154                     plugin_decoder,
    155                     &picture);
    156 }
    157 
    158 void PPP_VideoDecoder_Proxy::OnMsgNotifyError(
    159     const HostResource& decoder, PP_VideoDecodeError_Dev error) {
    160   PP_Resource plugin_decoder = PluginGlobals::Get()->plugin_resource_tracker()->
    161       PluginResourceForHostResource(decoder);
    162   if (!plugin_decoder)
    163     return;
    164   CallWhileUnlocked(ppp_video_decoder_impl_->NotifyError,
    165                     decoder.instance(),
    166                     plugin_decoder,
    167                     error);
    168 }
    169 
    170 }  // namespace proxy
    171 }  // namespace ppapi
    172