| OLD | NEW |
| 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 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 } | 165 } |
| 166 | 166 |
| 167 bool PacketBuffer::PotentialNewFrame(uint16_t seq_num) const { | 167 bool PacketBuffer::PotentialNewFrame(uint16_t seq_num) const { |
| 168 size_t index = seq_num % size_; | 168 size_t index = seq_num % size_; |
| 169 int prev_index = index > 0 ? index - 1 : size_ - 1; | 169 int prev_index = index > 0 ? index - 1 : size_ - 1; |
| 170 | 170 |
| 171 if (!sequence_buffer_[index].used) | 171 if (!sequence_buffer_[index].used) |
| 172 return false; | 172 return false; |
| 173 if (sequence_buffer_[index].frame_created) | 173 if (sequence_buffer_[index].frame_created) |
| 174 return false; | 174 return false; |
| 175 if (sequence_buffer_[index].frame_begin && | 175 if (sequence_buffer_[index].frame_begin) |
| 176 (!sequence_buffer_[prev_index].used || | |
| 177 AheadOf(seq_num, sequence_buffer_[prev_index].seq_num))) { | |
| 178 // The reason we only return true if this packet is the first packet of the | |
| 179 // frame and the sequence number is newer than the packet with the previous | |
| 180 // index is because we want to avoid an inifite loop in the case where | |
| 181 // a single frame containing more packets than the current size of the | |
| 182 // packet buffer is inserted. | |
| 183 return true; | 176 return true; |
| 184 } | |
| 185 if (!sequence_buffer_[prev_index].used) | 177 if (!sequence_buffer_[prev_index].used) |
| 186 return false; | 178 return false; |
| 187 if (sequence_buffer_[prev_index].seq_num != | 179 if (sequence_buffer_[prev_index].seq_num != |
| 188 sequence_buffer_[index].seq_num - 1) { | 180 sequence_buffer_[index].seq_num - 1) { |
| 189 return false; | 181 return false; |
| 190 } | 182 } |
| 191 if (sequence_buffer_[prev_index].continuous) | 183 if (sequence_buffer_[prev_index].continuous) |
| 192 return true; | 184 return true; |
| 193 | 185 |
| 194 return false; | 186 return false; |
| 195 } | 187 } |
| 196 | 188 |
| 197 std::vector<std::unique_ptr<RtpFrameObject>> PacketBuffer::FindFrames( | 189 std::vector<std::unique_ptr<RtpFrameObject>> PacketBuffer::FindFrames( |
| 198 uint16_t seq_num) { | 190 uint16_t seq_num) { |
| 199 std::vector<std::unique_ptr<RtpFrameObject>> found_frames; | 191 std::vector<std::unique_ptr<RtpFrameObject>> found_frames; |
| 200 while (PotentialNewFrame(seq_num)) { | 192 size_t packets_tested = 0; |
| 193 while (packets_tested < size_ && PotentialNewFrame(seq_num)) { |
| 201 size_t index = seq_num % size_; | 194 size_t index = seq_num % size_; |
| 202 sequence_buffer_[index].continuous = true; | 195 sequence_buffer_[index].continuous = true; |
| 203 | 196 |
| 204 // If all packets of the frame is continuous, find the first packet of the | 197 // If all packets of the frame is continuous, find the first packet of the |
| 205 // frame and create an RtpFrameObject. | 198 // frame and create an RtpFrameObject. |
| 206 if (sequence_buffer_[index].frame_end) { | 199 if (sequence_buffer_[index].frame_end) { |
| 207 size_t frame_size = 0; | 200 size_t frame_size = 0; |
| 208 int max_nack_count = -1; | 201 int max_nack_count = -1; |
| 209 uint16_t start_seq_num = seq_num; | 202 uint16_t start_seq_num = seq_num; |
| 210 | 203 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 222 | 215 |
| 223 start_index = start_index > 0 ? start_index - 1 : size_ - 1; | 216 start_index = start_index > 0 ? start_index - 1 : size_ - 1; |
| 224 start_seq_num--; | 217 start_seq_num--; |
| 225 } | 218 } |
| 226 | 219 |
| 227 found_frames.emplace_back( | 220 found_frames.emplace_back( |
| 228 new RtpFrameObject(this, start_seq_num, seq_num, frame_size, | 221 new RtpFrameObject(this, start_seq_num, seq_num, frame_size, |
| 229 max_nack_count, clock_->TimeInMilliseconds())); | 222 max_nack_count, clock_->TimeInMilliseconds())); |
| 230 } | 223 } |
| 231 ++seq_num; | 224 ++seq_num; |
| 225 ++packets_tested; |
| 232 } | 226 } |
| 233 return found_frames; | 227 return found_frames; |
| 234 } | 228 } |
| 235 | 229 |
| 236 void PacketBuffer::ReturnFrame(RtpFrameObject* frame) { | 230 void PacketBuffer::ReturnFrame(RtpFrameObject* frame) { |
| 237 rtc::CritScope lock(&crit_); | 231 rtc::CritScope lock(&crit_); |
| 238 size_t index = frame->first_seq_num() % size_; | 232 size_t index = frame->first_seq_num() % size_; |
| 239 size_t end = (frame->last_seq_num() + 1) % size_; | 233 size_t end = (frame->last_seq_num() + 1) % size_; |
| 240 uint16_t seq_num = frame->first_seq_num(); | 234 uint16_t seq_num = frame->first_seq_num(); |
| 241 while (index != end) { | 235 while (index != end) { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 int PacketBuffer::Release() const { | 283 int PacketBuffer::Release() const { |
| 290 int count = rtc::AtomicOps::Decrement(&ref_count_); | 284 int count = rtc::AtomicOps::Decrement(&ref_count_); |
| 291 if (!count) { | 285 if (!count) { |
| 292 delete this; | 286 delete this; |
| 293 } | 287 } |
| 294 return count; | 288 return count; |
| 295 } | 289 } |
| 296 | 290 |
| 297 } // namespace video_coding | 291 } // namespace video_coding |
| 298 } // namespace webrtc | 292 } // namespace webrtc |
| OLD | NEW |