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}
diff --git a/modules/video_coding/codecs/vp8/screenshare_layers.cc b/modules/video_coding/codecs/vp8/screenshare_layers.cc
index 444c0cc..8c63cf1 100644
--- a/modules/video_coding/codecs/vp8/screenshare_layers.cc
+++ b/modules/video_coding/codecs/vp8/screenshare_layers.cc
@@ -127,15 +127,25 @@
     // 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 422905d..818308f 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 @@
 
   // 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);