Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Unified Diff: content/renderer/pepper_platform_video_capture_impl.cc

Issue 9234064: Implement device enumeration for PPB_VideoCapture_Dev. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+}
« no previous file with comments | « content/renderer/pepper_platform_video_capture_impl.h ('k') | content/renderer/pepper_plugin_delegate_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698