@@ -41,9 +41,12 @@ VideoRtpReceiver::VideoRtpReceiver(
41
41
rtc::Thread::Current (),
42
42
worker_thread,
43
43
VideoTrack::Create(receiver_id, source_, worker_thread))),
44
- attachment_id_(GenerateUniqueId()) {
44
+ cached_track_should_receive_(track_->should_receive ()),
45
+ attachment_id_(GenerateUniqueId()),
46
+ worker_thread_safety_(PendingTaskSafetyFlag::CreateDetachedInactive()) {
45
47
RTC_DCHECK (worker_thread_);
46
48
SetStreams (streams);
49
+ track_->RegisterObserver (this );
47
50
RTC_DCHECK_EQ (source_->state (), MediaSourceInterface::kInitializing );
48
51
}
49
52
@@ -116,6 +119,39 @@ void VideoRtpReceiver::Stop() {
116
119
track_->internal ()->set_ended ();
117
120
}
118
121
122
+ void VideoRtpReceiver::OnChanged () {
123
+ RTC_DCHECK_RUN_ON (&signaling_thread_checker_);
124
+ if (cached_track_should_receive_ != track_->should_receive ()) {
125
+ cached_track_should_receive_ = track_->should_receive ();
126
+ worker_thread_->PostTask (
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 (signaled_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 (signaled_ssrc_.value_or (0 ));
153
+ }
154
+
119
155
void VideoRtpReceiver::RestartMediaChannel (absl::optional<uint32_t > ssrc) {
120
156
RTC_DCHECK_RUN_ON (&signaling_thread_checker_);
121
157
MediaSourceInterface::SourceState state = source_->state ();
@@ -211,6 +247,7 @@ void VideoRtpReceiver::set_transport(
211
247
void VideoRtpReceiver::SetStreams (
212
248
const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) {
213
249
RTC_DCHECK_RUN_ON (&signaling_thread_checker_);
250
+
214
251
// Remove remote track from any streams that are going away.
215
252
for (const auto & existing_stream : streams_) {
216
253
bool removed = true ;
0 commit comments