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

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

Issue 242013002: Refactor video capturing code in the render process (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comments and merged Created 6 years, 8 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/media/media_stream_video_capturer_source.cc
diff --git a/content/renderer/media/media_stream_video_capturer_source.cc b/content/renderer/media/media_stream_video_capturer_source.cc
index b6bc73a2ddaa20f4dfe3f280fbf99970fa72aac2..3cfe75e4350e1d81de0114d75ad67ed513e49c3a 100644
--- a/content/renderer/media/media_stream_video_capturer_source.cc
+++ b/content/renderer/media/media_stream_video_capturer_source.cc
@@ -5,9 +5,11 @@
#include "content/renderer/media/media_stream_video_capturer_source.h"
#include "base/bind.h"
+#include "base/callback_helpers.h"
#include "base/location.h"
#include "content/renderer/media/video_capture_impl_manager.h"
#include "content/renderer/render_thread_impl.h"
+#include "media/base/bind_to_current_loop.h"
#include "media/base/video_frame.h"
namespace {
@@ -38,24 +40,27 @@ VideoCapturerDelegate::VideoCapturerDelegate(
device_info.device.type == MEDIA_DESKTOP_VIDEO_CAPTURE),
got_first_frame_(false) {
DVLOG(3) << "VideoCapturerDelegate::ctor";
- // RenderThreadImpl::current() may be NULL in testing.
+
+ // NULL in unit test.
if (RenderThreadImpl::current()) {
- capture_engine_ = RenderThreadImpl::current()->video_capture_impl_manager()
- ->UseDevice(device_info.session_id);
- DCHECK(capture_engine_);
+ VideoCaptureImplManager* manager =
+ RenderThreadImpl::current()->video_capture_impl_manager();
+ if (manager)
Ami GONE FROM CHROMIUM 2014/04/24 23:05:18 If that is possible then can StopCapture() fail to
Alpha Left Google 2014/04/24 23:33:53 In the destructor of VCIM if there are clients it
+ release_device_cb_ = manager->UseDevice(session_id_);
}
- message_loop_proxy_ = base::MessageLoopProxy::current();
}
VideoCapturerDelegate::~VideoCapturerDelegate() {
DVLOG(3) << "VideoCapturerDelegate::dtor";
DCHECK(new_frame_callback_.is_null());
+ if (!release_device_cb_.is_null())
+ release_device_cb_.Run();
}
void VideoCapturerDelegate::GetCurrentSupportedFormats(
int max_requested_width,
int max_requested_height,
- const SupportedFormatsCallback& callback) {
+ const VideoCaptureDeviceFormatsCB& callback) {
DVLOG(3) << "GetCurrentSupportedFormats("
<< " { max_requested_height = " << max_requested_height << "})"
<< " { max_requested_width = " << max_requested_width << "})";
@@ -75,85 +80,65 @@ void VideoCapturerDelegate::GetCurrentSupportedFormats(
return;
}
+ // NULL in unit test.
+ if (!RenderThreadImpl::current())
+ return;
+ VideoCaptureImplManager* manager =
+ RenderThreadImpl::current()->video_capture_impl_manager();
+ if (!manager)
+ return;
DCHECK(source_formats_callback_.is_null());
source_formats_callback_ = callback;
- capture_engine_->GetDeviceFormatsInUse(base::Bind(
- &VideoCapturerDelegate::OnDeviceFormatsInUseReceived, this));
+ manager->GetDeviceFormatsInUse(
+ session_id_,
+ media::BindToCurrentLoop(
+ base::Bind(
+ &VideoCapturerDelegate::OnDeviceFormatsInUseReceived, this)));
}
-void VideoCapturerDelegate::StartDeliver(
+void VideoCapturerDelegate::StartCapture(
const media::VideoCaptureParams& params,
- const NewFrameCallback& new_frame_callback,
+ const VideoCaptureDeliverFrameCB& new_frame_callback,
const StartedCallback& started_callback) {
DCHECK(params.requested_format.IsValid());
- DCHECK(message_loop_proxy_->BelongsToCurrentThread());
+ DCHECK(thread_checker_.CalledOnValidThread());
new_frame_callback_ = new_frame_callback;
started_callback_ = started_callback;
got_first_frame_ = false;
- // Increase the reference count to ensure the object is not deleted until
- // it is unregistered in VideoCapturerDelegate::OnRemoved.
- AddRef();
- capture_engine_->StartCapture(this, params);
+ // NULL in unit test.
+ if (!RenderThreadImpl::current())
+ return;
+ VideoCaptureImplManager* manager =
+ RenderThreadImpl::current()->video_capture_impl_manager();
+ if (!manager)
+ return;
+ stop_capture_cb_ =
+ manager->StartCapture(
+ session_id_,
+ params,
+ media::BindToCurrentLoop(base::Bind(
+ &VideoCapturerDelegate::OnStateUpdateOnRenderThread, this)),
+ media::BindToCurrentLoop(base::Bind(
+ &VideoCapturerDelegate::OnFrameReadyOnRenderThread, this)));
}
-void VideoCapturerDelegate::StopDeliver() {
+void VideoCapturerDelegate::StopCapture() {
// Immediately make sure we don't provide more frames.
- DVLOG(3) << "VideoCapturerDelegate::StopDeliver()";
- DCHECK(message_loop_proxy_->BelongsToCurrentThread());
- capture_engine_->StopCapture(this);
+ DVLOG(3) << "VideoCapturerDelegate::StopCapture()";
+ DCHECK(thread_checker_.CalledOnValidThread());
+ if (!stop_capture_cb_.is_null()) {
+ base::ResetAndReturn(&stop_capture_cb_).Run();
+ }
new_frame_callback_.Reset();
started_callback_.Reset();
source_formats_callback_.Reset();
}
-void VideoCapturerDelegate::OnStarted(media::VideoCapture* capture) {
- DVLOG(3) << "VideoCapturerDelegate::OnStarted";
- DCHECK(!message_loop_proxy_->BelongsToCurrentThread());
-}
-
-void VideoCapturerDelegate::OnStopped(media::VideoCapture* capture) {
- DCHECK(!message_loop_proxy_->BelongsToCurrentThread());
-}
-
-void VideoCapturerDelegate::OnPaused(media::VideoCapture* capture) {
- DCHECK(!message_loop_proxy_->BelongsToCurrentThread());
-}
-
-void VideoCapturerDelegate::OnError(media::VideoCapture* capture,
- int error_code) {
- DVLOG(3) << "VideoCapturerDelegate::OnError";
- DCHECK(!message_loop_proxy_->BelongsToCurrentThread());
- message_loop_proxy_->PostTask(
- FROM_HERE,
- base::Bind(&VideoCapturerDelegate::OnErrorOnRenderThread, this, capture));
-}
-
-void VideoCapturerDelegate::OnRemoved(media::VideoCapture* capture) {
- DVLOG(3) << " MediaStreamVideoCapturerSource::OnRemoved";
- DCHECK(!message_loop_proxy_->BelongsToCurrentThread());
-
- // Balance the AddRef in StartDeliver.
- // This means we are no longer registered as an event handler and can safely
- // be deleted.
- Release();
-}
-
-void VideoCapturerDelegate::OnFrameReady(
- media::VideoCapture* capture,
- const scoped_refptr<media::VideoFrame>& frame) {
- DCHECK(!message_loop_proxy_->BelongsToCurrentThread());
- message_loop_proxy_->PostTask(
- FROM_HERE,
- base::Bind(&VideoCapturerDelegate::OnFrameReadyOnRenderThread,
- this,
- capture,
- frame));
-}
-
void VideoCapturerDelegate::OnFrameReadyOnRenderThread(
- media::VideoCapture* capture,
- const scoped_refptr<media::VideoFrame>& frame) {
+ const scoped_refptr<media::VideoFrame>& frame,
+ const media::VideoCaptureFormat& format,
+ const base::TimeTicks& timestamp) {
if (!got_first_frame_) {
got_first_frame_ = true;
if (!started_callback_.is_null())
@@ -161,41 +146,54 @@ void VideoCapturerDelegate::OnFrameReadyOnRenderThread(
}
if (!new_frame_callback_.is_null()) {
- new_frame_callback_.Run(frame);
+ new_frame_callback_.Run(frame, format, timestamp);
}
}
-void VideoCapturerDelegate::OnErrorOnRenderThread(
- media::VideoCapture* capture) {
- if (!started_callback_.is_null())
+void VideoCapturerDelegate::OnStateUpdateOnRenderThread(
+ VideoCaptureState state) {
+ if (state == VIDEO_CAPTURE_STATE_ERROR && !started_callback_.is_null()) {
started_callback_.Run(false);
+ }
}
void VideoCapturerDelegate::OnDeviceFormatsInUseReceived(
const media::VideoCaptureFormats& formats_in_use) {
DVLOG(3) << "OnDeviceFormatsInUseReceived: " << formats_in_use.size();
- DCHECK(message_loop_proxy_ == base::MessageLoopProxy::current());
- // StopDeliver() might have destroyed |source_formats_callback_| before
+ DCHECK(thread_checker_.CalledOnValidThread());
+ // StopCapture() might have destroyed |source_formats_callback_| before
// arriving here.
if (source_formats_callback_.is_null())
return;
+ // If there are no formats in use, try to retrieve the whole list of
+ // supported form.
if (!formats_in_use.empty()) {
source_formats_callback_.Run(formats_in_use);
source_formats_callback_.Reset();
- } else {
- // If there are no formats in use, try to retrieve the whole list of
- // supported formats.
- capture_engine_->GetDeviceSupportedFormats(base::Bind(
- &VideoCapturerDelegate::OnDeviceSupportedFormatsEnumerated, this));
+ return;
}
+
+ // NULL in unit test.
+ if (!RenderThreadImpl::current())
+ return;
+ VideoCaptureImplManager* manager =
+ RenderThreadImpl::current()->video_capture_impl_manager();
+ if (!manager)
+ return;
+ manager->GetDeviceSupportedFormats(
+ session_id_,
+ media::BindToCurrentLoop(
+ base::Bind(
+ &VideoCapturerDelegate::OnDeviceSupportedFormatsEnumerated,
+ this)));
}
void VideoCapturerDelegate::OnDeviceSupportedFormatsEnumerated(
const media::VideoCaptureFormats& formats) {
DVLOG(3) << "OnDeviceSupportedFormatsEnumerated: " << formats.size()
<< " received";
- DCHECK(message_loop_proxy_ == base::MessageLoopProxy::current());
- // StopDeliver() might have destroyed |source_formats_callback_| before
+ DCHECK(thread_checker_.CalledOnValidThread());
+ // StopCapture() might have destroyed |source_formats_callback_| before
// arriving here.
if (source_formats_callback_.is_null())
return;
@@ -246,7 +244,7 @@ void MediaStreamVideoCapturerSource::StartSourceImpl(
device_info().device.type == MEDIA_DESKTOP_VIDEO_CAPTURE) {
new_params.allow_resolution_change = true;
}
- delegate_->StartDeliver(
+ delegate_->StartCapture(
new_params,
base::Bind(&MediaStreamVideoCapturerSource::DeliverVideoFrame,
base::Unretained(this)),
@@ -255,7 +253,7 @@ void MediaStreamVideoCapturerSource::StartSourceImpl(
}
void MediaStreamVideoCapturerSource::StopSourceImpl() {
- delegate_->StopDeliver();
+ delegate_->StopCapture();
}
} // namespace content
« no previous file with comments | « content/renderer/media/media_stream_video_capturer_source.h ('k') | content/renderer/media/media_stream_video_source.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698