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

Commit 2048d499 authored by Brian Lindahl's avatar Brian Lindahl Committed by Cherrypicker Worker
Browse files

Send onFrameRendered differently depending on whether the surface is a

display

When rendering on the display, only send onFrameRendered when the video
frame is actually rendered on the display. Otherwise, send it when it is
queued to the surface.

Bug: 234833109
Bug: 274472195
Test: atest DecoderRenderTest
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:e4f38afb622bb9620d7f3345383daeb8a860f55d)
Merged-In: I35f1e8a844d9a96b04d8c6b2c00881e7ec09f98d
Change-Id: I35f1e8a844d9a96b04d8c6b2c00881e7ec09f98d
parent c4b5507f
Loading
Loading
Loading
Loading
+21 −3
Original line number Diff line number Diff line
@@ -147,6 +147,8 @@ CCodecBufferChannel::CCodecBufferChannel(
      mCCodecCallback(callback),
      mFrameIndex(0u),
      mFirstValidFrameIndex(0u),
      mIsSurfaceToDisplay(false),
      mHasPresentFenceTimes(false),
      mMetaMode(MODE_NONE),
      mInputMetEos(false),
      mSendEncryptedInfoBuffer(false) {
@@ -988,20 +990,36 @@ status_t CCodecBufferChannel::renderOutputBuffer(

    int64_t mediaTimeUs = 0;
    (void)buffer->meta()->findInt64("timeUs", &mediaTimeUs);
    if (mIsSurfaceToDisplay) {
        trackReleasedFrame(qbo, mediaTimeUs, timestampNs);
        processRenderedFrames(qbo.frameTimestamps);
    } else {
        // When the surface is an intermediate surface, onFrameRendered is triggered immediately
        // when the frame is queued to the non-display surface
        mCCodecCallback->onOutputFramesRendered(mediaTimeUs, timestampNs);
    }

    return OK;
}

void CCodecBufferChannel::initializeFrameTrackingFor(ANativeWindow * window) {
    mTrackedFrames.clear();

    int isSurfaceToDisplay = 0;
    window->query(window, NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, &isSurfaceToDisplay);
    mIsSurfaceToDisplay = isSurfaceToDisplay == 1;
    // No frame tracking is needed if we're not sending frames to the display
    if (!mIsSurfaceToDisplay) {
        // Return early so we don't call into SurfaceFlinger (requiring permissions)
        return;
    }

    int hasPresentFenceTimes = 0;
    window->query(window, NATIVE_WINDOW_FRAME_TIMESTAMPS_SUPPORTS_PRESENT, &hasPresentFenceTimes);
    mHasPresentFenceTimes = hasPresentFenceTimes == 1;
    if (mHasPresentFenceTimes) {
        ALOGI("Using latch times for frame rendered signals - present fences not supported");
    }
    mTrackedFrames.clear();
}

void CCodecBufferChannel::trackReleasedFrame(const IGraphicBufferProducer::QueueBufferOutput& qbo,
+1 −0
Original line number Diff line number Diff line
@@ -331,6 +331,7 @@ private:
    sp<MemoryDealer> makeMemoryDealer(size_t heapSize);

    std::deque<TrackedFrame> mTrackedFrames;
    bool mIsSurfaceToDisplay;
    bool mHasPresentFenceTimes;

    struct OutputSurface {