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