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