Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 87acc508 authored by Brian Lindahl's avatar Brian Lindahl
Browse files

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
parent da30ff98
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -1044,6 +1044,15 @@ void CCodecBufferChannel::trackReleasedFrame(const IGraphicBufferProducer::Queue
    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;
+9 −0
Original line number Diff line number Diff line
@@ -1583,6 +1583,15 @@ void ACodec::trackReleasedFrame(int64_t frameId, int64_t mediaTimeUs, int64_t de
    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;