OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 pacer_thread_->DeRegisterModule(pacer_.get()); | 186 pacer_thread_->DeRegisterModule(pacer_.get()); |
187 process_thread_->DeRegisterModule(bitrate_controller_.get()); | 187 process_thread_->DeRegisterModule(bitrate_controller_.get()); |
188 process_thread_->DeRegisterModule(call_stats_.get()); | 188 process_thread_->DeRegisterModule(call_stats_.get()); |
189 process_thread_->DeRegisterModule(remote_bitrate_estimator_.get()); | 189 process_thread_->DeRegisterModule(remote_bitrate_estimator_.get()); |
190 process_thread_->DeRegisterModule(remote_estimator_proxy_.get()); | 190 process_thread_->DeRegisterModule(remote_estimator_proxy_.get()); |
191 call_stats_->DeregisterStatsObserver(remote_bitrate_estimator_.get()); | 191 call_stats_->DeregisterStatsObserver(remote_bitrate_estimator_.get()); |
192 if (transport_feedback_adapter_.get()) | 192 if (transport_feedback_adapter_.get()) |
193 call_stats_->DeregisterStatsObserver(transport_feedback_adapter_.get()); | 193 call_stats_->DeregisterStatsObserver(transport_feedback_adapter_.get()); |
194 RTC_DCHECK(channel_map_.empty()); | 194 RTC_DCHECK(channel_map_.empty()); |
195 RTC_DCHECK(!remb_->InUse()); | 195 RTC_DCHECK(!remb_->InUse()); |
196 RTC_DCHECK(vie_encoder_map_.empty()); | 196 RTC_DCHECK(encoders_.empty()); |
197 } | |
198 | |
199 bool ChannelGroup::CreateSendChannel(int channel_id, | |
200 Transport* transport, | |
201 SendStatisticsProxy* stats_proxy, | |
202 I420FrameCallback* pre_encode_callback, | |
203 int number_of_cores, | |
204 const VideoSendStream::Config& config) { | |
205 TransportFeedbackObserver* transport_feedback_observer = nullptr; | |
206 bool transport_seq_enabled = false; | |
207 for (const RtpExtension& extension : config.rtp.extensions) { | |
208 if (extension.name == RtpExtension::kTransportSequenceNumber) { | |
209 transport_seq_enabled = true; | |
210 break; | |
211 } | |
212 } | |
213 if (transport_seq_enabled) { | |
214 if (transport_feedback_adapter_.get() == nullptr) { | |
215 transport_feedback_adapter_.reset(new TransportFeedbackAdapter( | |
216 bitrate_controller_->CreateRtcpBandwidthObserver(), | |
217 Clock::GetRealTimeClock(), process_thread_)); | |
218 transport_feedback_adapter_->SetBitrateEstimator( | |
219 new RemoteBitrateEstimatorAbsSendTime( | |
220 transport_feedback_adapter_.get(), Clock::GetRealTimeClock())); | |
221 transport_feedback_adapter_->GetBitrateEstimator()->SetMinBitrate( | |
222 min_bitrate_bps_); | |
223 call_stats_->RegisterStatsObserver(transport_feedback_adapter_.get()); | |
224 } | |
225 transport_feedback_observer = transport_feedback_adapter_.get(); | |
226 } | |
227 | |
228 const std::vector<uint32_t>& ssrcs = config.rtp.ssrcs; | |
229 RTC_DCHECK(!ssrcs.empty()); | |
230 rtc::scoped_ptr<ViEEncoder> vie_encoder(new ViEEncoder( | |
231 channel_id, number_of_cores, process_thread_, stats_proxy, | |
232 pre_encode_callback, pacer_.get(), bitrate_allocator_.get())); | |
233 if (!vie_encoder->Init()) { | |
234 return false; | |
235 } | |
236 ViEEncoder* encoder = vie_encoder.get(); | |
237 if (!CreateChannel(channel_id, transport, number_of_cores, | |
238 vie_encoder.release(), ssrcs.size(), true, | |
239 remote_bitrate_estimator_.get(), | |
240 transport_feedback_observer)) { | |
241 return false; | |
242 } | |
243 ViEChannel* channel = channel_map_[channel_id]; | |
244 // Connect the encoder with the send packet router, to enable sending. | |
245 encoder->StartThreadsAndSetSharedMembers(channel->send_payload_router(), | |
246 channel->vcm_protection_callback()); | |
247 | |
248 encoder_state_feedback_->AddEncoder(ssrcs, encoder); | |
249 std::vector<uint32_t> first_ssrc(1, ssrcs[0]); | |
250 encoder->SetSsrcs(first_ssrc); | |
251 return true; | |
252 } | 197 } |
253 | 198 |
254 bool ChannelGroup::CreateReceiveChannel( | 199 bool ChannelGroup::CreateReceiveChannel( |
255 int channel_id, | 200 int channel_id, |
256 Transport* transport, | 201 Transport* transport, |
257 int number_of_cores, | 202 int number_of_cores, |
258 const VideoReceiveStream::Config& config) { | 203 const VideoReceiveStream::Config& config) { |
259 bool send_side_bwe = false; | 204 bool send_side_bwe = false; |
260 for (const RtpExtension& extension : config.rtp.extensions) { | 205 for (const RtpExtension& extension : config.rtp.extensions) { |
261 if (extension.name == RtpExtension::kTransportSequenceNumber) { | 206 if (extension.name == RtpExtension::kTransportSequenceNumber) { |
262 send_side_bwe = true; | 207 send_side_bwe = true; |
263 break; | 208 break; |
264 } | 209 } |
265 } | 210 } |
266 | 211 |
267 RemoteBitrateEstimator* bitrate_estimator; | 212 RemoteBitrateEstimator* bitrate_estimator; |
268 if (send_side_bwe) { | 213 if (send_side_bwe) { |
269 bitrate_estimator = remote_estimator_proxy_.get(); | 214 bitrate_estimator = remote_estimator_proxy_.get(); |
270 } else { | 215 } else { |
271 bitrate_estimator = remote_bitrate_estimator_.get(); | 216 bitrate_estimator = remote_bitrate_estimator_.get(); |
272 } | 217 } |
273 return CreateChannel(channel_id, transport, number_of_cores, nullptr, 1, | 218 return CreateChannel(channel_id, transport, number_of_cores, 1, false, |
274 false, bitrate_estimator, nullptr); | 219 bitrate_estimator, nullptr); |
275 } | 220 } |
276 | 221 |
277 bool ChannelGroup::CreateChannel(int channel_id, | 222 bool ChannelGroup::CreateChannel(int channel_id, |
278 Transport* transport, | 223 Transport* transport, |
279 int number_of_cores, | 224 int number_of_cores, |
280 ViEEncoder* vie_encoder, | |
281 size_t max_rtp_streams, | 225 size_t max_rtp_streams, |
282 bool sender, | 226 bool sender, |
283 RemoteBitrateEstimator* bitrate_estimator, | 227 RemoteBitrateEstimator* bitrate_estimator, |
284 TransportFeedbackObserver* feedback_observer) { | 228 TransportFeedbackObserver* feedback_observer) { |
285 rtc::scoped_ptr<ViEChannel> channel(new ViEChannel( | 229 rtc::scoped_ptr<ViEChannel> channel(new ViEChannel( |
286 number_of_cores, transport, process_thread_, | 230 number_of_cores, transport, process_thread_, |
287 encoder_state_feedback_->GetRtcpIntraFrameObserver(), | 231 encoder_state_feedback_->GetRtcpIntraFrameObserver(), |
288 bitrate_controller_->CreateRtcpBandwidthObserver(), feedback_observer, | 232 bitrate_controller_->CreateRtcpBandwidthObserver(), feedback_observer, |
289 bitrate_estimator, call_stats_->rtcp_rtt_stats(), pacer_.get(), | 233 bitrate_estimator, call_stats_->rtcp_rtt_stats(), pacer_.get(), |
290 packet_router_.get(), max_rtp_streams, sender)); | 234 packet_router_.get(), max_rtp_streams, sender)); |
291 if (channel->Init() != 0) { | 235 if (channel->Init() != 0) { |
292 return false; | 236 return false; |
293 } | 237 } |
294 | 238 |
295 // Register the channel to receive stats updates. | 239 // Register the channel to receive stats updates. |
296 call_stats_->RegisterStatsObserver(channel->GetStatsObserver()); | 240 call_stats_->RegisterStatsObserver(channel->GetStatsObserver()); |
297 | 241 |
298 // Store the channel, add it to the channel group and save the vie_encoder. | 242 // Store the channel and add it to the channel group. |
299 channel_map_[channel_id] = channel.release(); | 243 channel_map_[channel_id] = channel.release(); |
300 if (vie_encoder) { | |
301 rtc::CritScope lock(&encoder_map_crit_); | |
302 vie_encoder_map_[channel_id] = vie_encoder; | |
303 } | |
304 | |
305 return true; | 244 return true; |
306 } | 245 } |
307 | 246 |
308 void ChannelGroup::DeleteChannel(int channel_id) { | 247 void ChannelGroup::DeleteChannel(int channel_id) { |
309 ViEChannel* vie_channel = PopChannel(channel_id); | 248 ViEChannel* vie_channel = PopChannel(channel_id); |
310 | 249 |
311 ViEEncoder* vie_encoder = GetEncoder(channel_id); | |
312 | |
313 call_stats_->DeregisterStatsObserver(vie_channel->GetStatsObserver()); | 250 call_stats_->DeregisterStatsObserver(vie_channel->GetStatsObserver()); |
314 SetChannelRembStatus(false, false, vie_channel); | 251 SetChannelRembStatus(false, false, vie_channel); |
315 | 252 |
316 // If we're a sender, remove the feedback and stop all encoding threads and | 253 unsigned int remote_ssrc = vie_channel->GetRemoteSSRC(); |
317 // processing. This must be done before deleting the channel. | |
318 if (vie_encoder) { | |
319 encoder_state_feedback_->RemoveEncoder(vie_encoder); | |
320 vie_encoder->StopThreadsAndRemoveSharedMembers(); | |
321 } | |
322 | |
323 unsigned int remote_ssrc = 0; | |
324 vie_channel->GetRemoteSSRC(&remote_ssrc); | |
325 channel_map_.erase(channel_id); | 254 channel_map_.erase(channel_id); |
326 remote_bitrate_estimator_->RemoveStream(remote_ssrc); | 255 remote_bitrate_estimator_->RemoveStream(remote_ssrc); |
327 | 256 |
328 delete vie_channel; | 257 delete vie_channel; |
329 | 258 |
330 if (vie_encoder) { | |
331 { | |
332 rtc::CritScope lock(&encoder_map_crit_); | |
333 vie_encoder_map_.erase(vie_encoder_map_.find(channel_id)); | |
334 } | |
335 delete vie_encoder; | |
336 } | |
337 | |
338 LOG(LS_VERBOSE) << "Channel deleted " << channel_id; | 259 LOG(LS_VERBOSE) << "Channel deleted " << channel_id; |
339 } | 260 } |
340 | 261 |
341 ViEChannel* ChannelGroup::GetChannel(int channel_id) const { | 262 ViEChannel* ChannelGroup::GetChannel(int channel_id) const { |
342 ChannelMap::const_iterator it = channel_map_.find(channel_id); | 263 ChannelMap::const_iterator it = channel_map_.find(channel_id); |
343 if (it == channel_map_.end()) { | 264 if (it == channel_map_.end()) { |
344 LOG(LS_ERROR) << "Channel doesn't exist " << channel_id; | 265 LOG(LS_ERROR) << "Channel doesn't exist " << channel_id; |
345 return NULL; | 266 return NULL; |
346 } | 267 } |
347 return it->second; | 268 return it->second; |
348 } | 269 } |
349 | 270 |
350 ViEEncoder* ChannelGroup::GetEncoder(int channel_id) const { | 271 void ChannelGroup::AddEncoder(const std::vector<uint32_t>& ssrcs, |
351 rtc::CritScope lock(&encoder_map_crit_); | 272 ViEEncoder* encoder) { |
352 EncoderMap::const_iterator it = vie_encoder_map_.find(channel_id); | 273 encoder_state_feedback_->AddEncoder(ssrcs, encoder); |
353 if (it == vie_encoder_map_.end()) | 274 rtc::CritScope lock(&encoder_crit_); |
354 return nullptr; | 275 encoders_.push_back(encoder); |
355 return it->second; | 276 } |
| 277 |
| 278 void ChannelGroup::RemoveEncoder(ViEEncoder* encoder) { |
| 279 encoder_state_feedback_->RemoveEncoder(encoder); |
| 280 rtc::CritScope lock(&encoder_crit_); |
| 281 for (auto it = encoders_.begin(); it != encoders_.end(); ++it) { |
| 282 if (*it == encoder) { |
| 283 encoders_.erase(it); |
| 284 return; |
| 285 } |
| 286 } |
356 } | 287 } |
357 | 288 |
358 ViEChannel* ChannelGroup::PopChannel(int channel_id) { | 289 ViEChannel* ChannelGroup::PopChannel(int channel_id) { |
359 ChannelMap::iterator c_it = channel_map_.find(channel_id); | 290 ChannelMap::iterator c_it = channel_map_.find(channel_id); |
360 RTC_DCHECK(c_it != channel_map_.end()); | 291 RTC_DCHECK(c_it != channel_map_.end()); |
361 ViEChannel* channel = c_it->second; | 292 ViEChannel* channel = c_it->second; |
362 channel_map_.erase(c_it); | 293 channel_map_.erase(c_it); |
363 | 294 |
364 return channel; | 295 return channel; |
365 } | 296 } |
(...skipping 22 matching lines...) Expand all Loading... |
388 } | 319 } |
389 | 320 |
390 RemoteBitrateEstimator* ChannelGroup::GetRemoteBitrateEstimator() const { | 321 RemoteBitrateEstimator* ChannelGroup::GetRemoteBitrateEstimator() const { |
391 return remote_bitrate_estimator_.get(); | 322 return remote_bitrate_estimator_.get(); |
392 } | 323 } |
393 | 324 |
394 CallStats* ChannelGroup::GetCallStats() const { | 325 CallStats* ChannelGroup::GetCallStats() const { |
395 return call_stats_.get(); | 326 return call_stats_.get(); |
396 } | 327 } |
397 | 328 |
398 EncoderStateFeedback* ChannelGroup::GetEncoderStateFeedback() const { | 329 TransportFeedbackObserver* ChannelGroup::GetTransportFeedbackObserver() { |
399 return encoder_state_feedback_.get(); | 330 if (transport_feedback_adapter_.get() == nullptr) { |
| 331 transport_feedback_adapter_.reset(new TransportFeedbackAdapter( |
| 332 bitrate_controller_->CreateRtcpBandwidthObserver(), |
| 333 Clock::GetRealTimeClock(), process_thread_)); |
| 334 transport_feedback_adapter_->SetBitrateEstimator( |
| 335 new RemoteBitrateEstimatorAbsSendTime( |
| 336 transport_feedback_adapter_.get(), Clock::GetRealTimeClock())); |
| 337 transport_feedback_adapter_->GetBitrateEstimator()->SetMinBitrate( |
| 338 min_bitrate_bps_); |
| 339 call_stats_->RegisterStatsObserver(transport_feedback_adapter_.get()); |
| 340 } |
| 341 return transport_feedback_adapter_.get(); |
| 342 } |
| 343 |
| 344 RtcpIntraFrameObserver* ChannelGroup::GetRtcpIntraFrameObserver() const { |
| 345 return encoder_state_feedback_->GetRtcpIntraFrameObserver(); |
400 } | 346 } |
401 | 347 |
402 int64_t ChannelGroup::GetPacerQueuingDelayMs() const { | 348 int64_t ChannelGroup::GetPacerQueuingDelayMs() const { |
403 return pacer_->QueueInMs(); | 349 return pacer_->QueueInMs(); |
404 } | 350 } |
405 | 351 |
406 void ChannelGroup::SetChannelRembStatus(bool sender, | 352 void ChannelGroup::SetChannelRembStatus(bool sender, |
407 bool receiver, | 353 bool receiver, |
408 ViEChannel* channel) { | 354 ViEChannel* channel) { |
409 // Update the channel state. | 355 // Update the channel state. |
410 channel->EnableRemb(sender || receiver); | 356 channel->EnableRemb(sender || receiver); |
411 // Update the REMB instance with necessary RTP modules. | 357 // Update the REMB instance with necessary RTP modules. |
412 RtpRtcp* rtp_module = channel->rtp_rtcp(); | 358 RtpRtcp* rtp_module = channel->rtp_rtcp(); |
413 if (sender) { | 359 if (sender) { |
414 remb_->AddRembSender(rtp_module); | 360 remb_->AddRembSender(rtp_module); |
415 } else { | 361 } else { |
416 remb_->RemoveRembSender(rtp_module); | 362 remb_->RemoveRembSender(rtp_module); |
417 } | 363 } |
418 if (receiver) { | 364 if (receiver) { |
419 remb_->AddReceiveChannel(rtp_module); | 365 remb_->AddReceiveChannel(rtp_module); |
420 } else { | 366 } else { |
421 remb_->RemoveReceiveChannel(rtp_module); | 367 remb_->RemoveReceiveChannel(rtp_module); |
422 } | 368 } |
423 } | 369 } |
424 | 370 |
| 371 // TODO(mflodman): Move this logic out from ChannelGroup. |
425 void ChannelGroup::OnNetworkChanged(uint32_t target_bitrate_bps, | 372 void ChannelGroup::OnNetworkChanged(uint32_t target_bitrate_bps, |
426 uint8_t fraction_loss, | 373 uint8_t fraction_loss, |
427 int64_t rtt) { | 374 int64_t rtt) { |
428 bitrate_allocator_->OnNetworkChanged(target_bitrate_bps, fraction_loss, rtt); | 375 bitrate_allocator_->OnNetworkChanged(target_bitrate_bps, fraction_loss, rtt); |
429 int pad_up_to_bitrate_bps = 0; | 376 int pad_up_to_bitrate_bps = 0; |
430 { | 377 { |
431 rtc::CritScope lock(&encoder_map_crit_); | 378 rtc::CritScope lock(&encoder_crit_); |
432 for (const auto& encoder : vie_encoder_map_) | 379 for (const auto& encoder : encoders_) |
433 pad_up_to_bitrate_bps += encoder.second->GetPaddingNeededBps(); | 380 pad_up_to_bitrate_bps += encoder->GetPaddingNeededBps(); |
434 } | 381 } |
435 pacer_->UpdateBitrate( | 382 pacer_->UpdateBitrate( |
436 target_bitrate_bps / 1000, | 383 target_bitrate_bps / 1000, |
437 PacedSender::kDefaultPaceMultiplier * target_bitrate_bps / 1000, | 384 PacedSender::kDefaultPaceMultiplier * target_bitrate_bps / 1000, |
438 pad_up_to_bitrate_bps / 1000); | 385 pad_up_to_bitrate_bps / 1000); |
439 } | 386 } |
440 } // namespace webrtc | 387 } // namespace webrtc |
OLD | NEW |