From 1315e11bfded85f948281344d8c71c06f577762e Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 1 Apr 2021 15:21:11 +0100 Subject: [PATCH] Ffmpeg extension: Wait for channel count and sample rate When playing TrueHD streams, it's possible that the first decoded buffer is empty, and that the channel count and sample rate are still unknown. To correct for this, defer determining the format until a buffer that will actually be output from the decoder has been obtained, and only then query the channel count and sample rate. Issue: #8616 #minor-release PiperOrigin-RevId: 366246245 --- RELEASENOTES.md | 3 +++ .../exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java | 10 +++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) 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);