// 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_CPP_DEV_VIDEO_DECODER_CLIENT_DEV_H_
#define PPAPI_CPP_DEV_VIDEO_DECODER_CLIENT_DEV_H_

#include "ppapi/c/pp_stdint.h"
#include "ppapi/c/dev/pp_video_dev.h"
#include "ppapi/cpp/instance_handle.h"

namespace pp {

class Instance;
class VideoDecoder_Dev;

// This class provides a C++ interface for callbacks related to video decoding.
// It is the C++ counterpart to PPP_VideoDecoder_Dev.
// You would normally use multiple inheritance to derive from this class in your
// instance.
class VideoDecoderClient_Dev {
 public:
  VideoDecoderClient_Dev(Instance* instance);
  virtual ~VideoDecoderClient_Dev();

  // Callback to provide buffers for the decoded output pictures.
  virtual void ProvidePictureBuffers(PP_Resource decoder,
                                     uint32_t req_num_of_bufs,
                                     const PP_Size& dimensions,
                                     uint32_t texture_target) = 0;

  // Callback for decoder to deliver unneeded picture buffers back to the
  // plugin.
  virtual void DismissPictureBuffer(PP_Resource decoder,
                                    int32_t picture_buffer_id) = 0;

  // Callback to deliver decoded pictures ready to be displayed.
  virtual void PictureReady(PP_Resource decoder,
                            const PP_Picture_Dev& picture) = 0;

  // Callback to notify about decoding errors.
  virtual void NotifyError(PP_Resource decoder,
                           PP_VideoDecodeError_Dev error) = 0;

 private:
  InstanceHandle associated_instance_;
};

}  // namespace pp

#endif  // PPAPI_CPP_DEV_VIDEO_DECODER_CLIENT_DEV_H_
