// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PPAPI_SHARED_IMPL_PPB_VIDEO_DECODER_SHARED_H_
#define PPAPI_SHARED_IMPL_PPB_VIDEO_DECODER_SHARED_H_

#include <stdint.h>

#include <map>
#include <vector>

#include "base/compiler_specific.h"
#include "base/macros.h"
#include "ppapi/c/dev/ppb_video_decoder_dev.h"
#include "ppapi/shared_impl/resource.h"
#include "ppapi/shared_impl/tracked_callback.h"
#include "ppapi/thunk/ppb_video_decoder_dev_api.h"

namespace gpu {
namespace gles2 {
class GLES2Implementation;
}  // namespace gles2
}  // namespace gpu

namespace ppapi {

// Implements the logic to set and run callbacks for various video decoder
// events. Both the proxy and the renderer implementation share this code.
class PPAPI_SHARED_EXPORT PPB_VideoDecoder_Shared
    : public Resource,
      public thunk::PPB_VideoDecoder_Dev_API {
 public:
  explicit PPB_VideoDecoder_Shared(PP_Instance instance);
  explicit PPB_VideoDecoder_Shared(const HostResource& host_resource);
  ~PPB_VideoDecoder_Shared() override;

  // Resource overrides.
  thunk::PPB_VideoDecoder_Dev_API* AsPPB_VideoDecoder_Dev_API() override;

  // PPB_VideoDecoder_Dev_API implementation.
  void Destroy() override;

 protected:
  bool SetFlushCallback(scoped_refptr<TrackedCallback> callback);
  bool SetResetCallback(scoped_refptr<TrackedCallback> callback);
  bool SetBitstreamBufferCallback(int32_t bitstream_buffer_id,
                                  scoped_refptr<TrackedCallback> callback);

  void RunFlushCallback(int32_t result);
  void RunResetCallback(int32_t result);
  void RunBitstreamBufferCallback(int32_t bitstream_buffer_id, int32_t result);

  // Tell command buffer to process all commands it has received so far.
  void FlushCommandBuffer();

  // Initialize the underlying decoder.
  void InitCommon(PP_Resource graphics_context,
                  gpu::gles2::GLES2Implementation* gles2_impl);

 private:
  // Key: bitstream_buffer_id, value: callback to run when bitstream decode is
  // done.
  typedef std::map<int32_t, scoped_refptr<TrackedCallback>> CallbackById;

  scoped_refptr<TrackedCallback> flush_callback_;
  scoped_refptr<TrackedCallback> reset_callback_;
  CallbackById bitstream_buffer_callbacks_;

  // The resource ID of the underlying Graphics3D object being used.  Used only
  // for reference counting to keep it alive for the lifetime of |*this|.
  PP_Resource graphics_context_;

  // Reference to the GLES2Implementation owned by |graphics_context_|.
  // Graphics3D is guaranteed to be alive for the lifetime of this class.
  // In the out-of-process case, Graphics3D's gles2_impl() exists in the plugin
  // process only, so gles2_impl_ is NULL in that case.
  gpu::gles2::GLES2Implementation* gles2_impl_;

  DISALLOW_COPY_AND_ASSIGN(PPB_VideoDecoder_Shared);
};

}  // namespace ppapi

#endif  // PPAPI_SHARED_IMPL_PPB_VIDEO_DECODER_SHARED_H_
