Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,14 @@ public static String buildTrackName(Format format) {
buildResolutionString(format), buildBitrateString(format)), buildTrackIdString(format)),
buildSampleMimeTypeString(format));
} else if (MimeTypes.isAudio(format.sampleMimeType)) {
trackName = joinWithSeparator(joinWithSeparator(joinWithSeparator(joinWithSeparator(
trackName = joinWithSeparator(joinWithSeparator(joinWithSeparator(joinWithSeparator(joinWithSeparator(
buildLanguageString(format), buildAudioPropertyString(format)),
buildBitrateString(format)), buildTrackIdString(format)),
buildSampleMimeTypeString(format));
buildSampleMimeTypeString(format)), buildLabelString(format));
} else {
trackName = joinWithSeparator(joinWithSeparator(joinWithSeparator(buildLanguageString(format),
trackName = joinWithSeparator(joinWithSeparator(joinWithSeparator(joinWithSeparator(buildLanguageString(format),
buildBitrateString(format)), buildTrackIdString(format)),
buildSampleMimeTypeString(format));
buildSampleMimeTypeString(format)), buildLabelString(format));
}
return trackName.length() == 0 ? "unknown" : trackName;
}
Expand All @@ -65,6 +65,11 @@ private static String buildLanguageString(Format format) {
: format.language;
}

private static String buildLabelString(Format format) {
return TextUtils.isEmpty(format.label) || "und".equals(format.label) ? ""
: format.label;
}

private static String buildBitrateString(Format format) {
return format.bitrate == Format.NO_VALUE ? ""
: String.format(Locale.US, "%.2fMbit", format.bitrate / 1000000f);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,11 @@ public final class Format implements Parcelable {
*/
public final String language;

/**
* The label, or null if unknown or not applicable.
*/
public final String label;

/**
* The Accessibility channel, or {@link #NO_VALUE} if not known or applicable.
*/
Expand All @@ -199,7 +204,7 @@ public static Format createVideoContainerFormat(String id, String containerMimeT
return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, NO_VALUE, width,
height, frameRate, NO_VALUE, NO_VALUE, null, NO_VALUE, null, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, selectionFlags, null, NO_VALUE, OFFSET_SAMPLE_RELATIVE,
initializationData, null, null);
initializationData, null, null, null);
}

public static Format createVideoSampleFormat(String id, String sampleMimeType, String codecs,
Expand All @@ -226,18 +231,18 @@ public static Format createVideoSampleFormat(String id, String sampleMimeType, S
return new Format(id, null, sampleMimeType, codecs, bitrate, maxInputSize, width, height,
frameRate, rotationDegrees, pixelWidthHeightRatio, projectionData, stereoMode,
colorInfo, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, 0, null, NO_VALUE,
OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData, null);
OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData, null, null);
}

// Audio.

public static Format createAudioContainerFormat(String id, String containerMimeType,
String sampleMimeType, String codecs, int bitrate, int channelCount, int sampleRate,
List<byte[]> initializationData, @C.SelectionFlags int selectionFlags, String language) {
List<byte[]> initializationData, @C.SelectionFlags int selectionFlags, String language, String label) {
return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, null, NO_VALUE, null, channelCount, sampleRate,
NO_VALUE, NO_VALUE, NO_VALUE, selectionFlags, language, NO_VALUE, OFFSET_SAMPLE_RELATIVE,
initializationData, null, null);
initializationData, null, null, label);
}

public static Format createAudioSampleFormat(String id, String sampleMimeType, String codecs,
Expand Down Expand Up @@ -265,25 +270,25 @@ public static Format createAudioSampleFormat(String id, String sampleMimeType, S
return new Format(id, null, sampleMimeType, codecs, bitrate, maxInputSize, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, null, NO_VALUE, null, channelCount, sampleRate, pcmEncoding,
encoderDelay, encoderPadding, selectionFlags, language, NO_VALUE, OFFSET_SAMPLE_RELATIVE,
initializationData, drmInitData, metadata);
initializationData, drmInitData, metadata, null);
}

// Text.

public static Format createTextContainerFormat(String id, String containerMimeType,
String sampleMimeType, String codecs, int bitrate, @C.SelectionFlags int selectionFlags,
String language) {
String language, String label) {
return createTextContainerFormat(id, containerMimeType, sampleMimeType, codecs, bitrate,
selectionFlags, language, NO_VALUE);
selectionFlags, language, NO_VALUE, label);
}

public static Format createTextContainerFormat(String id, String containerMimeType,
String sampleMimeType, String codecs, int bitrate, @C.SelectionFlags int selectionFlags,
String language, int accessibilityChannel) {
String language, int accessibilityChannel, String label) {
return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, null, NO_VALUE, null, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, selectionFlags, language, accessibilityChannel,
OFFSET_SAMPLE_RELATIVE, null, null, null);
OFFSET_SAMPLE_RELATIVE, null, null, null, label);
}

