1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

avcodec/v4l2_m2m_enc: buffer frame if it cannot be enqueued

Currently if the frame buffers are full, the frame is unrefed and
dropped.  Instead buffer the frame so that it is enqueued in the
next v4l2_receive_packet() call.  The behavior was observed on
DragonBoard 410c.

Signed-off-by: Andriy Gelman <andriy.gelman@gmail.com>
This commit is contained in:
Andriy Gelman 2020-08-23 13:33:37 -04:00
parent 994d2567f1
commit 8bc7f69cef
2 changed files with 7 additions and 2 deletions

View File

@ -329,6 +329,7 @@ static void v4l2_m2m_destroy_context(void *opaque, uint8_t *context)
sem_destroy(&s->refsync); sem_destroy(&s->refsync);
close(s->fd); close(s->fd);
av_frame_unref(s->frame);
av_frame_free(&s->frame); av_frame_free(&s->frame);
av_packet_unref(&s->buf_pkt); av_packet_unref(&s->buf_pkt);

View File

@ -295,16 +295,20 @@ static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
if (s->draining) if (s->draining)
goto dequeue; goto dequeue;
if (!frame->buf[0]) {
ret = ff_encode_get_frame(avctx, frame); ret = ff_encode_get_frame(avctx, frame);
if (ret < 0 && ret != AVERROR_EOF) if (ret < 0 && ret != AVERROR_EOF)
return ret; return ret;
if (ret == AVERROR_EOF) if (ret == AVERROR_EOF)
frame = NULL; frame = NULL;
}
ret = v4l2_send_frame(avctx, frame); ret = v4l2_send_frame(avctx, frame);
if (ret != AVERROR(EAGAIN))
av_frame_unref(frame); av_frame_unref(frame);
if (ret < 0)
if (ret < 0 && ret != AVERROR(EAGAIN))
return ret; return ret;
if (!output->streamon) { if (!output->streamon) {