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 24 matching lines...) Expand all Loading... | |
35 _frameTypeCallback(NULL), | 35 _frameTypeCallback(NULL), |
36 _receiveStatsCallback(NULL), | 36 _receiveStatsCallback(NULL), |
37 _decoderTimingCallback(NULL), | 37 _decoderTimingCallback(NULL), |
38 _packetRequestCallback(NULL), | 38 _packetRequestCallback(NULL), |
39 render_buffer_callback_(NULL), | 39 render_buffer_callback_(NULL), |
40 _decoder(NULL), | 40 _decoder(NULL), |
41 #ifdef DEBUG_DECODER_BIT_STREAM | 41 #ifdef DEBUG_DECODER_BIT_STREAM |
42 _bitStreamBeforeDecoder(NULL), | 42 _bitStreamBeforeDecoder(NULL), |
43 #endif | 43 #endif |
44 _frameFromFile(), | 44 _frameFromFile(), |
45 _keyRequestMode(kKeyOnError), | |
46 _scheduleKeyRequest(false), | 45 _scheduleKeyRequest(false), |
47 max_nack_list_size_(0), | 46 max_nack_list_size_(0), |
48 pre_decode_image_callback_(NULL), | 47 pre_decode_image_callback_(NULL), |
49 _codecDataBase(NULL), | 48 _codecDataBase(NULL), |
50 _receiveStatsTimer(1000, clock_), | 49 _receiveStatsTimer(1000, clock_), |
51 _retransmissionTimer(10, clock_), | 50 _retransmissionTimer(10, clock_), |
52 _keyRequestTimer(500, clock_) { | 51 _keyRequestTimer(500, clock_) { |
53 assert(clock_); | 52 assert(clock_); |
54 #ifdef DEBUG_DECODER_BIT_STREAM | 53 #ifdef DEBUG_DECODER_BIT_STREAM |
55 _bitStreamBeforeDecoder = fopen("decoderBitStream.bit", "wb"); | 54 _bitStreamBeforeDecoder = fopen("decoderBitStream.bit", "wb"); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
187 bool enable) { | 186 bool enable) { |
188 // By default, do not decode with errors. | 187 // By default, do not decode with errors. |
189 _receiver.SetDecodeErrorMode(kNoErrors); | 188 _receiver.SetDecodeErrorMode(kNoErrors); |
190 switch (videoProtection) { | 189 switch (videoProtection) { |
191 case kProtectionNack: { | 190 case kProtectionNack: { |
192 DCHECK(enable); | 191 DCHECK(enable); |
193 _receiver.SetNackMode(kNack, -1, -1); | 192 _receiver.SetNackMode(kNack, -1, -1); |
194 break; | 193 break; |
195 } | 194 } |
196 | 195 |
197 case kProtectionKeyOnLoss: { | |
198 CriticalSectionScoped cs(_receiveCritSect); | |
199 if (enable) { | |
200 _keyRequestMode = kKeyOnLoss; | |
201 _receiver.SetDecodeErrorMode(kWithErrors); | |
202 } else if (_keyRequestMode == kKeyOnLoss) { | |
203 _keyRequestMode = kKeyOnError; // default mode | |
204 } else { | |
205 return VCM_PARAMETER_ERROR; | |
206 } | |
207 break; | |
208 } | |
209 | |
210 case kProtectionKeyOnKeyLoss: { | |
211 CriticalSectionScoped cs(_receiveCritSect); | |
212 if (enable) { | |
213 _keyRequestMode = kKeyOnKeyLoss; | |
214 } else if (_keyRequestMode == kKeyOnKeyLoss) { | |
215 _keyRequestMode = kKeyOnError; // default mode | |
216 } else { | |
217 return VCM_PARAMETER_ERROR; | |
218 } | |
219 break; | |
220 } | |
221 | |
222 case kProtectionNackFEC: { | 196 case kProtectionNackFEC: { |
223 CriticalSectionScoped cs(_receiveCritSect); | 197 CriticalSectionScoped cs(_receiveCritSect); |
224 DCHECK(enable); | 198 DCHECK(enable); |
225 _receiver.SetNackMode(kNack, media_optimization::kLowRttNackMs, -1); | 199 _receiver.SetNackMode(kNack, media_optimization::kLowRttNackMs, -1); |
226 _receiver.SetDecodeErrorMode(kNoErrors); | 200 _receiver.SetDecodeErrorMode(kNoErrors); |
227 break; | 201 break; |
228 } | 202 } |
229 case kProtectionFEC: | 203 case kProtectionFEC: |
230 case kProtectionNone: | 204 case kProtectionNone: |
231 // No receiver-side protection. | 205 // No receiver-side protection. |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
412 return RequestSliceLossIndication( | 386 return RequestSliceLossIndication( |
413 _decodedFrameCallback.LastReceivedPictureID() + 1); | 387 _decodedFrameCallback.LastReceivedPictureID() + 1); |
414 } else { | 388 } else { |
415 request_key_frame = true; | 389 request_key_frame = true; |
416 } | 390 } |
417 } else if (ret == VCM_REQUEST_SLI) { | 391 } else if (ret == VCM_REQUEST_SLI) { |
418 ret = RequestSliceLossIndication( | 392 ret = RequestSliceLossIndication( |
419 _decodedFrameCallback.LastReceivedPictureID() + 1); | 393 _decodedFrameCallback.LastReceivedPictureID() + 1); |
420 } | 394 } |
421 if (!frame.Complete() || frame.MissingFrame()) { | 395 if (!frame.Complete() || frame.MissingFrame()) { |
422 switch (_keyRequestMode) { | 396 request_key_frame = true; |
stefan-webrtc
2015/07/27 13:01:08
Not sure about this change. I think I'd prefer for
pbos-webrtc
2015/07/27 13:05:11
Right now it's a no-op since this mode was always
| |
423 case kKeyOnKeyLoss: { | 397 ret = VCM_OK; |
424 if (frame.FrameType() == kVideoFrameKey) { | |
425 request_key_frame = true; | |
426 ret = VCM_OK; | |
427 } | |
428 break; | |
429 } | |
430 case kKeyOnLoss: { | |
431 request_key_frame = true; | |
432 ret = VCM_OK; | |
433 break; | |
434 } | |
435 default: | |
436 break; | |
437 } | |
438 } | 398 } |
439 if (request_key_frame) { | 399 if (request_key_frame) { |
440 CriticalSectionScoped cs(process_crit_sect_.get()); | 400 CriticalSectionScoped cs(process_crit_sect_.get()); |
441 _scheduleKeyRequest = true; | 401 _scheduleKeyRequest = true; |
442 } | 402 } |
443 TRACE_EVENT_ASYNC_END0("webrtc", "Video", frame.TimeStamp()); | 403 TRACE_EVENT_ASYNC_END0("webrtc", "Video", frame.TimeStamp()); |
444 return ret; | 404 return ret; |
445 } | 405 } |
446 | 406 |
447 // Reset the decoder state | 407 // Reset the decoder state |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
545 return _receiver.DiscardedPackets(); | 505 return _receiver.DiscardedPackets(); |
546 } | 506 } |
547 | 507 |
548 int VideoReceiver::SetReceiverRobustnessMode( | 508 int VideoReceiver::SetReceiverRobustnessMode( |
549 ReceiverRobustness robustnessMode, | 509 ReceiverRobustness robustnessMode, |
550 VCMDecodeErrorMode decode_error_mode) { | 510 VCMDecodeErrorMode decode_error_mode) { |
551 CriticalSectionScoped cs(_receiveCritSect); | 511 CriticalSectionScoped cs(_receiveCritSect); |
552 switch (robustnessMode) { | 512 switch (robustnessMode) { |
553 case VideoCodingModule::kNone: | 513 case VideoCodingModule::kNone: |
554 _receiver.SetNackMode(kNoNack, -1, -1); | 514 _receiver.SetNackMode(kNoNack, -1, -1); |
555 if (decode_error_mode == kNoErrors) { | |
556 _keyRequestMode = kKeyOnLoss; | |
557 } else { | |
558 _keyRequestMode = kKeyOnError; | |
559 } | |
560 break; | 515 break; |
561 case VideoCodingModule::kHardNack: | 516 case VideoCodingModule::kHardNack: |
562 // Always wait for retransmissions (except when decoding with errors). | 517 // Always wait for retransmissions (except when decoding with errors). |
563 _receiver.SetNackMode(kNack, -1, -1); | 518 _receiver.SetNackMode(kNack, -1, -1); |
564 _keyRequestMode = kKeyOnError; // TODO(hlundin): On long NACK list? | |
565 break; | 519 break; |
566 case VideoCodingModule::kSoftNack: | 520 case VideoCodingModule::kSoftNack: |
567 #if 1 | 521 #if 1 |
568 assert(false); // TODO(hlundin): Not completed. | 522 assert(false); // TODO(hlundin): Not completed. |
569 return VCM_NOT_IMPLEMENTED; | 523 return VCM_NOT_IMPLEMENTED; |
570 #else | 524 #else |
571 // Enable hybrid NACK/FEC. Always wait for retransmissions and don't add | 525 // Enable hybrid NACK/FEC. Always wait for retransmissions and don't add |
572 // extra delay when RTT is above kLowRttNackMs. | 526 // extra delay when RTT is above kLowRttNackMs. |
573 _receiver.SetNackMode(kNack, media_optimization::kLowRttNackMs, -1); | 527 _receiver.SetNackMode(kNack, media_optimization::kLowRttNackMs, -1); |
574 _keyRequestMode = kKeyOnError; | |
575 break; | 528 break; |
576 #endif | 529 #endif |
577 case VideoCodingModule::kReferenceSelection: | 530 case VideoCodingModule::kReferenceSelection: |
578 #if 1 | 531 #if 1 |
579 assert(false); // TODO(hlundin): Not completed. | 532 assert(false); // TODO(hlundin): Not completed. |
580 return VCM_NOT_IMPLEMENTED; | 533 return VCM_NOT_IMPLEMENTED; |
581 #else | 534 #else |
582 if (decode_error_mode == kNoErrors) { | 535 if (decode_error_mode == kNoErrors) { |
583 return VCM_PARAMETER_ERROR; | 536 return VCM_PARAMETER_ERROR; |
584 } | 537 } |
(...skipping 26 matching lines...) Expand all Loading... | |
611 } | 564 } |
612 | 565 |
613 void VideoReceiver::RegisterPreDecodeImageCallback( | 566 void VideoReceiver::RegisterPreDecodeImageCallback( |
614 EncodedImageCallback* observer) { | 567 EncodedImageCallback* observer) { |
615 CriticalSectionScoped cs(_receiveCritSect); | 568 CriticalSectionScoped cs(_receiveCritSect); |
616 pre_decode_image_callback_ = observer; | 569 pre_decode_image_callback_ = observer; |
617 } | 570 } |
618 | 571 |
619 } // namespace vcm | 572 } // namespace vcm |
620 } // namespace webrtc | 573 } // namespace webrtc |
OLD | NEW |