summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPekka Gehör <pekka.gehor@qt.io>2022-02-02 14:51:53 +0200
committerPekka Gehör <pekka.gehor@qt.io>2022-04-27 10:52:37 +0000
commitadcf9f61288ba10c7f690b13ae91288ed3ffbeb9 (patch)
tree92ccfec0f26ce7342637434b43cc3b7a27380aab
parentae2dff510b4ec71abb1d80dbfe04ed24762bcb6b (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.cpp30
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;