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

Side by Side Diff: webrtc/modules/video_coding/rtp_frame_reference_finder.cc

Issue 2708593003: Advance picture id of keyframe if the stream has been continuous without a new keyframe for a while. (Closed)
Patch Set: . Created 3 years, 10 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) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 105
106 // While there still are padding packets and those padding packets are 106 // While there still are padding packets and those padding packets are
107 // continuous, then advance the "last-picture-id-with-padding" and remove 107 // continuous, then advance the "last-picture-id-with-padding" and remove
108 // the stashed padding packet. 108 // the stashed padding packet.
109 while (padding_seq_num_it != stashed_padding_.end() && 109 while (padding_seq_num_it != stashed_padding_.end() &&
110 *padding_seq_num_it == next_seq_num_with_padding) { 110 *padding_seq_num_it == next_seq_num_with_padding) {
111 gop_seq_num_it->second.second = next_seq_num_with_padding; 111 gop_seq_num_it->second.second = next_seq_num_with_padding;
112 ++next_seq_num_with_padding; 112 ++next_seq_num_with_padding;
113 padding_seq_num_it = stashed_padding_.erase(padding_seq_num_it); 113 padding_seq_num_it = stashed_padding_.erase(padding_seq_num_it);
114 } 114 }
115
116 // In the case where the stream has been continuous without any new keyframes
117 // for a while there is a risk that new frames will appear to be older than
118 // the keyframe they belong to due to wrapping sequence number. In order
119 // to prevent this we advance the picture id of the keyframe every so often.
120 if (ForwardDiff(gop_seq_num_it->first, seq_num) > 10000) {
121 RTC_DCHECK_EQ(1ul, last_seq_num_gop_.size());
122 last_seq_num_gop_[seq_num] = gop_seq_num_it->second;
123 last_seq_num_gop_.erase(gop_seq_num_it);
124 }
115 } 125 }
116 126
117 void RtpFrameReferenceFinder::RetryStashedFrames() { 127 void RtpFrameReferenceFinder::RetryStashedFrames() {
118 size_t num_stashed_frames = stashed_frames_.size(); 128 size_t num_stashed_frames = stashed_frames_.size();
119 129
120 // Clean up stashed frames if there are too many. 130 // Clean up stashed frames if there are too many.
121 while (stashed_frames_.size() > kMaxStashedFrames) 131 while (stashed_frames_.size() > kMaxStashedFrames)
122 stashed_frames_.pop_front(); 132 stashed_frames_.pop_front();
123 133
124 // Since frames are stashed if there is not enough data to determine their 134 // Since frames are stashed if there is not enough data to determine their
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 167
158 // We have received a frame but not yet a keyframe, stash this frame. 168 // We have received a frame but not yet a keyframe, stash this frame.
159 if (last_seq_num_gop_.empty()) { 169 if (last_seq_num_gop_.empty()) {
160 stashed_frames_.push_back(std::move(frame)); 170 stashed_frames_.push_back(std::move(frame));
161 return; 171 return;
162 } 172 }
163 173
164 // Clean up info for old keyframes but make sure to keep info 174 // Clean up info for old keyframes but make sure to keep info
165 // for the last keyframe. 175 // for the last keyframe.
166 auto clean_to = last_seq_num_gop_.lower_bound(frame->last_seq_num() - 100); 176 auto clean_to = last_seq_num_gop_.lower_bound(frame->last_seq_num() - 100);
167 if (clean_to != last_seq_num_gop_.end()) 177 for (auto it = last_seq_num_gop_.begin();
168 last_seq_num_gop_.erase(last_seq_num_gop_.begin(), clean_to); 178 it != clean_to && last_seq_num_gop_.size() > 1;) {
179 it = last_seq_num_gop_.erase(it);
180 }
169 181
170 // Find the last sequence number of the last frame for the keyframe 182 // Find the last sequence number of the last frame for the keyframe
171 // that this frame indirectly references. 183 // that this frame indirectly references.
172 auto seq_num_it = last_seq_num_gop_.upper_bound(frame->last_seq_num()); 184 auto seq_num_it = last_seq_num_gop_.upper_bound(frame->last_seq_num());
173 if (seq_num_it == last_seq_num_gop_.begin()) { 185 if (seq_num_it == last_seq_num_gop_.begin()) {
174 LOG(LS_WARNING) << "Generic frame with packet range [" 186 LOG(LS_WARNING) << "Generic frame with packet range ["
175 << frame->first_seq_num() << ", " << frame->last_seq_num() 187 << frame->first_seq_num() << ", " << frame->last_seq_num()
176 << "] has no Gop, dropping frame."; 188 << "] has no GoP, dropping frame.";
177 return; 189 return;
178 } 190 }
179 seq_num_it--; 191 seq_num_it--;
180 192
181 // Make sure the packet sequence numbers are continuous, otherwise stash 193 // Make sure the packet sequence numbers are continuous, otherwise stash
182 // this frame. 194 // this frame.
183 uint16_t last_picture_id_gop = seq_num_it->second.first; 195 uint16_t last_picture_id_gop = seq_num_it->second.first;
184 uint16_t last_picture_id_with_padding_gop = seq_num_it->second.second; 196 uint16_t last_picture_id_with_padding_gop = seq_num_it->second.second;
185 if (frame->frame_type() == kVideoFrameDelta) { 197 if (frame->frame_type() == kVideoFrameDelta) {
186 uint16_t prev_seq_num = frame->first_seq_num() - 1; 198 uint16_t prev_seq_num = frame->first_seq_num() - 1;
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after
729 if (!gof_info_.empty() && 741 if (!gof_info_.empty() &&
730 AheadOf<uint8_t>(gof_info_.begin()->first, fixed_tl0)) { 742 AheadOf<uint8_t>(gof_info_.begin()->first, fixed_tl0)) {
731 return true; 743 return true;
732 } 744 }
733 } 745 }
734 return false; 746 return false;
735 } 747 }
736 748
737 } // namespace video_coding 749 } // namespace video_coding
738 } // namespace webrtc 750 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698