MediaMetrics: add kCodecShapingChangeCount and change QP data to be
after shaping
Bug: 188459272
Test: Mediametrics on runaway/
dumpsys
Change-Id: Ifd936fa5bff06433ee568553b6072c0d187a4f28
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index 57bdba0..55a8605 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -92,6 +92,7 @@
// NB: these are matched with public Java API constants defined
// in frameworks/base/media/java/android/media/MediaCodec.java
// 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 *kCodecMime = "android.media.mediacodec.mime"; /* e.g. audio/mime */
static const char *kCodecMode = "android.media.mediacodec.mode"; /* audio, video */
@@ -107,6 +108,16 @@
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";
+
+// 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 *kCodecRequestedVideoQPIMax = "android.media.mediacodec.video-qp-i-max";
static const char *kCodecRequestedVideoQPPMin = "android.media.mediacodec.video-qp-p-min";
@@ -153,7 +164,9 @@
static const char *kCodecRecentLatencyCount = "android.media.mediacodec.recent.n";
static const char *kCodecRecentLatencyHist = "android.media.mediacodec.recent.hist"; /* in us */
-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
static bool kEmitHistogram = false;
@@ -1460,6 +1473,8 @@
}
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("height", &mVideoHeight);
if (!format->findInt32("rotation-degrees", &mRotationDegrees)) {
@@ -1467,6 +1482,7 @@
}
if (mMetricsHandle != 0) {
+ mediametrics_setCString(mMetricsHandle, kCodecLogSessionId, mLogSessionId.c_str());
mediametrics_setInt32(mMetricsHandle, kCodecWidth, mVideoWidth);
mediametrics_setInt32(mMetricsHandle, kCodecHeight, mVideoHeight);
mediametrics_setInt32(mMetricsHandle, kCodecRotation, mRotationDegrees);
@@ -1498,30 +1514,6 @@
if (format->findInt32("priority", &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.
@@ -1549,6 +1541,9 @@
enableMediaFormatShapingDefault);
if (!enableShaping) {
ALOGI("format shaping disabled, property '%s'", enableMediaFormatShapingProperty);
+ if (mMetricsHandle != 0) {
+ mediametrics_setInt32(mMetricsHandle, kCodecShapingEnhanced, -1);
+ }
} else {
(void) shapeMediaFormat(format, flags);
// XXX: do we want to do this regardless of shaping enablement?
@@ -1556,6 +1551,34 @@
}
}
+ // 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);
msg->setMessage("format", format);
@@ -1875,14 +1898,40 @@
sp<AMessage> deltas = updatedFormat->changesFrom(format, false /* deep */);
size_t changeCount = deltas->countEntries();
ALOGD("shapeMediaFormat: deltas(%zu): %s", changeCount, deltas->debugString(2).c_str());
+ if (mMetricsHandle != 0) {
+ mediametrics_setInt32(mMetricsHandle, kCodecShapingEnhanced, changeCount);
+ }
if (changeCount > 0) {
if (mMetricsHandle != 0) {
- mediametrics_setInt32(mMetricsHandle, kCodecShapingEnhanced, changeCount);
// save some old properties before we fold in the new ones
int32_t bitrate;
if (format->findInt32(KEY_BIT_RATE, &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
format->extend(deltas);
diff --git a/media/libstagefright/include/media/stagefright/MediaCodec.h b/media/libstagefright/include/media/stagefright/MediaCodec.h
index 3517bae..12b38ef 100644
--- a/media/libstagefright/include/media/stagefright/MediaCodec.h
+++ b/media/libstagefright/include/media/stagefright/MediaCodec.h
@@ -429,6 +429,7 @@
sp<ResourceManagerServiceProxy> mResourceManagerProxy;
bool mIsVideo;
+ AString mLogSessionId;
int32_t mVideoWidth;
int32_t mVideoHeight;
int32_t mRotationDegrees;
diff --git a/services/mediametrics/statsd_codec.cpp b/services/mediametrics/statsd_codec.cpp
index 2cfdf24..c1a5163 100644
--- a/services/mediametrics/statsd_codec.cpp
+++ b/services/mediametrics/statsd_codec.cpp
@@ -55,6 +55,11 @@
// 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)) {
@@ -300,6 +305,48 @@
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;
if (!metrics_proto.SerializeToString(&serialized)) {
ALOGE("Failed to serialize codec metrics");
@@ -345,9 +392,33 @@
<< " queue_secure_input_buffer_error:" << queue_secure_input_buffer_error
<< " bitrate_mode:" << bitrate_mode
<< " bitrate:" << bitrate
+ << " original_bitrate:" << originalBitrate
<< " lifetime_millis:" << lifetime_millis
- // TODO: add when log_session_id is merged.
- // << " log_session_id:" << log_session_id
+ << " log_session_id:" << sessionId
+ << " 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());
return true;