// 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.

#include "ppapi/cpp/dev/video_decoder_client_dev.h"

#include "ppapi/c/dev/ppp_video_decoder_dev.h"
#include "ppapi/cpp/dev/video_decoder_dev.h"
#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/instance_handle.h"
#include "ppapi/cpp/module.h"
#include "ppapi/cpp/module_impl.h"

namespace pp {

namespace {

const char kPPPVideoDecoderInterface[] = PPP_VIDEODECODER_DEV_INTERFACE;

// Callback to provide buffers for the decoded output pictures.
void ProvidePictureBuffers(PP_Instance instance,
                           PP_Resource decoder,
                           uint32_t req_num_of_bufs,
                           const PP_Size* dimensions,
                           uint32_t texture_target) {
  void* object = Instance::GetPerInstanceObject(instance,
                                                kPPPVideoDecoderInterface);
  if (!object)
    return;
  static_cast<VideoDecoderClient_Dev*>(object)->ProvidePictureBuffers(
      decoder, req_num_of_bufs, *dimensions, texture_target);
}

void DismissPictureBuffer(PP_Instance instance,
                          PP_Resource decoder,
                          int32_t picture_buffer_id) {
  void* object = Instance::GetPerInstanceObject(instance,
                                                kPPPVideoDecoderInterface);
  if (!object)
    return;
  static_cast<VideoDecoderClient_Dev*>(object)->DismissPictureBuffer(
      decoder, picture_buffer_id);
}

void PictureReady(PP_Instance instance,
                  PP_Resource decoder,
                  const PP_Picture_Dev* picture) {
  void* object = Instance::GetPerInstanceObject(instance,
                                                kPPPVideoDecoderInterface);
  if (!object)
    return;
  static_cast<VideoDecoderClient_Dev*>(object)->PictureReady(decoder, *picture);
}

void NotifyError(PP_Instance instance,
                 PP_Resource decoder,
                 PP_VideoDecodeError_Dev error) {
  void* object = Instance::GetPerInstanceObject(instance,
                                                kPPPVideoDecoderInterface);
  if (!object)
    return;
  static_cast<VideoDecoderClient_Dev*>(object)->NotifyError(decoder, error);
}

static PPP_VideoDecoder_Dev videodecoder_interface = {
  &ProvidePictureBuffers,
  &DismissPictureBuffer,
  &PictureReady,
  &NotifyError,
};

}  // namespace

VideoDecoderClient_Dev::VideoDecoderClient_Dev(Instance* instance)
    : associated_instance_(instance) {
  Module::Get()->AddPluginInterface(kPPPVideoDecoderInterface,
                                    &videodecoder_interface);
  instance->AddPerInstanceObject(kPPPVideoDecoderInterface, this);
}

VideoDecoderClient_Dev::~VideoDecoderClient_Dev() {
  Instance::RemovePerInstanceObject(associated_instance_,
                                    kPPPVideoDecoderInterface, this);
}

}  // namespace pp
