[FFmpeg-devel] [PATCH] avcodec/v4l2_m2m: fix draining process (dequeue without input)
Jorge Ramirez-Ortiz
jorge.ramirez-ortiz at linaro.org
Wed Sep 27 20:04:58 EEST 2017
On 09/27/2017 09:31 AM, wm4 wrote:
> On Wed, 27 Sep 2017 09:03:58 -0700
> Jorge Ramirez-Ortiz <jorge.ramirez-ortiz at linaro.org> wrote:
>
>> On 09/27/2017 06:01 AM, wm4 wrote:
>>> On Tue, 26 Sep 2017 16:22:23 -0700
>>> Jorge Ramirez-Ortiz <jorge.ramirez-ortiz at linaro.org> wrote:
>>>
>>>> Stopping the codec when no more input is available causes captured
>>>> buffers that might be ready to be dequeued to be invalidated.
>>>>
>>>> This commit follows the V4L2 API more closely:
>>>> 1. on the last valid input buffer, it sets the V4L2_BUF_FLAG_LAST.
>>>> 2. ffmpeg then will continue dequeuing captured buffers until EPIPE is
>>>> raised by the driver (EOF condition)
>>>>
>>>> This also has the advantage of making the timeout on dequeuing capture
>>>> buffers while draining unnecessary.
>>>> ---
>>>> libavcodec/v4l2_context.c | 162 ++++++++++++++++++----------------------------
>>>> 1 file changed, 64 insertions(+), 98 deletions(-)
>>> I can't really comment on the logic of this code. So LGTM, just some
>>> minor comments/questions.
>>>
>>>> - /* 0. handle errors */
>>>> + /* handle errors */
>>> (Apparently) unrelated cosmetic changes should usually be in separate
>>> patches, but that's probably not worth the trouble in this case.
>> ACK. will do on any following patches - or I can do it on this one if you want.
> Not necessary. In general we prefer separating unrelated changes, but I
> think there's a limit to which we have to cause additional work to
> follow this rule. (It's mainly in cases where the cosmetic changes are
> significant or in completely different code.)
>
>>>> + if (!frame) {
>>>> + /* flag that we are draining */
>>>> + ctx_to_m2mctx(ctx)->draining = 1;
>>>> +
>>>> + /* send EOS */
>>>> + avbuf->buf.m.planes[0].bytesused = 1;
>>>> + avbuf->flags |= V4L2_BUF_FLAG_LAST;
>>>> /* handle the end of stream case */
>>>> + } else {
>>>> + ret = ff_v4l2_buffer_avframe_to_buf(frame, avbuf);
>>>> + if (ret)
>>>> + return ret;
>>>> + }
>>> Wouldn't it be better to switch the if/else bodies and avoid the
>>> negation in the if condition?
>> yes
>> I am going to add a ff_v4l2_buffer_eos() to avoid exposing the bytesused at this
>> level as well.
>> will fix
> That sounds good. So you're going to send a new patch? Then I'll hold
> off applying this one.
yes, just testing.
it is much cleaner this way.
I looked [1] at how the V4L2_BUF_FLAG_LAST is used in the Venus driver and it
seems that I could either set bytesused to 0 _OR_ set the V4L2_BUF_FLAG_LAST
instead (the API suggests using the flag)
I will do both to make sure all cases are covered in drivers that might not use
the flag.
[1]
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/media/platform/qcom/venus/helpers.c?h=v4.14-rc2#n325
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list