diff options
author | Pekka Gehör <pekka.gehor@qt.io> | 2022-02-02 14:51:53 +0200 |
---|---|---|
committer | Pekka Gehör <pekka.gehor@qt.io> | 2022-04-27 10:52:37 +0000 |
commit | adcf9f61288ba10c7f690b13ae91288ed3ffbeb9 (patch) | |
tree | 92ccfec0f26ce7342637434b43cc3b7a27380aab | |
parent | ae2dff510b4ec71abb1d80dbfe04ed24762bcb6b (diff) |
Android: fix lost first buffer data issue with QAndroidAudioDecoder
AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED always comes first,
so let's handle it with the same input buffer index.
Otherwise, the first output buffer is lost.
Task-number: QTBUG-100079
Change-Id: Ia642a573d06c7092d15834b50641c982d23ab606
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
(cherry picked from commit c9ddced7cce79882e4a76436bf70390df9d97e37)
-rw-r--r-- | src/multimedia/platform/android/audio/qandroidaudiodecoder.cpp | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/src/multimedia/platform/android/audio/qandroidaudiodecoder.cpp b/src/multimedia/platform/android/audio/qandroidaudiodecoder.cpp index 7e3fe9a01..3013f6fa9 100644 --- a/src/multimedia/platform/android/audio/qandroidaudiodecoder.cpp +++ b/src/multimedia/platform/android/audio/qandroidaudiodecoder.cpp @@ -212,6 +212,15 @@ void Decoder::doDecode() // handle output buffer AMediaCodecBufferInfo info; ssize_t idx = AMediaCodec_dequeueOutputBuffer(m_codec, &info, dequeueTimeout); + + while (idx == AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED + || idx == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED) { + if (idx == AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED) + qCWarning(adLogger) << "dequeueOutputBuffer() status: outputFormat changed"; + + idx = AMediaCodec_dequeueOutputBuffer(m_codec, &info, dequeueTimeout); + } + if (idx >= 0) { if (info.flags & AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM) break; @@ -222,24 +231,17 @@ void Decoder::doDecode() &bufferSize); const QByteArray data((const char*)(bufferData + info.offset), info.size); auto audioBuffer = QAudioBuffer(data, m_outputFormat, presentationTimeUs); - if (presentationTimeUs > 0) + if (presentationTimeUs >= 0) emit positionChanged(std::move(audioBuffer), presentationTimeUs / 1000); + AMediaCodec_releaseOutputBuffer(m_codec, idx, false); } + } else if (idx == AMEDIACODEC_INFO_TRY_AGAIN_LATER) { + qCWarning(adLogger) << "dequeueOutputBuffer() status: try again later"; + break; } else { - // The outputIndex doubles as a status return if its value is < 0 - switch (idx) { - case AMEDIACODEC_INFO_TRY_AGAIN_LATER: - qCWarning(adLogger) << "dequeueOutputBuffer() status: try again later"; - break; - case AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED: - qCWarning(adLogger) << "dequeueOutputBuffer() status: output buffers changed"; - break; - case AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED: - m_format = AMediaCodec_getOutputFormat(m_codec); - qCWarning(adLogger) << "dequeueOutputBuffer() status: outputFormat changed"; - break; - } + qCWarning(adLogger) << + "AMediaCodec_dequeueOutputBuffer() status: invalid buffer idx " << idx; } } else { qCWarning(adLogger) << "dequeueInputBuffer() status: invalid buffer idx " << bufferIdx; |