From 1736e7cc8565907184da571aaabcbb0bf9524201 Mon Sep 17 00:00:00 2001 From: ybai001 Date: Wed, 23 Sep 2020 14:30:51 +0800 Subject: [PATCH] Update MPEG-DASH AudioChannelConfiguration Parsing Add support for schemeIdUri="urn:mpeg:mpegB:cicp:ChannelConfiguration". https://dashif.org/identifiers/audio_source_metadata/ and clause 8.2 in ISO/IEC 23001-8. --- .../dash/manifest/DashManifestParser.java | 41 +++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java index ede5df90c4..c74a410850 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java @@ -1279,13 +1279,21 @@ public class DashManifestParser extends DefaultHandler protected int parseAudioChannelConfiguration(XmlPullParser xpp) throws XmlPullParserException, IOException { String schemeIdUri = parseString(xpp, "schemeIdUri", null); - int audioChannels = - "urn:mpeg:dash:23003:3:audio_channel_configuration:2011".equals(schemeIdUri) - ? parseInt(xpp, "value", Format.NO_VALUE) - : ("tag:dolby.com,2014:dash:audio_channel_configuration:2011".equals(schemeIdUri) - || "urn:dolby:dash:audio_channel_configuration:2011".equals(schemeIdUri) - ? parseDolbyChannelConfiguration(xpp) - : Format.NO_VALUE); + int audioChannels = Format.NO_VALUE; + switch (schemeIdUri) { + case "urn:mpeg:dash:23003:3:audio_channel_configuration:2011": + audioChannels = parseInt(xpp, "value", Format.NO_VALUE); + break; + case "urn:mpeg:mpegB:cicp:ChannelConfiguration": + audioChannels = parseMpegChannelConfiguration(xpp); + break; + case "tag:dolby.com,2014:dash:audio_channel_configuration:2011": + case "urn:dolby:dash:audio_channel_configuration:2011": + audioChannels = parseDolbyChannelConfiguration(xpp); + break; + default: + break; + } do { xpp.next(); } while (!XmlPullParserUtil.isEndTag(xpp, "AudioChannelConfiguration")); @@ -1651,6 +1659,25 @@ public class DashManifestParser extends DefaultHandler return value == null ? defaultValue : value; } + /** + * Parses the number of channels from the value attribute of an AudioElementConfiguration with + * schemeIdUri "urn:mpeg:mpegB:cicp:ChannelConfiguration", as defined by + * https://dashif.org/identifiers/audio_source_metadata/ and clause 8.2, in ISO/IEC 23001-8. + * + * @param xpp The parser from which to read. + * @return The parsed number of channels, or {@link Format#NO_VALUE} if the channel count could + * not be parsed. + */ + protected static int parseMpegChannelConfiguration(XmlPullParser xpp) { + int channelIndex = parseInt(xpp, "value", Format.NO_VALUE); + int[] channelCountMapping = new int[]{Format.NO_VALUE, 1, 2, 3, 4, 5, 6, 8, 2, 3, /* 0--9 */ + 4,7, 8, 24, 8, 12, 10, 12, 14, 12, /* 10--19 */ + 14 /* 20 */}; + return (channelIndex >=0 && channelIndex < channelCountMapping.length) + ? channelCountMapping[channelIndex] + : Format.NO_VALUE; + } + /** * Parses the number of channels from the value attribute of an AudioElementConfiguration with * schemeIdUri "tag:dolby.com,2014:dash:audio_channel_configuration:2011", as defined by table E.5