diff options
author | Samuel Mira <samuel.mira@qt.io> | 2022-05-16 15:42:04 +0300 |
---|---|---|
committer | Samuel Mira <samuel.mira@qt.io> | 2022-05-18 09:20:48 +0300 |
commit | 911c0e032af951267ecd80ee7b4c738e8291eaec (patch) | |
tree | ec47d9db11053198b03df369680b1539fbde328b | |
parent | 230ab420d24013a5fd4fe513feef69b81ec46ebf (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.cpp | 22 | ||||
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h | 2 |
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 |