Re: [FFmpeg-devel] [PATCH] avcodec/v4l2_m2m: handle the v4l2 eos event
You're welcome. Can this bug help me apply for a CVE? On Tue, Mar 17, 2020 at 12:20 PM Andriy Gelman wrote: > On Mon, 16. Mar 10:03, Ming Qian wrote: > > when the last frame of capture is dequeueed, > > driver may send this V4L2_EVENT_EOS event, > > if this event is received, then we can set the capture port done > > Please add to your commit message (or something similar depending on what > you > tested): > "Without this patch the s5p-mfc often hangs at the end of encoding when > flushing the > capture buffers." > > > > > Signed-off-by: Ming Qian > > --- > > libavcodec/v4l2_context.c | 5 + > > libavcodec/v4l2_m2m_dec.c | 10 ++ > > libavcodec/v4l2_m2m_enc.c | 22 ++ > > 3 files changed, 37 insertions(+) > > > > diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c > > index 8110bbb555..c10862aa12 100644 > > --- a/libavcodec/v4l2_context.c > > +++ b/libavcodec/v4l2_context.c > > @@ -171,6 +171,11 @@ static int v4l2_handle_event(V4L2Context *ctx) > > return 0; > > } > > > > +if (evt.type == V4L2_EVENT_EOS) { > > +ctx->done = 1; > > +return 0; > > +} > > + > > if (evt.type != V4L2_EVENT_SOURCE_CHANGE) > > return 0; > > > > diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c > > index d666edffe4..4862a4c0e5 100644 > > --- a/libavcodec/v4l2_m2m_dec.c > > +++ b/libavcodec/v4l2_m2m_dec.c > > @@ -123,6 +123,16 @@ static int v4l2_prepare_decoder(V4L2m2mContext *s) > > } > > } > > > > > +memset(, 0, sizeof(sub)); > > +sub.type = V4L2_EVENT_EOS; > > +ret = ioctl(s->fd, VIDIOC_SUBSCRIBE_EVENT, ); > > +if (ret < 0) { > > +av_log(s->avctx, AV_LOG_ERROR, > > +"the v4l2 driver does not support > VIDIOC_SUBSCRIBE_EVENT\n" > > +"you must provide an eos event to finish encode\n"); > > +return ret; > > +} > > + > > return 0; > > } > > > > diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c > > index 5b954f4435..3abdd47a4a 100644 > > --- a/libavcodec/v4l2_m2m_enc.c > > +++ b/libavcodec/v4l2_m2m_enc.c > > @@ -155,6 +155,24 @@ static int > v4l2_check_b_frame_support(V4L2m2mContext *s) > > return AVERROR_PATCHWELCOME; > > } > > > > +static int v4l2_subscribe_eos_event(V4L2m2mContext *s) > > +{ > > +struct v4l2_event_subscription sub; > > +int ret; > > + > > +memset(, 0, sizeof(sub)); > > +sub.type = V4L2_EVENT_EOS; > > +ret = ioctl(s->fd, VIDIOC_SUBSCRIBE_EVENT, ); > > +if (ret < 0) { > > +av_log(s->avctx, AV_LOG_ERROR, > > +"the v4l2 driver does not support > VIDIOC_SUBSCRIBE_EVENT\n" > > +"you must provide an eos event to finish encode\n"); > > +return ret; > > +} > > + > > +return 0; > > +} > > + > > static int v4l2_prepare_encoder(V4L2m2mContext *s) > > { > > AVCodecContext *avctx = s->avctx; > > @@ -164,6 +182,10 @@ static int v4l2_prepare_encoder(V4L2m2mContext *s) > > /** > > * requirements > > */ > > > +ret = v4l2_subscribe_eos_event(s); > > +if (ret) > > +return ret; > > + > > I don't have a venus board to test, but it looks that the encoder doesn't > support > V4L2_EVENT_EOS. It ends up calling v4l2_ctrl_subscribe_event() [1], which > returns EINVAL. > > So I would log the error message, but not fail. Same in the decoder init. > Ideally, it would be good to also test on a venus board too. > > [1] > https://github.com/torvalds/linux/blob/master/drivers/media/v4l2-core/v4l2-ctrls.c#L4565 > > > ret = v4l2_check_b_frame_support(s); > > if (ret) > > return ret; > > -- > > 2.25.1 > > > > Thanks, > -- > Andriy > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] avcodec/v4l2_m2m: handle the v4l2 eos event
On Mon, 16. Mar 10:03, Ming Qian wrote: > when the last frame of capture is dequeueed, > driver may send this V4L2_EVENT_EOS event, > if this event is received, then we can set the capture port done Please add to your commit message (or something similar depending on what you tested): "Without this patch the s5p-mfc often hangs at the end of encoding when flushing the capture buffers." > > Signed-off-by: Ming Qian > --- > libavcodec/v4l2_context.c | 5 + > libavcodec/v4l2_m2m_dec.c | 10 ++ > libavcodec/v4l2_m2m_enc.c | 22 ++ > 3 files changed, 37 insertions(+) > > diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c > index 8110bbb555..c10862aa12 100644 > --- a/libavcodec/v4l2_context.c > +++ b/libavcodec/v4l2_context.c > @@ -171,6 +171,11 @@ static int v4l2_handle_event(V4L2Context *ctx) > return 0; > } > > +if (evt.type == V4L2_EVENT_EOS) { > +ctx->done = 1; > +return 0; > +} > + > if (evt.type != V4L2_EVENT_SOURCE_CHANGE) > return 0; > > diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c > index d666edffe4..4862a4c0e5 100644 > --- a/libavcodec/v4l2_m2m_dec.c > +++ b/libavcodec/v4l2_m2m_dec.c > @@ -123,6 +123,16 @@ static int v4l2_prepare_decoder(V4L2m2mContext *s) > } > } > > +memset(, 0, sizeof(sub)); > +sub.type = V4L2_EVENT_EOS; > +ret = ioctl(s->fd, VIDIOC_SUBSCRIBE_EVENT, ); > +if (ret < 0) { > +av_log(s->avctx, AV_LOG_ERROR, > +"the v4l2 driver does not support VIDIOC_SUBSCRIBE_EVENT\n" > +"you must provide an eos event to finish encode\n"); > +return ret; > +} > + > return 0; > } > > diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c > index 5b954f4435..3abdd47a4a 100644 > --- a/libavcodec/v4l2_m2m_enc.c > +++ b/libavcodec/v4l2_m2m_enc.c > @@ -155,6 +155,24 @@ static int v4l2_check_b_frame_support(V4L2m2mContext *s) > return AVERROR_PATCHWELCOME; > } > > +static int v4l2_subscribe_eos_event(V4L2m2mContext *s) > +{ > +struct v4l2_event_subscription sub; > +int ret; > + > +memset(, 0, sizeof(sub)); > +sub.type = V4L2_EVENT_EOS; > +ret = ioctl(s->fd, VIDIOC_SUBSCRIBE_EVENT, ); > +if (ret < 0) { > +av_log(s->avctx, AV_LOG_ERROR, > +"the v4l2 driver does not support VIDIOC_SUBSCRIBE_EVENT\n" > +"you must provide an eos event to finish encode\n"); > +return ret; > +} > + > +return 0; > +} > + > static int v4l2_prepare_encoder(V4L2m2mContext *s) > { > AVCodecContext *avctx = s->avctx; > @@ -164,6 +182,10 @@ static int v4l2_prepare_encoder(V4L2m2mContext *s) > /** > * requirements > */ > +ret = v4l2_subscribe_eos_event(s); > +if (ret) > +return ret; > + I don't have a venus board to test, but it looks that the encoder doesn't support V4L2_EVENT_EOS. It ends up calling v4l2_ctrl_subscribe_event() [1], which returns EINVAL. So I would log the error message, but not fail. Same in the decoder init. Ideally, it would be good to also test on a venus board too. [1] https://github.com/torvalds/linux/blob/master/drivers/media/v4l2-core/v4l2-ctrls.c#L4565 > ret = v4l2_check_b_frame_support(s); > if (ret) > return ret; > -- > 2.25.1 > Thanks, -- Andriy ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] [PATCH] avcodec/v4l2_m2m: handle the v4l2 eos event
when the last frame of capture is dequeueed, driver may send this V4L2_EVENT_EOS event, if this event is received, then we can set the capture port done Signed-off-by: Ming Qian --- libavcodec/v4l2_context.c | 5 + libavcodec/v4l2_m2m_dec.c | 10 ++ libavcodec/v4l2_m2m_enc.c | 22 ++ 3 files changed, 37 insertions(+) diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c index 8110bbb555..c10862aa12 100644 --- a/libavcodec/v4l2_context.c +++ b/libavcodec/v4l2_context.c @@ -171,6 +171,11 @@ static int v4l2_handle_event(V4L2Context *ctx) return 0; } +if (evt.type == V4L2_EVENT_EOS) { +ctx->done = 1; +return 0; +} + if (evt.type != V4L2_EVENT_SOURCE_CHANGE) return 0; diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index d666edffe4..4862a4c0e5 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -123,6 +123,16 @@ static int v4l2_prepare_decoder(V4L2m2mContext *s) } } +memset(, 0, sizeof(sub)); +sub.type = V4L2_EVENT_EOS; +ret = ioctl(s->fd, VIDIOC_SUBSCRIBE_EVENT, ); +if (ret < 0) { +av_log(s->avctx, AV_LOG_ERROR, +"the v4l2 driver does not support VIDIOC_SUBSCRIBE_EVENT\n" +"you must provide an eos event to finish encode\n"); +return ret; +} + return 0; } diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c index 5b954f4435..3abdd47a4a 100644 --- a/libavcodec/v4l2_m2m_enc.c +++ b/libavcodec/v4l2_m2m_enc.c @@ -155,6 +155,24 @@ static int v4l2_check_b_frame_support(V4L2m2mContext *s) return AVERROR_PATCHWELCOME; } +static int v4l2_subscribe_eos_event(V4L2m2mContext *s) +{ +struct v4l2_event_subscription sub; +int ret; + +memset(, 0, sizeof(sub)); +sub.type = V4L2_EVENT_EOS; +ret = ioctl(s->fd, VIDIOC_SUBSCRIBE_EVENT, ); +if (ret < 0) { +av_log(s->avctx, AV_LOG_ERROR, +"the v4l2 driver does not support VIDIOC_SUBSCRIBE_EVENT\n" +"you must provide an eos event to finish encode\n"); +return ret; +} + +return 0; +} + static int v4l2_prepare_encoder(V4L2m2mContext *s) { AVCodecContext *avctx = s->avctx; @@ -164,6 +182,10 @@ static int v4l2_prepare_encoder(V4L2m2mContext *s) /** * requirements */ +ret = v4l2_subscribe_eos_event(s); +if (ret) +return ret; + ret = v4l2_check_b_frame_support(s); if (ret) return ret; -- 2.25.1 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".