blob: c1a5163b260c7541040c173ad497517f08f44e25 [file] [log] [blame]
Ray Essick6ce27e52019-02-15 10:58:05 -08001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//#define LOG_NDEBUG 0
18#define LOG_TAG "statsd_codec"
19#include <utils/Log.h>
20
21#include <dirent.h>
22#include <inttypes.h>
23#include <pthread.h>
24#include <pwd.h>
25#include <stdint.h>
26#include <string.h>
27#include <sys/stat.h>
28#include <sys/time.h>
29#include <sys/types.h>
30#include <unistd.h>
31
32#include <statslog.h>
33
Ray Essick5a557292020-06-10 21:31:33 -070034#include "cleaner.h"
Ray Essick40e8e5e2019-12-05 20:19:40 -080035#include "MediaMetricsService.h"
Dichen Zhangb8f23c52021-03-22 00:56:29 -070036#include "frameworks/proto_logging/stats/message/mediametrics_message.pb.h"
Ray Essick6ce27e52019-02-15 10:58:05 -080037#include "iface_statsd.h"
38
39namespace android {
40
Andy Hung5be90c82021-03-30 14:30:20 -070041bool statsd_codec(const std::shared_ptr<const mediametrics::Item>& item,
42 const std::shared_ptr<mediametrics::StatsdLog>& statsdLog)
Ray Essick6ce27e52019-02-15 10:58:05 -080043{
Andy Hung3ab1b322020-05-18 10:47:31 -070044 if (item == nullptr) return false;
Ray Essick6ce27e52019-02-15 10:58:05 -080045
46 // these go into the statsd wrapper
Andy Hung5be90c82021-03-30 14:30:20 -070047 const nsecs_t timestamp_nanos = MediaMetricsService::roundTime(item->getTimestamp());
48 const std::string package_name = item->getPkgName();
49 const int64_t package_version_code = item->getPkgVersionCode();
50 const int64_t media_apex_version = 0;
Ray Essick6ce27e52019-02-15 10:58:05 -080051
52 // the rest into our own proto
53 //
Dichen Zhangb8f23c52021-03-22 00:56:29 -070054 ::android::stats::mediametrics_message::CodecData metrics_proto;
Ray Essick6ce27e52019-02-15 10:58:05 -080055
56 // flesh out the protobuf we'll hand off with our data
57 //
Dichen Zhang57be6302021-05-18 18:20:31 -070058 //android.media.mediacodec.log-session-id string
59 std::string sessionId;
60 if (item->getString("android.media.mediacodec.log-session-id", &sessionId)) {
61 metrics_proto.set_log_session_id(sessionId);
62 }
Ray Essick6ce27e52019-02-15 10:58:05 -080063 // android.media.mediacodec.codec string
George Burgess IV0d814432019-10-23 11:32:26 -070064 std::string codec;
65 if (item->getString("android.media.mediacodec.codec", &codec)) {
Andy Hung5be90c82021-03-30 14:30:20 -070066 metrics_proto.set_codec(codec);
Ray Essick6ce27e52019-02-15 10:58:05 -080067 }
Andy Hung5be90c82021-03-30 14:30:20 -070068
George Burgess IV0d814432019-10-23 11:32:26 -070069 std::string mime;
70 if (item->getString("android.media.mediacodec.mime", &mime)) {
Andy Hung5be90c82021-03-30 14:30:20 -070071 metrics_proto.set_mime(mime);
Ray Essick6ce27e52019-02-15 10:58:05 -080072 }
Andy Hung5be90c82021-03-30 14:30:20 -070073
George Burgess IV0d814432019-10-23 11:32:26 -070074 std::string mode;
75 if ( item->getString("android.media.mediacodec.mode", &mode)) {
Andy Hung5be90c82021-03-30 14:30:20 -070076 metrics_proto.set_mode(mode);
Ray Essick6ce27e52019-02-15 10:58:05 -080077 }
Andy Hung5be90c82021-03-30 14:30:20 -070078
Ray Essick6ce27e52019-02-15 10:58:05 -080079 int32_t encoder = -1;
80 if ( item->getInt32("android.media.mediacodec.encoder", &encoder)) {
81 metrics_proto.set_encoder(encoder);
82 }
Andy Hung5be90c82021-03-30 14:30:20 -070083
Ray Essick6ce27e52019-02-15 10:58:05 -080084 int32_t secure = -1;
85 if ( item->getInt32("android.media.mediacodec.secure", &secure)) {
86 metrics_proto.set_secure(secure);
87 }
Andy Hung5be90c82021-03-30 14:30:20 -070088
Ray Essick6ce27e52019-02-15 10:58:05 -080089 int32_t width = -1;
90 if ( item->getInt32("android.media.mediacodec.width", &width)) {
91 metrics_proto.set_width(width);
92 }
Andy Hung5be90c82021-03-30 14:30:20 -070093
Ray Essick6ce27e52019-02-15 10:58:05 -080094 int32_t height = -1;
95 if ( item->getInt32("android.media.mediacodec.height", &height)) {
96 metrics_proto.set_height(height);
97 }
Andy Hung5be90c82021-03-30 14:30:20 -070098
Ray Essick6ce27e52019-02-15 10:58:05 -080099 int32_t rotation = -1;
100 if ( item->getInt32("android.media.mediacodec.rotation-degrees", &rotation)) {
101 metrics_proto.set_rotation(rotation);
102 }
Dichen Zhang0de05752021-04-21 19:47:07 -0700103 // android.media.mediacodec.crypto int32 (although missing if not needed)
Ray Essick6ce27e52019-02-15 10:58:05 -0800104 int32_t crypto = -1;
105 if ( item->getInt32("android.media.mediacodec.crypto", &crypto)) {
106 metrics_proto.set_crypto(crypto);
107 }
Andy Hung5be90c82021-03-30 14:30:20 -0700108
Ray Essick6ce27e52019-02-15 10:58:05 -0800109 int32_t profile = -1;
110 if ( item->getInt32("android.media.mediacodec.profile", &profile)) {
111 metrics_proto.set_profile(profile);
112 }
Andy Hung5be90c82021-03-30 14:30:20 -0700113
Ray Essick6ce27e52019-02-15 10:58:05 -0800114 int32_t level = -1;
115 if ( item->getInt32("android.media.mediacodec.level", &level)) {
116 metrics_proto.set_level(level);
117 }
Andy Hung5be90c82021-03-30 14:30:20 -0700118
119 int32_t max_width = -1;
120 if ( item->getInt32("android.media.mediacodec.maxwidth", &max_width)) {
121 metrics_proto.set_max_width(max_width);
Ray Essick6ce27e52019-02-15 10:58:05 -0800122 }
Andy Hung5be90c82021-03-30 14:30:20 -0700123
124 int32_t max_height = -1;
125 if ( item->getInt32("android.media.mediacodec.maxheight", &max_height)) {
126 metrics_proto.set_max_height(max_height);
Ray Essick6ce27e52019-02-15 10:58:05 -0800127 }
Andy Hung5be90c82021-03-30 14:30:20 -0700128
129 int32_t error_code = -1;
130 if ( item->getInt32("android.media.mediacodec.errcode", &error_code)) {
131 metrics_proto.set_error_code(error_code);
Ray Essick6ce27e52019-02-15 10:58:05 -0800132 }
Andy Hung5be90c82021-03-30 14:30:20 -0700133
134 std::string error_state;
135 if ( item->getString("android.media.mediacodec.errstate", &error_state)) {
136 metrics_proto.set_error_state(error_state);
Ray Essick6ce27e52019-02-15 10:58:05 -0800137 }
Andy Hung5be90c82021-03-30 14:30:20 -0700138
Ray Essick6ce27e52019-02-15 10:58:05 -0800139 int64_t latency_max = -1;
140 if ( item->getInt64("android.media.mediacodec.latency.max", &latency_max)) {
141 metrics_proto.set_latency_max(latency_max);
142 }
Andy Hung5be90c82021-03-30 14:30:20 -0700143
Ray Essick6ce27e52019-02-15 10:58:05 -0800144 int64_t latency_min = -1;
145 if ( item->getInt64("android.media.mediacodec.latency.min", &latency_min)) {
146 metrics_proto.set_latency_min(latency_min);
147 }
Andy Hung5be90c82021-03-30 14:30:20 -0700148
Ray Essick6ce27e52019-02-15 10:58:05 -0800149 int64_t latency_avg = -1;
150 if ( item->getInt64("android.media.mediacodec.latency.avg", &latency_avg)) {
151 metrics_proto.set_latency_avg(latency_avg);
152 }
Andy Hung5be90c82021-03-30 14:30:20 -0700153
Ray Essick6ce27e52019-02-15 10:58:05 -0800154 int64_t latency_count = -1;
155 if ( item->getInt64("android.media.mediacodec.latency.n", &latency_count)) {
156 metrics_proto.set_latency_count(latency_count);
157 }
Andy Hung5be90c82021-03-30 14:30:20 -0700158
Ray Essick6ce27e52019-02-15 10:58:05 -0800159 int64_t latency_unknown = -1;
160 if ( item->getInt64("android.media.mediacodec.latency.unknown", &latency_unknown)) {
161 metrics_proto.set_latency_unknown(latency_unknown);
162 }
Andy Hung5be90c82021-03-30 14:30:20 -0700163
164 int32_t queue_secure_input_buffer_error = -1;
165 if (item->getInt32("android.media.mediacodec.queueSecureInputBufferError",
166 &queue_secure_input_buffer_error)) {
167 metrics_proto.set_queue_secure_input_buffer_error(queue_secure_input_buffer_error);
Edwin Wong4f105392020-02-12 14:55:00 -0800168 }
Andy Hung5be90c82021-03-30 14:30:20 -0700169
170 int32_t queue_input_buffer_error = -1;
171 if (item->getInt32("android.media.mediacodec.queueInputBufferError",
172 &queue_input_buffer_error)) {
173 metrics_proto.set_queue_input_buffer_error(queue_input_buffer_error);
Edwin Wong4f105392020-02-12 14:55:00 -0800174 }
Ray Essick6ce27e52019-02-15 10:58:05 -0800175 // android.media.mediacodec.latency.hist NOT EMITTED
176
Ray Essicka21a3d32020-05-10 21:08:10 -0700177 std::string bitrate_mode;
178 if (item->getString("android.media.mediacodec.bitrate_mode", &bitrate_mode)) {
Andy Hung5be90c82021-03-30 14:30:20 -0700179 metrics_proto.set_bitrate_mode(bitrate_mode);
Ray Essicka21a3d32020-05-10 21:08:10 -0700180 }
Andy Hung5be90c82021-03-30 14:30:20 -0700181
Ray Essicka21a3d32020-05-10 21:08:10 -0700182 int32_t bitrate = -1;
183 if (item->getInt32("android.media.mediacodec.bitrate", &bitrate)) {
184 metrics_proto.set_bitrate(bitrate);
185 }
Andy Hung5be90c82021-03-30 14:30:20 -0700186
187 int64_t lifetime_millis = -1;
188 if (item->getInt64("android.media.mediacodec.lifetimeMs", &lifetime_millis)) {
189 lifetime_millis = mediametrics::bucket_time_minutes(lifetime_millis);
190 metrics_proto.set_lifetime_millis(lifetime_millis);
Ray Essicka21a3d32020-05-10 21:08:10 -0700191 }
Ray Essicka21a3d32020-05-10 21:08:10 -0700192
Dichen Zhang0de05752021-04-21 19:47:07 -0700193 // android.media.mediacodec.channelCount
194 int32_t channelCount = -1;
195 if ( item->getInt32("android.media.mediacodec.channelCount", &channelCount)) {
196 metrics_proto.set_channel_count(channelCount);
197 }
Ray Essick87913312021-03-02 10:45:54 -0800198
Dichen Zhang0de05752021-04-21 19:47:07 -0700199 // android.media.mediacodec.sampleRate
200 int32_t sampleRate = -1;
201 if ( item->getInt32("android.media.mediacodec.sampleRate", &sampleRate)) {
202 metrics_proto.set_sample_rate(sampleRate);
203 }
204
Ray Essick87913312021-03-02 10:45:54 -0800205 // TODO PWG may want these fuzzed up a bit to obscure some precision
Dichen Zhang0de05752021-04-21 19:47:07 -0700206 // android.media.mediacodec.vencode.bytes
207 int64_t bytes = -1;
208 if ( item->getInt64("android.media.mediacodec.vencode.bytes", &bytes)) {
209 metrics_proto.set_video_encode_bytes(bytes);
210 }
211
212 // android.media.mediacodec.vencode.frames
213 int64_t frames = -1;
214 if ( item->getInt64("android.media.mediacodec.vencode.frames", &frames)) {
215 metrics_proto.set_video_encode_frames(frames);
216 }
217
218 // android.media.mediacodec.vencode.durationUs
219 int64_t durationUs = -1;
220 if ( item->getInt64("android.media.mediacodec.vencode.durationUs", &durationUs)) {
221 metrics_proto.set_video_encode_duration_us(durationUs);
222 }
223
224 // android.media.mediacodec.color-format
225 int32_t colorFormat = -1;
226 if ( item->getInt32("android.media.mediacodec.color-format", &colorFormat)) {
227 metrics_proto.set_color_format(colorFormat);
228 }
229
230 // android.media.mediacodec.frame-rate
231 double frameRate = -1.0;
232 if ( item->getDouble("android.media.mediacodec.frame-rate", &frameRate)) {
233 metrics_proto.set_frame_rate(frameRate);
234 }
235
236 // android.media.mediacodec.capture-rate
237 double captureRate = -1.0;
238 if ( item->getDouble("android.media.mediacodec.capture-rate", &captureRate)) {
239 metrics_proto.set_capture_rate(captureRate);
240 }
241
242 // android.media.mediacodec.operating-rate
243 double operatingRate = -1.0;
244 if ( item->getDouble("android.media.mediacodec.operating-rate", &operatingRate)) {
245 metrics_proto.set_operating_rate(operatingRate);
246 }
247
248 // android.media.mediacodec.priority
249 int32_t priority = -1;
250 if ( item->getInt32("android.media.mediacodec.priority", &priority)) {
251 metrics_proto.set_priority(priority);
252 }
253
254 // android.media.mediacodec.video-qp-i-min
255 int32_t qpIMin = -1;
256 if ( item->getInt32("android.media.mediacodec.video-qp-i-min", &qpIMin)) {
257 metrics_proto.set_video_qp_i_min(qpIMin);
258 }
259
260 // android.media.mediacodec.video-qp-i-max
261 int32_t qpIMax = -1;
262 if ( item->getInt32("android.media.mediacodec.video-qp-i-max", &qpIMax)) {
263 metrics_proto.set_video_qp_i_max(qpIMax);
264 }
265
266 // android.media.mediacodec.video-qp-p-min
267 int32_t qpPMin = -1;
268 if ( item->getInt32("android.media.mediacodec.video-qp-p-min", &qpPMin)) {
269 metrics_proto.set_video_qp_p_min(qpPMin);
270 }
271
272 // android.media.mediacodec.video-qp-p-max
273 int32_t qpPMax = -1;
274 if ( item->getInt32("android.media.mediacodec.video-qp-p-max", &qpPMax)) {
275 metrics_proto.set_video_qp_p_max(qpPMax);
276 }
277
278 // android.media.mediacodec.video-qp-b-min
279 int32_t qpBMin = -1;
280 if ( item->getInt32("android.media.mediacodec.video-qp-b-min", &qpBMin)) {
281 metrics_proto.set_video_qp_b_min(qpIMin);
282 }
283
284 // android.media.mediacodec.video-qp-b-max
285 int32_t qpBMax = -1;
286 if ( item->getInt32("android.media.mediacodec.video-qp-b-max", &qpBMax)) {
287 metrics_proto.set_video_qp_b_max(qpBMax);
288 }
289
290 // android.media.mediacodec.video.input.bytes
291 int64_t inputBytes = -1;
292 if ( item->getInt64("android.media.mediacodec.video.input.bytes", &inputBytes)) {
293 metrics_proto.set_video_input_bytes(inputBytes);
294 }
295
296 // android.media.mediacodec.video.input.frames
297 int64_t inputFrames = -1;
298 if ( item->getInt64("android.media.mediacodec.video.input.frames", &inputFrames)) {
299 metrics_proto.set_video_input_frames(inputFrames);
300 }
Ray Essick87913312021-03-02 10:45:54 -0800301
Dichen Zhange5bad782021-04-28 12:11:35 -0700302 // android.media.mediacodec.original.bitrate
303 int32_t originalBitrate = -1;
304 if ( item->getInt32("android.media.mediacodec.original.bitrate", &originalBitrate)) {
305 metrics_proto.set_original_bitrate(originalBitrate);
306 }
307
Dichen Zhang57be6302021-05-18 18:20:31 -0700308 // android.media.mediacodec.shaped
309 int32_t shapingEnhanced = -1;
310 if ( item->getInt32("android.media.mediacodec.shaped", &shapingEnhanced)) {
311 metrics_proto.set_shaping_enhanced(shapingEnhanced);
312 }
313
314 // android.media.mediacodec.original-video-qp-i-min
315 int32_t qpIMinOri = -1;
316 if ( item->getInt32("android.media.mediacodec.original-video-qp-i-min", &qpIMinOri)) {
317 metrics_proto.set_original_video_qp_i_min(qpIMinOri);
318 }
319
320 // android.media.mediacodec.original-video-qp-i-max
321 int32_t qpIMaxOri = -1;
322 if ( item->getInt32("android.media.mediacodec.original-video-qp-i-max", &qpIMaxOri)) {
323 metrics_proto.set_original_video_qp_i_max(qpIMaxOri);
324 }
325
326 // android.media.mediacodec.original-video-qp-p-min
327 int32_t qpPMinOri = -1;
328 if ( item->getInt32("android.media.mediacodec.original-video-qp-p-min", &qpPMinOri)) {
329 metrics_proto.set_original_video_qp_p_min(qpPMinOri);
330 }
331
332 // android.media.mediacodec.original-video-qp-p-max
333 int32_t qpPMaxOri = -1;
334 if ( item->getInt32("android.media.mediacodec.original-video-qp-p-max", &qpPMaxOri)) {
335 metrics_proto.set_original_video_qp_p_max(qpPMaxOri);
336 }
337
338 // android.media.mediacodec.original-video-qp-b-min
339 int32_t qpBMinOri = -1;
340 if ( item->getInt32("android.media.mediacodec.original-video-qp-b-min", &qpBMinOri)) {
341 metrics_proto.set_original_video_qp_b_min(qpIMinOri);
342 }
343
344 // android.media.mediacodec.original-video-qp-b-max
345 int32_t qpBMaxOri = -1;
346 if ( item->getInt32("android.media.mediacodec.original-video-qp-b-max", &qpBMaxOri)) {
347 metrics_proto.set_original_video_qp_b_max(qpBMaxOri);
348 }
349
Ray Essick6ce27e52019-02-15 10:58:05 -0800350 std::string serialized;
351 if (!metrics_proto.SerializeToString(&serialized)) {
352 ALOGE("Failed to serialize codec metrics");
353 return false;
354 }
Andy Hung5be90c82021-03-30 14:30:20 -0700355 android::util::BytesField bf_serialized( serialized.c_str(), serialized.size());
356 int result = android::util::stats_write(android::util::MEDIAMETRICS_CODEC_REPORTED,
357 timestamp_nanos, package_name.c_str(), package_version_code,
358 media_apex_version,
359 bf_serialized);
360 std::stringstream log;
361 log << "result:" << result << " {"
362 << " mediametrics_codec_reported:"
363 << android::util::MEDIAMETRICS_CODEC_REPORTED
364 << " timestamp_nanos:" << timestamp_nanos
365 << " package_name:" << package_name
366 << " package_version_code:" << package_version_code
367 << " media_apex_version:" << media_apex_version
Ray Essick6ce27e52019-02-15 10:58:05 -0800368
Andy Hung5be90c82021-03-30 14:30:20 -0700369 << " codec:" << codec
370 << " mime:" << mime
371 << " mode:" << mode
372 << " encoder:" << encoder
373 << " secure:" << secure
374 << " width:" << width
375 << " height:" << height
376 << " rotation:" << rotation
377 << " crypto:" << crypto
378 << " profile:" << profile
Ray Essick6ce27e52019-02-15 10:58:05 -0800379
Andy Hung5be90c82021-03-30 14:30:20 -0700380 << " level:" << level
381 << " max_width:" << max_width
382 << " max_height:" << max_height
383 << " error_code:" << error_code
384 << " error_state:" << error_state
385 << " latency_max:" << latency_max
386 << " latency_min:" << latency_min
387 << " latency_avg:" << latency_avg
388 << " latency_count:" << latency_count
389 << " latency_unknown:" << latency_unknown
Ray Essick6ce27e52019-02-15 10:58:05 -0800390
Andy Hung5be90c82021-03-30 14:30:20 -0700391 << " queue_input_buffer_error:" << queue_input_buffer_error
392 << " queue_secure_input_buffer_error:" << queue_secure_input_buffer_error
393 << " bitrate_mode:" << bitrate_mode
394 << " bitrate:" << bitrate
Dichen Zhang57be6302021-05-18 18:20:31 -0700395 << " original_bitrate:" << originalBitrate
Andy Hung5be90c82021-03-30 14:30:20 -0700396 << " lifetime_millis:" << lifetime_millis
Dichen Zhang57be6302021-05-18 18:20:31 -0700397 << " log_session_id:" << sessionId
398 << " channel_count:" << channelCount
399 << " sample_rate:" << sampleRate
400 << " encode_bytes:" << bytes
401 << " encode_frames:" << frames
402 << " encode_duration_us:" << durationUs
403 << " color_format:" << colorFormat
404 << " frame_rate:" << frameRate
405 << " capture_rate:" << captureRate
406 << " operating_rate:" << operatingRate
407 << " priority:" << priority
408 << " shaping_enhanced:" << shapingEnhanced
409
410 << " qp_i_min:" << qpIMin
411 << " qp_i_max:" << qpIMax
412 << " qp_p_min:" << qpPMin
413 << " qp_p_max:" << qpPMax
414 << " qp_b_min:" << qpBMin
415 << " qp_b_max:" << qpBMax
416 << " original_qp_i_min:" << qpIMinOri
417 << " original_qp_i_max:" << qpIMaxOri
418 << " original_qp_p_min:" << qpPMinOri
419 << " original_qp_p_max:" << qpPMaxOri
420 << " original_qp_b_min:" << qpBMinOri
421 << " original_qp_b_max:" << qpBMaxOri
Andy Hung5be90c82021-03-30 14:30:20 -0700422 << " }";
423 statsdLog->log(android::util::MEDIAMETRICS_CODEC_REPORTED, log.str());
Ray Essick6ce27e52019-02-15 10:58:05 -0800424 return true;
425}
426
Andy Hung3ab1b322020-05-18 10:47:31 -0700427} // namespace android