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

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

Issue 2790533002: Remove ALL usage of CriticalSectionWrapper. (Closed)
Patch Set: remove winXP rw_lock include Created 3 years, 8 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
« no previous file with comments | « webrtc/modules/video_coding/jitter_buffer.h ('k') | webrtc/system_wrappers/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
11 11
12 #include <assert.h> 12 #include <assert.h>
13 13
14 #include <algorithm> 14 #include <algorithm>
15 #include <limits> 15 #include <limits>
16 #include <utility> 16 #include <utility>
17 17
18 #include "webrtc/base/checks.h" 18 #include "webrtc/base/checks.h"
19 #include "webrtc/base/logging.h" 19 #include "webrtc/base/logging.h"
20 #include "webrtc/base/trace_event.h" 20 #include "webrtc/base/trace_event.h"
21 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" 21 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
22 #include "webrtc/modules/video_coding/include/video_coding.h" 22 #include "webrtc/modules/video_coding/include/video_coding.h"
23 #include "webrtc/modules/video_coding/frame_buffer.h" 23 #include "webrtc/modules/video_coding/frame_buffer.h"
24 #include "webrtc/modules/video_coding/inter_frame_delay.h" 24 #include "webrtc/modules/video_coding/inter_frame_delay.h"
25 #include "webrtc/modules/video_coding/internal_defines.h" 25 #include "webrtc/modules/video_coding/internal_defines.h"
26 #include "webrtc/modules/video_coding/jitter_buffer_common.h" 26 #include "webrtc/modules/video_coding/jitter_buffer_common.h"
27 #include "webrtc/modules/video_coding/jitter_estimator.h" 27 #include "webrtc/modules/video_coding/jitter_estimator.h"
28 #include "webrtc/modules/video_coding/packet.h" 28 #include "webrtc/modules/video_coding/packet.h"
29 #include "webrtc/system_wrappers/include/clock.h" 29 #include "webrtc/system_wrappers/include/clock.h"
30 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
31 #include "webrtc/system_wrappers/include/event_wrapper.h" 30 #include "webrtc/system_wrappers/include/event_wrapper.h"
32 #include "webrtc/system_wrappers/include/field_trial.h" 31 #include "webrtc/system_wrappers/include/field_trial.h"
33 #include "webrtc/system_wrappers/include/metrics.h" 32 #include "webrtc/system_wrappers/include/metrics.h"
34 33
35 namespace webrtc { 34 namespace webrtc {
36 // Interval for updating SS data. 35 // Interval for updating SS data.
37 static const uint32_t kSsCleanupIntervalSec = 60; 36 static const uint32_t kSsCleanupIntervalSec = 60;
38 37
39 // Use this rtt if no value has been reported. 38 // Use this rtt if no value has been reported.
40 static const int64_t kDefaultRtt = 200; 39 static const int64_t kDefaultRtt = 200;
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 } 213 }
215 } 214 }
216 } 215 }
217 216
218 VCMJitterBuffer::VCMJitterBuffer(Clock* clock, 217 VCMJitterBuffer::VCMJitterBuffer(Clock* clock,
219 std::unique_ptr<EventWrapper> event, 218 std::unique_ptr<EventWrapper> event,
220 NackSender* nack_sender, 219 NackSender* nack_sender,
221 KeyFrameRequestSender* keyframe_request_sender) 220 KeyFrameRequestSender* keyframe_request_sender)
222 : clock_(clock), 221 : clock_(clock),
223 running_(false), 222 running_(false),
224 crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
225 frame_event_(std::move(event)), 223 frame_event_(std::move(event)),
226 max_number_of_frames_(kStartNumberOfFrames), 224 max_number_of_frames_(kStartNumberOfFrames),
227 free_frames_(), 225 free_frames_(),
228 decodable_frames_(), 226 decodable_frames_(),
229 incomplete_frames_(), 227 incomplete_frames_(),
230 last_decoded_state_(), 228 last_decoded_state_(),
231 first_packet_since_reset_(true), 229 first_packet_since_reset_(true),
232 stats_callback_(nullptr), 230 stats_callback_(nullptr),
233 incoming_frame_rate_(0), 231 incoming_frame_rate_(0),
234 incoming_frame_count_(0), 232 incoming_frame_count_(0),
(...skipping 30 matching lines...) Expand all
265 delete *it; 263 delete *it;
266 } 264 }
267 for (FrameList::iterator it = incomplete_frames_.begin(); 265 for (FrameList::iterator it = incomplete_frames_.begin();
268 it != incomplete_frames_.end(); ++it) { 266 it != incomplete_frames_.end(); ++it) {
269 delete it->second; 267 delete it->second;
270 } 268 }
271 for (FrameList::iterator it = decodable_frames_.begin(); 269 for (FrameList::iterator it = decodable_frames_.begin();
272 it != decodable_frames_.end(); ++it) { 270 it != decodable_frames_.end(); ++it) {
273 delete it->second; 271 delete it->second;
274 } 272 }
275 delete crit_sect_;
276 } 273 }
277 274
278 void VCMJitterBuffer::UpdateHistograms() { 275 void VCMJitterBuffer::UpdateHistograms() {
279 if (num_packets_ <= 0 || !running_) { 276 if (num_packets_ <= 0 || !running_) {
280 return; 277 return;
281 } 278 }
282 int64_t elapsed_sec = 279 int64_t elapsed_sec =
283 (clock_->TimeInMilliseconds() - time_first_packet_ms_) / 1000; 280 (clock_->TimeInMilliseconds() - time_first_packet_ms_) / 1000;
284 if (elapsed_sec < metrics::kMinRunTimeInSeconds) { 281 if (elapsed_sec < metrics::kMinRunTimeInSeconds) {
285 return; 282 return;
(...skipping 11 matching lines...) Expand all
297 "WebRTC.Video.CompleteFramesReceivedPerSecond", 294 "WebRTC.Video.CompleteFramesReceivedPerSecond",
298 static_cast<int>((total_frames / elapsed_sec) + 0.5f)); 295 static_cast<int>((total_frames / elapsed_sec) + 0.5f));
299 RTC_HISTOGRAM_COUNTS_1000( 296 RTC_HISTOGRAM_COUNTS_1000(
300 "WebRTC.Video.KeyFramesReceivedInPermille", 297 "WebRTC.Video.KeyFramesReceivedInPermille",
301 static_cast<int>( 298 static_cast<int>(
302 (receive_statistics_.key_frames * 1000.0f / total_frames) + 0.5f)); 299 (receive_statistics_.key_frames * 1000.0f / total_frames) + 0.5f));
303 } 300 }
304 } 301 }
305 302
306 void VCMJitterBuffer::Start() { 303 void VCMJitterBuffer::Start() {
307 CriticalSectionScoped cs(crit_sect_); 304 rtc::CritScope cs(&crit_sect_);
308 running_ = true; 305 running_ = true;
309 incoming_frame_count_ = 0; 306 incoming_frame_count_ = 0;
310 incoming_frame_rate_ = 0; 307 incoming_frame_rate_ = 0;
311 incoming_bit_count_ = 0; 308 incoming_bit_count_ = 0;
312 incoming_bit_rate_ = 0; 309 incoming_bit_rate_ = 0;
313 time_last_incoming_frame_count_ = clock_->TimeInMilliseconds(); 310 time_last_incoming_frame_count_ = clock_->TimeInMilliseconds();
314 receive_statistics_ = FrameCounts(); 311 receive_statistics_ = FrameCounts();
315 312
316 num_consecutive_old_packets_ = 0; 313 num_consecutive_old_packets_ = 0;
317 num_packets_ = 0; 314 num_packets_ = 0;
318 num_duplicated_packets_ = 0; 315 num_duplicated_packets_ = 0;
319 num_discarded_packets_ = 0; 316 num_discarded_packets_ = 0;
320 time_first_packet_ms_ = 0; 317 time_first_packet_ms_ = 0;
321 318
322 // Start in a non-signaled state. 319 // Start in a non-signaled state.
323 waiting_for_completion_.frame_size = 0; 320 waiting_for_completion_.frame_size = 0;
324 waiting_for_completion_.timestamp = 0; 321 waiting_for_completion_.timestamp = 0;
325 waiting_for_completion_.latest_packet_time = -1; 322 waiting_for_completion_.latest_packet_time = -1;
326 first_packet_since_reset_ = true; 323 first_packet_since_reset_ = true;
327 rtt_ms_ = kDefaultRtt; 324 rtt_ms_ = kDefaultRtt;
328 last_decoded_state_.Reset(); 325 last_decoded_state_.Reset();
329 326
330 decodable_frames_.Reset(&free_frames_); 327 decodable_frames_.Reset(&free_frames_);
331 incomplete_frames_.Reset(&free_frames_); 328 incomplete_frames_.Reset(&free_frames_);
332 } 329 }
333 330
334 void VCMJitterBuffer::Stop() { 331 void VCMJitterBuffer::Stop() {
335 CriticalSectionScoped cs(crit_sect_); 332 rtc::CritScope cs(&crit_sect_);
336 UpdateHistograms(); 333 UpdateHistograms();
337 running_ = false; 334 running_ = false;
338 last_decoded_state_.Reset(); 335 last_decoded_state_.Reset();
339 336
340 // Make sure we wake up any threads waiting on these events. 337 // Make sure we wake up any threads waiting on these events.
341 frame_event_->Set(); 338 frame_event_->Set();
342 } 339 }
343 340
344 bool VCMJitterBuffer::Running() const { 341 bool VCMJitterBuffer::Running() const {
345 CriticalSectionScoped cs(crit_sect_); 342 rtc::CritScope cs(&crit_sect_);
346 return running_; 343 return running_;
347 } 344 }
348 345
349 void VCMJitterBuffer::Flush() { 346 void VCMJitterBuffer::Flush() {
350 CriticalSectionScoped cs(crit_sect_); 347 rtc::CritScope cs(&crit_sect_);
351 decodable_frames_.Reset(&free_frames_); 348 decodable_frames_.Reset(&free_frames_);
352 incomplete_frames_.Reset(&free_frames_); 349 incomplete_frames_.Reset(&free_frames_);
353 last_decoded_state_.Reset(); // TODO(mikhal): sync reset. 350 last_decoded_state_.Reset(); // TODO(mikhal): sync reset.
354 num_consecutive_old_packets_ = 0; 351 num_consecutive_old_packets_ = 0;
355 // Also reset the jitter and delay estimates 352 // Also reset the jitter and delay estimates
356 jitter_estimate_.Reset(); 353 jitter_estimate_.Reset();
357 inter_frame_delay_.Reset(clock_->TimeInMilliseconds()); 354 inter_frame_delay_.Reset(clock_->TimeInMilliseconds());
358 waiting_for_completion_.frame_size = 0; 355 waiting_for_completion_.frame_size = 0;
359 waiting_for_completion_.timestamp = 0; 356 waiting_for_completion_.timestamp = 0;
360 waiting_for_completion_.latest_packet_time = -1; 357 waiting_for_completion_.latest_packet_time = -1;
361 first_packet_since_reset_ = true; 358 first_packet_since_reset_ = true;
362 missing_sequence_numbers_.clear(); 359 missing_sequence_numbers_.clear();
363 } 360 }
364 361
365 // Get received key and delta frames 362 // Get received key and delta frames
366 FrameCounts VCMJitterBuffer::FrameStatistics() const { 363 FrameCounts VCMJitterBuffer::FrameStatistics() const {
367 CriticalSectionScoped cs(crit_sect_); 364 rtc::CritScope cs(&crit_sect_);
368 return receive_statistics_; 365 return receive_statistics_;
369 } 366 }
370 367
371 int VCMJitterBuffer::num_packets() const { 368 int VCMJitterBuffer::num_packets() const {
372 CriticalSectionScoped cs(crit_sect_); 369 rtc::CritScope cs(&crit_sect_);
373 return num_packets_; 370 return num_packets_;
374 } 371 }
375 372
376 int VCMJitterBuffer::num_duplicated_packets() const { 373 int VCMJitterBuffer::num_duplicated_packets() const {
377 CriticalSectionScoped cs(crit_sect_); 374 rtc::CritScope cs(&crit_sect_);
378 return num_duplicated_packets_; 375 return num_duplicated_packets_;
379 } 376 }
380 377
381 int VCMJitterBuffer::num_discarded_packets() const { 378 int VCMJitterBuffer::num_discarded_packets() const {
382 CriticalSectionScoped cs(crit_sect_); 379 rtc::CritScope cs(&crit_sect_);
383 return num_discarded_packets_; 380 return num_discarded_packets_;
384 } 381 }
385 382
386 // Calculate framerate and bitrate. 383 // Calculate framerate and bitrate.
387 void VCMJitterBuffer::IncomingRateStatistics(unsigned int* framerate, 384 void VCMJitterBuffer::IncomingRateStatistics(unsigned int* framerate,
388 unsigned int* bitrate) { 385 unsigned int* bitrate) {
389 assert(framerate); 386 assert(framerate);
390 assert(bitrate); 387 assert(bitrate);
391 CriticalSectionScoped cs(crit_sect_); 388 rtc::CritScope cs(&crit_sect_);
392 const int64_t now = clock_->TimeInMilliseconds(); 389 const int64_t now = clock_->TimeInMilliseconds();
393 int64_t diff = now - time_last_incoming_frame_count_; 390 int64_t diff = now - time_last_incoming_frame_count_;
394 if (diff < 1000 && incoming_frame_rate_ > 0 && incoming_bit_rate_ > 0) { 391 if (diff < 1000 && incoming_frame_rate_ > 0 && incoming_bit_rate_ > 0) {
395 // Make sure we report something even though less than 392 // Make sure we report something even though less than
396 // 1 second has passed since last update. 393 // 1 second has passed since last update.
397 *framerate = incoming_frame_rate_; 394 *framerate = incoming_frame_rate_;
398 *bitrate = incoming_bit_rate_; 395 *bitrate = incoming_bit_rate_;
399 } else if (incoming_frame_count_ != 0) { 396 } else if (incoming_frame_count_ != 0) {
400 // We have received frame(s) since last call to this function 397 // We have received frame(s) since last call to this function
401 398
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 *framerate = 0; 435 *framerate = 0;
439 *bitrate = 0; 436 *bitrate = 0;
440 incoming_frame_rate_ = 0; 437 incoming_frame_rate_ = 0;
441 incoming_bit_rate_ = 0; 438 incoming_bit_rate_ = 0;
442 } 439 }
443 } 440 }
444 441
445 // Returns immediately or a |max_wait_time_ms| ms event hang waiting for a 442 // Returns immediately or a |max_wait_time_ms| ms event hang waiting for a
446 // complete frame, |max_wait_time_ms| decided by caller. 443 // complete frame, |max_wait_time_ms| decided by caller.
447 VCMEncodedFrame* VCMJitterBuffer::NextCompleteFrame(uint32_t max_wait_time_ms) { 444 VCMEncodedFrame* VCMJitterBuffer::NextCompleteFrame(uint32_t max_wait_time_ms) {
448 crit_sect_->Enter(); 445 crit_sect_.Enter();
449 if (!running_) { 446 if (!running_) {
450 crit_sect_->Leave(); 447 crit_sect_.Leave();
451 return nullptr; 448 return nullptr;
452 } 449 }
453 CleanUpOldOrEmptyFrames(); 450 CleanUpOldOrEmptyFrames();
454 451
455 if (decodable_frames_.empty() || 452 if (decodable_frames_.empty() ||
456 decodable_frames_.Front()->GetState() != kStateComplete) { 453 decodable_frames_.Front()->GetState() != kStateComplete) {
457 const int64_t end_wait_time_ms = 454 const int64_t end_wait_time_ms =
458 clock_->TimeInMilliseconds() + max_wait_time_ms; 455 clock_->TimeInMilliseconds() + max_wait_time_ms;
459 int64_t wait_time_ms = max_wait_time_ms; 456 int64_t wait_time_ms = max_wait_time_ms;
460 while (wait_time_ms > 0) { 457 while (wait_time_ms > 0) {
461 crit_sect_->Leave(); 458 crit_sect_.Leave();
462 const EventTypeWrapper ret = 459 const EventTypeWrapper ret =
463 frame_event_->Wait(static_cast<uint32_t>(wait_time_ms)); 460 frame_event_->Wait(static_cast<uint32_t>(wait_time_ms));
464 crit_sect_->Enter(); 461 crit_sect_.Enter();
465 if (ret == kEventSignaled) { 462 if (ret == kEventSignaled) {
466 // Are we shutting down the jitter buffer? 463 // Are we shutting down the jitter buffer?
467 if (!running_) { 464 if (!running_) {
468 crit_sect_->Leave(); 465 crit_sect_.Leave();
469 return nullptr; 466 return nullptr;
470 } 467 }
471 // Finding oldest frame ready for decoder. 468 // Finding oldest frame ready for decoder.
472 CleanUpOldOrEmptyFrames(); 469 CleanUpOldOrEmptyFrames();
473 if (decodable_frames_.empty() || 470 if (decodable_frames_.empty() ||
474 decodable_frames_.Front()->GetState() != kStateComplete) { 471 decodable_frames_.Front()->GetState() != kStateComplete) {
475 wait_time_ms = end_wait_time_ms - clock_->TimeInMilliseconds(); 472 wait_time_ms = end_wait_time_ms - clock_->TimeInMilliseconds();
476 } else { 473 } else {
477 break; 474 break;
478 } 475 }
479 } else { 476 } else {
480 break; 477 break;
481 } 478 }
482 } 479 }
483 } 480 }
484 if (decodable_frames_.empty() || 481 if (decodable_frames_.empty() ||
485 decodable_frames_.Front()->GetState() != kStateComplete) { 482 decodable_frames_.Front()->GetState() != kStateComplete) {
486 crit_sect_->Leave(); 483 crit_sect_.Leave();
487 return nullptr; 484 return nullptr;
488 } 485 }
489 VCMEncodedFrame* encoded_frame = decodable_frames_.Front(); 486 VCMEncodedFrame* encoded_frame = decodable_frames_.Front();
490 crit_sect_->Leave(); 487 crit_sect_.Leave();
491 return encoded_frame; 488 return encoded_frame;
492 } 489 }
493 490
494 bool VCMJitterBuffer::NextMaybeIncompleteTimestamp(uint32_t* timestamp) { 491 bool VCMJitterBuffer::NextMaybeIncompleteTimestamp(uint32_t* timestamp) {
495 CriticalSectionScoped cs(crit_sect_); 492 rtc::CritScope cs(&crit_sect_);
496 if (!running_) { 493 if (!running_) {
497 return false; 494 return false;
498 } 495 }
499 if (decode_error_mode_ == kNoErrors) { 496 if (decode_error_mode_ == kNoErrors) {
500 // No point to continue, as we are not decoding with errors. 497 // No point to continue, as we are not decoding with errors.
501 return false; 498 return false;
502 } 499 }
503 500
504 CleanUpOldOrEmptyFrames(); 501 CleanUpOldOrEmptyFrames();
505 502
(...skipping 16 matching lines...) Expand all
522 oldest_frame->GetState() != kStateComplete) { 519 oldest_frame->GetState() != kStateComplete) {
523 return false; 520 return false;
524 } 521 }
525 } 522 }
526 523
527 *timestamp = oldest_frame->TimeStamp(); 524 *timestamp = oldest_frame->TimeStamp();
528 return true; 525 return true;
529 } 526 }
530 527
531 VCMEncodedFrame* VCMJitterBuffer::ExtractAndSetDecode(uint32_t timestamp) { 528 VCMEncodedFrame* VCMJitterBuffer::ExtractAndSetDecode(uint32_t timestamp) {
532 CriticalSectionScoped cs(crit_sect_); 529 rtc::CritScope cs(&crit_sect_);
533 if (!running_) { 530 if (!running_) {
534 return NULL; 531 return NULL;
535 } 532 }
536 // Extract the frame with the desired timestamp. 533 // Extract the frame with the desired timestamp.
537 VCMFrameBuffer* frame = decodable_frames_.PopFrame(timestamp); 534 VCMFrameBuffer* frame = decodable_frames_.PopFrame(timestamp);
538 bool continuous = true; 535 bool continuous = true;
539 if (!frame) { 536 if (!frame) {
540 frame = incomplete_frames_.PopFrame(timestamp); 537 frame = incomplete_frames_.PopFrame(timestamp);
541 if (frame) 538 if (frame)
542 continuous = last_decoded_state_.ContinuousFrame(frame); 539 continuous = last_decoded_state_.ContinuousFrame(frame);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 if ((*frame).IsSessionComplete()) 573 if ((*frame).IsSessionComplete())
577 UpdateAveragePacketsPerFrame(frame->NumPackets()); 574 UpdateAveragePacketsPerFrame(frame->NumPackets());
578 575
579 return frame; 576 return frame;
580 } 577 }
581 578
582 // Release frame when done with decoding. Should never be used to release 579 // Release frame when done with decoding. Should never be used to release
583 // frames from within the jitter buffer. 580 // frames from within the jitter buffer.
584 void VCMJitterBuffer::ReleaseFrame(VCMEncodedFrame* frame) { 581 void VCMJitterBuffer::ReleaseFrame(VCMEncodedFrame* frame) {
585 RTC_CHECK(frame != nullptr); 582 RTC_CHECK(frame != nullptr);
586 CriticalSectionScoped cs(crit_sect_); 583 rtc::CritScope cs(&crit_sect_);
587 VCMFrameBuffer* frame_buffer = static_cast<VCMFrameBuffer*>(frame); 584 VCMFrameBuffer* frame_buffer = static_cast<VCMFrameBuffer*>(frame);
588 RecycleFrameBuffer(frame_buffer); 585 RecycleFrameBuffer(frame_buffer);
589 } 586 }
590 587
591 // Gets frame to use for this timestamp. If no match, get empty frame. 588 // Gets frame to use for this timestamp. If no match, get empty frame.
592 VCMFrameBufferEnum VCMJitterBuffer::GetFrame(const VCMPacket& packet, 589 VCMFrameBufferEnum VCMJitterBuffer::GetFrame(const VCMPacket& packet,
593 VCMFrameBuffer** frame, 590 VCMFrameBuffer** frame,
594 FrameList** frame_list) { 591 FrameList** frame_list) {
595 *frame = incomplete_frames_.PopFrame(packet.timestamp); 592 *frame = incomplete_frames_.PopFrame(packet.timestamp);
596 if (*frame != NULL) { 593 if (*frame != NULL) {
(...skipping 20 matching lines...) Expand all
617 return kFlushIndicator; 614 return kFlushIndicator;
618 } 615 }
619 } 616 }
620 (*frame)->Reset(); 617 (*frame)->Reset();
621 return kNoError; 618 return kNoError;
622 } 619 }
623 620
624 int64_t VCMJitterBuffer::LastPacketTime(const VCMEncodedFrame* frame, 621 int64_t VCMJitterBuffer::LastPacketTime(const VCMEncodedFrame* frame,
625 bool* retransmitted) const { 622 bool* retransmitted) const {
626 assert(retransmitted); 623 assert(retransmitted);
627 CriticalSectionScoped cs(crit_sect_); 624 rtc::CritScope cs(&crit_sect_);
628 const VCMFrameBuffer* frame_buffer = 625 const VCMFrameBuffer* frame_buffer =
629 static_cast<const VCMFrameBuffer*>(frame); 626 static_cast<const VCMFrameBuffer*>(frame);
630 *retransmitted = (frame_buffer->GetNackCount() > 0); 627 *retransmitted = (frame_buffer->GetNackCount() > 0);
631 return frame_buffer->LatestPacketTimeMs(); 628 return frame_buffer->LatestPacketTimeMs();
632 } 629 }
633 630
634 VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet, 631 VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet,
635 bool* retransmitted) { 632 bool* retransmitted) {
636 CriticalSectionScoped cs(crit_sect_); 633 rtc::CritScope cs(&crit_sect_);
637 634
638 ++num_packets_; 635 ++num_packets_;
639 if (num_packets_ == 1) { 636 if (num_packets_ == 1) {
640 time_first_packet_ms_ = clock_->TimeInMilliseconds(); 637 time_first_packet_ms_ = clock_->TimeInMilliseconds();
641 } 638 }
642 // Does this packet belong to an old frame? 639 // Does this packet belong to an old frame?
643 if (last_decoded_state_.IsOldPacket(&packet)) { 640 if (last_decoded_state_.IsOldPacket(&packet)) {
644 // Account only for media packets. 641 // Account only for media packets.
645 if (packet.sizeBytes > 0) { 642 if (packet.sizeBytes > 0) {
646 num_discarded_packets_++; 643 num_discarded_packets_++;
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
873 decoding_state.SetState(frame); 870 decoding_state.SetState(frame);
874 } else if (frame->TemporalId() <= 0) { 871 } else if (frame->TemporalId() <= 0) {
875 break; 872 break;
876 } else { 873 } else {
877 ++it; 874 ++it;
878 } 875 }
879 } 876 }
880 } 877 }
881 878
882 uint32_t VCMJitterBuffer::EstimatedJitterMs() { 879 uint32_t VCMJitterBuffer::EstimatedJitterMs() {
883 CriticalSectionScoped cs(crit_sect_); 880 rtc::CritScope cs(&crit_sect_);
884 // Compute RTT multiplier for estimation. 881 // Compute RTT multiplier for estimation.
885 // low_rtt_nackThresholdMs_ == -1 means no FEC. 882 // low_rtt_nackThresholdMs_ == -1 means no FEC.
886 double rtt_mult = 1.0f; 883 double rtt_mult = 1.0f;
887 if (low_rtt_nack_threshold_ms_ >= 0 && 884 if (low_rtt_nack_threshold_ms_ >= 0 &&
888 rtt_ms_ >= low_rtt_nack_threshold_ms_) { 885 rtt_ms_ >= low_rtt_nack_threshold_ms_) {
889 // For RTTs above low_rtt_nack_threshold_ms_ we don't apply extra delay 886 // For RTTs above low_rtt_nack_threshold_ms_ we don't apply extra delay
890 // when waiting for retransmissions. 887 // when waiting for retransmissions.
891 rtt_mult = 0.0f; 888 rtt_mult = 0.0f;
892 } 889 }
893 return jitter_estimate_.GetJitterEstimate(rtt_mult); 890 return jitter_estimate_.GetJitterEstimate(rtt_mult);
894 } 891 }
895 892
896 void VCMJitterBuffer::UpdateRtt(int64_t rtt_ms) { 893 void VCMJitterBuffer::UpdateRtt(int64_t rtt_ms) {
897 CriticalSectionScoped cs(crit_sect_); 894 rtc::CritScope cs(&crit_sect_);
898 rtt_ms_ = rtt_ms; 895 rtt_ms_ = rtt_ms;
899 jitter_estimate_.UpdateRtt(rtt_ms); 896 jitter_estimate_.UpdateRtt(rtt_ms);
900 if (!WaitForRetransmissions()) 897 if (!WaitForRetransmissions())
901 jitter_estimate_.ResetNackCount(); 898 jitter_estimate_.ResetNackCount();
902 } 899 }
903 900
904 void VCMJitterBuffer::SetNackMode(VCMNackMode mode, 901 void VCMJitterBuffer::SetNackMode(VCMNackMode mode,
905 int64_t low_rtt_nack_threshold_ms, 902 int64_t low_rtt_nack_threshold_ms,
906 int64_t high_rtt_nack_threshold_ms) { 903 int64_t high_rtt_nack_threshold_ms) {
907 CriticalSectionScoped cs(crit_sect_); 904 rtc::CritScope cs(&crit_sect_);
908 nack_mode_ = mode; 905 nack_mode_ = mode;
909 if (mode == kNoNack) { 906 if (mode == kNoNack) {
910 missing_sequence_numbers_.clear(); 907 missing_sequence_numbers_.clear();
911 } 908 }
912 assert(low_rtt_nack_threshold_ms >= -1 && high_rtt_nack_threshold_ms >= -1); 909 assert(low_rtt_nack_threshold_ms >= -1 && high_rtt_nack_threshold_ms >= -1);
913 assert(high_rtt_nack_threshold_ms == -1 || 910 assert(high_rtt_nack_threshold_ms == -1 ||
914 low_rtt_nack_threshold_ms <= high_rtt_nack_threshold_ms); 911 low_rtt_nack_threshold_ms <= high_rtt_nack_threshold_ms);
915 assert(low_rtt_nack_threshold_ms > -1 || high_rtt_nack_threshold_ms == -1); 912 assert(low_rtt_nack_threshold_ms > -1 || high_rtt_nack_threshold_ms == -1);
916 low_rtt_nack_threshold_ms_ = low_rtt_nack_threshold_ms; 913 low_rtt_nack_threshold_ms_ = low_rtt_nack_threshold_ms;
917 high_rtt_nack_threshold_ms_ = high_rtt_nack_threshold_ms; 914 high_rtt_nack_threshold_ms_ = high_rtt_nack_threshold_ms;
918 // Don't set a high start rtt if high_rtt_nack_threshold_ms_ is used, to not 915 // Don't set a high start rtt if high_rtt_nack_threshold_ms_ is used, to not
919 // disable NACK in |kNack| mode. 916 // disable NACK in |kNack| mode.
920 if (rtt_ms_ == kDefaultRtt && high_rtt_nack_threshold_ms_ != -1) { 917 if (rtt_ms_ == kDefaultRtt && high_rtt_nack_threshold_ms_ != -1) {
921 rtt_ms_ = 0; 918 rtt_ms_ = 0;
922 } 919 }
923 if (!WaitForRetransmissions()) { 920 if (!WaitForRetransmissions()) {
924 jitter_estimate_.ResetNackCount(); 921 jitter_estimate_.ResetNackCount();
925 } 922 }
926 } 923 }
927 924
928 void VCMJitterBuffer::SetNackSettings(size_t max_nack_list_size, 925 void VCMJitterBuffer::SetNackSettings(size_t max_nack_list_size,
929 int max_packet_age_to_nack, 926 int max_packet_age_to_nack,
930 int max_incomplete_time_ms) { 927 int max_incomplete_time_ms) {
931 CriticalSectionScoped cs(crit_sect_); 928 rtc::CritScope cs(&crit_sect_);
932 assert(max_packet_age_to_nack >= 0); 929 assert(max_packet_age_to_nack >= 0);
933 assert(max_incomplete_time_ms_ >= 0); 930 assert(max_incomplete_time_ms_ >= 0);
934 max_nack_list_size_ = max_nack_list_size; 931 max_nack_list_size_ = max_nack_list_size;
935 max_packet_age_to_nack_ = max_packet_age_to_nack; 932 max_packet_age_to_nack_ = max_packet_age_to_nack;
936 max_incomplete_time_ms_ = max_incomplete_time_ms; 933 max_incomplete_time_ms_ = max_incomplete_time_ms;
937 } 934 }
938 935
939 VCMNackMode VCMJitterBuffer::nack_mode() const { 936 VCMNackMode VCMJitterBuffer::nack_mode() const {
940 CriticalSectionScoped cs(crit_sect_); 937 rtc::CritScope cs(&crit_sect_);
941 return nack_mode_; 938 return nack_mode_;
942 } 939 }
943 940
944 int VCMJitterBuffer::NonContinuousOrIncompleteDuration() { 941 int VCMJitterBuffer::NonContinuousOrIncompleteDuration() {
945 if (incomplete_frames_.empty()) { 942 if (incomplete_frames_.empty()) {
946 return 0; 943 return 0;
947 } 944 }
948 uint32_t start_timestamp = incomplete_frames_.Front()->TimeStamp(); 945 uint32_t start_timestamp = incomplete_frames_.Front()->TimeStamp();
949 if (!decodable_frames_.empty()) { 946 if (!decodable_frames_.empty()) {
950 start_timestamp = decodable_frames_.Back()->TimeStamp(); 947 start_timestamp = decodable_frames_.Back()->TimeStamp();
951 } 948 }
952 return incomplete_frames_.Back()->TimeStamp() - start_timestamp; 949 return incomplete_frames_.Back()->TimeStamp() - start_timestamp;
953 } 950 }
954 951
955 uint16_t VCMJitterBuffer::EstimatedLowSequenceNumber( 952 uint16_t VCMJitterBuffer::EstimatedLowSequenceNumber(
956 const VCMFrameBuffer& frame) const { 953 const VCMFrameBuffer& frame) const {
957 assert(frame.GetLowSeqNum() >= 0); 954 assert(frame.GetLowSeqNum() >= 0);
958 if (frame.HaveFirstPacket()) 955 if (frame.HaveFirstPacket())
959 return frame.GetLowSeqNum(); 956 return frame.GetLowSeqNum();
960 957
961 // This estimate is not accurate if more than one packet with lower sequence 958 // This estimate is not accurate if more than one packet with lower sequence
962 // number is lost. 959 // number is lost.
963 return frame.GetLowSeqNum() - 1; 960 return frame.GetLowSeqNum() - 1;
964 } 961 }
965 962
966 std::vector<uint16_t> VCMJitterBuffer::GetNackList(bool* request_key_frame) { 963 std::vector<uint16_t> VCMJitterBuffer::GetNackList(bool* request_key_frame) {
967 CriticalSectionScoped cs(crit_sect_); 964 rtc::CritScope cs(&crit_sect_);
968 *request_key_frame = false; 965 *request_key_frame = false;
969 if (nack_mode_ == kNoNack) { 966 if (nack_mode_ == kNoNack) {
970 return std::vector<uint16_t>(); 967 return std::vector<uint16_t>();
971 } 968 }
972 if (last_decoded_state_.in_initial_state()) { 969 if (last_decoded_state_.in_initial_state()) {
973 VCMFrameBuffer* next_frame = NextFrame(); 970 VCMFrameBuffer* next_frame = NextFrame();
974 const bool first_frame_is_key = next_frame && 971 const bool first_frame_is_key = next_frame &&
975 next_frame->FrameType() == kVideoFrameKey && 972 next_frame->FrameType() == kVideoFrameKey &&
976 next_frame->HaveFirstPacket(); 973 next_frame->HaveFirstPacket();
977 if (!first_frame_is_key) { 974 if (!first_frame_is_key) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1017 DropPacketsFromNackList(EstimatedLowSequenceNumber(*rit->second)); 1014 DropPacketsFromNackList(EstimatedLowSequenceNumber(*rit->second));
1018 } 1015 }
1019 } 1016 }
1020 } 1017 }
1021 std::vector<uint16_t> nack_list(missing_sequence_numbers_.begin(), 1018 std::vector<uint16_t> nack_list(missing_sequence_numbers_.begin(),
1022 missing_sequence_numbers_.end()); 1019 missing_sequence_numbers_.end());
1023 return nack_list; 1020 return nack_list;
1024 } 1021 }
1025 1022
1026 void VCMJitterBuffer::SetDecodeErrorMode(VCMDecodeErrorMode error_mode) { 1023 void VCMJitterBuffer::SetDecodeErrorMode(VCMDecodeErrorMode error_mode) {
1027 CriticalSectionScoped cs(crit_sect_); 1024 rtc::CritScope cs(&crit_sect_);
1028 decode_error_mode_ = error_mode; 1025 decode_error_mode_ = error_mode;
1029 } 1026 }
1030 1027
1031 VCMFrameBuffer* VCMJitterBuffer::NextFrame() const { 1028 VCMFrameBuffer* VCMJitterBuffer::NextFrame() const {
1032 if (!decodable_frames_.empty()) 1029 if (!decodable_frames_.empty())
1033 return decodable_frames_.Front(); 1030 return decodable_frames_.Front();
1034 if (!incomplete_frames_.empty()) 1031 if (!incomplete_frames_.empty())
1035 return incomplete_frames_.Front(); 1032 return incomplete_frames_.Front();
1036 return NULL; 1033 return NULL;
1037 } 1034 }
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1117 uint16_t last_decoded_sequence_number) { 1114 uint16_t last_decoded_sequence_number) {
1118 // Erase all sequence numbers from the NACK list which we won't need any 1115 // Erase all sequence numbers from the NACK list which we won't need any
1119 // longer. 1116 // longer.
1120 missing_sequence_numbers_.erase( 1117 missing_sequence_numbers_.erase(
1121 missing_sequence_numbers_.begin(), 1118 missing_sequence_numbers_.begin(),
1122 missing_sequence_numbers_.upper_bound(last_decoded_sequence_number)); 1119 missing_sequence_numbers_.upper_bound(last_decoded_sequence_number));
1123 } 1120 }
1124 1121
1125 void VCMJitterBuffer::RegisterStatsCallback( 1122 void VCMJitterBuffer::RegisterStatsCallback(
1126 VCMReceiveStatisticsCallback* callback) { 1123 VCMReceiveStatisticsCallback* callback) {
1127 CriticalSectionScoped cs(crit_sect_); 1124 rtc::CritScope cs(&crit_sect_);
1128 stats_callback_ = callback; 1125 stats_callback_ = callback;
1129 } 1126 }
1130 1127
1131 VCMFrameBuffer* VCMJitterBuffer::GetEmptyFrame() { 1128 VCMFrameBuffer* VCMJitterBuffer::GetEmptyFrame() {
1132 if (free_frames_.empty()) { 1129 if (free_frames_.empty()) {
1133 if (!TryToIncreaseJitterBufferSize()) { 1130 if (!TryToIncreaseJitterBufferSize()) {
1134 return NULL; 1131 return NULL;
1135 } 1132 }
1136 } 1133 }
1137 VCMFrameBuffer* frame = free_frames_.front(); 1134 VCMFrameBuffer* frame = free_frames_.front();
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1301 } 1298 }
1302 return true; 1299 return true;
1303 } 1300 }
1304 1301
1305 void VCMJitterBuffer::RecycleFrameBuffer(VCMFrameBuffer* frame) { 1302 void VCMJitterBuffer::RecycleFrameBuffer(VCMFrameBuffer* frame) {
1306 frame->Reset(); 1303 frame->Reset();
1307 free_frames_.push_back(frame); 1304 free_frames_.push_back(frame);
1308 } 1305 }
1309 1306
1310 } // namespace webrtc 1307 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/video_coding/jitter_buffer.h ('k') | webrtc/system_wrappers/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698