Home | History | Annotate | Download | only in media
      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 #ifndef DRM_METRICS_H_
     18 #define DRM_METRICS_H_
     19 
     20 #include <map>
     21 
     22 #include <android/hardware/drm/1.0/types.h>
     23 #include <android/hardware/drm/1.1/types.h>
     24 #include <binder/PersistableBundle.h>
     25 #include <media/CounterMetric.h>
     26 #include <media/EventMetric.h>
     27 
     28 namespace android {
     29 
     30 /**
     31  * This class contains the definition of metrics captured within MediaDrm.
     32  * It also contains a method for exporting all of the metrics to a
     33  * PersistableBundle.
     34  */
     35 class MediaDrmMetrics {
     36  public:
     37   explicit MediaDrmMetrics();
     38   virtual ~MediaDrmMetrics() {};
     39   // Count of openSession calls.
     40   CounterMetric<status_t> mOpenSessionCounter;
     41   // Count of closeSession calls.
     42   CounterMetric<status_t> mCloseSessionCounter;
     43   // Count and timing of getKeyRequest calls.
     44   EventMetric<status_t> mGetKeyRequestTimeUs;
     45   // Count and timing of provideKeyResponse calls.
     46   EventMetric<status_t> mProvideKeyResponseTimeUs;
     47   // Count of getProvisionRequest calls.
     48   CounterMetric<status_t> mGetProvisionRequestCounter;
     49   // Count of provideProvisionResponse calls.
     50   CounterMetric<status_t> mProvideProvisionResponseCounter;
     51 
     52   // Count of key status events broken out by status type.
     53   CounterMetric<::android::hardware::drm::V1_0::KeyStatusType>
     54       mKeyStatusChangeCounter;
     55   // Count of events broken out by event type
     56   CounterMetric<::android::hardware::drm::V1_0::EventType> mEventCounter;
     57 
     58   // Count getPropertyByteArray calls to retrieve the device unique id.
     59   CounterMetric<status_t> mGetDeviceUniqueIdCounter;
     60 
     61   // Adds a session start time record.
     62   void SetSessionStart(const Vector<uint8_t>& sessionId);
     63 
     64   // Adds a session end time record.
     65   void SetSessionEnd(const Vector<uint8_t>& sessionId);
     66 
     67   // The app package name is the application package name that is using the
     68   // instance. The app package name is held here for convenience. It is not
     69   // serialized or exported with the metrics.
     70   void SetAppPackageName(const String8& appPackageName) { mAppPackageName = appPackageName; }
     71   const String8& GetAppPackageName() { return mAppPackageName; }
     72 
     73   // Export the metrics to a PersistableBundle.
     74   void Export(os::PersistableBundle* metricsBundle);
     75 
     76   // Get the serialized metrics. Metrics are formatted as a serialized
     77   // DrmFrameworkMetrics proto. If there is a failure serializing the metrics,
     78   // this returns an error. The parameter |serlializedMetrics| is owned by the
     79   // caller and must not be null.
     80   status_t GetSerializedMetrics(std::string* serializedMetrics);
     81 
     82   // Converts the DRM plugin metrics to a PersistableBundle. All of the metrics
     83   // found in |pluginMetrics| are added to the |metricsBundle| parameter.
     84   // |pluginBundle| is owned by the caller and must not be null.
     85   //
     86   // Each item in the pluginMetrics vector is added as a new PersistableBundle. E.g.
     87   // DrmMetricGroup {
     88   //   metrics[0] {
     89   //     name: "buf_copy"
     90   //     attributes[0] {
     91   //       name: "size"
     92   //       type: INT64_TYPE
     93   //       int64Value: 1024
     94   //     }
     95   //     values[0] {
     96   //       componentName: "operation_count"
     97   //       type: INT64_TYPE
     98   //       int64Value: 75
     99   //     }
    100   //     values[1] {
    101   //       component_name: "average_time_seconds"
    102   //       type: DOUBLE_TYPE
    103   //       doubleValue: 0.00000042
    104   //     }
    105   //   }
    106   // }
    107   //
    108   // becomes
    109   //
    110   // metricsBundle {
    111   //   "0": (PersistableBundle) {
    112   //     "attributes" : (PersistableBundle) {
    113   //       "size" : (int64) 1024
    114   //     }
    115   //     "operation_count" : (int64) 75
    116   //     "average_time_seconds" : (double) 0.00000042
    117   //   }
    118   //
    119   static status_t HidlMetricsToBundle(
    120           const hardware::hidl_vec<hardware::drm::V1_1::DrmMetricGroup>& pluginMetrics,
    121           os::PersistableBundle* metricsBundle);
    122 
    123  protected:
    124   // This is visible for testing only.
    125   virtual int64_t GetCurrentTimeMs();
    126 
    127  private:
    128   // Session lifetimes. A pair of values representing the milliseconds since
    129   // epoch, UTC. The first value is the start time, the second is the end time.
    130   std::map<std::string, std::pair<int64_t, int64_t>> mSessionLifespans;
    131 
    132   String8 mAppPackageName;
    133 };
    134 
    135 }  // namespace android
    136 
    137 #endif  // DRM_METRICS_H_
    138