blob: 26fe3065ca9451fe2dccd04039db6e98766bf7d7 [file] [log] [blame]
Ray Essick20147322018-11-17 09:08:39 -08001/*
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
Ray Essickf27e9872019-12-07 06:28:46 -080024#include <media/MediaMetricsItem.h>
Ray Essick20147322018-11-17 09:08:39 -080025#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//
Ray Essickae88dd32019-12-17 20:14:05 -080034//
35
36using namespace android::mediametrics;
Ray Essick20147322018-11-17 09:08:39 -080037
38// manage the overall record
39mediametrics_handle_t mediametrics_create(mediametricskey_t key) {
Ray Essickae88dd32019-12-17 20:14:05 -080040 Item *item = Item::create(key);
Ray Essick20147322018-11-17 09:08:39 -080041 return (mediametrics_handle_t) item;
42}
43
44void mediametrics_delete(mediametrics_handle_t handle) {
Ray Essickae88dd32019-12-17 20:14:05 -080045 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -080046 if (item == NULL) return;
47 delete item;
48}
49
50mediametricskey_t mediametrics_getKey(mediametrics_handle_t handle) {
Ray Essickae88dd32019-12-17 20:14:05 -080051 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -080052 if (item == NULL) return NULL;
53 return strdup(item->getKey().c_str());
54}
55
56// nuplayer, et al use it when acting as proxies
57void mediametrics_setUid(mediametrics_handle_t handle, uid_t uid) {
Ray Essickae88dd32019-12-17 20:14:05 -080058 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -080059 if (item != NULL) item->setUid(uid);
60}
61
62// set attributes
63//
64
65void mediametrics_setInt32(mediametrics_handle_t handle, attr_t attr,
66 int32_t value) {
Ray Essickae88dd32019-12-17 20:14:05 -080067 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -080068 if (item != NULL) item->setInt32(attr, value);
69}
70
71void mediametrics_setInt64(mediametrics_handle_t handle, attr_t attr,
72 int64_t value) {
Ray Essickae88dd32019-12-17 20:14:05 -080073 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -080074 if (item != NULL) item->setInt64(attr, value);
75}
76
77void mediametrics_setDouble(mediametrics_handle_t handle, attr_t attr,
78 double value) {
Ray Essickae88dd32019-12-17 20:14:05 -080079 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -080080 if (item != NULL) item->setDouble(attr, value);
81}
82
83void mediametrics_setRate(mediametrics_handle_t handle, attr_t attr,
84 int64_t count, int64_t duration) {
Ray Essickae88dd32019-12-17 20:14:05 -080085 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -080086 if (item != NULL) item->setRate(attr, count, duration);
87}
88
Brian Lindahlc4e9dee2023-05-01 15:21:44 -060089void mediametrics_setString(mediametrics_handle_t handle, attr_t attr,
Brian Lindahl5c0ba412023-08-28 13:24:22 -060090 const std::string &string) {
Brian Lindahlc4e9dee2023-05-01 15:21:44 -060091 mediametrics_setCString(handle, attr, string.c_str());
92}
93
Ray Essick20147322018-11-17 09:08:39 -080094void mediametrics_setCString(mediametrics_handle_t handle, attr_t attr,
95 const char *value) {
Ray Essickae88dd32019-12-17 20:14:05 -080096 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -080097 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
103void mediametrics_addInt32(mediametrics_handle_t handle, attr_t attr,
104 int32_t value) {
Ray Essickae88dd32019-12-17 20:14:05 -0800105 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -0800106 if (item != NULL) item->addInt32(attr, value);
107}
108
109void mediametrics_addInt64(mediametrics_handle_t handle, attr_t attr,
110 int64_t value) {
Ray Essickae88dd32019-12-17 20:14:05 -0800111 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -0800112 if (item != NULL) item->addInt64(attr, value);
113}
114
115void mediametrics_addDouble(mediametrics_handle_t handle, attr_t attr,
116 double value) {
Ray Essickae88dd32019-12-17 20:14:05 -0800117 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -0800118 if (item != NULL) item->addDouble(attr, value);
119}
120
121void mediametrics_addRate(mediametrics_handle_t handle, attr_t attr,
122 int64_t count, int64_t duration) {
Ray Essickae88dd32019-12-17 20:14:05 -0800123 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -0800124 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
132bool mediametrics_getInt32(mediametrics_handle_t handle, attr_t attr,
133 int32_t * value) {
Ray Essickae88dd32019-12-17 20:14:05 -0800134 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -0800135 if (item == NULL) return false;
136 return item->getInt32(attr, value);
137}
138
139bool mediametrics_getInt64(mediametrics_handle_t handle, attr_t attr,
140 int64_t * value) {
Ray Essickae88dd32019-12-17 20:14:05 -0800141 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -0800142 if (item == NULL) return false;
143 return item->getInt64(attr, value);
144}
145
146bool mediametrics_getDouble(mediametrics_handle_t handle, attr_t attr,
147 double *value) {
Ray Essickae88dd32019-12-17 20:14:05 -0800148 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -0800149 if (item == NULL) return false;
150 return item->getDouble(attr, value);
151}
152
153bool mediametrics_getRate(mediametrics_handle_t handle, attr_t attr,
154 int64_t * count, int64_t * duration, double *rate) {
Ray Essickae88dd32019-12-17 20:14:05 -0800155 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -0800156 if (item == NULL) return false;
157 return item->getRate(attr, count, duration, rate);
158}
159
Brian Lindahlc4e9dee2023-05-01 15:21:44 -0600160bool 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
Ray Essick20147322018-11-17 09:08:39 -0800168// NB: caller owns the string that comes back, is responsible for freeing it
169bool mediametrics_getCString(mediametrics_handle_t handle, attr_t attr,
170 char **value) {
Ray Essickae88dd32019-12-17 20:14:05 -0800171 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -0800172 if (item == NULL) return false;
173
174 return item->getCString(attr, value);
175}
176
177// to release strings returned via getCString()
178void mediametrics_freeCString(char *value) {
179 free(value);
180}
181
182bool mediametrics_selfRecord(mediametrics_handle_t handle) {
Ray Essickae88dd32019-12-17 20:14:05 -0800183 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -0800184 if (item == NULL) return false;
185 return item->selfrecord();
186}
187
Ray Essickbf536ac2019-08-26 11:04:28 -0700188mediametrics_handle_t mediametrics_dup(mediametrics_handle_t handle) {
Ray Essickae88dd32019-12-17 20:14:05 -0800189 Item *item = (Item *) handle;
190 if (item == NULL) return Item::convert(item);
191 return Item::convert(item->dup());
Ray Essickbf536ac2019-08-26 11:04:28 -0700192}
Ray Essick20147322018-11-17 09:08:39 -0800193
194const char *mediametrics_readable(mediametrics_handle_t handle) {
Ray Essickae88dd32019-12-17 20:14:05 -0800195 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -0800196 if (item == NULL) return "";
197 return item->toCString();
198}
199
200int32_t mediametrics_count(mediametrics_handle_t handle) {
Ray Essickae88dd32019-12-17 20:14:05 -0800201 Item *item = (Item *) handle;
Ray Essick20147322018-11-17 09:08:39 -0800202 if (item == NULL) return 0;
203 return item->count();
204}
205
206bool mediametrics_isEnabled() {
207 // static, so doesn't need an instance
Ray Essickae88dd32019-12-17 20:14:05 -0800208 return Item::isEnabled();
Ray Essick20147322018-11-17 09:08:39 -0800209}
210
Ray Essickba8c4842019-01-18 11:35:33 -0800211bool mediametrics_getAttributes(mediametrics_handle_t handle, char **buffer, size_t *length) {
Ray Essickae88dd32019-12-17 20:14:05 -0800212 Item *item = (Item *) handle;
Ray Essickba8c4842019-01-18 11:35:33 -0800213 if (item == NULL) return false;
Andy Hung3253f2d2019-10-21 14:50:07 -0700214 return item->writeToByteString(buffer, length) == android::NO_ERROR;
Ray Essickba8c4842019-01-18 11:35:33 -0800215
Ray Essick20147322018-11-17 09:08:39 -0800216}