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

Commit bf6142c4 authored by Lajos Molnar's avatar Lajos Molnar Committed by Android (Google) Code Review
Browse files

Merge "MediaCodec: Add HDR format metrics. Modify HDR metadata metrics." into tm-dev

parents f949df5e 3e237706
Loading
Loading
Loading
Loading
+74 −6
Original line number Diff line number Diff line
@@ -120,7 +120,9 @@ static const char *kCodecConfigColorTransfer = "android.media.mediacodec.config-
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";
static const char *kCodecHDRStaticInfo = "android.media.mediacodec.hdr-static-info";
static const char *kCodecHDR10PlusInfo = "android.media.mediacodec.hdr10-plus-info";
static const char *kCodecHDRFormat = "android.media.mediacodec.hdr-format";

// Min/Max QP before shaping
static const char *kCodecOriginalVideoQPIMin = "android.media.mediacodec.original-video-qp-i-min";
@@ -805,7 +807,9 @@ MediaCodec::MediaCodec(
      mWidth(0),
      mHeight(0),
      mRotationDegrees(0),
      mHDRMetadataFlags(0),
      mConfigColorTransfer(-1),
      mHDRStaticInfo(false),
      mHDR10PlusInfo(false),
      mDequeueInputTimeoutGeneration(0),
      mDequeueInputReplyID(0),
      mDequeueOutputTimeoutGeneration(0),
@@ -951,13 +955,71 @@ void MediaCodec::updateMediametrics() {
                              mIndexOfFirstFrameWhenLowLatencyOn);
    }

    mediametrics_setInt32(mMetricsHandle, kCodecHDRMetadataFlags, mHDRMetadataFlags);
    mediametrics_setInt32(mMetricsHandle, kCodecHDRStaticInfo, mHDRStaticInfo ? 1 : 0);
    mediametrics_setInt32(mMetricsHandle, kCodecHDR10PlusInfo, mHDR10PlusInfo ? 1 : 0);
#if 0
    // enable for short term, only while debugging
    updateEphemeralMediametrics(mMetricsHandle);
#endif
}

void MediaCodec::updateHDRFormatMetric() {
    int32_t profile = -1;
    AString mediaType;
    if (mOutputFormat->findInt32(KEY_PROFILE, &profile)
            && mOutputFormat->findString("mime", &mediaType)) {
        hdr_format hdrFormat = getHDRFormat(profile, mConfigColorTransfer, mediaType);
        mediametrics_setInt32(mMetricsHandle, kCodecHDRFormat, static_cast<int>(hdrFormat));
    }
}

hdr_format MediaCodec::getHDRFormat(const int32_t profile, const int32_t transfer,
        const AString &mediaType) {
    switch (transfer) {
        case COLOR_TRANSFER_ST2084:
            if (mediaType.equalsIgnoreCase(MEDIA_MIMETYPE_VIDEO_VP9)) {
                switch (profile) {
                    case VP9Profile2HDR:
                        return HDR_FORMAT_HDR10;
                    case VP9Profile2HDR10Plus:
                        return HDR_FORMAT_HDR10PLUS;
                    default:
                        return HDR_FORMAT_NONE;
                }
            } else if (mediaType.equalsIgnoreCase(MEDIA_MIMETYPE_VIDEO_AV1)) {
                switch (profile) {
                    case AV1ProfileMain10HDR10:
                        return HDR_FORMAT_HDR10;
                    case AV1ProfileMain10HDR10Plus:
                        return HDR_FORMAT_HDR10PLUS;
                    default:
                        return HDR_FORMAT_NONE;
                }
            } else if (mediaType.equalsIgnoreCase(MEDIA_MIMETYPE_VIDEO_HEVC)) {
                switch (profile) {
                    case HEVCProfileMain10HDR10:
                        return HDR_FORMAT_HDR10;
                    case HEVCProfileMain10HDR10Plus:
                        return HDR_FORMAT_HDR10PLUS;
                    default:
                        return HDR_FORMAT_NONE;
                }
            } else {
                return HDR_FORMAT_NONE;
            }
        case COLOR_TRANSFER_HLG:
            if (!mediaType.equalsIgnoreCase(MEDIA_MIMETYPE_VIDEO_DOLBY_VISION)) {
                return HDR_FORMAT_HLG;
            } else {
                // TODO: DOLBY format
                return HDR_FORMAT_NONE;
            }
        default:
            return HDR_FORMAT_NONE;
    }
}


