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

Commit 0c2cf568 authored by Songyue Han's avatar Songyue Han Committed by Automerger Merge Worker
Browse files

Merge "MediaCodec: Add HDR metrics." am: 46bfebee

Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/1956540

Change-Id: I41304ed5f7ef35238c971c90549257f493857e22
parents b078796d 46bfebee
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
@@ -112,6 +112,13 @@ static const char *kCodecFrameRate = "android.media.mediacodec.frame-rate";
static const char *kCodecCaptureRate = "android.media.mediacodec.capture-rate";
static const char *kCodecOperatingRate = "android.media.mediacodec.operating-rate";
static const char *kCodecPriority = "android.media.mediacodec.priority";
static const char *kCodecConfigColorStandard = "android.media.mediacodec.config-color-standard";
static const char *kCodecConfigColorRange = "android.media.mediacodec.config-color-range";
static const char *kCodecConfigColorTransfer = "android.media.mediacodec.config-color-transfer";
static const char *kCodecParsedColorStandard = "android.media.mediacodec.parsed-color-standard";
static const char *kCodecParsedColorRange = "android.media.mediacodec.parsed-color-range";
static const char *kCodecParsedColorTransfer = "android.media.mediacodec.parsed-color-transfer";
static const char *kCodecHDRMetadataFlags = "android.media.mediacodec.hdr-metadata-flags";

// Min/Max QP before shaping
static const char *kCodecOriginalVideoQPIMin = "android.media.mediacodec.original-video-qp-i-min";
@@ -748,6 +755,7 @@ MediaCodec::MediaCodec(
      mVideoWidth(0),
      mVideoHeight(0),
      mRotationDegrees(0),
      mHDRMetadataFlags(0),
      mDequeueInputTimeoutGeneration(0),
      mDequeueInputReplyID(0),
      mDequeueOutputTimeoutGeneration(0),
@@ -898,6 +906,8 @@ void MediaCodec::updateMediametrics() {
        mediametrics_setInt64(mMetricsHandle, kCodecFirstFrameIndexLowLatencyModeOn,
                              mIndexOfFirstFrameWhenLowLatencyOn);
    }

    mediametrics_setInt32(mMetricsHandle, kCodecHDRMetadataFlags, mHDRMetadataFlags);
#if 0
    // enable for short term, only while debugging
    updateEphemeralMediametrics(mMetricsHandle);
@@ -1566,6 +1576,23 @@ status_t MediaCodec::configure(
            if (format->findInt32("priority", &priority)) {
                mediametrics_setInt32(mMetricsHandle, kCodecPriority, priority);
            }
            int32_t colorStandard = -1;
            if (format->findInt32(KEY_COLOR_STANDARD, &colorStandard)) {
                mediametrics_setInt32(mMetricsHandle, kCodecConfigColorStandard, colorStandard);
            }
            int32_t colorRange = -1;
            if (format->findInt32(KEY_COLOR_RANGE, &colorRange)) {
                mediametrics_setInt32(mMetricsHandle, kCodecConfigColorRange, colorRange);
            }
            int32_t colorTransfer = -1;
            if (format->findInt32(KEY_COLOR_TRANSFER, &colorTransfer)) {
                mediametrics_setInt32(mMetricsHandle, kCodecConfigColorTransfer, colorTransfer);
            }
            HDRStaticInfo info;
            if (ColorUtils::getHDRStaticInfoFromFormat(format, &info)
                    && ColorUtils::isHDRStaticInfoValid(&info)) {
                mHDRMetadataFlags |= kFlagHDRStaticInfo;
            }
        }

        // Prevent possible integer overflow in downstream code.
@@ -4516,6 +4543,9 @@ void MediaCodec::handleOutputFormatChangeIfNeeded(const sp<MediaCodecBuffer> &bu
            HDRStaticInfo info;
            if (ColorUtils::getHDRStaticInfoFromFormat(mOutputFormat, &info)) {
                setNativeWindowHdrMetadata(mSurface.get(), &info);
                if (ColorUtils::isHDRStaticInfoValid(&info)) {
                    mHDRMetadataFlags |= kFlagHDRStaticInfo;
                }
            }
        }

@@ -4524,6 +4554,7 @@ void MediaCodec::handleOutputFormatChangeIfNeeded(const sp<MediaCodecBuffer> &bu
                && hdr10PlusInfo != nullptr && hdr10PlusInfo->size() > 0) {
            native_window_set_buffers_hdr10_plus_metadata(mSurface.get(),
                    hdr10PlusInfo->size(), hdr10PlusInfo->data());
            mHDRMetadataFlags |= kFlagHDR10PlusInfo;
        }

        if (mime.startsWithIgnoreCase("video/")) {
@@ -4568,6 +4599,21 @@ void MediaCodec::handleOutputFormatChangeIfNeeded(const sp<MediaCodecBuffer> &bu
            mCrypto->notifyResolution(width, height);
        }
    }

    if (mMetricsHandle != 0) {
        int32_t colorStandard = -1;
        if (format->findInt32(KEY_COLOR_STANDARD, &colorStandard)) {
            mediametrics_setInt32(mMetricsHandle, kCodecParsedColorStandard, colorStandard);
        }
        int32_t colorRange = -1;
        if (format->findInt32( KEY_COLOR_RANGE, &colorRange)) {
            mediametrics_setInt32(mMetricsHandle, kCodecParsedColorRange, colorRange);
        }
        int32_t colorTransfer = -1;
        if (format->findInt32(KEY_COLOR_TRANSFER, &colorTransfer)) {
            mediametrics_setInt32(mMetricsHandle, kCodecParsedColorTransfer, colorTransfer);
        }
    }
}

