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

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: 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
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
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; 253 unsigned int remote_ssrc = 0;
324 vie_channel->GetRemoteSSRC(&remote_ssrc); 254 vie_channel->GetRemoteSSRC(&remote_ssrc);
325 channel_map_.erase(channel_id); 255 channel_map_.erase(channel_id);
326 remote_bitrate_estimator_->RemoveStream(remote_ssrc); 256 remote_bitrate_estimator_->RemoveStream(remote_ssrc);
327 257
328 delete vie_channel; 258 delete vie_channel;
329 259
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; 260 LOG(LS_VERBOSE) << "Channel deleted " << channel_id;
339 } 261 }
340 262
341 ViEChannel* ChannelGroup::GetChannel(int channel_id) const { 263 ViEChannel* ChannelGroup::GetChannel(int channel_id) const {
342 ChannelMap::const_iterator it = channel_map_.find(channel_id); 264 ChannelMap::const_iterator it = channel_map_.find(channel_id);
343 if (it == channel_map_.end()) { 265 if (it == channel_map_.end()) {
344 LOG(LS_ERROR) << "Channel doesn't exist " << channel_id; 266 LOG(LS_ERROR) << "Channel doesn't exist " << channel_id;
345 return NULL; 267 return NULL;
346 } 268 }
347 return it->second; 269 return it->second;
348 } 270 }
349 271
350 ViEEncoder* ChannelGroup::GetEncoder(int channel_id) const { 272 void ChannelGroup::AddEncoder(const std::vector<uint32_t>& ssrcs,
351 rtc::CritScope lock(&encoder_map_crit_); 273 ViEEncoder* encoder) {
352 EncoderMap::const_iterator it = vie_encoder_map_.find(channel_id); 274 encoder_state_feedback_->AddEncoder(ssrcs, encoder);
353 if (it == vie_encoder_map_.end()) 275 rtc::CritScope lock(&encoder_crit_);
354 return nullptr; 276 encoders_.push_back(encoder);
355 return it->second; 277 }
278
279 void ChannelGroup::RemoveEncoder(ViEEncoder* encoder) {
280
pbos-webrtc 2015/10/15 12:07:55 Remove empty line
mflodman 2015/10/15 14:39:22 Done.
281 encoder_state_feedback_->RemoveEncoder(encoder);
282 rtc::CritScope lock(&encoder_crit_);
283 for (auto it = encoders_.begin(); it != encoders_.end(); ++it) {
284 if (*it == encoder) {
285 encoders_.erase(it);
286 return;
287 }
288 }
stefan-webrtc 2015/10/15 11:33:45 Maybe make encoders_ a list and do encoders_.remov
pbos-webrtc 2015/10/15 12:07:55 Don't think so, iterating a vector is faster and t
mflodman 2015/10/15 14:39:22 Yes, I chose a vector since we do iterate over thi
stefan-webrtc 2015/10/16 06:51:53 I doubt the loop we do over this will make a diffe
356 } 289 }
357 290
358 ViEChannel* ChannelGroup::PopChannel(int channel_id) { 291 ViEChannel* ChannelGroup::PopChannel(int channel_id) {
359 ChannelMap::iterator c_it = channel_map_.find(channel_id); 292 ChannelMap::iterator c_it = channel_map_.find(channel_id);
360 RTC_DCHECK(c_it != channel_map_.end()); 293 RTC_DCHECK(c_it != channel_map_.end());
361 ViEChannel* channel = c_it->second; 294 ViEChannel* channel = c_it->second;
362 channel_map_.erase(c_it); 295 channel_map_.erase(c_it);
363 296
364 return channel; 297 return channel;
365 } 298 }
(...skipping 22 matching lines...) Expand all
388 } 321 }
389 322
390 RemoteBitrateEstimator* ChannelGroup::GetRemoteBitrateEstimator() const { 323 RemoteBitrateEstimator* ChannelGroup::GetRemoteBitrateEstimator() const {
391 return remote_bitrate_estimator_.get(); 324 return remote_bitrate_estimator_.get();
392 } 325 }
393 326
394 CallStats* ChannelGroup::GetCallStats() const { 327 CallStats* ChannelGroup::GetCallStats() const {
395 return call_stats_.get(); 328 return call_stats_.get();
396 } 329 }
397 330
398 EncoderStateFeedback* ChannelGroup::GetEncoderStateFeedback() const { 331 TransportFeedbackObserver* ChannelGroup::GetTransportFeedbackObserver() {
stefan-webrtc 2015/10/15 11:33:45 It doesn't look like transport feedback adapter sh
mflodman 2015/10/15 14:39:22 I agree. I do prefer to keep this logic in Channel
399 return encoder_state_feedback_.get(); 332 if (transport_feedback_adapter_.get() == nullptr) {
333 transport_feedback_adapter_.reset(new TransportFeedbackAdapter(
334 bitrate_controller_->CreateRtcpBandwidthObserver(),
335 Clock::GetRealTimeClock(), process_thread_));
336 transport_feedback_adapter_->SetBitrateEstimator(
337 new RemoteBitrateEstimatorAbsSendTime(
338 transport_feedback_adapter_.get(), Clock::GetRealTimeClock()));
339 transport_feedback_adapter_->GetBitrateEstimator()->SetMinBitrate(
340 min_bitrate_bps_);
341 call_stats_->RegisterStatsObserver(transport_feedback_adapter_.get());
342 }
343 return transport_feedback_adapter_.get();
344 }
345
346 RtcpIntraFrameObserver* ChannelGroup::GetRtcpIntraFrameObserver() const {
347 return encoder_state_feedback_->GetRtcpIntraFrameObserver();
400 } 348 }
401 349
402 int64_t ChannelGroup::GetPacerQueuingDelayMs() const { 350 int64_t ChannelGroup::GetPacerQueuingDelayMs() const {
403 return pacer_->QueueInMs(); 351 return pacer_->QueueInMs();
404 } 352 }
405 353
406 void ChannelGroup::SetChannelRembStatus(bool sender, 354 void ChannelGroup::SetChannelRembStatus(bool sender,
407 bool receiver, 355 bool receiver,
408 ViEChannel* channel) { 356 ViEChannel* channel) {
409 // Update the channel state. 357 // Update the channel state.
(...skipping 11 matching lines...) Expand all
421 remb_->RemoveReceiveChannel(rtp_module); 369 remb_->RemoveReceiveChannel(rtp_module);
422 } 370 }
423 } 371 }
424 372
425 void ChannelGroup::OnNetworkChanged(uint32_t target_bitrate_bps, 373 void ChannelGroup::OnNetworkChanged(uint32_t target_bitrate_bps,
426 uint8_t fraction_loss, 374 uint8_t fraction_loss,
427 int64_t rtt) { 375 int64_t rtt) {
428 bitrate_allocator_->OnNetworkChanged(target_bitrate_bps, fraction_loss, rtt); 376 bitrate_allocator_->OnNetworkChanged(target_bitrate_bps, fraction_loss, rtt);
429 int pad_up_to_bitrate_bps = 0; 377 int pad_up_to_bitrate_bps = 0;
430 { 378 {
431 rtc::CritScope lock(&encoder_map_crit_); 379 rtc::CritScope lock(&encoder_crit_);
432 for (const auto& encoder : vie_encoder_map_) 380 for (const auto& encoder : encoders_)
433 pad_up_to_bitrate_bps += encoder.second->GetPaddingNeededBps(); 381 pad_up_to_bitrate_bps += encoder->GetPaddingNeededBps();
stefan-webrtc 2015/10/15 11:33:45 It would really be nice to improve this... Maybe a
pbos-webrtc 2015/10/15 12:07:55 Yeah I think registering encoders on the pacer dir
mflodman 2015/10/15 14:39:22 TODO added.
434 } 382 }
435 pacer_->UpdateBitrate( 383 pacer_->UpdateBitrate(
436 target_bitrate_bps / 1000, 384 target_bitrate_bps / 1000,
437 PacedSender::kDefaultPaceMultiplier * target_bitrate_bps / 1000, 385 PacedSender::kDefaultPaceMultiplier * target_bitrate_bps / 1000,
438 pad_up_to_bitrate_bps / 1000); 386 pad_up_to_bitrate_bps / 1000);
439 } 387 }
440 } // namespace webrtc 388 } // namespace webrtc
OLDNEW
« webrtc/video/video_send_stream.cc ('K') | « 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