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