22
22
#include " rtc_base/location.h"
23
23
#include " rtc_base/logging.h"
24
24
#include " rtc_base/ref_counted_object.h"
25
+ #include " rtc_base/task_utils/to_queued_task.h"
25
26
26
27
namespace webrtc {
27
28
@@ -43,9 +44,12 @@ VideoRtpReceiver::VideoRtpReceiver(
43
44
rtc::Thread::Current (),
44
45
worker_thread,
45
46
VideoTrack::Create(receiver_id, source_, worker_thread))),
46
- attachment_id_(GenerateUniqueId()) {
47
+ cached_track_should_receive_(track_->should_receive ()),
48
+ attachment_id_(GenerateUniqueId()),
49
+ worker_thread_safety_(PendingTaskSafetyFlag::CreateDetachedInactive()) {
47
50
RTC_DCHECK (worker_thread_);
48
51
SetStreams (streams);
52
+ track_->RegisterObserver (this );
49
53
RTC_DCHECK_EQ (source_->state (), MediaSourceInterface::kInitializing );
50
54
}
51
55
@@ -114,6 +118,40 @@ void VideoRtpReceiver::Stop() {
114
118
track_->internal ()->set_ended ();
115
119
}
116
120
121
+ void VideoRtpReceiver::OnChanged () {
122
+ RTC_DCHECK_RUN_ON (&signaling_thread_checker_);
123
+ if (cached_track_should_receive_ != track_->should_receive ()) {
124
+ cached_track_should_receive_ = track_->should_receive ();
125
+ worker_thread_->PostTask (ToQueuedTask (
126
+ worker_thread_safety_,
127
+ [this , receive = cached_track_should_receive_]() {
128
+ RTC_DCHECK_RUN_ON (worker_thread_);
129
+ if (receive) {
130
+ StartMediaChannel ();
131
+ } else {
132
+ StopMediaChannel ();
133
+ }
134
+ }));
135
+ }
136
+ }
137
+
138
+ void VideoRtpReceiver::StartMediaChannel () {
139
+ RTC_DCHECK_RUN_ON (worker_thread_);
140
+ if (!media_channel_) {
141
+ return ;
142
+ }
143
+ media_channel_->StartReceive (ssrc_.value_or (0 ));
144
+ OnGenerateKeyFrame ();
145
+ }
146
+
147
+ void VideoRtpReceiver::StopMediaChannel () {
148
+ RTC_DCHECK_RUN_ON (worker_thread_);
149
+ if (!media_channel_) {
150
+ return ;
151
+ }
152
+ media_channel_->StopReceive (ssrc_.value_or (0 ));
153
+ }
154
+
117
155
// RTC_RUN_ON(&signaling_thread_checker_)
118
156
void VideoRtpReceiver::RestartMediaChannel (absl::optional<uint32_t > ssrc) {
119
157
MediaSourceInterface::SourceState state = source_->state ();
@@ -205,6 +243,7 @@ void VideoRtpReceiver::set_transport(
205
243
void VideoRtpReceiver::SetStreams (
206
244
const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) {
207
245
RTC_DCHECK_RUN_ON (&signaling_thread_checker_);
246
+
208
247
// Remove remote track from any streams that are going away.
209
248
for (const auto & existing_stream : streams_) {
210
249
bool removed = true ;
@@ -276,6 +315,8 @@ void VideoRtpReceiver::SetMediaChannel_w(cricket::MediaChannel* media_channel) {
276
315
SetEncodedSinkEnabled (false );
277
316
}
278
317
318
+ media_channel ? worker_thread_safety_->SetAlive ()
319
+ : worker_thread_safety_->SetNotAlive ();
279
320
media_channel_ = static_cast <cricket::VideoMediaChannel*>(media_channel);
280
321
281
322
if (media_channel_) {
0 commit comments