define media.metrics events for statsd

define atoms/messages that express the media.metrics events as they get
passed to statsd. This mirrors the data that was already being
collected via 'dumpsys media.metrics'.

Update the test app's list of acceptable uid's from which it takes
submissions to include the media.metrics service.

Bug: 118782504
Test: statsd/test_drive
Change-Id: I825f6cb7a9baa61f51c45b1b56a20dd94ae48015
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 2bd4299..c8d4eec 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -48,6 +48,7 @@
 import "frameworks/base/core/proto/android/stats/enums.proto";
 import "frameworks/base/core/proto/android/stats/intelligence/enums.proto";
 import "frameworks/base/core/proto/android/stats/launcher/launcher.proto";
+import "frameworks/base/core/proto/android/stats/mediametrics/mediametrics.proto";
 import "frameworks/base/core/proto/android/stats/storage/storage_enums.proto";
 import "frameworks/base/core/proto/android/stats/style/style_enums.proto";
 import "frameworks/base/core/proto/android/telecomm/enums.proto";
@@ -283,6 +284,16 @@
         ThermalThrottlingSeverityStateChanged thermal_throttling_severity_state_changed = 189;
         RoleRequestResultReported role_request_result_reported =
             190 [(log_from_module) = "permissioncontroller"];
+        MediametricsAudiopolicyReported mediametrics_audiopolicy_reported = 191;
+        MediametricsAudiorecordReported mediametrics_audiorecord_reported = 192;
+        MediametricsAudiothreadReported mediametrics_audiothread_reported = 193;
+        MediametricsAudiotrackReported mediametrics_audiotrack_reported = 194;
+        MediametricsCodecReported mediametrics_codec_reported = 195;
+        MediametricsDrmWidevineReported mediametrics_drm_widevine_reported = 196;
+        MediametricsExtractorReported mediametrics_extractor_reported = 197;
+        MediametricsMediadrmReported mediametrics_mediadrm_reported = 198;
+        MediametricsNuPlayerReported mediametrics_nuplayer_reported = 199;
+        MediametricsRecorderReported mediametrics_recorder_reported = 200;
     }
 
     // Pulled events will start at field 10000.
