• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_setString(mediametrics_handle_t handle,attr_t attr,const std::string & string)89 void mediametrics_setString(mediametrics_handle_t handle, attr_t attr,
90                             const std::string &string) {
91     mediametrics_setCString(handle, attr, string.c_str());
92 }
93 
mediametrics_setCString(mediametrics_handle_t handle,attr_t attr,const char * value)94 void mediametrics_setCString(mediametrics_handle_t handle, attr_t attr,
95                                  const char *value) {
96     Item *item = (Item *) handle;
97     if (item != NULL) item->setCString(attr, value);
98 }
99 
100 // fused get/add/set; if attr wasn't there, it's a simple set.
101 //
102 
mediametrics_addInt32(mediametrics_handle_t handle,attr_t attr,int32_t value)103 void mediametrics_addInt32(mediametrics_handle_t handle, attr_t attr,
104                                 int32_t value) {
105     Item *item = (Item *) handle;
106     if (item != NULL) item->addInt32(attr, value);
107 }
108 
mediametrics_addInt64(mediametrics_handle_t handle,attr_t attr,int64_t value)109 void mediametrics_addInt64(mediametrics_handle_t handle, attr_t attr,
110                                 int64_t value) {
111     Item *item = (Item *) handle;
112     if (item != NULL) item->addInt64(attr, value);
113 }
114 
mediametrics_addDouble(mediametrics_handle_t handle,attr_t attr,double value)115 void mediametrics_addDouble(mediametrics_handle_t handle, attr_t attr,
116                                  double value) {
117     Item *item = (Item *) handle;
118     if (item != NULL) item->addDouble(attr, value);
119 }
120 
mediametrics_addRate(mediametrics_handle_t handle,attr_t attr,int64_t count,int64_t duration)121 void mediametrics_addRate(mediametrics_handle_t handle, attr_t attr,
122                                int64_t count, int64_t duration) {
123     Item *item = (Item *) handle;
124     if (item != NULL) item->addRate(attr, count, duration);
125 }
126 
127 // find & extract values
128 // return indicates whether attr exists (and thus whether value filled in)
129 // NULL parameter value suppresses storage of value.
130 //
131 
mediametrics_getInt32(mediametrics_handle_t handle,attr_t attr,int32_t * value)132 bool mediametrics_getInt32(mediametrics_handle_t handle, attr_t attr,
133                                 int32_t * value) {
134     Item *item = (Item *) handle;
135     if (item == NULL) return false;
136     return item->getInt32(attr, value);
137 }
138 
mediametrics_getInt64(mediametrics_handle_t handle,attr_t attr,int64_t * value)139 bool mediametrics_getInt64(mediametrics_handle_t handle, attr_t attr,
140                                 int64_t * value) {
141     Item *item = (Item *) handle;
142     if (item == NULL) return false;
143     return item->getInt64(attr, value);
144 }
145 
mediametrics_getDouble(mediametrics_handle_t handle,attr_t attr,double * value)146 bool mediametrics_getDouble(mediametrics_handle_t handle, attr_t attr,
147                                  double *value) {
148     Item *item = (Item *) handle;
149     if (item == NULL) return false;
150     return item->getDouble(attr, value);
151 }
152 
mediametrics_getRate(mediametrics_handle_t handle,attr_t attr,int64_t * count,int64_t * duration,double * rate)153 bool mediametrics_getRate(mediametrics_handle_t handle, attr_t attr,
154                                int64_t * count, int64_t * duration, double *rate) {
155     Item *item = (Item *) handle;
156     if (item == NULL) return false;
157     return item->getRate(attr, count, duration, rate);
158 }
159 
mediametrics_getString(mediametrics_handle_t handle,attr_t attr,std::string * string)160 bool mediametrics_getString(mediametrics_handle_t handle, attr_t attr,
161                                  std::string *string) {
162     Item *item = (Item *) handle;
163     if (item == NULL) return false;
164 
165     return item->getString(attr, string);
166 }
167 
168 // 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 bool mediametrics_getCString(mediametrics_handle_t handle, attr_t attr,
170                                  char **value) {
171     Item *item = (Item *) handle;
172     if (item == NULL) return false;
173 
174     return item->getCString(attr, value);
175 }
176 
177 // to release strings returned via getCString()
mediametrics_freeCString(char * value)178 void mediametrics_freeCString(char *value) {
179     free(value);
180 }
181 
mediametrics_selfRecord(mediametrics_handle_t handle)182 bool mediametrics_selfRecord(mediametrics_handle_t handle) {
183     Item *item = (Item *) handle;
184     if (item == NULL) return false;
185     return item->selfrecord();
186 }
187 
mediametrics_dup(mediametrics_handle_t handle)188 mediametrics_handle_t mediametrics_dup(mediametrics_handle_t handle) {
189     Item *item = (Item *) handle;
190     if (item == NULL) return Item::convert(item);
191     return Item::convert(item->dup());
192 }
193 
mediametrics_readable(mediametrics_handle_t handle)194 const char *mediametrics_readable(mediametrics_handle_t handle) {
195     Item *item = (Item *) handle;
196     if (item == NULL) return "";
197     return item->toCString();
198 }
199 
mediametrics_count(mediametrics_handle_t handle)200 int32_t mediametrics_count(mediametrics_handle_t handle) {
201     Item *item = (Item *) handle;
202     if (item == NULL) return 0;
203     return item->count();
204 }
205 
mediametrics_isEnabled()206 bool mediametrics_isEnabled() {
207     // static, so doesn't need an instance
208     return Item::isEnabled();
209 }
210 
mediametrics_getAttributes(mediametrics_handle_t handle,char ** buffer,size_t * length)211 bool mediametrics_getAttributes(mediametrics_handle_t handle, char **buffer, size_t *length) {
212     Item *item = (Item *) handle;
213     if (item == NULL) return false;
214     return item->writeToByteString(buffer, length) == android::NO_ERROR;
215 
216 }
217