Merge changes from topics "media_metrics_network", "media_metrics_pb_metrics", "media_metrics_track_change" into sc-dev

* changes:
  Unhide media metrics APIs part 2: playback metrics
  Unhide media metrics APIs part 2: Network event
  Unhide media metrics APIs part 2: Track change event
This commit is contained in:
Shubang Lu
2021-02-17 22:11:25 +00:00
committed by Android (Google) Code Review
8 changed files with 441 additions and 154 deletions

View File

@@ -21000,7 +21000,7 @@ package android.media {
method @NonNull public String getDiagnosticInfo(); method @NonNull public String getDiagnosticInfo();
} }
public final class MediaCodec { public final class MediaCodec implements android.media.metrics.PlaybackComponent {
method public void configure(@Nullable android.media.MediaFormat, @Nullable android.view.Surface, @Nullable android.media.MediaCrypto, int); method public void configure(@Nullable android.media.MediaFormat, @Nullable android.view.Surface, @Nullable android.media.MediaCrypto, int);
method public void configure(@Nullable android.media.MediaFormat, @Nullable android.view.Surface, int, @Nullable android.media.MediaDescrambler); method public void configure(@Nullable android.media.MediaFormat, @Nullable android.view.Surface, int, @Nullable android.media.MediaDescrambler);
method @NonNull public static android.media.MediaCodec createByCodecName(@NonNull String) throws java.io.IOException; method @NonNull public static android.media.MediaCodec createByCodecName(@NonNull String) throws java.io.IOException;
@@ -21026,6 +21026,7 @@ package android.media {
method @NonNull public android.media.MediaFormat getOutputFormat(int); method @NonNull public android.media.MediaFormat getOutputFormat(int);
method @NonNull public android.media.MediaCodec.OutputFrame getOutputFrame(int); method @NonNull public android.media.MediaCodec.OutputFrame getOutputFrame(int);
method @Nullable public android.media.Image getOutputImage(int); method @Nullable public android.media.Image getOutputImage(int);
method public String getPlaybackId();
method @NonNull public android.media.MediaCodec.QueueRequest getQueueRequest(int); method @NonNull public android.media.MediaCodec.QueueRequest getQueueRequest(int);
method @Nullable public static android.media.Image mapHardwareBuffer(@NonNull android.hardware.HardwareBuffer); method @Nullable public static android.media.Image mapHardwareBuffer(@NonNull android.hardware.HardwareBuffer);
method public void queueInputBuffer(int, int, int, long, int) throws android.media.MediaCodec.CryptoException; method public void queueInputBuffer(int, int, int, long, int) throws android.media.MediaCodec.CryptoException;
@@ -21041,6 +21042,7 @@ package android.media {
method public void setOnFrameRenderedListener(@Nullable android.media.MediaCodec.OnFrameRenderedListener, @Nullable android.os.Handler); method public void setOnFrameRenderedListener(@Nullable android.media.MediaCodec.OnFrameRenderedListener, @Nullable android.os.Handler);
method public void setOutputSurface(@NonNull android.view.Surface); method public void setOutputSurface(@NonNull android.view.Surface);
method public void setParameters(@Nullable android.os.Bundle); method public void setParameters(@Nullable android.os.Bundle);
method public void setPlaybackId(@NonNull String);
method public void setVideoScalingMode(int); method public void setVideoScalingMode(int);
method public void signalEndOfInputStream(); method public void signalEndOfInputStream();
method public void start(); method public void start();
@@ -24114,6 +24116,34 @@ package android.media.metrics {
field public static final long INVALID_TIMESTAMP = -1L; // 0xffffffffffffffffL field public static final long INVALID_TIMESTAMP = -1L; // 0xffffffffffffffffL
} }
public final class NetworkEvent extends android.media.metrics.Event implements android.os.Parcelable {
method public int describeContents();
method public int getNetworkType();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.media.metrics.NetworkEvent> CREATOR;
field public static final int NETWORK_TYPE_2G = 4; // 0x4
field public static final int NETWORK_TYPE_3G = 5; // 0x5
field public static final int NETWORK_TYPE_4G = 6; // 0x6
field public static final int NETWORK_TYPE_5G_NSA = 7; // 0x7
field public static final int NETWORK_TYPE_5G_SA = 8; // 0x8
field public static final int NETWORK_TYPE_ETHERNET = 3; // 0x3
field public static final int NETWORK_TYPE_NONE = 0; // 0x0
field public static final int NETWORK_TYPE_OTHER = 1; // 0x1
field public static final int NETWORK_TYPE_WIFI = 2; // 0x2
}
public static final class NetworkEvent.Builder {
ctor public NetworkEvent.Builder();
method @NonNull public android.media.metrics.NetworkEvent build();
method @NonNull public android.media.metrics.NetworkEvent.Builder setNetworkType(int);
method @NonNull public android.media.metrics.NetworkEvent.Builder setTimeSinceCreatedMillis(@IntRange(from=0xffffffff) long);
}
public interface PlaybackComponent {
method @NonNull public String getPlaybackId();
method public void setPlaybackId(@NonNull String);
}
public final class PlaybackErrorEvent extends android.media.metrics.Event implements android.os.Parcelable { public final class PlaybackErrorEvent extends android.media.metrics.Event implements android.os.Parcelable {
method public int describeContents(); method public int describeContents();
method public int getErrorCode(); method public int getErrorCode();
@@ -24134,11 +24164,78 @@ package android.media.metrics {
method @NonNull public android.media.metrics.PlaybackErrorEvent.Builder setTimeSinceCreatedMillis(@IntRange(from=0xffffffff) long); method @NonNull public android.media.metrics.PlaybackErrorEvent.Builder setTimeSinceCreatedMillis(@IntRange(from=0xffffffff) long);
} }
public final class PlaybackMetrics implements android.os.Parcelable {
method public int describeContents();
method @IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) public int getAudioUnderrunCount();
method public int getContentType();
method public int getDrmType();
method @NonNull public long[] getExperimentIds();
method @IntRange(from=0xffffffff) public long getLocalBytesRead();
method @IntRange(from=0xffffffff) public long getMediaDurationMillis();
method @IntRange(from=0xffffffff) public long getNetworkBytesRead();
method @IntRange(from=0xffffffff) public long getNetworkTransferDurationMillis();
method public int getPlaybackType();
method @Nullable public String getPlayerName();
method @Nullable public String getPlayerVersion();
method public int getStreamSource();
method public int getStreamType();
method @IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) public int getVideoFramesDropped();
method @IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) public int getVideoFramesPlayed();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field public static final int CONTENT_TYPE_AD = 1; // 0x1
field public static final int CONTENT_TYPE_MAIN = 0; // 0x0
field public static final int CONTENT_TYPE_OTHER = 2; // 0x2
field @NonNull public static final android.os.Parcelable.Creator<android.media.metrics.PlaybackMetrics> CREATOR;
field public static final int DRM_TYPE_CLEARKEY = 6; // 0x6
field public static final int DRM_TYPE_NONE = 0; // 0x0
field public static final int DRM_TYPE_OTHER = 1; // 0x1
field public static final int DRM_TYPE_PLAY_READY = 2; // 0x2
field public static final int DRM_TYPE_WIDEVINE_L1 = 3; // 0x3
field public static final int DRM_TYPE_WIDEVINE_L3 = 4; // 0x4
field public static final int DRM_TYPE_WV_L3_FALLBACK = 5; // 0x5
field public static final int PLAYBACK_TYPE_LIVE = 1; // 0x1
field public static final int PLAYBACK_TYPE_OTHER = 2; // 0x2
field public static final int PLAYBACK_TYPE_VOD = 0; // 0x0
field public static final int STREAM_SOURCE_DEVICE = 2; // 0x2
field public static final int STREAM_SOURCE_MIXED = 3; // 0x3
field public static final int STREAM_SOURCE_NETWORK = 1; // 0x1
field public static final int STREAM_SOURCE_UNKNOWN = 0; // 0x0
field public static final int STREAM_TYPE_DASH = 3; // 0x3
field public static final int STREAM_TYPE_HLS = 4; // 0x4
field public static final int STREAM_TYPE_OTHER = 1; // 0x1
field public static final int STREAM_TYPE_PROGRESSIVE = 2; // 0x2
field public static final int STREAM_TYPE_SS = 5; // 0x5
field public static final int STREAM_TYPE_UNKNOWN = 0; // 0x0
}
public static final class PlaybackMetrics.Builder {
ctor public PlaybackMetrics.Builder();
method @NonNull public android.media.metrics.PlaybackMetrics.Builder addExperimentId(long);
method @NonNull public android.media.metrics.PlaybackMetrics build();
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setAudioUnderrunCount(@IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) int);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setContentType(int);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setDrmType(int);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setLocalBytesRead(@IntRange(from=0xffffffff) long);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setMediaDurationMillis(@IntRange(from=0xffffffff) long);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setNetworkBytesRead(@IntRange(from=0xffffffff) long);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setNetworkTransferDurationMillis(@IntRange(from=0xffffffff) long);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setPlaybackType(int);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setPlayerName(@NonNull String);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setPlayerVersion(@NonNull String);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setStreamSource(int);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setStreamType(int);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setVideoFramesDropped(@IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) int);
method @NonNull public android.media.metrics.PlaybackMetrics.Builder setVideoFramesPlayed(@IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) int);
}
public final class PlaybackSession implements java.lang.AutoCloseable { public final class PlaybackSession implements java.lang.AutoCloseable {
method public void close(); method public void close();
method @NonNull public String getId(); method @NonNull public String getId();
method public void reportNetworkEvent(@NonNull android.media.metrics.NetworkEvent);
method public void reportPlaybackErrorEvent(@NonNull android.media.metrics.PlaybackErrorEvent); method public void reportPlaybackErrorEvent(@NonNull android.media.metrics.PlaybackErrorEvent);
method public void reportPlaybackMetrics(@NonNull android.media.metrics.PlaybackMetrics);
method public void reportPlaybackStateEvent(@NonNull android.media.metrics.PlaybackStateEvent); method public void reportPlaybackStateEvent(@NonNull android.media.metrics.PlaybackStateEvent);
method public void reportTrackChangeEvent(@NonNull android.media.metrics.TrackChangeEvent);
} }
public final class PlaybackStateEvent extends android.media.metrics.Event implements android.os.Parcelable { public final class PlaybackStateEvent extends android.media.metrics.Event implements android.os.Parcelable {
@@ -24170,6 +24267,54 @@ package android.media.metrics {
method @NonNull public android.media.metrics.PlaybackStateEvent.Builder setTimeSinceCreatedMillis(@IntRange(from=0xffffffff) long); method @NonNull public android.media.metrics.PlaybackStateEvent.Builder setTimeSinceCreatedMillis(@IntRange(from=0xffffffff) long);
} }
public final class TrackChangeEvent extends android.media.metrics.Event implements android.os.Parcelable {
ctor public TrackChangeEvent(int, int, @Nullable String, @Nullable String, @Nullable String, int, long, int, @Nullable String, @Nullable String, int, int, int, int);
method public int describeContents();
method @IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) public int getBitrate();
method @IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) public int getChannelCount();
method @Nullable public String getCodecName();
method @Nullable public String getContainerMimeType();
method @IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) public int getHeight();
method @Nullable public String getLanguage();
method @Nullable public String getLanguageRegion();
method @Nullable public String getSampleMimeType();
method @IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) public int getSampleRate();
method public int getTrackChangeReason();
method public int getTrackState();
method public int getTrackType();
method @IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) public int getWidth();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.media.metrics.TrackChangeEvent> CREATOR;
field public static final int TRACK_CHANGE_REASON_ADAPTIVE = 4; // 0x4
field public static final int TRACK_CHANGE_REASON_INITIAL = 2; // 0x2
field public static final int TRACK_CHANGE_REASON_MANUAL = 3; // 0x3
field public static final int TRACK_CHANGE_REASON_OTHER = 1; // 0x1
field public static final int TRACK_CHANGE_REASON_UNKNOWN = 0; // 0x0
field public static final int TRACK_STATE_OFF = 0; // 0x0
field public static final int TRACK_STATE_ON = 1; // 0x1
field public static final int TRACK_TYPE_AUDIO = 0; // 0x0
field public static final int TRACK_TYPE_TEXT = 2; // 0x2
field public static final int TRACK_TYPE_VIDEO = 1; // 0x1
}
public static final class TrackChangeEvent.Builder {
ctor public TrackChangeEvent.Builder(int);
method @NonNull public android.media.metrics.TrackChangeEvent build();
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setBitrate(@IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) int);
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setChannelCount(@IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) int);
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setCodecName(@NonNull String);
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setContainerMimeType(@NonNull String);
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setHeight(@IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) int);
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setLanguage(@NonNull String);
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setLanguageRegion(@NonNull String);
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setSampleMimeType(@NonNull String);
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setSampleRate(@IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) int);
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setTimeSinceCreatedMillis(@IntRange(from=0xffffffff) long);
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setTrackChangeReason(int);
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setTrackState(int);
method @NonNull public android.media.metrics.TrackChangeEvent.Builder setWidth(@IntRange(from=0xffffffff, to=java.lang.Integer.MAX_VALUE) int);
}
} }
package android.media.midi { package android.media.midi {

View File

@@ -1232,11 +1232,6 @@ package android.media {
method public void forceResourceLost(); method public void forceResourceLost();
} }
public final class MediaCodec implements android.media.metrics.PlaybackComponent {
method public String getPlaybackId();
method public void setPlaybackId(@NonNull String);
}
public static final class MediaCodecInfo.VideoCapabilities.PerformancePoint { public static final class MediaCodecInfo.VideoCapabilities.PerformancePoint {
ctor public MediaCodecInfo.VideoCapabilities.PerformancePoint(int, int, int, int, @NonNull android.util.Size); ctor public MediaCodecInfo.VideoCapabilities.PerformancePoint(int, int, int, int, @NonNull android.util.Size);
ctor public MediaCodecInfo.VideoCapabilities.PerformancePoint(@NonNull android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint, @NonNull android.util.Size); ctor public MediaCodecInfo.VideoCapabilities.PerformancePoint(@NonNull android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint, @NonNull android.util.Size);
@@ -1311,15 +1306,6 @@ package android.media.audiopolicy {
} }
package android.media.metrics {
public interface PlaybackComponent {
method @NonNull public String getPlaybackId();
method public void setPlaybackId(@NonNull String);
}
}
package android.media.tv { package android.media.tv {
public final class TvInputManager { public final class TvInputManager {

View File

@@ -17,6 +17,7 @@
package android.media.metrics; package android.media.metrics;
import android.annotation.IntDef; import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.os.Parcel; import android.os.Parcel;
@@ -27,22 +28,30 @@ import java.lang.annotation.RetentionPolicy;
import java.util.Objects; import java.util.Objects;
/** /**
* Playback network event. * Media network event.
* @hide
*/ */
public final class NetworkEvent implements Parcelable { public final class NetworkEvent extends Event implements Parcelable {
/** Network type is not specified. Default type. */
public static final int NETWORK_TYPE_NONE = 0; public static final int NETWORK_TYPE_NONE = 0;
/** Other network type */
public static final int NETWORK_TYPE_OTHER = 1; public static final int NETWORK_TYPE_OTHER = 1;
/** Wi-Fi network */
public static final int NETWORK_TYPE_WIFI = 2; public static final int NETWORK_TYPE_WIFI = 2;
/** Ethernet network */
public static final int NETWORK_TYPE_ETHERNET = 3; public static final int NETWORK_TYPE_ETHERNET = 3;
/** 2G network */
public static final int NETWORK_TYPE_2G = 4; public static final int NETWORK_TYPE_2G = 4;
/** 3G network */
public static final int NETWORK_TYPE_3G = 5; public static final int NETWORK_TYPE_3G = 5;
/** 4G network */
public static final int NETWORK_TYPE_4G = 6; public static final int NETWORK_TYPE_4G = 6;
/** 5G NSA network */
public static final int NETWORK_TYPE_5G_NSA = 7; public static final int NETWORK_TYPE_5G_NSA = 7;
/** 5G SA network */
public static final int NETWORK_TYPE_5G_SA = 8; public static final int NETWORK_TYPE_5G_SA = 8;
private final int mType; private final int mNetworkType;
private final long mTimeSincePlaybackCreatedMillis; private final long mTimeSinceCreatedMillis;
/** @hide */ /** @hide */
@IntDef(prefix = "NETWORK_TYPE_", value = { @IntDef(prefix = "NETWORK_TYPE_", value = {
@@ -61,6 +70,7 @@ public final class NetworkEvent implements Parcelable {
/** /**
* Network type to string. * Network type to string.
* @hide
*/ */
public static String networkTypeToString(@NetworkType int value) { public static String networkTypeToString(@NetworkType int value) {
switch (value) { switch (value) {
@@ -92,25 +102,34 @@ public final class NetworkEvent implements Parcelable {
* *
* @hide * @hide
*/ */
public NetworkEvent(@NetworkType int type, long timeSincePlaybackCreatedMillis) { public NetworkEvent(@NetworkType int type, long timeSinceCreatedMillis) {
this.mType = type; this.mNetworkType = type;
this.mTimeSincePlaybackCreatedMillis = timeSincePlaybackCreatedMillis; this.mTimeSinceCreatedMillis = timeSinceCreatedMillis;
} }
/**
* Gets network type.
*/
@NetworkType @NetworkType
public int getType() { public int getNetworkType() {
return mType; return mNetworkType;
} }
public long getTimeSincePlaybackCreatedMillis() { /**
return mTimeSincePlaybackCreatedMillis; * Gets timestamp since the creation in milliseconds.
* @return the timestamp since the creation in milliseconds, or -1 if unknown.
*/
@Override
@IntRange(from = -1)
public long getTimeSinceCreatedMillis() {
return mTimeSinceCreatedMillis;
} }
@Override @Override
public String toString() { public String toString() {
return "NetworkEvent { " return "NetworkEvent { "
+ "type = " + mType + ", " + "networkType = " + mNetworkType + ", "
+ "timeSincePlaybackCreatedMillis = " + mTimeSincePlaybackCreatedMillis + "timeSinceCreatedMillis = " + mTimeSinceCreatedMillis
+ " }"; + " }";
} }
@@ -119,19 +138,19 @@ public final class NetworkEvent implements Parcelable {
if (this == o) return true; if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; if (o == null || getClass() != o.getClass()) return false;
NetworkEvent that = (NetworkEvent) o; NetworkEvent that = (NetworkEvent) o;
return mType == that.mType return mNetworkType == that.mNetworkType
&& mTimeSincePlaybackCreatedMillis == that.mTimeSincePlaybackCreatedMillis; && mTimeSinceCreatedMillis == that.mTimeSinceCreatedMillis;
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(mType, mTimeSincePlaybackCreatedMillis); return Objects.hash(mNetworkType, mTimeSinceCreatedMillis);
} }
@Override @Override
public void writeToParcel(@NonNull android.os.Parcel dest, int flags) { public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
dest.writeInt(mType); dest.writeInt(mNetworkType);
dest.writeLong(mTimeSincePlaybackCreatedMillis); dest.writeLong(mTimeSinceCreatedMillis);
} }
@Override @Override
@@ -142,12 +161,15 @@ public final class NetworkEvent implements Parcelable {
/** @hide */ /** @hide */
/* package-private */ NetworkEvent(@NonNull android.os.Parcel in) { /* package-private */ NetworkEvent(@NonNull android.os.Parcel in) {
int type = in.readInt(); int type = in.readInt();
long timeSincePlaybackCreatedMillis = in.readLong(); long timeSinceCreatedMillis = in.readLong();
this.mType = type; this.mNetworkType = type;
this.mTimeSincePlaybackCreatedMillis = timeSincePlaybackCreatedMillis; this.mTimeSinceCreatedMillis = timeSinceCreatedMillis;
} }
/**
* Used to read a NetworkEvent from a Parcel.
*/
public static final @NonNull Parcelable.Creator<NetworkEvent> CREATOR = public static final @NonNull Parcelable.Creator<NetworkEvent> CREATOR =
new Parcelable.Creator<NetworkEvent>() { new Parcelable.Creator<NetworkEvent>() {
@Override @Override
@@ -165,13 +187,11 @@ public final class NetworkEvent implements Parcelable {
* A builder for {@link NetworkEvent} * A builder for {@link NetworkEvent}
*/ */
public static final class Builder { public static final class Builder {
private int mType; private int mNetworkType = NETWORK_TYPE_NONE;
private long mTimeSincePlaybackCreatedMillis; private long mTimeSinceCreatedMillis = -1;
/** /**
* Creates a new Builder. * Creates a new Builder.
*
* @hide
*/ */
public Builder() { public Builder() {
} }
@@ -179,24 +199,24 @@ public final class NetworkEvent implements Parcelable {
/** /**
* Sets network type. * Sets network type.
*/ */
public @NonNull Builder setType(@NetworkType int value) { public @NonNull Builder setNetworkType(@NetworkType int value) {
mType = value; mNetworkType = value;
return this; return this;
} }
/** /**
* Sets timestamp since the creation in milliseconds. * Sets timestamp since the creation in milliseconds.
* @param value the timestamp since the creation in milliseconds.
* -1 indicates the value is unknown.
*/ */
public @NonNull Builder setTimeSincePlaybackCreatedMillis(long value) { public @NonNull Builder setTimeSinceCreatedMillis(@IntRange(from = -1) long value) {
mTimeSincePlaybackCreatedMillis = value; mTimeSinceCreatedMillis = value;
return this; return this;
} }
/** Builds the instance. */ /** Builds the instance. */
public @NonNull NetworkEvent build() { public @NonNull NetworkEvent build() {
NetworkEvent o = new NetworkEvent( NetworkEvent o = new NetworkEvent(mNetworkType, mTimeSinceCreatedMillis);
mType,
mTimeSincePlaybackCreatedMillis);
return o; return o;
} }
} }

View File

@@ -17,13 +17,10 @@
package android.media.metrics; package android.media.metrics;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.TestApi;
/** /**
* Interface for playback related components used by playback metrics. * Interface for playback related components used by playback metrics.
* @hide
*/ */
@TestApi
public interface PlaybackComponent { public interface PlaybackComponent {
/** /**

View File

@@ -17,6 +17,7 @@
package android.media.metrics; package android.media.metrics;
import android.annotation.IntDef; import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.os.Parcel; import android.os.Parcel;
@@ -33,35 +34,57 @@ import java.util.Objects;
/** /**
* This class is used to store playback data. * This class is used to store playback data.
* @hide
*/ */
public final class PlaybackMetrics implements Parcelable { public final class PlaybackMetrics implements Parcelable {
// TODO(b/177209128): JavaDoc for the constants. /** Unknown stream source. */
public static final int STREAM_SOURCE_UNKNOWN = 0; public static final int STREAM_SOURCE_UNKNOWN = 0;
/** Stream from network. */
public static final int STREAM_SOURCE_NETWORK = 1; public static final int STREAM_SOURCE_NETWORK = 1;
/** Stream from device. */
public static final int STREAM_SOURCE_DEVICE = 2; public static final int STREAM_SOURCE_DEVICE = 2;
/** Stream from more than one sources. */
public static final int STREAM_SOURCE_MIXED = 3; public static final int STREAM_SOURCE_MIXED = 3;
/** Unknown stream type. */
public static final int STREAM_TYPE_UNKNOWN = 0; public static final int STREAM_TYPE_UNKNOWN = 0;
/** Other stream type. */
public static final int STREAM_TYPE_OTHER = 1; public static final int STREAM_TYPE_OTHER = 1;
/** Progressive stream type. */
public static final int STREAM_TYPE_PROGRESSIVE = 2; public static final int STREAM_TYPE_PROGRESSIVE = 2;
/** DASH (Dynamic Adaptive Streaming over HTTP) stream type. */
public static final int STREAM_TYPE_DASH = 3; public static final int STREAM_TYPE_DASH = 3;
/** HLS (HTTP Live Streaming) stream type. */
public static final int STREAM_TYPE_HLS = 4; public static final int STREAM_TYPE_HLS = 4;
/** SS (HTTP Smooth Streaming) stream type. */
public static final int STREAM_TYPE_SS = 5; public static final int STREAM_TYPE_SS = 5;
/** VOD (Video on Demand) playback type. */
public static final int PLAYBACK_TYPE_VOD = 0; public static final int PLAYBACK_TYPE_VOD = 0;
/** Live playback type. */
public static final int PLAYBACK_TYPE_LIVE = 1; public static final int PLAYBACK_TYPE_LIVE = 1;
/** Other playback type. */
public static final int PLAYBACK_TYPE_OTHER = 2; public static final int PLAYBACK_TYPE_OTHER = 2;
/** DRM is not used. */
public static final int DRM_TYPE_NONE = 0; public static final int DRM_TYPE_NONE = 0;
/** Other DRM type. */
public static final int DRM_TYPE_OTHER = 1; public static final int DRM_TYPE_OTHER = 1;
/** Play ready DRM type. */
public static final int DRM_TYPE_PLAY_READY = 2; public static final int DRM_TYPE_PLAY_READY = 2;
/** Widevine L1 DRM type. */
public static final int DRM_TYPE_WIDEVINE_L1 = 3; public static final int DRM_TYPE_WIDEVINE_L1 = 3;
/** Widevine L3 DRM type. */
public static final int DRM_TYPE_WIDEVINE_L3 = 4; public static final int DRM_TYPE_WIDEVINE_L3 = 4;
// TODO: add DRM_TYPE_CLEARKEY /** Widevine L3 fallback DRM type. */
public static final int DRM_TYPE_WV_L3_FALLBACK = 5;
/** Clear key DRM type. */
public static final int DRM_TYPE_CLEARKEY = 6;
/** Main contents. */
public static final int CONTENT_TYPE_MAIN = 0; public static final int CONTENT_TYPE_MAIN = 0;
/** Advertisement contents. */
public static final int CONTENT_TYPE_AD = 1; public static final int CONTENT_TYPE_AD = 1;
/** Other contents. */
public static final int CONTENT_TYPE_OTHER = 2; public static final int CONTENT_TYPE_OTHER = 2;
@@ -102,7 +125,9 @@ public final class PlaybackMetrics implements Parcelable {
DRM_TYPE_OTHER, DRM_TYPE_OTHER,
DRM_TYPE_PLAY_READY, DRM_TYPE_PLAY_READY,
DRM_TYPE_WIDEVINE_L1, DRM_TYPE_WIDEVINE_L1,
DRM_TYPE_WIDEVINE_L3 DRM_TYPE_WIDEVINE_L3,
DRM_TYPE_WV_L3_FALLBACK,
DRM_TYPE_CLEARKEY
}) })
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface DrmType {} public @interface DrmType {}
@@ -173,6 +198,11 @@ public final class PlaybackMetrics implements Parcelable {
this.mNetworkTransferDurationMillis = networkTransferDurationMillis; this.mNetworkTransferDurationMillis = networkTransferDurationMillis;
} }
/**
* Gets the media duration in milliseconds.
* @return the media duration in milliseconds, or -1 if unknown.
*/
@IntRange(from = -1)
public long getMediaDurationMillis() { public long getMediaDurationMillis() {
return mMediaDurationMillis; return mMediaDurationMillis;
} }
@@ -241,28 +271,36 @@ public final class PlaybackMetrics implements Parcelable {
/** /**
* Gets video frames played. * Gets video frames played.
* @return the video frames played, or -1 if unknown.
*/ */
@IntRange(from = -1, to = Integer.MAX_VALUE)
public int getVideoFramesPlayed() { public int getVideoFramesPlayed() {
return mVideoFramesPlayed; return mVideoFramesPlayed;
} }
/** /**
* Gets video frames dropped. * Gets video frames dropped.
* @return the video frames dropped, or -1 if unknown.
*/ */
@IntRange(from = -1, to = Integer.MAX_VALUE)
public int getVideoFramesDropped() { public int getVideoFramesDropped() {
return mVideoFramesDropped; return mVideoFramesDropped;
} }
/** /**
* Gets audio underrun count. * Gets audio underrun count.
* @return the audio underrun count, or -1 if unknown.
*/ */
@IntRange(from = -1, to = Integer.MAX_VALUE)
public int getAudioUnderrunCount() { public int getAudioUnderrunCount() {
return mAudioUnderrunCount; return mAudioUnderrunCount;
} }
/** /**
* Gets number of network bytes read. * Gets number of network bytes read.
* @return the number of network bytes read, or -1 if unknown.
*/ */
@IntRange(from = -1)
public long getNetworkBytesRead() { public long getNetworkBytesRead() {
return mNetworkBytesRead; return mNetworkBytesRead;
} }
@@ -270,6 +308,7 @@ public final class PlaybackMetrics implements Parcelable {
/** /**
* Gets number of local bytes read. * Gets number of local bytes read.
*/ */
@IntRange(from = -1)
public long getLocalBytesRead() { public long getLocalBytesRead() {
return mLocalBytesRead; return mLocalBytesRead;
} }
@@ -277,6 +316,7 @@ public final class PlaybackMetrics implements Parcelable {
/** /**
* Gets network transfer duration in milliseconds. * Gets network transfer duration in milliseconds.
*/ */
@IntRange(from = -1)
public long getNetworkTransferDurationMillis() { public long getNetworkTransferDurationMillis() {
return mNetworkTransferDurationMillis; return mNetworkTransferDurationMillis;
} }
@@ -415,34 +455,33 @@ public final class PlaybackMetrics implements Parcelable {
*/ */
public static final class Builder { public static final class Builder {
private long mMediaDurationMillis; private long mMediaDurationMillis = -1;
private int mStreamSource; private int mStreamSource = STREAM_SOURCE_UNKNOWN;
private int mStreamType; private int mStreamType = STREAM_TYPE_UNKNOWN;
private int mPlaybackType; private int mPlaybackType = PLAYBACK_TYPE_OTHER;
private int mDrmType; private int mDrmType = DRM_TYPE_NONE;
private int mContentType; private int mContentType = CONTENT_TYPE_OTHER;
private @Nullable String mPlayerName; private @Nullable String mPlayerName;
private @Nullable String mPlayerVersion; private @Nullable String mPlayerVersion;
private @NonNull List<Long> mExperimentIds = new ArrayList<>(); private @NonNull List<Long> mExperimentIds = new ArrayList<>();
private int mVideoFramesPlayed; private int mVideoFramesPlayed = -1;
private int mVideoFramesDropped; private int mVideoFramesDropped = -1;
private int mAudioUnderrunCount; private int mAudioUnderrunCount = -1;
private long mNetworkBytesRead; private long mNetworkBytesRead = -1;
private long mLocalBytesRead; private long mLocalBytesRead = -1;
private long mNetworkTransferDurationMillis; private long mNetworkTransferDurationMillis = -1;
/** /**
* Creates a new Builder. * Creates a new Builder.
*
* @hide
*/ */
public Builder() { public Builder() {
} }
/** /**
* Sets the media duration in milliseconds. * Sets the media duration in milliseconds.
* @param value the media duration in milliseconds. -1 indicates the value is unknown.
*/ */
public @NonNull Builder setMediaDurationMillis(long value) { public @NonNull Builder setMediaDurationMillis(@IntRange(from = -1) long value) {
mMediaDurationMillis = value; mMediaDurationMillis = value;
return this; return this;
} }
@@ -474,7 +513,7 @@ public final class PlaybackMetrics implements Parcelable {
/** /**
* Sets the DRM type. * Sets the DRM type.
*/ */
public @NonNull Builder setDrmType(@StreamType int value) { public @NonNull Builder setDrmType(@DrmType int value) {
mDrmType = value; mDrmType = value;
return this; return this;
} }
@@ -513,48 +552,58 @@ public final class PlaybackMetrics implements Parcelable {
/** /**
* Sets the video frames played. * Sets the video frames played.
* @param value the video frames played. -1 indicates the value is unknown.
*/ */
public @NonNull Builder setVideoFramesPlayed(int value) { public @NonNull Builder setVideoFramesPlayed(
@IntRange(from = -1, to = Integer.MAX_VALUE) int value) {
mVideoFramesPlayed = value; mVideoFramesPlayed = value;
return this; return this;
} }
/** /**
* Sets the video frames dropped. * Sets the video frames dropped.
* @param value the video frames dropped. -1 indicates the value is unknown.
*/ */
public @NonNull Builder setVideoFramesDropped(int value) { public @NonNull Builder setVideoFramesDropped(
@IntRange(from = -1, to = Integer.MAX_VALUE) int value) {
mVideoFramesDropped = value; mVideoFramesDropped = value;
return this; return this;
} }
/** /**
* Sets the audio underrun count. * Sets the audio underrun count.
* @param value the audio underrun count. -1 indicates the value is unknown.
*/ */
public @NonNull Builder setAudioUnderrunCount(int value) { public @NonNull Builder setAudioUnderrunCount(
@IntRange(from = -1, to = Integer.MAX_VALUE) int value) {
mAudioUnderrunCount = value; mAudioUnderrunCount = value;
return this; return this;
} }
/** /**
* Sets the number of network bytes read. * Sets the number of network bytes read.
* @param value the number of network bytes read. -1 indicates the value is unknown.
*/ */
public @NonNull Builder setNetworkBytesRead(long value) { public @NonNull Builder setNetworkBytesRead(@IntRange(from = -1) long value) {
mNetworkBytesRead = value; mNetworkBytesRead = value;
return this; return this;
} }
/** /**
* Sets the number of local bytes read. * Sets the number of local bytes read.
* @param value the number of local bytes read. -1 indicates the value is unknown.
*/ */
public @NonNull Builder setLocalBytesRead(long value) { public @NonNull Builder setLocalBytesRead(@IntRange(from = -1) long value) {
mLocalBytesRead = value; mLocalBytesRead = value;
return this; return this;
} }
/** /**
* Sets the network transfer duration in milliseconds. * Sets the network transfer duration in milliseconds.
* @param value the network transfer duration in milliseconds.
* -1 indicates the value is unknown.
*/ */
public @NonNull Builder setNetworkTransferDurationMillis(long value) { public @NonNull Builder setNetworkTransferDurationMillis(@IntRange(from = -1) long value) {
mNetworkTransferDurationMillis = value; mNetworkTransferDurationMillis = value;
return this; return this;
} }

View File

@@ -45,7 +45,6 @@ public final class PlaybackSession implements AutoCloseable {
/** /**
* Reports playback metrics. * Reports playback metrics.
* @hide
*/ */
public void reportPlaybackMetrics(@NonNull PlaybackMetrics metrics) { public void reportPlaybackMetrics(@NonNull PlaybackMetrics metrics) {
mManager.reportPlaybackMetrics(mId, metrics); mManager.reportPlaybackMetrics(mId, metrics);
@@ -60,9 +59,8 @@ public final class PlaybackSession implements AutoCloseable {
/** /**
* Reports network event. * Reports network event.
* @hide
*/ */
public void reportNetworkEvent(NetworkEvent event) { public void reportNetworkEvent(@NonNull NetworkEvent event) {
mManager.reportNetworkEvent(mId, event); mManager.reportNetworkEvent(mId, event);
} }
@@ -75,9 +73,8 @@ public final class PlaybackSession implements AutoCloseable {
/** /**
* Reports track change event. * Reports track change event.
* @hide
*/ */
public void reportTrackChangeEvent(TrackChangeEvent event) { public void reportTrackChangeEvent(@NonNull TrackChangeEvent event) {
mManager.reportTrackChangeEvent(mId, event); mManager.reportTrackChangeEvent(mId, event);
} }

View File

@@ -17,6 +17,7 @@
package android.media.metrics; package android.media.metrics;
import android.annotation.IntDef; import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.os.Parcel; import android.os.Parcel;
@@ -28,20 +29,29 @@ import java.util.Objects;
/** /**
* Playback track change event. * Playback track change event.
* @hide
*/ */
public final class TrackChangeEvent implements Parcelable { public final class TrackChangeEvent extends Event implements Parcelable {
/** The track is off. */
public static final int TRACK_STATE_OFF = 0; public static final int TRACK_STATE_OFF = 0;
/** The track is on. */
public static final int TRACK_STATE_ON = 1; public static final int TRACK_STATE_ON = 1;
/** Unknown track change reason. */
public static final int TRACK_CHANGE_REASON_UNKNOWN = 0; public static final int TRACK_CHANGE_REASON_UNKNOWN = 0;
/** Other track change reason. */
public static final int TRACK_CHANGE_REASON_OTHER = 1; public static final int TRACK_CHANGE_REASON_OTHER = 1;
/** Track change reason for initial state. */
public static final int TRACK_CHANGE_REASON_INITIAL = 2; public static final int TRACK_CHANGE_REASON_INITIAL = 2;
/** Track change reason for manual changes. */
public static final int TRACK_CHANGE_REASON_MANUAL = 3; public static final int TRACK_CHANGE_REASON_MANUAL = 3;
/** Track change reason for adaptive changes. */
public static final int TRACK_CHANGE_REASON_ADAPTIVE = 4; public static final int TRACK_CHANGE_REASON_ADAPTIVE = 4;
/** Audio track. */
public static final int TRACK_TYPE_AUDIO = 0; public static final int TRACK_TYPE_AUDIO = 0;
/** Video track. */
public static final int TRACK_TYPE_VIDEO = 1; public static final int TRACK_TYPE_VIDEO = 1;
/** Text track. */
public static final int TRACK_TYPE_TEXT = 2; public static final int TRACK_TYPE_TEXT = 2;
private final int mState; private final int mState;
@@ -50,7 +60,7 @@ public final class TrackChangeEvent implements Parcelable {
private final @Nullable String mSampleMimeType; private final @Nullable String mSampleMimeType;
private final @Nullable String mCodecName; private final @Nullable String mCodecName;
private final int mBitrate; private final int mBitrate;
private final long mTimeSincePlaybackCreatedMillis; private final long mTimeSinceCreatedMillis;
private final int mType; private final int mType;
private final @Nullable String mLanguage; private final @Nullable String mLanguage;
private final @Nullable String mLanguageRegion; private final @Nullable String mLanguageRegion;
@@ -96,7 +106,7 @@ public final class TrackChangeEvent implements Parcelable {
@Nullable String sampleMimeType, @Nullable String sampleMimeType,
@Nullable String codecName, @Nullable String codecName,
int bitrate, int bitrate,
long timeSincePlaybackCreatedMillis, long timeSinceCreatedMillis,
int type, int type,
@Nullable String language, @Nullable String language,
@Nullable String languageRegion, @Nullable String languageRegion,
@@ -110,7 +120,7 @@ public final class TrackChangeEvent implements Parcelable {
this.mSampleMimeType = sampleMimeType; this.mSampleMimeType = sampleMimeType;
this.mCodecName = codecName; this.mCodecName = codecName;
this.mBitrate = bitrate; this.mBitrate = bitrate;
this.mTimeSincePlaybackCreatedMillis = timeSincePlaybackCreatedMillis; this.mTimeSinceCreatedMillis = timeSinceCreatedMillis;
this.mType = type; this.mType = type;
this.mLanguage = language; this.mLanguage = language;
this.mLanguageRegion = languageRegion; this.mLanguageRegion = languageRegion;
@@ -120,34 +130,60 @@ public final class TrackChangeEvent implements Parcelable {
this.mHeight = height; this.mHeight = height;
} }
/**
* Gets track state.
*/
@TrackState @TrackState
public int getTrackState() { public int getTrackState() {
return mState; return mState;
} }
/**
* Gets track change reason.
*/
@TrackChangeReason @TrackChangeReason
public int getTrackChangeReason() { public int getTrackChangeReason() {
return mReason; return mReason;
} }
/**
* Gets container MIME type.
*/
public @Nullable String getContainerMimeType() { public @Nullable String getContainerMimeType() {
return mContainerMimeType; return mContainerMimeType;
} }
/**
* Gets the MIME type of the video/audio/text samples.
*/
public @Nullable String getSampleMimeType() { public @Nullable String getSampleMimeType() {
return mSampleMimeType; return mSampleMimeType;
} }
/**
* Gets codec name.
*/
public @Nullable String getCodecName() { public @Nullable String getCodecName() {
return mCodecName; return mCodecName;
} }
/**
* Gets bitrate.
* @return the bitrate, or -1 if unknown.
*/
@IntRange(from = -1, to = Integer.MAX_VALUE)
public int getBitrate() { public int getBitrate() {
return mBitrate; return mBitrate;
} }
public long getTimeSincePlaybackCreatedMillis() { /**
return mTimeSincePlaybackCreatedMillis; * Gets timestamp since the creation in milliseconds.
* @return the timestamp since the creation in milliseconds, or -1 if unknown.
*/
@Override
@IntRange(from = -1)
public long getTimeSinceCreatedMillis() {
return mTimeSinceCreatedMillis;
} }
@TrackType @TrackType
@@ -155,26 +191,55 @@ public final class TrackChangeEvent implements Parcelable {
return mType; return mType;
} }
/**
* Gets language code.
* @return a two-letter ISO 639-1 language code.
*/
public @Nullable String getLanguage() { public @Nullable String getLanguage() {
return mLanguage; return mLanguage;
} }
/**
* Gets language region code.
* @return an IETF BCP 47 optional language region subtag based on a two-letter country code.
*/
public @Nullable String getLanguageRegion() { public @Nullable String getLanguageRegion() {
return mLanguageRegion; return mLanguageRegion;
} }
/**
* Gets channel count.
* @return the channel count, or -1 if unknown.
*/
@IntRange(from = -1, to = Integer.MAX_VALUE)
public int getChannelCount() { public int getChannelCount() {
return mChannelCount; return mChannelCount;
} }
/**
* Gets sample rate.
* @return the sample rate, or -1 if unknown.
*/
@IntRange(from = -1, to = Integer.MAX_VALUE)
public int getSampleRate() { public int getSampleRate() {
return mSampleRate; return mSampleRate;
} }
/**
* Gets video width.
* @return the video width, or -1 if unknown.
*/
@IntRange(from = -1, to = Integer.MAX_VALUE)
public int getWidth() { public int getWidth() {
return mWidth; return mWidth;
} }
/**
* Gets video height.
* @return the video height, or -1 if unknown.
*/
@IntRange(from = -1, to = Integer.MAX_VALUE)
public int getHeight() { public int getHeight() {
return mHeight; return mHeight;
} }
@@ -194,7 +259,7 @@ public final class TrackChangeEvent implements Parcelable {
if (mSampleMimeType != null) dest.writeString(mSampleMimeType); if (mSampleMimeType != null) dest.writeString(mSampleMimeType);
if (mCodecName != null) dest.writeString(mCodecName); if (mCodecName != null) dest.writeString(mCodecName);
dest.writeInt(mBitrate); dest.writeInt(mBitrate);
dest.writeLong(mTimeSincePlaybackCreatedMillis); dest.writeLong(mTimeSinceCreatedMillis);
dest.writeInt(mType); dest.writeInt(mType);
if (mLanguage != null) dest.writeString(mLanguage); if (mLanguage != null) dest.writeString(mLanguage);
if (mLanguageRegion != null) dest.writeString(mLanguageRegion); if (mLanguageRegion != null) dest.writeString(mLanguageRegion);
@@ -218,7 +283,7 @@ public final class TrackChangeEvent implements Parcelable {
String sampleMimeType = (flg & 0x8) == 0 ? null : in.readString(); String sampleMimeType = (flg & 0x8) == 0 ? null : in.readString();
String codecName = (flg & 0x10) == 0 ? null : in.readString(); String codecName = (flg & 0x10) == 0 ? null : in.readString();
int bitrate = in.readInt(); int bitrate = in.readInt();
long timeSincePlaybackCreatedMillis = in.readLong(); long timeSinceCreatedMillis = in.readLong();
int type = in.readInt(); int type = in.readInt();
String language = (flg & 0x100) == 0 ? null : in.readString(); String language = (flg & 0x100) == 0 ? null : in.readString();
String languageRegion = (flg & 0x200) == 0 ? null : in.readString(); String languageRegion = (flg & 0x200) == 0 ? null : in.readString();
@@ -233,7 +298,7 @@ public final class TrackChangeEvent implements Parcelable {
this.mSampleMimeType = sampleMimeType; this.mSampleMimeType = sampleMimeType;
this.mCodecName = codecName; this.mCodecName = codecName;
this.mBitrate = bitrate; this.mBitrate = bitrate;
this.mTimeSincePlaybackCreatedMillis = timeSincePlaybackCreatedMillis; this.mTimeSinceCreatedMillis = timeSinceCreatedMillis;
this.mType = type; this.mType = type;
this.mLanguage = language; this.mLanguage = language;
this.mLanguageRegion = languageRegion; this.mLanguageRegion = languageRegion;
@@ -256,38 +321,24 @@ public final class TrackChangeEvent implements Parcelable {
} }
}; };
// Code below generated by codegen v1.0.22.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
//
// To regenerate run:
// $ codegen $ANDROID_BUILD_TOP/frameworks/base/media/java/android/media/metrics/TrackChangeEvent.java
//
// To exclude the generated code from IntelliJ auto-formatting enable (one-time):
// Settings > Editor > Code Style > Formatter Control
//@formatter:off
@Override @Override
public String toString() { public String toString() {
return "TrackChangeEvent { " + return "TrackChangeEvent { "
"state = " + mState + ", " + + "state = " + mState + ", "
"reason = " + mReason + ", " + + "reason = " + mReason + ", "
"containerMimeType = " + mContainerMimeType + ", " + + "containerMimeType = " + mContainerMimeType + ", "
"sampleMimeType = " + mSampleMimeType + ", " + + "sampleMimeType = " + mSampleMimeType + ", "
"codecName = " + mCodecName + ", " + + "codecName = " + mCodecName + ", "
"bitrate = " + mBitrate + ", " + + "bitrate = " + mBitrate + ", "
"timeSincePlaybackCreatedMillis = " + mTimeSincePlaybackCreatedMillis + ", " + + "timeSinceCreatedMillis = " + mTimeSinceCreatedMillis + ", "
"type = " + mType + ", " + + "type = " + mType + ", "
"language = " + mLanguage + ", " + + "language = " + mLanguage + ", "
"languageRegion = " + mLanguageRegion + ", " + + "languageRegion = " + mLanguageRegion + ", "
"channelCount = " + mChannelCount + ", " + + "channelCount = " + mChannelCount + ", "
"sampleRate = " + mSampleRate + ", " + + "sampleRate = " + mSampleRate + ", "
"width = " + mWidth + ", " + + "width = " + mWidth + ", "
"height = " + mHeight + + "height = " + mHeight
" }"; + " }";
} }
@Override @Override
@@ -301,7 +352,7 @@ public final class TrackChangeEvent implements Parcelable {
&& Objects.equals(mSampleMimeType, that.mSampleMimeType) && Objects.equals(mSampleMimeType, that.mSampleMimeType)
&& Objects.equals(mCodecName, that.mCodecName) && Objects.equals(mCodecName, that.mCodecName)
&& mBitrate == that.mBitrate && mBitrate == that.mBitrate
&& mTimeSincePlaybackCreatedMillis == that.mTimeSincePlaybackCreatedMillis && mTimeSinceCreatedMillis == that.mTimeSinceCreatedMillis
&& mType == that.mType && mType == that.mType
&& Objects.equals(mLanguage, that.mLanguage) && Objects.equals(mLanguage, that.mLanguage)
&& Objects.equals(mLanguageRegion, that.mLanguageRegion) && Objects.equals(mLanguageRegion, that.mLanguageRegion)
@@ -314,7 +365,7 @@ public final class TrackChangeEvent implements Parcelable {
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(mState, mReason, mContainerMimeType, mSampleMimeType, mCodecName, return Objects.hash(mState, mReason, mContainerMimeType, mSampleMimeType, mCodecName,
mBitrate, mTimeSincePlaybackCreatedMillis, mType, mLanguage, mLanguageRegion, mBitrate, mTimeSinceCreatedMillis, mType, mLanguage, mLanguageRegion,
mChannelCount, mSampleRate, mWidth, mHeight); mChannelCount, mSampleRate, mWidth, mHeight);
} }
@@ -323,32 +374,33 @@ public final class TrackChangeEvent implements Parcelable {
*/ */
public static final class Builder { public static final class Builder {
// TODO: check track type for the setters. // TODO: check track type for the setters.
private int mState; private int mState = TRACK_STATE_OFF;
private int mReason; private int mReason = TRACK_CHANGE_REASON_UNKNOWN;
private @Nullable String mContainerMimeType; private @Nullable String mContainerMimeType;
private @Nullable String mSampleMimeType; private @Nullable String mSampleMimeType;
private @Nullable String mCodecName; private @Nullable String mCodecName;
private int mBitrate; private int mBitrate = -1;
private long mTimeSincePlaybackCreatedMillis; private long mTimeSinceCreatedMillis = -1;
private int mType; private final int mType;
private @Nullable String mLanguage; private @Nullable String mLanguage;
private @Nullable String mLanguageRegion; private @Nullable String mLanguageRegion;
private int mChannelCount; private int mChannelCount = -1;
private int mSampleRate; private int mSampleRate = -1;
private int mWidth; private int mWidth = -1;
private int mHeight; private int mHeight = -1;
private long mBuilderFieldsSet = 0L; private long mBuilderFieldsSet = 0L;
/** /**
* Creates a new Builder. * Creates a new Builder.
*
* @hide
*/ */
public Builder(int type) { public Builder(int type) {
mType = type; mType = type;
} }
/**
* Sets track state.
*/
public @NonNull Builder setTrackState(@TrackState int value) { public @NonNull Builder setTrackState(@TrackState int value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x1; mBuilderFieldsSet |= 0x1;
@@ -356,6 +408,9 @@ public final class TrackChangeEvent implements Parcelable {
return this; return this;
} }
/**
* Sets track change reason.
*/
public @NonNull Builder setTrackChangeReason(@TrackChangeReason int value) { public @NonNull Builder setTrackChangeReason(@TrackChangeReason int value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x2; mBuilderFieldsSet |= 0x2;
@@ -363,6 +418,9 @@ public final class TrackChangeEvent implements Parcelable {
return this; return this;
} }
/**
* Sets container MIME type.
*/
public @NonNull Builder setContainerMimeType(@NonNull String value) { public @NonNull Builder setContainerMimeType(@NonNull String value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x4; mBuilderFieldsSet |= 0x4;
@@ -370,6 +428,9 @@ public final class TrackChangeEvent implements Parcelable {
return this; return this;
} }
/**
* Sets the MIME type of the video/audio/text samples.
*/
public @NonNull Builder setSampleMimeType(@NonNull String value) { public @NonNull Builder setSampleMimeType(@NonNull String value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x8; mBuilderFieldsSet |= 0x8;
@@ -377,6 +438,9 @@ public final class TrackChangeEvent implements Parcelable {
return this; return this;
} }
/**
* Sets codec name.
*/
public @NonNull Builder setCodecName(@NonNull String value) { public @NonNull Builder setCodecName(@NonNull String value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x10; mBuilderFieldsSet |= 0x10;
@@ -384,27 +448,33 @@ public final class TrackChangeEvent implements Parcelable {
return this; return this;
} }
public @NonNull Builder setBitrate(int value) { /**
* Sets bitrate in bits per second.
* @param value the bitrate in bits per second. -1 indicates the value is unknown.
*/
public @NonNull Builder setBitrate(@IntRange(from = -1, to = Integer.MAX_VALUE) int value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x20; mBuilderFieldsSet |= 0x20;
mBitrate = value; mBitrate = value;
return this; return this;
} }
public @NonNull Builder setTimeSincePlaybackCreatedMillis(long value) { /**
* Sets timestamp since the creation in milliseconds.
* @param value the timestamp since the creation in milliseconds.
* -1 indicates the value is unknown.
*/
public @NonNull Builder setTimeSinceCreatedMillis(@IntRange(from = -1) long value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x40; mBuilderFieldsSet |= 0x40;
mTimeSincePlaybackCreatedMillis = value; mTimeSinceCreatedMillis = value;
return this;
}
public @NonNull Builder setTrackType(@TrackType int value) {
checkNotUsed();
mBuilderFieldsSet |= 0x80;
mType = value;
return this; return this;
} }
/**
* Sets language code.
* @param value a two-letter ISO 639-1 language code.
*/
public @NonNull Builder setLanguage(@NonNull String value) { public @NonNull Builder setLanguage(@NonNull String value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x100; mBuilderFieldsSet |= 0x100;
@@ -412,6 +482,11 @@ public final class TrackChangeEvent implements Parcelable {
return this; return this;
} }
/**
* Sets language region code.
* @param value an IETF BCP 47 optional language region subtag based on a two-letter country
* code.
*/
public @NonNull Builder setLanguageRegion(@NonNull String value) { public @NonNull Builder setLanguageRegion(@NonNull String value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x200; mBuilderFieldsSet |= 0x200;
@@ -419,28 +494,46 @@ public final class TrackChangeEvent implements Parcelable {
return this; return this;
} }
public @NonNull Builder setChannelCount(int value) { /**
* Sets channel count.
* @param value the channel count. -1 indicates the value is unknown.
*/
public @NonNull Builder setChannelCount(
@IntRange(from = -1, to = Integer.MAX_VALUE) int value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x400; mBuilderFieldsSet |= 0x400;
mChannelCount = value; mChannelCount = value;
return this; return this;
} }
public @NonNull Builder setSampleRate(int value) { /**
* Sets sample rate.
* @param value the sample rate. -1 indicates the value is unknown.
*/
public @NonNull Builder setSampleRate(
@IntRange(from = -1, to = Integer.MAX_VALUE) int value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x800; mBuilderFieldsSet |= 0x800;
mSampleRate = value; mSampleRate = value;
return this; return this;
} }
public @NonNull Builder setWidth(int value) { /**
* Sets video width.
* @param value the video width. -1 indicates the value is unknown.
*/
public @NonNull Builder setWidth(@IntRange(from = -1, to = Integer.MAX_VALUE) int value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x1000; mBuilderFieldsSet |= 0x1000;
mWidth = value; mWidth = value;
return this; return this;
} }
public @NonNull Builder setHeight(int value) { /**
* Sets video height.
* @param value the video height. -1 indicates the value is unknown.
*/
public @NonNull Builder setHeight(@IntRange(from = -1, to = Integer.MAX_VALUE) int value) {
checkNotUsed(); checkNotUsed();
mBuilderFieldsSet |= 0x2000; mBuilderFieldsSet |= 0x2000;
mHeight = value; mHeight = value;
@@ -459,7 +552,7 @@ public final class TrackChangeEvent implements Parcelable {
mSampleMimeType, mSampleMimeType,
mCodecName, mCodecName,
mBitrate, mBitrate,
mTimeSincePlaybackCreatedMillis, mTimeSinceCreatedMillis,
mType, mType,
mLanguage, mLanguage,
mLanguageRegion, mLanguageRegion,

View File

@@ -121,8 +121,8 @@ public final class MediaMetricsManagerService extends SystemService {
StatsEvent statsEvent = StatsEvent.newBuilder() StatsEvent statsEvent = StatsEvent.newBuilder()
.setAtomId(321) .setAtomId(321)
.writeString(sessionId) .writeString(sessionId)
.writeInt(event.getType()) .writeInt(event.getNetworkType())
.writeLong(event.getTimeSincePlaybackCreatedMillis()) .writeLong(event.getTimeSinceCreatedMillis())
.usePooledBuffer() .usePooledBuffer()
.build(); .build();
StatsLog.write(statsEvent); StatsLog.write(statsEvent);
@@ -132,7 +132,7 @@ public final class MediaMetricsManagerService extends SystemService {
public void reportTrackChangeEvent( public void reportTrackChangeEvent(
String sessionId, TrackChangeEvent event, int userId) { String sessionId, TrackChangeEvent event, int userId) {
StatsEvent statsEvent = StatsEvent.newBuilder() StatsEvent statsEvent = StatsEvent.newBuilder()
.setAtomId(321) .setAtomId(324)
.writeString(sessionId) .writeString(sessionId)
.writeInt(event.getTrackState()) .writeInt(event.getTrackState())
.writeInt(event.getTrackChangeReason()) .writeInt(event.getTrackChangeReason())
@@ -140,7 +140,7 @@ public final class MediaMetricsManagerService extends SystemService {
.writeString(event.getSampleMimeType()) .writeString(event.getSampleMimeType())
.writeString(event.getCodecName()) .writeString(event.getCodecName())
.writeInt(event.getBitrate()) .writeInt(event.getBitrate())
.writeLong(event.getTimeSincePlaybackCreatedMillis()) .writeLong(event.getTimeSinceCreatedMillis())
.writeInt(event.getTrackType()) .writeInt(event.getTrackType())
.writeString(event.getLanguage()) .writeString(event.getLanguage())
.writeString(event.getLanguageRegion()) .writeString(event.getLanguageRegion())