@@ -5809,6 +5820,160 @@
 }
 
 /**
+ * Track Media Codec usage
+ * Logged from:
+ *   frameworks/av/media/libstagefright/MediaCodec.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_codec.cpp
+ */
+message MediametricsCodecReported {
+    optional int64 timestamp_nanos = 1;
+    optional string package_name = 2;
+    optional int64 package_version_code = 3;
+    optional int64 media_apex_version = 4;
+
+    optional android.stats.mediametrics.CodecData codec_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
+/**
+ * Track Media Extractor (pulling video/audio streams out of containers) usage
+ * Logged from:
+ *   frameworks/av/media/libstagefright/RemoteMediaExtractor.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_extractor.cpp
+ */
+message MediametricsExtractorReported {
+    optional int64 timestamp_nanos = 1;
+    optional string package_name = 2;
+    optional int64 package_version_code = 3;
+    optional int64 media_apex_version = 4;
+
+    optional android.stats.mediametrics.ExtractorData extractor_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
+/**
+ * Track how we arbitrate between microphone/input requests.
+ * Logged from
+ *   frameworks/av/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_audiopolicy.cpp
+ */
+message MediametricsAudiopolicyReported {
+    optional int64 timestamp_nanos = 1;
+    optional string package_name = 2;
+    optional int64 package_version_code = 3;
+    optional int64 media_apex_version = 4;
+
+    optional android.stats.mediametrics.AudioPolicyData audiopolicy_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
+/**
+ * Track how we arbitrate between microphone requests.
+ * Logged from
+ *   frameworks/av/media/libaudioclient/AudioRecord.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_audiorecord.cpp
+ */
+message MediametricsAudiorecordReported {
+    optional int64 timestamp_nanos = 1;
+    optional string package_name = 2;
+    optional int64 package_version_code = 3;
+    optional int64 media_apex_version = 4;
+
+    optional android.stats.mediametrics.AudioRecordData audiorecord_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
+/**
+ * Track how we arbitrate between microphone/input requests.
+ * Logged from
+ *   frameworks/av/media/libnblog/ReportPerformance.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_audiothread.cpp
+ */
+message MediametricsAudiothreadReported {
+    optional int64 timestamp_nanos = 1;
+    optional string package_name = 2;
+    optional int64 package_version_code = 3;
+    optional int64 media_apex_version = 4;
+
+    optional android.stats.mediametrics.AudioThreadData audiothread_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
+/**
+ * Track how we arbitrate between microphone/input requests.
+ * Logged from
+ *   frameworks/av/media/libaudioclient/AudioTrack.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_audiotrack.cpp
+ */
+message MediametricsAudiotrackReported {
+    optional int64 timestamp_nanos = 1;
+    optional string package_name = 2;
+    optional int64 package_version_code = 3;
+    optional int64 media_apex_version = 4;
+
+    optional android.stats.mediametrics.AudioTrackData audiotrack_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
+/**
+ * Track information about DRM framework performance
+ * Logged from
+ *   frameworks/av/drm/libmediadrm/DrmHal.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_drm.cpp
+ */
+message MediametricsMediadrmReported {
+    optional int64 timestamp_nanos = 1;
+    optional string package_name = 2;
+    optional int64 package_version_code = 3;
+    optional int64 media_apex_version = 4;
+
+    // vendor+description tell about which DRM plugin is in use on this device
+    optional string vendor = 5;
+    optional string description = 6;
+    // from frameworks/av/drm/libmediadrm/protos/metrics.proto
+    optional bytes framework_stats = 7 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
+/**
+ * Track information about the widevine DRM plugin performance
+ * Logged from
+ *   vendor/widevine/libwvdrmengine/cdm/metrics
+ *   frameworks/av/services/mediaanalytics/statsd_drm.cpp
+ */
+message MediametricsDrmWidevineReported {
+    optional int64 timestamp_nanos = 1;
+    optional string package_name = 2;
+    optional int64 package_version_code = 3;
+    optional int64 media_apex_version = 4;
+
+    optional bytes vendor_specific_stats = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
+/**
+ * Track information about recordings (e.g. camcorder)
+ * Logged from
+ *   frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_recorder.cpp
+ */
+message MediametricsRecorderReported {
+    optional int64 timestamp_nanos = 1;
+    optional string package_name = 2;
+    optional int64 package_version_code = 3;
+    optional int64 media_apex_version = 4;
+
+    optional android.stats.mediametrics.RecorderData recorder_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
+/**
+ * Track Media Player usage
+ * Logged from:
+ *   frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_nuplayer.cpp
+ */
+message MediametricsNuPlayerReported {
+    optional int64 timestamp_nanos = 1;
+    optional string package_name = 2;
+    optional int64 package_version_code = 3;
+    optional int64 media_apex_version = 4;
+
+    optional android.stats.mediametrics.NuPlayerData nuplayer_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES];
+}
+
+/**
  * State of a dangerous permission requested by a package
  */
 message DangerousPermissionState {
diff --git a/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/testdrive/TestDrive.java b/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/testdrive/TestDrive.java
index fc7b778..3e705fd 100644
--- a/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/testdrive/TestDrive.java
+++ b/cmds/statsd/tools/localtools/src/com/android/statsd/shelltools/testdrive/TestDrive.java
@@ -57,6 +57,7 @@
         "AID_BLUETOOTH",
         "AID_LMKD",
         "com.android.managedprovisioning",
+        "AID_MEDIA",
         "AID_NETWORK_STACK"
     };
     private static final Logger LOGGER = Logger.getLogger(TestDrive.class.getName());
diff --git a/core/proto/android/stats/mediametrics/mediametrics.proto b/core/proto/android/stats/mediametrics/mediametrics.proto
new file mode 100644
index 0000000..34ed90a
--- /dev/null
+++ b/core/proto/android/stats/mediametrics/mediametrics.proto
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package android.stats.mediametrics;
+
+/**
+ * Track how we arbitrate between microphone/input requests.
+ * Logged from
+ *   frameworks/av/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_audiopolicy.cpp
+ * Next Tag: 10
+ */
+message AudioPolicyData {
+    optional int32 status = 1;
+    optional string request_source = 2;
+    optional string request_package = 3;
+    optional int32 request_session = 4;
+    optional string request_device = 5;
+    optional string active_source = 6;
+    optional string active_package = 7;
+    optional int32 active_session = 8;
+    optional string active_device = 9;
+}
+
+/**
+ * Track properties of audio recording
+ * Logged from
+ *   frameworks/av/media/libaudioclient/AudioRecord.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_audiorecord.cpp
+ * Next Tag: 16
+ */
+message AudioRecordData {
+    optional string encoding = 1;
+    optional string source = 2;
+    optional int32 latency = 3;
+    optional int32 samplerate = 4;
+    optional int32 channels = 5;
+    optional int64 created_millis = 6;
+    optional int64 duration_millis = 7;
+    optional int32 count = 8;
+    optional int32 error_code = 9;
+    optional string error_function = 10;
+    optional int32 port_id = 11;
+    optional int32 frame_count = 12;
+    optional string attributes = 13;
+    optional int64 channel_mask = 14;
+    optional int64 start_count = 15;
+
+}
+
+/**
+ * Track audio thread performance data
+ * Logged from
+ *   frameworks/av/media/libnblog/ReportPerformance.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_audiothread.cpp
+ * Next Tag: 28
+ */
+message AudioThreadData {
+    optional string type = 1;
+    optional int32 framecount = 2;
+    optional int32 samplerate = 3;
+    optional string work_millis_hist = 4;
+    optional string latency_millis_hist = 5;
+    optional string warmup_millis_hist = 6;
+    optional int64 underruns = 7;
+    optional int64 overruns = 8;
+    optional int64 active_millis = 9;
+    optional int64 duration_millis = 10;
+
+    optional int32 id = 11;
+    optional int32 port_id = 12;
+    optional int32 sample_rate = 13;
+    optional int64 channel_mask = 14;
+    optional string encoding = 15;
+    optional int32 frame_count = 16;
+    optional string output_device = 17;
+    optional string input_device = 18;
+    optional double io_jitter_mean_millis = 19;
+    optional double io_jitter_stddev_millis = 20;
+    optional double process_time_mean_millis = 21;
+    optional double process_time_stddev_millis = 22;
+    optional double timestamp_jitter_mean_millis = 23;
+    optional double timestamp_jitter_stddev_millis = 24;
+    optional double latency_mean_millis = 25;
+    optional double latency_stddev_millis = 26;
+
+}
+
+/**
+ * Track audio track playback data
+ * Logged from
+ *   frameworks/av/media/libaudioclient/AudioTrack.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_audiotrack.cpp
+ * Next Tag: 12
+ */
+message AudioTrackData {
+    optional string stream_type = 1;
+    optional string content_type = 2;
+    optional string track_usage = 3;
+    optional int32 sample_rate = 4;
+    optional int64 channel_mask = 5;
+
+    optional int32 underrun_frames = 6;
+    optional int32 startup_glitch = 7;
+
+    optional int32 port_id = 8;
+    optional string encoding = 9;
+    optional int32 frame_count = 10;
+    optional string attributes = 11;
+
+
+}
+
+/**
+ * Track Media Codec usage
+ * Logged from:
+ *   frameworks/av/media/libstagefright/MediaCodec.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_codec.cpp
+ * Next Tag: 21
+ */
+message CodecData {
+    optional string codec = 1;
+    optional string mime = 2;
+    optional string mode = 3;
+    optional int32 encoder = 4;
+    optional int32 secure = 5;
+    optional int32 width = 6;
+    optional int32 height = 7;
+    optional int32 rotation = 8;
+    optional int32 crypto = 9;
+    optional int32 profile = 10;
+    optional int32 level = 11;
+    optional int32 max_width = 12;
+    optional int32 max_height = 13;
+    optional int32 error_code = 14;
+    optional string error_state = 15;
+    optional int64 latency_max = 16;
+    optional int64 latency_min = 17;
+    optional int64 latency_avg = 18;
+    optional int64 latency_count = 19;
+    optional int64 latency_unknown = 20;
+}
+
+/**
+ * Track Media Extractor (pulling video/audio streams out of containers) usage
+ * Logged from:
+ *   frameworks/av/media/libstagefright/RemoteMediaExtractor.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_extractor.cpp
+ * Next Tag: 4
+ */
+message ExtractorData {
+    optional string format = 1;
+    optional string mime = 2;
+    optional int32 tracks = 3;
+}
+
+/**
+ * Track Media Player usage
+ * this handles both nuplayer and nuplayer2
+ * Logged from:
+ *   frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
+ *   frameworks/av/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
+ *   frameworks/av/services/mediaanalytics/statsd_nuplayer.cpp
+ * Next Tag: 21
+ */
+message NuPlayerData {
+    optional string whichPlayer = 1;
+
+    optional string video_mime = 2;
+    optional string video_codec = 3;
+    optional int32 width = 4;
+    optional int32 height = 5;
+    optional int64 frames = 6;
+    optional int64 frames_dropped = 7;
+    optional double framerate = 8;
+    optional string audio_mime = 9;
+    optional string audio_codec = 10;
+    optional int64 duration_millis = 11;
+    optional int64 playing_millis = 12;
+    optional int32 error = 13;
+    optional int32 error_code = 14;
+    optional string error_state = 15;
+    optional string data_source_type = 16;
+    optional int64 rebuffering_millis = 17;
+    optional int32 rebuffers = 18;
+    optional int32 rebuffer_at_exit = 19;
+    optional int64 frames_dropped_startup = 20;
+}
+
+/**
+ * Track information about recordings (e.g. camcorder)
+ * Logged from
+ *   frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp
+ *   frameworks/av/services/mediaanalytics/if_statsd.cpp
+ * Next Tag: 22
+ */
+message RecorderData {
+    optional string audio_mime = 1;
+    optional string video_mime = 2;
+    optional int32 video_profile = 3;
+    optional int32 video_level = 4;
+    optional int32 width = 5;
+    optional int32 height = 6;
+    optional int32 rotation = 7;
+    optional int32 framerate = 8;
+    optional int32 capture_fps = 9;
+    optional double capture_fps_enable = 10;
+    optional int64 duration_millis = 11;
+    optional int64 paused_millis = 12;
+    optional int32 paused_count = 13;
+    optional int32 audio_bitrate = 14;
+    optional int32 audio_channels = 15;
+    optional int32 audio_samplerate = 16;
+    optional int32 movie_timescale = 17;
+    optional int32 audio_timescale = 18;
+    optional int32 video_timescale = 19;
+    optional int32 video_bitrate = 20;
+    optional int32 iframe_interval = 21;
+}