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:
parent
994d2567f1
commit
8bc7f69cef
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
av_frame_unref(frame);
|
if (ret != AVERROR(EAGAIN))
|
||||||
if (ret < 0)
|
av_frame_unref(frame);
|
||||||
|
|
||||||
|
if (ret < 0 && ret != AVERROR(EAGAIN))
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (!output->streamon) {
|
if (!output->streamon) {
|
||||||
|
Loading…
Reference in New Issue
Block a user