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

Unified Diff: content/renderer/media/webrtc/webrtc_video_track_adapter.cc

Issue 282523003: Deliver video frames on libjingle worker thread to WebRtcVideoCapturerAdapter. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed Tommis comments. Created 6 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
Index: content/renderer/media/webrtc/webrtc_video_track_adapter.cc
diff --git a/content/renderer/media/webrtc/webrtc_video_track_adapter.cc b/content/renderer/media/webrtc/webrtc_video_track_adapter.cc
index 211013dc9e57f11af45ccda9270e6987478ca19f..413b0b54e2a3fec7d3673960cd6a2f493edf2c95 100644
--- a/content/renderer/media/webrtc/webrtc_video_track_adapter.cc
+++ b/content/renderer/media/webrtc/webrtc_video_track_adapter.cc
@@ -18,17 +18,25 @@ bool ConstraintKeyExists(const blink::WebMediaConstraints& constraints,
constraints.getOptionalConstraintValue(name, value_str);
}
+// Used to make sure |source| is released on the main render thread.
+void ReleaseWebRtcSourceOnMainRenderThread(
+ webrtc::VideoSourceInterface* source) {
+ source->Release();
+}
+
} // anonymouse namespace
namespace content {
// Simple help class used for receiving video frames on the IO-thread from
// a MediaStreamVideoTrack and forward the frames to a
-// WebRtcVideoCapturerAdapter that implements a video capturer for libjingle.
+// WebRtcVideoCapturerAdapter on libjingle's worker thread.
+// WebRtcVideoCapturerAdapter implements a video capturer for libjingle.
class WebRtcVideoTrackAdapter::WebRtcVideoSourceAdapter
: public base::RefCountedThreadSafe<WebRtcVideoSourceAdapter> {
public:
WebRtcVideoSourceAdapter(
+ const scoped_refptr<base::MessageLoopProxy>& libjingle_worker_thread,
const scoped_refptr<webrtc::VideoSourceInterface>& source,
WebRtcVideoCapturerAdapter* capture_adapter);
@@ -36,31 +44,66 @@ class WebRtcVideoTrackAdapter::WebRtcVideoSourceAdapter
const media::VideoCaptureFormat& format);
private:
+ void OnVideoFrameOnWorkerThread(const scoped_refptr<media::VideoFrame>& frame,
+ const media::VideoCaptureFormat& format);
friend class base::RefCountedThreadSafe<WebRtcVideoSourceAdapter>;
virtual ~WebRtcVideoSourceAdapter();
+ scoped_refptr<base::MessageLoopProxy> render_thread_message_loop_;
+
// Used to DCHECK that frames are called on the IO-thread.
base::ThreadChecker io_thread_checker_;
+
+ // Used for posting frames to libjingle's worker thread. Accessed on the
+ // IO-thread.
+ scoped_refptr<base::MessageLoopProxy> libjingle_worker_thread_;
Ronghua Wu (Left Chromium) 2014/05/12 16:09:12 call this target_thread_? and call io_thread_check
Ami GONE FROM CHROMIUM 2014/05/12 18:13:33 FWIW I weakly prefer io/worker/signaling/rendering
perkj_chrome 2014/05/12 19:28:26 I would prefer to leave as it is.
+
scoped_refptr<webrtc::VideoSourceInterface> video_source_;
// |capture_adapter_| is owned by |video_source_|
WebRtcVideoCapturerAdapter* capture_adapter_;
};
WebRtcVideoTrackAdapter::WebRtcVideoSourceAdapter::WebRtcVideoSourceAdapter(
+ const scoped_refptr<base::MessageLoopProxy>& libjingle_worker_thread,
const scoped_refptr<webrtc::VideoSourceInterface>& source,
WebRtcVideoCapturerAdapter* capture_adapter)
- : video_source_(source),
+ : render_thread_message_loop_(base::MessageLoopProxy::current()),
+ libjingle_worker_thread_(libjingle_worker_thread),
+ video_source_(source),
capture_adapter_(capture_adapter) {
io_thread_checker_.DetachFromThread();
}
WebRtcVideoTrackAdapter::WebRtcVideoSourceAdapter::~WebRtcVideoSourceAdapter() {
+ // Since frames are posted to the worker thread, this object might be deleted
+ // on that thread. However, since |video_source_| was created on the render
+ // thread, it should be released on the render thread.
+ if (!render_thread_message_loop_->BelongsToCurrentThread()) {
+ webrtc::VideoSourceInterface* source = video_source_.get();
+ source->AddRef();
+ video_source_ = NULL;
+ render_thread_message_loop_->PostTask(
wuchengli 2014/05/12 15:45:56 You can just use render_thread_message_loop_->Rele
perkj_chrome 2014/05/12 16:07:09 Nice to know. But this is not a Chrome class so th
wuchengli 2014/05/12 16:36:50 I see.
+ FROM_HERE,
+ base::Bind(&ReleaseWebRtcSourceOnMainRenderThread,
Ami GONE FROM CHROMIUM 2014/05/12 18:13:33 FWIW, base::Bind(&talk_base::RefCountedInterface:
perkj_chrome 2014/05/12 19:28:26 Good idea, but talk_base::RefCountInterface::Relea
Ami GONE FROM CHROMIUM 2014/05/12 19:46:27 It sounds like you're saying that base::Bind() can
perkj_chrome 2014/05/12 20:35:11 Humm, Can it be that Release returns an int in lib
Ami GONE FROM CHROMIUM 2014/05/12 21:24:38 Yeah; that'd do it.
+ base::Unretained(source)));
+ }
}
void WebRtcVideoTrackAdapter::WebRtcVideoSourceAdapter::OnVideoFrameOnIO(
const scoped_refptr<media::VideoFrame>& frame,
const media::VideoCaptureFormat& format) {
DCHECK(io_thread_checker_.CalledOnValidThread());
+ libjingle_worker_thread_->PostTask(
+ FROM_HERE,
+ base::Bind(&WebRtcVideoSourceAdapter::OnVideoFrameOnWorkerThread,
+ this, frame, format));
+}
+
+void
+WebRtcVideoTrackAdapter::WebRtcVideoSourceAdapter::OnVideoFrameOnWorkerThread(
+ const scoped_refptr<media::VideoFrame>& frame,
+ const media::VideoCaptureFormat& format) {
+ DCHECK(libjingle_worker_thread_->BelongsToCurrentThread());
capture_adapter_->OnFrameCaptured(frame);
}
@@ -86,8 +129,10 @@ WebRtcVideoTrackAdapter::WebRtcVideoTrackAdapter(
video_track_->set_enabled(web_track_.isEnabled());
- source_adapter_ = new WebRtcVideoSourceAdapter(video_source,
- capture_adapter);
+ source_adapter_ = new WebRtcVideoSourceAdapter(
+ factory->GetWebRtcWorkerThread(),
Ronghua Wu (Left Chromium) 2014/05/12 16:09:12 I think we should expose this interface on |captur
perkj_chrome 2014/05/12 19:28:26 MediaStreamDependencyFactory (terrible name now by
Ronghua Wu (Left Chromium) 2014/05/12 21:45:46 In that case it makes sense to keep it in MediaStr
+ video_source,
+ capture_adapter);
AddToVideoTrack(
this,

Powered by Google App Engine
This is Rietveld 408576698