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

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

Issue 675013005: Split libjingle's signaling thread from the UI thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update tests, remove circular dependency Created 6 years, 1 month 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/media_stream_remote_video_source.cc
diff --git a/content/renderer/media/webrtc/media_stream_remote_video_source.cc b/content/renderer/media/webrtc/media_stream_remote_video_source.cc
index 02bd5092dd3b449ac29204290d170172a17c83bb..c9cb883af843142e012053f3fe11d1b5d2112eac 100644
--- a/content/renderer/media/webrtc/media_stream_remote_video_source.cc
+++ b/content/renderer/media/webrtc/media_stream_remote_video_source.cc
@@ -6,8 +6,10 @@
#include "base/bind.h"
#include "base/callback_helpers.h"
+#include "base/debug/trace_event.h"
#include "base/location.h"
#include "base/message_loop/message_loop_proxy.h"
+#include "base/threading/thread_checker.h"
#include "content/renderer/media/native_handle_impl.h"
#include "media/base/bind_to_current_loop.h"
#include "media/base/video_frame.h"
@@ -71,6 +73,7 @@ RemoteVideoSourceDelegate::SetSize(int width, int height) {
void MediaStreamRemoteVideoSource::
RemoteVideoSourceDelegate::RenderFrame(
const cricket::VideoFrame* frame) {
+ TRACE_EVENT0("webrtc", "RemoteVideoSourceDelegate::RenderFrame");
base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds(
frame->GetElapsedTime() / rtc::kNumNanosecsPerMicrosec);
@@ -120,19 +123,66 @@ RemoteVideoSourceDelegate::DoRenderFrameOnIOThread(
scoped_refptr<media::VideoFrame> video_frame,
const media::VideoCaptureFormat& format) {
DCHECK(io_message_loop_->BelongsToCurrentThread());
+ TRACE_EVENT0("webrtc", "RemoteVideoSourceDelegate::DoRenderFrameOnIOThread");
// TODO(hclam): Give the estimated capture time.
frame_callback_.Run(video_frame, format, base::TimeTicks());
}
+MediaStreamRemoteVideoSource::Observer::Observer(
+ const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
+ webrtc::VideoTrackInterface* track)
+ : main_thread_(main_thread), track_(track), state_(track->state()) {
+ track->RegisterObserver(this);
+}
+
+const scoped_refptr<webrtc::VideoTrackInterface>&
+MediaStreamRemoteVideoSource::Observer::track() {
+ DCHECK(main_thread_->BelongsToCurrentThread());
+ return track_;
+}
+
+webrtc::MediaStreamTrackInterface::TrackState
+MediaStreamRemoteVideoSource::Observer::state() const {
+ DCHECK(main_thread_->BelongsToCurrentThread());
+ return state_;
+}
+
+MediaStreamRemoteVideoSource::Observer::~Observer() {
+ DCHECK(main_thread_->BelongsToCurrentThread());
+ track_->UnregisterObserver(this);
+}
+
+void MediaStreamRemoteVideoSource::Observer::SetSource(
+ const base::WeakPtr<MediaStreamRemoteVideoSource>& source) {
+ DCHECK(main_thread_->BelongsToCurrentThread());
+ DCHECK(!source_);
+ source_ = source;
+}
+
+void MediaStreamRemoteVideoSource::Observer::OnChanged() {
+ webrtc::MediaStreamTrackInterface::TrackState state = track_->state();
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&MediaStreamRemoteVideoSource::Observer::OnChangedImpl,
+ this, state));
+}
+
+void MediaStreamRemoteVideoSource::Observer::OnChangedImpl(
+ webrtc::MediaStreamTrackInterface::TrackState state) {
+ DCHECK(main_thread_->BelongsToCurrentThread());
+ DCHECK(source_) << "Dropping a state change event. " << state;
+ if (source_ && state != state_)
+ source_->OnChanged(state);
+ state_ = state;
+}
+
MediaStreamRemoteVideoSource::MediaStreamRemoteVideoSource(
- webrtc::VideoTrackInterface* remote_track)
- : remote_track_(remote_track),
- last_state_(remote_track->state()) {
- remote_track_->RegisterObserver(this);
+ const scoped_refptr<MediaStreamRemoteVideoSource::Observer>& observer)
+ : observer_(observer), weak_factory_(this) {
+ observer->SetSource(weak_factory_.GetWeakPtr());
}
MediaStreamRemoteVideoSource::~MediaStreamRemoteVideoSource() {
- remote_track_->UnregisterObserver(this);
+ DCHECK(CalledOnValidThread());
}
void MediaStreamRemoteVideoSource::GetCurrentSupportedFormats(
@@ -140,7 +190,7 @@ void MediaStreamRemoteVideoSource::GetCurrentSupportedFormats(
int max_requested_height,
double max_requested_frame_rate,
const VideoCaptureDeviceFormatsCB& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(CalledOnValidThread());
media::VideoCaptureFormats formats;
// Since the remote end is free to change the resolution at any point in time
// the supported formats are unknown.
@@ -150,17 +200,17 @@ void MediaStreamRemoteVideoSource::GetCurrentSupportedFormats(
void MediaStreamRemoteVideoSource::StartSourceImpl(
const media::VideoCaptureFormat& format,
const VideoCaptureDeliverFrameCB& frame_callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(CalledOnValidThread());
DCHECK(!delegate_.get());
delegate_ = new RemoteVideoSourceDelegate(io_message_loop(), frame_callback);
- remote_track_->AddRenderer(delegate_.get());
+ observer_->track()->AddRenderer(delegate_.get());
OnStartDone(MEDIA_DEVICE_OK);
}
void MediaStreamRemoteVideoSource::StopSourceImpl() {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(CalledOnValidThread());
DCHECK(state() != MediaStreamVideoSource::ENDED);
- remote_track_->RemoveRenderer(delegate_.get());
+ observer_->track()->RemoveRenderer(delegate_.get());
}
webrtc::VideoRendererInterface*
@@ -168,26 +218,23 @@ MediaStreamRemoteVideoSource::RenderInterfaceForTest() {
return delegate_.get();
}
-void MediaStreamRemoteVideoSource::OnChanged() {
- DCHECK(thread_checker_.CalledOnValidThread());
- webrtc::MediaStreamTrackInterface::TrackState state = remote_track_->state();
- if (state != last_state_) {
- last_state_ = state;
- switch (state) {
- case webrtc::MediaStreamTrackInterface::kInitializing:
- // Ignore the kInitializing state since there is no match in
- // WebMediaStreamSource::ReadyState.
- break;
- case webrtc::MediaStreamTrackInterface::kLive:
- SetReadyState(blink::WebMediaStreamSource::ReadyStateLive);
- break;
- case webrtc::MediaStreamTrackInterface::kEnded:
- SetReadyState(blink::WebMediaStreamSource::ReadyStateEnded);
- break;
- default:
- NOTREACHED();
- break;
- }
+void MediaStreamRemoteVideoSource::OnChanged(
+ webrtc::MediaStreamTrackInterface::TrackState state) {
+ DCHECK(CalledOnValidThread());
+ switch (state) {
+ case webrtc::MediaStreamTrackInterface::kInitializing:
+ // Ignore the kInitializing state since there is no match in
+ // WebMediaStreamSource::ReadyState.
+ break;
+ case webrtc::MediaStreamTrackInterface::kLive:
+ SetReadyState(blink::WebMediaStreamSource::ReadyStateLive);
+ break;
+ case webrtc::MediaStreamTrackInterface::kEnded:
+ SetReadyState(blink::WebMediaStreamSource::ReadyStateEnded);
+ break;
+ default:
+ NOTREACHED();
+ break;
}
}

Powered by Google App Engine
This is Rietveld 408576698