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