Pass role and accessibility descriptor values from adaptation set to format

This commit is contained in:
Arnold Szabo 2019-02-27 23:53:52 +02:00
parent 8746d4a885
commit 06ed877845
3 changed files with 111 additions and 5 deletions

View File

@ -167,6 +167,16 @@ public final class Format implements Parcelable {
*/ */
public final int accessibilityChannel; public final int accessibilityChannel;
/**
* The Role descriptor value.
*/
public final String role;
/**
* The Accessibility descriptor value.
*/
public final String accessibility;
// Lazily initialized hashcode. // Lazily initialized hashcode.
private int hashCode; private int hashCode;
@ -234,6 +244,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
/* language= */ null, /* language= */ null,
/* accessibilityChannel= */ NO_VALUE, /* accessibilityChannel= */ NO_VALUE,
/* role= */ null,
/* accessibility= */ null,
OFFSET_SAMPLE_RELATIVE, OFFSET_SAMPLE_RELATIVE,
initializationData, initializationData,
/* drmInitData= */ null, /* drmInitData= */ null,
@ -337,6 +349,8 @@ public final class Format implements Parcelable {
/* selectionFlags= */ 0, /* selectionFlags= */ 0,
/* language= */ null, /* language= */ null,
/* accessibilityChannel= */ NO_VALUE, /* accessibilityChannel= */ NO_VALUE,
/* role= */ null,
/* accessibility= */ null,
OFFSET_SAMPLE_RELATIVE, OFFSET_SAMPLE_RELATIVE,
initializationData, initializationData,
drmInitData, drmInitData,
@ -407,6 +421,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
/* accessibilityChannel= */ NO_VALUE, /* accessibilityChannel= */ NO_VALUE,
/* role= */ null,
/* accessibility= */ null,
OFFSET_SAMPLE_RELATIVE, OFFSET_SAMPLE_RELATIVE,
initializationData, initializationData,
/* drmInitData= */ null, /* drmInitData= */ null,
@ -511,6 +527,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
/* accessibilityChannel= */ NO_VALUE, /* accessibilityChannel= */ NO_VALUE,
/* role= */ null,
/* accessibility= */ null,
OFFSET_SAMPLE_RELATIVE, OFFSET_SAMPLE_RELATIVE,
initializationData, initializationData,
drmInitData, drmInitData,
@ -557,7 +575,9 @@ public final class Format implements Parcelable {
bitrate, bitrate,
selectionFlags, selectionFlags,
language, language,
/* accessibilityChannel= */ NO_VALUE); /* accessibilityChannel= */ NO_VALUE,
/* role= */ null,
/* accessibility= */ null);
} }
public static Format createTextContainerFormat( public static Format createTextContainerFormat(
@ -569,7 +589,9 @@ public final class Format implements Parcelable {
int bitrate, int bitrate,
@C.SelectionFlags int selectionFlags, @C.SelectionFlags int selectionFlags,
@Nullable String language, @Nullable String language,
int accessibilityChannel) { int accessibilityChannel,
@Nullable String role,
@Nullable String accessibility) {
return new Format( return new Format(
id, id,
label, label,
@ -594,6 +616,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
accessibilityChannel, accessibilityChannel,
role,
accessibility,
OFFSET_SAMPLE_RELATIVE, OFFSET_SAMPLE_RELATIVE,
/* initializationData= */ null, /* initializationData= */ null,
/* drmInitData= */ null, /* drmInitData= */ null,
@ -706,6 +730,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
accessibilityChannel, accessibilityChannel,
/* role= */ null,
/* accessibility= */ null,
subsampleOffsetUs, subsampleOffsetUs,
initializationData, initializationData,
drmInitData, drmInitData,
@ -747,6 +773,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
/* accessibilityChannel= */ NO_VALUE, /* accessibilityChannel= */ NO_VALUE,
/* role= */ null,
/* accessibility= */ null,
OFFSET_SAMPLE_RELATIVE, OFFSET_SAMPLE_RELATIVE,
initializationData, initializationData,
drmInitData, drmInitData,
@ -808,6 +836,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
/* accessibilityChannel= */ NO_VALUE, /* accessibilityChannel= */ NO_VALUE,
/* role= */ null,
/* accessibility= */ null,
OFFSET_SAMPLE_RELATIVE, OFFSET_SAMPLE_RELATIVE,
/* initializationData= */ null, /* initializationData= */ null,
/* drmInitData= */ null, /* drmInitData= */ null,
@ -840,6 +870,8 @@ public final class Format implements Parcelable {
/* selectionFlags= */ 0, /* selectionFlags= */ 0,
/* language= */ null, /* language= */ null,
/* accessibilityChannel= */ NO_VALUE, /* accessibilityChannel= */ NO_VALUE,
/* role= */ null,
/* accessibility= */ null,
subsampleOffsetUs, subsampleOffsetUs,
/* initializationData= */ null, /* initializationData= */ null,
/* drmInitData= */ null, /* drmInitData= */ null,
@ -876,6 +908,8 @@ public final class Format implements Parcelable {
/* selectionFlags= */ 0, /* selectionFlags= */ 0,
/* language= */ null, /* language= */ null,
/* accessibilityChannel= */ NO_VALUE, /* accessibilityChannel= */ NO_VALUE,
/* role= */ null,
/* accessibility= */ null,
OFFSET_SAMPLE_RELATIVE, OFFSET_SAMPLE_RELATIVE,
/* initializationData= */ null, /* initializationData= */ null,
drmInitData, drmInitData,
@ -906,6 +940,8 @@ public final class Format implements Parcelable {
@C.SelectionFlags int selectionFlags, @C.SelectionFlags int selectionFlags,
@Nullable String language, @Nullable String language,
int accessibilityChannel, int accessibilityChannel,
@Nullable String role,
@Nullable String accessibility,
long subsampleOffsetUs, long subsampleOffsetUs,
@Nullable List<byte[]> initializationData, @Nullable List<byte[]> initializationData,
@Nullable DrmInitData drmInitData, @Nullable DrmInitData drmInitData,
@ -934,6 +970,8 @@ public final class Format implements Parcelable {
this.selectionFlags = selectionFlags; this.selectionFlags = selectionFlags;
this.language = Util.normalizeLanguageCode(language); this.language = Util.normalizeLanguageCode(language);
this.accessibilityChannel = accessibilityChannel; this.accessibilityChannel = accessibilityChannel;
this.role = role;
this.accessibility = accessibility;
this.subsampleOffsetUs = subsampleOffsetUs; this.subsampleOffsetUs = subsampleOffsetUs;
this.initializationData = this.initializationData =
initializationData == null ? Collections.emptyList() : initializationData; initializationData == null ? Collections.emptyList() : initializationData;
@ -967,6 +1005,8 @@ public final class Format implements Parcelable {
selectionFlags = in.readInt(); selectionFlags = in.readInt();
language = in.readString(); language = in.readString();
accessibilityChannel = in.readInt(); accessibilityChannel = in.readInt();
role = in.readString();
accessibility = in.readString();
subsampleOffsetUs = in.readLong(); subsampleOffsetUs = in.readLong();
int initializationDataSize = in.readInt(); int initializationDataSize = in.readInt();
initializationData = new ArrayList<>(initializationDataSize); initializationData = new ArrayList<>(initializationDataSize);
@ -1002,6 +1042,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
accessibilityChannel, accessibilityChannel,
role,
accessibility,
subsampleOffsetUs, subsampleOffsetUs,
initializationData, initializationData,
drmInitData, drmInitData,
@ -1033,6 +1075,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
accessibilityChannel, accessibilityChannel,
role,
accessibility,
subsampleOffsetUs, subsampleOffsetUs,
initializationData, initializationData,
drmInitData, drmInitData,
@ -1073,6 +1117,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
accessibilityChannel, accessibilityChannel,
role,
accessibility,
subsampleOffsetUs, subsampleOffsetUs,
initializationData, initializationData,
drmInitData, drmInitData,
@ -1144,6 +1190,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
accessibilityChannel, accessibilityChannel,
role,
accessibility,
subsampleOffsetUs, subsampleOffsetUs,
initializationData, initializationData,
drmInitData, drmInitData,
@ -1175,6 +1223,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
accessibilityChannel, accessibilityChannel,
role,
accessibility,
subsampleOffsetUs, subsampleOffsetUs,
initializationData, initializationData,
drmInitData, drmInitData,
@ -1206,6 +1256,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
accessibilityChannel, accessibilityChannel,
role,
accessibility,
subsampleOffsetUs, subsampleOffsetUs,
initializationData, initializationData,
drmInitData, drmInitData,
@ -1237,6 +1289,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
accessibilityChannel, accessibilityChannel,
role,
accessibility,
subsampleOffsetUs, subsampleOffsetUs,
initializationData, initializationData,
drmInitData, drmInitData,
@ -1268,6 +1322,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
accessibilityChannel, accessibilityChannel,
role,
accessibility,
subsampleOffsetUs, subsampleOffsetUs,
initializationData, initializationData,
drmInitData, drmInitData,
@ -1299,6 +1355,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
accessibilityChannel, accessibilityChannel,
role,
accessibility,
subsampleOffsetUs, subsampleOffsetUs,
initializationData, initializationData,
drmInitData, drmInitData,
@ -1330,6 +1388,8 @@ public final class Format implements Parcelable {
selectionFlags, selectionFlags,
language, language,
accessibilityChannel, accessibilityChannel,
role,
accessibility,
subsampleOffsetUs, subsampleOffsetUs,
initializationData, initializationData,
drmInitData, drmInitData,
@ -1439,6 +1499,8 @@ public final class Format implements Parcelable {
&& Util.areEqual(label, other.label) && Util.areEqual(label, other.label)
&& Util.areEqual(language, other.language) && Util.areEqual(language, other.language)
&& accessibilityChannel == other.accessibilityChannel && accessibilityChannel == other.accessibilityChannel
&& Util.areEqual(role, other.role)
&& Util.areEqual(accessibility, other.accessibility)
&& Util.areEqual(containerMimeType, other.containerMimeType) && Util.areEqual(containerMimeType, other.containerMimeType)
&& Util.areEqual(sampleMimeType, other.sampleMimeType) && Util.areEqual(sampleMimeType, other.sampleMimeType)
&& Util.areEqual(codecs, other.codecs) && Util.areEqual(codecs, other.codecs)
@ -1540,6 +1602,8 @@ public final class Format implements Parcelable {
dest.writeInt(selectionFlags); dest.writeInt(selectionFlags);
dest.writeString(language); dest.writeString(language);
dest.writeInt(accessibilityChannel); dest.writeInt(accessibilityChannel);
dest.writeString(role);
dest.writeString(accessibility);
dest.writeLong(subsampleOffsetUs); dest.writeLong(subsampleOffsetUs);
int initializationDataSize = initializationData.size(); int initializationDataSize = initializationData.size();
dest.writeInt(initializationDataSize); dest.writeInt(initializationDataSize);

View File

@ -276,6 +276,7 @@ public class DashManifestParser extends DefaultHandler
ArrayList<SchemeData> drmSchemeDatas = new ArrayList<>(); ArrayList<SchemeData> drmSchemeDatas = new ArrayList<>();
ArrayList<Descriptor> inbandEventStreams = new ArrayList<>(); ArrayList<Descriptor> inbandEventStreams = new ArrayList<>();
ArrayList<Descriptor> accessibilityDescriptors = new ArrayList<>(); ArrayList<Descriptor> accessibilityDescriptors = new ArrayList<>();
ArrayList<Descriptor> roleDescriptors = new ArrayList<>();
ArrayList<Descriptor> supplementalProperties = new ArrayList<>(); ArrayList<Descriptor> supplementalProperties = new ArrayList<>();
List<RepresentationInfo> representationInfos = new ArrayList<>(); List<RepresentationInfo> representationInfos = new ArrayList<>();
@C.SelectionFlags int selectionFlags = 0; @C.SelectionFlags int selectionFlags = 0;
@ -300,7 +301,10 @@ public class DashManifestParser extends DefaultHandler
language = checkLanguageConsistency(language, xpp.getAttributeValue(null, "lang")); language = checkLanguageConsistency(language, xpp.getAttributeValue(null, "lang"));
contentType = checkContentTypeConsistency(contentType, parseContentType(xpp)); contentType = checkContentTypeConsistency(contentType, parseContentType(xpp));
} else if (XmlPullParserUtil.isStartTag(xpp, "Role")) { } else if (XmlPullParserUtil.isStartTag(xpp, "Role")) {
selectionFlags |= parseRole(xpp); Descriptor descriptor = parseDescriptor(xpp, "Role");
selectionFlags |= "urn:mpeg:dash:role:2011".equals(descriptor.schemeIdUri)
&& "main".equals(descriptor.value) ? C.SELECTION_FLAG_DEFAULT : 0;
roleDescriptors.add(descriptor);
} else if (XmlPullParserUtil.isStartTag(xpp, "AudioChannelConfiguration")) { } else if (XmlPullParserUtil.isStartTag(xpp, "AudioChannelConfiguration")) {
audioChannels = parseAudioChannelConfiguration(xpp); audioChannels = parseAudioChannelConfiguration(xpp);
} else if (XmlPullParserUtil.isStartTag(xpp, "Accessibility")) { } else if (XmlPullParserUtil.isStartTag(xpp, "Accessibility")) {
@ -322,6 +326,7 @@ public class DashManifestParser extends DefaultHandler
audioSamplingRate, audioSamplingRate,
language, language,
selectionFlags, selectionFlags,
roleDescriptors,
accessibilityDescriptors, accessibilityDescriptors,
segmentBase); segmentBase);
contentType = checkContentTypeConsistency(contentType, contentType = checkContentTypeConsistency(contentType,
@ -509,6 +514,7 @@ public class DashManifestParser extends DefaultHandler
int adaptationSetAudioSamplingRate, int adaptationSetAudioSamplingRate,
String adaptationSetLanguage, String adaptationSetLanguage,
@C.SelectionFlags int adaptationSetSelectionFlags, @C.SelectionFlags int adaptationSetSelectionFlags,
List<Descriptor> adaptationSetRoleDescriptors,
List<Descriptor> adaptationSetAccessibilityDescriptors, List<Descriptor> adaptationSetAccessibilityDescriptors,
SegmentBase segmentBase) SegmentBase segmentBase)
throws XmlPullParserException, IOException { throws XmlPullParserException, IOException {
@ -573,6 +579,7 @@ public class DashManifestParser extends DefaultHandler
bandwidth, bandwidth,
adaptationSetLanguage, adaptationSetLanguage,
adaptationSetSelectionFlags, adaptationSetSelectionFlags,
adaptationSetRoleDescriptors,
adaptationSetAccessibilityDescriptors, adaptationSetAccessibilityDescriptors,
codecs, codecs,
supplementalProperties); supplementalProperties);
@ -594,6 +601,7 @@ public class DashManifestParser extends DefaultHandler
int bitrate, int bitrate,
String language, String language,
@C.SelectionFlags int selectionFlags, @C.SelectionFlags int selectionFlags,
List<Descriptor> roleDescriptors,
List<Descriptor> accessibilityDescriptors, List<Descriptor> accessibilityDescriptors,
String codecs, String codecs,
List<Descriptor> supplementalProperties) { List<Descriptor> supplementalProperties) {
@ -637,6 +645,10 @@ public class DashManifestParser extends DefaultHandler
} else { } else {
accessibilityChannel = Format.NO_VALUE; accessibilityChannel = Format.NO_VALUE;
} }
String role = parseRole(roleDescriptors);
String accessibility = parseAccessibility(accessibilityDescriptors);
return Format.createTextContainerFormat( return Format.createTextContainerFormat(
id, id,
label, label,
@ -646,7 +658,9 @@ public class DashManifestParser extends DefaultHandler
bitrate, bitrate,
selectionFlags, selectionFlags,
language, language,
accessibilityChannel); accessibilityChannel,
role,
accessibility);
} }
} }
return Format.createContainerFormat( return Format.createContainerFormat(
@ -1266,6 +1280,32 @@ public class DashManifestParser extends DefaultHandler
return MimeTypes.AUDIO_E_AC3; return MimeTypes.AUDIO_E_AC3;
} }
protected static String parseRole(List<Descriptor> roleDescriptors) {
for (int i = 0; i < roleDescriptors.size(); i++) {
Descriptor descriptor = roleDescriptors.get(i);
if ("urn:mpeg:dash:role:2011".equals(descriptor.schemeIdUri) && descriptor.value != null) {
return descriptor.value;
}
}
return null;
}
protected static String parseAccessibility(List<Descriptor> accessibilityDescriptors) {
for (int i = 0; i < accessibilityDescriptors.size(); i++) {
Descriptor descriptor = accessibilityDescriptors.get(i);
if ("urn:mpeg:dash:role:2011".equals(descriptor.schemeIdUri) && descriptor.value != null) {
return descriptor.value;
}
if ("urn:tva:metadata:cs:AudioPurposeCS:2007".equals(descriptor.schemeIdUri)) {
if ("1".equals(descriptor.value) || "2".equals(descriptor.value)) {
return descriptor.value;
}
}
}
return null;
}
protected static float parseFrameRate(XmlPullParser xpp, float defaultValue) { protected static float parseFrameRate(XmlPullParser xpp, float defaultValue) {
float frameRate = defaultValue; float frameRate = defaultValue;
String frameRateAttribute = xpp.getAttributeValue(null, "frameRate"); String frameRateAttribute = xpp.getAttributeValue(null, "frameRate");

View File

@ -405,7 +405,9 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
/* bitrate= */ Format.NO_VALUE, /* bitrate= */ Format.NO_VALUE,
selectionFlags, selectionFlags,
language, language,
accessibilityChannel)); accessibilityChannel,
/* role= */ null,
/* accessibility= */ null));
break; break;
default: default:
// Do nothing. // Do nothing.