1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker *
4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker *
8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker *
10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker */
16*ec779b8eSAndroid Build Coastguard Worker
17*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "statsd_codec"
19*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
20*ec779b8eSAndroid Build Coastguard Worker
21*ec779b8eSAndroid Build Coastguard Worker #include <dirent.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <inttypes.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <pthread.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <pwd.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <stdint.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <string>
27*ec779b8eSAndroid Build Coastguard Worker #include <string.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <sys/stat.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <sys/time.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <unistd.h>
32*ec779b8eSAndroid Build Coastguard Worker
33*ec779b8eSAndroid Build Coastguard Worker #include <stats_media_metrics.h>
34*ec779b8eSAndroid Build Coastguard Worker #include <stats_event.h>
35*ec779b8eSAndroid Build Coastguard Worker
36*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/StringUtils.h>
37*ec779b8eSAndroid Build Coastguard Worker #include <frameworks/proto_logging/stats/message/mediametrics_message.pb.h>
38*ec779b8eSAndroid Build Coastguard Worker #include <mediametricsservice/cleaner.h>
39*ec779b8eSAndroid Build Coastguard Worker #include <mediametricsservice/iface_statsd.h>
40*ec779b8eSAndroid Build Coastguard Worker #include <mediametricsservice/MediaMetricsService.h>
41*ec779b8eSAndroid Build Coastguard Worker #include <mediametricsservice/StringUtils.h>
42*ec779b8eSAndroid Build Coastguard Worker #include <mediametricsservice/ValidateId.h>
43*ec779b8eSAndroid Build Coastguard Worker
44*ec779b8eSAndroid Build Coastguard Worker namespace android {
45*ec779b8eSAndroid Build Coastguard Worker
46*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::stats_write;
47*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RENDERED;
48*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RENDERED__CODEC__CODEC_UNKNOWN;
49*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_INVALID;
50*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_ZERO;
51*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RENDERED__CONTENT_FRAMERATE__FRAMERATE_UNKNOWN;
52*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RENDERED__CONTENT_FRAMERATE__FRAMERATE_UNDETERMINED;
53*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RENDERED__CONTENT_FRAMERATE__FRAMERATE_24_3_2_PULLDOWN;
54*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RENDERED__HDR_FORMAT__HDR_FORMAT_NONE;
55*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RENDERED__HDR_FORMAT__HDR_FORMAT_HLG;
56*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RENDERED__HDR_FORMAT__HDR_FORMAT_HDR10;
57*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RENDERED__HDR_FORMAT__HDR_FORMAT_HDR10_PLUS;
58*ec779b8eSAndroid Build Coastguard Worker using stats::media_metrics::MEDIA_CODEC_RENDERED__HDR_FORMAT__HDR_FORMAT_DOLBY_VISION;
59*ec779b8eSAndroid Build Coastguard Worker
60*ec779b8eSAndroid Build Coastguard Worker static const int BITRATE_UNKNOWN =
61*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__BITRATE__BITRATE_UNKNOWN;
62*ec779b8eSAndroid Build Coastguard Worker
63*ec779b8eSAndroid Build Coastguard Worker static const std::pair<char const *, int> CODEC_LOOKUP[] = {
64*ec779b8eSAndroid Build Coastguard Worker { "avc", stats::media_metrics::MEDIA_CODEC_RENDERED__CODEC__CODEC_AVC },
65*ec779b8eSAndroid Build Coastguard Worker { "h264", stats::media_metrics::MEDIA_CODEC_RENDERED__CODEC__CODEC_AVC },
66*ec779b8eSAndroid Build Coastguard Worker { "hevc", stats::media_metrics::MEDIA_CODEC_RENDERED__CODEC__CODEC_HEVC },
67*ec779b8eSAndroid Build Coastguard Worker { "h265", stats::media_metrics::MEDIA_CODEC_RENDERED__CODEC__CODEC_HEVC },
68*ec779b8eSAndroid Build Coastguard Worker { "vp8", stats::media_metrics::MEDIA_CODEC_RENDERED__CODEC__CODEC_VP8 },
69*ec779b8eSAndroid Build Coastguard Worker { "vp9", stats::media_metrics::MEDIA_CODEC_RENDERED__CODEC__CODEC_VP9 },
70*ec779b8eSAndroid Build Coastguard Worker { "av1", stats::media_metrics::MEDIA_CODEC_RENDERED__CODEC__CODEC_AV1 },
71*ec779b8eSAndroid Build Coastguard Worker { "av01", stats::media_metrics::MEDIA_CODEC_RENDERED__CODEC__CODEC_AV1 },
72*ec779b8eSAndroid Build Coastguard Worker { "dolby-vision", stats::media_metrics::MEDIA_CODEC_RENDERED__CODEC__CODEC_HEVC },
73*ec779b8eSAndroid Build Coastguard Worker };
74*ec779b8eSAndroid Build Coastguard Worker
75*ec779b8eSAndroid Build Coastguard Worker static const int32_t RESOLUTION_LOOKUP[] = {
76*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_MAX_SIZE,
77*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_32K,
78*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_16K,
79*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_8K_UHD,
80*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_8K_UHD_ALMOST,
81*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_4K_UHD_ALMOST,
82*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_1440X2560,
83*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_1080X2400,
84*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_1080X2340,
85*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_1080P_FHD,
86*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_1080P_FHD_ALMOST,
87*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_720P_HD,
88*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_720P_HD_ALMOST,
89*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_576X1024,
90*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_540X960,
91*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_480X854,
92*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_480X640,
93*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_360X640,
94*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_352X640,
95*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_VERY_LOW,
96*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_SMALLEST,
97*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_ZERO,
98*ec779b8eSAndroid Build Coastguard Worker };
99*ec779b8eSAndroid Build Coastguard Worker
100*ec779b8eSAndroid Build Coastguard Worker static const int32_t FRAMERATE_LOOKUP[] = {
101*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__CONTENT_FRAMERATE__FRAMERATE_24,
102*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__CONTENT_FRAMERATE__FRAMERATE_25,
103*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__CONTENT_FRAMERATE__FRAMERATE_30,
104*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__CONTENT_FRAMERATE__FRAMERATE_50,
105*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__CONTENT_FRAMERATE__FRAMERATE_60,
106*ec779b8eSAndroid Build Coastguard Worker stats::media_metrics::MEDIA_CODEC_RENDERED__CONTENT_FRAMERATE__FRAMERATE_120,
107*ec779b8eSAndroid Build Coastguard Worker };
108*ec779b8eSAndroid Build Coastguard Worker
getMetricsCodecEnum(const std::string & mime,const std::string & componentName)109*ec779b8eSAndroid Build Coastguard Worker static int32_t getMetricsCodecEnum(const std::string &mime, const std::string &componentName) {
110*ec779b8eSAndroid Build Coastguard Worker for (const auto & codecStrAndEnum : CODEC_LOOKUP) {
111*ec779b8eSAndroid Build Coastguard Worker if (strcasestr(mime.c_str(), codecStrAndEnum.first) != nullptr ||
112*ec779b8eSAndroid Build Coastguard Worker strcasestr(componentName.c_str(), codecStrAndEnum.first) != nullptr) {
113*ec779b8eSAndroid Build Coastguard Worker return codecStrAndEnum.second;
114*ec779b8eSAndroid Build Coastguard Worker }
115*ec779b8eSAndroid Build Coastguard Worker }
116*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_RENDERED__CODEC__CODEC_UNKNOWN;
117*ec779b8eSAndroid Build Coastguard Worker }
118*ec779b8eSAndroid Build Coastguard Worker
getMetricsResolutionEnum(int32_t width,int32_t height)119*ec779b8eSAndroid Build Coastguard Worker static int32_t getMetricsResolutionEnum(int32_t width, int32_t height) {
120*ec779b8eSAndroid Build Coastguard Worker if (width == 0 || height == 0) {
121*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_ZERO;
122*ec779b8eSAndroid Build Coastguard Worker }
123*ec779b8eSAndroid Build Coastguard Worker int64_t pixels = int64_t(width) * height / 1000;
124*ec779b8eSAndroid Build Coastguard Worker if (width < 0 || height < 0 || pixels > RESOLUTION_LOOKUP[0]) {
125*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_INVALID;
126*ec779b8eSAndroid Build Coastguard Worker }
127*ec779b8eSAndroid Build Coastguard Worker for (int32_t resolutionEnum : RESOLUTION_LOOKUP) {
128*ec779b8eSAndroid Build Coastguard Worker if (pixels > resolutionEnum) {
129*ec779b8eSAndroid Build Coastguard Worker return resolutionEnum;
130*ec779b8eSAndroid Build Coastguard Worker }
131*ec779b8eSAndroid Build Coastguard Worker }
132*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_RENDERED__RESOLUTION__RESOLUTION_ZERO;
133*ec779b8eSAndroid Build Coastguard Worker }
134*ec779b8eSAndroid Build Coastguard Worker
getMetricsFramerateEnum(float inFramerate)135*ec779b8eSAndroid Build Coastguard Worker static int32_t getMetricsFramerateEnum(float inFramerate) {
136*ec779b8eSAndroid Build Coastguard Worker if (inFramerate == -1.0f) {
137*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_RENDERED__CONTENT_FRAMERATE__FRAMERATE_UNDETERMINED;
138*ec779b8eSAndroid Build Coastguard Worker }
139*ec779b8eSAndroid Build Coastguard Worker if (inFramerate == -2.0f) {
140*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_RENDERED__CONTENT_FRAMERATE__FRAMERATE_24_3_2_PULLDOWN;
141*ec779b8eSAndroid Build Coastguard Worker }
142*ec779b8eSAndroid Build Coastguard Worker int framerate = int(inFramerate * 100); // Table is in hundredths of frames per second
143*ec779b8eSAndroid Build Coastguard Worker static const int framerateTolerance = 40; // Tolerance is 0.4 frames per second - table is 100s
144*ec779b8eSAndroid Build Coastguard Worker for (int32_t framerateEnum : FRAMERATE_LOOKUP) {
145*ec779b8eSAndroid Build Coastguard Worker if (abs(framerate - framerateEnum) < framerateTolerance) {
146*ec779b8eSAndroid Build Coastguard Worker return framerateEnum;
147*ec779b8eSAndroid Build Coastguard Worker }
148*ec779b8eSAndroid Build Coastguard Worker }
149*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_RENDERED__CONTENT_FRAMERATE__FRAMERATE_UNKNOWN;
150*ec779b8eSAndroid Build Coastguard Worker }
151*ec779b8eSAndroid Build Coastguard Worker
getMetricsHdrFormatEnum(std::string & mime,std::string & componentName,int32_t configColorTransfer,int32_t parsedColorTransfer,int32_t hdr10StaticInfo,int32_t hdr10PlusInfo)152*ec779b8eSAndroid Build Coastguard Worker static int32_t getMetricsHdrFormatEnum(std::string &mime, std::string &componentName,
153*ec779b8eSAndroid Build Coastguard Worker int32_t configColorTransfer, int32_t parsedColorTransfer,
154*ec779b8eSAndroid Build Coastguard Worker int32_t hdr10StaticInfo, int32_t hdr10PlusInfo) {
155*ec779b8eSAndroid Build Coastguard Worker if (hdr10PlusInfo) {
156*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_RENDERED__HDR_FORMAT__HDR_FORMAT_HDR10_PLUS;
157*ec779b8eSAndroid Build Coastguard Worker }
158*ec779b8eSAndroid Build Coastguard Worker if (hdr10StaticInfo) {
159*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_RENDERED__HDR_FORMAT__HDR_FORMAT_HDR10;
160*ec779b8eSAndroid Build Coastguard Worker }
161*ec779b8eSAndroid Build Coastguard Worker // 7 = COLOR_TRANSFER_HLG in MediaCodecConstants.h
162*ec779b8eSAndroid Build Coastguard Worker if (configColorTransfer == 7 || parsedColorTransfer == 7) {
163*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_RENDERED__HDR_FORMAT__HDR_FORMAT_HLG;
164*ec779b8eSAndroid Build Coastguard Worker }
165*ec779b8eSAndroid Build Coastguard Worker if (strcasestr(mime.c_str(), "dolby-vision") != nullptr ||
166*ec779b8eSAndroid Build Coastguard Worker strcasestr(componentName.c_str(), "dvhe") != nullptr ||
167*ec779b8eSAndroid Build Coastguard Worker strcasestr(componentName.c_str(), "dvav") != nullptr ||
168*ec779b8eSAndroid Build Coastguard Worker strcasestr(componentName.c_str(), "dav1") != nullptr) {
169*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_RENDERED__HDR_FORMAT__HDR_FORMAT_DOLBY_VISION;
170*ec779b8eSAndroid Build Coastguard Worker }
171*ec779b8eSAndroid Build Coastguard Worker return MEDIA_CODEC_RENDERED__HDR_FORMAT__HDR_FORMAT_NONE;
172*ec779b8eSAndroid Build Coastguard Worker }
173*ec779b8eSAndroid Build Coastguard Worker
parseVector(const std::string & str,std::vector<int32_t> * vector)174*ec779b8eSAndroid Build Coastguard Worker static void parseVector(const std::string &str, std::vector<int32_t> *vector) {
175*ec779b8eSAndroid Build Coastguard Worker if (!audio_utils::stringutils::parseVector(str, vector)) {
176*ec779b8eSAndroid Build Coastguard Worker ALOGE("failed to parse integer vector from '%s'", str.c_str());
177*ec779b8eSAndroid Build Coastguard Worker }
178*ec779b8eSAndroid Build Coastguard Worker }
179*ec779b8eSAndroid Build Coastguard Worker
statsd_codec(const std::shared_ptr<const mediametrics::Item> & item,const std::shared_ptr<mediametrics::StatsdLog> & statsdLog)180*ec779b8eSAndroid Build Coastguard Worker bool statsd_codec(const std::shared_ptr<const mediametrics::Item>& item,
181*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<mediametrics::StatsdLog>& statsdLog)
182*ec779b8eSAndroid Build Coastguard Worker {
183*ec779b8eSAndroid Build Coastguard Worker if (item == nullptr) return false;
184*ec779b8eSAndroid Build Coastguard Worker
185*ec779b8eSAndroid Build Coastguard Worker AStatsEvent* event = AStatsEvent_obtain();
186*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_setAtomId(event, stats::media_metrics::MEDIA_CODEC_REPORTED);
187*ec779b8eSAndroid Build Coastguard Worker
188*ec779b8eSAndroid Build Coastguard Worker const nsecs_t timestampNanos = MediaMetricsService::roundTime(item->getTimestamp());
189*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, timestampNanos);
190*ec779b8eSAndroid Build Coastguard Worker
191*ec779b8eSAndroid Build Coastguard Worker // packageName deprecated for calling_uid and statsd support as of U-QPR2
192*ec779b8eSAndroid Build Coastguard Worker std::string packageName = "";
193*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeString(event, packageName.c_str());
194*ec779b8eSAndroid Build Coastguard Worker
195*ec779b8eSAndroid Build Coastguard Worker // packageVersion depreccated for calling_uid and statsd support as of U-QPR2
196*ec779b8eSAndroid Build Coastguard Worker int64_t packageVersionCode = 0;
197*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, packageVersionCode);
198*ec779b8eSAndroid Build Coastguard Worker
199*ec779b8eSAndroid Build Coastguard Worker int64_t mediaApexVersion = 0;
200*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, mediaApexVersion);
201*ec779b8eSAndroid Build Coastguard Worker
202*ec779b8eSAndroid Build Coastguard Worker // the rest into our own proto
203*ec779b8eSAndroid Build Coastguard Worker //
204*ec779b8eSAndroid Build Coastguard Worker ::android::stats::mediametrics_message::CodecData metrics_proto;
205*ec779b8eSAndroid Build Coastguard Worker
206*ec779b8eSAndroid Build Coastguard Worker // flesh out the protobuf we'll hand off with our data
207*ec779b8eSAndroid Build Coastguard Worker //
208*ec779b8eSAndroid Build Coastguard Worker std::string codec;
209*ec779b8eSAndroid Build Coastguard Worker if (item->getString("android.media.mediacodec.codec", &codec)) {
210*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_codec(codec);
211*ec779b8eSAndroid Build Coastguard Worker }
212*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeString(event, codec.c_str());
213*ec779b8eSAndroid Build Coastguard Worker
214*ec779b8eSAndroid Build Coastguard Worker std::string mime;
215*ec779b8eSAndroid Build Coastguard Worker if (item->getString("android.media.mediacodec.mime", &mime)) {
216*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_mime(mime);
217*ec779b8eSAndroid Build Coastguard Worker }
218*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeString(event, mime.c_str());
219*ec779b8eSAndroid Build Coastguard Worker
220*ec779b8eSAndroid Build Coastguard Worker std::string mode;
221*ec779b8eSAndroid Build Coastguard Worker if (item->getString("android.media.mediacodec.mode", &mode)) {
222*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_mode(mode);
223*ec779b8eSAndroid Build Coastguard Worker }
224*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeString(event, mode.c_str());
225*ec779b8eSAndroid Build Coastguard Worker
226*ec779b8eSAndroid Build Coastguard Worker int32_t isEncoder = -1;
227*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.encoder", &isEncoder)) {
228*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_encoder(isEncoder);
229*ec779b8eSAndroid Build Coastguard Worker }
230*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, isEncoder);
231*ec779b8eSAndroid Build Coastguard Worker
232*ec779b8eSAndroid Build Coastguard Worker int32_t isSecure = -1;
233*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.secure", &isSecure)) {
234*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_secure(isSecure);
235*ec779b8eSAndroid Build Coastguard Worker }
236*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, isSecure);
237*ec779b8eSAndroid Build Coastguard Worker
238*ec779b8eSAndroid Build Coastguard Worker int32_t isHardware = -1;
239*ec779b8eSAndroid Build Coastguard Worker item->getInt32("android.media.mediacodec.hardware", &isHardware);
240*ec779b8eSAndroid Build Coastguard Worker // not logged to MediaCodecReported or MediametricsCodecReported
241*ec779b8eSAndroid Build Coastguard Worker
242*ec779b8eSAndroid Build Coastguard Worker int32_t isTunneled = -1;
243*ec779b8eSAndroid Build Coastguard Worker item->getInt32("android.media.mediacodec.tunneled", &isTunneled);
244*ec779b8eSAndroid Build Coastguard Worker // not logged to MediaCodecReported or MediametricsCodecReported
245*ec779b8eSAndroid Build Coastguard Worker
246*ec779b8eSAndroid Build Coastguard Worker int32_t width = -1;
247*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.width", &width)) {
248*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_width(width);
249*ec779b8eSAndroid Build Coastguard Worker }
250*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, width);
251*ec779b8eSAndroid Build Coastguard Worker
252*ec779b8eSAndroid Build Coastguard Worker int32_t height = -1;
253*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.height", &height)) {
254*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_height(height);
255*ec779b8eSAndroid Build Coastguard Worker }
256*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, height);
257*ec779b8eSAndroid Build Coastguard Worker
258*ec779b8eSAndroid Build Coastguard Worker int32_t rotation = -1;
259*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.rotation-degrees", &rotation)) {
260*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_rotation(rotation);
261*ec779b8eSAndroid Build Coastguard Worker }
262*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, rotation);
263*ec779b8eSAndroid Build Coastguard Worker
264*ec779b8eSAndroid Build Coastguard Worker int32_t crypto = -1;
265*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.crypto", &crypto)) {
266*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_crypto(crypto);
267*ec779b8eSAndroid Build Coastguard Worker }
268*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, crypto);
269*ec779b8eSAndroid Build Coastguard Worker
270*ec779b8eSAndroid Build Coastguard Worker int32_t profile = -1;
271*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.profile", &profile)) {
272*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_profile(profile);
273*ec779b8eSAndroid Build Coastguard Worker }
274*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, profile);
275*ec779b8eSAndroid Build Coastguard Worker
276*ec779b8eSAndroid Build Coastguard Worker int32_t level = -1;
277*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.level", &level)) {
278*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_level(level);
279*ec779b8eSAndroid Build Coastguard Worker }
280*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, level);
281*ec779b8eSAndroid Build Coastguard Worker
282*ec779b8eSAndroid Build Coastguard Worker
283*ec779b8eSAndroid Build Coastguard Worker int32_t maxWidth = -1;
284*ec779b8eSAndroid Build Coastguard Worker if ( item->getInt32("android.media.mediacodec.maxwidth", &maxWidth)) {
285*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_max_width(maxWidth);
286*ec779b8eSAndroid Build Coastguard Worker }
287*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, maxWidth);
288*ec779b8eSAndroid Build Coastguard Worker
289*ec779b8eSAndroid Build Coastguard Worker int32_t maxHeight = -1;
290*ec779b8eSAndroid Build Coastguard Worker if ( item->getInt32("android.media.mediacodec.maxheight", &maxHeight)) {
291*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_max_height(maxHeight);
292*ec779b8eSAndroid Build Coastguard Worker }
293*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, maxHeight);
294*ec779b8eSAndroid Build Coastguard Worker
295*ec779b8eSAndroid Build Coastguard Worker int32_t errorCode = -1;
296*ec779b8eSAndroid Build Coastguard Worker if ( item->getInt32("android.media.mediacodec.errcode", &errorCode)) {
297*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_error_code(errorCode);
298*ec779b8eSAndroid Build Coastguard Worker }
299*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, errorCode);
300*ec779b8eSAndroid Build Coastguard Worker
301*ec779b8eSAndroid Build Coastguard Worker std::string errorState;
302*ec779b8eSAndroid Build Coastguard Worker if ( item->getString("android.media.mediacodec.errstate", &errorState)) {
303*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_error_state(errorState);
304*ec779b8eSAndroid Build Coastguard Worker }
305*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeString(event, errorState.c_str());
306*ec779b8eSAndroid Build Coastguard Worker
307*ec779b8eSAndroid Build Coastguard Worker int64_t latencyMax = -1;
308*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.latency.max", &latencyMax)) {
309*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_latency_max(latencyMax);
310*ec779b8eSAndroid Build Coastguard Worker }
311*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, latencyMax);
312*ec779b8eSAndroid Build Coastguard Worker
313*ec779b8eSAndroid Build Coastguard Worker int64_t latencyMin = -1;
314*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.latency.min", &latencyMin)) {
315*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_latency_min(latencyMin);
316*ec779b8eSAndroid Build Coastguard Worker }
317*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, latencyMin);
318*ec779b8eSAndroid Build Coastguard Worker
319*ec779b8eSAndroid Build Coastguard Worker int64_t latencyAvg = -1;
320*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.latency.avg", &latencyAvg)) {
321*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_latency_avg(latencyAvg);
322*ec779b8eSAndroid Build Coastguard Worker }
323*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, latencyAvg);
324*ec779b8eSAndroid Build Coastguard Worker
325*ec779b8eSAndroid Build Coastguard Worker int64_t latencyCount = -1;
326*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.latency.n", &latencyCount)) {
327*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_latency_count(latencyCount);
328*ec779b8eSAndroid Build Coastguard Worker }
329*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, latencyCount);
330*ec779b8eSAndroid Build Coastguard Worker
331*ec779b8eSAndroid Build Coastguard Worker int64_t latencyUnknown = -1;
332*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.latency.unknown", &latencyUnknown)) {
333*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_latency_unknown(latencyUnknown);
334*ec779b8eSAndroid Build Coastguard Worker }
335*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, latencyUnknown);
336*ec779b8eSAndroid Build Coastguard Worker
337*ec779b8eSAndroid Build Coastguard Worker int32_t queueSecureInputBufferError = -1;
338*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.queueSecureInputBufferError",
339*ec779b8eSAndroid Build Coastguard Worker &queueSecureInputBufferError)) {
340*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_queue_secure_input_buffer_error(queueSecureInputBufferError);
341*ec779b8eSAndroid Build Coastguard Worker }
342*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, queueSecureInputBufferError);
343*ec779b8eSAndroid Build Coastguard Worker
344*ec779b8eSAndroid Build Coastguard Worker int32_t queueInputBufferError = -1;
345*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.queueInputBufferError", &queueInputBufferError)) {
346*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_queue_input_buffer_error(queueInputBufferError);
347*ec779b8eSAndroid Build Coastguard Worker }
348*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, queueInputBufferError);
349*ec779b8eSAndroid Build Coastguard Worker
350*ec779b8eSAndroid Build Coastguard Worker std::string bitrateMode;
351*ec779b8eSAndroid Build Coastguard Worker if (item->getString("android.media.mediacodec.bitrate_mode", &bitrateMode)) {
352*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_bitrate_mode(bitrateMode);
353*ec779b8eSAndroid Build Coastguard Worker }
354*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeString(event, bitrateMode.c_str());
355*ec779b8eSAndroid Build Coastguard Worker
356*ec779b8eSAndroid Build Coastguard Worker int32_t bitrate = -1;
357*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.bitrate", &bitrate)) {
358*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_bitrate(bitrate);
359*ec779b8eSAndroid Build Coastguard Worker }
360*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, bitrate);
361*ec779b8eSAndroid Build Coastguard Worker
362*ec779b8eSAndroid Build Coastguard Worker int64_t lifetimeMillis = -1;
363*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.lifetimeMs", &lifetimeMillis)) {
364*ec779b8eSAndroid Build Coastguard Worker lifetimeMillis = mediametrics::bucket_time_minutes(lifetimeMillis);
365*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_lifetime_millis(lifetimeMillis);
366*ec779b8eSAndroid Build Coastguard Worker }
367*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, lifetimeMillis);
368*ec779b8eSAndroid Build Coastguard Worker
369*ec779b8eSAndroid Build Coastguard Worker int64_t playbackDurationSec = -1;
370*ec779b8eSAndroid Build Coastguard Worker item->getInt64("android.media.mediacodec.playback-duration-sec", &playbackDurationSec);
371*ec779b8eSAndroid Build Coastguard Worker // DO NOT record playback-duration in the metrics_proto - it should only
372*ec779b8eSAndroid Build Coastguard Worker // exist in the flattened atom
373*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, playbackDurationSec);
374*ec779b8eSAndroid Build Coastguard Worker
375*ec779b8eSAndroid Build Coastguard Worker std::string sessionId;
376*ec779b8eSAndroid Build Coastguard Worker if (item->getString("android.media.mediacodec.log-session-id", &sessionId)) {
377*ec779b8eSAndroid Build Coastguard Worker sessionId = mediametrics::ValidateId::get()->validateId(sessionId);
378*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_log_session_id(sessionId);
379*ec779b8eSAndroid Build Coastguard Worker }
380*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeString(event, sessionId.c_str());
381*ec779b8eSAndroid Build Coastguard Worker
382*ec779b8eSAndroid Build Coastguard Worker int32_t channelCount = -1;
383*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.channelCount", &channelCount)) {
384*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_channel_count(channelCount);
385*ec779b8eSAndroid Build Coastguard Worker }
386*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, channelCount);
387*ec779b8eSAndroid Build Coastguard Worker
388*ec779b8eSAndroid Build Coastguard Worker int32_t sampleRate = -1;
389*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.sampleRate", &sampleRate)) {
390*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_sample_rate(sampleRate);
391*ec779b8eSAndroid Build Coastguard Worker }
392*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, sampleRate);
393*ec779b8eSAndroid Build Coastguard Worker
394*ec779b8eSAndroid Build Coastguard Worker // TODO PWG may want these fuzzed up a bit to obscure some precision
395*ec779b8eSAndroid Build Coastguard Worker int64_t bytes = -1;
396*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.vencode.bytes", &bytes)) {
397*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_video_encode_bytes(bytes);
398*ec779b8eSAndroid Build Coastguard Worker }
399*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, bytes);
400*ec779b8eSAndroid Build Coastguard Worker
401*ec779b8eSAndroid Build Coastguard Worker int64_t frames = -1;
402*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.vencode.frames", &frames)) {
403*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_video_encode_frames(frames);
404*ec779b8eSAndroid Build Coastguard Worker }
405*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, frames);
406*ec779b8eSAndroid Build Coastguard Worker
407*ec779b8eSAndroid Build Coastguard Worker int64_t inputBytes = -1;
408*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.video.input.bytes", &inputBytes)) {
409*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_video_input_bytes(inputBytes);
410*ec779b8eSAndroid Build Coastguard Worker }
411*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, inputBytes);
412*ec779b8eSAndroid Build Coastguard Worker
413*ec779b8eSAndroid Build Coastguard Worker int64_t inputFrames = -1;
414*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.video.input.frames", &inputFrames)) {
415*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_video_input_frames(inputFrames);
416*ec779b8eSAndroid Build Coastguard Worker }
417*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, inputFrames);
418*ec779b8eSAndroid Build Coastguard Worker
419*ec779b8eSAndroid Build Coastguard Worker int64_t durationUs = -1;
420*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.vencode.durationUs", &durationUs)) {
421*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_video_encode_duration_us(durationUs);
422*ec779b8eSAndroid Build Coastguard Worker }
423*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, durationUs);
424*ec779b8eSAndroid Build Coastguard Worker
425*ec779b8eSAndroid Build Coastguard Worker int32_t colorFormat = -1;
426*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.color-format", &colorFormat)) {
427*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_color_format(colorFormat);
428*ec779b8eSAndroid Build Coastguard Worker }
429*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, colorFormat);
430*ec779b8eSAndroid Build Coastguard Worker
431*ec779b8eSAndroid Build Coastguard Worker double frameRate = -1.0;
432*ec779b8eSAndroid Build Coastguard Worker if (item->getDouble("android.media.mediacodec.frame-rate", &frameRate)) {
433*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_frame_rate(frameRate);
434*ec779b8eSAndroid Build Coastguard Worker }
435*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeFloat(event, (float) frameRate);
436*ec779b8eSAndroid Build Coastguard Worker
437*ec779b8eSAndroid Build Coastguard Worker double captureRate = -1.0;
438*ec779b8eSAndroid Build Coastguard Worker if (item->getDouble("android.media.mediacodec.capture-rate", &captureRate)) {
439*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_capture_rate(captureRate);
440*ec779b8eSAndroid Build Coastguard Worker }
441*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeFloat(event, (float) captureRate);
442*ec779b8eSAndroid Build Coastguard Worker
443*ec779b8eSAndroid Build Coastguard Worker double operatingRate = -1.0;
444*ec779b8eSAndroid Build Coastguard Worker if (item->getDouble("android.media.mediacodec.operating-rate", &operatingRate)) {
445*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_operating_rate(operatingRate);
446*ec779b8eSAndroid Build Coastguard Worker }
447*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeFloat(event, (float) operatingRate);
448*ec779b8eSAndroid Build Coastguard Worker
449*ec779b8eSAndroid Build Coastguard Worker int32_t priority = -1;
450*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.priority", &priority)) {
451*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_priority(priority);
452*ec779b8eSAndroid Build Coastguard Worker }
453*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, priority);
454*ec779b8eSAndroid Build Coastguard Worker
455*ec779b8eSAndroid Build Coastguard Worker int32_t qpIMin = -1;
456*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.video-qp-i-min", &qpIMin)) {
457*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_video_qp_i_min(qpIMin);
458*ec779b8eSAndroid Build Coastguard Worker }
459*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, qpIMin);
460*ec779b8eSAndroid Build Coastguard Worker
461*ec779b8eSAndroid Build Coastguard Worker int32_t qpIMax = -1;
462*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.video-qp-i-max", &qpIMax)) {
463*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_video_qp_i_max(qpIMax);
464*ec779b8eSAndroid Build Coastguard Worker }
465*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, qpIMax);
466*ec779b8eSAndroid Build Coastguard Worker
467*ec779b8eSAndroid Build Coastguard Worker int32_t qpPMin = -1;
468*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.video-qp-p-min", &qpPMin)) {
469*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_video_qp_p_min(qpPMin);
470*ec779b8eSAndroid Build Coastguard Worker }
471*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, qpPMin);
472*ec779b8eSAndroid Build Coastguard Worker
473*ec779b8eSAndroid Build Coastguard Worker int32_t qpPMax = -1;
474*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.video-qp-p-max", &qpPMax)) {
475*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_video_qp_p_max(qpPMax);
476*ec779b8eSAndroid Build Coastguard Worker }
477*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, qpPMax);
478*ec779b8eSAndroid Build Coastguard Worker
479*ec779b8eSAndroid Build Coastguard Worker int32_t qpBMin = -1;
480*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.video-qp-b-min", &qpBMin)) {
481*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_video_qp_b_min(qpBMin);
482*ec779b8eSAndroid Build Coastguard Worker }
483*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, qpBMin);
484*ec779b8eSAndroid Build Coastguard Worker
485*ec779b8eSAndroid Build Coastguard Worker int32_t qpBMax = -1;
486*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.video-qp-b-max", &qpBMax)) {
487*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_video_qp_b_max(qpBMax);
488*ec779b8eSAndroid Build Coastguard Worker }
489*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, qpBMax);
490*ec779b8eSAndroid Build Coastguard Worker
491*ec779b8eSAndroid Build Coastguard Worker int32_t originalBitrate = -1;
492*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.original.bitrate", &originalBitrate)) {
493*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_original_bitrate(originalBitrate);
494*ec779b8eSAndroid Build Coastguard Worker }
495*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, originalBitrate);
496*ec779b8eSAndroid Build Coastguard Worker
497*ec779b8eSAndroid Build Coastguard Worker int32_t shapingEnhanced = -1;
498*ec779b8eSAndroid Build Coastguard Worker if ( item->getInt32("android.media.mediacodec.shaped", &shapingEnhanced)) {
499*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_shaping_enhanced(shapingEnhanced);
500*ec779b8eSAndroid Build Coastguard Worker }
501*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, shapingEnhanced);
502*ec779b8eSAndroid Build Coastguard Worker
503*ec779b8eSAndroid Build Coastguard Worker int32_t qpIMinOri = -1;
504*ec779b8eSAndroid Build Coastguard Worker if ( item->getInt32("android.media.mediacodec.original-video-qp-i-min", &qpIMinOri)) {
505*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_original_video_qp_i_min(qpIMinOri);
506*ec779b8eSAndroid Build Coastguard Worker }
507*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, qpIMinOri);
508*ec779b8eSAndroid Build Coastguard Worker
509*ec779b8eSAndroid Build Coastguard Worker int32_t qpIMaxOri = -1;
510*ec779b8eSAndroid Build Coastguard Worker if ( item->getInt32("android.media.mediacodec.original-video-qp-i-max", &qpIMaxOri)) {
511*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_original_video_qp_i_max(qpIMaxOri);
512*ec779b8eSAndroid Build Coastguard Worker }
513*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, qpIMaxOri);
514*ec779b8eSAndroid Build Coastguard Worker
515*ec779b8eSAndroid Build Coastguard Worker int32_t qpPMinOri = -1;
516*ec779b8eSAndroid Build Coastguard Worker if ( item->getInt32("android.media.mediacodec.original-video-qp-p-min", &qpPMinOri)) {
517*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_original_video_qp_p_min(qpPMinOri);
518*ec779b8eSAndroid Build Coastguard Worker }
519*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, qpPMinOri);
520*ec779b8eSAndroid Build Coastguard Worker
521*ec779b8eSAndroid Build Coastguard Worker int32_t qpPMaxOri = -1;
522*ec779b8eSAndroid Build Coastguard Worker if ( item->getInt32("android.media.mediacodec.original-video-qp-p-max", &qpPMaxOri)) {
523*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_original_video_qp_p_max(qpPMaxOri);
524*ec779b8eSAndroid Build Coastguard Worker }
525*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, qpPMaxOri);
526*ec779b8eSAndroid Build Coastguard Worker
527*ec779b8eSAndroid Build Coastguard Worker int32_t qpBMinOri = -1;
528*ec779b8eSAndroid Build Coastguard Worker if ( item->getInt32("android.media.mediacodec.original-video-qp-b-min", &qpBMinOri)) {
529*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_original_video_qp_b_min(qpBMinOri);
530*ec779b8eSAndroid Build Coastguard Worker }
531*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, qpBMinOri);
532*ec779b8eSAndroid Build Coastguard Worker
533*ec779b8eSAndroid Build Coastguard Worker int32_t qpBMaxOri = -1;
534*ec779b8eSAndroid Build Coastguard Worker if ( item->getInt32("android.media.mediacodec.original-video-qp-b-max", &qpBMaxOri)) {
535*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_original_video_qp_b_max(qpBMaxOri);
536*ec779b8eSAndroid Build Coastguard Worker }
537*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, qpBMaxOri);
538*ec779b8eSAndroid Build Coastguard Worker
539*ec779b8eSAndroid Build Coastguard Worker int32_t configColorStandard = -1;
540*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.config-color-standard", &configColorStandard)) {
541*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_config_color_standard(configColorStandard);
542*ec779b8eSAndroid Build Coastguard Worker }
543*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, configColorStandard);
544*ec779b8eSAndroid Build Coastguard Worker
545*ec779b8eSAndroid Build Coastguard Worker int32_t configColorRange = -1;
546*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.config-color-range", &configColorRange)) {
547*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_config_color_range(configColorRange);
548*ec779b8eSAndroid Build Coastguard Worker }
549*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, configColorRange);
550*ec779b8eSAndroid Build Coastguard Worker
551*ec779b8eSAndroid Build Coastguard Worker int32_t configColorTransfer = -1;
552*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.config-color-transfer", &configColorTransfer)) {
553*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_config_color_transfer(configColorTransfer);
554*ec779b8eSAndroid Build Coastguard Worker }
555*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, configColorTransfer);
556*ec779b8eSAndroid Build Coastguard Worker
557*ec779b8eSAndroid Build Coastguard Worker int32_t parsedColorStandard = -1;
558*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.parsed-color-standard", &parsedColorStandard)) {
559*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_parsed_color_standard(parsedColorStandard);
560*ec779b8eSAndroid Build Coastguard Worker }
561*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, parsedColorStandard);
562*ec779b8eSAndroid Build Coastguard Worker
563*ec779b8eSAndroid Build Coastguard Worker int32_t parsedColorRange = -1;
564*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.parsed-color-range", &parsedColorRange)) {
565*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_parsed_color_range(parsedColorRange);
566*ec779b8eSAndroid Build Coastguard Worker }
567*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, parsedColorRange);
568*ec779b8eSAndroid Build Coastguard Worker
569*ec779b8eSAndroid Build Coastguard Worker int32_t parsedColorTransfer = -1;
570*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.parsed-color-transfer", &parsedColorTransfer)) {
571*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_parsed_color_transfer(parsedColorTransfer);
572*ec779b8eSAndroid Build Coastguard Worker }
573*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, parsedColorTransfer);
574*ec779b8eSAndroid Build Coastguard Worker
575*ec779b8eSAndroid Build Coastguard Worker int32_t hdrStaticInfo = -1;
576*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.hdr-static-info", &hdrStaticInfo)) {
577*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_hdr_static_info(hdrStaticInfo);
578*ec779b8eSAndroid Build Coastguard Worker }
579*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, hdrStaticInfo);
580*ec779b8eSAndroid Build Coastguard Worker
581*ec779b8eSAndroid Build Coastguard Worker int32_t hdr10PlusInfo = -1;
582*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.hdr10-plus-info", &hdr10PlusInfo)) {
583*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_hdr10_plus_info(hdr10PlusInfo);
584*ec779b8eSAndroid Build Coastguard Worker }
585*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, hdr10PlusInfo);
586*ec779b8eSAndroid Build Coastguard Worker
587*ec779b8eSAndroid Build Coastguard Worker int32_t hdrFormat = -1;
588*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.hdr-format", &hdrFormat)) {
589*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_hdr_format(hdrFormat);
590*ec779b8eSAndroid Build Coastguard Worker }
591*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, hdrFormat);
592*ec779b8eSAndroid Build Coastguard Worker
593*ec779b8eSAndroid Build Coastguard Worker int64_t codecId = 0;
594*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.id", &codecId)) {
595*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_codec_id(codecId);
596*ec779b8eSAndroid Build Coastguard Worker }
597*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, codecId);
598*ec779b8eSAndroid Build Coastguard Worker
599*ec779b8eSAndroid Build Coastguard Worker int32_t arrayMode = -1;
600*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.array-mode", &arrayMode)) {
601*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_array_mode(arrayMode);
602*ec779b8eSAndroid Build Coastguard Worker }
603*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, arrayMode);
604*ec779b8eSAndroid Build Coastguard Worker
605*ec779b8eSAndroid Build Coastguard Worker int32_t operationMode = -1;
606*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.operation-mode", &operationMode)) {
607*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_operation_mode(operationMode);
608*ec779b8eSAndroid Build Coastguard Worker }
609*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, operationMode);
610*ec779b8eSAndroid Build Coastguard Worker
611*ec779b8eSAndroid Build Coastguard Worker int32_t outputSurface = -1;
612*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.output-surface", &outputSurface)) {
613*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_output_surface(outputSurface);
614*ec779b8eSAndroid Build Coastguard Worker }
615*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, outputSurface);
616*ec779b8eSAndroid Build Coastguard Worker
617*ec779b8eSAndroid Build Coastguard Worker int32_t appMaxInputSize = -1;
618*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.app-max-input-size", &appMaxInputSize)) {
619*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_app_max_input_size(appMaxInputSize);
620*ec779b8eSAndroid Build Coastguard Worker }
621*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, appMaxInputSize);
622*ec779b8eSAndroid Build Coastguard Worker
623*ec779b8eSAndroid Build Coastguard Worker int32_t usedMaxInputSize = -1;
624*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.used-max-input-size", &usedMaxInputSize)) {
625*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_used_max_input_size(usedMaxInputSize);
626*ec779b8eSAndroid Build Coastguard Worker }
627*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, usedMaxInputSize);
628*ec779b8eSAndroid Build Coastguard Worker
629*ec779b8eSAndroid Build Coastguard Worker int32_t codecMaxInputSize = -1;
630*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.codec-max-input-size", &codecMaxInputSize)) {
631*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_codec_max_input_size(codecMaxInputSize);
632*ec779b8eSAndroid Build Coastguard Worker }
633*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, codecMaxInputSize);
634*ec779b8eSAndroid Build Coastguard Worker
635*ec779b8eSAndroid Build Coastguard Worker int32_t flushCount = -1;
636*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.flush-count", &flushCount)) {
637*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_flush_count(flushCount);
638*ec779b8eSAndroid Build Coastguard Worker }
639*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, flushCount);
640*ec779b8eSAndroid Build Coastguard Worker
641*ec779b8eSAndroid Build Coastguard Worker int32_t setSurfaceCount = -1;
642*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.set-surface-count", &setSurfaceCount)) {
643*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_set_surface_count(setSurfaceCount);
644*ec779b8eSAndroid Build Coastguard Worker }
645*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, setSurfaceCount);
646*ec779b8eSAndroid Build Coastguard Worker
647*ec779b8eSAndroid Build Coastguard Worker int32_t resolutionChangeCount = -1;
648*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.resolution-change-count",
649*ec779b8eSAndroid Build Coastguard Worker &resolutionChangeCount)) {
650*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_resolution_change_count(resolutionChangeCount);
651*ec779b8eSAndroid Build Coastguard Worker }
652*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, resolutionChangeCount);
653*ec779b8eSAndroid Build Coastguard Worker
654*ec779b8eSAndroid Build Coastguard Worker int32_t componentColorFormat = -1;
655*ec779b8eSAndroid Build Coastguard Worker if (item->getInt32("android.media.mediacodec.component-color-format", &componentColorFormat)) {
656*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_component_color_format(componentColorFormat);
657*ec779b8eSAndroid Build Coastguard Worker }
658*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, componentColorFormat);
659*ec779b8eSAndroid Build Coastguard Worker
660*ec779b8eSAndroid Build Coastguard Worker uid_t app_uid = item->getUid();
661*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_caller_uid(app_uid);
662*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt32(event, app_uid);
663*ec779b8eSAndroid Build Coastguard Worker
664*ec779b8eSAndroid Build Coastguard Worker int64_t pixelFormat = -1;
665*ec779b8eSAndroid Build Coastguard Worker if (item->getInt64("android.media.mediacodec.pixel-format", &pixelFormat)) {
666*ec779b8eSAndroid Build Coastguard Worker metrics_proto.set_pixel_format(pixelFormat);
667*ec779b8eSAndroid Build Coastguard Worker }
668*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_writeInt64(event, pixelFormat);
669*ec779b8eSAndroid Build Coastguard Worker
670*ec779b8eSAndroid Build Coastguard Worker int64_t firstRenderTimeUs = -1;
671*ec779b8eSAndroid Build Coastguard Worker item->getInt64("android.media.mediacodec.first-render-time-us", &firstRenderTimeUs);
672*ec779b8eSAndroid Build Coastguard Worker int64_t framesReleased = -1;
673*ec779b8eSAndroid Build Coastguard Worker item->getInt64("android.media.mediacodec.frames-released", &framesReleased);
674*ec779b8eSAndroid Build Coastguard Worker int64_t framesRendered = -1;
675*ec779b8eSAndroid Build Coastguard Worker item->getInt64("android.media.mediacodec.frames-rendered", &framesRendered);
676*ec779b8eSAndroid Build Coastguard Worker int64_t framesDropped = -1;
677*ec779b8eSAndroid Build Coastguard Worker item->getInt64("android.media.mediacodec.frames-dropped", &framesDropped);
678*ec779b8eSAndroid Build Coastguard Worker int64_t framesSkipped = -1;
679*ec779b8eSAndroid Build Coastguard Worker item->getInt64("android.media.mediacodec.frames-skipped", &framesSkipped);
680*ec779b8eSAndroid Build Coastguard Worker double framerateContent = -1;
681*ec779b8eSAndroid Build Coastguard Worker item->getDouble("android.media.mediacodec.framerate-content", &framerateContent);
682*ec779b8eSAndroid Build Coastguard Worker double framerateActual = -1;
683*ec779b8eSAndroid Build Coastguard Worker item->getDouble("android.media.mediacodec.framerate-actual", &framerateActual);
684*ec779b8eSAndroid Build Coastguard Worker int64_t freezeScore = -1;
685*ec779b8eSAndroid Build Coastguard Worker item->getInt64("android.media.mediacodec.freeze-score", &freezeScore);
686*ec779b8eSAndroid Build Coastguard Worker double freezeRate = -1;
687*ec779b8eSAndroid Build Coastguard Worker item->getDouble("android.media.mediacodec.freeze-rate", &freezeRate);
688*ec779b8eSAndroid Build Coastguard Worker std::string freezeScoreHistogramStr;
689*ec779b8eSAndroid Build Coastguard Worker item->getString("android.media.mediacodec.freeze-score-histogram", &freezeScoreHistogramStr);
690*ec779b8eSAndroid Build Coastguard Worker std::string freezeScoreHistogramBucketsStr;
691*ec779b8eSAndroid Build Coastguard Worker item->getString("android.media.mediacodec.freeze-score-histogram-buckets",
692*ec779b8eSAndroid Build Coastguard Worker &freezeScoreHistogramBucketsStr);
693*ec779b8eSAndroid Build Coastguard Worker std::string freezeDurationMsHistogramStr;
694*ec779b8eSAndroid Build Coastguard Worker item->getString("android.media.mediacodec.freeze-duration-ms-histogram",
695*ec779b8eSAndroid Build Coastguard Worker &freezeDurationMsHistogramStr);
696*ec779b8eSAndroid Build Coastguard Worker std::string freezeDurationMsHistogramBucketsStr;
697*ec779b8eSAndroid Build Coastguard Worker item->getString("android.media.mediacodec.freeze-duration-ms-histogram-buckets",
698*ec779b8eSAndroid Build Coastguard Worker &freezeDurationMsHistogramBucketsStr);
699*ec779b8eSAndroid Build Coastguard Worker std::string freezeDistanceMsHistogramStr;
700*ec779b8eSAndroid Build Coastguard Worker item->getString("android.media.mediacodec.freeze-distance-ms-histogram",
701*ec779b8eSAndroid Build Coastguard Worker &freezeDistanceMsHistogramStr);
702*ec779b8eSAndroid Build Coastguard Worker std::string freezeDistanceMsHistogramBucketsStr;
703*ec779b8eSAndroid Build Coastguard Worker item->getString("android.media.mediacodec.freeze-distance-ms-histogram-buckets",
704*ec779b8eSAndroid Build Coastguard Worker &freezeDistanceMsHistogramBucketsStr);
705*ec779b8eSAndroid Build Coastguard Worker int64_t judderScore = -1;
706*ec779b8eSAndroid Build Coastguard Worker item->getInt64("android.media.mediacodec.judder-score", &judderScore);
707*ec779b8eSAndroid Build Coastguard Worker double judderRate = -1;
708*ec779b8eSAndroid Build Coastguard Worker item->getDouble("android.media.mediacodec.judder-rate", &judderRate);
709*ec779b8eSAndroid Build Coastguard Worker std::string judderScoreHistogramStr;
710*ec779b8eSAndroid Build Coastguard Worker item->getString("android.media.mediacodec.judder-score-histogram", &judderScoreHistogramStr);
711*ec779b8eSAndroid Build Coastguard Worker std::string judderScoreHistogramBucketsStr;
712*ec779b8eSAndroid Build Coastguard Worker item->getString("android.media.mediacodec.judder-score-histogram-buckets",
713*ec779b8eSAndroid Build Coastguard Worker &judderScoreHistogramBucketsStr);
714*ec779b8eSAndroid Build Coastguard Worker
715*ec779b8eSAndroid Build Coastguard Worker int err = AStatsEvent_write(event);
716*ec779b8eSAndroid Build Coastguard Worker if (err < 0) {
717*ec779b8eSAndroid Build Coastguard Worker ALOGE("Failed to write codec metrics to statsd (%d)", err);
718*ec779b8eSAndroid Build Coastguard Worker }
719*ec779b8eSAndroid Build Coastguard Worker AStatsEvent_release(event);
720*ec779b8eSAndroid Build Coastguard Worker
721*ec779b8eSAndroid Build Coastguard Worker if (framesRendered > 0) {
722*ec779b8eSAndroid Build Coastguard Worker int32_t statsUid = item->getUid();
723*ec779b8eSAndroid Build Coastguard Worker int64_t statsCodecId = codecId;
724*ec779b8eSAndroid Build Coastguard Worker char const *statsLogSessionId = sessionId.c_str();
725*ec779b8eSAndroid Build Coastguard Worker int32_t statsIsHardware = isHardware;
726*ec779b8eSAndroid Build Coastguard Worker int32_t statsIsSecure = isSecure;
727*ec779b8eSAndroid Build Coastguard Worker int32_t statsIsTunneled = isTunneled;
728*ec779b8eSAndroid Build Coastguard Worker int32_t statsCodec = getMetricsCodecEnum(mime, codec);
729*ec779b8eSAndroid Build Coastguard Worker int32_t statsResolution = getMetricsResolutionEnum(width, height);
730*ec779b8eSAndroid Build Coastguard Worker int32_t statsBitrate = BITRATE_UNKNOWN;
731*ec779b8eSAndroid Build Coastguard Worker int32_t statsContentFramerate = getMetricsFramerateEnum(framerateContent);
732*ec779b8eSAndroid Build Coastguard Worker int32_t statsActualFramerate = getMetricsFramerateEnum(framerateActual);
733*ec779b8eSAndroid Build Coastguard Worker int32_t statsHdrFormat = getMetricsHdrFormatEnum(mime, codec, configColorTransfer,
734*ec779b8eSAndroid Build Coastguard Worker parsedColorTransfer, hdrStaticInfo,
735*ec779b8eSAndroid Build Coastguard Worker hdr10PlusInfo);
736*ec779b8eSAndroid Build Coastguard Worker int64_t statsFirstRenderTimeUs = firstRenderTimeUs;
737*ec779b8eSAndroid Build Coastguard Worker int64_t statsPlaybackDurationSeconds = playbackDurationSec;
738*ec779b8eSAndroid Build Coastguard Worker int64_t statsFramesTotal = framesReleased + framesSkipped;
739*ec779b8eSAndroid Build Coastguard Worker int64_t statsFramesReleased = framesReleased;
740*ec779b8eSAndroid Build Coastguard Worker int64_t statsFramesRendered = framesRendered;
741*ec779b8eSAndroid Build Coastguard Worker int64_t statsFramesDropped = framesDropped;
742*ec779b8eSAndroid Build Coastguard Worker int64_t statsFramesSkipped = framesSkipped;
743*ec779b8eSAndroid Build Coastguard Worker float statsFrameDropRate = float(double(framesDropped) / statsFramesTotal);
744*ec779b8eSAndroid Build Coastguard Worker float statsFrameSkipRate = float(double(framesSkipped) / statsFramesTotal);
745*ec779b8eSAndroid Build Coastguard Worker float statsFrameSkipDropRate = float(double(framesSkipped + framesDropped) /
746*ec779b8eSAndroid Build Coastguard Worker statsFramesTotal);
747*ec779b8eSAndroid Build Coastguard Worker int64_t statsFreezeScore = freezeScore;
748*ec779b8eSAndroid Build Coastguard Worker float statsFreezeRate = freezeRate;
749*ec779b8eSAndroid Build Coastguard Worker std::vector<int32_t> statsFreezeDurationMsHistogram;
750*ec779b8eSAndroid Build Coastguard Worker parseVector(freezeDurationMsHistogramStr, &statsFreezeDurationMsHistogram);
751*ec779b8eSAndroid Build Coastguard Worker std::vector<int32_t> statsFreezeDurationMsHistogramBuckets;
752*ec779b8eSAndroid Build Coastguard Worker parseVector(freezeDurationMsHistogramBucketsStr, &statsFreezeDurationMsHistogramBuckets);
753*ec779b8eSAndroid Build Coastguard Worker std::vector<int32_t> statsFreezeDistanceMsHistogram;
754*ec779b8eSAndroid Build Coastguard Worker parseVector(freezeDistanceMsHistogramStr, &statsFreezeDistanceMsHistogram);
755*ec779b8eSAndroid Build Coastguard Worker std::vector<int32_t> statsFreezeDistanceMsHistogramBuckets;
756*ec779b8eSAndroid Build Coastguard Worker parseVector(freezeDistanceMsHistogramBucketsStr, &statsFreezeDistanceMsHistogramBuckets);
757*ec779b8eSAndroid Build Coastguard Worker int64_t statsJudderScore = judderScore;
758*ec779b8eSAndroid Build Coastguard Worker float statsJudderRate = judderRate;
759*ec779b8eSAndroid Build Coastguard Worker std::vector<int32_t> statsJudderScoreHistogram;
760*ec779b8eSAndroid Build Coastguard Worker parseVector(judderScoreHistogramStr, &statsJudderScoreHistogram);
761*ec779b8eSAndroid Build Coastguard Worker std::vector<int32_t> statsJudderScoreHistogramBuckets;
762*ec779b8eSAndroid Build Coastguard Worker parseVector(judderScoreHistogramBucketsStr, &statsJudderScoreHistogramBuckets);
763*ec779b8eSAndroid Build Coastguard Worker int result = stats_write(
764*ec779b8eSAndroid Build Coastguard Worker MEDIA_CODEC_RENDERED,
765*ec779b8eSAndroid Build Coastguard Worker statsUid,
766*ec779b8eSAndroid Build Coastguard Worker statsCodecId,
767*ec779b8eSAndroid Build Coastguard Worker statsLogSessionId,
768*ec779b8eSAndroid Build Coastguard Worker statsIsHardware,
769*ec779b8eSAndroid Build Coastguard Worker statsIsSecure,
770*ec779b8eSAndroid Build Coastguard Worker statsIsTunneled,
771*ec779b8eSAndroid Build Coastguard Worker statsCodec,
772*ec779b8eSAndroid Build Coastguard Worker statsResolution,
773*ec779b8eSAndroid Build Coastguard Worker statsBitrate,
774*ec779b8eSAndroid Build Coastguard Worker statsContentFramerate,
775*ec779b8eSAndroid Build Coastguard Worker statsActualFramerate,
776*ec779b8eSAndroid Build Coastguard Worker statsHdrFormat,
777*ec779b8eSAndroid Build Coastguard Worker statsFirstRenderTimeUs,
778*ec779b8eSAndroid Build Coastguard Worker statsPlaybackDurationSeconds,
779*ec779b8eSAndroid Build Coastguard Worker statsFramesTotal,
780*ec779b8eSAndroid Build Coastguard Worker statsFramesReleased,
781*ec779b8eSAndroid Build Coastguard Worker statsFramesRendered,
782*ec779b8eSAndroid Build Coastguard Worker statsFramesDropped,
783*ec779b8eSAndroid Build Coastguard Worker statsFramesSkipped,
784*ec779b8eSAndroid Build Coastguard Worker statsFrameDropRate,
785*ec779b8eSAndroid Build Coastguard Worker statsFrameSkipRate,
786*ec779b8eSAndroid Build Coastguard Worker statsFrameSkipDropRate,
787*ec779b8eSAndroid Build Coastguard Worker statsFreezeScore,
788*ec779b8eSAndroid Build Coastguard Worker statsFreezeRate,
789*ec779b8eSAndroid Build Coastguard Worker statsFreezeDurationMsHistogram,
790*ec779b8eSAndroid Build Coastguard Worker statsFreezeDurationMsHistogramBuckets,
791*ec779b8eSAndroid Build Coastguard Worker statsFreezeDistanceMsHistogram,
792*ec779b8eSAndroid Build Coastguard Worker statsFreezeDistanceMsHistogramBuckets,
793*ec779b8eSAndroid Build Coastguard Worker statsJudderScore,
794*ec779b8eSAndroid Build Coastguard Worker statsJudderRate,
795*ec779b8eSAndroid Build Coastguard Worker statsJudderScoreHistogram,
796*ec779b8eSAndroid Build Coastguard Worker statsJudderScoreHistogramBuckets);
797*ec779b8eSAndroid Build Coastguard Worker ALOGE_IF(result < 0, "Failed to record MEDIA_CODEC_RENDERED atom (%d)", result);
798*ec779b8eSAndroid Build Coastguard Worker }
799*ec779b8eSAndroid Build Coastguard Worker
800*ec779b8eSAndroid Build Coastguard Worker std::string serialized;
801*ec779b8eSAndroid Build Coastguard Worker if (!metrics_proto.SerializeToString(&serialized)) {
802*ec779b8eSAndroid Build Coastguard Worker ALOGE("Failed to serialize codec metrics");
803*ec779b8eSAndroid Build Coastguard Worker return false;
804*ec779b8eSAndroid Build Coastguard Worker }
805*ec779b8eSAndroid Build Coastguard Worker const stats::media_metrics::BytesField bf_serialized(serialized.c_str(), serialized.size());
806*ec779b8eSAndroid Build Coastguard Worker const int result = stats::media_metrics::stats_write(stats::media_metrics::MEDIAMETRICS_CODEC_REPORTED,
807*ec779b8eSAndroid Build Coastguard Worker timestampNanos, packageName.c_str(), packageVersionCode,
808*ec779b8eSAndroid Build Coastguard Worker mediaApexVersion,
809*ec779b8eSAndroid Build Coastguard Worker bf_serialized);
810*ec779b8eSAndroid Build Coastguard Worker
811*ec779b8eSAndroid Build Coastguard Worker std::stringstream log;
812*ec779b8eSAndroid Build Coastguard Worker log << "result:" << result << " {"
813*ec779b8eSAndroid Build Coastguard Worker << " mediametrics_codec_reported:"
814*ec779b8eSAndroid Build Coastguard Worker << stats::media_metrics::MEDIAMETRICS_CODEC_REPORTED
815*ec779b8eSAndroid Build Coastguard Worker << " timestamp_nanos:" << timestampNanos
816*ec779b8eSAndroid Build Coastguard Worker << " package_name:" << packageName
817*ec779b8eSAndroid Build Coastguard Worker << " package_version_code:" << packageVersionCode
818*ec779b8eSAndroid Build Coastguard Worker << " media_apex_version:" << mediaApexVersion
819*ec779b8eSAndroid Build Coastguard Worker << " codec:" << codec
820*ec779b8eSAndroid Build Coastguard Worker << " mime:" << mime
821*ec779b8eSAndroid Build Coastguard Worker << " mode:" << mode
822*ec779b8eSAndroid Build Coastguard Worker << " encoder:" << isEncoder
823*ec779b8eSAndroid Build Coastguard Worker << " secure:" << isSecure
824*ec779b8eSAndroid Build Coastguard Worker << " width:" << width
825*ec779b8eSAndroid Build Coastguard Worker << " height:" << height
826*ec779b8eSAndroid Build Coastguard Worker << " rotation:" << rotation
827*ec779b8eSAndroid Build Coastguard Worker << " crypto:" << crypto
828*ec779b8eSAndroid Build Coastguard Worker << " profile:" << profile
829*ec779b8eSAndroid Build Coastguard Worker << " level:" << level
830*ec779b8eSAndroid Build Coastguard Worker << " max_width:" << maxWidth
831*ec779b8eSAndroid Build Coastguard Worker << " max_height:" << maxHeight
832*ec779b8eSAndroid Build Coastguard Worker << " error_code:" << errorCode
833*ec779b8eSAndroid Build Coastguard Worker << " error_state:" << errorState
834*ec779b8eSAndroid Build Coastguard Worker << " latency_max:" << latencyMax
835*ec779b8eSAndroid Build Coastguard Worker << " latency_min:" << latencyMin
836*ec779b8eSAndroid Build Coastguard Worker << " latency_avg:" << latencyAvg
837*ec779b8eSAndroid Build Coastguard Worker << " latency_count:" << latencyCount
838*ec779b8eSAndroid Build Coastguard Worker << " latency_unknown:" << latencyUnknown
839*ec779b8eSAndroid Build Coastguard Worker << " queue_input_buffer_error:" << queueInputBufferError
840*ec779b8eSAndroid Build Coastguard Worker << " queue_secure_input_buffer_error:" << queueSecureInputBufferError
841*ec779b8eSAndroid Build Coastguard Worker << " bitrate_mode:" << bitrateMode
842*ec779b8eSAndroid Build Coastguard Worker << " bitrate:" << bitrate
843*ec779b8eSAndroid Build Coastguard Worker << " original_bitrate:" << originalBitrate
844*ec779b8eSAndroid Build Coastguard Worker << " lifetime_millis:" << lifetimeMillis
845*ec779b8eSAndroid Build Coastguard Worker << " playback_duration_seconds:" << playbackDurationSec
846*ec779b8eSAndroid Build Coastguard Worker << " log_session_id:" << sessionId
847*ec779b8eSAndroid Build Coastguard Worker << " channel_count:" << channelCount
848*ec779b8eSAndroid Build Coastguard Worker << " sample_rate:" << sampleRate
849*ec779b8eSAndroid Build Coastguard Worker << " encode_bytes:" << bytes
850*ec779b8eSAndroid Build Coastguard Worker << " encode_frames:" << frames
851*ec779b8eSAndroid Build Coastguard Worker << " encode_duration_us:" << durationUs
852*ec779b8eSAndroid Build Coastguard Worker << " color_format:" << colorFormat
853*ec779b8eSAndroid Build Coastguard Worker << " frame_rate:" << frameRate
854*ec779b8eSAndroid Build Coastguard Worker << " capture_rate:" << captureRate
855*ec779b8eSAndroid Build Coastguard Worker << " operating_rate:" << operatingRate
856*ec779b8eSAndroid Build Coastguard Worker << " priority:" << priority
857*ec779b8eSAndroid Build Coastguard Worker << " shaping_enhanced:" << shapingEnhanced
858*ec779b8eSAndroid Build Coastguard Worker << " qp_i_min:" << qpIMin
859*ec779b8eSAndroid Build Coastguard Worker << " qp_i_max:" << qpIMax
860*ec779b8eSAndroid Build Coastguard Worker << " qp_p_min:" << qpPMin
861*ec779b8eSAndroid Build Coastguard Worker << " qp_p_max:" << qpPMax
862*ec779b8eSAndroid Build Coastguard Worker << " qp_b_min:" << qpBMin
863*ec779b8eSAndroid Build Coastguard Worker << " qp_b_max:" << qpBMax
864*ec779b8eSAndroid Build Coastguard Worker << " original_qp_i_min:" << qpIMinOri
865*ec779b8eSAndroid Build Coastguard Worker << " original_qp_i_max:" << qpIMaxOri
866*ec779b8eSAndroid Build Coastguard Worker << " original_qp_p_min:" << qpPMinOri
867*ec779b8eSAndroid Build Coastguard Worker << " original_qp_p_max:" << qpPMaxOri
868*ec779b8eSAndroid Build Coastguard Worker << " original_qp_b_min:" << qpBMinOri
869*ec779b8eSAndroid Build Coastguard Worker << " original_qp_b_max:" << qpBMaxOri
870*ec779b8eSAndroid Build Coastguard Worker << " app_uid:" << app_uid
871*ec779b8eSAndroid Build Coastguard Worker << " }";
872*ec779b8eSAndroid Build Coastguard Worker statsdLog->log(stats::media_metrics::MEDIAMETRICS_CODEC_REPORTED, log.str());
873*ec779b8eSAndroid Build Coastguard Worker
874*ec779b8eSAndroid Build Coastguard Worker
875*ec779b8eSAndroid Build Coastguard Worker return true;
876*ec779b8eSAndroid Build Coastguard Worker }
877*ec779b8eSAndroid Build Coastguard Worker
878*ec779b8eSAndroid Build Coastguard Worker } // namespace android
879