diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 957f989e9d6..8402ac7a9ef 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -138,6 +138,9 @@ ([#8447](https://github.com/google/ExoPlayer/issues/8447)). * Update instructions and publishing configuration for releasing to Google's Maven repository instead of bintray/JCenter. +* FFmpeg extension: Fix playback failure when switching to TrueHD tracks + during playback + ([#8616](https://github.com/google/ExoPlayer/issues/8616)). ### 2.13.2 (2021-02-25) diff --git a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java index d6980f28019..0600254be53 100644 --- a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java +++ b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java @@ -110,14 +110,18 @@ protected FfmpegDecoderException createUnexpectedDecodeException(Throwable error int inputSize = inputData.limit(); ByteBuffer outputData = outputBuffer.init(inputBuffer.timeUs, outputBufferSize); int result = ffmpegDecode(nativeContext, inputData, inputSize, outputData, outputBufferSize); - if (result == AUDIO_DECODER_ERROR_INVALID_DATA) { + if (result == AUDIO_DECODER_ERROR_OTHER) { + return new FfmpegDecoderException("Error decoding (see logcat)."); + } else if (result == AUDIO_DECODER_ERROR_INVALID_DATA) { // Treat invalid data errors as non-fatal to match the behavior of MediaCodec. No output will // be produced for this buffer, so mark it as decode-only to ensure that the audio sink's // position is reset when more audio is produced. outputBuffer.setFlags(C.BUFFER_FLAG_DECODE_ONLY); return null; - } else if (result == AUDIO_DECODER_ERROR_OTHER) { - return new FfmpegDecoderException("Error decoding (see logcat)."); + } else if (result == 0) { + // There's no need to output empty buffers. + outputBuffer.setFlags(C.BUFFER_FLAG_DECODE_ONLY); + return null; } if (!hasOutputFormat) { channelCount = ffmpegGetChannelCount(nativeContext);