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

Commit 40e4e616 authored by Dichen Zhang's avatar Dichen Zhang Committed by Automerger Merge Worker
Browse files

Merge "MediaMetrics: add kCodecShapingChangeCount and change QP data to be...

Merge "MediaMetrics: add kCodecShapingChangeCount and change QP data to be after shaping" into sc-dev am: 95c86600 am: b27b605e

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

Change-Id: I1e10ae5e5cfdf39f46c4f8be2268a689287f5a8f
parents 2648a336 b27b605e
Loading
Loading
Loading
Loading
+75 −26
Original line number Original line Diff line number Diff line
@@ -93,6 +93,7 @@ static const char *kCodecKeyName = "codec";
// NB: these are matched with public Java API constants defined
// NB: these are matched with public Java API constants defined
// in frameworks/base/media/java/android/media/MediaCodec.java
// in frameworks/base/media/java/android/media/MediaCodec.java
// These must be kept synchronized with the constants there.
// These must be kept synchronized with the constants there.
static const char *kCodecLogSessionId = "android.media.mediacodec.log-session-id";
static const char *kCodecCodec = "android.media.mediacodec.codec";  /* e.g. OMX.google.aac.decoder */
static const char *kCodecCodec = "android.media.mediacodec.codec";  /* e.g. OMX.google.aac.decoder */
static const char *kCodecMime = "android.media.mediacodec.mime";    /* e.g. audio/mime */
static const char *kCodecMime = "android.media.mediacodec.mime";    /* e.g. audio/mime */
static const char *kCodecMode = "android.media.mediacodec.mode";    /* audio, video */
static const char *kCodecMode = "android.media.mediacodec.mode";    /* audio, video */
@@ -108,6 +109,16 @@ static const char *kCodecFrameRate = "android.media.mediacodec.frame-rate";
static const char *kCodecCaptureRate = "android.media.mediacodec.capture-rate";
static const char *kCodecCaptureRate = "android.media.mediacodec.capture-rate";
static const char *kCodecOperatingRate = "android.media.mediacodec.operating-rate";
static const char *kCodecOperatingRate = "android.media.mediacodec.operating-rate";
static const char *kCodecPriority = "android.media.mediacodec.priority";
static const char *kCodecPriority = "android.media.mediacodec.priority";

// Min/Max QP before shaping
static const char *kCodecOriginalVideoQPIMin = "android.media.mediacodec.original-video-qp-i-min";
static const char *kCodecOriginalVideoQPIMax = "android.media.mediacodec.original-video-qp-i-max";
static const char *kCodecOriginalVideoQPPMin = "android.media.mediacodec.original-video-qp-p-min";
static const char *kCodecOriginalVideoQPPMax = "android.media.mediacodec.original-video-qp-p-max";
static const char *kCodecOriginalVideoQPBMin = "android.media.mediacodec.original-video-qp-b-min";
static const char *kCodecOriginalVideoQPBMax = "android.media.mediacodec.original-video-qp-b-max";

// Min/Max QP after shaping
static const char *kCodecRequestedVideoQPIMin = "android.media.mediacodec.video-qp-i-min";
static const char *kCodecRequestedVideoQPIMin = "android.media.mediacodec.video-qp-i-min";
static const char *kCodecRequestedVideoQPIMax = "android.media.mediacodec.video-qp-i-max";
static const char *kCodecRequestedVideoQPIMax = "android.media.mediacodec.video-qp-i-max";
static const char *kCodecRequestedVideoQPPMin = "android.media.mediacodec.video-qp-p-min";
static const char *kCodecRequestedVideoQPPMin = "android.media.mediacodec.video-qp-p-min";
@@ -156,7 +167,9 @@ static const char *kCodecRecentLatencyHist = "android.media.mediacodec.recent.hi
static const char *kCodecPlaybackDuration =
static const char *kCodecPlaybackDuration =
        "android.media.mediacodec.playback-duration"; /* in sec */
        "android.media.mediacodec.playback-duration"; /* in sec */


