summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorCameron Gutman <aicommander@gmail.com>2021-12-14 02:12:15 +0000
committerAndriy Gelman <andriy.gelman@gmail.com>2021-12-28 18:12:47 -0500
commit30322ebe3c55d0fb18bea4ae04d0fcaf1f97d27f (patch)
treece59a0c669bb6eec27191c583b59e2fb827968aa /libavcodec
parent63d5b6f9350701a9d1af7d8d532f10d6f6b69039 (diff)
avcodec/v4l2_m2m_dec: dequeue frame if input isn't ready
The V4L2M2M API operates asynchronously, so multiple packets can be enqueued before getting a batch of frames back. Since it was only possible to receive a frame by submitting another packet, there wasn't a way to drain those excess output frames from when avcodec_receive_frame() returned AVERROR(EAGAIN). Reviewed-by: Andriy Gelman <andriy.gelman@gmail.com> Signed-off-by: Cameron Gutman <aicommander@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/v4l2_m2m_dec.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
index 224eb3d5e7..b0c3d30ac8 100644
--- a/libavcodec/v4l2_m2m_dec.c
+++ b/libavcodec/v4l2_m2m_dec.c
@@ -142,8 +142,12 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame)
if (!s->buf_pkt.size) {
ret = ff_decode_get_packet(avctx, &s->buf_pkt);
- if (ret < 0 && ret != AVERROR_EOF)
- return ret;
+ if (ret < 0) {
+ if (ret == AVERROR(EAGAIN))
+ return ff_v4l2_context_dequeue_frame(capture, frame, 0);
+ else if (ret != AVERROR_EOF)
+ return ret;
+ }
}
if (s->draining)