Add sender controlled playout delay limits
This CL adds support for an extension on RTP frames to allow the sender to specify the minimum and maximum playout delay limits. The receiver makes a best-effort attempt to keep the capture-to-render delay within this range. This allows different types of application to specify different end-to-end delay goals. For example gaming can support rendering of frames as soon as received on receiver to minimize delay. A movie playback application can specify a minimum playout delay to allow fixed buffering in presence of network jitter. There are no tests at this time and most of testing is done with chromium webrtc prototype. On chromoting performance tests, this extension helps bring down end-to-end delay by about 150 ms on small frames. BUG=webrtc:5895 Review-Url: https://codereview.webrtc.org/2007743003 Cr-Commit-Position: refs/heads/master@{#13059}
This commit is contained in:
@ -144,15 +144,26 @@ VCMEncodedFrame* VCMReceiver::FrameForDecoding(uint16_t max_wait_time_ms,
|
||||
bool prefer_late_decoding) {
|
||||
const int64_t start_time_ms = clock_->TimeInMilliseconds();
|
||||
uint32_t frame_timestamp = 0;
|
||||
int min_playout_delay_ms = -1;
|
||||
int max_playout_delay_ms = -1;
|
||||
// Exhaust wait time to get a complete frame for decoding.
|
||||
bool found_frame =
|
||||
jitter_buffer_.NextCompleteTimestamp(max_wait_time_ms, &frame_timestamp);
|
||||
VCMEncodedFrame* found_frame =
|
||||
jitter_buffer_.NextCompleteFrame(max_wait_time_ms);
|
||||
|
||||
if (!found_frame)
|
||||
found_frame = jitter_buffer_.NextMaybeIncompleteTimestamp(&frame_timestamp);
|
||||
if (found_frame) {
|
||||
frame_timestamp = found_frame->TimeStamp();
|
||||
min_playout_delay_ms = found_frame->EncodedImage().playout_delay_.min_ms;
|
||||
max_playout_delay_ms = found_frame->EncodedImage().playout_delay_.max_ms;
|
||||
} else {
|
||||
if (!jitter_buffer_.NextMaybeIncompleteTimestamp(&frame_timestamp))
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (!found_frame)
|
||||
return NULL;
|
||||
if (min_playout_delay_ms >= 0)
|
||||
timing_->set_min_playout_delay(min_playout_delay_ms);
|
||||
|
||||
if (max_playout_delay_ms >= 0)
|
||||
timing_->set_max_playout_delay(max_playout_delay_ms);
|
||||
|
||||
// We have a frame - Set timing and render timestamp.
|
||||
timing_->SetJitterDelay(jitter_buffer_.EstimatedJitterMs());
|
||||
|
||||
Reference in New Issue
Block a user