| Index: content/renderer/pepper_platform_video_capture_impl.cc
|
| diff --git a/content/renderer/pepper_platform_video_capture_impl.cc b/content/renderer/pepper_platform_video_capture_impl.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fd71a1afdb25ce03c349ff71f5aedc88bdeebcd7
|
| --- /dev/null
|
| +++ b/content/renderer/pepper_platform_video_capture_impl.cc
|
| @@ -0,0 +1,175 @@
|
| +// 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 "content/renderer/pepper_platform_video_capture_impl.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/logging.h"
|
| +#include "base/message_loop_proxy.h"
|
| +#include "content/renderer/media/video_capture_impl_manager.h"
|
| +#include "content/renderer/pepper_plugin_delegate_impl.h"
|
| +#include "content/renderer/render_thread_impl.h"
|
| +#include "media/video/capture/video_capture_proxy.h"
|
| +
|
| +PepperPlatformVideoCaptureImpl::PepperPlatformVideoCaptureImpl(
|
| + const base::WeakPtr<PepperPluginDelegateImpl>& plugin_delegate,
|
| + const std::string& device_id,
|
| + webkit::ppapi::PluginDelegate::PlatformVideoCaptureEventHandler* handler)
|
| + : plugin_delegate_(plugin_delegate),
|
| + device_id_(device_id),
|
| + session_id_(0),
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(
|
| + handler_proxy_(new media::VideoCaptureHandlerProxy(
|
| + this, base::MessageLoopProxy::current()))),
|
| + handler_(handler),
|
| + video_capture_(NULL),
|
| + unbalanced_start_(false) {
|
| + if (device_id.empty()) {
|
| + // "1" is the session ID for the default device.
|
| + session_id_ = 1;
|
| + Initialize();
|
| + } else {
|
| + // We need to open the device and obtain the label and session ID before
|
| + // initializing.
|
| + if (plugin_delegate_) {
|
| + plugin_delegate_->OpenDevice(
|
| + PP_DEVICETYPE_DEV_VIDEOCAPTURE, device_id,
|
| + base::Bind(&PepperPlatformVideoCaptureImpl::OnDeviceOpened, this));
|
| + }
|
| + }
|
| +}
|
| +
|
| +PepperPlatformVideoCaptureImpl::~PepperPlatformVideoCaptureImpl() {
|
| + if (video_capture_) {
|
| + VideoCaptureImplManager* manager =
|
| + RenderThreadImpl::current()->video_capture_impl_manager();
|
| + manager->RemoveDevice(session_id_, handler_proxy_.get());
|
| + }
|
| +
|
| + if (plugin_delegate_ && !label_.empty())
|
| + plugin_delegate_->CloseDevice(label_);
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::StartCapture(
|
| + media::VideoCapture::EventHandler* handler,
|
| + const VideoCaptureCapability& capability) {
|
| + DCHECK(handler == handler_);
|
| +
|
| + if (unbalanced_start_)
|
| + return;
|
| +
|
| + if (video_capture_) {
|
| + unbalanced_start_ = true;
|
| + AddRef(); // Will be balanced in OnRemoved().
|
| + video_capture_->StartCapture(handler_proxy_.get(), capability);
|
| + }
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::StopCapture(
|
| + media::VideoCapture::EventHandler* handler) {
|
| + DCHECK(handler == handler_);
|
| + if (!unbalanced_start_)
|
| + return;
|
| +
|
| + if (video_capture_) {
|
| + unbalanced_start_ = false;
|
| + video_capture_->StopCapture(handler_proxy_.get());
|
| + }
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::FeedBuffer(
|
| + scoped_refptr<VideoFrameBuffer> buffer) {
|
| + if (video_capture_)
|
| + video_capture_->FeedBuffer(buffer);
|
| +}
|
| +
|
| +bool PepperPlatformVideoCaptureImpl::CaptureStarted() {
|
| + return handler_proxy_->state().started;
|
| +}
|
| +
|
| +int PepperPlatformVideoCaptureImpl::CaptureWidth() {
|
| + return handler_proxy_->state().width;
|
| +}
|
| +
|
| +int PepperPlatformVideoCaptureImpl::CaptureHeight() {
|
| + return handler_proxy_->state().height;
|
| +}
|
| +
|
| +int PepperPlatformVideoCaptureImpl::CaptureFrameRate() {
|
| + return handler_proxy_->state().frame_rate;
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::DetachEventHandler() {
|
| + handler_ = NULL;
|
| + StopCapture(NULL);
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::OnStarted(VideoCapture* capture) {
|
| + if (handler_)
|
| + handler_->OnStarted(capture);
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::OnStopped(VideoCapture* capture) {
|
| + if (handler_)
|
| + handler_->OnStopped(capture);
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::OnPaused(VideoCapture* capture) {
|
| + if (handler_)
|
| + handler_->OnPaused(capture);
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::OnError(
|
| + VideoCapture* capture,
|
| + int error_code) {
|
| + if (handler_)
|
| + handler_->OnError(capture, error_code);
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::OnRemoved(VideoCapture* capture) {
|
| + if (handler_)
|
| + handler_->OnRemoved(capture);
|
| +
|
| + Release(); // Balance the AddRef() in StartCapture().
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::OnBufferReady(
|
| + VideoCapture* capture,
|
| + scoped_refptr<VideoFrameBuffer> buffer) {
|
| + if (handler_) {
|
| + handler_->OnBufferReady(capture, buffer);
|
| + } else {
|
| + // Even after handler_ is detached, we have to return buffers that are in
|
| + // flight to us. Otherwise VideoCaptureController will not tear down.
|
| + FeedBuffer(buffer);
|
| + }
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::OnDeviceInfoReceived(
|
| + VideoCapture* capture,
|
| + const media::VideoCaptureParams& device_info) {
|
| + if (handler_)
|
| + handler_->OnDeviceInfoReceived(capture, device_info);
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::Initialize() {
|
| + VideoCaptureImplManager* manager =
|
| + RenderThreadImpl::current()->video_capture_impl_manager();
|
| + video_capture_ = manager->AddDevice(session_id_, handler_proxy_.get());
|
| +}
|
| +
|
| +void PepperPlatformVideoCaptureImpl::OnDeviceOpened(int request_id,
|
| + bool succeeded,
|
| + const std::string& label) {
|
| + succeeded = succeeded && plugin_delegate_;
|
| + if (succeeded) {
|
| + label_ = label;
|
| + session_id_ = plugin_delegate_->GetSessionID(PP_DEVICETYPE_DEV_VIDEOCAPTURE,
|
| + label);
|
| + Initialize();
|
| + }
|
| +
|
| + if (handler_)
|
| + handler_->OnInitialized(this, succeeded);
|
| +}
|
|
|