void MediaCodec::updateEphemeralMediametrics(mediametrics_handle_t item) {
    ALOGD("MediaCodec::updateEphemeralMediametrics()");

@@ -1647,12 +1709,13 @@ status_t MediaCodec::configure(
            }
            int32_t colorTransfer = -1;
            if (format->findInt32(KEY_COLOR_TRANSFER, &colorTransfer)) {
                mConfigColorTransfer = colorTransfer;
                mediametrics_setInt32(mMetricsHandle, kCodecConfigColorTransfer, colorTransfer);
            }
            HDRStaticInfo info;
            if (ColorUtils::getHDRStaticInfoFromFormat(format, &info)
                    && ColorUtils::isHDRStaticInfoValid(&info)) {
                mHDRMetadataFlags |= kFlagHDRStaticInfo;
                mHDRStaticInfo = true;
            }
        }

@@ -3307,6 +3370,8 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
                    CHECK(msg->findMessage("input-format", &mInputFormat));
                    CHECK(msg->findMessage("output-format", &mOutputFormat));

                    updateHDRFormatMetric();

                    // limit to confirming the opt-in behavior to minimize any behavioral change
                    if (mSurface != nullptr && !mAllowFrameDroppingBySurface) {
                        // signal frame dropping mode in the input format as this may also be
@@ -3388,6 +3453,7 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
                                mComponentName.c_str(),
                                mInputFormat->debugString(4).c_str(),
                                mOutputFormat->debugString(4).c_str());
                        updateHDRFormatMetric();
                        CHECK(obj != NULL);
                        response->setObject("input-surface", obj);
                        mHaveInputSurface = true;
@@ -3412,6 +3478,7 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
                    if (!msg->findInt32("err", &err)) {
                        CHECK(msg->findMessage("input-format", &mInputFormat));
                        CHECK(msg->findMessage("output-format", &mOutputFormat));
                        updateHDRFormatMetric();
                        mHaveInputSurface = true;
                    } else {
                        response->setInt32("err", err);
@@ -4583,6 +4650,7 @@ void MediaCodec::handleOutputFormatChangeIfNeeded(const sp<MediaCodecBuffer> &bu
        buffer->meta()->setObject("changedKeys", changedKeys);
    }
    mOutputFormat = format;
    updateHDRFormatMetric();
    mapFormat(mComponentName, format, nullptr, true);
    ALOGV("[%s] output format changed to: %s",
            mComponentName.c_str(), mOutputFormat->debugString(4).c_str());
@@ -4609,7 +4677,7 @@ void MediaCodec::handleOutputFormatChangeIfNeeded(const sp<MediaCodecBuffer> &bu
            if (ColorUtils::getHDRStaticInfoFromFormat(mOutputFormat, &info)) {
                setNativeWindowHdrMetadata(mSurface.get(), &info);
                if (ColorUtils::isHDRStaticInfoValid(&info)) {
                    mHDRMetadataFlags |= kFlagHDRStaticInfo;
                    mHDRStaticInfo = true;
                }
            }
        }
@@ -4619,7 +4687,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;
            mHDR10PlusInfo = true;
        }

        if (mime.startsWithIgnoreCase("video/")) {
+7 −5
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <media/hardware/CryptoAPI.h>
#include <media/MediaCodecInfo.h>
#include <media/MediaMetrics.h>
#include <media/MediaProfiles.h>
#include <media/stagefright/foundation/AHandler.h>
#include <media/stagefright/FrameRenderTracker.h>
#include <utils/Vector.h>
@@ -451,11 +452,12 @@ private:
    int32_t mRotationDegrees;
    int32_t mAllowFrameDroppingBySurface;

    uint32_t mHDRMetadataFlags; /* bitmask of kFlagHDR* */
    enum {
        kFlagHDRStaticInfo = 1 << 0,
        kFlagHDR10PlusInfo = 1 << 1,
    };
    int32_t mConfigColorTransfer;
    bool mHDRStaticInfo;
    bool mHDR10PlusInfo;
    void updateHDRFormatMetric();
    hdr_format getHDRFormat(const int32_t profile, const int32_t transfer,
            const AString &mediaType);

    // initial create parameters
    AString mInitName;
+53 −41
Original line number Diff line number Diff line
@@ -390,47 +390,59 @@ 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);
    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 hdrStaticInfo = -1;
    if (item->getInt32("android.media.mediacodec.hdr-static-info", &hdrStaticInfo)) {
        metrics_proto.set_hdr_static_info(hdrStaticInfo);
    }
    AStatsEvent_writeInt32(event, hdrStaticInfo);

    int32_t hdr10PlusInfo = -1;
    if (item->getInt32("android.media.mediacodec.hdr10-plus-info", &hdr10PlusInfo)) {
        metrics_proto.set_hdr10_plus_info(hdr10PlusInfo);
    }
    AStatsEvent_writeInt32(event, hdr10PlusInfo);

    int32_t hdrFormat= -1;
    if (item->getInt32("android.media.mediacodec.hdr-format", &hdrFormat)) {
        metrics_proto.set_hdr_format(hdrFormat);
    }
    AStatsEvent_writeInt32(event, hdrFormat);

    int err = AStatsEvent_write(event);
    if (err < 0) {