146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright (c) 2014 The Chromium Authors. All rights reserved. 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file. 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifndef PPAPI_PROXY_VIDEO_DECODER_RESOURCE_H_ 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define PPAPI_PROXY_VIDEO_DECODER_RESOURCE_H_ 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <queue> 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/containers/hash_tables.h" 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/ref_counted.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/scoped_vector.h" 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/proxy/connection.h" 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/proxy/plugin_resource.h" 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/proxy/ppapi_proxy_export.h" 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/shared_impl/resource.h" 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_resource.h" 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/thunk/ppb_video_decoder_api.h" 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace gpu { 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct Mailbox; 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace gles2 { 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class GLES2Implementation; 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace ppapi { 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class PPB_Graphics3D_Shared; 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class TrackedCallback; 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace proxy { 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class PPAPI_PROXY_EXPORT VideoDecoderResource 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : public PluginResource, 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public thunk::PPB_VideoDecoder_API { 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) VideoDecoderResource(Connection connection, PP_Instance instance); 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~VideoDecoderResource(); 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Resource overrides. 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual thunk::PPB_VideoDecoder_API* AsPPB_VideoDecoder_API() OVERRIDE; 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // PPB_VideoDecoder_API implementation. 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual int32_t Initialize0_1( 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_Resource graphics_context, 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_VideoProfile profile, 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_Bool allow_software_fallback, 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<TrackedCallback> callback) OVERRIDE; 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual int32_t Initialize(PP_Resource graphics_context, 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PP_VideoProfile profile, 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_HardwareAcceleration acceleration, 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) OVERRIDE; 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual int32_t Decode(uint32_t decode_id, 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) uint32_t size, 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const void* buffer, 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) OVERRIDE; 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual int32_t GetPicture(PP_VideoPicture* picture, 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) OVERRIDE; 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void RecyclePicture(const PP_VideoPicture* picture) OVERRIDE; 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual int32_t Flush(scoped_refptr<TrackedCallback> callback) OVERRIDE; 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual int32_t Reset(scoped_refptr<TrackedCallback> callback) OVERRIDE; 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // PluginResource implementation. 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void OnReplyReceived(const ResourceMessageReplyParams& params, 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const IPC::Message& msg) OVERRIDE; 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Called only by unit tests. This bypasses Graphics3D setup, which doesn't 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // work in ppapi::proxy::PluginProxyTest. 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SetForTest(); 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Struct to hold a shared memory buffer. 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) struct ShmBuffer { 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ShmBuffer(scoped_ptr<base::SharedMemory> shm, 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) uint32_t size, 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) uint32_t shm_id); 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ~ShmBuffer(); 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const scoped_ptr<base::SharedMemory> shm; 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void* addr; 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Index into shm_buffers_ vector, used as an id. This should map 1:1 to 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // the index on the host side of the proxy. 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const uint32_t shm_id; 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Struct to hold texture information. 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) struct Texture { 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Texture(uint32_t texture_target, const PP_Size& size); 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ~Texture(); 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const uint32_t texture_target; 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const PP_Size size; 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Struct to hold a picture received from the decoder. 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) struct Picture { 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Picture(int32_t decode_id, uint32_t texture_id); 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ~Picture(); 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int32_t decode_id; 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) uint32_t texture_id; 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int32_t InitializeInternal(PP_Resource graphics_context, 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PP_VideoProfile profile, 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PP_Bool allow_software_fallback, 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<TrackedCallback> callback, 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool testing); 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Unsolicited reply message handlers. 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnPluginMsgRequestTextures(const ResourceMessageReplyParams& params, 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) uint32_t num_textures, 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const PP_Size& size, 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t texture_target, 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::vector<gpu::Mailbox>& mailboxes); 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnPluginMsgPictureReady(const ResourceMessageReplyParams& params, 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int32_t decode_id, 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) uint32_t texture_id); 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnPluginMsgDismissPicture(const ResourceMessageReplyParams& params, 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) uint32_t texture_id); 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnPluginMsgNotifyError(const ResourceMessageReplyParams& params, 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int32_t error); 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Reply message handlers for operations that are done in the host. 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnPluginMsgInitializeComplete(const ResourceMessageReplyParams& params); 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnPluginMsgDecodeComplete(const ResourceMessageReplyParams& params, 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) uint32_t shm_id); 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnPluginMsgFlushComplete(const ResourceMessageReplyParams& params); 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnPluginMsgResetComplete(const ResourceMessageReplyParams& params); 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void RunCallbackWithError(scoped_refptr<TrackedCallback>* callback); 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void DeleteGLTexture(uint32_t texture_id); 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void WriteNextPicture(PP_VideoPicture* picture); 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // ScopedVector to own the shared memory buffers. 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ScopedVector<ShmBuffer> shm_buffers_; 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // List of available shared memory buffers. 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef std::vector<ShmBuffer*> ShmBufferList; 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ShmBufferList available_shm_buffers_; 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Map of GL texture id to texture info. 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef base::hash_map<uint32_t, Texture> TextureMap; 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TextureMap textures_; 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Queue of received pictures. 14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef std::queue<Picture> PictureQueue; 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PictureQueue received_pictures_; 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Pending callbacks. 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<TrackedCallback> initialize_callback_; 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<TrackedCallback> decode_callback_; 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<TrackedCallback> get_picture_callback_; 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<TrackedCallback> flush_callback_; 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<TrackedCallback> reset_callback_; 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Number of Decode calls made, mod 2^31, to serve as a uid for each decode. 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int32_t num_decodes_; 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The maximum delay (in Decode calls) before we receive a picture. If we 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // haven't received a picture from a Decode call after this many successive 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // calls to Decode, then we will never receive a picture from the call. 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Note that this isn't guaranteed by H264 or other codecs. In practice, this 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // number is less than 16. Make it much larger just to be safe. 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // NOTE: because we count decodes mod 2^31, this value must be a power of 2. 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static const int kMaximumPictureDelay = 128; 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) uint32_t decode_ids_[kMaximumPictureDelay]; 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // State for pending get_picture_callback_. 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PP_VideoPicture* get_picture_; 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ScopedPPResource graphics3d_; 17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gpu::gles2::GLES2Implementation* gles2_impl_; 17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool initialized_; 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool testing_; 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int32_t decoder_last_error_; 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VideoDecoderResource); 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace proxy 18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace ppapi 18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif // PPAPI_PROXY_VIDEO_DECODER_RESOURCE_H_ 187