summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Mira <samuel.mira@qt.io>2022-05-16 15:42:04 +0300
committerSamuel Mira <samuel.mira@qt.io>2022-05-18 09:20:48 +0300
commit911c0e032af951267ecd80ee7b4c738e8291eaec (patch)
treeec47d9db11053198b03df369680b1539fbde328b
parent230ab420d24013a5fd4fe513feef69b81ec46ebf (diff)
Android: streamdecoder fix for mediacodec
In android, avcodec_send_packet using mediacodec results some times in EAGAIN, and those packets have to be resent. Change-Id: I3234297f1f612c0921989338082397626910bd1d Reviewed-by: Piotr Srebrny <piotr.srebrny@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp22
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h2
2 files changed, 22 insertions, 2 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp b/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp
index 7a3ae1cb7..31b334fbc 100644
--- a/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp
+++ b/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp
@@ -385,6 +385,21 @@ void StreamDecoder::killHelper()
demuxer->removeStream(codec.streamIndex());
}
+Packet StreamDecoder::peekPacket()
+{
+ QMutexLocker locker(&packetQueue.mutex);
+ if (packetQueue.queue.isEmpty()) {
+ if (demuxer)
+ demuxer->wake();
+ return {};
+ }
+ auto packet = packetQueue.queue.first();
+
+ if (demuxer)
+ demuxer->wake();
+ return packet;
+}
+
Packet StreamDecoder::takePacket()
{
QMutexLocker locker(&packetQueue.mutex);
@@ -484,13 +499,16 @@ void StreamDecoder::decode()
av_frame_free(&frame);
}
- Packet packet = takePacket();
+ Packet packet = peekPacket();
if (!packet.isValid()) {
timeOut = -1;
return;
}
- avcodec_send_packet(codec.context(), packet.avPacket());
+ res = avcodec_send_packet(codec.context(), packet.avPacket());
+ if (res != AVERROR(EAGAIN)) {
+ takePacket();
+ }
decoderHasNoFrames = false;
}
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h b/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h
index 10bbd6f70..414524838 100644
--- a/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h
+++ b/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h
@@ -387,6 +387,8 @@ public:
private:
Packet takePacket();
+ Packet peekPacket();
+
void addFrame(const Frame &f);
bool hasEnoughFrames() const