| 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);
|
| -}
|
|
|