public static Format createTextSampleFormat(String id, String sampleMimeType, String codecs,
Expand Down Expand Up @@ -313,7 +318,7 @@ public static Format createTextSampleFormat(String id, String sampleMimeType, St
return new Format(id, null, sampleMimeType, codecs, bitrate, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, null, NO_VALUE, null, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, selectionFlags, language, accessibilityChannel, subsampleOffsetUs,
initializationData, drmInitData, null);
initializationData, drmInitData, null, null);
}

// Image.
Expand All @@ -323,7 +328,7 @@ public static Format createImageSampleFormat(String id, String sampleMimeType, S
return new Format(id, null, sampleMimeType, codecs, bitrate, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, null, NO_VALUE, null, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, 0, language, NO_VALUE, OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData,
null);
null, null);
}

// Generic.
Expand All @@ -334,21 +339,21 @@ public static Format createContainerFormat(String id, String containerMimeType,
return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, null, NO_VALUE, null, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, selectionFlags, language, NO_VALUE, OFFSET_SAMPLE_RELATIVE, null, null,
null);
null, null);
}

public static Format createSampleFormat(String id, String sampleMimeType,
long subsampleOffsetUs) {
return new Format(id, null, sampleMimeType, null, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, null, NO_VALUE, null, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, 0, null, NO_VALUE, subsampleOffsetUs, null, null, null);
NO_VALUE, 0, null, NO_VALUE, subsampleOffsetUs, null, null, null, null);
}

public static Format createSampleFormat(String id, String sampleMimeType, String codecs,
int bitrate, DrmInitData drmInitData) {
return new Format(id, null, sampleMimeType, codecs, bitrate, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, null, NO_VALUE, null, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, 0, null, NO_VALUE, OFFSET_SAMPLE_RELATIVE, null, drmInitData, null);
NO_VALUE, 0, null, NO_VALUE, OFFSET_SAMPLE_RELATIVE, null, drmInitData, null, null);
}

/* package */ Format(String id, String containerMimeType, String sampleMimeType, String codecs,
Expand All @@ -357,7 +362,7 @@ public static Format createSampleFormat(String id, String sampleMimeType, String
ColorInfo colorInfo, int channelCount, int sampleRate, @C.PcmEncoding int pcmEncoding,
int encoderDelay, int encoderPadding, @C.SelectionFlags int selectionFlags, String language,
int accessibilityChannel, long subsampleOffsetUs, List<byte[]> initializationData,
DrmInitData drmInitData, Metadata metadata) {
DrmInitData drmInitData, Metadata metadata, String label) {
this.id = id;
this.containerMimeType = containerMimeType;
this.sampleMimeType = sampleMimeType;
Expand All @@ -379,6 +384,7 @@ public static Format createSampleFormat(String id, String sampleMimeType, String
this.encoderPadding = encoderPadding;
this.selectionFlags = selectionFlags;
this.language = language;
this.label = label;
this.accessibilityChannel = accessibilityChannel;
this.subsampleOffsetUs = subsampleOffsetUs;
this.initializationData = initializationData == null ? Collections.<byte[]>emptyList()
Expand Down Expand Up @@ -411,6 +417,7 @@ public static Format createSampleFormat(String id, String sampleMimeType, String
encoderPadding = in.readInt();
selectionFlags = in.readInt();
language = in.readString();
label = in.readString();
accessibilityChannel = in.readInt();
subsampleOffsetUs = in.readLong();
int initializationDataSize = in.readInt();
Expand All @@ -427,15 +434,15 @@ public Format copyWithMaxInputSize(int maxInputSize) {
width, height, frameRate, rotationDegrees, pixelWidthHeightRatio, projectionData,
stereoMode, colorInfo, channelCount, sampleRate, pcmEncoding, encoderDelay,
encoderPadding, selectionFlags, language, accessibilityChannel, subsampleOffsetUs,
initializationData, drmInitData, metadata);
initializationData, drmInitData, metadata, label);
}

public Format copyWithSubsampleOffsetUs(long subsampleOffsetUs) {
return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, maxInputSize,
width, height, frameRate, rotationDegrees, pixelWidthHeightRatio, projectionData,
stereoMode, colorInfo, channelCount, sampleRate, pcmEncoding, encoderDelay,
encoderPadding, selectionFlags, language, accessibilityChannel, subsampleOffsetUs,
initializationData, drmInitData, metadata);
initializationData, drmInitData, metadata, label);
}

