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 bcbb39a1fe..dccb962fcd 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaCodecAudioTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaCodecAudioTrackRenderer.java @@ -68,8 +68,8 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer { public AudioTrackInitializationException(int audioTrackState, int sampleRate, int channelConfig, int bufferSize) { - super("AudioTrack init failed: " + audioTrackState + ", Config(" + sampleRate + ", " + - channelConfig + ", " + bufferSize + ")"); + super("AudioTrack init failed: " + audioTrackState + ", Config(" + sampleRate + ", " + + channelConfig + ", " + bufferSize + ")"); this.audioTrackState = audioTrackState; } @@ -538,8 +538,8 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer { // Compute the audio track latency, excluding the latency due to the buffer (leaving // latency due to the mixer and audio hardware driver). audioTrackLatencyUs = - (Integer) audioTrackGetLatencyMethod.invoke(audioTrack, (Object[]) null) * 1000L - - framesToDurationUs(bufferSize / frameSize); + (Integer) audioTrackGetLatencyMethod.invoke(audioTrack, (Object[]) null) * 1000L + - framesToDurationUs(bufferSize / frameSize); // Sanity check that the latency is non-negative. audioTrackLatencyUs = Math.max(audioTrackLatencyUs, 0); // Sanity check that the latency isn't too large. @@ -612,19 +612,19 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer { if (temporaryBufferSize == 0) { // This is the first time we've seen this {@code buffer}. // Note: presentationTimeUs corresponds to the end of the sample, not the start. - long bufferStartTime = bufferInfo.presentationTimeUs - - framesToDurationUs(bufferInfo.size / frameSize); + long bufferStartTime = bufferInfo.presentationTimeUs + - framesToDurationUs(bufferInfo.size / frameSize); if (audioTrackStartMediaTimeState == START_NOT_SET) { audioTrackStartMediaTimeUs = Math.max(0, bufferStartTime); audioTrackStartMediaTimeState = START_IN_SYNC; } else { // Sanity check that bufferStartTime is consistent with the expected value. - long expectedBufferStartTime = audioTrackStartMediaTimeUs + - framesToDurationUs(submittedBytes / frameSize); + long expectedBufferStartTime = audioTrackStartMediaTimeUs + + framesToDurationUs(submittedBytes / frameSize); if (audioTrackStartMediaTimeState == START_IN_SYNC && Math.abs(expectedBufferStartTime - bufferStartTime) > 200000) { - Log.e(TAG, "Discontinuity detected [expected " + expectedBufferStartTime + ", got " + - bufferStartTime + "]"); + Log.e(TAG, "Discontinuity detected [expected " + expectedBufferStartTime + ", got " + + bufferStartTime + "]"); audioTrackStartMediaTimeState = START_NEED_SYNC; } if (audioTrackStartMediaTimeState == START_NEED_SYNC) { @@ -679,7 +679,7 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer { } @TargetApi(21) - private int writeNonBlockingV21(AudioTrack audioTrack, ByteBuffer buffer, int size) { + private static int writeNonBlockingV21(AudioTrack audioTrack, ByteBuffer buffer, int size) { return audioTrack.write(buffer, size, AudioTrack.WRITE_NON_BLOCKING); } @@ -703,8 +703,8 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer { } private int getPendingFrameCount() { - return audioTrack == null ? - 0 : (int) (submittedBytes / frameSize - getPlaybackHeadPosition()); + return audioTrack == null + ? 0 : (int) (submittedBytes / frameSize - getPlaybackHeadPosition()); } @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 c629e365ee..1fa103f395 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer.util.Util; import android.annotation.TargetApi; import android.media.MediaCodec; +import android.media.MediaCodec.CodecException; import android.media.MediaCodec.CryptoException; import android.media.MediaCrypto; import android.media.MediaExtractor; @@ -70,10 +71,24 @@ public abstract class MediaCodecTrackRenderer extends TrackRenderer { */ public final String decoderName; + /** + * An optional developer-readable diagnostic information string. May be null. + */ + public final String diagnosticInfo; + public DecoderInitializationException(String decoderName, MediaFormat mediaFormat, - Exception cause) { + Throwable cause) { super("Decoder init failed: " + decoderName + ", " + mediaFormat, cause); this.decoderName = decoderName; + this.diagnosticInfo = Util.SDK_INT >= 21 ? getDiagnosticInfoV21(cause) : null; + } + + @TargetApi(21) + private static String getDiagnosticInfoV21(Throwable cause) { + if (cause instanceof CodecException) { + return ((CodecException) cause).getDiagnosticInfo(); + } + return null; } } @@ -235,6 +250,7 @@ public abstract class MediaCodecTrackRenderer extends TrackRenderer { codec.configure(x, null, crypto, 0); } + @SuppressWarnings("deprecation") protected final void maybeInitCodec() throws ExoPlaybackException { if (!shouldInitCodec()) { return; @@ -694,6 +710,7 @@ public abstract class MediaCodecTrackRenderer extends TrackRenderer { * @return True if it may be possible to drain more output data. False otherwise. * @throws ExoPlaybackException If an error occurs draining the output buffer. */ + @SuppressWarnings("deprecation") private boolean drainOutputBuffer(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { if (outputStreamEnded) {