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

Commit 637b7855 authored by Adam Stone's avatar Adam Stone
Browse files

Fix DrmHal implementation to return all metrics

This change in DrmHal allows us to transfer a PersistableBundle containing
previously unavailable metrics.

Bug: 64001676
Test: CTS test for metrics and GPlay test
Change-Id: I1fa87c76dd980a3f91b4e2d02b37329f6c0a88ec
parent ceeee83a
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::hidl::manager::V1_0::IServiceManager;
using ::android::os::PersistableBundle;
using ::android::sp;

namespace {
@@ -1086,7 +1087,7 @@ status_t DrmHal::setPropertyByteArray(String8 const &name,
    return toStatusT(status);
}

status_t DrmHal::getMetrics(MediaAnalyticsItem* item) {
status_t DrmHal::getMetrics(PersistableBundle* item) {
    if (item == nullptr) {
      return UNEXPECTED_NULL;
    }
+37 −32
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@

using ::android::hardware::drm::V1_0::EventType;
using ::android::hardware::drm::V1_0::KeyStatusType;
using ::android::os::PersistableBundle;

namespace {

@@ -49,9 +50,9 @@ std::string GetAttributeName<EventType>(EventType type) {

template<typename T>
void ExportCounterMetric(const android::CounterMetric<T>& counter,
                         android::MediaAnalyticsItem* item) {
  if (!item) {
    ALOGE("item was unexpectedly null.");
                         PersistableBundle* metrics) {
  if (!metrics) {
    ALOGE("metrics was unexpectedly null.");
    return;
  }
  std::string success_count_name = counter.metric_name() + ".ok.count";
@@ -59,13 +60,15 @@ void ExportCounterMetric(const android::CounterMetric<T>& counter,
  counter.ExportValues(
      [&] (const android::status_t status, const int64_t value) {
          if (status == android::OK) {
              item->setInt64(success_count_name.c_str(), value);
              metrics->putLong(android::String16(success_count_name.c_str()),
                               value);
          } else {
              int64_t total_errors(0);
              item->getInt64(error_count_name.c_str(), &total_errors);
              item->setInt64(error_count_name.c_str(), total_errors + value);
              metrics->getLong(android::String16(error_count_name.c_str()),
                               &total_errors);
              metrics->putLong(android::String16(error_count_name.c_str()),
                               total_errors + value);
              // TODO: Add support for exporting the list of error values.
              // This probably needs to be added to MediaAnalyticsItem.
          }
      });
}
@@ -73,24 +76,24 @@ void ExportCounterMetric(const android::CounterMetric<T>& counter,
template<typename T>
void ExportCounterMetricWithAttributeNames(
    const android::CounterMetric<T>& counter,
    android::MediaAnalyticsItem* item) {
  if (!item) {
    ALOGE("item was unexpectedly null.");
    PersistableBundle* metrics) {
  if (!metrics) {
    ALOGE("metrics was unexpectedly null.");
    return;
  }
  counter.ExportValues(
      [&] (const T& attribute, const int64_t value) {
          std::string name = counter.metric_name()
              + "." + GetAttributeName(attribute) + ".count";
          item->setInt64(name.c_str(), value);
          metrics->putLong(android::String16(name.c_str()), value);
      });
}

template<typename T>
void ExportEventMetric(const android::EventMetric<T>& event,
                       android::MediaAnalyticsItem* item) {
  if (!item) {
    ALOGE("item was unexpectedly null.");
                       PersistableBundle* metrics) {
  if (!metrics) {
    ALOGE("metrics was unexpectedly null.");
    return;
  }
  std::string success_count_name = event.metric_name() + ".ok.count";
@@ -100,15 +103,17 @@ void ExportEventMetric(const android::EventMetric<T>& event,
      [&] (const android::status_t& status,
           const android::EventStatistics& value) {
          if (status == android::OK) {
              item->setInt64(success_count_name.c_str(), value.count);
              item->setInt64(timing_name.c_str(), value.mean);
              metrics->putLong(android::String16(success_count_name.c_str()),
                               value.count);
              metrics->putLong(android::String16(timing_name.c_str()),
                               value.mean);
          } else {
              int64_t total_errors(0);
              item->getInt64(error_count_name.c_str(), &total_errors);
              item->setInt64(error_count_name.c_str(),
              metrics->getLong(android::String16(error_count_name.c_str()),
                               &total_errors);
              metrics->putLong(android::String16(error_count_name.c_str()),
                               total_errors + value.count);
              // TODO: Add support for exporting the list of error values.
              // This probably needs to be added to MediaAnalyticsItem.
          }
      });
}
@@ -133,20 +138,20 @@ MediaDrmMetrics::MediaDrmMetrics()
          "drm.mediadrm.get_device_unique_id", "status") {
}

void MediaDrmMetrics::Export(MediaAnalyticsItem* item) {
  if (!item) {
    ALOGE("item was unexpectedly null.");
void MediaDrmMetrics::Export(PersistableBundle* metrics) {
  if (!metrics) {
    ALOGE("metrics was unexpectedly null.");
    return;
  }
  ExportCounterMetric(mOpenSessionCounter, item);
  ExportCounterMetric(mCloseSessionCounter, item);
  ExportEventMetric(mGetKeyRequestTiming, item);
  ExportEventMetric(mProvideKeyResponseTiming, item);
  ExportCounterMetric(mGetProvisionRequestCounter, item);
  ExportCounterMetric(mProvideProvisionResponseCounter, item);
  ExportCounterMetricWithAttributeNames(mKeyStatusChangeCounter, item);
  ExportCounterMetricWithAttributeNames(mEventCounter, item);
  ExportCounterMetric(mGetDeviceUniqueIdCounter, item);
  ExportCounterMetric(mOpenSessionCounter, metrics);
  ExportCounterMetric(mCloseSessionCounter, metrics);
  ExportEventMetric(mGetKeyRequestTiming, metrics);
  ExportEventMetric(mProvideKeyResponseTiming, metrics);
  ExportCounterMetric(mGetProvisionRequestCounter, metrics);
  ExportCounterMetric(mProvideProvisionResponseCounter, metrics);
  ExportCounterMetricWithAttributeNames(mKeyStatusChangeCounter, metrics);
  ExportCounterMetricWithAttributeNames(mEventCounter, metrics);
  ExportCounterMetric(mGetDeviceUniqueIdCounter, metrics);
}

}  // namespace android
+5 −5
Original line number Diff line number Diff line
@@ -508,7 +508,7 @@ struct BpDrm : public BpInterface<IDrm> {
        return reply.readInt32();
    }

    virtual status_t getMetrics(MediaAnalyticsItem *item) {
    virtual status_t getMetrics(os::PersistableBundle *metrics) {
        Parcel data, reply;
        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());

@@ -517,7 +517,7 @@ struct BpDrm : public BpInterface<IDrm> {
            return status;
        }

        item->readFromParcel(reply);
        metrics->readFromParcel(&reply);
        return reply.readInt32();
    }

@@ -1034,9 +1034,9 @@ status_t BnDrm::onTransact(
        {
            CHECK_INTERFACE(IDrm, data, reply);

            MediaAnalyticsItem item;
            status_t result = getMetrics(&item);
            item.writeToParcel(reply);
            os::PersistableBundle metrics;
            status_t result = getMetrics(&metrics);
            metrics.writeToParcel(reply);
            reply->writeInt32(result);
            return OK;
        }
+1 −1
Original line number Diff line number Diff line
@@ -119,7 +119,7 @@ struct DrmHal : public BnDrm,
    virtual status_t setPropertyString(String8 const &name, String8 const &value ) const;
    virtual status_t setPropertyByteArray(String8 const &name,
                                          Vector<uint8_t> const &value ) const;
    virtual status_t getMetrics(MediaAnalyticsItem *item);
    virtual status_t getMetrics(os::PersistableBundle *metrics);

    virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId,
                                        String8 const &algorithm);
+2 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <map>

#include <android/hardware/drm/1.0/types.h>
#include <binder/PersistableBundle.h>
#include <media/CounterMetric.h>
#include <media/EventMetric.h>

@@ -58,7 +59,7 @@ class MediaDrmMetrics {
  // TODO: Add session start and end time support. These are a special case.

  // Export the metrics to a MediaAnalyticsItem.
  void Export(MediaAnalyticsItem* item);
  void Export(os::PersistableBundle* metricsBundle);
};

}  // namespace android
Loading