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>
sem_destroy(&s->refsync);
close(s->fd);
+ av_frame_unref(s->frame);
av_frame_free(&s->frame);
av_packet_unref(&s->buf_pkt);
if (s->draining)
goto dequeue;
+ if (!frame->buf[0]) {
ret = ff_encode_get_frame(avctx, frame);
if (ret < 0 && ret != AVERROR_EOF)
return ret;
if (ret == AVERROR_EOF)
frame = NULL;
+ }
ret = v4l2_send_frame(avctx, frame);
- av_frame_unref(frame);
- if (ret < 0)
+ if (ret != AVERROR(EAGAIN))
+ av_frame_unref(frame);
+
+ if (ret < 0 && ret != AVERROR(EAGAIN))
return ret;
if (!output->streamon) {