Identify AC-3 tracks by codecs="ac-3", not the MIME type.

This commit is contained in:
Oliver Woodman 2014-12-15 15:04:38 +00:00
parent 595147de9b
commit 11eb1c222b
4 changed files with 35 additions and 10 deletions

View File

@ -81,6 +81,9 @@ public class DashRendererBuilder implements RendererBuilder,
private static final int SECURITY_LEVEL_1 = 1; private static final int SECURITY_LEVEL_1 = 1;
private static final int SECURITY_LEVEL_3 = 3; private static final int SECURITY_LEVEL_3 = 3;
private static final String AC_3_CODEC = "ac-3";
private static final String E_AC_3_CODEC = "ec-3";
private final String userAgent; private final String userAgent;
private final String url; private final String url;
private final String contentId; private final String contentId;
@ -225,15 +228,13 @@ public class DashRendererBuilder implements RendererBuilder,
format.audioSamplingRate + "Hz)"); format.audioSamplingRate + "Hz)");
audioChunkSourceList.add(new DashChunkSource(manifestFetcher, audioAdaptationSetIndex, audioChunkSourceList.add(new DashChunkSource(manifestFetcher, audioAdaptationSetIndex,
new int[] {i}, audioDataSource, audioEvaluator, LIVE_EDGE_LATENCY_MS)); new int[] {i}, audioDataSource, audioEvaluator, LIVE_EDGE_LATENCY_MS));
haveAc3Tracks |= format.mimeType.equals(MimeTypes.AUDIO_AC3) haveAc3Tracks |= AC_3_CODEC.equals(format.codecs) || E_AC_3_CODEC.equals(format.codecs);
|| format.mimeType.equals(MimeTypes.AUDIO_EC3);
} }
// Filter out non-AC-3 tracks if there is an AC-3 track, to avoid having to switch renderers. // Filter out non-AC-3 tracks if there is an AC-3 track, to avoid having to switch renderers.
if (haveAc3Tracks) { if (haveAc3Tracks) {
for (int i = audioRepresentations.size() - 1; i >= 0; i--) { for (int i = audioRepresentations.size() - 1; i >= 0; i--) {
Format format = audioRepresentations.get(i).format; Format format = audioRepresentations.get(i).format;
if (!format.mimeType.equals(MimeTypes.AUDIO_AC3) if (!AC_3_CODEC.equals(format.codecs) && !E_AC_3_CODEC.equals(format.codecs)) {
&& !format.mimeType.equals(MimeTypes.AUDIO_EC3)) {
audioTrackNameList.remove(i); audioTrackNameList.remove(i);
audioChunkSourceList.remove(i); audioChunkSourceList.remove(i);
} }

View File

@ -136,7 +136,7 @@ public final class Ac3PassthroughAudioTrackRenderer extends TrackRenderer {
} }
private static boolean handlesMimeType(String mimeType) { private static boolean handlesMimeType(String mimeType) {
return MimeTypes.AUDIO_AC3.equals(mimeType) || MimeTypes.AUDIO_EC3.equals(mimeType); return MimeTypes.AUDIO_MP4.equals(mimeType);
} }
@Override @Override

View File

@ -46,6 +46,11 @@ public class Format {
*/ */
public final String mimeType; public final String mimeType;
/**
* The codecs used to decode the format, or {@code null} if they are not specified.
*/
public final String codecs;
/** /**
* The width of the video in pixels, or -1 for non-video formats. * The width of the video in pixels, or -1 for non-video formats.
*/ */
@ -98,7 +103,7 @@ public class Format {
*/ */
public Format(String id, String mimeType, int width, int height, int numChannels, public Format(String id, String mimeType, int width, int height, int numChannels,
int audioSamplingRate, int bitrate) { int audioSamplingRate, int bitrate) {
this(id, mimeType, width, height, numChannels, audioSamplingRate, bitrate, null); this(id, mimeType, width, height, numChannels, audioSamplingRate, bitrate, null, null);
} }
/** /**
@ -113,6 +118,23 @@ public class Format {
*/ */
public Format(String id, String mimeType, int width, int height, int numChannels, public Format(String id, String mimeType, int width, int height, int numChannels,
int audioSamplingRate, int bitrate, String language) { int audioSamplingRate, int bitrate, String language) {
this(id, mimeType, width, height, numChannels, audioSamplingRate, bitrate, language, null);
}
/**
* @param id The format identifier.
* @param mimeType The format mime type.
* @param width The width of the video in pixels, or -1 for non-video formats.
* @param height The height of the video in pixels, or -1 for non-video formats.
* @param numChannels The number of audio channels, or -1 for non-audio formats.
* @param audioSamplingRate The audio sampling rate in Hz, or -1 for non-audio formats.
* @param bitrate The average bandwidth of the format in bits per second.
* @param language The language of the format.
* @param codecs The codecs used to decode the format.
*/
public Format(String id, String mimeType, int width, int height, int numChannels,
int audioSamplingRate, int bitrate, String language, String codecs) {
this.id = Assertions.checkNotNull(id); this.id = Assertions.checkNotNull(id);
this.mimeType = mimeType; this.mimeType = mimeType;
this.width = width; this.width = width;
@ -121,6 +143,7 @@ public class Format {
this.audioSamplingRate = audioSamplingRate; this.audioSamplingRate = audioSamplingRate;
this.bitrate = bitrate; this.bitrate = bitrate;
this.language = language; this.language = language;
this.codecs = codecs;
this.bandwidth = bitrate / 8; this.bandwidth = bitrate / 8;
} }

View File

@ -283,6 +283,7 @@ public class MediaPresentationDescriptionParser extends DefaultHandler
int width = parseInt(xpp, "width"); int width = parseInt(xpp, "width");
int height = parseInt(xpp, "height"); int height = parseInt(xpp, "height");
mimeType = parseString(xpp, "mimeType", mimeType); mimeType = parseString(xpp, "mimeType", mimeType);
String codecs = parseString(xpp, "codecs", null);
int numChannels = -1; int numChannels = -1;
do { do {
@ -302,15 +303,15 @@ public class MediaPresentationDescriptionParser extends DefaultHandler
} while (!isEndTag(xpp, "Representation")); } while (!isEndTag(xpp, "Representation"));
Format format = buildFormat(id, mimeType, width, height, numChannels, audioSamplingRate, Format format = buildFormat(id, mimeType, width, height, numChannels, audioSamplingRate,
bandwidth, language); bandwidth, language, codecs);
return buildRepresentation(periodStartMs, periodDurationMs, contentId, -1, format, return buildRepresentation(periodStartMs, periodDurationMs, contentId, -1, format,
segmentBase); segmentBase);
} }
protected Format buildFormat(String id, String mimeType, int width, int height, int numChannels, protected Format buildFormat(String id, String mimeType, int width, int height, int numChannels,
int audioSamplingRate, int bandwidth, String language) { int audioSamplingRate, int bandwidth, String language, String codecs) {
return new Format(id, mimeType, width, height, numChannels, audioSamplingRate, return new Format(id, mimeType, width, height, numChannels, audioSamplingRate, bandwidth,
bandwidth, language); language, codecs);
} }
protected Representation buildRepresentation(long periodStartMs, long periodDurationMs, protected Representation buildRepresentation(long periodStartMs, long periodDurationMs,