From 8378019839ae4c37264d0bcd9f37f481c28c7a35 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Fri, 19 Sep 2014 18:29:34 +0100 Subject: [PATCH] Fix SmoothStreaming where audio FourCC is missing. --- .../SmoothStreamingManifest.java | 25 +----- .../SmoothStreamingManifestParser.java | 50 +++++++---- .../smoothstreaming/SmoothStreamingUtil.java | 86 ------------------- 3 files changed, 38 insertions(+), 123 deletions(-) delete mode 100644 library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingUtil.java diff --git a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingManifest.java b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingManifest.java index 28f046816e..8d5282d3d1 100644 --- a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingManifest.java +++ b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingManifest.java @@ -16,7 +16,6 @@ package com.google.android.exoplayer.smoothstreaming; import com.google.android.exoplayer.util.Assertions; -import com.google.android.exoplayer.util.MimeTypes; import com.google.android.exoplayer.util.Util; import android.net.Uri; @@ -103,12 +102,9 @@ public class SmoothStreamingManifest { public final int bitrate; // Audio-video - public final String fourCC; public final byte[][] csd; public final int profile; public final int level; - - // Audio-video (derived) public final String mimeType; // Video-only @@ -125,12 +121,12 @@ public class SmoothStreamingManifest { public final int nalUnitLengthField; public final String content; - public TrackElement(int index, int bitrate, String fourCC, byte[][] csd, int profile, int level, - int maxWidth, int maxHeight, int sampleRate, int channels, int packetSize, int audioTag, - int bitPerSample, int nalUnitLengthField, String content) { + public TrackElement(int index, int bitrate, String mimeType, byte[][] csd, int profile, + int level, int maxWidth, int maxHeight, int sampleRate, int channels, int packetSize, + int audioTag, int bitPerSample, int nalUnitLengthField, String content) { this.index = index; this.bitrate = bitrate; - this.fourCC = fourCC; + this.mimeType = mimeType; this.csd = csd; this.profile = profile; this.level = level; @@ -143,19 +139,6 @@ public class SmoothStreamingManifest { this.bitPerSample = bitPerSample; this.nalUnitLengthField = nalUnitLengthField; this.content = content; - this.mimeType = fourCCToMimeType(fourCC); - } - - private static String fourCCToMimeType(String fourCC) { - if (fourCC.equalsIgnoreCase("H264") || fourCC.equalsIgnoreCase("AVC1") - || fourCC.equalsIgnoreCase("DAVC")) { - return MimeTypes.VIDEO_H264; - } else if (fourCC.equalsIgnoreCase("AACL") || fourCC.equalsIgnoreCase("AACH")) { - return MimeTypes.AUDIO_AAC; - } else if (fourCC.equalsIgnoreCase("TTML")) { - return MimeTypes.APPLICATION_TTML; - } - return null; } } diff --git a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingManifestParser.java b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingManifestParser.java index 46d0d41fed..ae4cd13b36 100644 --- a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingManifestParser.java +++ b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingManifestParser.java @@ -22,6 +22,7 @@ import com.google.android.exoplayer.smoothstreaming.SmoothStreamingManifest.Trac import com.google.android.exoplayer.util.Assertions; import com.google.android.exoplayer.util.CodecSpecificDataUtil; import com.google.android.exoplayer.util.ManifestParser; +import com.google.android.exoplayer.util.MimeTypes; import android.net.Uri; import android.util.Base64; @@ -586,7 +587,7 @@ public class SmoothStreamingManifestParser implements ManifestParser csd; - if (trackElement.csd != null) { - csd = Arrays.asList(trackElement.csd); - } else { - csd = Collections.singletonList(CodecSpecificDataUtil.buildAudioSpecificConfig( - trackElement.sampleRate, trackElement.numChannels)); - } - MediaFormat format = MediaFormat.createAudioFormat(mimeType, -1, trackElement.numChannels, - trackElement.sampleRate, csd); - return format; - } - // TODO: Do subtitles need a format? MediaFormat supports KEY_LANGUAGE. - return null; - } - - public static byte[] getKeyId(byte[] initData) { - StringBuilder initDataStringBuilder = new StringBuilder(); - for (int i = 0; i < initData.length; i += 2) { - initDataStringBuilder.append((char) initData[i]); - } - String initDataString = initDataStringBuilder.toString(); - String keyIdString = initDataString.substring( - initDataString.indexOf("") + 5, initDataString.indexOf("")); - byte[] keyId = Base64.decode(keyIdString, Base64.DEFAULT); - swap(keyId, 0, 3); - swap(keyId, 1, 2); - swap(keyId, 4, 5); - swap(keyId, 6, 7); - return keyId; - } - - private static void swap(byte[] data, int firstPosition, int secondPosition) { - byte temp = data[firstPosition]; - data[firstPosition] = data[secondPosition]; - data[secondPosition] = temp; - } - -}