From db9e9d5486c40f4b78513fedc79b9b22ad3e5751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Spr=C3=A5ng?= Date: Mon, 22 Jan 2018 09:23:11 -0800 Subject: [PATCH] Make screenshare_layers frame dropper less aggressive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Ilya Nikolaevskiy Cr-Commit-Position: refs/heads/master@{#21729} --- .../codecs/vp8/screenshare_layers.cc | 22 ++++++++++++++----- .../codecs/vp8/screenshare_layers_unittest.cc | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/modules/video_coding/codecs/vp8/screenshare_layers.cc b/modules/video_coding/codecs/vp8/screenshare_layers.cc index 444c0ccc90..8c63cf1a08 100644 --- a/modules/video_coding/codecs/vp8/screenshare_layers.cc +++ b/modules/video_coding/codecs/vp8/screenshare_layers.cc @@ -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); + } } } diff --git a/modules/video_coding/codecs/vp8/screenshare_layers_unittest.cc b/modules/video_coding/codecs/vp8/screenshare_layers_unittest.cc index 422905d9ff..818308f3b0 100644 --- a/modules/video_coding/codecs/vp8/screenshare_layers_unittest.cc +++ b/modules/video_coding/codecs/vp8/screenshare_layers_unittest.cc @@ -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);