public Format copyWithContainerInfo(String id, String codecs, int bitrate, int width, int height,
Expand All @@ -444,7 +451,7 @@ public Format copyWithContainerInfo(String id, String codecs, int bitrate, int w
width, height, frameRate, rotationDegrees, pixelWidthHeightRatio, projectionData,
stereoMode, colorInfo, channelCount, sampleRate, pcmEncoding, encoderDelay,
encoderPadding, selectionFlags, language, accessibilityChannel, subsampleOffsetUs,
initializationData, drmInitData, metadata);
initializationData, drmInitData, metadata, label);
}

@SuppressWarnings("ReferenceEquality")
Expand All @@ -459,37 +466,38 @@ public Format copyWithManifestFormatInfo(Format manifestFormat) {
float frameRate = this.frameRate == NO_VALUE ? manifestFormat.frameRate : this.frameRate;
@C.SelectionFlags int selectionFlags = this.selectionFlags | manifestFormat.selectionFlags;
String language = this.language == null ? manifestFormat.language : this.language;
String label = this.label == null ? manifestFormat.label : this.label;
DrmInitData drmInitData = manifestFormat.drmInitData != null ? manifestFormat.drmInitData
: this.drmInitData;
return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, maxInputSize, width,
height, frameRate, rotationDegrees, pixelWidthHeightRatio, projectionData, stereoMode,
colorInfo, channelCount, sampleRate, pcmEncoding, encoderDelay, encoderPadding,
selectionFlags, language, accessibilityChannel, subsampleOffsetUs, initializationData,
drmInitData, metadata);
drmInitData, metadata, label);
}

public Format copyWithGaplessInfo(int encoderDelay, int encoderPadding) {
return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, maxInputSize,
width, height, frameRate, rotationDegrees, pixelWidthHeightRatio, projectionData,
stereoMode, colorInfo, channelCount, sampleRate, pcmEncoding, encoderDelay,
encoderPadding, selectionFlags, language, accessibilityChannel, subsampleOffsetUs,
initializationData, drmInitData, metadata);
initializationData, drmInitData, metadata, label);
}

public Format copyWithDrmInitData(DrmInitData drmInitData) {
return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, maxInputSize,
width, height, frameRate, rotationDegrees, pixelWidthHeightRatio, projectionData,
stereoMode, colorInfo, channelCount, sampleRate, pcmEncoding, encoderDelay,
encoderPadding, selectionFlags, language, accessibilityChannel, subsampleOffsetUs,
initializationData, drmInitData, metadata);
initializationData, drmInitData, metadata, label);
}

public Format copyWithMetadata(Metadata metadata) {
return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, maxInputSize,
width, height, frameRate, rotationDegrees, pixelWidthHeightRatio, projectionData,
stereoMode, colorInfo, channelCount, sampleRate, pcmEncoding, encoderDelay,
encoderPadding, selectionFlags, language, accessibilityChannel, subsampleOffsetUs,
initializationData, drmInitData, metadata);
initializationData, drmInitData, metadata, label);
}

