Home | History | Annotate | Download | only in mediaanalytics
      1 /*
      2  * Copyright (C) 2019 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_NDEBUG 0
     18 #define LOG_TAG "statsd_extractor"
     19 #include <utils/Log.h>
     20 
     21 #include <dirent.h>
     22 #include <inttypes.h>
     23 #include <pthread.h>
     24 #include <pwd.h>
     25 #include <stdint.h>
     26 #include <string.h>
     27 #include <sys/stat.h>
     28 #include <sys/time.h>
     29 #include <sys/types.h>
     30 #include <unistd.h>
     31 
     32 #include <statslog.h>
     33 
     34 #include "MediaAnalyticsService.h"
     35 #include "frameworks/base/core/proto/android/stats/mediametrics/mediametrics.pb.h"
     36 #include "iface_statsd.h"
     37 
     38 namespace android {
     39 
     40 bool statsd_extractor(MediaAnalyticsItem *item)
     41 {
     42     if (item == NULL) return false;
     43 
     44     // these go into the statsd wrapper
     45     nsecs_t timestamp = item->getTimestamp();
     46     std::string pkgName = item->getPkgName();
     47     int64_t pkgVersionCode = item->getPkgVersionCode();
     48     int64_t mediaApexVersion = 0;
     49 
     50 
     51     // the rest into our own proto
     52     //
     53     ::android::stats::mediametrics::ExtractorData metrics_proto;
     54 
     55     // flesh out the protobuf we'll hand off with our data
     56     //
     57 
     58     // android.media.mediaextractor.fmt         string
     59     char *fmt = NULL;
     60     if (item->getCString("android.media.mediaextractor.fmt", &fmt)) {
     61         metrics_proto.set_format(fmt);
     62     }
     63     // android.media.mediaextractor.mime        string
     64     char *mime = NULL;
     65     if (item->getCString("android.media.mediaextractor.mime", &mime)) {
     66         metrics_proto.set_mime(mime);
     67     }
     68     // android.media.mediaextractor.ntrk        int32
     69     int32_t ntrk = -1;
     70     if (item->getInt32("android.media.mediaextractor.ntrk", &ntrk)) {
     71         metrics_proto.set_tracks(ntrk);
     72     }
     73 
     74     std::string serialized;
     75     if (!metrics_proto.SerializeToString(&serialized)) {
     76         ALOGE("Failed to serialize extractor metrics");
     77         return false;
     78     }
     79 
     80     if (enabled_statsd) {
     81         android::util::BytesField bf_serialized( serialized.c_str(), serialized.size());
     82         (void)android::util::stats_write(android::util::MEDIAMETRICS_EXTRACTOR_REPORTED,
     83                                    timestamp, pkgName.c_str(), pkgVersionCode,
     84                                    mediaApexVersion,
     85                                    bf_serialized);
     86 
     87     } else {
     88         ALOGV("NOT sending: private data (len=%zu)", strlen(serialized.c_str()));
     89     }
     90 
     91     // must free the strings that we were given
     92     free(fmt);
     93     free(mime);
     94 
     95     return true;
     96 }
     97 
     98 };
     99