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

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

Issue 7071002: Revert "Add VideoCaptureImpl and VideoCaptureImplManager" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 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/video_capture_impl.h ('k') | content/renderer/media/video_capture_impl_manager.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/media/video_capture_impl.cc
diff --git a/content/renderer/media/video_capture_impl.cc b/content/renderer/media/video_capture_impl.cc
deleted file mode 100644
index faf4565bfcb605ff38604bf36d245d6bd691b900..0000000000000000000000000000000000000000
--- a/content/renderer/media/video_capture_impl.cc
+++ /dev/null
@@ -1,386 +0,0 @@
-// Copyright (c) 2011 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/video_capture_impl.h"
-
-#include "content/common/child_process.h"
-#include "content/common/video_capture_messages.h"
-
-VideoCaptureImpl::DIBBuffer::DIBBuffer(
- TransportDIB* d, media::VideoCapture::VideoFrameBuffer* ptr)
- : dib(d),
- mapped_memory(ptr) {}
-
-VideoCaptureImpl::DIBBuffer::~DIBBuffer() {
- delete dib;
-}
-
-bool VideoCaptureImpl::CaptureStarted() {
- return state_ == kStarted;
-}
-
-int VideoCaptureImpl::CaptureWidth() {
- return width_;
-}
-
-int VideoCaptureImpl::CaptureHeight() {
- return height_;
-}
-
-int VideoCaptureImpl::CaptureFrameRate() {
- return frame_rate_;
-}
-
-VideoCaptureImpl::VideoCaptureImpl(
- const media::VideoCaptureSessionId id,
- scoped_refptr<base::MessageLoopProxy> ml_proxy,
- VideoCaptureMessageFilter* filter)
- : VideoCapture(),
- message_filter_(filter),
- session_id_(id),
- ml_proxy_(ml_proxy),
- device_id_(0),
- width_(0),
- height_(0),
- frame_rate_(0),
- video_type_(media::VideoFrame::I420),
- new_width_(0),
- new_height_(0),
- state_(kStopped) {
- DCHECK(filter);
-}
-
-VideoCaptureImpl::~VideoCaptureImpl() {}
-
-void VideoCaptureImpl::Init() {
- base::MessageLoopProxy* io_message_loop_proxy =
- ChildProcess::current()->io_message_loop_proxy();
-
- if (!io_message_loop_proxy->BelongsToCurrentThread()) {
- io_message_loop_proxy->PostTask(FROM_HERE,
- NewRunnableMethod(this, &VideoCaptureImpl::AddDelegateOnIOThread));
- return;
- }
-
- AddDelegateOnIOThread();
-}
-
-void VideoCaptureImpl::DeInit(Task* task) {
- if (state_ == kStarted)
- message_filter_->Send(new VideoCaptureHostMsg_Stop(0, device_id_));
-
- base::MessageLoopProxy* io_message_loop_proxy =
- ChildProcess::current()->io_message_loop_proxy();
-
- if (!io_message_loop_proxy->BelongsToCurrentThread()) {
- io_message_loop_proxy->PostTask(FROM_HERE,
- NewRunnableMethod(this, &VideoCaptureImpl::RemoveDelegateOnIOThread,
- task));
- return;
- }
-
- RemoveDelegateOnIOThread(task);
-}
-
-void VideoCaptureImpl::StartCapture(
- media::VideoCapture::EventHandler* handler,
- const VideoCaptureCapability& capability) {
- DCHECK_EQ(capability.raw_type, media::VideoFrame::I420);
-
- if (!ml_proxy_->BelongsToCurrentThread()) {
- ml_proxy_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &VideoCaptureImpl::StartCapture, handler,
- capability));
- return;
- }
-
- ClientInfo::iterator it = pending_clients_.find(handler);
-
- if (it != pending_clients_.end()) {
- handler->OnError(this, 1);
- return;
- }
-
- if (!device_id_) {
- pending_clients_[handler] = capability;
- return;
- }
-
- if (capability.resolution_fixed && master_clients_.size() &&
- (capability.width != width_ || capability.height != height_)) {
- // Can't have 2 master clients with different resolutions.
- handler->OnError(this, 1);
- return;
- }
-
- clients_[handler] = capability;
- if (capability.resolution_fixed) {
- master_clients_.push_back(handler);
- if (master_clients_.size() > 1)
- return;
- }
-
- if (state_ == kStarted) {
- // Take the resolution of master client.
- if (capability.resolution_fixed &&
- (capability.width != width_ || capability.height != height_)) {
- new_width_ = capability.width;
- new_height_ = capability.height;
- DLOG(INFO) << "StartCapture: Got master client with new resolution "
- "during started, try to restart.";
- StopDevice();
- }
- handler->OnStarted(this);
- return;
- }
-
- if (state_ == kStopping) {
- if (capability.resolution_fixed || !pending_start()) {
- new_width_ = capability.width;
- new_height_ = capability.height;
- DLOG(INFO) << "StartCapture: Got new resolution, already in stopping.";
- }
- handler->OnStarted(this);
- return;
- }
-
- DCHECK_EQ(clients_.size(), 1ul);
- video_type_ = capability.raw_type;
- new_width_ = 0;
- new_height_ = 0;
- width_ = capability.width;
- height_ = capability.height;
-
- StartCaptureInternal();
-}
-
-void VideoCaptureImpl::StopCapture(media::VideoCapture::EventHandler* handler) {
- if (!ml_proxy_->BelongsToCurrentThread()) {
- ml_proxy_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &VideoCaptureImpl::StopCapture, handler));
- return;
- }
-
- ClientInfo::iterator it = pending_clients_.find(handler);
- if (it != pending_clients_.end()) {
- handler->OnStopped(this);
- pending_clients_.erase(it);
- return;
- }
-
- if (clients_.find(handler) == clients_.end())
- return;
-
- handler->OnStopped(this);
- clients_.erase(handler);
- master_clients_.remove(handler);
-
- // Still have at least one master client.
- if (master_clients_.size() > 0)
- return;
-
- // TODO(wjia): Is it really needed to handle resolution change for non-master
- // clients, except no client case?
- if (clients_.size() > 0) {
- DLOG(INFO) << "StopCapture: No master client.";
- int maxw = 0;
- int maxh = 0;
- for (ClientInfo::iterator it = clients_.begin();
- it != clients_.end(); it++) {
- if (it->second.width > maxw && it->second.height > maxh) {
- maxw = it->second.width;
- maxh = it->second.height;
- }
- }
-
- if (state_ == kStarted) {
- // Only handle resolution reduction.
- if (maxw < width_ && maxh < height_) {
- new_width_ = maxw;
- new_height_ = maxh;
- DLOG(INFO) << "StopCapture: New smaller resolution, stopping ...";
- StopDevice();
- }
- return;
- }
-
- if (state_ == kStopping) {
- new_width_ = maxw;
- new_height_ = maxh;
- DLOG(INFO) << "StopCapture: New resolution, during stopping.";
- return;
- }
- } else {
- new_width_ = width_ = 0;
- new_height_ = height_ = 0;
- DLOG(INFO) << "StopCapture: No more client, stopping ...";
- StopDevice();
- }
-}
-
-void VideoCaptureImpl::OnBufferReceived(TransportDIB::Handle handle,
- base::Time timestamp) {
- if (!ml_proxy_->BelongsToCurrentThread()) {
- ml_proxy_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &VideoCaptureImpl::OnBufferReceived,
- handle, timestamp));
- return;
- }
-
- if (state_ != kStarted) {
- message_filter_->Send(
- new VideoCaptureHostMsg_BufferReady(0, device_id_, handle));
- return;
- }
-
- media::VideoCapture::VideoFrameBuffer* buffer;
- CachedDIB::iterator it;
- for (it = cached_dibs_.begin(); it != cached_dibs_.end(); it++) {
- if ((*it)->dib->handle() == handle)
- break;
- }
- if (it == cached_dibs_.end()) {
- TransportDIB* dib = TransportDIB::Map(handle);
- buffer = new VideoFrameBuffer();
- buffer->memory_pointer = dib->memory();
- buffer->buffer_size = dib->size();
- buffer->width = width_;
- buffer->height = height_;
-
- DIBBuffer* dib_buffer = new DIBBuffer(dib, buffer);
- cached_dibs_.push_back(dib_buffer);
- } else {
- buffer = (*it)->mapped_memory;
- }
-
- // TODO(wjia): handle buffer sharing with downstream modules.
- for (ClientInfo::iterator it = clients_.begin(); it != clients_.end(); it++) {
- it->first->OnBufferReady(this, buffer);
- }
-
- message_filter_->Send(
- new VideoCaptureHostMsg_BufferReady(0, device_id_, handle));
-}
-
-void VideoCaptureImpl::OnStateChanged(
- const media::VideoCapture::State& state) {
- if (!ml_proxy_->BelongsToCurrentThread()) {
- ml_proxy_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &VideoCaptureImpl::OnStateChanged, state));
- return;
- }
-
- switch (state) {
- case media::VideoCapture::kStarted:
- for (ClientInfo::iterator it = clients_.begin();
- it != clients_.end(); it++) {
- it->first->OnStarted(this);
- }
- break;
- case media::VideoCapture::kStopped:
- state_ = kStopped;
- DLOG(INFO) << "OnStateChanged: stopped!, device_id = " << device_id_;
- if (pending_start())
- RestartCapture();
- break;
- case media::VideoCapture::kPaused:
- for (ClientInfo::iterator it = clients_.begin();
- it != clients_.end(); it++) {
- it->first->OnPaused(this);
- }
- break;
- case media::VideoCapture::kError:
- for (ClientInfo::iterator it = clients_.begin();
- it != clients_.end(); it++) {
- // TODO(wjia): browser process would send error code.
- it->first->OnError(this, 1);
- }
- break;
- default:
- break;
- }
-}
-
-void VideoCaptureImpl::OnDeviceInfoReceived(
- const media::VideoCaptureParams& device_info) {
- if (!ml_proxy_->BelongsToCurrentThread()) {
- ml_proxy_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &VideoCaptureImpl::OnDeviceInfoReceived,
- device_info));
- return;
- }
-
- for (ClientInfo::iterator it = clients_.begin(); it != clients_.end(); it++) {
- it->first->OnDeviceInfoReceived(this, device_info);
- }
-}
-
-void VideoCaptureImpl::OnDelegateAdded(int32 device_id) {
- if (!ml_proxy_->BelongsToCurrentThread()) {
- ml_proxy_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &VideoCaptureImpl::OnDelegateAdded, device_id));
- return;
- }
-
- device_id_ = device_id;
- for (ClientInfo::iterator it = pending_clients_.begin();
- it != pending_clients_.end(); ) {
- media::VideoCapture::EventHandler* handler = it->first;
- const VideoCaptureCapability capability = it->second;
- pending_clients_.erase(it++);
- StartCapture(handler, capability);
- }
-}
-
-void VideoCaptureImpl::StopDevice() {
- if (!ml_proxy_->BelongsToCurrentThread()) {
- ml_proxy_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &VideoCaptureImpl::StopDevice));
- return;
- }
-
- if (state_ == kStarted) {
- state_ = kStopping;
- message_filter_->Send(new VideoCaptureHostMsg_Stop(0, device_id_));
- width_ = height_ = 0;
- }
-}
-
-void VideoCaptureImpl::RestartCapture() {
- DCHECK(ml_proxy_->BelongsToCurrentThread());
- DCHECK_EQ(state_, kStopped);
-
- width_ = new_width_;
- height_ = new_height_;
- new_width_ = 0;
- new_height_ = 0;
-
- DLOG(INFO) << "RestartCapture, " << width_ << ", " << height_;
- StartCaptureInternal();
-}
-
-void VideoCaptureImpl::StartCaptureInternal() {
- DCHECK(ml_proxy_->BelongsToCurrentThread());
- DCHECK(device_id_);
-
- media::VideoCaptureParams params;
- params.width = width_;
- params.height = height_;
- params.session_id = session_id_;
-
- message_filter_->Send(new VideoCaptureHostMsg_Start(0, device_id_, params));
- state_ = kStarted;
- for (ClientInfo::iterator it = clients_.begin(); it != clients_.end(); it++) {
- it->first->OnStarted(this);
- }
-}
-
-void VideoCaptureImpl::AddDelegateOnIOThread() {
- message_filter_->AddDelegate(this);
-}
-
-void VideoCaptureImpl::RemoveDelegateOnIOThread(Task* task) {
- message_filter_->RemoveDelegate(this);
- media::AutoTaskRunner auto_runner(task);
-}
« no previous file with comments | « content/renderer/media/video_capture_impl.h ('k') | content/renderer/media/video_capture_impl_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698