Guard render metrics against too-large render times
Some apps may rely on SurfaceFlinger heuristics to change large invalid
desired render times to 'now' to render video frames as soon as
possible. Update render metrics to defensively handle these scenarios by
also assuming large invalid desired render times should actually be
'now'.
Bug: 294920725
Test: atest DecoderRenderTest#onFrameRendered_whenInvalidRenderTime_indicatesAllFramesRendered_vp9
Merged-In: If50ba1669ba0fdb3c0fbe5b322e12f8b421c9780
Change-Id: Ie890824d45dba636f0abac32da0e2f88ba7386cd
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
index f89e889..0db3eec 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.cpp
+++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp
@@ -1044,6 +1044,15 @@
if (desiredRenderTimeNs < nowNs) {
desiredRenderTimeNs = nowNs;
}
+
+ // If the render time is more than a second from now, then pretend the frame is supposed to be
+ // rendered immediately, because that's what SurfaceFlinger heuristics will do. This is a tight
+ // coupling, but is really the only way to optimize away unnecessary present fence checks in
+ // processRenderedFrames.
+ if (desiredRenderTimeNs > nowNs + 1*1000*1000*1000LL) {
+ desiredRenderTimeNs = nowNs;
+ }
+
// We've just queued a frame to the surface, so keep track of it and later check to see if it is
// actually rendered.
TrackedFrame frame;