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

Unified Diff: content/renderer/media/local_video_capture.cc

Issue 10918052: create a separate WebMediaPlayer for URL derived from media stream (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: code review Created 8 years, 3 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
« no previous file with comments | « content/renderer/media/local_video_capture.h ('k') | content/renderer/media/media_stream_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/media/local_video_capture.cc
===================================================================
--- content/renderer/media/local_video_capture.cc (revision 0)
+++ content/renderer/media/local_video_capture.cc (revision 0)
@@ -0,0 +1,153 @@
+// 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/media/local_video_capture.h"
+
+#include "content/renderer/media/video_capture_impl_manager.h"
+#include "media/base/video_util.h"
+#include "media/video/capture/video_capture_proxy.h"
+
+using media::CopyYPlane;
+using media::CopyUPlane;
+using media::CopyVPlane;
+
+namespace content {
+
+LocalVideoCapture::LocalVideoCapture(
+ media::VideoCaptureSessionId video_stream_id,
+ VideoCaptureImplManager* vc_manager,
+ const media::VideoCaptureCapability& capability,
+ const base::Closure& error_cb,
+ const RepaintCB& repaint_cb)
+ : video_stream_id_(video_stream_id),
+ vc_manager_(vc_manager),
+ capability_(capability),
+ error_cb_(error_cb),
+ repaint_cb_(repaint_cb),
+ capture_engine_(NULL),
+ message_loop_proxy_(base::MessageLoopProxy::current()),
+ ALLOW_THIS_IN_INITIALIZER_LIST(
+ handler_proxy_(new media::VideoCaptureHandlerProxy(
+ this, message_loop_proxy_))),
+ state_(video_capture::kStopped) {
+ DVLOG(3) << "LocalVideoCapture::ctor";
+ DCHECK(vc_manager);
+}
+
+LocalVideoCapture::~LocalVideoCapture() {
+ DVLOG(3) << "LocalVideoCapture::dtor";
+}
+
+void LocalVideoCapture::Start() {
+ DVLOG(3) << "LocalVideoCapture::Start";
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+ DCHECK_EQ(state_, video_capture::kStopped);
+
+ capture_engine_ = vc_manager_->AddDevice(video_stream_id_, this);
+ state_ = video_capture::kStarted;
+ AddRef(); // Will be balanced in OnRemoved().
+ capture_engine_->StartCapture(handler_proxy_.get(), capability_);
+}
+
+void LocalVideoCapture::Stop() {
+ DVLOG(3) << "LocalVideoCapture::Stop";
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+ if (capture_engine_) {
+ state_ = video_capture::kStopping;
+ capture_engine_->StopCapture(handler_proxy_.get());
+ capture_engine_ = NULL;
+ }
+}
+
+void LocalVideoCapture::Play() {
+ DVLOG(3) << "LocalVideoCapture::Play";
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+ if (capture_engine_ && state_ == video_capture::kPaused) {
+ state_ = video_capture::kStarted;
+ }
+}
+
+void LocalVideoCapture::Pause() {
+ DVLOG(3) << "LocalVideoCapture::Pause";
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+ if (capture_engine_ && state_ == video_capture::kStarted) {
+ state_ = video_capture::kPaused;
+ }
+}
+
+void LocalVideoCapture::OnStarted(media::VideoCapture* capture) {
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+ NOTIMPLEMENTED();
+}
+
+void LocalVideoCapture::OnStopped(media::VideoCapture* capture) {
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+ NOTIMPLEMENTED();
+}
+
+void LocalVideoCapture::OnPaused(media::VideoCapture* capture) {
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+ NOTIMPLEMENTED();
+}
+
+void LocalVideoCapture::OnError(media::VideoCapture* capture,
+ int error_code) {
+ DVLOG(3) << "LocalVideoCapture::OnError, " << error_code;
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+ error_cb_.Run();
+}
+
+void LocalVideoCapture::OnRemoved(media::VideoCapture* capture) {
+ DVLOG(3) << "LocalVideoCapture::OnRemoved";
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+ vc_manager_->RemoveDevice(video_stream_id_, this);
+ Release(); // Balance the AddRef() in StartCapture().
+}
+
+void LocalVideoCapture::OnDeviceInfoReceived(
+ media::VideoCapture* capture,
+ const media::VideoCaptureParams& device_info) {
+ DVLOG(3) << "LocalVideoCapture::OnDeviceInfoReceived";
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+}
+
+void LocalVideoCapture::OnBufferReady(
+ media::VideoCapture* capture,
+ scoped_refptr<media::VideoCapture::VideoFrameBuffer> buf) {
+ DVLOG(3) << "LocalVideoCapture::OnBufferReady, state:" << state_;
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+ DCHECK(buf);
+
+ if (state_ != video_capture::kStarted) {
+ capture->FeedBuffer(buf);
+ return;
+ }
+
+ gfx::Size natural_size(buf->width, buf->height);
+ scoped_refptr<media::VideoFrame> current_frame =
+ media::VideoFrame::CreateFrame(media::VideoFrame::YV12,
+ natural_size, natural_size,
+ buf->timestamp - base::Time());
+ uint8* buffer = buf->memory_pointer;
+
+ // Assume YV12 format.
+ DCHECK_EQ(capability_.color, media::VideoCaptureCapability::kI420);
+ if (capability_.color != media::VideoCaptureCapability::kI420)
+ return;
+
+ int y_width = buf->width;
+ int y_height = buf->height;
+ int uv_width = buf->width / 2;
+ int uv_height = buf->height / 2;
+ CopyYPlane(buffer, y_width, y_height, current_frame);
+ buffer += y_width * y_height;
+ CopyUPlane(buffer, uv_width, uv_height, current_frame);
+ buffer += uv_width * uv_height;
+ CopyVPlane(buffer, uv_width, uv_height, current_frame);
+
+ capture->FeedBuffer(buf);
+ repaint_cb_.Run(current_frame);
+}
+
+} // namespace content
Property changes on: content/renderer/media/local_video_capture.cc
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « content/renderer/media/local_video_capture.h ('k') | content/renderer/media/media_stream_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698