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
28namespace 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 */
35class 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