/**
Expand Down Expand Up @@ -659,6 +667,9 @@ public static String toLogString(Format format) {
if (format.language != null) {
builder.append(", language=").append(format.language);
}
if (format.label != null) {
builder.append(", label=").append(format.label);
}
return builder.toString();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ protected AdaptationSet parseAdaptationSet(XmlPullParser xpp, String baseUrl,
int audioChannels = Format.NO_VALUE;
int audioSamplingRate = parseInt(xpp, "audioSamplingRate", Format.NO_VALUE);
String language = xpp.getAttributeValue(null, "lang");
String label = xpp.getAttributeValue(null, "label");
ArrayList<SchemeData> drmSchemeDatas = new ArrayList<>();
ArrayList<SchemeValuePair> inbandEventStreams = new ArrayList<>();
ArrayList<SchemeValuePair> accessibilityDescriptors = new ArrayList<>();
Expand Down Expand Up @@ -269,7 +270,7 @@ protected AdaptationSet parseAdaptationSet(XmlPullParser xpp, String baseUrl,
} else if (XmlPullParserUtil.isStartTag(xpp, "Representation")) {
RepresentationInfo representationInfo = parseRepresentation(xpp, baseUrl, mimeType, codecs,
width, height, frameRate, audioChannels, audioSamplingRate, language,
selectionFlags, accessibilityDescriptors, segmentBase);
selectionFlags, accessibilityDescriptors, segmentBase, label);
contentType = checkContentTypeConsistency(contentType,
getContentType(representationInfo.format));
representationInfos.add(representationInfo);
Expand Down Expand Up @@ -429,7 +430,7 @@ protected RepresentationInfo parseRepresentation(XmlPullParser xpp, String baseU
int adaptationSetHeight, float adaptationSetFrameRate, int adaptationSetAudioChannels,
int adaptationSetAudioSamplingRate, String adaptationSetLanguage,
@C.SelectionFlags int adaptationSetSelectionFlags,
List<SchemeValuePair> adaptationSetAccessibilityDescriptors, SegmentBase segmentBase)
List<SchemeValuePair> adaptationSetAccessibilityDescriptors, SegmentBase segmentBase, String label)
throws XmlPullParserException, IOException {
String id = xpp.getAttributeValue(null, "id");
int bandwidth = parseInt(xpp, "bandwidth", Format.NO_VALUE);
Expand Down Expand Up @@ -472,7 +473,7 @@ protected RepresentationInfo parseRepresentation(XmlPullParser xpp, String baseU

Format format = buildFormat(id, mimeType, width, height, frameRate, audioChannels,
audioSamplingRate, bandwidth, adaptationSetLanguage, adaptationSetSelectionFlags,
adaptationSetAccessibilityDescriptors, codecs);
adaptationSetAccessibilityDescriptors, codecs, label);
segmentBase = segmentBase != null ? segmentBase : new SingleSegmentBase();

return new RepresentationInfo(format, baseUrl, segmentBase, drmSchemeDatas, inbandEventStreams);
Expand All @@ -481,15 +482,15 @@ protected RepresentationInfo parseRepresentation(XmlPullParser xpp, String baseU
protected Format buildFormat(String id, String containerMimeType, int width, int height,
float frameRate, int audioChannels, int audioSamplingRate, int bitrate, String language,
@C.SelectionFlags int selectionFlags, List<SchemeValuePair> accessibilityDescriptors,
String codecs) {
String codecs, String label) {
String sampleMimeType = getSampleMimeType(containerMimeType, codecs);
if (sampleMimeType != null) {
if (MimeTypes.isVideo(sampleMimeType)) {
return Format.createVideoContainerFormat(id, containerMimeType, sampleMimeType, codecs,
bitrate, width, height, frameRate, null, selectionFlags);
} else if (MimeTypes.isAudio(sampleMimeType)) {
return Format.createAudioContainerFormat(id, containerMimeType, sampleMimeType, codecs,
bitrate, audioChannels, audioSamplingRate, null, selectionFlags, language);
bitrate, audioChannels, audioSamplingRate, null, selectionFlags, language, label);
} else if (mimeTypeIsRawText(sampleMimeType)) {
int accessibilityChannel;
if (MimeTypes.APPLICATION_CEA608.equals(sampleMimeType)) {
Expand All @@ -500,7 +501,7 @@ protected Format buildFormat(String id, String containerMimeType, int width, int
accessibilityChannel = Format.NO_VALUE;
}
return Format.createTextContainerFormat(id, containerMimeType, sampleMimeType, codecs,
bitrate, selectionFlags, language, accessibilityChannel);
bitrate, selectionFlags, language, accessibilityChannel, label);
}
}
return Format.createContainerFormat(id, containerMimeType, sampleMimeType, codecs, bitrate,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ private static HlsMasterPlaylist parseMasterPlaylist(LineIterator iterator, Stri
switch (parseStringAttr(line, REGEX_TYPE)) {
case TYPE_AUDIO:
format = Format.createAudioContainerFormat(id, MimeTypes.APPLICATION_M3U8, null, null,
Format.NO_VALUE, Format.NO_VALUE, Format.NO_VALUE, null, selectionFlags, language);
Format.NO_VALUE, Format.NO_VALUE, Format.NO_VALUE, null, selectionFlags, language, id);
if (uri == null) {
muxedAudioFormat = format;
} else {
Expand All @@ -200,7 +200,7 @@ private static HlsMasterPlaylist parseMasterPlaylist(LineIterator iterator, Stri
break;
case TYPE_SUBTITLES:
format = Format.createTextContainerFormat(id, MimeTypes.APPLICATION_M3U8,
MimeTypes.TEXT_VTT, null, Format.NO_VALUE, selectionFlags, language);
MimeTypes.TEXT_VTT, null, Format.NO_VALUE, selectionFlags, language, id);
subtitles.add(new HlsMasterPlaylist.HlsUrl(uri, format));
break;
case TYPE_CLOSED_CAPTIONS:
Expand All @@ -218,7 +218,7 @@ private static HlsMasterPlaylist parseMasterPlaylist(LineIterator iterator, Stri
muxedCaptionFormats = new ArrayList<>();
}
muxedCaptionFormats.add(Format.createTextContainerFormat(id, null, mimeType, null,
Format.NO_VALUE, selectionFlags, language, accessibilityChannel));
Format.NO_VALUE, selectionFlags, language, accessibilityChannel,id));
break;
default:
// Do nothing.
Expand Down
Loading