Use MediaCodecUtil.IsSizeAndRateSupportedV21 where available.

This commit is contained in:
Oliver Woodman 2015-10-26 15:32:49 +00:00
parent a74fd17e92
commit f3113e7055
3 changed files with 72 additions and 47 deletions

View File

@ -17,6 +17,7 @@ package com.google.android.exoplayer.chunk;
import com.google.android.exoplayer.MediaCodecUtil; import com.google.android.exoplayer.MediaCodecUtil;
import com.google.android.exoplayer.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer.MediaCodecUtil.DecoderQueryException;
import com.google.android.exoplayer.util.MimeTypes;
import com.google.android.exoplayer.util.Util; import com.google.android.exoplayer.util.Util;
import android.annotation.TargetApi; import android.annotation.TargetApi;
@ -138,7 +139,7 @@ public final class VideoFormatSelectorUtil {
* whether HD formats should be filtered and a maximum decodable frame size in pixels. * whether HD formats should be filtered and a maximum decodable frame size in pixels.
*/ */
private static boolean isFormatPlayable(Format format, String[] allowedContainerMimeTypes, private static boolean isFormatPlayable(Format format, String[] allowedContainerMimeTypes,
boolean filterHdFormats, int maxDecodableFrameSize) { boolean filterHdFormats, int maxDecodableFrameSize) throws DecoderQueryException {
if (allowedContainerMimeTypes != null if (allowedContainerMimeTypes != null
&& !Util.contains(allowedContainerMimeTypes, format.mimeType)) { && !Util.contains(allowedContainerMimeTypes, format.mimeType)) {
// Filtering format based on its container mime type. // Filtering format based on its container mime type.
@ -149,9 +150,13 @@ public final class VideoFormatSelectorUtil {
return false; return false;
} }
if (format.width > 0 && format.height > 0) { if (format.width > 0 && format.height > 0) {
// TODO: Use MediaCodecUtil.isSizeAndRateSupportedV21 on API levels >= 21 if we know the String videoMediaMimeType = MimeTypes.getVideoMediaMimeType(format.codecs);
// mimeType of the media samples within the container. Remove the assumption that we're if (Util.SDK_INT >= 21 && !MimeTypes.VIDEO_UNKNOWN.equals(videoMediaMimeType)) {
// dealing with H.264. float frameRate = (format.frameRate > 0) ? format.frameRate : 30.0f;
return MediaCodecUtil.isSizeAndRateSupportedV21(videoMediaMimeType, false,
format.width, format.height, frameRate);
}
//Assuming that the media is H.264
if (format.width * format.height > maxDecodableFrameSize) { if (format.width * format.height > maxDecodableFrameSize) {
// Filtering stream that device cannot play // Filtering stream that device cannot play
return false; return false;

View File

@ -52,7 +52,6 @@ import com.google.android.exoplayer.util.MimeTypes;
import com.google.android.exoplayer.util.SystemClock; import com.google.android.exoplayer.util.SystemClock;
import android.os.Handler; import android.os.Handler;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.util.SparseArray; import android.util.SparseArray;
@ -628,9 +627,9 @@ public class DashChunkSource implements ChunkSource, Output {
private static String getMediaMimeType(Format format) { private static String getMediaMimeType(Format format) {
String formatMimeType = format.mimeType; String formatMimeType = format.mimeType;
if (MimeTypes.isAudio(formatMimeType)) { if (MimeTypes.isAudio(formatMimeType)) {
return getAudioMediaMimeType(format); return MimeTypes.getAudioMediaMimeType(format.codecs);
} else if (MimeTypes.isVideo(formatMimeType)) { } else if (MimeTypes.isVideo(formatMimeType)) {
return getVideoMediaMimeType(format); return MimeTypes.getVideoMediaMimeType(format.codecs);
} else if (mimeTypeIsRawText(formatMimeType)) { } else if (mimeTypeIsRawText(formatMimeType)) {
return formatMimeType; return formatMimeType;
} else if (MimeTypes.APPLICATION_MP4.equals(formatMimeType) && "stpp".equals(format.codecs)) { } else if (MimeTypes.APPLICATION_MP4.equals(formatMimeType) && "stpp".equals(format.codecs)) {
@ -640,46 +639,6 @@ public class DashChunkSource implements ChunkSource, Output {
} }
} }
private static String getVideoMediaMimeType(Format format) {
String codecs = format.codecs;
if (TextUtils.isEmpty(codecs)) {
Log.w(TAG, "Codecs attribute missing: " + format.id);
return MimeTypes.VIDEO_UNKNOWN;
} else if (codecs.startsWith("avc1") || codecs.startsWith("avc3")) {
return MimeTypes.VIDEO_H264;
} else if (codecs.startsWith("hev1") || codecs.startsWith("hvc1")) {
return MimeTypes.VIDEO_H265;
} else if (codecs.startsWith("vp9")) {
return MimeTypes.VIDEO_VP9;
} else if (codecs.startsWith("vp8")) {
return MimeTypes.VIDEO_VP8;
}
Log.w(TAG, "Failed to parse mime from codecs: " + format.id + ", " + codecs);
return MimeTypes.VIDEO_UNKNOWN;
}
private static String getAudioMediaMimeType(Format format) {
String codecs = format.codecs;
if (TextUtils.isEmpty(codecs)) {
Log.w(TAG, "Codecs attribute missing: " + format.id);
return MimeTypes.AUDIO_UNKNOWN;
} else if (codecs.startsWith("mp4a")) {
return MimeTypes.AUDIO_AAC;
} else if (codecs.startsWith("ac-3") || codecs.startsWith("dac3")) {
return MimeTypes.AUDIO_AC3;
} else if (codecs.startsWith("ec-3") || codecs.startsWith("dec3")) {
return MimeTypes.AUDIO_EC3;
} else if (codecs.startsWith("dtsc") || codecs.startsWith("dtse")) {
return MimeTypes.AUDIO_DTS;
} else if (codecs.startsWith("dtsh") || codecs.startsWith("dtsl")) {
return MimeTypes.AUDIO_DTS_HD;
} else if (codecs.startsWith("opus")) {
return MimeTypes.AUDIO_OPUS;
}
Log.w(TAG, "Failed to parse mime from codecs: " + format.id + ", " + codecs);
return MimeTypes.AUDIO_UNKNOWN;
}
/* package */ static boolean mimeTypeIsWebm(String mimeType) { /* package */ static boolean mimeTypeIsWebm(String mimeType) {
return mimeType.startsWith(MimeTypes.VIDEO_WEBM) || mimeType.startsWith(MimeTypes.AUDIO_WEBM) return mimeType.startsWith(MimeTypes.VIDEO_WEBM) || mimeType.startsWith(MimeTypes.AUDIO_WEBM)
|| mimeType.startsWith(MimeTypes.APPLICATION_WEBM); || mimeType.startsWith(MimeTypes.APPLICATION_WEBM);

View File

@ -15,6 +15,8 @@
*/ */
package com.google.android.exoplayer.util; package com.google.android.exoplayer.util;
import android.text.TextUtils;
/** /**
* Defines common MIME types and helper methods. * Defines common MIME types and helper methods.
*/ */
@ -52,6 +54,7 @@ public final class MimeTypes {
public static final String AUDIO_VORBIS = BASE_TYPE_AUDIO + "/vorbis"; public static final String AUDIO_VORBIS = BASE_TYPE_AUDIO + "/vorbis";
public static final String AUDIO_OPUS = BASE_TYPE_AUDIO + "/opus"; public static final String AUDIO_OPUS = BASE_TYPE_AUDIO + "/opus";
public static final String TEXT_UNKNOWN = BASE_TYPE_TEXT + "/x-unknown";
public static final String TEXT_VTT = BASE_TYPE_TEXT + "/vtt"; public static final String TEXT_VTT = BASE_TYPE_TEXT + "/vtt";
public static final String APPLICATION_MP4 = BASE_TYPE_APPLICATION + "/mp4"; public static final String APPLICATION_MP4 = BASE_TYPE_APPLICATION + "/mp4";
@ -119,4 +122,62 @@ public final class MimeTypes {
return mimeType.substring(0, indexOfSlash); return mimeType.substring(0, indexOfSlash);
} }
/**
* Returns the video mimeType type of {@code codecs}.
*
* @param codecs The codecs for which the video mimeType is required.
* @return The video mimeType.
*/
public static String getVideoMediaMimeType(String codecs) {
if (codecs == null) {
return MimeTypes.VIDEO_UNKNOWN;
}
String[] codecList = codecs.split(",");
for (String codec : codecList) {
codec = codec.trim();
if (codec.startsWith("avc1") || codec.startsWith("avc3")) {
return MimeTypes.VIDEO_H264;
} else if (codec.startsWith("hev1") || codec.startsWith("hvc1")) {
return MimeTypes.VIDEO_H265;
} else if (codec.startsWith("vp9")) {
return MimeTypes.VIDEO_VP9;
} else if (codec.startsWith("vp8")) {
return MimeTypes.VIDEO_VP8;
}
}
return MimeTypes.VIDEO_UNKNOWN;
}
/**
* Returns the audio mimeType type of {@code codecs}.
*
* @param codecs The codecs for which the audio mimeType is required.
* @return The audio mimeType.
*/
public static String getAudioMediaMimeType(String codecs) {
if (codecs == null) {
return MimeTypes.AUDIO_UNKNOWN;
}
String[] codecList = codecs.split(",");
for (String codec : codecList) {
codec = codec.trim();
if (codec.startsWith("mp4a")) {
return MimeTypes.AUDIO_AAC;
} else if (codec.startsWith("ac-3") || codec.startsWith("dac3")) {
return MimeTypes.AUDIO_AC3;
} else if (codec.startsWith("ec-3") || codec.startsWith("dec3")) {
return MimeTypes.AUDIO_EC3;
} else if (codec.startsWith("dtsc") || codec.startsWith("dtse")) {
return MimeTypes.AUDIO_DTS;
} else if (codec.startsWith("dtsh") || codec.startsWith("dtsl")) {
return MimeTypes.AUDIO_DTS_HD;
} else if (codec.startsWith("opus")) {
return MimeTypes.AUDIO_OPUS;
} else if (codec.startsWith("vorbis")) {
return MimeTypes.AUDIO_VORBIS;
}
}
return MimeTypes.AUDIO_UNKNOWN;
}
} }