From cf27b83e8a556a0e6be572e16527154372eeebf4 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Fri, 18 Sep 2015 18:22:40 +0100 Subject: [PATCH] Implement handlesTrack using MediaCodecUtil. --- .../exoplayer/MediaCodecAudioTrackRenderer.java | 8 +++++--- .../android/exoplayer/MediaCodecTrackRenderer.java | 1 + .../exoplayer/MediaCodecVideoTrackRenderer.java | 9 ++++++--- .../android/exoplayer/SampleSourceTrackRenderer.java | 12 ++++++++++-- .../exoplayer/chunk/VideoFormatSelectorUtil.java | 2 +- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/MediaCodecAudioTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/MediaCodecAudioTrackRenderer.java index 501bdf5567..79ff8c4715 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaCodecAudioTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaCodecAudioTrackRenderer.java @@ -217,9 +217,11 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer implem } @Override - protected boolean handlesTrack(MediaFormat mediaFormat) { - // TODO: Check the mime type against the available decoders (b/22996976). - return MimeTypes.isAudio(mediaFormat.mimeType); + protected boolean handlesTrack(MediaFormat mediaFormat) throws DecoderQueryException { + // TODO: Use MediaCodecList.findDecoderForFormat on API 23. + String mimeType = mediaFormat.mimeType; + return MimeTypes.isAudio(mimeType) && (MimeTypes.AUDIO_UNKNOWN.equals(mimeType) + || allowPassthrough(mimeType) || MediaCodecUtil.getDecoderInfo(mimeType, false) != null); } @Override diff --git a/library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java index 118ee4dd68..ef47425711 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java @@ -256,6 +256,7 @@ public abstract class MediaCodecTrackRenderer extends SampleSourceTrackRenderer * @param requiresSecureDecoder Whether a secure decoder is needed for decoding {@code mimeType}. * @return {@link DecoderInfo} for decoding media in the specified MIME type, or {@code null} if * no suitable decoder is available. + * @throws DecoderQueryException Thrown if there was an error querying decoders. */ protected DecoderInfo getDecoderInfo(String mimeType, boolean requiresSecureDecoder) throws DecoderQueryException { diff --git a/library/src/main/java/com/google/android/exoplayer/MediaCodecVideoTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/MediaCodecVideoTrackRenderer.java index 76b278ae82..28dccafcb0 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaCodecVideoTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaCodecVideoTrackRenderer.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer; +import com.google.android.exoplayer.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer.drm.DrmSessionManager; import com.google.android.exoplayer.util.MimeTypes; import com.google.android.exoplayer.util.TraceUtil; @@ -268,9 +269,11 @@ public class MediaCodecVideoTrackRenderer extends MediaCodecTrackRenderer { } @Override - protected boolean handlesTrack(MediaFormat mediaFormat) { - // TODO: Check the mime type against the available decoders (b/22996976). - return MimeTypes.isVideo(mediaFormat.mimeType); + protected boolean handlesTrack(MediaFormat mediaFormat) throws DecoderQueryException { + // TODO: Use MediaCodecList.findDecoderForFormat on API 23. + String mimeType = mediaFormat.mimeType; + return MimeTypes.isVideo(mimeType) && (MimeTypes.VIDEO_UNKNOWN.equals(mimeType) + || MediaCodecUtil.getDecoderInfo(mimeType, false) != null); } @Override diff --git a/library/src/main/java/com/google/android/exoplayer/SampleSourceTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/SampleSourceTrackRenderer.java index 762ace230d..8673d774cd 100644 --- a/library/src/main/java/com/google/android/exoplayer/SampleSourceTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/SampleSourceTrackRenderer.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer; +import com.google.android.exoplayer.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer.SampleSource.SampleSourceReader; import java.io.IOException; @@ -70,7 +71,13 @@ public abstract class SampleSourceTrackRenderer extends TrackRenderer { int sourceTrackCount = source.getTrackCount(); for (int trackIndex = 0; trackIndex < sourceTrackCount; trackIndex++) { MediaFormat format = source.getFormat(trackIndex); - if (handlesTrack(format)) { + boolean handlesTrack; + try { + handlesTrack = handlesTrack(format); + } catch (DecoderQueryException e) { + throw new ExoPlaybackException(e); + } + if (handlesTrack) { handledSourceIndices[handledTrackCount] = sourceIndex; handledTrackIndices[handledTrackCount] = trackIndex; handledTrackCount++; @@ -101,8 +108,9 @@ public abstract class SampleSourceTrackRenderer extends TrackRenderer { * * @param mediaFormat The format of the track. * @return True if the renderer can handle the track, false otherwise. + * @throws DecoderQueryException Thrown if there was an error querying decoders. */ - protected abstract boolean handlesTrack(MediaFormat mediaFormat); + protected abstract boolean handlesTrack(MediaFormat mediaFormat) throws DecoderQueryException; @Override protected void onEnabled(int track, long positionUs, boolean joining) diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/VideoFormatSelectorUtil.java b/library/src/main/java/com/google/android/exoplayer/chunk/VideoFormatSelectorUtil.java index 0866382fc7..6c82ab5f3b 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/VideoFormatSelectorUtil.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/VideoFormatSelectorUtil.java @@ -50,7 +50,7 @@ public final class VideoFormatSelectorUtil { * mime types. * @param filterHdFormats True to filter HD formats. False otherwise. * @return An array holding the indices of the selected formats. - * @throws DecoderQueryException + * @throws DecoderQueryException Thrown if there was an error querying decoders. */ public static int[] selectVideoFormatsForDefaultDisplay(Context context, List formatWrappers, String[] allowedContainerMimeTypes,