OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 } | 122 } |
123 | 123 |
124 int32_t VideoReceiver::SetReceiveChannelParameters(int64_t rtt) { | 124 int32_t VideoReceiver::SetReceiveChannelParameters(int64_t rtt) { |
125 rtc::CritScope cs(&receive_crit_); | 125 rtc::CritScope cs(&receive_crit_); |
126 _receiver.UpdateRtt(rtt); | 126 _receiver.UpdateRtt(rtt); |
127 return 0; | 127 return 0; |
128 } | 128 } |
129 | 129 |
130 // Enable or disable a video protection method. | 130 // Enable or disable a video protection method. |
131 // Note: This API should be deprecated, as it does not offer a distinction | 131 // Note: This API should be deprecated, as it does not offer a distinction |
132 // between the protection method and decoding with or without errors. If such a | 132 // between the protection method and decoding with or without errors. |
133 // behavior is desired, use the following API: SetReceiverRobustnessMode. | |
134 int32_t VideoReceiver::SetVideoProtection(VCMVideoProtection videoProtection, | 133 int32_t VideoReceiver::SetVideoProtection(VCMVideoProtection videoProtection, |
135 bool enable) { | 134 bool enable) { |
136 // By default, do not decode with errors. | 135 // By default, do not decode with errors. |
137 _receiver.SetDecodeErrorMode(kNoErrors); | 136 _receiver.SetDecodeErrorMode(kNoErrors); |
138 switch (videoProtection) { | 137 switch (videoProtection) { |
139 case kProtectionNack: { | 138 case kProtectionNack: { |
140 RTC_DCHECK(enable); | 139 RTC_DCHECK(enable); |
141 _receiver.SetNackMode(kNack, -1, -1); | 140 _receiver.SetNackMode(kNack, -1, -1); |
142 break; | 141 break; |
143 } | 142 } |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 _timing->set_render_delay(timeMS); | 404 _timing->set_render_delay(timeMS); |
406 return VCM_OK; | 405 return VCM_OK; |
407 } | 406 } |
408 | 407 |
409 // Current video delay | 408 // Current video delay |
410 int32_t VideoReceiver::Delay() const { | 409 int32_t VideoReceiver::Delay() const { |
411 return _timing->TargetVideoDelay(); | 410 return _timing->TargetVideoDelay(); |
412 } | 411 } |
413 | 412 |
414 int VideoReceiver::SetReceiverRobustnessMode( | 413 int VideoReceiver::SetReceiverRobustnessMode( |
415 ReceiverRobustness robustnessMode, | 414 VideoCodingModule::ReceiverRobustness robustnessMode, |
416 VCMDecodeErrorMode decode_error_mode) { | 415 VCMDecodeErrorMode decode_error_mode) { |
| 416 RTC_DCHECK(construction_thread_.CalledOnValidThread()); |
| 417 // TODO(tommi): This method must only be called when the decoder thread |
| 418 // is not running and we don't need to hold this lock. |
417 rtc::CritScope cs(&receive_crit_); | 419 rtc::CritScope cs(&receive_crit_); |
418 switch (robustnessMode) { | 420 switch (robustnessMode) { |
419 case VideoCodingModule::kNone: | 421 case VideoCodingModule::kNone: |
420 _receiver.SetNackMode(kNoNack, -1, -1); | 422 _receiver.SetNackMode(kNoNack, -1, -1); |
421 break; | 423 break; |
422 case VideoCodingModule::kHardNack: | 424 case VideoCodingModule::kHardNack: |
423 // Always wait for retransmissions (except when decoding with errors). | 425 // Always wait for retransmissions (except when decoding with errors). |
424 _receiver.SetNackMode(kNack, -1, -1); | 426 _receiver.SetNackMode(kNack, -1, -1); |
425 break; | 427 break; |
426 case VideoCodingModule::kSoftNack: | 428 default: |
427 #if 1 | 429 RTC_NOTREACHED(); |
428 assert(false); // TODO(hlundin): Not completed. | 430 return VCM_PARAMETER_ERROR; |
429 return VCM_NOT_IMPLEMENTED; | |
430 #else | |
431 // Enable hybrid NACK/FEC. Always wait for retransmissions and don't add | |
432 // extra delay when RTT is above kLowRttNackMs. | |
433 _receiver.SetNackMode(kNack, media_optimization::kLowRttNackMs, -1); | |
434 break; | |
435 #endif | |
436 case VideoCodingModule::kReferenceSelection: | |
437 #if 1 | |
438 assert(false); // TODO(hlundin): Not completed. | |
439 return VCM_NOT_IMPLEMENTED; | |
440 #else | |
441 if (decode_error_mode == kNoErrors) { | |
442 return VCM_PARAMETER_ERROR; | |
443 } | |
444 _receiver.SetNackMode(kNoNack, -1, -1); | |
445 break; | |
446 #endif | |
447 } | 431 } |
448 _receiver.SetDecodeErrorMode(decode_error_mode); | 432 _receiver.SetDecodeErrorMode(decode_error_mode); |
449 return VCM_OK; | 433 return VCM_OK; |
450 } | 434 } |
451 | 435 |
452 void VideoReceiver::SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode) { | 436 void VideoReceiver::SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode) { |
453 rtc::CritScope cs(&receive_crit_); | 437 rtc::CritScope cs(&receive_crit_); |
454 _receiver.SetDecodeErrorMode(decode_error_mode); | 438 _receiver.SetDecodeErrorMode(decode_error_mode); |
455 } | 439 } |
456 | 440 |
457 void VideoReceiver::SetNackSettings(size_t max_nack_list_size, | 441 void VideoReceiver::SetNackSettings(size_t max_nack_list_size, |
458 int max_packet_age_to_nack, | 442 int max_packet_age_to_nack, |
459 int max_incomplete_time_ms) { | 443 int max_incomplete_time_ms) { |
460 if (max_nack_list_size != 0) { | 444 if (max_nack_list_size != 0) { |
461 rtc::CritScope cs(&process_crit_); | 445 rtc::CritScope cs(&process_crit_); |
462 max_nack_list_size_ = max_nack_list_size; | 446 max_nack_list_size_ = max_nack_list_size; |
463 } | 447 } |
464 _receiver.SetNackSettings(max_nack_list_size, max_packet_age_to_nack, | 448 _receiver.SetNackSettings(max_nack_list_size, max_packet_age_to_nack, |
465 max_incomplete_time_ms); | 449 max_incomplete_time_ms); |
466 } | 450 } |
467 | 451 |
468 int VideoReceiver::SetMinReceiverDelay(int desired_delay_ms) { | 452 int VideoReceiver::SetMinReceiverDelay(int desired_delay_ms) { |
469 return _receiver.SetMinReceiverDelay(desired_delay_ms); | 453 return _receiver.SetMinReceiverDelay(desired_delay_ms); |
470 } | 454 } |
471 | 455 |
472 } // namespace vcm | 456 } // namespace vcm |
473 } // namespace webrtc | 457 } // namespace webrtc |
OLD | NEW |