void MediaCodec::extractCSD(const sp<AMessage> &format) {
+9 −0
Original line number Diff line number Diff line
@@ -781,5 +781,14 @@ bool ColorUtils::getHDRStaticInfoFromFormat(const sp<AMessage> &format, HDRStati
    return true;
}

// static
bool ColorUtils::isHDRStaticInfoValid(HDRStaticInfo *info) {
    if (info->sType1.mMaxDisplayLuminance > 0.0f
        && info->sType1.mMinDisplayLuminance > 0.0f)  return true;
    if (info->sType1.mMaxContentLightLevel > 0.0f
        && info->sType1.mMaxFrameAverageLightLevel > 0.0f)  return true;
    return false;
}

}  // namespace android
+3 −0
Original line number Diff line number Diff line
@@ -193,6 +193,9 @@ struct ColorUtils {
    static void setHDRStaticInfoIntoAMediaFormat(const HDRStaticInfo &info, AMediaFormat *format);
    // (internal) used by the setHDRStaticInfoInfo* routines
    static void fillHdrStaticInfoBuffer( const HDRStaticInfo &info, uint8_t *data);

    // determine whether HDR static info is valid
    static bool isHDRStaticInfoValid(HDRStaticInfo *info);
};

inline static const char *asString(android::ColorUtils::ColorStandard i, const char *def = "??") {
+6 −0
Original line number Diff line number Diff line
@@ -445,6 +445,12 @@ private:
    int32_t mRotationDegrees;
    int32_t mAllowFrameDroppingBySurface;

    uint32_t mHDRMetadataFlags; /* bitmask of kFlagHDR* */
    enum {
        kFlagHDRStaticInfo = 1 << 0,
        kFlagHDR10PlusInfo = 1 << 1,
    };

    // initial create parameters
    AString mInitName;

+42 −0
Original line number Diff line number Diff line
@@ -390,6 +390,48 @@ bool statsd_codec(const std::shared_ptr<const mediametrics::Item>& item,
    }
    AStatsEvent_writeInt32(event, qpBMaxOri);

    // int32_t configColorStandard = -1;
    // if (item->getInt32("android.media.mediacodec.config-color-standard", &configColorStandard)) {
    //     metrics_proto.set_config_color_standard(configColorStandard);
    // }
    // AStatsEvent_writeInt32(event, configColorStandard);

    // int32_t configColorRange = -1;
    // if (item->getInt32("android.media.mediacodec.config-color-range", &configColorRange)) {
    //     metrics_proto.set_config_color_range(configColorRange);
    // }
    // AStatsEvent_writeInt32(event, configColorRange);

    // int32_t configColorTransfer = -1;
    // if (item->getInt32("android.media.mediacodec.config-color-transfer", &configColorTransfer)) {
    //     metrics_proto.set_config_color_transfer(configColorTransfer);
    // }
    // AStatsEvent_writeInt32(event, configColorTransfer);

    // int32_t parsedColorStandard = -1;
    // if (item->getInt32("android.media.mediacodec.parsed-color-standard", &parsedColorStandard)) {
    //     metrics_proto.set_parsed_color_standard(parsedColorStandard);
    // }
    // AStatsEvent_writeInt32(event, parsedColorStandard);

    // int32_t parsedColorRange = -1;
    // if (item->getInt32("android.media.mediacodec.parsed-color-range", &parsedColorRange)) {
    //     metrics_proto.set_parsed_color_range(parsedColorRange);
    // }
    // AStatsEvent_writeInt32(event, parsedColorRange);

    // int32_t parsedColorTransfer = -1;
    // if (item->getInt32("android.media.mediacodec.parsed-color-transfer", &parsedColorTransfer)) {
    //     metrics_proto.set_parsed_color_transfer(parsedColorTransfer);
    // }
    // AStatsEvent_writeInt32(event, parsedColorTransfer);

    // int32_t hdrMetadataFlags = -1;
    // if (item->getInt32("android.media.mediacodec.hdr-metadata-flags", &hdrMetadataFlags)) {
    //     metrics_proto.set_hdr_metadata_flags(hdrMetadataFlags);
    // }
    // AStatsEvent_writeInt32(event, hdrMetadataFlags);

    int err = AStatsEvent_write(event);
    if (err < 0) {
      ALOGE("Failed to write codec metrics to statsd (%d)", err);