1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2018 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_TAG "MediaMetrics"
18*ec779b8eSAndroid Build Coastguard Worker
19*ec779b8eSAndroid Build Coastguard Worker #include <inttypes.h>
20*ec779b8eSAndroid Build Coastguard Worker #include <stdlib.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <string.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h>
23*ec779b8eSAndroid Build Coastguard Worker
24*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaMetricsItem.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaMetrics.h>
26*ec779b8eSAndroid Build Coastguard Worker
27*ec779b8eSAndroid Build Coastguard Worker //
28*ec779b8eSAndroid Build Coastguard Worker // provide a C-ish interface that is easier to stabilize than the existing C++
29*ec779b8eSAndroid Build Coastguard Worker // interface
30*ec779b8eSAndroid Build Coastguard Worker //
31*ec779b8eSAndroid Build Coastguard Worker // ALL functions returning a char * give responsibility for the allocated buffer
32*ec779b8eSAndroid Build Coastguard Worker // to the caller. The caller is responsible to call free() on that pointer.
33*ec779b8eSAndroid Build Coastguard Worker //
34*ec779b8eSAndroid Build Coastguard Worker //
35*ec779b8eSAndroid Build Coastguard Worker
36*ec779b8eSAndroid Build Coastguard Worker using namespace android::mediametrics;
37*ec779b8eSAndroid Build Coastguard Worker
38*ec779b8eSAndroid Build Coastguard Worker // manage the overall record
mediametrics_create(mediametricskey_t key)39*ec779b8eSAndroid Build Coastguard Worker mediametrics_handle_t mediametrics_create(mediametricskey_t key) {
40*ec779b8eSAndroid Build Coastguard Worker Item *item = Item::create(key);
41*ec779b8eSAndroid Build Coastguard Worker return (mediametrics_handle_t) item;
42*ec779b8eSAndroid Build Coastguard Worker }
43*ec779b8eSAndroid Build Coastguard Worker
mediametrics_delete(mediametrics_handle_t handle)44*ec779b8eSAndroid Build Coastguard Worker void mediametrics_delete(mediametrics_handle_t handle) {
45*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
46*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return;
47*ec779b8eSAndroid Build Coastguard Worker delete item;
48*ec779b8eSAndroid Build Coastguard Worker }
49*ec779b8eSAndroid Build Coastguard Worker
mediametrics_getKey(mediametrics_handle_t handle)50*ec779b8eSAndroid Build Coastguard Worker mediametricskey_t mediametrics_getKey(mediametrics_handle_t handle) {
51*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
52*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return NULL;
53*ec779b8eSAndroid Build Coastguard Worker return strdup(item->getKey().c_str());
54*ec779b8eSAndroid Build Coastguard Worker }
55*ec779b8eSAndroid Build Coastguard Worker
56*ec779b8eSAndroid Build Coastguard Worker // nuplayer, et al use it when acting as proxies
mediametrics_setUid(mediametrics_handle_t handle,uid_t uid)57*ec779b8eSAndroid Build Coastguard Worker void mediametrics_setUid(mediametrics_handle_t handle, uid_t uid) {
58*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
59*ec779b8eSAndroid Build Coastguard Worker if (item != NULL) item->setUid(uid);
60*ec779b8eSAndroid Build Coastguard Worker }
61*ec779b8eSAndroid Build Coastguard Worker
62*ec779b8eSAndroid Build Coastguard Worker // set attributes
63*ec779b8eSAndroid Build Coastguard Worker //
64*ec779b8eSAndroid Build Coastguard Worker
mediametrics_setInt32(mediametrics_handle_t handle,attr_t attr,int32_t value)65*ec779b8eSAndroid Build Coastguard Worker void mediametrics_setInt32(mediametrics_handle_t handle, attr_t attr,
66*ec779b8eSAndroid Build Coastguard Worker int32_t value) {
67*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
68*ec779b8eSAndroid Build Coastguard Worker if (item != NULL) item->setInt32(attr, value);
69*ec779b8eSAndroid Build Coastguard Worker }
70*ec779b8eSAndroid Build Coastguard Worker
mediametrics_setInt64(mediametrics_handle_t handle,attr_t attr,int64_t value)71*ec779b8eSAndroid Build Coastguard Worker void mediametrics_setInt64(mediametrics_handle_t handle, attr_t attr,
72*ec779b8eSAndroid Build Coastguard Worker int64_t value) {
73*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
74*ec779b8eSAndroid Build Coastguard Worker if (item != NULL) item->setInt64(attr, value);
75*ec779b8eSAndroid Build Coastguard Worker }
76*ec779b8eSAndroid Build Coastguard Worker
mediametrics_setDouble(mediametrics_handle_t handle,attr_t attr,double value)77*ec779b8eSAndroid Build Coastguard Worker void mediametrics_setDouble(mediametrics_handle_t handle, attr_t attr,
78*ec779b8eSAndroid Build Coastguard Worker double value) {
79*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
80*ec779b8eSAndroid Build Coastguard Worker if (item != NULL) item->setDouble(attr, value);
81*ec779b8eSAndroid Build Coastguard Worker }
82*ec779b8eSAndroid Build Coastguard Worker
mediametrics_setRate(mediametrics_handle_t handle,attr_t attr,int64_t count,int64_t duration)83*ec779b8eSAndroid Build Coastguard Worker void mediametrics_setRate(mediametrics_handle_t handle, attr_t attr,
84*ec779b8eSAndroid Build Coastguard Worker int64_t count, int64_t duration) {
85*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
86*ec779b8eSAndroid Build Coastguard Worker if (item != NULL) item->setRate(attr, count, duration);
87*ec779b8eSAndroid Build Coastguard Worker }
88*ec779b8eSAndroid Build Coastguard Worker
mediametrics_setString(mediametrics_handle_t handle,attr_t attr,const std::string & string)89*ec779b8eSAndroid Build Coastguard Worker void mediametrics_setString(mediametrics_handle_t handle, attr_t attr,
90*ec779b8eSAndroid Build Coastguard Worker const std::string &string) {
91*ec779b8eSAndroid Build Coastguard Worker mediametrics_setCString(handle, attr, string.c_str());
92*ec779b8eSAndroid Build Coastguard Worker }
93*ec779b8eSAndroid Build Coastguard Worker
mediametrics_setCString(mediametrics_handle_t handle,attr_t attr,const char * value)94*ec779b8eSAndroid Build Coastguard Worker void mediametrics_setCString(mediametrics_handle_t handle, attr_t attr,
95*ec779b8eSAndroid Build Coastguard Worker const char *value) {
96*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
97*ec779b8eSAndroid Build Coastguard Worker if (item != NULL) item->setCString(attr, value);
98*ec779b8eSAndroid Build Coastguard Worker }
99*ec779b8eSAndroid Build Coastguard Worker
100*ec779b8eSAndroid Build Coastguard Worker // fused get/add/set; if attr wasn't there, it's a simple set.
101*ec779b8eSAndroid Build Coastguard Worker //
102*ec779b8eSAndroid Build Coastguard Worker
mediametrics_addInt32(mediametrics_handle_t handle,attr_t attr,int32_t value)103*ec779b8eSAndroid Build Coastguard Worker void mediametrics_addInt32(mediametrics_handle_t handle, attr_t attr,
104*ec779b8eSAndroid Build Coastguard Worker int32_t value) {
105*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
106*ec779b8eSAndroid Build Coastguard Worker if (item != NULL) item->addInt32(attr, value);
107*ec779b8eSAndroid Build Coastguard Worker }
108*ec779b8eSAndroid Build Coastguard Worker
mediametrics_addInt64(mediametrics_handle_t handle,attr_t attr,int64_t value)109*ec779b8eSAndroid Build Coastguard Worker void mediametrics_addInt64(mediametrics_handle_t handle, attr_t attr,
110*ec779b8eSAndroid Build Coastguard Worker int64_t value) {
111*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
112*ec779b8eSAndroid Build Coastguard Worker if (item != NULL) item->addInt64(attr, value);
113*ec779b8eSAndroid Build Coastguard Worker }
114*ec779b8eSAndroid Build Coastguard Worker
mediametrics_addDouble(mediametrics_handle_t handle,attr_t attr,double value)115*ec779b8eSAndroid Build Coastguard Worker void mediametrics_addDouble(mediametrics_handle_t handle, attr_t attr,
116*ec779b8eSAndroid Build Coastguard Worker double value) {
117*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
118*ec779b8eSAndroid Build Coastguard Worker if (item != NULL) item->addDouble(attr, value);
119*ec779b8eSAndroid Build Coastguard Worker }
120*ec779b8eSAndroid Build Coastguard Worker
mediametrics_addRate(mediametrics_handle_t handle,attr_t attr,int64_t count,int64_t duration)121*ec779b8eSAndroid Build Coastguard Worker void mediametrics_addRate(mediametrics_handle_t handle, attr_t attr,
122*ec779b8eSAndroid Build Coastguard Worker int64_t count, int64_t duration) {
123*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
124*ec779b8eSAndroid Build Coastguard Worker if (item != NULL) item->addRate(attr, count, duration);
125*ec779b8eSAndroid Build Coastguard Worker }
126*ec779b8eSAndroid Build Coastguard Worker
127*ec779b8eSAndroid Build Coastguard Worker // find & extract values
128*ec779b8eSAndroid Build Coastguard Worker // return indicates whether attr exists (and thus whether value filled in)
129*ec779b8eSAndroid Build Coastguard Worker // NULL parameter value suppresses storage of value.
130*ec779b8eSAndroid Build Coastguard Worker //
131*ec779b8eSAndroid Build Coastguard Worker
mediametrics_getInt32(mediametrics_handle_t handle,attr_t attr,int32_t * value)132*ec779b8eSAndroid Build Coastguard Worker bool mediametrics_getInt32(mediametrics_handle_t handle, attr_t attr,
133*ec779b8eSAndroid Build Coastguard Worker int32_t * value) {
134*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
135*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return false;
136*ec779b8eSAndroid Build Coastguard Worker return item->getInt32(attr, value);
137*ec779b8eSAndroid Build Coastguard Worker }
138*ec779b8eSAndroid Build Coastguard Worker
mediametrics_getInt64(mediametrics_handle_t handle,attr_t attr,int64_t * value)139*ec779b8eSAndroid Build Coastguard Worker bool mediametrics_getInt64(mediametrics_handle_t handle, attr_t attr,
140*ec779b8eSAndroid Build Coastguard Worker int64_t * value) {
141*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
142*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return false;
143*ec779b8eSAndroid Build Coastguard Worker return item->getInt64(attr, value);
144*ec779b8eSAndroid Build Coastguard Worker }
145*ec779b8eSAndroid Build Coastguard Worker
mediametrics_getDouble(mediametrics_handle_t handle,attr_t attr,double * value)146*ec779b8eSAndroid Build Coastguard Worker bool mediametrics_getDouble(mediametrics_handle_t handle, attr_t attr,
147*ec779b8eSAndroid Build Coastguard Worker double *value) {
148*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
149*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return false;
150*ec779b8eSAndroid Build Coastguard Worker return item->getDouble(attr, value);
151*ec779b8eSAndroid Build Coastguard Worker }
152*ec779b8eSAndroid Build Coastguard Worker
mediametrics_getRate(mediametrics_handle_t handle,attr_t attr,int64_t * count,int64_t * duration,double * rate)153*ec779b8eSAndroid Build Coastguard Worker bool mediametrics_getRate(mediametrics_handle_t handle, attr_t attr,
154*ec779b8eSAndroid Build Coastguard Worker int64_t * count, int64_t * duration, double *rate) {
155*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
156*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return false;
157*ec779b8eSAndroid Build Coastguard Worker return item->getRate(attr, count, duration, rate);
158*ec779b8eSAndroid Build Coastguard Worker }
159*ec779b8eSAndroid Build Coastguard Worker
mediametrics_getString(mediametrics_handle_t handle,attr_t attr,std::string * string)160*ec779b8eSAndroid Build Coastguard Worker bool mediametrics_getString(mediametrics_handle_t handle, attr_t attr,
161*ec779b8eSAndroid Build Coastguard Worker std::string *string) {
162*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
163*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return false;
164*ec779b8eSAndroid Build Coastguard Worker
165*ec779b8eSAndroid Build Coastguard Worker return item->getString(attr, string);
166*ec779b8eSAndroid Build Coastguard Worker }
167*ec779b8eSAndroid Build Coastguard Worker
168*ec779b8eSAndroid Build Coastguard Worker // NB: caller owns the string that comes back, is responsible for freeing it
mediametrics_getCString(mediametrics_handle_t handle,attr_t attr,char ** value)169*ec779b8eSAndroid Build Coastguard Worker bool mediametrics_getCString(mediametrics_handle_t handle, attr_t attr,
170*ec779b8eSAndroid Build Coastguard Worker char **value) {
171*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
172*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return false;
173*ec779b8eSAndroid Build Coastguard Worker
174*ec779b8eSAndroid Build Coastguard Worker return item->getCString(attr, value);
175*ec779b8eSAndroid Build Coastguard Worker }
176*ec779b8eSAndroid Build Coastguard Worker
177*ec779b8eSAndroid Build Coastguard Worker // to release strings returned via getCString()
mediametrics_freeCString(char * value)178*ec779b8eSAndroid Build Coastguard Worker void mediametrics_freeCString(char *value) {
179*ec779b8eSAndroid Build Coastguard Worker free(value);
180*ec779b8eSAndroid Build Coastguard Worker }
181*ec779b8eSAndroid Build Coastguard Worker
mediametrics_selfRecord(mediametrics_handle_t handle)182*ec779b8eSAndroid Build Coastguard Worker bool mediametrics_selfRecord(mediametrics_handle_t handle) {
183*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
184*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return false;
185*ec779b8eSAndroid Build Coastguard Worker return item->selfrecord();
186*ec779b8eSAndroid Build Coastguard Worker }
187*ec779b8eSAndroid Build Coastguard Worker
mediametrics_dup(mediametrics_handle_t handle)188*ec779b8eSAndroid Build Coastguard Worker mediametrics_handle_t mediametrics_dup(mediametrics_handle_t handle) {
189*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
190*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return Item::convert(item);
191*ec779b8eSAndroid Build Coastguard Worker return Item::convert(item->dup());
192*ec779b8eSAndroid Build Coastguard Worker }
193*ec779b8eSAndroid Build Coastguard Worker
mediametrics_readable(mediametrics_handle_t handle)194*ec779b8eSAndroid Build Coastguard Worker const char *mediametrics_readable(mediametrics_handle_t handle) {
195*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
196*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return "";
197*ec779b8eSAndroid Build Coastguard Worker return item->toCString();
198*ec779b8eSAndroid Build Coastguard Worker }
199*ec779b8eSAndroid Build Coastguard Worker
mediametrics_count(mediametrics_handle_t handle)200*ec779b8eSAndroid Build Coastguard Worker int32_t mediametrics_count(mediametrics_handle_t handle) {
201*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
202*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return 0;
203*ec779b8eSAndroid Build Coastguard Worker return item->count();
204*ec779b8eSAndroid Build Coastguard Worker }
205*ec779b8eSAndroid Build Coastguard Worker
mediametrics_isEnabled()206*ec779b8eSAndroid Build Coastguard Worker bool mediametrics_isEnabled() {
207*ec779b8eSAndroid Build Coastguard Worker // static, so doesn't need an instance
208*ec779b8eSAndroid Build Coastguard Worker return Item::isEnabled();
209*ec779b8eSAndroid Build Coastguard Worker }
210*ec779b8eSAndroid Build Coastguard Worker
mediametrics_getAttributes(mediametrics_handle_t handle,char ** buffer,size_t * length)211*ec779b8eSAndroid Build Coastguard Worker bool mediametrics_getAttributes(mediametrics_handle_t handle, char **buffer, size_t *length) {
212*ec779b8eSAndroid Build Coastguard Worker Item *item = (Item *) handle;
213*ec779b8eSAndroid Build Coastguard Worker if (item == NULL) return false;
214*ec779b8eSAndroid Build Coastguard Worker return item->writeToByteString(buffer, length) == android::NO_ERROR;
215*ec779b8eSAndroid Build Coastguard Worker
216*ec779b8eSAndroid Build Coastguard Worker }
217