Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: webrtc/video_engine/vie_channel_group.cc

Issue 1394243006: Move ownership of send ViEChannels and ViEEncoder to VideoSendStream. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Removed header leftovers. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/video_engine/vie_channel_group.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « webrtc/video_engine/vie_channel_group.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698