| 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/jitter_buffer.h" | 10 #include "webrtc/modules/video_coding/jitter_buffer.h" |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 } else { | 468 } else { |
| 469 // No frames since last call | 469 // No frames since last call |
| 470 time_last_incoming_frame_count_ = clock_->TimeInMilliseconds(); | 470 time_last_incoming_frame_count_ = clock_->TimeInMilliseconds(); |
| 471 *framerate = 0; | 471 *framerate = 0; |
| 472 *bitrate = 0; | 472 *bitrate = 0; |
| 473 incoming_frame_rate_ = 0; | 473 incoming_frame_rate_ = 0; |
| 474 incoming_bit_rate_ = 0; | 474 incoming_bit_rate_ = 0; |
| 475 } | 475 } |
| 476 } | 476 } |
| 477 | 477 |
| 478 // Answers the question: | |
| 479 // Will the packet sequence be complete if the next frame is grabbed for | |
| 480 // decoding right now? That is, have we lost a frame between the last decoded | |
| 481 // frame and the next, or is the next | |
| 482 // frame missing one or more packets? | |
| 483 bool VCMJitterBuffer::CompleteSequenceWithNextFrame() { | |
| 484 CriticalSectionScoped cs(crit_sect_); | |
| 485 // Finding oldest frame ready for decoder, check sequence number and size | |
| 486 CleanUpOldOrEmptyFrames(); | |
| 487 if (!decodable_frames_.empty()) { | |
| 488 if (decodable_frames_.Front()->GetState() == kStateComplete) { | |
| 489 return true; | |
| 490 } | |
| 491 } else if (incomplete_frames_.size() <= 1) { | |
| 492 // Frame not ready to be decoded. | |
| 493 return true; | |
| 494 } | |
| 495 return false; | |
| 496 } | |
| 497 | |
| 498 // Returns immediately or a |max_wait_time_ms| ms event hang waiting for a | 478 // Returns immediately or a |max_wait_time_ms| ms event hang waiting for a |
| 499 // complete frame, |max_wait_time_ms| decided by caller. | 479 // complete frame, |max_wait_time_ms| decided by caller. |
| 500 VCMEncodedFrame* VCMJitterBuffer::NextCompleteFrame(uint32_t max_wait_time_ms) { | 480 VCMEncodedFrame* VCMJitterBuffer::NextCompleteFrame(uint32_t max_wait_time_ms) { |
| 501 crit_sect_->Enter(); | 481 crit_sect_->Enter(); |
| 502 if (!running_) { | 482 if (!running_) { |
| 503 crit_sect_->Leave(); | 483 crit_sect_->Leave(); |
| 504 return nullptr; | 484 return nullptr; |
| 505 } | 485 } |
| 506 CleanUpOldOrEmptyFrames(); | 486 CleanUpOldOrEmptyFrames(); |
| 507 | 487 |
| (...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1184 | 1164 |
| 1185 void VCMJitterBuffer::DropPacketsFromNackList( | 1165 void VCMJitterBuffer::DropPacketsFromNackList( |
| 1186 uint16_t last_decoded_sequence_number) { | 1166 uint16_t last_decoded_sequence_number) { |
| 1187 // Erase all sequence numbers from the NACK list which we won't need any | 1167 // Erase all sequence numbers from the NACK list which we won't need any |
| 1188 // longer. | 1168 // longer. |
| 1189 missing_sequence_numbers_.erase( | 1169 missing_sequence_numbers_.erase( |
| 1190 missing_sequence_numbers_.begin(), | 1170 missing_sequence_numbers_.begin(), |
| 1191 missing_sequence_numbers_.upper_bound(last_decoded_sequence_number)); | 1171 missing_sequence_numbers_.upper_bound(last_decoded_sequence_number)); |
| 1192 } | 1172 } |
| 1193 | 1173 |
| 1194 int64_t VCMJitterBuffer::LastDecodedTimestamp() const { | |
| 1195 CriticalSectionScoped cs(crit_sect_); | |
| 1196 return last_decoded_state_.time_stamp(); | |
| 1197 } | |
| 1198 | |
| 1199 void VCMJitterBuffer::RegisterStatsCallback( | 1174 void VCMJitterBuffer::RegisterStatsCallback( |
| 1200 VCMReceiveStatisticsCallback* callback) { | 1175 VCMReceiveStatisticsCallback* callback) { |
| 1201 CriticalSectionScoped cs(crit_sect_); | 1176 CriticalSectionScoped cs(crit_sect_); |
| 1202 stats_callback_ = callback; | 1177 stats_callback_ = callback; |
| 1203 } | 1178 } |
| 1204 | 1179 |
| 1205 VCMFrameBuffer* VCMJitterBuffer::GetEmptyFrame() { | 1180 VCMFrameBuffer* VCMJitterBuffer::GetEmptyFrame() { |
| 1206 if (free_frames_.empty()) { | 1181 if (free_frames_.empty()) { |
| 1207 if (!TryToIncreaseJitterBufferSize()) { | 1182 if (!TryToIncreaseJitterBufferSize()) { |
| 1208 return NULL; | 1183 return NULL; |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1380 if (nack_module_) | 1355 if (nack_module_) |
| 1381 return nack_module_->TimeUntilNextProcess(); | 1356 return nack_module_->TimeUntilNextProcess(); |
| 1382 return std::numeric_limits<int64_t>::max(); | 1357 return std::numeric_limits<int64_t>::max(); |
| 1383 } | 1358 } |
| 1384 | 1359 |
| 1385 void VCMJitterBuffer::Process() { | 1360 void VCMJitterBuffer::Process() { |
| 1386 if (nack_module_) | 1361 if (nack_module_) |
| 1387 nack_module_->Process(); | 1362 nack_module_->Process(); |
| 1388 } | 1363 } |
| 1389 } // namespace webrtc | 1364 } // namespace webrtc |
| OLD | NEW |