Chromium Code Reviews| 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 #include "webrtc/modules/video_coding/main/source/jitter_buffer.h" | 10 #include "webrtc/modules/video_coding/main/source/jitter_buffer.h" |
| (...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 933 | 933 |
| 934 VCMFrameBuffer* VCMJitterBuffer::NextFrame() const { | 934 VCMFrameBuffer* VCMJitterBuffer::NextFrame() const { |
| 935 if (!decodable_frames_.empty()) | 935 if (!decodable_frames_.empty()) |
| 936 return decodable_frames_.Front(); | 936 return decodable_frames_.Front(); |
| 937 if (!incomplete_frames_.empty()) | 937 if (!incomplete_frames_.empty()) |
| 938 return incomplete_frames_.Front(); | 938 return incomplete_frames_.Front(); |
| 939 return NULL; | 939 return NULL; |
| 940 } | 940 } |
| 941 | 941 |
| 942 bool VCMJitterBuffer::UpdateNackList(uint16_t sequence_number) { | 942 bool VCMJitterBuffer::UpdateNackList(uint16_t sequence_number) { |
| 943 if (nack_mode_ == kNoNack) { | |
| 944 return true; | |
| 945 } | |
| 946 // Make sure we don't add packets which are already too old to be decoded. | 943 // Make sure we don't add packets which are already too old to be decoded. |
| 947 if (!last_decoded_state_.in_initial_state()) { | 944 if (!last_decoded_state_.in_initial_state()) { |
| 948 latest_received_sequence_number_ = LatestSequenceNumber( | 945 latest_received_sequence_number_ = LatestSequenceNumber( |
| 949 latest_received_sequence_number_, | 946 latest_received_sequence_number_, |
| 950 last_decoded_state_.sequence_num()); | 947 last_decoded_state_.sequence_num()); |
| 951 } | 948 } |
| 952 if (IsNewerSequenceNumber(sequence_number, | 949 if (IsNewerSequenceNumber(sequence_number, |
| 953 latest_received_sequence_number_)) { | 950 latest_received_sequence_number_)) { |
| 951 if (nack_mode_ == kNoNack) { | |
| 952 // Packets missing but NACK disabled, request key frame. | |
|
pbos-webrtc
2015/06/26 05:01:02
Should we request a keyframe even though the seque
joachim
2015/06/26 07:46:01
I'm not sure how to check if the sequence is decod
| |
| 953 return false; | |
| 954 } | |
| 954 // Push any missing sequence numbers to the NACK list. | 955 // Push any missing sequence numbers to the NACK list. |
| 955 for (uint16_t i = latest_received_sequence_number_ + 1; | 956 for (uint16_t i = latest_received_sequence_number_ + 1; |
| 956 IsNewerSequenceNumber(sequence_number, i); ++i) { | 957 IsNewerSequenceNumber(sequence_number, i); ++i) { |
| 957 missing_sequence_numbers_.insert(missing_sequence_numbers_.end(), i); | 958 missing_sequence_numbers_.insert(missing_sequence_numbers_.end(), i); |
| 958 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "AddNack", | 959 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "AddNack", |
| 959 "seqnum", i); | 960 "seqnum", i); |
| 960 } | 961 } |
| 961 if (TooLargeNackList() && !HandleTooLargeNackList()) { | 962 if (TooLargeNackList() && !HandleTooLargeNackList()) { |
| 962 LOG(LS_WARNING) << "Requesting key frame due to too large NACK list."; | 963 LOG(LS_WARNING) << "Requesting key frame due to too large NACK list."; |
| 963 return false; | 964 return false; |
| 964 } | 965 } |
| 965 if (MissingTooOldPacket(sequence_number) && | 966 if (MissingTooOldPacket(sequence_number) && |
| 966 !HandleTooOldPackets(sequence_number)) { | 967 !HandleTooOldPackets(sequence_number)) { |
| 967 LOG(LS_WARNING) << "Requesting key frame due to missing too old packets"; | 968 LOG(LS_WARNING) << "Requesting key frame due to missing too old packets"; |
| 968 return false; | 969 return false; |
| 969 } | 970 } |
| 970 } else { | 971 } else if (nack_mode_ != kNoNack) { |
| 971 missing_sequence_numbers_.erase(sequence_number); | 972 missing_sequence_numbers_.erase(sequence_number); |
| 972 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RemoveNack", | 973 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RemoveNack", |
| 973 "seqnum", sequence_number); | 974 "seqnum", sequence_number); |
| 974 } | 975 } |
| 975 return true; | 976 return true; |
| 976 } | 977 } |
| 977 | 978 |
| 978 bool VCMJitterBuffer::TooLargeNackList() const { | 979 bool VCMJitterBuffer::TooLargeNackList() const { |
| 979 return missing_sequence_numbers_.size() > max_nack_list_size_; | 980 return missing_sequence_numbers_.size() > max_nack_list_size_; |
| 980 } | 981 } |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1215 } | 1216 } |
| 1216 // Evaluate if the RTT is higher than |high_rtt_nack_threshold_ms_|, and in | 1217 // Evaluate if the RTT is higher than |high_rtt_nack_threshold_ms_|, and in |
| 1217 // that case we don't wait for retransmissions. | 1218 // that case we don't wait for retransmissions. |
| 1218 if (high_rtt_nack_threshold_ms_ >= 0 && | 1219 if (high_rtt_nack_threshold_ms_ >= 0 && |
| 1219 rtt_ms_ >= high_rtt_nack_threshold_ms_) { | 1220 rtt_ms_ >= high_rtt_nack_threshold_ms_) { |
| 1220 return false; | 1221 return false; |
| 1221 } | 1222 } |
| 1222 return true; | 1223 return true; |
| 1223 } | 1224 } |
| 1224 } // namespace webrtc | 1225 } // namespace webrtc |
| OLD | NEW |