diff options
author | Cameron Gutman <aicommander@gmail.com> | 2021-12-14 02:12:15 +0000 |
---|---|---|
committer | Andriy Gelman <andriy.gelman@gmail.com> | 2021-12-28 18:12:47 -0500 |
commit | 30322ebe3c55d0fb18bea4ae04d0fcaf1f97d27f (patch) | |
tree | ce59a0c669bb6eec27191c583b59e2fb827968aa | |
parent | 63d5b6f9350701a9d1af7d8d532f10d6f6b69039 (diff) | |
download | ffmpeg-30322ebe3c55d0fb18bea4ae04d0fcaf1f97d27f.tar.gz |
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>
-rw-r--r-- | libavcodec/v4l2_m2m_dec.c | 8 |
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) |