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 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 SsMap::iterator ss_it; | 208 SsMap::iterator ss_it; |
209 if (Find(frame_it.second->TimeStamp(), &ss_it)) { | 209 if (Find(frame_it.second->TimeStamp(), &ss_it)) { |
210 if (gof_idx >= ss_it->second.num_frames_in_gof) { | 210 if (gof_idx >= ss_it->second.num_frames_in_gof) { |
211 continue; // Assume corresponding SS not yet received. | 211 continue; // Assume corresponding SS not yet received. |
212 } | 212 } |
213 frame_it.second->SetGofInfo(ss_it->second, gof_idx); | 213 frame_it.second->SetGofInfo(ss_it->second, gof_idx); |
214 } | 214 } |
215 } | 215 } |
216 } | 216 } |
217 | 217 |
218 static NackModule* | |
219 MaybeCreateNackModule(Clock* clock, | |
220 NackSender* nack_sender, | |
221 KeyFrameRequestSender* keyframe_request_sender) { | |
222 if (field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == "Enabled") { | |
223 // Only create a nack module if a nack sender is available. | |
224 if (nack_sender) { | |
225 RTC_DCHECK(keyframe_request_sender); | |
226 return new NackModule(clock, nack_sender, keyframe_request_sender); | |
227 } | |
228 } | |
229 return nullptr; | |
230 } | |
231 | |
232 VCMJitterBuffer::VCMJitterBuffer(Clock* clock, | 218 VCMJitterBuffer::VCMJitterBuffer(Clock* clock, |
233 std::unique_ptr<EventWrapper> event, | 219 std::unique_ptr<EventWrapper> event, |
234 NackSender* nack_sender, | 220 NackSender* nack_sender, |
235 KeyFrameRequestSender* keyframe_request_sender) | 221 KeyFrameRequestSender* keyframe_request_sender) |
236 : clock_(clock), | 222 : clock_(clock), |
237 running_(false), | 223 running_(false), |
238 crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), | 224 crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), |
239 frame_event_(std::move(event)), | 225 frame_event_(std::move(event)), |
240 max_number_of_frames_(kStartNumberOfFrames), | 226 max_number_of_frames_(kStartNumberOfFrames), |
241 free_frames_(), | 227 free_frames_(), |
(...skipping 17 matching lines...) Expand all Loading... |
259 rtt_ms_(kDefaultRtt), | 245 rtt_ms_(kDefaultRtt), |
260 nack_mode_(kNoNack), | 246 nack_mode_(kNoNack), |
261 low_rtt_nack_threshold_ms_(-1), | 247 low_rtt_nack_threshold_ms_(-1), |
262 high_rtt_nack_threshold_ms_(-1), | 248 high_rtt_nack_threshold_ms_(-1), |
263 missing_sequence_numbers_(SequenceNumberLessThan()), | 249 missing_sequence_numbers_(SequenceNumberLessThan()), |
264 max_nack_list_size_(0), | 250 max_nack_list_size_(0), |
265 max_packet_age_to_nack_(0), | 251 max_packet_age_to_nack_(0), |
266 max_incomplete_time_ms_(0), | 252 max_incomplete_time_ms_(0), |
267 decode_error_mode_(kNoErrors), | 253 decode_error_mode_(kNoErrors), |
268 average_packets_per_frame_(0.0f), | 254 average_packets_per_frame_(0.0f), |
269 frame_counter_(0), | 255 frame_counter_(0) { |
270 nack_module_(MaybeCreateNackModule(clock, | |
271 nack_sender, | |
272 keyframe_request_sender)) { | |
273 for (int i = 0; i < kStartNumberOfFrames; i++) | 256 for (int i = 0; i < kStartNumberOfFrames; i++) |
274 free_frames_.push_back(new VCMFrameBuffer()); | 257 free_frames_.push_back(new VCMFrameBuffer()); |
275 } | 258 } |
276 | 259 |
277 VCMJitterBuffer::~VCMJitterBuffer() { | 260 VCMJitterBuffer::~VCMJitterBuffer() { |
278 Stop(); | 261 Stop(); |
279 for (UnorderedFrameList::iterator it = free_frames_.begin(); | 262 for (UnorderedFrameList::iterator it = free_frames_.begin(); |
280 it != free_frames_.end(); ++it) { | 263 it != free_frames_.end(); ++it) { |
281 delete *it; | 264 delete *it; |
282 } | 265 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 first_packet_since_reset_ = true; | 325 first_packet_since_reset_ = true; |
343 rtt_ms_ = kDefaultRtt; | 326 rtt_ms_ = kDefaultRtt; |
344 last_decoded_state_.Reset(); | 327 last_decoded_state_.Reset(); |
345 } | 328 } |
346 | 329 |
347 void VCMJitterBuffer::Stop() { | 330 void VCMJitterBuffer::Stop() { |
348 crit_sect_->Enter(); | 331 crit_sect_->Enter(); |
349 UpdateHistograms(); | 332 UpdateHistograms(); |
350 running_ = false; | 333 running_ = false; |
351 last_decoded_state_.Reset(); | 334 last_decoded_state_.Reset(); |
352 if (nack_module_) | |
353 nack_module_->Stop(); | |
354 | 335 |
355 // Make sure all frames are free and reset. | 336 // Make sure all frames are free and reset. |
356 for (FrameList::iterator it = decodable_frames_.begin(); | 337 for (FrameList::iterator it = decodable_frames_.begin(); |
357 it != decodable_frames_.end(); ++it) { | 338 it != decodable_frames_.end(); ++it) { |
358 free_frames_.push_back(it->second); | 339 free_frames_.push_back(it->second); |
359 } | 340 } |
360 for (FrameList::iterator it = incomplete_frames_.begin(); | 341 for (FrameList::iterator it = incomplete_frames_.begin(); |
361 it != incomplete_frames_.end(); ++it) { | 342 it != incomplete_frames_.end(); ++it) { |
362 free_frames_.push_back(it->second); | 343 free_frames_.push_back(it->second); |
363 } | 344 } |
(...skipping 20 matching lines...) Expand all Loading... |
384 last_decoded_state_.Reset(); // TODO(mikhal): sync reset. | 365 last_decoded_state_.Reset(); // TODO(mikhal): sync reset. |
385 num_consecutive_old_packets_ = 0; | 366 num_consecutive_old_packets_ = 0; |
386 // Also reset the jitter and delay estimates | 367 // Also reset the jitter and delay estimates |
387 jitter_estimate_.Reset(); | 368 jitter_estimate_.Reset(); |
388 inter_frame_delay_.Reset(clock_->TimeInMilliseconds()); | 369 inter_frame_delay_.Reset(clock_->TimeInMilliseconds()); |
389 waiting_for_completion_.frame_size = 0; | 370 waiting_for_completion_.frame_size = 0; |
390 waiting_for_completion_.timestamp = 0; | 371 waiting_for_completion_.timestamp = 0; |
391 waiting_for_completion_.latest_packet_time = -1; | 372 waiting_for_completion_.latest_packet_time = -1; |
392 first_packet_since_reset_ = true; | 373 first_packet_since_reset_ = true; |
393 missing_sequence_numbers_.clear(); | 374 missing_sequence_numbers_.clear(); |
394 if (nack_module_) | |
395 nack_module_->Clear(); | |
396 } | 375 } |
397 | 376 |
398 // Get received key and delta frames | 377 // Get received key and delta frames |
399 FrameCounts VCMJitterBuffer::FrameStatistics() const { | 378 FrameCounts VCMJitterBuffer::FrameStatistics() const { |
400 CriticalSectionScoped cs(crit_sect_); | 379 CriticalSectionScoped cs(crit_sect_); |
401 return receive_statistics_; | 380 return receive_statistics_; |
402 } | 381 } |
403 | 382 |
404 int VCMJitterBuffer::num_packets() const { | 383 int VCMJitterBuffer::num_packets() const { |
405 CriticalSectionScoped cs(crit_sect_); | 384 CriticalSectionScoped cs(crit_sect_); |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 // decoder. Propagates the missing_frame bit. | 581 // decoder. Propagates the missing_frame bit. |
603 frame->PrepareForDecode(continuous); | 582 frame->PrepareForDecode(continuous); |
604 | 583 |
605 // We have a frame - update the last decoded state and nack list. | 584 // We have a frame - update the last decoded state and nack list. |
606 last_decoded_state_.SetState(frame); | 585 last_decoded_state_.SetState(frame); |
607 DropPacketsFromNackList(last_decoded_state_.sequence_num()); | 586 DropPacketsFromNackList(last_decoded_state_.sequence_num()); |
608 | 587 |
609 if ((*frame).IsSessionComplete()) | 588 if ((*frame).IsSessionComplete()) |
610 UpdateAveragePacketsPerFrame(frame->NumPackets()); | 589 UpdateAveragePacketsPerFrame(frame->NumPackets()); |
611 | 590 |
612 if (nack_module_) | |
613 nack_module_->ClearUpTo(frame->GetHighSeqNum()); | |
614 return frame; | 591 return frame; |
615 } | 592 } |
616 | 593 |
617 // Release frame when done with decoding. Should never be used to release | 594 // Release frame when done with decoding. Should never be used to release |
618 // frames from within the jitter buffer. | 595 // frames from within the jitter buffer. |
619 void VCMJitterBuffer::ReleaseFrame(VCMEncodedFrame* frame) { | 596 void VCMJitterBuffer::ReleaseFrame(VCMEncodedFrame* frame) { |
620 CriticalSectionScoped cs(crit_sect_); | 597 CriticalSectionScoped cs(crit_sect_); |
621 VCMFrameBuffer* frame_buffer = static_cast<VCMFrameBuffer*>(frame); | 598 VCMFrameBuffer* frame_buffer = static_cast<VCMFrameBuffer*>(frame); |
622 if (frame_buffer) { | 599 if (frame_buffer) { |
623 free_frames_.push_back(frame_buffer); | 600 free_frames_.push_back(frame_buffer); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 const VCMFrameBuffer* frame_buffer = | 641 const VCMFrameBuffer* frame_buffer = |
665 static_cast<const VCMFrameBuffer*>(frame); | 642 static_cast<const VCMFrameBuffer*>(frame); |
666 *retransmitted = (frame_buffer->GetNackCount() > 0); | 643 *retransmitted = (frame_buffer->GetNackCount() > 0); |
667 return frame_buffer->LatestPacketTimeMs(); | 644 return frame_buffer->LatestPacketTimeMs(); |
668 } | 645 } |
669 | 646 |
670 VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet, | 647 VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet, |
671 bool* retransmitted) { | 648 bool* retransmitted) { |
672 CriticalSectionScoped cs(crit_sect_); | 649 CriticalSectionScoped cs(crit_sect_); |
673 | 650 |
674 if (nack_module_) | |
675 nack_module_->OnReceivedPacket(packet); | |
676 | |
677 ++num_packets_; | 651 ++num_packets_; |
678 if (num_packets_ == 1) { | 652 if (num_packets_ == 1) { |
679 time_first_packet_ms_ = clock_->TimeInMilliseconds(); | 653 time_first_packet_ms_ = clock_->TimeInMilliseconds(); |
680 } | 654 } |
681 // Does this packet belong to an old frame? | 655 // Does this packet belong to an old frame? |
682 if (last_decoded_state_.IsOldPacket(&packet)) { | 656 if (last_decoded_state_.IsOldPacket(&packet)) { |
683 // Account only for media packets. | 657 // Account only for media packets. |
684 if (packet.sizeBytes > 0) { | 658 if (packet.sizeBytes > 0) { |
685 num_discarded_packets_++; | 659 num_discarded_packets_++; |
686 num_consecutive_old_packets_++; | 660 num_consecutive_old_packets_++; |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
929 // when waiting for retransmissions. | 903 // when waiting for retransmissions. |
930 rtt_mult = 0.0f; | 904 rtt_mult = 0.0f; |
931 } | 905 } |
932 return jitter_estimate_.GetJitterEstimate(rtt_mult); | 906 return jitter_estimate_.GetJitterEstimate(rtt_mult); |
933 } | 907 } |
934 | 908 |
935 void VCMJitterBuffer::UpdateRtt(int64_t rtt_ms) { | 909 void VCMJitterBuffer::UpdateRtt(int64_t rtt_ms) { |
936 CriticalSectionScoped cs(crit_sect_); | 910 CriticalSectionScoped cs(crit_sect_); |
937 rtt_ms_ = rtt_ms; | 911 rtt_ms_ = rtt_ms; |
938 jitter_estimate_.UpdateRtt(rtt_ms); | 912 jitter_estimate_.UpdateRtt(rtt_ms); |
939 if (nack_module_) | |
940 nack_module_->UpdateRtt(rtt_ms); | |
941 if (!WaitForRetransmissions()) | 913 if (!WaitForRetransmissions()) |
942 jitter_estimate_.ResetNackCount(); | 914 jitter_estimate_.ResetNackCount(); |
943 } | 915 } |
944 | 916 |
945 void VCMJitterBuffer::SetNackMode(VCMNackMode mode, | 917 void VCMJitterBuffer::SetNackMode(VCMNackMode mode, |
946 int64_t low_rtt_nack_threshold_ms, | 918 int64_t low_rtt_nack_threshold_ms, |
947 int64_t high_rtt_nack_threshold_ms) { | 919 int64_t high_rtt_nack_threshold_ms) { |
948 CriticalSectionScoped cs(crit_sect_); | 920 CriticalSectionScoped cs(crit_sect_); |
949 nack_mode_ = mode; | 921 nack_mode_ = mode; |
950 if (mode == kNoNack) { | 922 if (mode == kNoNack) { |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1052 } else { | 1024 } else { |
1053 // Skip to the last key frame. If it's incomplete we will start | 1025 // Skip to the last key frame. If it's incomplete we will start |
1054 // NACKing it. | 1026 // NACKing it. |
1055 // Note that the estimated low sequence number is correct for VP8 | 1027 // Note that the estimated low sequence number is correct for VP8 |
1056 // streams because only the first packet of a key frame is marked. | 1028 // streams because only the first packet of a key frame is marked. |
1057 last_decoded_state_.Reset(); | 1029 last_decoded_state_.Reset(); |
1058 DropPacketsFromNackList(EstimatedLowSequenceNumber(*rit->second)); | 1030 DropPacketsFromNackList(EstimatedLowSequenceNumber(*rit->second)); |
1059 } | 1031 } |
1060 } | 1032 } |
1061 } | 1033 } |
1062 // The experiment is running, the nack module will send Nacks. | |
1063 // The reason we allow the major part of the GetNackList function to | |
1064 // run even if we are running the experiment is because this | |
1065 // function is also used to signal that the jitter buffer wants to | |
1066 // request a keyframe. | |
1067 if (nack_module_) | |
1068 return std::vector<uint16_t>(); | |
1069 | |
1070 std::vector<uint16_t> nack_list(missing_sequence_numbers_.begin(), | 1034 std::vector<uint16_t> nack_list(missing_sequence_numbers_.begin(), |
1071 missing_sequence_numbers_.end()); | 1035 missing_sequence_numbers_.end()); |
1072 return nack_list; | 1036 return nack_list; |
1073 } | 1037 } |
1074 | 1038 |
1075 void VCMJitterBuffer::SetDecodeErrorMode(VCMDecodeErrorMode error_mode) { | 1039 void VCMJitterBuffer::SetDecodeErrorMode(VCMDecodeErrorMode error_mode) { |
1076 CriticalSectionScoped cs(crit_sect_); | 1040 CriticalSectionScoped cs(crit_sect_); |
1077 decode_error_mode_ = error_mode; | 1041 decode_error_mode_ = error_mode; |
1078 } | 1042 } |
1079 | 1043 |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1344 } | 1308 } |
1345 // Evaluate if the RTT is higher than |high_rtt_nack_threshold_ms_|, and in | 1309 // Evaluate if the RTT is higher than |high_rtt_nack_threshold_ms_|, and in |
1346 // that case we don't wait for retransmissions. | 1310 // that case we don't wait for retransmissions. |
1347 if (high_rtt_nack_threshold_ms_ >= 0 && | 1311 if (high_rtt_nack_threshold_ms_ >= 0 && |
1348 rtt_ms_ >= high_rtt_nack_threshold_ms_) { | 1312 rtt_ms_ >= high_rtt_nack_threshold_ms_) { |
1349 return false; | 1313 return false; |
1350 } | 1314 } |
1351 return true; | 1315 return true; |
1352 } | 1316 } |
1353 | 1317 |
1354 int64_t VCMJitterBuffer::TimeUntilNextProcess() { | |
1355 if (nack_module_) | |
1356 return nack_module_->TimeUntilNextProcess(); | |
1357 return std::numeric_limits<int64_t>::max(); | |
1358 } | |
1359 | |
1360 void VCMJitterBuffer::Process() { | |
1361 if (nack_module_) | |
1362 nack_module_->Process(); | |
1363 } | |
1364 } // namespace webrtc | 1318 } // namespace webrtc |
OLD | NEW |