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;
 }