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