Commit 44046860 by olly Committed by Oliver Woodman

Add Format peak and average bitrate (hidden for now)

Issue: #2863
PiperOrigin-RevId: 294531127
parent 1cbe3f72
...@@ -56,7 +56,43 @@ public final class Format implements Parcelable { ...@@ -56,7 +56,43 @@ public final class Format implements Parcelable {
/** Track role flags. */ /** Track role flags. */
@C.RoleFlags public final int roleFlags; @C.RoleFlags public final int roleFlags;
/** /**
* The average bandwidth in bits per second, or {@link #NO_VALUE} if unknown or not applicable. * The average bitrate in bits per second, or {@link #NO_VALUE} if unknown or not applicable. This
* field may be populated from the following sources, depending on media type and the type of the
* track within the media:
*
* <ul>
* <li>DASH: Always {@link Format#NO_VALUE}.
* <li>HLS: The {@code AVERAGE-BANDWIDTH} attribute defined on the corresponding {@code
* EXT-X-STREAM-INF} tag in the master playlist, or {@link Format#NO_VALUE} if not present.
* <li>SmoothStreaming: The {@code Bitrate} attribute defined on the corresponding {@code
* TrackElement} in the manifest, or {@link Format#NO_VALUE} if not present.
* <li>Progressive container formats: Often {@link Format#NO_VALUE}, but may be populated with
* the average bitrate if defined by the container.
* </ul>
*/
// TODO: Make public.
private final int averageBitrate;
/**
* The peak bitrate in bits per second, or {@link #NO_VALUE} if unknown or not applicable. This
* field may be populated from the following sources, depending on media type and the type of the
* track within the media:
*
* <ul>
* <li>DASH: The {@code @bandwidth} attribute of the corresponding {@code Representation}
* element in the manifest.
* <li>HLS: The {@code BANDWIDTH} attribute defined on the corresponding {@code
* EXT-X-STREAM-INF} tag.
* <li>SmoothStreaming: Always {@link Format#NO_VALUE}.
* <li>Progressive container formats: Often {@link Format#NO_VALUE}, but may be populated with
* the peak bitrate if defined by the container.
* </ul>
*/
// TODO: Make public.
private final int peakBitrate;
/**
* The bitrate in bits per second. This is the peak bitrate if known, or else the average bitrate
* if known, or else {@link Format#NO_VALUE}. Equivalent to: {@code peakBitrate != NO_VALUE ?
* peakBitrate : averageBitrate}.
*/ */
public final int bitrate; public final int bitrate;
/** Codecs of the format as described in RFC 6381, or null if unknown or not applicable. */ /** Codecs of the format as described in RFC 6381, or null if unknown or not applicable. */
...@@ -190,7 +226,8 @@ public final class Format implements Parcelable { ...@@ -190,7 +226,8 @@ public final class Format implements Parcelable {
/* language= */ null, /* language= */ null,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, /* averageBitrate= */ bitrate,
/* peakBitrate= */ bitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -295,7 +332,8 @@ public final class Format implements Parcelable { ...@@ -295,7 +332,8 @@ public final class Format implements Parcelable {
/* language= */ null, /* language= */ null,
/* selectionFlags= */ 0, /* selectionFlags= */ 0,
/* roleFlags= */ 0, /* roleFlags= */ 0,
bitrate, /* averageBitrate= */ bitrate,
/* peakBitrate= */ bitrate,
codecs, codecs,
/* metadata= */ null, /* metadata= */ null,
/* containerMimeType= */ null, /* containerMimeType= */ null,
...@@ -343,7 +381,8 @@ public final class Format implements Parcelable { ...@@ -343,7 +381,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, /* averageBitrate= */ bitrate,
/* peakBitrate= */ bitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -449,7 +488,8 @@ public final class Format implements Parcelable { ...@@ -449,7 +488,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
/* roleFlags= */ 0, /* roleFlags= */ 0,
bitrate, /* averageBitrate= */ bitrate,
/* peakBitrate= */ bitrate,
codecs, codecs,
metadata, metadata,
/* containerMimeType= */ null, /* containerMimeType= */ null,
...@@ -517,7 +557,8 @@ public final class Format implements Parcelable { ...@@ -517,7 +557,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, /* averageBitrate= */ bitrate,
/* peakBitrate= */ bitrate,
codecs, codecs,
/* metadata= */ null, /* metadata= */ null,
containerMimeType, containerMimeType,
...@@ -572,7 +613,8 @@ public final class Format implements Parcelable { ...@@ -572,7 +613,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
/* roleFlags= */ 0, /* roleFlags= */ 0,
/* bitrate= */ NO_VALUE, /* averageBitrate= */ NO_VALUE,
/* peakBitrate= */ NO_VALUE,
/* codecs= */ null, /* codecs= */ null,
/* metadata= */ null, /* metadata= */ null,
/* containerMimeType= */ null, /* containerMimeType= */ null,
...@@ -612,7 +654,8 @@ public final class Format implements Parcelable { ...@@ -612,7 +654,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
/* roleFlags= */ 0, /* roleFlags= */ 0,
/* bitrate= */ NO_VALUE, /* averageBitrate= */ NO_VALUE,
/* peakBitrate= */ NO_VALUE,
/* codecs= */ null, /* codecs= */ null,
/* metadata=*/ null, /* metadata=*/ null,
/* containerMimeType= */ null, /* containerMimeType= */ null,
...@@ -656,7 +699,8 @@ public final class Format implements Parcelable { ...@@ -656,7 +699,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, /* averageBitrate= */ bitrate,
/* peakBitrate= */ bitrate,
codecs, codecs,
/* metadata= */ null, /* metadata= */ null,
containerMimeType, containerMimeType,
...@@ -689,7 +733,8 @@ public final class Format implements Parcelable { ...@@ -689,7 +733,8 @@ public final class Format implements Parcelable {
/* language= */ null, /* language= */ null,
/* selectionFlags= */ 0, /* selectionFlags= */ 0,
/* roleFlags= */ 0, /* roleFlags= */ 0,
/* bitrate= */ NO_VALUE, /* averageBitrate= */ NO_VALUE,
/* peakBitrate= */ NO_VALUE,
/* codecs= */ null, /* codecs= */ null,
/* metadata= */ null, /* metadata= */ null,
/* containerMimeType= */ null, /* containerMimeType= */ null,
...@@ -721,7 +766,8 @@ public final class Format implements Parcelable { ...@@ -721,7 +766,8 @@ public final class Format implements Parcelable {
@Nullable String language, @Nullable String language,
@C.SelectionFlags int selectionFlags, @C.SelectionFlags int selectionFlags,
@C.RoleFlags int roleFlags, @C.RoleFlags int roleFlags,
int bitrate, int averageBitrate,
int peakBitrate,
@Nullable String codecs, @Nullable String codecs,
@Nullable Metadata metadata, @Nullable Metadata metadata,
// Container specific. // Container specific.
...@@ -756,7 +802,9 @@ public final class Format implements Parcelable { ...@@ -756,7 +802,9 @@ public final class Format implements Parcelable {
this.language = Util.normalizeLanguageCode(language); this.language = Util.normalizeLanguageCode(language);
this.selectionFlags = selectionFlags; this.selectionFlags = selectionFlags;
this.roleFlags = roleFlags; this.roleFlags = roleFlags;
this.bitrate = bitrate; this.averageBitrate = averageBitrate;
this.peakBitrate = peakBitrate;
this.bitrate = peakBitrate != NO_VALUE ? peakBitrate : averageBitrate;
this.codecs = codecs; this.codecs = codecs;
this.metadata = metadata; this.metadata = metadata;
// Container specific. // Container specific.
...@@ -796,7 +844,9 @@ public final class Format implements Parcelable { ...@@ -796,7 +844,9 @@ public final class Format implements Parcelable {
language = in.readString(); language = in.readString();
selectionFlags = in.readInt(); selectionFlags = in.readInt();
roleFlags = in.readInt(); roleFlags = in.readInt();
bitrate = in.readInt(); averageBitrate = in.readInt();
peakBitrate = in.readInt();
bitrate = peakBitrate != NO_VALUE ? peakBitrate : averageBitrate;
codecs = in.readString(); codecs = in.readString();
metadata = in.readParcelable(Metadata.class.getClassLoader()); metadata = in.readParcelable(Metadata.class.getClassLoader());
// Container specific. // Container specific.
...@@ -840,7 +890,8 @@ public final class Format implements Parcelable { ...@@ -840,7 +890,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, averageBitrate,
peakBitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -873,7 +924,8 @@ public final class Format implements Parcelable { ...@@ -873,7 +924,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, averageBitrate,
peakBitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -906,7 +958,8 @@ public final class Format implements Parcelable { ...@@ -906,7 +958,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, averageBitrate,
peakBitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -955,7 +1008,8 @@ public final class Format implements Parcelable { ...@@ -955,7 +1008,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, /* averageBitrate= */ bitrate,
/* peakBitrate= */ bitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -1002,12 +1056,14 @@ public final class Format implements Parcelable { ...@@ -1002,12 +1056,14 @@ public final class Format implements Parcelable {
} }
// Prefer sample format values, but fill in from manifest if missing. // Prefer sample format values, but fill in from manifest if missing.
int bitrate = this.bitrate == NO_VALUE ? manifestFormat.bitrate : this.bitrate; int averageBitrate =
this.averageBitrate == NO_VALUE ? manifestFormat.averageBitrate : this.averageBitrate;
int peakBitrate = this.peakBitrate == NO_VALUE ? manifestFormat.peakBitrate : this.peakBitrate;
@Nullable String codecs = this.codecs; @Nullable String codecs = this.codecs;
if (codecs == null) { if (codecs == null) {
// The manifest format may be muxed, so filter only codecs of this format's type. If we still // The manifest format may be muxed, so filter only codecs of this format's type. If we still
// have more than one codec then we're unable to uniquely identify which codec to fill in. // have more than one codec then we're unable to uniquely identify which codec to fill in.
String codecsOfType = Util.getCodecsOfType(manifestFormat.codecs, trackType); @Nullable String codecsOfType = Util.getCodecsOfType(manifestFormat.codecs, trackType);
if (Util.splitCodecs(codecsOfType).length == 1) { if (Util.splitCodecs(codecsOfType).length == 1) {
codecs = codecsOfType; codecs = codecsOfType;
} }
...@@ -1037,7 +1093,8 @@ public final class Format implements Parcelable { ...@@ -1037,7 +1093,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, averageBitrate,
peakBitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -1070,7 +1127,8 @@ public final class Format implements Parcelable { ...@@ -1070,7 +1127,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, averageBitrate,
peakBitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -1103,7 +1161,8 @@ public final class Format implements Parcelable { ...@@ -1103,7 +1161,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, averageBitrate,
peakBitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -1149,7 +1208,8 @@ public final class Format implements Parcelable { ...@@ -1149,7 +1208,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, averageBitrate,
peakBitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -1182,7 +1242,8 @@ public final class Format implements Parcelable { ...@@ -1182,7 +1242,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, averageBitrate,
peakBitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -1215,7 +1276,8 @@ public final class Format implements Parcelable { ...@@ -1215,7 +1276,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, averageBitrate,
peakBitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -1248,7 +1310,8 @@ public final class Format implements Parcelable { ...@@ -1248,7 +1310,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, averageBitrate,
peakBitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -1282,7 +1345,8 @@ public final class Format implements Parcelable { ...@@ -1282,7 +1345,8 @@ public final class Format implements Parcelable {
language, language,
selectionFlags, selectionFlags,
roleFlags, roleFlags,
bitrate, averageBitrate,
peakBitrate,
codecs, codecs,
metadata, metadata,
containerMimeType, containerMimeType,
...@@ -1505,7 +1569,8 @@ public final class Format implements Parcelable { ...@@ -1505,7 +1569,8 @@ public final class Format implements Parcelable {
dest.writeString(language); dest.writeString(language);
dest.writeInt(selectionFlags); dest.writeInt(selectionFlags);
dest.writeInt(roleFlags); dest.writeInt(roleFlags);
dest.writeInt(bitrate); dest.writeInt(averageBitrate);
dest.writeInt(peakBitrate);
dest.writeString(codecs); dest.writeString(codecs);
dest.writeParcelable(metadata, 0); dest.writeParcelable(metadata, 0);
// Container specific. // Container specific.
......
...@@ -69,7 +69,8 @@ public final class FormatTest { ...@@ -69,7 +69,8 @@ public final class FormatTest {
"language", "language",
C.SELECTION_FLAG_DEFAULT, C.SELECTION_FLAG_DEFAULT,
C.ROLE_FLAG_MAIN, C.ROLE_FLAG_MAIN,
/* bitrate= */ 1024, /* averageBitrate= */ 1024,
/* peakBitrate= */ 2048,
"codec", "codec",
metadata, metadata,
/* containerMimeType= */ MimeTypes.VIDEO_MP4, /* containerMimeType= */ MimeTypes.VIDEO_MP4,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment