Make screenshare_layers frame dropper less aggressive
Try to use frame timestamps first if they look reasonable, otherwise use realtime clock. Also, lower limit from 90% of target to 85%. Bug: webrtc:4172, chromium:802290 Change-Id: Iad489be7c7cf637345be4795e5089936ab9fab07 Reviewed-on: https://webrtc-review.googlesource.com/41041 Commit-Queue: Erik Språng <sprang@webrtc.org> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Cr-Commit-Position: refs/heads/master@{#21729}
This commit is contained in:
@ -127,15 +127,25 @@ TemporalLayers::FrameConfig ScreenshareLayers::UpdateLayerConfig(
|
||||
// If input frame rate exceeds target frame rate, either over a one second
|
||||
// averaging window, or if frame interval is below 90% of desired value,
|
||||
// drop frame.
|
||||
// Use real-time clock rather than timestamps, in case there is a
|
||||
// discontinuity in the timestamps sequence.
|
||||
if (encode_framerate_.Rate(now_ms).value_or(0) > *target_framerate_)
|
||||
return TemporalLayers::FrameConfig(kNone, kNone, kNone);
|
||||
|
||||
int64_t expected_frame_interval_ms = 1000 / *target_framerate_;
|
||||
if (last_frame_time_ms_ != -1 &&
|
||||
now_ms - last_frame_time_ms_ < (9 * expected_frame_interval_ms) / 10) {
|
||||
return TemporalLayers::FrameConfig(kNone, kNone, kNone);
|
||||
// Primarily check if frame interval is too short using frame timestamps,
|
||||
// as if they are correct they won't be affected by queuing in webrtc.
|
||||
const int64_t expected_frame_interval_90khz =
|
||||
kOneSecond90Khz / *target_framerate_;
|
||||
if (last_timestamp_ != -1 && ts_diff > 0) {
|
||||
if (ts_diff < 85 * expected_frame_interval_90khz / 100) {
|
||||
return TemporalLayers::FrameConfig(kNone, kNone, kNone);
|
||||
}
|
||||
} else {
|
||||
// Timestamps looks off, use realtime clock here instead.
|
||||
const int64_t expected_frame_interval_ms = 1000 / *target_framerate_;
|
||||
if (last_frame_time_ms_ != -1 &&
|
||||
now_ms - last_frame_time_ms_ <
|
||||
(85 * expected_frame_interval_ms) / 100) {
|
||||
return TemporalLayers::FrameConfig(kNone, kNone, kNone);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -617,7 +617,7 @@ TEST_F(ScreenshareLayerTest, DropOnTooShortFrameInterval) {
|
||||
|
||||
// Frame interval below 90% if desired time is not allowed, try inserting
|
||||
// frame just before this limit.
|
||||
const int64_t kMinFrameInterval = (kTimestampDelta5Fps * 9) / 10;
|
||||
const int64_t kMinFrameInterval = (kTimestampDelta5Fps * 85) / 100;
|
||||
timestamp_ += kMinFrameInterval - 90;
|
||||
EXPECT_TRUE(UpdateLayerConfig(timestamp_).drop_frame);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user