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#ifndef PPAPI_SHARED_IMPL_PPB_VIDEO_DECODER_SHARED_H_
6#define PPAPI_SHARED_IMPL_PPB_VIDEO_DECODER_SHARED_H_
7
8#include <map>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/compiler_specific.h"
13#include "ppapi/c/dev/ppb_video_decoder_dev.h"
14#include "ppapi/shared_impl/resource.h"
15#include "ppapi/shared_impl/tracked_callback.h"
16#include "ppapi/thunk/ppb_video_decoder_dev_api.h"
17
18namespace gpu {
19namespace gles2 {
20class GLES2Implementation;
21}  // namespace gles2
22}  // namespace gpu
23
24namespace ppapi {
25
26// Implements the logic to set and run callbacks for various video decoder
27// events. Both the proxy and the renderer implementation share this code.
28class PPAPI_SHARED_EXPORT PPB_VideoDecoder_Shared
29    : public Resource,
30      NON_EXPORTED_BASE(public thunk::PPB_VideoDecoder_Dev_API) {
31 public:
32  explicit PPB_VideoDecoder_Shared(PP_Instance instance);
33  explicit PPB_VideoDecoder_Shared(const HostResource& host_resource);
34  virtual ~PPB_VideoDecoder_Shared();
35
36  // Resource overrides.
37  virtual thunk::PPB_VideoDecoder_Dev_API* AsPPB_VideoDecoder_Dev_API()
38      OVERRIDE;
39
40  // PPB_VideoDecoder_Dev_API implementation.
41  virtual void Destroy() OVERRIDE;
42
43 protected:
44  bool SetFlushCallback(scoped_refptr<TrackedCallback> callback);
45  bool SetResetCallback(scoped_refptr<TrackedCallback> callback);
46  bool SetBitstreamBufferCallback(int32 bitstream_buffer_id,
47                                  scoped_refptr<TrackedCallback> callback);
48
49  void RunFlushCallback(int32 result);
50  void RunResetCallback(int32 result);
51  void RunBitstreamBufferCallback(int32 bitstream_buffer_id, int32 result);
52
53  // Tell command buffer to process all commands it has received so far.
54  void FlushCommandBuffer();
55
56  // Initialize the underlying decoder.
57  void InitCommon(PP_Resource graphics_context,
58                  gpu::gles2::GLES2Implementation* gles2_impl);
59
60 private:
61  // Key: bitstream_buffer_id, value: callback to run when bitstream decode is
62  // done.
63  typedef std::map<int32, scoped_refptr<TrackedCallback> > CallbackById;
64
65  scoped_refptr<TrackedCallback> flush_callback_;
66  scoped_refptr<TrackedCallback> reset_callback_;
67  CallbackById bitstream_buffer_callbacks_;
68
69  // The resource ID of the underlying Graphics3D object being used.  Used only
70  // for reference counting to keep it alive for the lifetime of |*this|.
71  PP_Resource graphics_context_;
72
73  // Reference to the GLES2Implementation owned by |graphics_context_|.
74  // Graphics3D is guaranteed to be alive for the lifetime of this class.
75  // In the out-of-process case, Graphics3D's gles2_impl() exists in the plugin
76  // process only, so gles2_impl_ is NULL in that case.
77  gpu::gles2::GLES2Implementation* gles2_impl_;
78
79  DISALLOW_COPY_AND_ASSIGN(PPB_VideoDecoder_Shared);
80};
81
82}  // namespace ppapi
83
84#endif  // PPAPI_SHARED_IMPL_PPB_VIDEO_DECODER_SHARED_H_
85