| Index: webkit/plugins/ppapi/ppb_video_decoder_impl.cc
|
| ===================================================================
|
| --- webkit/plugins/ppapi/ppb_video_decoder_impl.cc (revision 213561)
|
| +++ webkit/plugins/ppapi/ppb_video_decoder_impl.cc (working copy)
|
| @@ -1,303 +0,0 @@
|
| -// 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 "webkit/plugins/ppapi/ppb_video_decoder_impl.h"
|
| -
|
| -#include <string>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/metrics/histogram.h"
|
| -#include "gpu/command_buffer/client/gles2_implementation.h"
|
| -#include "media/video/picture.h"
|
| -#include "media/video/video_decode_accelerator.h"
|
| -#include "ppapi/c/dev/pp_video_dev.h"
|
| -#include "ppapi/c/dev/ppb_video_decoder_dev.h"
|
| -#include "ppapi/c/dev/ppp_video_decoder_dev.h"
|
| -#include "ppapi/c/pp_completion_callback.h"
|
| -#include "ppapi/c/pp_errors.h"
|
| -#include "ppapi/shared_impl/resource_tracker.h"
|
| -#include "ppapi/thunk/enter.h"
|
| -#include "webkit/plugins/ppapi/common.h"
|
| -#include "webkit/plugins/ppapi/plugin_module.h"
|
| -#include "webkit/plugins/ppapi/ppb_buffer_impl.h"
|
| -#include "webkit/plugins/ppapi/ppb_graphics_3d_impl.h"
|
| -#include "webkit/plugins/ppapi/resource_helper.h"
|
| -
|
| -using ppapi::TrackedCallback;
|
| -using ppapi::thunk::EnterResourceNoLock;
|
| -using ppapi::thunk::PPB_Buffer_API;
|
| -using ppapi::thunk::PPB_Graphics3D_API;
|
| -using ppapi::thunk::PPB_VideoDecoder_API;
|
| -
|
| -namespace {
|
| -
|
| -// Convert PP_VideoDecoder_Profile to media::VideoCodecProfile.
|
| -media::VideoCodecProfile PPToMediaProfile(
|
| - const PP_VideoDecoder_Profile pp_profile) {
|
| - switch (pp_profile) {
|
| - case PP_VIDEODECODER_H264PROFILE_NONE:
|
| - // HACK: PPAPI contains a bogus "none" h264 profile that doesn't
|
| - // correspond to anything in h.264; but a number of released chromium
|
| - // versions silently promoted this to Baseline profile, so we retain that
|
| - // behavior here. Fall through.
|
| - case PP_VIDEODECODER_H264PROFILE_BASELINE:
|
| - return media::H264PROFILE_BASELINE;
|
| - case PP_VIDEODECODER_H264PROFILE_MAIN:
|
| - return media::H264PROFILE_MAIN;
|
| - case PP_VIDEODECODER_H264PROFILE_EXTENDED:
|
| - return media::H264PROFILE_EXTENDED;
|
| - case PP_VIDEODECODER_H264PROFILE_HIGH:
|
| - return media::H264PROFILE_HIGH;
|
| - case PP_VIDEODECODER_H264PROFILE_HIGH10PROFILE:
|
| - return media::H264PROFILE_HIGH10PROFILE;
|
| - case PP_VIDEODECODER_H264PROFILE_HIGH422PROFILE:
|
| - return media::H264PROFILE_HIGH422PROFILE;
|
| - case PP_VIDEODECODER_H264PROFILE_HIGH444PREDICTIVEPROFILE:
|
| - return media::H264PROFILE_HIGH444PREDICTIVEPROFILE;
|
| - case PP_VIDEODECODER_H264PROFILE_SCALABLEBASELINE:
|
| - return media::H264PROFILE_SCALABLEBASELINE;
|
| - case PP_VIDEODECODER_H264PROFILE_SCALABLEHIGH:
|
| - return media::H264PROFILE_SCALABLEHIGH;
|
| - case PP_VIDEODECODER_H264PROFILE_STEREOHIGH:
|
| - return media::H264PROFILE_STEREOHIGH;
|
| - case PP_VIDEODECODER_H264PROFILE_MULTIVIEWHIGH:
|
| - return media::H264PROFILE_MULTIVIEWHIGH;
|
| - case PP_VIDEODECODER_VP8PROFILE_MAIN:
|
| - return media::VP8PROFILE_MAIN;
|
| - default:
|
| - return media::VIDEO_CODEC_PROFILE_UNKNOWN;
|
| - }
|
| -}
|
| -
|
| -PP_VideoDecodeError_Dev MediaToPPError(
|
| - media::VideoDecodeAccelerator::Error error) {
|
| - switch (error) {
|
| - case media::VideoDecodeAccelerator::ILLEGAL_STATE :
|
| - return PP_VIDEODECODERERROR_ILLEGAL_STATE;
|
| - case media::VideoDecodeAccelerator::INVALID_ARGUMENT :
|
| - return PP_VIDEODECODERERROR_INVALID_ARGUMENT;
|
| - case media::VideoDecodeAccelerator::UNREADABLE_INPUT :
|
| - return PP_VIDEODECODERERROR_UNREADABLE_INPUT;
|
| - case media::VideoDecodeAccelerator::PLATFORM_FAILURE :
|
| - return PP_VIDEODECODERERROR_PLATFORM_FAILURE;
|
| - default:
|
| - NOTREACHED();
|
| - return PP_VIDEODECODERERROR_ILLEGAL_STATE;
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace webkit {
|
| -namespace ppapi {
|
| -
|
| -PPB_VideoDecoder_Impl::PPB_VideoDecoder_Impl(PP_Instance instance)
|
| - : PPB_VideoDecoder_Shared(instance),
|
| - ppp_videodecoder_(NULL) {
|
| - PluginModule* plugin_module = ResourceHelper::GetPluginModule(this);
|
| - if (plugin_module) {
|
| - ppp_videodecoder_ = static_cast<const PPP_VideoDecoder_Dev*>(
|
| - plugin_module->GetPluginInterface(PPP_VIDEODECODER_DEV_INTERFACE));
|
| - }
|
| -}
|
| -
|
| -PPB_VideoDecoder_Impl::~PPB_VideoDecoder_Impl() {
|
| - Destroy();
|
| -}
|
| -
|
| -// static
|
| -PP_Resource PPB_VideoDecoder_Impl::Create(
|
| - PP_Instance instance,
|
| - PP_Resource graphics_context,
|
| - PP_VideoDecoder_Profile profile) {
|
| - EnterResourceNoLock<PPB_Graphics3D_API> enter_context(graphics_context, true);
|
| - if (enter_context.failed())
|
| - return 0;
|
| - PPB_Graphics3D_Impl* graphics3d_impl =
|
| - static_cast<PPB_Graphics3D_Impl*>(enter_context.object());
|
| -
|
| - scoped_refptr<PPB_VideoDecoder_Impl> decoder(
|
| - new PPB_VideoDecoder_Impl(instance));
|
| - if (decoder->Init(graphics_context, graphics3d_impl->platform_context(),
|
| - graphics3d_impl->gles2_impl(), profile))
|
| - return decoder->GetReference();
|
| - return 0;
|
| -}
|
| -
|
| -bool PPB_VideoDecoder_Impl::Init(
|
| - PP_Resource graphics_context,
|
| - PluginDelegate::PlatformContext3D* context,
|
| - gpu::gles2::GLES2Implementation* gles2_impl,
|
| - PP_VideoDecoder_Profile profile) {
|
| - InitCommon(graphics_context, gles2_impl);
|
| -
|
| - int command_buffer_route_id = context->GetCommandBufferRouteId();
|
| - if (command_buffer_route_id == 0)
|
| - return false;
|
| -
|
| - PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this);
|
| - if (!plugin_delegate)
|
| - return false;
|
| -
|
| - platform_video_decoder_.reset(plugin_delegate->CreateVideoDecoder(
|
| - this, command_buffer_route_id));
|
| - if (!platform_video_decoder_)
|
| - return false;
|
| -
|
| - FlushCommandBuffer();
|
| - return platform_video_decoder_->Initialize(PPToMediaProfile(profile));
|
| -}
|
| -
|
| -int32_t PPB_VideoDecoder_Impl::Decode(
|
| - const PP_VideoBitstreamBuffer_Dev* bitstream_buffer,
|
| - scoped_refptr<TrackedCallback> callback) {
|
| - if (!platform_video_decoder_)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - EnterResourceNoLock<PPB_Buffer_API> enter(bitstream_buffer->data, true);
|
| - if (enter.failed())
|
| - return PP_ERROR_FAILED;
|
| -
|
| - PPB_Buffer_Impl* buffer = static_cast<PPB_Buffer_Impl*>(enter.object());
|
| - DCHECK_GE(bitstream_buffer->id, 0);
|
| - media::BitstreamBuffer decode_buffer(
|
| - bitstream_buffer->id,
|
| - buffer->shared_memory()->handle(),
|
| - bitstream_buffer->size);
|
| - if (!SetBitstreamBufferCallback(bitstream_buffer->id, callback))
|
| - return PP_ERROR_BADARGUMENT;
|
| -
|
| - FlushCommandBuffer();
|
| - platform_video_decoder_->Decode(decode_buffer);
|
| - return PP_OK_COMPLETIONPENDING;
|
| -}
|
| -
|
| -void PPB_VideoDecoder_Impl::AssignPictureBuffers(
|
| - uint32_t no_of_buffers,
|
| - const PP_PictureBuffer_Dev* buffers) {
|
| - if (!platform_video_decoder_)
|
| - return;
|
| - UMA_HISTOGRAM_COUNTS_100("Media.PepperVideoDecoderPictureCount",
|
| - no_of_buffers);
|
| -
|
| - std::vector<media::PictureBuffer> wrapped_buffers;
|
| - for (uint32 i = 0; i < no_of_buffers; i++) {
|
| - PP_PictureBuffer_Dev in_buf = buffers[i];
|
| - DCHECK_GE(in_buf.id, 0);
|
| - media::PictureBuffer buffer(
|
| - in_buf.id,
|
| - gfx::Size(in_buf.size.width, in_buf.size.height),
|
| - in_buf.texture_id);
|
| - wrapped_buffers.push_back(buffer);
|
| - UMA_HISTOGRAM_COUNTS_10000("Media.PepperVideoDecoderPictureHeight",
|
| - in_buf.size.height);
|
| - }
|
| -
|
| - FlushCommandBuffer();
|
| - platform_video_decoder_->AssignPictureBuffers(wrapped_buffers);
|
| -}
|
| -
|
| -void PPB_VideoDecoder_Impl::ReusePictureBuffer(int32_t picture_buffer_id) {
|
| - if (!platform_video_decoder_)
|
| - return;
|
| -
|
| - FlushCommandBuffer();
|
| - platform_video_decoder_->ReusePictureBuffer(picture_buffer_id);
|
| -}
|
| -
|
| -int32_t PPB_VideoDecoder_Impl::Flush(scoped_refptr<TrackedCallback> callback) {
|
| - if (!platform_video_decoder_)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - if (!SetFlushCallback(callback))
|
| - return PP_ERROR_INPROGRESS;
|
| -
|
| - FlushCommandBuffer();
|
| - platform_video_decoder_->Flush();
|
| - return PP_OK_COMPLETIONPENDING;
|
| -}
|
| -
|
| -int32_t PPB_VideoDecoder_Impl::Reset(scoped_refptr<TrackedCallback> callback) {
|
| - if (!platform_video_decoder_)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - if (!SetResetCallback(callback))
|
| - return PP_ERROR_INPROGRESS;
|
| -
|
| - FlushCommandBuffer();
|
| - platform_video_decoder_->Reset();
|
| - return PP_OK_COMPLETIONPENDING;
|
| -}
|
| -
|
| -void PPB_VideoDecoder_Impl::Destroy() {
|
| - FlushCommandBuffer();
|
| -
|
| - if (platform_video_decoder_)
|
| - platform_video_decoder_.release()->Destroy();
|
| - ppp_videodecoder_ = NULL;
|
| -
|
| - ::ppapi::PPB_VideoDecoder_Shared::Destroy();
|
| -}
|
| -
|
| -void PPB_VideoDecoder_Impl::ProvidePictureBuffers(
|
| - uint32 requested_num_of_buffers,
|
| - const gfx::Size& dimensions,
|
| - uint32 texture_target) {
|
| - if (!ppp_videodecoder_)
|
| - return;
|
| -
|
| - PP_Size out_dim = PP_MakeSize(dimensions.width(), dimensions.height());
|
| - ppp_videodecoder_->ProvidePictureBuffers(pp_instance(), pp_resource(),
|
| - requested_num_of_buffers, &out_dim, texture_target);
|
| -}
|
| -
|
| -void PPB_VideoDecoder_Impl::PictureReady(const media::Picture& picture) {
|
| - if (!ppp_videodecoder_)
|
| - return;
|
| -
|
| - PP_Picture_Dev output;
|
| - output.picture_buffer_id = picture.picture_buffer_id();
|
| - output.bitstream_buffer_id = picture.bitstream_buffer_id();
|
| - ppp_videodecoder_->PictureReady(pp_instance(), pp_resource(), &output);
|
| -}
|
| -
|
| -void PPB_VideoDecoder_Impl::DismissPictureBuffer(int32 picture_buffer_id) {
|
| - if (!ppp_videodecoder_)
|
| - return;
|
| - ppp_videodecoder_->DismissPictureBuffer(pp_instance(), pp_resource(),
|
| - picture_buffer_id);
|
| -}
|
| -
|
| -void PPB_VideoDecoder_Impl::NotifyError(
|
| - media::VideoDecodeAccelerator::Error error) {
|
| - if (!ppp_videodecoder_)
|
| - return;
|
| -
|
| - PP_VideoDecodeError_Dev pp_error = MediaToPPError(error);
|
| - ppp_videodecoder_->NotifyError(pp_instance(), pp_resource(), pp_error);
|
| - UMA_HISTOGRAM_ENUMERATION(
|
| - "Media.PepperVideoDecoderError", error,
|
| - media::VideoDecodeAccelerator::LARGEST_ERROR_ENUM);
|
| -}
|
| -
|
| -void PPB_VideoDecoder_Impl::NotifyResetDone() {
|
| - RunResetCallback(PP_OK);
|
| -}
|
| -
|
| -void PPB_VideoDecoder_Impl::NotifyEndOfBitstreamBuffer(
|
| - int32 bitstream_buffer_id) {
|
| - RunBitstreamBufferCallback(bitstream_buffer_id, PP_OK);
|
| -}
|
| -
|
| -void PPB_VideoDecoder_Impl::NotifyFlushDone() {
|
| - RunFlushCallback(PP_OK);
|
| -}
|
| -
|
| -void PPB_VideoDecoder_Impl::NotifyInitializeDone() {
|
| - NOTREACHED() << "PlatformVideoDecoder::Initialize() is synchronous!";
|
| -}
|
| -
|
| -} // namespace ppapi
|
| -} // namespace webkit
|
|
|