mirror of
https://github.com/samsonjs/media.git
synced 2026-03-25 09:25:53 +00:00
Parse DASH forced_subtitle role
#minor-release Issue: #8781 PiperOrigin-RevId: 368212289
This commit is contained in:
parent
472b44f45a
commit
84282d7c32
4 changed files with 33 additions and 7 deletions
|
|
@ -127,6 +127,9 @@
|
|||
* Metadata:
|
||||
* Ensure that timed metadata near the end of a period is not dropped
|
||||
([#8710](https://github.com/google/ExoPlayer/issues/8710)).
|
||||
* DASH:
|
||||
* Parse `forced_subtitle` role from DASH manifests
|
||||
([#8781](https://github.com/google/ExoPlayer/issues/8781)).
|
||||
* MediaSession extension: Remove dependency to core module and rely on common
|
||||
only. The `TimelineQueueEditor` uses a new `MediaDescriptionConverter` for
|
||||
this purpose and does not rely on the `ConcatenatingMediaSource` anymore.
|
||||
|
|
|
|||
|
|
@ -1391,15 +1391,31 @@ public class DashManifestParser extends DefaultHandler
|
|||
|
||||
// Selection flag parsing.
|
||||
|
||||
@C.SelectionFlags
|
||||
protected int parseSelectionFlagsFromRoleDescriptors(List<Descriptor> roleDescriptors) {
|
||||
@C.SelectionFlags int result = 0;
|
||||
for (int i = 0; i < roleDescriptors.size(); i++) {
|
||||
Descriptor descriptor = roleDescriptors.get(i);
|
||||
if (Ascii.equalsIgnoreCase("urn:mpeg:dash:role:2011", descriptor.schemeIdUri)
|
||||
&& "main".equals(descriptor.value)) {
|
||||
return C.SELECTION_FLAG_DEFAULT;
|
||||
if (Ascii.equalsIgnoreCase("urn:mpeg:dash:role:2011", descriptor.schemeIdUri)) {
|
||||
result |= parseSelectionFlagsFromDashRoleScheme(descriptor.value);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
@C.SelectionFlags
|
||||
protected int parseSelectionFlagsFromDashRoleScheme(@Nullable String value) {
|
||||
if (value == null) {
|
||||
return 0;
|
||||
}
|
||||
switch (value) {
|
||||
case "main":
|
||||
return C.SELECTION_FLAG_DEFAULT;
|
||||
case "forced_subtitle":
|
||||
return C.SELECTION_FLAG_FORCED;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Role and Accessibility parsing.
|
||||
|
|
@ -1410,7 +1426,7 @@ public class DashManifestParser extends DefaultHandler
|
|||
for (int i = 0; i < roleDescriptors.size(); i++) {
|
||||
Descriptor descriptor = roleDescriptors.get(i);
|
||||
if (Ascii.equalsIgnoreCase("urn:mpeg:dash:role:2011", descriptor.schemeIdUri)) {
|
||||
result |= parseDashRoleSchemeValue(descriptor.value);
|
||||
result |= parseRoleFlagsFromDashRoleScheme(descriptor.value);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
|
@ -1423,7 +1439,7 @@ public class DashManifestParser extends DefaultHandler
|
|||
for (int i = 0; i < accessibilityDescriptors.size(); i++) {
|
||||
Descriptor descriptor = accessibilityDescriptors.get(i);
|
||||
if (Ascii.equalsIgnoreCase("urn:mpeg:dash:role:2011", descriptor.schemeIdUri)) {
|
||||
result |= parseDashRoleSchemeValue(descriptor.value);
|
||||
result |= parseRoleFlagsFromDashRoleScheme(descriptor.value);
|
||||
} else if (Ascii.equalsIgnoreCase(
|
||||
"urn:tva:metadata:cs:AudioPurposeCS:2007", descriptor.schemeIdUri)) {
|
||||
result |= parseTvaAudioPurposeCsValue(descriptor.value);
|
||||
|
|
@ -1446,7 +1462,7 @@ public class DashManifestParser extends DefaultHandler
|
|||
}
|
||||
|
||||
@C.RoleFlags
|
||||
protected int parseDashRoleSchemeValue(@Nullable String value) {
|
||||
protected int parseRoleFlagsFromDashRoleScheme(@Nullable String value) {
|
||||
if (value == null) {
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1465,6 +1481,7 @@ public class DashManifestParser extends DefaultHandler
|
|||
return C.ROLE_FLAG_EMERGENCY;
|
||||
case "caption":
|
||||
return C.ROLE_FLAG_CAPTION;
|
||||
case "forced_subtitle":
|
||||
case "subtitle":
|
||||
return C.ROLE_FLAG_SUBTITLE;
|
||||
case "sign":
|
||||
|
|
|
|||
|
|
@ -220,18 +220,22 @@ public class DashManifestParserTest {
|
|||
assertThat(format.containerMimeType).isEqualTo(MimeTypes.APPLICATION_RAWCC);
|
||||
assertThat(format.sampleMimeType).isEqualTo(MimeTypes.APPLICATION_CEA608);
|
||||
assertThat(format.codecs).isEqualTo("cea608");
|
||||
assertThat(format.roleFlags).isEqualTo(C.ROLE_FLAG_SUBTITLE);
|
||||
assertThat(adaptationSets.get(0).type).isEqualTo(C.TRACK_TYPE_TEXT);
|
||||
|
||||
format = adaptationSets.get(1).representations.get(0).format;
|
||||
assertThat(format.containerMimeType).isEqualTo(MimeTypes.APPLICATION_MP4);
|
||||
assertThat(format.sampleMimeType).isEqualTo(MimeTypes.APPLICATION_TTML);
|
||||
assertThat(format.codecs).isEqualTo("stpp.ttml.im1t");
|
||||
assertThat(format.roleFlags).isEqualTo(C.ROLE_FLAG_SUBTITLE);
|
||||
assertThat(format.selectionFlags).isEqualTo(C.SELECTION_FLAG_FORCED);
|
||||
assertThat(adaptationSets.get(1).type).isEqualTo(C.TRACK_TYPE_TEXT);
|
||||
|
||||
format = adaptationSets.get(2).representations.get(0).format;
|
||||
assertThat(format.containerMimeType).isEqualTo(MimeTypes.APPLICATION_TTML);
|
||||
assertThat(format.sampleMimeType).isEqualTo(MimeTypes.APPLICATION_TTML);
|
||||
assertThat(format.codecs).isNull();
|
||||
assertThat(format.roleFlags).isEqualTo(0);
|
||||
assertThat(adaptationSets.get(2).type).isEqualTo(C.TRACK_TYPE_TEXT);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,11 +7,13 @@
|
|||
</SegmentTimeline>
|
||||
</SegmentTemplate>
|
||||
<AdaptationSet id="0" mimeType="application/x-rawcc" subsegmentAlignment="true">
|
||||
<Role schemeIdUri="urn:mpeg:DASH:role:2011" value="subtitle"/>
|
||||
<Representation id="0" codecs="cea608" bandwidth="16">
|
||||
<BaseURL>https://test.com/0</BaseURL>
|
||||
</Representation>
|
||||
</AdaptationSet>
|
||||
<AdaptationSet id="0" mimeType="application/mp4" subsegmentAlignment="true">
|
||||
<Role schemeIdUri="urn:mpeg:DASH:role:2011" value="forced_subtitle"/>
|
||||
<Representation id="0" codecs="stpp.ttml.im1t" bandwidth="16">
|
||||
<BaseURL>https://test.com/0</BaseURL>
|
||||
</Representation>
|
||||
|
|
|
|||
Loading…
Reference in a new issue