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

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: 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 6359c4595dcafd2d4868abde5a8897af159858e0..1309e033ddc28a5ac230c93d412185b3ae8852c9 100644
--- a/content/renderer/media/media_stream_video_capturer_source.cc
+++ b/content/renderer/media/media_stream_video_capturer_source.cc
@@ -8,6 +8,7 @@
#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,18 +39,21 @@ 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.
+ message_loop_proxy_ = base::MessageLoopProxy::current();
+
+ // 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();
+ 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(
@@ -77,8 +81,13 @@ void VideoCapturerDelegate::GetCurrentSupportedFormats(
DCHECK(source_formats_callback_.is_null());
source_formats_callback_ = callback;
- capture_engine_->GetDeviceFormatsInUse(base::Bind(
- &VideoCapturerDelegate::OnDeviceFormatsInUseReceived, this));
+ VideoCaptureImplManager* manager =
+ RenderThreadImpl::current()->video_capture_impl_manager();
Ami GONE FROM CHROMIUM 2014/04/21 23:42:53 don't need to worry about RTI::current() being NUL
Alpha Left Google 2014/04/23 18:48:33 Done.
+ manager->GetDeviceFormatsInUse(
+ session_id_,
+ media::BindToCurrentLoop(
+ base::Bind(
+ &VideoCapturerDelegate::OnDeviceFormatsInUseReceived, this)));
}
void VideoCapturerDelegate::StartDeliver(
@@ -91,69 +100,35 @@ void VideoCapturerDelegate::StartDeliver(
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);
+ VideoCaptureImplManager* manager =
+ RenderThreadImpl::current()->video_capture_impl_manager();
+ 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() {
// Immediately make sure we don't provide more frames.
DVLOG(3) << "VideoCapturerDelegate::StopDeliver()";
DCHECK(message_loop_proxy_->BelongsToCurrentThread());
- capture_engine_->StopCapture(this);
+ if (!stop_capture_cb_.is_null()) {
+ stop_capture_cb_.Run();
+ stop_capture_cb_.Reset();
Ami GONE FROM CHROMIUM 2014/04/21 23:42:53 base::ResetAndReturn(&stop_capture_cb_); makes it
Alpha Left Google 2014/04/23 18:48:33 Done.
+ }
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())
@@ -165,10 +140,11 @@ void VideoCapturerDelegate::OnFrameReadyOnRenderThread(
}
}
-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()) {
Ami GONE FROM CHROMIUM 2014/04/21 23:42:53 what happens if error is delivered before StartCap
Alpha Left Google 2014/04/23 18:48:33 Because stopping of VCIM is not synchronous and we
started_callback_.Run(false);
+ }
}
void VideoCapturerDelegate::OnDeviceFormatsInUseReceived(
@@ -182,12 +158,19 @@ void VideoCapturerDelegate::OnDeviceFormatsInUseReceived(
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;
}
+
+ // If there are no formats in use, try to retrieve the whole list of
+ // supported formats.
+ VideoCaptureImplManager* manager =
+ RenderThreadImpl::current()->video_capture_impl_manager();
+ manager->GetDeviceSupportedFormats(
+ session_id_,
+ media::BindToCurrentLoop(
+ base::Bind(
+ &VideoCapturerDelegate::OnDeviceSupportedFormatsEnumerated,
+ this)));
}
void VideoCapturerDelegate::OnDeviceSupportedFormatsEnumerated(

Powered by Google App Engine
This is Rietveld 408576698