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

Commit 51e8819c authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Record MediaCodecReported atom" into sc-dev am: 9782eef8

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

Change-Id: I7730d0e6906772bb41a6ba369414924d303db9db
parents 937c0f9b 9782eef8
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -164,8 +164,8 @@ static const char *kCodecRecentLatencyMin = "android.media.mediacodec.recent.min
static const char *kCodecRecentLatencyAvg = "android.media.mediacodec.recent.avg";      /* in us */
static const char *kCodecRecentLatencyCount = "android.media.mediacodec.recent.n";
static const char *kCodecRecentLatencyHist = "android.media.mediacodec.recent.hist";    /* in us */
static const char *kCodecPlaybackDuration =
        "android.media.mediacodec.playback-duration"; /* in sec */
static const char *kCodecPlaybackDurationSec =
        "android.media.mediacodec.playback-duration-sec"; /* in sec */

/* -1: shaper disabled
   >=0: number of fields changed */
@@ -864,9 +864,9 @@ void MediaCodec::updateMediametrics() {
    if (mLatencyUnknown > 0) {
        mediametrics_setInt64(mMetricsHandle, kCodecLatencyUnknown, mLatencyUnknown);
    }
    int64_t playbackDuration = mPlaybackDurationAccumulator->getDurationInSeconds();
    if (playbackDuration > 0) {
        mediametrics_setInt64(mMetricsHandle, kCodecPlaybackDuration, playbackDuration);
    int64_t playbackDurationSec = mPlaybackDurationAccumulator->getDurationInSeconds();
    if (playbackDurationSec > 0) {
        mediametrics_setInt64(mMetricsHandle, kCodecPlaybackDurationSec, playbackDurationSec);
    }
    if (mLifetimeStartNs > 0) {
        nsecs_t lifetime = systemTime(SYSTEM_TIME_MONOTONIC) - mLifetimeStartNs;
+134 −83
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
#include <unistd.h>

#include <statslog.h>
#include <stats_event.h>

#include "cleaner.h"
#include "MediaMetricsService.h"
@@ -43,11 +44,20 @@ bool statsd_codec(const std::shared_ptr<const mediametrics::Item>& item,
{
    if (item == nullptr) return false;

    // these go into the statsd wrapper
    AStatsEvent* event = AStatsEvent_obtain();
    AStatsEvent_setAtomId(event, android::util::MEDIA_CODEC_REPORTED);

    const nsecs_t timestamp_nanos = MediaMetricsService::roundTime(item->getTimestamp());
    const std::string package_name = item->getPkgName();
    const int64_t package_version_code = item->getPkgVersionCode();
    const int64_t media_apex_version = 0;
    AStatsEvent_writeInt64(event, timestamp_nanos);

    std::string package_name = item->getPkgName();
    AStatsEvent_writeString(event, package_name.c_str());

    int64_t package_version_code = item->getPkgVersionCode();
    AStatsEvent_writeInt64(event, package_version_code);

    int64_t media_apex_version = 0;
    AStatsEvent_writeInt64(event, media_apex_version);

    // the rest into our own proto
    //
@@ -55,297 +65,334 @@ bool statsd_codec(const std::shared_ptr<const mediametrics::Item>& item,

    // 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
    std::string codec;
    if (item->getString("android.media.mediacodec.codec", &codec)) {
        metrics_proto.set_codec(codec);
    }
    AStatsEvent_writeString(event, codec.c_str());

    std::string mime;
    if (item->getString("android.media.mediacodec.mime", &mime)) {
        metrics_proto.set_mime(mime);
    }
    AStatsEvent_writeString(event, mime.c_str());

    std::string mode;
    if (item->getString("android.media.mediacodec.mode", &mode)) {
        metrics_proto.set_mode(mode);
    }
    AStatsEvent_writeString(event, mode.c_str());

    int32_t encoder = -1;
    if (item->getInt32("android.media.mediacodec.encoder", &encoder)) {
        metrics_proto.set_encoder(encoder);
    }
    AStatsEvent_writeInt32(event, encoder);

    int32_t secure = -1;
    if (item->getInt32("android.media.mediacodec.secure", &secure)) {
        metrics_proto.set_secure(secure);
    }
    AStatsEvent_writeInt32(event, secure);

    int32_t width = -1;
    if (item->getInt32("android.media.mediacodec.width", &width)) {
        metrics_proto.set_width(width);
    }
    AStatsEvent_writeInt32(event, width);

    int32_t height = -1;
    if (item->getInt32("android.media.mediacodec.height", &height)) {
        metrics_proto.set_height(height);
    }
    AStatsEvent_writeInt32(event, height);

    int32_t rotation = -1;
    if (item->getInt32("android.media.mediacodec.rotation-degrees", &rotation)) {
        metrics_proto.set_rotation(rotation);
    }
    // android.media.mediacodec.crypto  int32 (although missing if not needed)
    AStatsEvent_writeInt32(event, rotation);

    int32_t crypto = -1;
    if (item->getInt32("android.media.mediacodec.crypto", &crypto)) {
        metrics_proto.set_crypto(crypto);
    }
    AStatsEvent_writeInt32(event, crypto);

    int32_t profile = -1;
    if (item->getInt32("android.media.mediacodec.profile", &profile)) {
        metrics_proto.set_profile(profile);
    }
    AStatsEvent_writeInt32(event, profile);

    int32_t level = -1;
    if (item->getInt32("android.media.mediacodec.level", &level)) {
        metrics_proto.set_level(level);
    }
    AStatsEvent_writeInt32(event, level);


    int32_t max_width = -1;
    if ( item->getInt32("android.media.mediacodec.maxwidth", &max_width)) {
        metrics_proto.set_max_width(max_width);
    }
    AStatsEvent_writeInt32(event, max_width);

    int32_t max_height = -1;
    if ( item->getInt32("android.media.mediacodec.maxheight", &max_height)) {
        metrics_proto.set_max_height(max_height);
    }
    AStatsEvent_writeInt32(event, max_height);

    int32_t error_code = -1;
    if ( item->getInt32("android.media.mediacodec.errcode", &error_code)) {
        metrics_proto.set_error_code(error_code);
    }
    AStatsEvent_writeInt32(event, error_code);

    std::string error_state;
    if ( item->getString("android.media.mediacodec.errstate", &error_state)) {
        metrics_proto.set_error_state(error_state);
    }
    AStatsEvent_writeString(event, error_state.c_str());

    int64_t latency_max = -1;
    if (item->getInt64("android.media.mediacodec.latency.max", &latency_max)) {
        metrics_proto.set_latency_max(latency_max);
    }
    AStatsEvent_writeInt64(event, latency_max);

    int64_t latency_min = -1;
    if (item->getInt64("android.media.mediacodec.latency.min", &latency_min)) {
        metrics_proto.set_latency_min(latency_min);
    }
    AStatsEvent_writeInt64(event, latency_min);

    int64_t latency_avg = -1;
    if (item->getInt64("android.media.mediacodec.latency.avg", &latency_avg)) {
        metrics_proto.set_latency_avg(latency_avg);
    }
    AStatsEvent_writeInt64(event, latency_avg);

    int64_t latency_count = -1;
    if (item->getInt64("android.media.mediacodec.latency.n", &latency_count)) {
        metrics_proto.set_latency_count(latency_count);
    }
    AStatsEvent_writeInt64(event, latency_count);

    int64_t latency_unknown = -1;
    if (item->getInt64("android.media.mediacodec.latency.unknown", &latency_unknown)) {
        metrics_proto.set_latency_unknown(latency_unknown);
    }
    AStatsEvent_writeInt64(event, latency_unknown);

    int32_t queue_secure_input_buffer_error = -1;
    if (item->getInt32("android.media.mediacodec.queueSecureInputBufferError",
            &queue_secure_input_buffer_error)) {
        metrics_proto.set_queue_secure_input_buffer_error(queue_secure_input_buffer_error);
    }
    AStatsEvent_writeInt32(event, queue_secure_input_buffer_error);

    int32_t queue_input_buffer_error = -1;
    if (item->getInt32("android.media.mediacodec.queueInputBufferError",
            &queue_input_buffer_error)) {
        metrics_proto.set_queue_input_buffer_error(queue_input_buffer_error);
    }
    // android.media.mediacodec.latency.hist    NOT EMITTED
    AStatsEvent_writeInt32(event, queue_input_buffer_error);

    std::string bitrate_mode;
    if (item->getString("android.media.mediacodec.bitrate_mode", &bitrate_mode)) {
        metrics_proto.set_bitrate_mode(bitrate_mode);
    }
    AStatsEvent_writeString(event, bitrate_mode.c_str());

    int32_t bitrate = -1;
    if (item->getInt32("android.media.mediacodec.bitrate", &bitrate)) {
        metrics_proto.set_bitrate(bitrate);
    }
    AStatsEvent_writeInt32(event, bitrate);

    int64_t lifetime_millis = -1;
    if (item->getInt64("android.media.mediacodec.lifetimeMs", &lifetime_millis)) {
        lifetime_millis = mediametrics::bucket_time_minutes(lifetime_millis);
        metrics_proto.set_lifetime_millis(lifetime_millis);
    }
    AStatsEvent_writeInt64(event, lifetime_millis);

    int64_t playback_duration_sec = -1;
    item->getInt64("android.media.mediacodec.playback-duration-sec", &playback_duration_sec);
    // DO NOT record  playback-duration in the metrics_proto - it should only
    // exist in the flattened atom
    AStatsEvent_writeInt64(event, playback_duration_sec);

    std::string sessionId;
    if (item->getString("android.media.mediacodec.log-session-id", &sessionId)) {
        metrics_proto.set_log_session_id(sessionId);
    }
    AStatsEvent_writeString(event, codec.c_str());

    // android.media.mediacodec.channelCount
    int32_t channelCount = -1;
    if (item->getInt32("android.media.mediacodec.channelCount", &channelCount)) {
        metrics_proto.set_channel_count(channelCount);
    }
    AStatsEvent_writeInt32(event, channelCount);

    // android.media.mediacodec.sampleRate
    int32_t sampleRate = -1;
    if (item->getInt32("android.media.mediacodec.sampleRate", &sampleRate)) {
        metrics_proto.set_sample_rate(sampleRate);
    }
    AStatsEvent_writeInt32(event, sampleRate);

    // TODO PWG may want these fuzzed up a bit to obscure some precision
    // android.media.mediacodec.vencode.bytes
    int64_t bytes = -1;
    if (item->getInt64("android.media.mediacodec.vencode.bytes", &bytes)) {
        metrics_proto.set_video_encode_bytes(bytes);
    }
    AStatsEvent_writeInt64(event, bytes);

    // android.media.mediacodec.vencode.frames
    int64_t frames = -1;
    if (item->getInt64("android.media.mediacodec.vencode.frames", &frames)) {
        metrics_proto.set_video_encode_frames(frames);
    }
    AStatsEvent_writeInt64(event, frames);

    int64_t inputBytes = -1;
    if (item->getInt64("android.media.mediacodec.video.input.bytes", &inputBytes)) {
        metrics_proto.set_video_input_bytes(inputBytes);
    }
    AStatsEvent_writeInt64(event, inputBytes);

    int64_t inputFrames = -1;
    if (item->getInt64("android.media.mediacodec.video.input.frames", &inputFrames)) {
        metrics_proto.set_video_input_frames(inputFrames);
    }
    AStatsEvent_writeInt64(event, inputFrames);

    // android.media.mediacodec.vencode.durationUs
    int64_t durationUs = -1;
    if (item->getInt64("android.media.mediacodec.vencode.durationUs", &durationUs)) {
        metrics_proto.set_video_encode_duration_us(durationUs);
    }
    AStatsEvent_writeInt64(event, durationUs);

    // android.media.mediacodec.color-format
    int32_t colorFormat = -1;
    if (item->getInt32("android.media.mediacodec.color-format", &colorFormat)) {
        metrics_proto.set_color_format(colorFormat);
    }
    AStatsEvent_writeInt32(event, colorFormat);

    // android.media.mediacodec.frame-rate
    double frameRate = -1.0;
    if (item->getDouble("android.media.mediacodec.frame-rate", &frameRate)) {
        metrics_proto.set_frame_rate(frameRate);
    }
    AStatsEvent_writeFloat(event, (float) frameRate);

    // android.media.mediacodec.capture-rate
    double captureRate = -1.0;
    if (item->getDouble("android.media.mediacodec.capture-rate", &captureRate)) {
        metrics_proto.set_capture_rate(captureRate);
    }
    AStatsEvent_writeFloat(event, (float) captureRate);

    // android.media.mediacodec.operating-rate
    double operatingRate = -1.0;
    if (item->getDouble("android.media.mediacodec.operating-rate", &operatingRate)) {
        metrics_proto.set_operating_rate(operatingRate);
    }
    AStatsEvent_writeFloat(event, (float) operatingRate);

    // android.media.mediacodec.priority
    int32_t priority = -1;
    if (item->getInt32("android.media.mediacodec.priority", &priority)) {
        metrics_proto.set_priority(priority);
    }
    AStatsEvent_writeInt32(event, priority);

    // android.media.mediacodec.video-qp-i-min
    int32_t qpIMin = -1;
    if (item->getInt32("android.media.mediacodec.video-qp-i-min", &qpIMin)) {
        metrics_proto.set_video_qp_i_min(qpIMin);
    }
    AStatsEvent_writeInt32(event, qpIMin);

    // android.media.mediacodec.video-qp-i-max
    int32_t qpIMax = -1;
    if (item->getInt32("android.media.mediacodec.video-qp-i-max", &qpIMax)) {
        metrics_proto.set_video_qp_i_max(qpIMax);
    }
    AStatsEvent_writeInt32(event, qpIMax);

    // android.media.mediacodec.video-qp-p-min
    int32_t qpPMin = -1;
    if (item->getInt32("android.media.mediacodec.video-qp-p-min", &qpPMin)) {
        metrics_proto.set_video_qp_p_min(qpPMin);
    }
    AStatsEvent_writeInt32(event, qpPMin);

    // android.media.mediacodec.video-qp-p-max
    int32_t qpPMax = -1;
    if (item->getInt32("android.media.mediacodec.video-qp-p-max", &qpPMax)) {
        metrics_proto.set_video_qp_p_max(qpPMax);
    }
    AStatsEvent_writeInt32(event, qpPMax);

    // android.media.mediacodec.video-qp-b-min
    int32_t qpBMin = -1;
    if (item->getInt32("android.media.mediacodec.video-qp-b-min", &qpBMin)) {
        metrics_proto.set_video_qp_b_min(qpIMin);
        metrics_proto.set_video_qp_b_min(qpBMin);
    }
    AStatsEvent_writeInt32(event, qpBMin);

    // android.media.mediacodec.video-qp-b-max
    int32_t qpBMax = -1;
    if (item->getInt32("android.media.mediacodec.video-qp-b-max", &qpBMax)) {
        metrics_proto.set_video_qp_b_max(qpBMax);
    }
    AStatsEvent_writeInt32(event, qpBMax);

    // android.media.mediacodec.video.input.bytes
    int64_t inputBytes = -1;
    if ( item->getInt64("android.media.mediacodec.video.input.bytes", &inputBytes)) {
        metrics_proto.set_video_input_bytes(inputBytes);
    }

    // android.media.mediacodec.video.input.frames
    int64_t inputFrames = -1;
    if ( item->getInt64("android.media.mediacodec.video.input.frames", &inputFrames)) {
        metrics_proto.set_video_input_frames(inputFrames);
    }

    // android.media.mediacodec.original.bitrate
    int32_t originalBitrate = -1;
    if (item->getInt32("android.media.mediacodec.original.bitrate", &originalBitrate)) {
        metrics_proto.set_original_bitrate(originalBitrate);
    }
    AStatsEvent_writeInt32(event, originalBitrate);

    // android.media.mediacodec.shaped
    int32_t shapingEnhanced = -1;
    if ( item->getInt32("android.media.mediacodec.shaped", &shapingEnhanced)) {
        metrics_proto.set_shaping_enhanced(shapingEnhanced);
    }
    AStatsEvent_writeInt32(event, 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);
    }
    AStatsEvent_writeInt32(event, 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);
    }
    AStatsEvent_writeInt32(event, 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);
    }
    AStatsEvent_writeInt32(event, 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);
    }
    AStatsEvent_writeInt32(event, 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);
        metrics_proto.set_original_video_qp_b_min(qpBMinOri);
    }
    AStatsEvent_writeInt32(event, qpBMinOri);

    // 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);
    }
    AStatsEvent_writeInt32(event, qpBMaxOri);

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

    std::string serialized;
    if (!metrics_proto.SerializeToString(&serialized)) {
@@ -357,6 +404,7 @@ bool statsd_codec(const std::shared_ptr<const mediametrics::Item>& item,
                               timestamp_nanos, package_name.c_str(), package_version_code,
                               media_apex_version,
                               bf_serialized);

    std::stringstream log;
    log << "result:" << result << " {"
            << " mediametrics_codec_reported:"
@@ -394,6 +442,7 @@ bool statsd_codec(const std::shared_ptr<const mediametrics::Item>& item,
            << " bitrate:" << bitrate
            << " original_bitrate:" << originalBitrate
            << " lifetime_millis:" << lifetime_millis
            << " playback_duration_seconds:" << playback_duration_sec
            << " log_session_id:" << sessionId
            << " channel_count:" << channelCount
            << " sample_rate:" << sampleRate
@@ -421,6 +470,8 @@ bool statsd_codec(const std::shared_ptr<const mediametrics::Item>& item,
            << " original_qp_b_max:" << qpBMaxOri
            << " }";
    statsdLog->log(android::util::MEDIAMETRICS_CODEC_REPORTED, log.str());


    return true;
}