jitter_buffer.cc (31331B)
1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 #include "modules/video_coding/deprecated/jitter_buffer.h" 11 12 #include <algorithm> 13 #include <cstddef> 14 #include <cstdint> 15 #include <memory> 16 #include <optional> 17 #include <utility> 18 #include <vector> 19 20 #include "api/field_trials_view.h" 21 #include "api/units/data_size.h" 22 #include "api/units/timestamp.h" 23 #include "api/video/video_frame_type.h" 24 #include "modules/include/module_common_types_public.h" 25 #include "modules/video_coding/deprecated/decoding_state.h" 26 #include "modules/video_coding/deprecated/event_wrapper.h" 27 #include "modules/video_coding/deprecated/frame_buffer.h" 28 #include "modules/video_coding/deprecated/jitter_buffer_common.h" 29 #include "modules/video_coding/deprecated/packet.h" 30 #include "modules/video_coding/deprecated/session_info.h" 31 #include "modules/video_coding/timing/inter_frame_delay_variation_calculator.h" 32 #include "modules/video_coding/timing/jitter_estimator.h" 33 #include "rtc_base/checks.h" 34 #include "rtc_base/logging.h" 35 #include "rtc_base/synchronization/mutex.h" 36 #include "system_wrappers/include/clock.h" 37 38 namespace webrtc { 39 // Use this rtt if no value has been reported. 40 static const int64_t kDefaultRtt = 200; 41 42 typedef std::pair<uint32_t, VCMFrameBuffer*> FrameListPair; 43 44 bool IsKeyFrame(FrameListPair pair) { 45 return pair.second->FrameType() == VideoFrameType::kVideoFrameKey; 46 } 47 48 bool HasNonEmptyState(FrameListPair pair) { 49 return pair.second->GetState() != kStateEmpty; 50 } 51 52 void FrameList::InsertFrame(VCMFrameBuffer* frame) { 53 insert(rbegin().base(), FrameListPair(frame->RtpTimestamp(), frame)); 54 } 55 56 VCMFrameBuffer* FrameList::PopFrame(uint32_t timestamp) { 57 FrameList::iterator it = find(timestamp); 58 if (it == end()) 59 return nullptr; 60 VCMFrameBuffer* frame = it->second; 61 erase(it); 62 return frame; 63 } 64 65 VCMFrameBuffer* FrameList::Front() const { 66 return begin()->second; 67 } 68 69 VCMFrameBuffer* FrameList::Back() const { 70 return rbegin()->second; 71 } 72 73 int FrameList::RecycleFramesUntilKeyFrame(FrameList::iterator* key_frame_it, 74 UnorderedFrameList* free_frames) { 75 int drop_count = 0; 76 FrameList::iterator it = begin(); 77 while (!empty()) { 78 // Throw at least one frame. 79 it->second->Reset(); 80 free_frames->push_back(it->second); 81 erase(it++); 82 ++drop_count; 83 if (it != end() && 84 it->second->FrameType() == VideoFrameType::kVideoFrameKey) { 85 *key_frame_it = it; 86 return drop_count; 87 } 88 } 89 *key_frame_it = end(); 90 return drop_count; 91 } 92 93 void FrameList::CleanUpOldOrEmptyFrames(VCMDecodingState* decoding_state, 94 UnorderedFrameList* free_frames) { 95 while (!empty()) { 96 VCMFrameBuffer* oldest_frame = Front(); 97 bool remove_frame = false; 98 if (oldest_frame->GetState() == kStateEmpty && size() > 1) { 99 // This frame is empty, try to update the last decoded state and drop it 100 // if successful. 101 remove_frame = decoding_state->UpdateEmptyFrame(oldest_frame); 102 } else { 103 remove_frame = decoding_state->IsOldFrame(oldest_frame); 104 } 105 if (!remove_frame) { 106 break; 107 } 108 free_frames->push_back(oldest_frame); 109 erase(begin()); 110 } 111 } 112 113 void FrameList::Reset(UnorderedFrameList* free_frames) { 114 while (!empty()) { 115 begin()->second->Reset(); 116 free_frames->push_back(begin()->second); 117 erase(begin()); 118 } 119 } 120 121 VCMJitterBuffer::VCMJitterBuffer(Clock* clock, 122 std::unique_ptr<EventWrapper> event, 123 const FieldTrialsView& field_trials) 124 : clock_(clock), 125 running_(false), 126 frame_event_(std::move(event)), 127 max_number_of_frames_(kStartNumberOfFrames), 128 free_frames_(), 129 decodable_frames_(), 130 incomplete_frames_(), 131 last_decoded_state_(), 132 first_packet_since_reset_(true), 133 num_consecutive_old_packets_(0), 134 num_packets_(0), 135 num_duplicated_packets_(0), 136 jitter_estimate_(clock, field_trials), 137 missing_sequence_numbers_(SequenceNumberLessThan()), 138 latest_received_sequence_number_(0), 139 max_nack_list_size_(0), 140 max_packet_age_to_nack_(0), 141 max_incomplete_time_ms_(0), 142 average_packets_per_frame_(0.0f), 143 frame_counter_(0) { 144 for (int i = 0; i < kStartNumberOfFrames; i++) 145 free_frames_.push_back(new VCMFrameBuffer()); 146 } 147 148 VCMJitterBuffer::~VCMJitterBuffer() { 149 Stop(); 150 for (UnorderedFrameList::iterator it = free_frames_.begin(); 151 it != free_frames_.end(); ++it) { 152 delete *it; 153 } 154 for (FrameList::iterator it = incomplete_frames_.begin(); 155 it != incomplete_frames_.end(); ++it) { 156 delete it->second; 157 } 158 for (FrameList::iterator it = decodable_frames_.begin(); 159 it != decodable_frames_.end(); ++it) { 160 delete it->second; 161 } 162 } 163 164 void VCMJitterBuffer::Start() { 165 MutexLock lock(&mutex_); 166 running_ = true; 167 168 num_consecutive_old_packets_ = 0; 169 num_packets_ = 0; 170 num_duplicated_packets_ = 0; 171 172 // Start in a non-signaled state. 173 waiting_for_completion_.frame_size = 0; 174 waiting_for_completion_.timestamp = 0; 175 waiting_for_completion_.latest_packet_time = -1; 176 first_packet_since_reset_ = true; 177 last_decoded_state_.Reset(); 178 179 decodable_frames_.Reset(&free_frames_); 180 incomplete_frames_.Reset(&free_frames_); 181 } 182 183 void VCMJitterBuffer::Stop() { 184 MutexLock lock(&mutex_); 185 running_ = false; 186 last_decoded_state_.Reset(); 187 188 // Make sure we wake up any threads waiting on these events. 189 frame_event_->Set(); 190 } 191 192 bool VCMJitterBuffer::Running() const { 193 MutexLock lock(&mutex_); 194 return running_; 195 } 196 197 void VCMJitterBuffer::Flush() { 198 MutexLock lock(&mutex_); 199 FlushInternal(); 200 } 201 202 void VCMJitterBuffer::FlushInternal() { 203 decodable_frames_.Reset(&free_frames_); 204 incomplete_frames_.Reset(&free_frames_); 205 last_decoded_state_.Reset(); // TODO(mikhal): sync reset. 206 num_consecutive_old_packets_ = 0; 207 // Also reset the jitter and delay estimates 208 jitter_estimate_.Reset(); 209 inter_frame_delay_.Reset(); 210 waiting_for_completion_.frame_size = 0; 211 waiting_for_completion_.timestamp = 0; 212 waiting_for_completion_.latest_packet_time = -1; 213 first_packet_since_reset_ = true; 214 missing_sequence_numbers_.clear(); 215 } 216 217 int VCMJitterBuffer::num_packets() const { 218 MutexLock lock(&mutex_); 219 return num_packets_; 220 } 221 222 int VCMJitterBuffer::num_duplicated_packets() const { 223 MutexLock lock(&mutex_); 224 return num_duplicated_packets_; 225 } 226 227 // Returns immediately or a `max_wait_time_ms` ms event hang waiting for a 228 // complete frame, `max_wait_time_ms` decided by caller. 229 VCMEncodedFrame* VCMJitterBuffer::NextCompleteFrame(uint32_t max_wait_time_ms) { 230 MutexLock lock(&mutex_); 231 if (!running_) { 232 return nullptr; 233 } 234 CleanUpOldOrEmptyFrames(); 235 236 if (decodable_frames_.empty() || 237 decodable_frames_.Front()->GetState() != kStateComplete) { 238 const int64_t end_wait_time_ms = 239 clock_->TimeInMilliseconds() + max_wait_time_ms; 240 int64_t wait_time_ms = max_wait_time_ms; 241 while (wait_time_ms > 0) { 242 mutex_.Unlock(); 243 const EventTypeWrapper ret = 244 frame_event_->Wait(static_cast<uint32_t>(wait_time_ms)); 245 mutex_.Lock(); 246 if (ret == kEventSignaled) { 247 // Are we shutting down the jitter buffer? 248 if (!running_) { 249 return nullptr; 250 } 251 // Finding oldest frame ready for decoder. 252 CleanUpOldOrEmptyFrames(); 253 if (decodable_frames_.empty() || 254 decodable_frames_.Front()->GetState() != kStateComplete) { 255 wait_time_ms = end_wait_time_ms - clock_->TimeInMilliseconds(); 256 } else { 257 break; 258 } 259 } else { 260 break; 261 } 262 } 263 } 264 if (decodable_frames_.empty() || 265 decodable_frames_.Front()->GetState() != kStateComplete) { 266 return nullptr; 267 } 268 return decodable_frames_.Front(); 269 } 270 271 VCMEncodedFrame* VCMJitterBuffer::ExtractAndSetDecode(uint32_t timestamp) { 272 MutexLock lock(&mutex_); 273 if (!running_) { 274 return nullptr; 275 } 276 // Extract the frame with the desired timestamp. 277 VCMFrameBuffer* frame = decodable_frames_.PopFrame(timestamp); 278 bool continuous = true; 279 if (!frame) { 280 frame = incomplete_frames_.PopFrame(timestamp); 281 if (frame) 282 continuous = last_decoded_state_.ContinuousFrame(frame); 283 else 284 return nullptr; 285 } 286 // Frame pulled out from jitter buffer, update the jitter estimate. 287 const bool retransmitted = (frame->GetNackCount() > 0); 288 if (retransmitted) { 289 jitter_estimate_.FrameNacked(); 290 } else if (frame->size() > 0) { 291 // Ignore retransmitted and empty frames. 292 if (waiting_for_completion_.latest_packet_time >= 0) { 293 UpdateJitterEstimate(waiting_for_completion_, true); 294 } 295 if (frame->GetState() == kStateComplete) { 296 UpdateJitterEstimate(*frame, false); 297 } else { 298 // Wait for this one to get complete. 299 waiting_for_completion_.frame_size = frame->size(); 300 waiting_for_completion_.latest_packet_time = frame->LatestPacketTimeMs(); 301 waiting_for_completion_.timestamp = frame->RtpTimestamp(); 302 } 303 } 304 305 // The state must be changed to decoding before cleaning up zero sized 306 // frames to avoid empty frames being cleaned up and then given to the 307 // decoder. Propagates the missing_frame bit. 308 frame->PrepareForDecode(continuous); 309 310 // We have a frame - update the last decoded state and nack list. 311 last_decoded_state_.SetState(frame); 312 DropPacketsFromNackList(last_decoded_state_.sequence_num()); 313 314 UpdateAveragePacketsPerFrame(frame->NumPackets()); 315 316 return frame; 317 } 318 319 // Release frame when done with decoding. Should never be used to release 320 // frames from within the jitter buffer. 321 void VCMJitterBuffer::ReleaseFrame(VCMEncodedFrame* frame) { 322 RTC_CHECK(frame != nullptr); 323 MutexLock lock(&mutex_); 324 VCMFrameBuffer* frame_buffer = static_cast<VCMFrameBuffer*>(frame); 325 RecycleFrameBuffer(frame_buffer); 326 } 327 328 // Gets frame to use for this timestamp. If no match, get empty frame. 329 VCMFrameBufferEnum VCMJitterBuffer::GetFrame(const VCMPacket& packet, 330 VCMFrameBuffer** frame, 331 FrameList** frame_list) { 332 *frame = incomplete_frames_.PopFrame(packet.timestamp); 333 if (*frame != nullptr) { 334 *frame_list = &incomplete_frames_; 335 return kNoError; 336 } 337 *frame = decodable_frames_.PopFrame(packet.timestamp); 338 if (*frame != nullptr) { 339 *frame_list = &decodable_frames_; 340 return kNoError; 341 } 342 343 *frame_list = nullptr; 344 // No match, return empty frame. 345 *frame = GetEmptyFrame(); 346 if (*frame == nullptr) { 347 // No free frame! Try to reclaim some... 348 RTC_LOG(LS_WARNING) << "Unable to get empty frame; Recycling."; 349 bool found_key_frame = RecycleFramesUntilKeyFrame(); 350 *frame = GetEmptyFrame(); 351 RTC_CHECK(*frame); 352 if (!found_key_frame) { 353 RecycleFrameBuffer(*frame); 354 return kFlushIndicator; 355 } 356 } 357 (*frame)->Reset(); 358 return kNoError; 359 } 360 361 int64_t VCMJitterBuffer::LastPacketTime(const VCMEncodedFrame* frame, 362 bool* retransmitted) const { 363 RTC_DCHECK(retransmitted); 364 MutexLock lock(&mutex_); 365 const VCMFrameBuffer* frame_buffer = 366 static_cast<const VCMFrameBuffer*>(frame); 367 *retransmitted = (frame_buffer->GetNackCount() > 0); 368 return frame_buffer->LatestPacketTimeMs(); 369 } 370 371 VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet, 372 bool* retransmitted) { 373 MutexLock lock(&mutex_); 374 375 ++num_packets_; 376 // Does this packet belong to an old frame? 377 if (last_decoded_state_.IsOldPacket(&packet)) { 378 // Account only for media packets. 379 if (packet.sizeBytes > 0) { 380 num_consecutive_old_packets_++; 381 } 382 // Update last decoded sequence number if the packet arrived late and 383 // belongs to a frame with a timestamp equal to the last decoded 384 // timestamp. 385 last_decoded_state_.UpdateOldPacket(&packet); 386 DropPacketsFromNackList(last_decoded_state_.sequence_num()); 387 388 // Also see if this old packet made more incomplete frames continuous. 389 FindAndInsertContinuousFramesWithState(last_decoded_state_); 390 391 if (num_consecutive_old_packets_ > kMaxConsecutiveOldPackets) { 392 RTC_LOG(LS_WARNING) 393 << num_consecutive_old_packets_ 394 << " consecutive old packets received. Flushing the jitter buffer."; 395 FlushInternal(); 396 return kFlushIndicator; 397 } 398 return kOldPacket; 399 } 400 401 num_consecutive_old_packets_ = 0; 402 403 VCMFrameBuffer* frame; 404 FrameList* frame_list; 405 const VCMFrameBufferEnum error = GetFrame(packet, &frame, &frame_list); 406 if (error != kNoError) 407 return error; 408 409 Timestamp now = clock_->CurrentTime(); 410 // We are keeping track of the first and latest seq numbers, and 411 // the number of wraps to be able to calculate how many packets we expect. 412 if (first_packet_since_reset_) { 413 // Now it's time to start estimating jitter 414 // reset the delay estimate. 415 inter_frame_delay_.Reset(); 416 } 417 418 // Empty packets may bias the jitter estimate (lacking size component), 419 // therefore don't let empty packet trigger the following updates: 420 if (packet.video_header.frame_type != VideoFrameType::kEmptyFrame) { 421 if (waiting_for_completion_.timestamp == packet.timestamp) { 422 // This can get bad if we have a lot of duplicate packets, 423 // we will then count some packet multiple times. 424 waiting_for_completion_.frame_size += packet.sizeBytes; 425 waiting_for_completion_.latest_packet_time = now.ms(); 426 } else if (waiting_for_completion_.latest_packet_time >= 0 && 427 waiting_for_completion_.latest_packet_time + 2000 <= now.ms()) { 428 // A packet should never be more than two seconds late 429 UpdateJitterEstimate(waiting_for_completion_, true); 430 waiting_for_completion_.latest_packet_time = -1; 431 waiting_for_completion_.frame_size = 0; 432 waiting_for_completion_.timestamp = 0; 433 } 434 } 435 436 VCMFrameBufferStateEnum previous_state = frame->GetState(); 437 // Insert packet. 438 FrameData frame_data; 439 frame_data.rtt_ms = kDefaultRtt; 440 frame_data.rolling_average_packets_per_frame = average_packets_per_frame_; 441 VCMFrameBufferEnum buffer_state = 442 frame->InsertPacket(packet, now.ms(), frame_data); 443 444 if (buffer_state > 0) { 445 if (first_packet_since_reset_) { 446 latest_received_sequence_number_ = packet.seqNum; 447 first_packet_since_reset_ = false; 448 } else { 449 if (IsPacketRetransmitted(packet)) { 450 frame->IncrementNackCount(); 451 } 452 if (!UpdateNackList(packet.seqNum) && 453 packet.video_header.frame_type != VideoFrameType::kVideoFrameKey) { 454 buffer_state = kFlushIndicator; 455 } 456 457 latest_received_sequence_number_ = 458 LatestSequenceNumber(latest_received_sequence_number_, packet.seqNum); 459 } 460 } 461 462 // Is the frame already in the decodable list? 463 bool continuous = IsContinuous(*frame); 464 switch (buffer_state) { 465 case kGeneralError: 466 case kTimeStampError: 467 case kSizeError: { 468 RecycleFrameBuffer(frame); 469 break; 470 } 471 case kCompleteSession: { 472 if (previous_state != kStateComplete) { 473 if (continuous) { 474 // Signal that we have a complete session. 475 frame_event_->Set(); 476 } 477 } 478 479 *retransmitted = (frame->GetNackCount() > 0); 480 if (continuous) { 481 decodable_frames_.InsertFrame(frame); 482 FindAndInsertContinuousFrames(*frame); 483 } else { 484 incomplete_frames_.InsertFrame(frame); 485 } 486 break; 487 } 488 case kIncomplete: { 489 if (frame->GetState() == kStateEmpty && 490 last_decoded_state_.UpdateEmptyFrame(frame)) { 491 RecycleFrameBuffer(frame); 492 return kNoError; 493 } else { 494 incomplete_frames_.InsertFrame(frame); 495 } 496 break; 497 } 498 case kNoError: 499 case kOutOfBoundsPacket: 500 case kDuplicatePacket: { 501 // Put back the frame where it came from. 502 if (frame_list != nullptr) { 503 frame_list->InsertFrame(frame); 504 } else { 505 RecycleFrameBuffer(frame); 506 } 507 ++num_duplicated_packets_; 508 break; 509 } 510 case kFlushIndicator: 511 RecycleFrameBuffer(frame); 512 return kFlushIndicator; 513 default: 514 RTC_DCHECK_NOTREACHED(); 515 } 516 return buffer_state; 517 } 518 519 bool VCMJitterBuffer::IsContinuousInState( 520 const VCMFrameBuffer& frame, 521 const VCMDecodingState& decoding_state) const { 522 // Is this frame complete and continuous? 523 return (frame.GetState() == kStateComplete) && 524 decoding_state.ContinuousFrame(&frame); 525 } 526 527 bool VCMJitterBuffer::IsContinuous(const VCMFrameBuffer& frame) const { 528 if (IsContinuousInState(frame, last_decoded_state_)) { 529 return true; 530 } 531 VCMDecodingState decoding_state; 532 decoding_state.CopyFrom(last_decoded_state_); 533 for (FrameList::const_iterator it = decodable_frames_.begin(); 534 it != decodable_frames_.end(); ++it) { 535 VCMFrameBuffer* decodable_frame = it->second; 536 if (IsNewerTimestamp(decodable_frame->RtpTimestamp(), 537 frame.RtpTimestamp())) { 538 break; 539 } 540 decoding_state.SetState(decodable_frame); 541 if (IsContinuousInState(frame, decoding_state)) { 542 return true; 543 } 544 } 545 return false; 546 } 547 548 void VCMJitterBuffer::FindAndInsertContinuousFrames( 549 const VCMFrameBuffer& new_frame) { 550 VCMDecodingState decoding_state; 551 decoding_state.CopyFrom(last_decoded_state_); 552 decoding_state.SetState(&new_frame); 553 FindAndInsertContinuousFramesWithState(decoding_state); 554 } 555 556 void VCMJitterBuffer::FindAndInsertContinuousFramesWithState( 557 const VCMDecodingState& original_decoded_state) { 558 // Copy original_decoded_state so we can move the state forward with each 559 // decodable frame we find. 560 VCMDecodingState decoding_state; 561 decoding_state.CopyFrom(original_decoded_state); 562 563 // When temporal layers are available, we search for a complete or decodable 564 // frame until we hit one of the following: 565 // 1. Continuous base or sync layer. 566 // 2. The end of the list was reached. 567 for (FrameList::iterator it = incomplete_frames_.begin(); 568 it != incomplete_frames_.end();) { 569 VCMFrameBuffer* frame = it->second; 570 if (IsNewerTimestamp(original_decoded_state.time_stamp(), 571 frame->RtpTimestamp())) { 572 ++it; 573 continue; 574 } 575 if (IsContinuousInState(*frame, decoding_state)) { 576 decodable_frames_.InsertFrame(frame); 577 incomplete_frames_.erase(it++); 578 decoding_state.SetState(frame); 579 } else if (frame->TemporalId() <= 0) { 580 break; 581 } else { 582 ++it; 583 } 584 } 585 } 586 587 uint32_t VCMJitterBuffer::EstimatedJitterMs() { 588 MutexLock lock(&mutex_); 589 const double rtt_mult = 1.0f; 590 return jitter_estimate_.GetJitterEstimate(rtt_mult, std::nullopt).ms(); 591 } 592 593 void VCMJitterBuffer::SetNackSettings(size_t max_nack_list_size, 594 int max_packet_age_to_nack, 595 int max_incomplete_time_ms) { 596 MutexLock lock(&mutex_); 597 RTC_DCHECK_GE(max_packet_age_to_nack, 0); 598 RTC_DCHECK_GE(max_incomplete_time_ms_, 0); 599 max_nack_list_size_ = max_nack_list_size; 600 max_packet_age_to_nack_ = max_packet_age_to_nack; 601 max_incomplete_time_ms_ = max_incomplete_time_ms; 602 } 603 604 int VCMJitterBuffer::NonContinuousOrIncompleteDuration() { 605 if (incomplete_frames_.empty()) { 606 return 0; 607 } 608 uint32_t start_timestamp = incomplete_frames_.Front()->RtpTimestamp(); 609 if (!decodable_frames_.empty()) { 610 start_timestamp = decodable_frames_.Back()->RtpTimestamp(); 611 } 612 return incomplete_frames_.Back()->RtpTimestamp() - start_timestamp; 613 } 614 615 uint16_t VCMJitterBuffer::EstimatedLowSequenceNumber( 616 const VCMFrameBuffer& frame) const { 617 RTC_DCHECK_GE(frame.GetLowSeqNum(), 0); 618 if (frame.HaveFirstPacket()) 619 return frame.GetLowSeqNum(); 620 621 // This estimate is not accurate if more than one packet with lower sequence 622 // number is lost. 623 return frame.GetLowSeqNum() - 1; 624 } 625 626 std::vector<uint16_t> VCMJitterBuffer::GetNackList(bool* request_key_frame) { 627 MutexLock lock(&mutex_); 628 *request_key_frame = false; 629 if (last_decoded_state_.in_initial_state()) { 630 VCMFrameBuffer* next_frame = NextFrame(); 631 const bool first_frame_is_key = 632 next_frame && 633 next_frame->FrameType() == VideoFrameType::kVideoFrameKey && 634 next_frame->HaveFirstPacket(); 635 if (!first_frame_is_key) { 636 bool have_non_empty_frame = 637 decodable_frames_.end() != find_if(decodable_frames_.begin(), 638 decodable_frames_.end(), 639 HasNonEmptyState); 640 if (!have_non_empty_frame) { 641 have_non_empty_frame = 642 incomplete_frames_.end() != find_if(incomplete_frames_.begin(), 643 incomplete_frames_.end(), 644 HasNonEmptyState); 645 } 646 bool found_key_frame = RecycleFramesUntilKeyFrame(); 647 if (!found_key_frame) { 648 *request_key_frame = have_non_empty_frame; 649 return std::vector<uint16_t>(); 650 } 651 } 652 } 653 if (TooLargeNackList()) { 654 *request_key_frame = !HandleTooLargeNackList(); 655 } 656 if (max_incomplete_time_ms_ > 0) { 657 int non_continuous_incomplete_duration = 658 NonContinuousOrIncompleteDuration(); 659 if (non_continuous_incomplete_duration > 90 * max_incomplete_time_ms_) { 660 RTC_LOG_F(LS_WARNING) << "Too long non-decodable duration: " 661 << non_continuous_incomplete_duration << " > " 662 << 90 * max_incomplete_time_ms_; 663 FrameList::reverse_iterator rit = find_if( 664 incomplete_frames_.rbegin(), incomplete_frames_.rend(), IsKeyFrame); 665 if (rit == incomplete_frames_.rend()) { 666 // Request a key frame if we don't have one already. 667 *request_key_frame = true; 668 return std::vector<uint16_t>(); 669 } else { 670 // Skip to the last key frame. If it's incomplete we will start 671 // NACKing it. 672 // Note that the estimated low sequence number is correct for VP8 673 // streams because only the first packet of a key frame is marked. 674 last_decoded_state_.Reset(); 675 DropPacketsFromNackList(EstimatedLowSequenceNumber(*rit->second)); 676 } 677 } 678 } 679 std::vector<uint16_t> nack_list(missing_sequence_numbers_.begin(), 680 missing_sequence_numbers_.end()); 681 return nack_list; 682 } 683 684 VCMFrameBuffer* VCMJitterBuffer::NextFrame() const { 685 if (!decodable_frames_.empty()) 686 return decodable_frames_.Front(); 687 if (!incomplete_frames_.empty()) 688 return incomplete_frames_.Front(); 689 return nullptr; 690 } 691 692 bool VCMJitterBuffer::UpdateNackList(uint16_t sequence_number) { 693 // Make sure we don't add packets which are already too old to be decoded. 694 if (!last_decoded_state_.in_initial_state()) { 695 latest_received_sequence_number_ = LatestSequenceNumber( 696 latest_received_sequence_number_, last_decoded_state_.sequence_num()); 697 } 698 if (IsNewerSequenceNumber(sequence_number, 699 latest_received_sequence_number_)) { 700 // Push any missing sequence numbers to the NACK list. 701 for (uint16_t i = latest_received_sequence_number_ + 1; 702 IsNewerSequenceNumber(sequence_number, i); ++i) { 703 missing_sequence_numbers_.insert(missing_sequence_numbers_.end(), i); 704 } 705 if (TooLargeNackList() && !HandleTooLargeNackList()) { 706 RTC_LOG(LS_WARNING) << "Requesting key frame due to too large NACK list."; 707 return false; 708 } 709 if (MissingTooOldPacket(sequence_number) && 710 !HandleTooOldPackets(sequence_number)) { 711 RTC_LOG(LS_WARNING) 712 << "Requesting key frame due to missing too old packets"; 713 return false; 714 } 715 } else { 716 missing_sequence_numbers_.erase(sequence_number); 717 } 718 return true; 719 } 720 721 bool VCMJitterBuffer::TooLargeNackList() const { 722 return missing_sequence_numbers_.size() > max_nack_list_size_; 723 } 724 725 bool VCMJitterBuffer::HandleTooLargeNackList() { 726 // Recycle frames until the NACK list is small enough. It is likely cheaper to 727 // request a key frame than to retransmit this many missing packets. 728 RTC_LOG_F(LS_WARNING) << "NACK list has grown too large: " 729 << missing_sequence_numbers_.size() << " > " 730 << max_nack_list_size_; 731 bool key_frame_found = false; 732 while (TooLargeNackList()) { 733 key_frame_found = RecycleFramesUntilKeyFrame(); 734 } 735 return key_frame_found; 736 } 737 738 bool VCMJitterBuffer::MissingTooOldPacket( 739 uint16_t latest_sequence_number) const { 740 if (missing_sequence_numbers_.empty()) { 741 return false; 742 } 743 const uint16_t age_of_oldest_missing_packet = 744 latest_sequence_number - *missing_sequence_numbers_.begin(); 745 // Recycle frames if the NACK list contains too old sequence numbers as 746 // the packets may have already been dropped by the sender. 747 return age_of_oldest_missing_packet > max_packet_age_to_nack_; 748 } 749 750 bool VCMJitterBuffer::HandleTooOldPackets(uint16_t latest_sequence_number) { 751 bool key_frame_found = false; 752 const uint16_t age_of_oldest_missing_packet = 753 latest_sequence_number - *missing_sequence_numbers_.begin(); 754 RTC_LOG_F(LS_WARNING) << "NACK list contains too old sequence numbers: " 755 << age_of_oldest_missing_packet << " > " 756 << max_packet_age_to_nack_; 757 while (MissingTooOldPacket(latest_sequence_number)) { 758 key_frame_found = RecycleFramesUntilKeyFrame(); 759 } 760 return key_frame_found; 761 } 762 763 void VCMJitterBuffer::DropPacketsFromNackList( 764 uint16_t last_decoded_sequence_number) { 765 // Erase all sequence numbers from the NACK list which we won't need any 766 // longer. 767 missing_sequence_numbers_.erase( 768 missing_sequence_numbers_.begin(), 769 missing_sequence_numbers_.upper_bound(last_decoded_sequence_number)); 770 } 771 772 VCMFrameBuffer* VCMJitterBuffer::GetEmptyFrame() { 773 if (free_frames_.empty()) { 774 if (!TryToIncreaseJitterBufferSize()) { 775 return nullptr; 776 } 777 } 778 VCMFrameBuffer* frame = free_frames_.front(); 779 free_frames_.pop_front(); 780 return frame; 781 } 782 783 bool VCMJitterBuffer::TryToIncreaseJitterBufferSize() { 784 if (max_number_of_frames_ >= kMaxNumberOfFrames) 785 return false; 786 free_frames_.push_back(new VCMFrameBuffer()); 787 ++max_number_of_frames_; 788 return true; 789 } 790 791 // Recycle oldest frames up to a key frame, used if jitter buffer is completely 792 // full. 793 bool VCMJitterBuffer::RecycleFramesUntilKeyFrame() { 794 // First release incomplete frames, and only release decodable frames if there 795 // are no incomplete ones. 796 FrameList::iterator key_frame_it; 797 bool key_frame_found = false; 798 int dropped_frames = 0; 799 dropped_frames += incomplete_frames_.RecycleFramesUntilKeyFrame( 800 &key_frame_it, &free_frames_); 801 key_frame_found = key_frame_it != incomplete_frames_.end(); 802 if (dropped_frames == 0) { 803 dropped_frames += decodable_frames_.RecycleFramesUntilKeyFrame( 804 &key_frame_it, &free_frames_); 805 key_frame_found = key_frame_it != decodable_frames_.end(); 806 } 807 if (key_frame_found) { 808 RTC_LOG(LS_INFO) << "Found key frame while dropping frames."; 809 // Reset last decoded state to make sure the next frame decoded is a key 810 // frame, and start NACKing from here. 811 last_decoded_state_.Reset(); 812 DropPacketsFromNackList(EstimatedLowSequenceNumber(*key_frame_it->second)); 813 } else if (decodable_frames_.empty()) { 814 // All frames dropped. Reset the decoding state and clear missing sequence 815 // numbers as we're starting fresh. 816 last_decoded_state_.Reset(); 817 missing_sequence_numbers_.clear(); 818 } 819 return key_frame_found; 820 } 821 822 void VCMJitterBuffer::UpdateAveragePacketsPerFrame(int current_number_packets) { 823 if (frame_counter_ > kFastConvergeThreshold) { 824 average_packets_per_frame_ = 825 average_packets_per_frame_ * (1 - kNormalConvergeMultiplier) + 826 current_number_packets * kNormalConvergeMultiplier; 827 } else if (frame_counter_ > 0) { 828 average_packets_per_frame_ = 829 average_packets_per_frame_ * (1 - kFastConvergeMultiplier) + 830 current_number_packets * kFastConvergeMultiplier; 831 frame_counter_++; 832 } else { 833 average_packets_per_frame_ = current_number_packets; 834 frame_counter_++; 835 } 836 } 837 838 // Must be called under the critical section `mutex_`. 839 void VCMJitterBuffer::CleanUpOldOrEmptyFrames() { 840 decodable_frames_.CleanUpOldOrEmptyFrames(&last_decoded_state_, 841 &free_frames_); 842 incomplete_frames_.CleanUpOldOrEmptyFrames(&last_decoded_state_, 843 &free_frames_); 844 if (!last_decoded_state_.in_initial_state()) { 845 DropPacketsFromNackList(last_decoded_state_.sequence_num()); 846 } 847 } 848 849 // Must be called from within `mutex_`. 850 bool VCMJitterBuffer::IsPacketRetransmitted(const VCMPacket& packet) const { 851 return missing_sequence_numbers_.find(packet.seqNum) != 852 missing_sequence_numbers_.end(); 853 } 854 855 // Must be called under the critical section `mutex_`. Should never be 856 // called with retransmitted frames, they must be filtered out before this 857 // function is called. 858 void VCMJitterBuffer::UpdateJitterEstimate(const VCMJitterSample& sample, 859 bool incomplete_frame) { 860 if (sample.latest_packet_time == -1) { 861 return; 862 } 863 UpdateJitterEstimate(sample.latest_packet_time, sample.timestamp, 864 sample.frame_size, incomplete_frame); 865 } 866 867 // Must be called under the critical section mutex_. Should never be 868 // called with retransmitted frames, they must be filtered out before this 869 // function is called. 870 void VCMJitterBuffer::UpdateJitterEstimate(const VCMFrameBuffer& frame, 871 bool incomplete_frame) { 872 if (frame.LatestPacketTimeMs() == -1) { 873 return; 874 } 875 // No retransmitted frames should be a part of the jitter 876 // estimate. 877 UpdateJitterEstimate(frame.LatestPacketTimeMs(), frame.RtpTimestamp(), 878 frame.size(), incomplete_frame); 879 } 880 881 // Must be called under the critical section `mutex_`. Should never be 882 // called with retransmitted frames, they must be filtered out before this 883 // function is called. 884 void VCMJitterBuffer::UpdateJitterEstimate(int64_t latest_packet_time_ms, 885 uint32_t timestamp, 886 unsigned int frame_size, 887 bool /*incomplete_frame*/) { 888 if (latest_packet_time_ms == -1) { 889 return; 890 } 891 auto frame_delay = inter_frame_delay_.Calculate( 892 timestamp, Timestamp::Millis(latest_packet_time_ms)); 893 894 bool not_reordered = frame_delay.has_value(); 895 // Filter out frames which have been reordered in time by the network 896 if (not_reordered) { 897 // Update the jitter estimate with the new samples 898 jitter_estimate_.UpdateEstimate(*frame_delay, DataSize::Bytes(frame_size)); 899 } 900 } 901 902 void VCMJitterBuffer::RecycleFrameBuffer(VCMFrameBuffer* frame) { 903 frame->Reset(); 904 free_frames_.push_back(frame); 905 } 906 907 } // namespace webrtc