@@ -41,15 +41,20 @@ 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
50
53
VideoRtpReceiver::~VideoRtpReceiver () {
51
54
RTC_DCHECK_RUN_ON (&signaling_thread_checker_);
52
55
RTC_DCHECK (!media_channel_);
56
+
57
+ track_->UnregisterObserver (this );
53
58
}
54
59
55
60
std::vector<std::string> VideoRtpReceiver::stream_ids () const {
@@ -114,6 +119,39 @@ void VideoRtpReceiver::Stop() {
114
119
track_->internal ()->set_ended ();
115
120
}
116
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
+
117
155
void VideoRtpReceiver::RestartMediaChannel (absl::optional<uint32_t > ssrc) {
118
156
RTC_DCHECK_RUN_ON (&signaling_thread_checker_);
119
157
MediaSourceInterface::SourceState state = source_->state ();
@@ -209,6 +247,7 @@ void VideoRtpReceiver::set_transport(
209
247
void VideoRtpReceiver::SetStreams (
210
248
const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) {
211
249
RTC_DCHECK_RUN_ON (&signaling_thread_checker_);
250
+
212
251
// Remove remote track from any streams that are going away.
213
252
for (const auto & existing_stream : streams_) {
214
253
bool removed = true ;
0 commit comments