Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c5bd039 authored by Ray Essick's avatar Ray Essick Committed by Android (Google) Code Review
Browse files

Merge "C interface to MediaMetrics"

parents 3c03c8ba 20147323
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
../../media/libmediametrics/include/MediaMetrics.h
 No newline at end of file
+14 −4
Original line number Diff line number Diff line
@@ -6,15 +6,16 @@ cc_library {
    srcs: [
        "IMediaAnalyticsService.cpp",
        "MediaAnalyticsItem.cpp",
        "MediaMetrics.cpp",
    ],

    shared_libs: [
        "liblog",
        "libcutils",
        "libutils",
        "libbase",
        "libbinder",
        "libcutils",
        "liblog",
        "libstagefright_foundation",
        "libbase",
        "libutils",
    ],

    export_include_dirs: ["include"],
@@ -32,4 +33,13 @@ cc_library {
        ],
        cfi: true,
    },

    // enumerate the stable interface
// this would mean nobody can use the C++ interface. have to rework some things.
//  stubs: {
//      symbol_file: "libmediametrics.map.txt",
//      versions: [
//          "1" ,
//      ]
//  },
}
+21 −0
Original line number Diff line number Diff line
@@ -487,6 +487,18 @@ bool MediaAnalyticsItem::getCString(MediaAnalyticsItem::Attr name, char **value)
    return true;
}

bool MediaAnalyticsItem::getString(MediaAnalyticsItem::Attr name, std::string *value) {
    Prop *prop = findProp(name);
    if (prop == NULL || prop->mType != kTypeCString) {
        return false;
    }
    if (value != NULL) {
        // std::string makes a copy for us
        *value = prop->u.CStringValue;
    }
    return true;
}

// remove indicated keys and their values
// return value is # keys removed
int32_t MediaAnalyticsItem::filter(int n, MediaAnalyticsItem::Attr attrs[]) {
@@ -726,6 +738,15 @@ int32_t MediaAnalyticsItem::writeToParcel(Parcel *data) {
}


const char *MediaAnalyticsItem::toCString() {
   return toCString(PROTO_LAST);
}

const char * MediaAnalyticsItem::toCString(int version) {
    std::string val = toString(version);
    return strdup(val.c_str());
}

std::string MediaAnalyticsItem::toString() {
   return toString(PROTO_LAST);
}
+204 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "MediaMetrics"

#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#include <media/MediaAnalyticsItem.h>
#include <media/MediaMetrics.h>

//
// provide a C-ish interface that is easier to stabilize than the existing C++
// interface
//
// ALL functions returning a char * give responsibility for the allocated buffer
// to the caller. The caller is responsible to call free() on that pointer.
//

// manage the overall record
mediametrics_handle_t mediametrics_create(mediametricskey_t key) {
    android::MediaAnalyticsItem *item = new android::MediaAnalyticsItem(key);
    return (mediametrics_handle_t) item;
}

void mediametrics_delete(mediametrics_handle_t handle) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item == NULL) return;
    delete item;
}

mediametricskey_t mediametrics_getKey(mediametrics_handle_t handle) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item == NULL) return NULL;
    return strdup(item->getKey().c_str());
}

// nuplayer, et al use it when acting as proxies
void mediametrics_setUid(mediametrics_handle_t handle, uid_t uid) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item != NULL) item->setUid(uid);
}

// set attributes
//

void mediametrics_setInt32(mediametrics_handle_t handle, attr_t attr,
                                int32_t value) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item != NULL) item->setInt32(attr, value);
}

void mediametrics_setInt64(mediametrics_handle_t handle, attr_t attr,
                                int64_t value) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item != NULL) item->setInt64(attr, value);
}

void mediametrics_setDouble(mediametrics_handle_t handle, attr_t attr,
                                 double value) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item != NULL) item->setDouble(attr, value);
}

void mediametrics_setRate(mediametrics_handle_t handle, attr_t attr,
                               int64_t count, int64_t duration) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item != NULL) item->setRate(attr, count, duration);
}

void mediametrics_setCString(mediametrics_handle_t handle, attr_t attr,
                                 const char *value) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item != NULL) item->setCString(attr, value);
}

// fused get/add/set; if attr wasn't there, it's a simple set.
//

void mediametrics_addInt32(mediametrics_handle_t handle, attr_t attr,
                                int32_t value) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item != NULL) item->addInt32(attr, value);
}

void mediametrics_addInt64(mediametrics_handle_t handle, attr_t attr,
                                int64_t value) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item != NULL) item->addInt64(attr, value);
}

void mediametrics_addDouble(mediametrics_handle_t handle, attr_t attr,
                                 double value) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item != NULL) item->addDouble(attr, value);
}

void mediametrics_addRate(mediametrics_handle_t handle, attr_t attr,
                               int64_t count, int64_t duration) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item != NULL) item->addRate(attr, count, duration);
}

// find & extract values
// return indicates whether attr exists (and thus whether value filled in)
// NULL parameter value suppresses storage of value.
//

bool mediametrics_getInt32(mediametrics_handle_t handle, attr_t attr,
                                int32_t * value) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item == NULL) return false;
    return item->getInt32(attr, value);
}

bool mediametrics_getInt64(mediametrics_handle_t handle, attr_t attr,
                                int64_t * value) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item == NULL) return false;
    return item->getInt64(attr, value);
}

bool mediametrics_getDouble(mediametrics_handle_t handle, attr_t attr,
                                 double *value) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item == NULL) return false;
    return item->getDouble(attr, value);
}

bool mediametrics_getRate(mediametrics_handle_t handle, attr_t attr,
                               int64_t * count, int64_t * duration, double *rate) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item == NULL) return false;
    return item->getRate(attr, count, duration, rate);
}

// NB: caller owns the string that comes back, is responsible for freeing it
bool mediametrics_getCString(mediametrics_handle_t handle, attr_t attr,
                                 char **value) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item == NULL) return false;

    return item->getCString(attr, value);
}

// to release strings returned via getCString()
void mediametrics_freeCString(char *value) {
    free(value);
}

bool mediametrics_selfRecord(mediametrics_handle_t handle) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item == NULL) return false;
    return item->selfrecord();
}


const char *mediametrics_readable(mediametrics_handle_t handle) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item == NULL) return "";
    return item->toCString();
}

int32_t mediametrics_count(mediametrics_handle_t handle) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item == NULL) return 0;
    return item->count();
}

bool mediametrics_isEnabled() {
    // static, so doesn't need an instance
    return android::MediaAnalyticsItem::isEnabled();
}

#if 0
// do not expose this as is.
// need to revisit (or redefine) how the android::Parcel parameter is handled
// so that it meets the stable-API criteria for updateable components.
//
int32_t mediametrics_writeToParcel(mediametrics_handle_t handle, android::Parcel *parcel) {
    android::MediaAnalyticsItem *item = (android::MediaAnalyticsItem *) handle;
    if (item == NULL) {
        return -1;
    }
    return item->writeToParcel(parcel);
}
#endif

+3 −0
Original line number Diff line number Diff line
@@ -134,6 +134,7 @@ class MediaAnalyticsItem {
        bool getRate(Attr, int64_t *count, int64_t *duration, double *rate);
        // Caller owns the returned string
        bool getCString(Attr, char **value);
        bool getString(Attr, std::string *value);

        // parameter indicates whether to close any existing open
        // record with same key before establishing a new record
@@ -176,6 +177,8 @@ class MediaAnalyticsItem {

        std::string toString();
        std::string toString(int version);
        const char *toCString();
        const char *toCString(int version);

        // are we collecting analytics data
        static bool isEnabled();
Loading