xref: /aosp_15_r20/frameworks/av/services/mediametrics/statsd_nuplayer.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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_nuplayer"
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.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <sys/stat.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <sys/time.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <unistd.h>
31*ec779b8eSAndroid Build Coastguard Worker 
32*ec779b8eSAndroid Build Coastguard Worker #include <stats_media_metrics.h>
33*ec779b8eSAndroid Build Coastguard Worker 
34*ec779b8eSAndroid Build Coastguard Worker #include "MediaMetricsService.h"
35*ec779b8eSAndroid Build Coastguard Worker #include "frameworks/proto_logging/stats/message/mediametrics_message.pb.h"
36*ec779b8eSAndroid Build Coastguard Worker #include "iface_statsd.h"
37*ec779b8eSAndroid Build Coastguard Worker 
38*ec779b8eSAndroid Build Coastguard Worker namespace android {
39*ec779b8eSAndroid Build Coastguard Worker 
40*ec779b8eSAndroid Build Coastguard Worker /*
41*ec779b8eSAndroid Build Coastguard Worker  *  handles nuplayer AND nuplayer2
42*ec779b8eSAndroid Build Coastguard Worker  *  checks for the union of what the two players generate
43*ec779b8eSAndroid Build Coastguard Worker  */
statsd_nuplayer(const std::shared_ptr<const mediametrics::Item> & item,const std::shared_ptr<mediametrics::StatsdLog> & statsdLog)44*ec779b8eSAndroid Build Coastguard Worker bool statsd_nuplayer(const std::shared_ptr<const mediametrics::Item>& item,
45*ec779b8eSAndroid Build Coastguard Worker         const std::shared_ptr<mediametrics::StatsdLog>& statsdLog)
46*ec779b8eSAndroid Build Coastguard Worker {
47*ec779b8eSAndroid Build Coastguard Worker     if (item == nullptr) return false;
48*ec779b8eSAndroid Build Coastguard Worker 
49*ec779b8eSAndroid Build Coastguard Worker     // these go into the statsd wrapper
50*ec779b8eSAndroid Build Coastguard Worker     const nsecs_t timestamp_nanos = MediaMetricsService::roundTime(item->getTimestamp());
51*ec779b8eSAndroid Build Coastguard Worker     const std::string package_name = item->getPkgName();
52*ec779b8eSAndroid Build Coastguard Worker     const int64_t package_version_code = item->getPkgVersionCode();
53*ec779b8eSAndroid Build Coastguard Worker     const int64_t media_apex_version = 0;
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker     // the rest into our own proto
56*ec779b8eSAndroid Build Coastguard Worker     //
57*ec779b8eSAndroid Build Coastguard Worker     ::android::stats::mediametrics_message::NuPlayerData metrics_proto;
58*ec779b8eSAndroid Build Coastguard Worker 
59*ec779b8eSAndroid Build Coastguard Worker     // flesh out the protobuf we'll hand off with our data
60*ec779b8eSAndroid Build Coastguard Worker     //
61*ec779b8eSAndroid Build Coastguard Worker 
62*ec779b8eSAndroid Build Coastguard Worker     // differentiate between nuplayer and nuplayer2
63*ec779b8eSAndroid Build Coastguard Worker     std::string whichPlayer = item->getKey();
64*ec779b8eSAndroid Build Coastguard Worker     metrics_proto.set_whichplayer(whichPlayer.c_str());
65*ec779b8eSAndroid Build Coastguard Worker 
66*ec779b8eSAndroid Build Coastguard Worker     std::string video_mime;
67*ec779b8eSAndroid Build Coastguard Worker     if (item->getString("android.media.mediaplayer.video.mime", &video_mime)) {
68*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_video_mime(video_mime);
69*ec779b8eSAndroid Build Coastguard Worker     }
70*ec779b8eSAndroid Build Coastguard Worker     std::string video_codec;
71*ec779b8eSAndroid Build Coastguard Worker     if (item->getString("android.media.mediaplayer.video.codec", &video_codec)) {
72*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_video_codec(video_codec);
73*ec779b8eSAndroid Build Coastguard Worker     }
74*ec779b8eSAndroid Build Coastguard Worker 
75*ec779b8eSAndroid Build Coastguard Worker     int32_t width = -1;
76*ec779b8eSAndroid Build Coastguard Worker     if (item->getInt32("android.media.mediaplayer.width", &width)) {
77*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_width(width);
78*ec779b8eSAndroid Build Coastguard Worker     }
79*ec779b8eSAndroid Build Coastguard Worker     int32_t height = -1;
80*ec779b8eSAndroid Build Coastguard Worker     if (item->getInt32("android.media.mediaplayer.height", &height)) {
81*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_height(height);
82*ec779b8eSAndroid Build Coastguard Worker     }
83*ec779b8eSAndroid Build Coastguard Worker 
84*ec779b8eSAndroid Build Coastguard Worker     int64_t frames = -1;
85*ec779b8eSAndroid Build Coastguard Worker     if (item->getInt64("android.media.mediaplayer.frames", &frames)) {
86*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_frames(frames);
87*ec779b8eSAndroid Build Coastguard Worker     }
88*ec779b8eSAndroid Build Coastguard Worker     int64_t frames_dropped = -1;
89*ec779b8eSAndroid Build Coastguard Worker     if (item->getInt64("android.media.mediaplayer.dropped", &frames_dropped)) {
90*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_frames_dropped(frames_dropped);
91*ec779b8eSAndroid Build Coastguard Worker     }
92*ec779b8eSAndroid Build Coastguard Worker     int64_t frames_dropped_startup = -1;
93*ec779b8eSAndroid Build Coastguard Worker     if (item->getInt64("android.media.mediaplayer.startupdropped", &frames_dropped_startup)) {
94*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_frames_dropped_startup(frames_dropped_startup);
95*ec779b8eSAndroid Build Coastguard Worker     }
96*ec779b8eSAndroid Build Coastguard Worker     double framerate = -1.0;
97*ec779b8eSAndroid Build Coastguard Worker     if (item->getDouble("android.media.mediaplayer.fps", &framerate)) {
98*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_framerate(framerate);
99*ec779b8eSAndroid Build Coastguard Worker     }
100*ec779b8eSAndroid Build Coastguard Worker 
101*ec779b8eSAndroid Build Coastguard Worker     std::string audio_mime;
102*ec779b8eSAndroid Build Coastguard Worker     if (item->getString("android.media.mediaplayer.audio.mime", &audio_mime)) {
103*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_audio_mime(audio_mime);
104*ec779b8eSAndroid Build Coastguard Worker     }
105*ec779b8eSAndroid Build Coastguard Worker     std::string audio_codec;
106*ec779b8eSAndroid Build Coastguard Worker     if (item->getString("android.media.mediaplayer.audio.codec", &audio_codec)) {
107*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_audio_codec(audio_codec);
108*ec779b8eSAndroid Build Coastguard Worker     }
109*ec779b8eSAndroid Build Coastguard Worker 
110*ec779b8eSAndroid Build Coastguard Worker     int64_t duration_millis = -1;
111*ec779b8eSAndroid Build Coastguard Worker     if (item->getInt64("android.media.mediaplayer.durationMs", &duration_millis)) {
112*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_duration_millis(duration_millis);
113*ec779b8eSAndroid Build Coastguard Worker     }
114*ec779b8eSAndroid Build Coastguard Worker     int64_t playing_millis = -1;
115*ec779b8eSAndroid Build Coastguard Worker     if (item->getInt64("android.media.mediaplayer.playingMs", &playing_millis)) {
116*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_playing_millis(playing_millis);
117*ec779b8eSAndroid Build Coastguard Worker     }
118*ec779b8eSAndroid Build Coastguard Worker 
119*ec779b8eSAndroid Build Coastguard Worker     int32_t error = -1;
120*ec779b8eSAndroid Build Coastguard Worker     if (item->getInt32("android.media.mediaplayer.err", &error)) {
121*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_error(error);
122*ec779b8eSAndroid Build Coastguard Worker     }
123*ec779b8eSAndroid Build Coastguard Worker     int32_t error_code = -1;
124*ec779b8eSAndroid Build Coastguard Worker     if (item->getInt32("android.media.mediaplayer.errcode", &error_code)) {
125*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_error_code(error_code);
126*ec779b8eSAndroid Build Coastguard Worker     }
127*ec779b8eSAndroid Build Coastguard Worker     std::string error_state;
128*ec779b8eSAndroid Build Coastguard Worker     if (item->getString("android.media.mediaplayer.errstate", &error_state)) {
129*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_error_state(error_state);
130*ec779b8eSAndroid Build Coastguard Worker     }
131*ec779b8eSAndroid Build Coastguard Worker 
132*ec779b8eSAndroid Build Coastguard Worker     std::string data_source_type;
133*ec779b8eSAndroid Build Coastguard Worker     if (item->getString("android.media.mediaplayer.dataSource", &data_source_type)) {
134*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_data_source_type(data_source_type);
135*ec779b8eSAndroid Build Coastguard Worker     }
136*ec779b8eSAndroid Build Coastguard Worker 
137*ec779b8eSAndroid Build Coastguard Worker     int64_t rebuffering_millis = -1;
138*ec779b8eSAndroid Build Coastguard Worker     if (item->getInt64("android.media.mediaplayer.rebufferingMs", &rebuffering_millis)) {
139*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_rebuffering_millis(rebuffering_millis);
140*ec779b8eSAndroid Build Coastguard Worker     }
141*ec779b8eSAndroid Build Coastguard Worker     int32_t rebuffers = -1;
142*ec779b8eSAndroid Build Coastguard Worker     if (item->getInt32("android.media.mediaplayer.rebuffers", &rebuffers)) {
143*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_rebuffers(rebuffers);
144*ec779b8eSAndroid Build Coastguard Worker     }
145*ec779b8eSAndroid Build Coastguard Worker     int32_t rebuffer_at_exit = -1;
146*ec779b8eSAndroid Build Coastguard Worker     if (item->getInt32("android.media.mediaplayer.rebufferExit", &rebuffer_at_exit)) {
147*ec779b8eSAndroid Build Coastguard Worker         metrics_proto.set_rebuffer_at_exit(rebuffer_at_exit);
148*ec779b8eSAndroid Build Coastguard Worker     }
149*ec779b8eSAndroid Build Coastguard Worker 
150*ec779b8eSAndroid Build Coastguard Worker     std::string serialized;
151*ec779b8eSAndroid Build Coastguard Worker     if (!metrics_proto.SerializeToString(&serialized)) {
152*ec779b8eSAndroid Build Coastguard Worker         ALOGE("Failed to serialize nuplayer metrics");
153*ec779b8eSAndroid Build Coastguard Worker         return false;
154*ec779b8eSAndroid Build Coastguard Worker     }
155*ec779b8eSAndroid Build Coastguard Worker 
156*ec779b8eSAndroid Build Coastguard Worker     const stats::media_metrics::BytesField bf_serialized( serialized.c_str(), serialized.size());
157*ec779b8eSAndroid Build Coastguard Worker     const int result = stats::media_metrics::stats_write(
158*ec779b8eSAndroid Build Coastguard Worker         stats::media_metrics::MEDIAMETRICS_NUPLAYER_REPORTED,
159*ec779b8eSAndroid Build Coastguard Worker         timestamp_nanos, package_name.c_str(), package_version_code,
160*ec779b8eSAndroid Build Coastguard Worker         media_apex_version,
161*ec779b8eSAndroid Build Coastguard Worker         bf_serialized);
162*ec779b8eSAndroid Build Coastguard Worker 
163*ec779b8eSAndroid Build Coastguard Worker     std::stringstream log;
164*ec779b8eSAndroid Build Coastguard Worker     log << "result:" << result << " {"
165*ec779b8eSAndroid Build Coastguard Worker             << " mediametrics_nuplayer_reported:"
166*ec779b8eSAndroid Build Coastguard Worker             << stats::media_metrics::MEDIAMETRICS_NUPLAYER_REPORTED
167*ec779b8eSAndroid Build Coastguard Worker             << " timestamp_nanos:" << timestamp_nanos
168*ec779b8eSAndroid Build Coastguard Worker             << " package_name:" << package_name
169*ec779b8eSAndroid Build Coastguard Worker             << " package_version_code:" << package_version_code
170*ec779b8eSAndroid Build Coastguard Worker             << " media_apex_version:" << media_apex_version
171*ec779b8eSAndroid Build Coastguard Worker 
172*ec779b8eSAndroid Build Coastguard Worker             << " whichPlayer:" << whichPlayer
173*ec779b8eSAndroid Build Coastguard Worker             << " video_mime:" << video_mime
174*ec779b8eSAndroid Build Coastguard Worker             << " video_codec:" << video_codec
175*ec779b8eSAndroid Build Coastguard Worker             << " width:" << width
176*ec779b8eSAndroid Build Coastguard Worker             << " height:" << height
177*ec779b8eSAndroid Build Coastguard Worker             << " frames:" << frames
178*ec779b8eSAndroid Build Coastguard Worker             << " frames_dropped:" << frames_dropped
179*ec779b8eSAndroid Build Coastguard Worker             << " framerate:" << framerate
180*ec779b8eSAndroid Build Coastguard Worker             << " audio_mime:" << audio_mime
181*ec779b8eSAndroid Build Coastguard Worker             << " audio_codec:" << media_apex_version
182*ec779b8eSAndroid Build Coastguard Worker 
183*ec779b8eSAndroid Build Coastguard Worker             << " duration_millis:" << duration_millis
184*ec779b8eSAndroid Build Coastguard Worker             << " playing_millis:" << playing_millis
185*ec779b8eSAndroid Build Coastguard Worker             << " error:" << error
186*ec779b8eSAndroid Build Coastguard Worker             << " error_code:" << error_code
187*ec779b8eSAndroid Build Coastguard Worker             << " error_state:" << error_state
188*ec779b8eSAndroid Build Coastguard Worker             << " data_source_type:" << data_source_type
189*ec779b8eSAndroid Build Coastguard Worker             << " rebuffering_millis:" << rebuffering_millis
190*ec779b8eSAndroid Build Coastguard Worker             << " rebuffers:" << rebuffers
191*ec779b8eSAndroid Build Coastguard Worker             << " rebuffer_at_exit:" << rebuffer_at_exit
192*ec779b8eSAndroid Build Coastguard Worker             << " frames_dropped_startup:" << frames_dropped_startup
193*ec779b8eSAndroid Build Coastguard Worker 
194*ec779b8eSAndroid Build Coastguard Worker             // TODO NuPlayer - add log_session_id
195*ec779b8eSAndroid Build Coastguard Worker             // << " log_session_id:" << log_session_id
196*ec779b8eSAndroid Build Coastguard Worker             << " }";
197*ec779b8eSAndroid Build Coastguard Worker     statsdLog->log(stats::media_metrics::MEDIAMETRICS_NUPLAYER_REPORTED, log.str());
198*ec779b8eSAndroid Build Coastguard Worker     return true;
199*ec779b8eSAndroid Build Coastguard Worker }
200*ec779b8eSAndroid Build Coastguard Worker 
201*ec779b8eSAndroid Build Coastguard Worker } // namespace android
202