Change VideoRtpReceiver to create remote VideoTrack and VideoTrackSource.
This enabled us to be able to remove VideoTrack::GetSink and RemoteVideoCapturer.
Since video frames from the decoder is delivered on a media engine internal thread, VideoBroadCaster must be made thread safe.
BUG=webrtc:5426
R=deadbeef@webrtc.org, pthatcher@webrtc.org
Review URL: https://codereview.webrtc.org/1765423005 .
Cr-Commit-Position: refs/heads/master@{#11944}
diff --git a/webrtc/api/rtpreceiver.cc b/webrtc/api/rtpreceiver.cc
index 0ad5218..1590612 100644
--- a/webrtc/api/rtpreceiver.cc
+++ b/webrtc/api/rtpreceiver.cc
@@ -10,7 +10,8 @@
#include "webrtc/api/rtpreceiver.h"
-#include "webrtc/api/videosourceinterface.h"
+#include "webrtc/api/mediastreamtrackproxy.h"
+#include "webrtc/api/videotrack.h"
namespace webrtc {
@@ -65,11 +66,27 @@
provider_->SetAudioPlayout(ssrc_, track_->enabled());
}
-VideoRtpReceiver::VideoRtpReceiver(VideoTrackInterface* track,
+VideoRtpReceiver::VideoRtpReceiver(MediaStreamInterface* stream,
+ const std::string& track_id,
+ rtc::Thread* worker_thread,
uint32_t ssrc,
VideoProviderInterface* provider)
- : id_(track->id()), track_(track), ssrc_(ssrc), provider_(provider) {
- provider_->SetVideoPlayout(ssrc_, true, track_->GetSink());
+ : id_(track_id),
+ ssrc_(ssrc),
+ provider_(provider),
+ source_(new RefCountedObject<VideoTrackSource>(&broadcaster_,
+ worker_thread,
+ true /* remote */)),
+ track_(VideoTrackProxy::Create(
+ rtc::Thread::Current(),
+ VideoTrack::Create(track_id, source_.get()))) {
+ source_->SetState(MediaSourceInterface::kLive);
+ // TODO(perkj): It should be enough to set the source state. All tracks
+ // belonging to the same source should get its state from the source.
+ // I.e. if a track has been cloned from a remote source.
+ track_->set_state(webrtc::MediaStreamTrackInterface::kLive);
+ provider_->SetVideoPlayout(ssrc_, true, &broadcaster_);
+ stream->AddTrack(track_);
}
VideoRtpReceiver::~VideoRtpReceiver() {
@@ -83,6 +100,11 @@
if (!provider_) {
return;
}
+ source_->SetState(MediaSourceInterface::kEnded);
+ source_->OnSourceDestroyed();
+ // TODO(perkj): It should be enough to set the source state. All tracks
+ // belonging to the same source should get its state from the source.
+ track_->set_state(MediaStreamTrackInterface::kEnded);
provider_->SetVideoPlayout(ssrc_, false, nullptr);
provider_ = nullptr;
}