static const char *kCodecShapingEnhanced = "android.media.mediacodec.shaped";    /* 0/1 */
/* -1: shaper disabled
   >=0: number of fields changed */
static const char *kCodecShapingEnhanced = "android.media.mediacodec.shaped";


// XXX suppress until we get our representation right
// XXX suppress until we get our representation right
static bool kEmitHistogram = false;
static bool kEmitHistogram = false;
@@ -1491,6 +1504,8 @@ status_t MediaCodec::configure(
    }
    }


    if (mIsVideo) {
    if (mIsVideo) {
        // TODO: validity check log-session-id: it should be a 32-hex-digit.
        format->findString("log-session-id", &mLogSessionId);
        format->findInt32("width", &mVideoWidth);
        format->findInt32("width", &mVideoWidth);
        format->findInt32("height", &mVideoHeight);
        format->findInt32("height", &mVideoHeight);
        if (!format->findInt32("rotation-degrees", &mRotationDegrees)) {
        if (!format->findInt32("rotation-degrees", &mRotationDegrees)) {
@@ -1498,6 +1513,7 @@ status_t MediaCodec::configure(
        }
        }


        if (mMetricsHandle != 0) {
        if (mMetricsHandle != 0) {
            mediametrics_setCString(mMetricsHandle, kCodecLogSessionId, mLogSessionId.c_str());
            mediametrics_setInt32(mMetricsHandle, kCodecWidth, mVideoWidth);
            mediametrics_setInt32(mMetricsHandle, kCodecWidth, mVideoWidth);
            mediametrics_setInt32(mMetricsHandle, kCodecHeight, mVideoHeight);
            mediametrics_setInt32(mMetricsHandle, kCodecHeight, mVideoHeight);
            mediametrics_setInt32(mMetricsHandle, kCodecRotation, mRotationDegrees);
            mediametrics_setInt32(mMetricsHandle, kCodecRotation, mRotationDegrees);
@@ -1529,30 +1545,6 @@ status_t MediaCodec::configure(
            if (format->findInt32("priority", &priority)) {
            if (format->findInt32("priority", &priority)) {
                mediametrics_setInt32(mMetricsHandle, kCodecPriority, priority);
                mediametrics_setInt32(mMetricsHandle, kCodecPriority, priority);
            }
            }
            int32_t qpIMin = -1;
            if (format->findInt32("video-qp-i-min", &qpIMin)) {
                mediametrics_setInt32(mMetricsHandle, kCodecRequestedVideoQPIMin, qpIMin);
            }
            int32_t qpIMax = -1;
            if (format->findInt32("video-qp-i-max", &qpIMax)) {
                mediametrics_setInt32(mMetricsHandle, kCodecRequestedVideoQPIMax, qpIMax);
            }
            int32_t qpPMin = -1;
            if (format->findInt32("video-qp-p-min", &qpPMin)) {
                mediametrics_setInt32(mMetricsHandle, kCodecRequestedVideoQPPMin, qpPMin);
            }
            int32_t qpPMax = -1;
            if (format->findInt32("video-qp-p-max", &qpPMax)) {
                mediametrics_setInt32(mMetricsHandle, kCodecRequestedVideoQPPMax, qpPMax);
            }
             int32_t qpBMin = -1;
            if (format->findInt32("video-qp-b-min", &qpBMin)) {
                mediametrics_setInt32(mMetricsHandle, kCodecRequestedVideoQPBMin, qpBMin);
            }
            int32_t qpBMax = -1;
            if (format->findInt32("video-qp-b-max", &qpBMax)) {
                mediametrics_setInt32(mMetricsHandle, kCodecRequestedVideoQPBMax, qpBMax);
            }
        }
        }


        // Prevent possible integer overflow in downstream code.
        // Prevent possible integer overflow in downstream code.
@@ -1580,6 +1572,9 @@ status_t MediaCodec::configure(
                                                 enableMediaFormatShapingDefault);
                                                 enableMediaFormatShapingDefault);
        if (!enableShaping) {
        if (!enableShaping) {
            ALOGI("format shaping disabled, property '%s'", enableMediaFormatShapingProperty);
            ALOGI("format shaping disabled, property '%s'", enableMediaFormatShapingProperty);
            if (mMetricsHandle != 0) {
                mediametrics_setInt32(mMetricsHandle, kCodecShapingEnhanced, -1);
            }
        } else {
        } else {
            (void) shapeMediaFormat(format, flags);
            (void) shapeMediaFormat(format, flags);
            // XXX: do we want to do this regardless of shaping enablement?
            // XXX: do we want to do this regardless of shaping enablement?
@@ -1587,6 +1582,34 @@ status_t MediaCodec::configure(
        }
        }
    }
    }


    // push min/max QP to MediaMetrics after shaping
    if (mIsVideo && mMetricsHandle != 0) {
        int32_t qpIMin = -1;
        if (format->findInt32("video-qp-i-min", &qpIMin)) {
            mediametrics_setInt32(mMetricsHandle, kCodecRequestedVideoQPIMin, qpIMin);
        }
        int32_t qpIMax = -1;
        if (format->findInt32("video-qp-i-max", &qpIMax)) {
            mediametrics_setInt32(mMetricsHandle, kCodecRequestedVideoQPIMax, qpIMax);
        }
        int32_t qpPMin = -1;
        if (format->findInt32("video-qp-p-min", &qpPMin)) {
            mediametrics_setInt32(mMetricsHandle, kCodecRequestedVideoQPPMin, qpPMin);
        }
        int32_t qpPMax = -1;
        if (format->findInt32("video-qp-p-max", &qpPMax)) {
            mediametrics_setInt32(mMetricsHandle, kCodecRequestedVideoQPPMax, qpPMax);
        }
        int32_t qpBMin = -1;
        if (format->findInt32("video-qp-b-min", &qpBMin)) {
            mediametrics_setInt32(mMetricsHandle, kCodecRequestedVideoQPBMin, qpBMin);
        }
        int32_t qpBMax = -1;
        if (format->findInt32("video-qp-b-max", &qpBMax)) {
            mediametrics_setInt32(mMetricsHandle, kCodecRequestedVideoQPBMax, qpBMax);
        }
    }

    updateLowLatency(format);
    updateLowLatency(format);


    msg->setMessage("format", format);
    msg->setMessage("format", format);
@@ -1906,14 +1929,40 @@ status_t MediaCodec::shapeMediaFormat(
        sp<AMessage> deltas = updatedFormat->changesFrom(format, false /* deep */);
        sp<AMessage> deltas = updatedFormat->changesFrom(format, false /* deep */);
        size_t changeCount = deltas->countEntries();
        size_t changeCount = deltas->countEntries();
        ALOGD("shapeMediaFormat: deltas(%zu): %s", changeCount, deltas->debugString(2).c_str());
        ALOGD("shapeMediaFormat: deltas(%zu): %s", changeCount, deltas->debugString(2).c_str());
        if (changeCount > 0) {
        if (mMetricsHandle != 0) {
        if (mMetricsHandle != 0) {
            mediametrics_setInt32(mMetricsHandle, kCodecShapingEnhanced, changeCount);
            mediametrics_setInt32(mMetricsHandle, kCodecShapingEnhanced, changeCount);
        }
        if (changeCount > 0) {
            if (mMetricsHandle != 0) {
                // save some old properties before we fold in the new ones
                // save some old properties before we fold in the new ones
                int32_t bitrate;
                int32_t bitrate;
                if (format->findInt32(KEY_BIT_RATE, &bitrate)) {
                if (format->findInt32(KEY_BIT_RATE, &bitrate)) {
                    mediametrics_setInt32(mMetricsHandle, kCodecOriginalBitrate, bitrate);
                    mediametrics_setInt32(mMetricsHandle, kCodecOriginalBitrate, bitrate);
                }
                }
                int32_t qpIMin = -1;
                if (format->findInt32("original-video-qp-i-min", &qpIMin)) {
                    mediametrics_setInt32(mMetricsHandle, kCodecOriginalVideoQPIMin, qpIMin);
                }
                int32_t qpIMax = -1;
                if (format->findInt32("original-video-qp-i-max", &qpIMax)) {
                    mediametrics_setInt32(mMetricsHandle, kCodecOriginalVideoQPIMax, qpIMax);
                }
                int32_t qpPMin = -1;
                if (format->findInt32("original-video-qp-p-min", &qpPMin)) {
                    mediametrics_setInt32(mMetricsHandle, kCodecOriginalVideoQPPMin, qpPMin);
                }
                int32_t qpPMax = -1;
                if (format->findInt32("original-video-qp-p-max", &qpPMax)) {
                    mediametrics_setInt32(mMetricsHandle, kCodecOriginalVideoQPPMax, qpPMax);
                }
                 int32_t qpBMin = -1;
                if (format->findInt32("original-video-qp-b-min", &qpBMin)) {
                    mediametrics_setInt32(mMetricsHandle, kCodecOriginalVideoQPBMin, qpBMin);
                }
                int32_t qpBMax = -1;
                if (format->findInt32("original-video-qp-b-max", &qpBMax)) {
                    mediametrics_setInt32(mMetricsHandle, kCodecOriginalVideoQPBMax, qpBMax);
                }
            }
            }
            // NB: for any field in both format and deltas, the deltas copy wins
            // NB: for any field in both format and deltas, the deltas copy wins
            format->extend(deltas);
            format->extend(deltas);
+1 −0
Original line number Original line Diff line number Diff line
@@ -431,6 +431,7 @@ private:
    sp<ResourceManagerServiceProxy> mResourceManagerProxy;
    sp<ResourceManagerServiceProxy> mResourceManagerProxy;


    bool mIsVideo;
    bool mIsVideo;
    AString mLogSessionId;
    int32_t mVideoWidth;
    int32_t mVideoWidth;
    int32_t mVideoHeight;
    int32_t mVideoHeight;
    int32_t mRotationDegrees;
    int32_t mRotationDegrees;
+73 −2
Original line number Original line Diff line number Diff line
@@ -55,6 +55,11 @@ bool statsd_codec(const std::shared_ptr<const mediametrics::Item>& item,


    // flesh out the protobuf we'll hand off with our data
    // flesh out the protobuf we'll hand off with our data
    //
    //
    //android.media.mediacodec.log-session-id   string
    std::string sessionId;
    if (item->getString("android.media.mediacodec.log-session-id", &sessionId)) {
        metrics_proto.set_log_session_id(sessionId);
    }
    // android.media.mediacodec.codec   string
    // android.media.mediacodec.codec   string
    std::string codec;
    std::string codec;
    if (item->getString("android.media.mediacodec.codec", &codec)) {
    if (item->getString("android.media.mediacodec.codec", &codec)) {
@@ -300,6 +305,48 @@ bool statsd_codec(const std::shared_ptr<const mediametrics::Item>& item,
        metrics_proto.set_original_bitrate(originalBitrate);
        metrics_proto.set_original_bitrate(originalBitrate);
    }
    }


    // android.media.mediacodec.shaped
    int32_t shapingEnhanced = -1;
    if ( item->getInt32("android.media.mediacodec.shaped", &shapingEnhanced)) {
        metrics_proto.set_shaping_enhanced(shapingEnhanced);
    }

    // android.media.mediacodec.original-video-qp-i-min
    int32_t qpIMinOri = -1;
    if ( item->getInt32("android.media.mediacodec.original-video-qp-i-min", &qpIMinOri)) {
        metrics_proto.set_original_video_qp_i_min(qpIMinOri);
    }

    // android.media.mediacodec.original-video-qp-i-max
    int32_t qpIMaxOri = -1;
    if ( item->getInt32("android.media.mediacodec.original-video-qp-i-max", &qpIMaxOri)) {
        metrics_proto.set_original_video_qp_i_max(qpIMaxOri);
    }

    // android.media.mediacodec.original-video-qp-p-min
    int32_t qpPMinOri = -1;
    if ( item->getInt32("android.media.mediacodec.original-video-qp-p-min", &qpPMinOri)) {
        metrics_proto.set_original_video_qp_p_min(qpPMinOri);
    }

    // android.media.mediacodec.original-video-qp-p-max
    int32_t qpPMaxOri = -1;
    if ( item->getInt32("android.media.mediacodec.original-video-qp-p-max", &qpPMaxOri)) {
        metrics_proto.set_original_video_qp_p_max(qpPMaxOri);
    }

    // android.media.mediacodec.original-video-qp-b-min
    int32_t qpBMinOri = -1;
    if ( item->getInt32("android.media.mediacodec.original-video-qp-b-min", &qpBMinOri)) {
        metrics_proto.set_original_video_qp_b_min(qpIMinOri);
    }

    // android.media.mediacodec.original-video-qp-b-max
    int32_t qpBMaxOri = -1;
    if ( item->getInt32("android.media.mediacodec.original-video-qp-b-max", &qpBMaxOri)) {
        metrics_proto.set_original_video_qp_b_max(qpBMaxOri);
    }

    std::string serialized;
    std::string serialized;
    if (!metrics_proto.SerializeToString(&serialized)) {
    if (!metrics_proto.SerializeToString(&serialized)) {
        ALOGE("Failed to serialize codec metrics");
        ALOGE("Failed to serialize codec metrics");
@@ -345,9 +392,33 @@ bool statsd_codec(const std::shared_ptr<const mediametrics::Item>& item,
            << " queue_secure_input_buffer_error:" << queue_secure_input_buffer_error
            << " queue_secure_input_buffer_error:" << queue_secure_input_buffer_error
            << " bitrate_mode:" << bitrate_mode
            << " bitrate_mode:" << bitrate_mode
            << " bitrate:" << bitrate
            << " bitrate:" << bitrate
            << " original_bitrate:" << originalBitrate
            << " lifetime_millis:" << lifetime_millis
            << " lifetime_millis:" << lifetime_millis
            // TODO: add when log_session_id is merged.
            << " log_session_id:" << sessionId
            // << " log_session_id:" << log_session_id
            << " channel_count:" << channelCount
            << " sample_rate:" << sampleRate
            << " encode_bytes:" << bytes
            << " encode_frames:" << frames
            << " encode_duration_us:" << durationUs
            << " color_format:" << colorFormat
            << " frame_rate:" << frameRate
            << " capture_rate:" << captureRate
            << " operating_rate:" << operatingRate
            << " priority:" << priority
            << " shaping_enhanced:" << shapingEnhanced

            << " qp_i_min:" << qpIMin
            << " qp_i_max:" << qpIMax
            << " qp_p_min:" << qpPMin
            << " qp_p_max:" << qpPMax
            << " qp_b_min:" << qpBMin
            << " qp_b_max:" << qpBMax
            << " original_qp_i_min:" << qpIMinOri
            << " original_qp_i_max:" << qpIMaxOri
            << " original_qp_p_min:" << qpPMinOri
            << " original_qp_p_max:" << qpPMaxOri
            << " original_qp_b_min:" << qpBMinOri
            << " original_qp_b_max:" << qpBMaxOri
            << " }";
            << " }";
    statsdLog->log(android::util::MEDIAMETRICS_CODEC_REPORTED, log.str());
    statsdLog->log(android::util::MEDIAMETRICS_CODEC_REPORTED, log.str());
    return true;
    return true;