| 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_;
|
| +
|
| 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(
|
| + FROM_HERE,
|
| + base::Bind(&ReleaseWebRtcSourceOnMainRenderThread,
|
| + 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(),
|
| + video_source,
|
| + capture_adapter);
|
|
|
| AddToVideoTrack(
|
| this,
|
|
|