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

Commit 95a52583 authored by Brian Lindahl's avatar Brian Lindahl
Browse files

Hide accurate onFrameRendered calls behind render metrics feature flag

onFrameRendered calls were modified to be based on present fences,
instead of firing immediately after the app releases the buffer to
SurfaceFlinger. Hide this modification behind the render metrics feature
flag to avoid problems encountered by dogfooders.

Bug: 294920725
Test: add log statements to verify legacy mechanism for onFrameRendered
calls is switchable with the video render metrics feature flag

Change-Id: Ia6f74d8ab72a20eaf167273a1944eddb56f87284
parent 02bed38e
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ using hardware::hidl_string;
using hardware::hidl_vec;
using hardware::fromHeap;
using hardware::HidlMemory;
using server_configurable_flags::GetServerConfigurableFlag;

using namespace hardware::cas::V1_0;
using namespace hardware::cas::native::V1_0;
@@ -82,6 +83,11 @@ constexpr size_t kSmoothnessFactor = 4;
// than making it non-blocking. Do not change this value.
const static size_t kDequeueTimeoutNs = 0;

static bool areRenderMetricsEnabled() {
    std::string v = GetServerConfigurableFlag("media_native", "render_metrics_enabled", "false");
    return v == "true";
}

}  // namespace

CCodecBufferChannel::QueueGuard::QueueGuard(
@@ -148,6 +154,7 @@ CCodecBufferChannel::CCodecBufferChannel(
      mCCodecCallback(callback),
      mFrameIndex(0u),
      mFirstValidFrameIndex(0u),
      mAreRenderMetricsEnabled(areRenderMetricsEnabled()),
      mIsSurfaceToDisplay(false),
      mHasPresentFenceTimes(false),
      mRenderingDepth(3u),
@@ -174,8 +181,7 @@ CCodecBufferChannel::CCodecBufferChannel(
        Mutexed<BlockPools>::Locked pools(mBlockPools);
        pools->outputPoolId = C2BlockPool::BASIC_LINEAR;
    }
    std::string value = server_configurable_flags::GetServerConfigurableFlag(
            "media_native", "ccodec_rendering_depth", "3");
    std::string value = GetServerConfigurableFlag("media_native", "ccodec_rendering_depth", "3");
    android::base::ParseInt(value, &mRenderingDepth);
    mOutputSurface.lock()->maxDequeueBuffers = kSmoothnessFactor + mRenderingDepth;
}
@@ -996,7 +1002,7 @@ status_t CCodecBufferChannel::renderOutputBuffer(

    int64_t mediaTimeUs = 0;
    (void)buffer->meta()->findInt64("timeUs", &mediaTimeUs);
    if (mIsSurfaceToDisplay) {
    if (mAreRenderMetricsEnabled && mIsSurfaceToDisplay) {
        trackReleasedFrame(qbo, mediaTimeUs, timestampNs);
        processRenderedFrames(qbo.frameTimestamps);
    } else {
+1 −0
Original line number Diff line number Diff line
@@ -334,6 +334,7 @@ private:
    sp<MemoryDealer> makeMemoryDealer(size_t heapSize);

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

+9 −2
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ using aidl::android::media::BnResourceManagerClient;
using aidl::android::media::IResourceManagerClient;
using aidl::android::media::IResourceManagerService;
using aidl::android::media::ClientInfoParcel;
using server_configurable_flags::GetServerConfigurableFlag;
using FreezeEvent = VideoRenderQualityTracker::FreezeEvent;
using JudderEvent = VideoRenderQualityTracker::JudderEvent;

@@ -282,6 +283,11 @@ static bool isResourceError(status_t err) {
    return (err == NO_MEMORY);
}

static bool areRenderMetricsEnabled() {
    std::string v = GetServerConfigurableFlag("media_native", "render_metrics_enabled", "false");
    return v == "true";
}

static const int kMaxRetry = 2;
static const int kMaxReclaimWaitTimeInUs = 500000;  // 0.5s
static const int kNumBuffersAlign = 16;
@@ -1025,9 +1031,10 @@ MediaCodec::MediaCodec(
      mHavePendingInputBuffers(false),
      mCpuBoostRequested(false),
      mIsSurfaceToDisplay(false),
      mAreRenderMetricsEnabled(areRenderMetricsEnabled()),
      mVideoRenderQualityTracker(
              VideoRenderQualityTracker::Configuration::getFromServerConfigurableFlags(
                      server_configurable_flags::GetServerConfigurableFlag)),
                      GetServerConfigurableFlag)),
      mLatencyUnknown(0),
      mBytesEncoded(0),
      mEarliestEncodedPtsUs(INT64_MAX),
@@ -6044,7 +6051,7 @@ status_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) {

        // If rendering to the screen, then schedule a time in the future to poll to see if this
        // frame was ever rendered to seed onFrameRendered callbacks.
        if (mIsSurfaceToDisplay) {
        if (mAreRenderMetricsEnabled && mIsSurfaceToDisplay) {
            if (mediaTimeUs != INT64_MIN) {
                noRenderTime ? mVideoRenderQualityTracker.onFrameReleased(mediaTimeUs)
                             : mVideoRenderQualityTracker.onFrameReleased(mediaTimeUs,
+1 −1
Original line number Diff line number Diff line
@@ -154,7 +154,7 @@ VideoRenderQualityTracker::Configuration
}

VideoRenderQualityTracker::Configuration::Configuration() {
    enabled = true;
    enabled = false;

    // Assume that the app is skipping frames because it's detected that the frame couldn't be
    // rendered in time.
+1 −0
Original line number Diff line number Diff line
@@ -572,6 +572,7 @@ private:
    sp<ALooper> mCryptoLooper;

    bool mIsSurfaceToDisplay;
    bool mAreRenderMetricsEnabled;
    PlaybackDurationAccumulator mPlaybackDurationAccumulator;
    VideoRenderQualityTracker mVideoRenderQualityTracker;