diff mbox

[1/2] vb2: Add VB2_FILEIO_ALLOW_ZERO_BYTESUSED flag to vb2_fileio_flags

Message ID 1418729778-14480-1-git-send-email-k.debski@samsung.com (mailing list archive)
State New, archived
Headers show

Commit Message

Kamil Debski Dec. 16, 2014, 11:36 a.m. UTC
The vb2: fix bytesused == 0 handling (8a75ffb) patch changed the behavior
of __fill_vb2_buffer function, so that if bytesused is 0 it is set to the
size of the buffer. However, bytesused set to 0 is used by older codec
drivers as as indication used to mark the end of stream.

To keep backward compatibility, this patch adds a flag passed to the
vb2_queue_init function - VB2_FILEIO_ALLOW_ZERO_BYTESUSED. If the flag is
set upon initialization of the queue, the videobuf2 keeps the value of
bytesused intact and passes it to the driver.

Reported-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Kamil Debski <k.debski@samsung.com>
---
 drivers/media/v4l2-core/videobuf2-core.c |   33 ++++++++++++++++++++++++------
 include/media/videobuf2-core.h           |    3 +++
 2 files changed, 30 insertions(+), 6 deletions(-)

Comments

Jean-Michel Hautbois Dec. 19, 2014, 2:35 p.m. UTC | #1
Hi Kamil,

2014-12-16 12:36 GMT+01:00 Kamil Debski <k.debski@samsung.com>:
> The vb2: fix bytesused == 0 handling (8a75ffb) patch changed the behavior
> of __fill_vb2_buffer function, so that if bytesused is 0 it is set to the
> size of the buffer. However, bytesused set to 0 is used by older codec
> drivers as as indication used to mark the end of stream.
>
> To keep backward compatibility, this patch adds a flag passed to the
> vb2_queue_init function - VB2_FILEIO_ALLOW_ZERO_BYTESUSED. If the flag is
> set upon initialization of the queue, the videobuf2 keeps the value of
> bytesused intact and passes it to the driver.

Nice, this is something we were planning to do :).
But I would split this patch and the second which is specific to
s5p-mfc as this is core specific and should be independant.


> Reported-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> Signed-off-by: Kamil Debski <k.debski@samsung.com>
> ---
>  drivers/media/v4l2-core/videobuf2-core.c |   33 ++++++++++++++++++++++++------
>  include/media/videobuf2-core.h           |    3 +++
>  2 files changed, 30 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
> index d09a891..1068dbb 100644
> --- a/drivers/media/v4l2-core/videobuf2-core.c
> +++ b/drivers/media/v4l2-core/videobuf2-core.c
> @@ -1276,13 +1276,23 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
>                          * userspace clearly never bothered to set it and
>                          * it's a safe assumption that they really meant to
>                          * use the full plane sizes.
> +                        *
> +                        * Some drivers, e.g. old codec drivers, use bytesused
> +                        * == 0 as a way to indicate that streaming is finished.
> +                        * In that case, the driver should use the following
> +                        * io_flag VB2_FILEIO_ALLOW_ZERO_BYTESUSED to keep old
> +                        * userspace applications working.

Not sure if this comment is necessary, as this is already in the commit ?

>                          */
>                         for (plane = 0; plane < vb->num_planes; ++plane) {
>                                 struct v4l2_plane *pdst = &v4l2_planes[plane];
>                                 struct v4l2_plane *psrc = &b->m.planes[plane];
>
> -                               pdst->bytesused = psrc->bytesused ?
> -                                       psrc->bytesused : pdst->length;
> +                               if (vb->vb2_queue->io_flags &
> +                                       VB2_FILEIO_ALLOW_ZERO_BYTESUSED)
> +                                       pdst->bytesused = psrc->bytesused;
> +                               else
> +                                       pdst->bytesused = psrc->bytesused ?
> +                                               psrc->bytesused : pdst->length;
>                                 pdst->data_offset = psrc->data_offset;
>                         }
>                 }
> @@ -1295,6 +1305,12 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
>                  *
>                  * If bytesused == 0 for the output buffer, then fall back
>                  * to the full buffer size as that's a sensible default.
> +                *
> +                * Some drivers, e.g. old codec drivers, use bytesused == 0
> +                * as a way to indicate that streaming is finished. In that
> +                * case, the driver should use the following io_flag
> +                * VB2_FILEIO_ALLOW_ZERO_BYTESUSED to keep old userspace
> +                * applications working.

Again, not sure this is useful.

>                  */
>                 if (b->memory == V4L2_MEMORY_USERPTR) {
>                         v4l2_planes[0].m.userptr = b->m.userptr;
> @@ -1306,11 +1322,16 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
>                         v4l2_planes[0].length = b->length;
>                 }
>
> -               if (V4L2_TYPE_IS_OUTPUT(b->type))
> -                       v4l2_planes[0].bytesused = b->bytesused ?
> -                               b->bytesused : v4l2_planes[0].length;
> -               else
> +               if (V4L2_TYPE_IS_OUTPUT(b->type)) {
> +                       if (vb->vb2_queue->io_flags &
> +                               VB2_FILEIO_ALLOW_ZERO_BYTESUSED)
> +                               v4l2_planes[0].bytesused = b->bytesused;
> +                       else
> +                               v4l2_planes[0].bytesused = b->bytesused ?
> +                                       b->bytesused : v4l2_planes[0].length;
> +               } else {
>                         v4l2_planes[0].bytesused = 0;
> +               }
>
>         }
>
> diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
> index bd2cec2..0540bc3 100644
> --- a/include/media/videobuf2-core.h
> +++ b/include/media/videobuf2-core.h
> @@ -138,10 +138,13 @@ enum vb2_io_modes {
>   * by default the 'streaming' style is used by the file io emulator
>   * @VB2_FILEIO_READ_ONCE:      report EOF after reading the first buffer
>   * @VB2_FILEIO_WRITE_IMMEDIATELY:      queue buffer after each write() call
> + * @VB2_FILEIO_ALLOW_ZERO_BYTESUSED:   the driver setting this flag will handle
> + *                                     bytesused == 0 as a special case
>   */
>  enum vb2_fileio_flags {
>         VB2_FILEIO_READ_ONCE            = (1 << 0),
>         VB2_FILEIO_WRITE_IMMEDIATELY    = (1 << 1),
> +       VB2_FILEIO_ALLOW_ZERO_BYTESUSED = (1 << 2),
>  };
>
>  /**
> --
> 1.7.9.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

I tested it with your coda patch too on i.MX6, thank you, this was annoying :).
JM
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kamil Debski Dec. 19, 2014, 4:03 p.m. UTC | #2
Hi Jean,

> From: Jean-Michel Hautbois [mailto:jhautbois@gmail.com]
> Sent: Friday, December 19, 2014 3:36 PM
> To: Kamil Debski
> Cc: Linux Media Mailing List; m.szyprowski@samsung.com; Hans Verkuil;
> Nicolas Dufresne
> Subject: Re: [PATCH 1/2] vb2: Add VB2_FILEIO_ALLOW_ZERO_BYTESUSED flag
> to vb2_fileio_flags
> 
> Hi Kamil,
> 
> 2014-12-16 12:36 GMT+01:00 Kamil Debski <k.debski@samsung.com>:
> > The vb2: fix bytesused == 0 handling (8a75ffb) patch changed the
> > behavior of __fill_vb2_buffer function, so that if bytesused is 0 it
> > is set to the size of the buffer. However, bytesused set to 0 is used
> > by older codec drivers as as indication used to mark the end of
> stream.
> >
> > To keep backward compatibility, this patch adds a flag passed to the
> > vb2_queue_init function - VB2_FILEIO_ALLOW_ZERO_BYTESUSED. If the
> flag
> > is set upon initialization of the queue, the videobuf2 keeps the
> value
> > of bytesused intact and passes it to the driver.
> 
> Nice, this is something we were planning to do :).
> But I would split this patch and the second which is specific to s5p-
> mfc as this is core specific and should be independant.

This patch contains only changes in the videobuf2-core.c file. The next
patch in the series contains changes in the s5p-mfc driver. There is 
another patch sent today that adds this flag to coda. 

These are all separate patches, two of them are in a single patchset.
Actually, I would send all of them in one patchset, but initially I missed
that the coda driver should also have this change applied. (Nicolas, thank
you for reminding me to do this on IRC).

> 
> 
> > Reported-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> > Signed-off-by: Kamil Debski <k.debski@samsung.com>
> > ---
> >  drivers/media/v4l2-core/videobuf2-core.c |   33
> ++++++++++++++++++++++++------
> >  include/media/videobuf2-core.h           |    3 +++
> >  2 files changed, 30 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/media/v4l2-core/videobuf2-core.c
> > b/drivers/media/v4l2-core/videobuf2-core.c
> > index d09a891..1068dbb 100644
> > --- a/drivers/media/v4l2-core/videobuf2-core.c
> > +++ b/drivers/media/v4l2-core/videobuf2-core.c
> > @@ -1276,13 +1276,23 @@ static void __fill_vb2_buffer(struct
> vb2_buffer *vb, const struct v4l2_buffer *b
> >                          * userspace clearly never bothered to set it
> and
> >                          * it's a safe assumption that they really
> meant to
> >                          * use the full plane sizes.
> > +                        *
> > +                        * Some drivers, e.g. old codec drivers, use
> bytesused
> > +                        * == 0 as a way to indicate that streaming
> is finished.
> > +                        * In that case, the driver should use the
> following
> > +                        * io_flag VB2_FILEIO_ALLOW_ZERO_BYTESUSED to
> keep old
> > +                        * userspace applications working.
> 
> Not sure if this comment is necessary, as this is already in the
> commit ?

The comment were present in the file already, I expanded them to cover the
exception when the VB2_FILEIO_ALLOW_ZERO_BYTESUSED flag is set.
It is also explained in the commit, I agree, but in the end one usually
looks in the source code. 

> 
> >                          */
> >                         for (plane = 0; plane < vb->num_planes;
> ++plane) {
> >                                 struct v4l2_plane *pdst =
> &v4l2_planes[plane];
> >                                 struct v4l2_plane *psrc =
> > &b->m.planes[plane];
> >
> > -                               pdst->bytesused = psrc->bytesused ?
> > -                                       psrc->bytesused : pdst-
> >length;
> > +                               if (vb->vb2_queue->io_flags &
> > +
> VB2_FILEIO_ALLOW_ZERO_BYTESUSED)
> > +                                       pdst->bytesused = psrc-
> >bytesused;
> > +                               else
> > +                                       pdst->bytesused = psrc-
> >bytesused ?
> > +                                               psrc->bytesused :
> > + pdst->length;
> >                                 pdst->data_offset = psrc->data_offset;
> >                         }
> >                 }
> > @@ -1295,6 +1305,12 @@ static void __fill_vb2_buffer(struct
> vb2_buffer *vb, const struct v4l2_buffer *b
> >                  *
> >                  * If bytesused == 0 for the output buffer, then fall
> back
> >                  * to the full buffer size as that's a sensible
> default.
> > +                *
> > +                * Some drivers, e.g. old codec drivers, use
> bytesused == 0
> > +                * as a way to indicate that streaming is finished.
> In that
> > +                * case, the driver should use the following io_flag
> > +                * VB2_FILEIO_ALLOW_ZERO_BYTESUSED to keep old
> userspace
> > +                * applications working.
> 
> Again, not sure this is useful.

Same applies here, I expanded the comment to cover a new case. 

> 
> >                  */
> >                 if (b->memory == V4L2_MEMORY_USERPTR) {
> >                         v4l2_planes[0].m.userptr = b->m.userptr; @@
> > -1306,11 +1322,16 @@ static void __fill_vb2_buffer(struct vb2_buffer
> *vb, const struct v4l2_buffer *b
> >                         v4l2_planes[0].length = b->length;
> >                 }
> >
> > -               if (V4L2_TYPE_IS_OUTPUT(b->type))
> > -                       v4l2_planes[0].bytesused = b->bytesused ?
> > -                               b->bytesused : v4l2_planes[0].length;
> > -               else
> > +               if (V4L2_TYPE_IS_OUTPUT(b->type)) {
> > +                       if (vb->vb2_queue->io_flags &
> > +                               VB2_FILEIO_ALLOW_ZERO_BYTESUSED)
> > +                               v4l2_planes[0].bytesused = b-
> >bytesused;
> > +                       else
> > +                               v4l2_planes[0].bytesused = b-
> >bytesused ?
> > +                                       b->bytesused :
> v4l2_planes[0].length;
> > +               } else {
> >                         v4l2_planes[0].bytesused = 0;
> > +               }
> >
> >         }
> >
> > diff --git a/include/media/videobuf2-core.h
> > b/include/media/videobuf2-core.h index bd2cec2..0540bc3 100644
> > --- a/include/media/videobuf2-core.h
> > +++ b/include/media/videobuf2-core.h
> > @@ -138,10 +138,13 @@ enum vb2_io_modes {
> >   * by default the 'streaming' style is used by the file io emulator
> >   * @VB2_FILEIO_READ_ONCE:      report EOF after reading the first
> buffer
> >   * @VB2_FILEIO_WRITE_IMMEDIATELY:      queue buffer after each
> write() call
> > + * @VB2_FILEIO_ALLOW_ZERO_BYTESUSED:   the driver setting this flag
> will handle
> > + *                                     bytesused == 0 as a special
> case
> >   */
> >  enum vb2_fileio_flags {
> >         VB2_FILEIO_READ_ONCE            = (1 << 0),
> >         VB2_FILEIO_WRITE_IMMEDIATELY    = (1 << 1),
> > +       VB2_FILEIO_ALLOW_ZERO_BYTESUSED = (1 << 2),
> >  };
> >
> >  /**
> > --
> > 1.7.9.5
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-
> media"
> > in the body of a message to majordomo@vger.kernel.org More majordomo
> > info at  http://vger.kernel.org/majordomo-info.html
> 
> I tested it with your coda patch too on i.MX6, thank you, this was
> annoying :).
> JM

You're welcome. Thanks for testing :) 

Best wishes,
Jean-Michel Hautbois Dec. 19, 2014, 4:07 p.m. UTC | #3
2014-12-19 17:03 GMT+01:00 Kamil Debski <k.debski@samsung.com>:
> Hi Jean,
>
>> From: Jean-Michel Hautbois [mailto:jhautbois@gmail.com]
>> Sent: Friday, December 19, 2014 3:36 PM
>> To: Kamil Debski
>> Cc: Linux Media Mailing List; m.szyprowski@samsung.com; Hans Verkuil;
>> Nicolas Dufresne
>> Subject: Re: [PATCH 1/2] vb2: Add VB2_FILEIO_ALLOW_ZERO_BYTESUSED flag
>> to vb2_fileio_flags
>>
>> Hi Kamil,
>>
>> 2014-12-16 12:36 GMT+01:00 Kamil Debski <k.debski@samsung.com>:
>> > The vb2: fix bytesused == 0 handling (8a75ffb) patch changed the
>> > behavior of __fill_vb2_buffer function, so that if bytesused is 0 it
>> > is set to the size of the buffer. However, bytesused set to 0 is used
>> > by older codec drivers as as indication used to mark the end of
>> stream.
>> >
>> > To keep backward compatibility, this patch adds a flag passed to the
>> > vb2_queue_init function - VB2_FILEIO_ALLOW_ZERO_BYTESUSED. If the
>> flag
>> > is set upon initialization of the queue, the videobuf2 keeps the
>> value
>> > of bytesused intact and passes it to the driver.
>>
>> Nice, this is something we were planning to do :).
>> But I would split this patch and the second which is specific to s5p-
>> mfc as this is core specific and should be independant.
>
> This patch contains only changes in the videobuf2-core.c file. The next
> patch in the series contains changes in the s5p-mfc driver. There is
> another patch sent today that adds this flag to coda.
>
> These are all separate patches, two of them are in a single patchset.
> Actually, I would send all of them in one patchset, but initially I missed
> that the coda driver should also have this change applied. (Nicolas, thank
> you for reminding me to do this on IRC).

OK, This is why I have been confused. Well, I still think that core
modification should be a separate patch, and maybe s5f-mpc and coda be
in the same patchset. Not a problem.

>>
>>
>> > Reported-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
>> > Signed-off-by: Kamil Debski <k.debski@samsung.com>
>> > ---
>> >  drivers/media/v4l2-core/videobuf2-core.c |   33
>> ++++++++++++++++++++++++------
>> >  include/media/videobuf2-core.h           |    3 +++
>> >  2 files changed, 30 insertions(+), 6 deletions(-)
>> >
>> > diff --git a/drivers/media/v4l2-core/videobuf2-core.c
>> > b/drivers/media/v4l2-core/videobuf2-core.c
>> > index d09a891..1068dbb 100644
>> > --- a/drivers/media/v4l2-core/videobuf2-core.c
>> > +++ b/drivers/media/v4l2-core/videobuf2-core.c
>> > @@ -1276,13 +1276,23 @@ static void __fill_vb2_buffer(struct
>> vb2_buffer *vb, const struct v4l2_buffer *b
>> >                          * userspace clearly never bothered to set it
>> and
>> >                          * it's a safe assumption that they really
>> meant to
>> >                          * use the full plane sizes.
>> > +                        *
>> > +                        * Some drivers, e.g. old codec drivers, use
>> bytesused
>> > +                        * == 0 as a way to indicate that streaming
>> is finished.
>> > +                        * In that case, the driver should use the
>> following
>> > +                        * io_flag VB2_FILEIO_ALLOW_ZERO_BYTESUSED to
>> keep old
>> > +                        * userspace applications working.
>>
>> Not sure if this comment is necessary, as this is already in the
>> commit ?
>
> The comment were present in the file already, I expanded them to cover the
> exception when the VB2_FILEIO_ALLOW_ZERO_BYTESUSED flag is set.
> It is also explained in the commit, I agree, but in the end one usually
> looks in the source code.

OK

>>
>> >                          */
>> >                         for (plane = 0; plane < vb->num_planes;
>> ++plane) {
>> >                                 struct v4l2_plane *pdst =
>> &v4l2_planes[plane];
>> >                                 struct v4l2_plane *psrc =
>> > &b->m.planes[plane];
>> >
>> > -                               pdst->bytesused = psrc->bytesused ?
>> > -                                       psrc->bytesused : pdst-
>> >length;
>> > +                               if (vb->vb2_queue->io_flags &
>> > +
>> VB2_FILEIO_ALLOW_ZERO_BYTESUSED)
>> > +                                       pdst->bytesused = psrc-
>> >bytesused;
>> > +                               else
>> > +                                       pdst->bytesused = psrc-
>> >bytesused ?
>> > +                                               psrc->bytesused :
>> > + pdst->length;
>> >                                 pdst->data_offset = psrc->data_offset;
>> >                         }
>> >                 }
>> > @@ -1295,6 +1305,12 @@ static void __fill_vb2_buffer(struct
>> vb2_buffer *vb, const struct v4l2_buffer *b
>> >                  *
>> >                  * If bytesused == 0 for the output buffer, then fall
>> back
>> >                  * to the full buffer size as that's a sensible
>> default.
>> > +                *
>> > +                * Some drivers, e.g. old codec drivers, use
>> bytesused == 0
>> > +                * as a way to indicate that streaming is finished.
>> In that
>> > +                * case, the driver should use the following io_flag
>> > +                * VB2_FILEIO_ALLOW_ZERO_BYTESUSED to keep old
>> userspace
>> > +                * applications working.
>>
>> Again, not sure this is useful.
>
> Same applies here, I expanded the comment to cover a new case.
>
>>
>> >                  */
>> >                 if (b->memory == V4L2_MEMORY_USERPTR) {
>> >                         v4l2_planes[0].m.userptr = b->m.userptr; @@
>> > -1306,11 +1322,16 @@ static void __fill_vb2_buffer(struct vb2_buffer
>> *vb, const struct v4l2_buffer *b
>> >                         v4l2_planes[0].length = b->length;
>> >                 }
>> >
>> > -               if (V4L2_TYPE_IS_OUTPUT(b->type))
>> > -                       v4l2_planes[0].bytesused = b->bytesused ?
>> > -                               b->bytesused : v4l2_planes[0].length;
>> > -               else
>> > +               if (V4L2_TYPE_IS_OUTPUT(b->type)) {
>> > +                       if (vb->vb2_queue->io_flags &
>> > +                               VB2_FILEIO_ALLOW_ZERO_BYTESUSED)
>> > +                               v4l2_planes[0].bytesused = b-
>> >bytesused;
>> > +                       else
>> > +                               v4l2_planes[0].bytesused = b-
>> >bytesused ?
>> > +                                       b->bytesused :
>> v4l2_planes[0].length;
>> > +               } else {
>> >                         v4l2_planes[0].bytesused = 0;
>> > +               }
>> >
>> >         }
>> >
>> > diff --git a/include/media/videobuf2-core.h
>> > b/include/media/videobuf2-core.h index bd2cec2..0540bc3 100644
>> > --- a/include/media/videobuf2-core.h
>> > +++ b/include/media/videobuf2-core.h
>> > @@ -138,10 +138,13 @@ enum vb2_io_modes {
>> >   * by default the 'streaming' style is used by the file io emulator
>> >   * @VB2_FILEIO_READ_ONCE:      report EOF after reading the first
>> buffer
>> >   * @VB2_FILEIO_WRITE_IMMEDIATELY:      queue buffer after each
>> write() call
>> > + * @VB2_FILEIO_ALLOW_ZERO_BYTESUSED:   the driver setting this flag
>> will handle
>> > + *                                     bytesused == 0 as a special
>> case
>> >   */
>> >  enum vb2_fileio_flags {
>> >         VB2_FILEIO_READ_ONCE            = (1 << 0),
>> >         VB2_FILEIO_WRITE_IMMEDIATELY    = (1 << 1),
>> > +       VB2_FILEIO_ALLOW_ZERO_BYTESUSED = (1 << 2),
>> >  };
>> >
>> >  /**
>> > --
>> > 1.7.9.5
>> >
>> > --
>> > To unsubscribe from this list: send the line "unsubscribe linux-
>> media"
>> > in the body of a message to majordomo@vger.kernel.org More majordomo
>> > info at  http://vger.kernel.org/majordomo-info.html
>>
>> I tested it with your coda patch too on i.MX6, thank you, this was
>> annoying :).
>> JM
>
> You're welcome. Thanks for testing :)
>
> Best wishes,

Thanks, and best wishes too.
JM
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Hans Verkuil Feb. 17, 2015, 9:11 a.m. UTC | #4
Hi Kamil,

On 12/16/14 12:36, Kamil Debski wrote:
> The vb2: fix bytesused == 0 handling (8a75ffb) patch changed the behavior
> of __fill_vb2_buffer function, so that if bytesused is 0 it is set to the
> size of the buffer. However, bytesused set to 0 is used by older codec
> drivers as as indication used to mark the end of stream.
> 
> To keep backward compatibility, this patch adds a flag passed to the
> vb2_queue_init function - VB2_FILEIO_ALLOW_ZERO_BYTESUSED. If the flag is
> set upon initialization of the queue, the videobuf2 keeps the value of
> bytesused intact and passes it to the driver.

What is the status of this patch series?

Note that io_flags is really the wrong place for this flag, it should
be io_modes. This flag has nothing to do with file I/O.

Regards,

	Hans

> 
> Reported-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> Signed-off-by: Kamil Debski <k.debski@samsung.com>
> ---
>  drivers/media/v4l2-core/videobuf2-core.c |   33 ++++++++++++++++++++++++------
>  include/media/videobuf2-core.h           |    3 +++
>  2 files changed, 30 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
> index d09a891..1068dbb 100644
> --- a/drivers/media/v4l2-core/videobuf2-core.c
> +++ b/drivers/media/v4l2-core/videobuf2-core.c
> @@ -1276,13 +1276,23 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
>  			 * userspace clearly never bothered to set it and
>  			 * it's a safe assumption that they really meant to
>  			 * use the full plane sizes.
> +			 *
> +			 * Some drivers, e.g. old codec drivers, use bytesused
> +			 * == 0 as a way to indicate that streaming is finished.
> +			 * In that case, the driver should use the following
> +			 * io_flag VB2_FILEIO_ALLOW_ZERO_BYTESUSED to keep old
> +			 * userspace applications working.
>  			 */
>  			for (plane = 0; plane < vb->num_planes; ++plane) {
>  				struct v4l2_plane *pdst = &v4l2_planes[plane];
>  				struct v4l2_plane *psrc = &b->m.planes[plane];
>  
> -				pdst->bytesused = psrc->bytesused ?
> -					psrc->bytesused : pdst->length;
> +				if (vb->vb2_queue->io_flags &
> +					VB2_FILEIO_ALLOW_ZERO_BYTESUSED)
> +					pdst->bytesused = psrc->bytesused;
> +				else
> +					pdst->bytesused = psrc->bytesused ?
> +						psrc->bytesused : pdst->length;
>  				pdst->data_offset = psrc->data_offset;
>  			}
>  		}
> @@ -1295,6 +1305,12 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
>  		 *
>  		 * If bytesused == 0 for the output buffer, then fall back
>  		 * to the full buffer size as that's a sensible default.
> +		 *
> +		 * Some drivers, e.g. old codec drivers, use bytesused == 0
> +		 * as a way to indicate that streaming is finished. In that
> +		 * case, the driver should use the following io_flag
> +		 * VB2_FILEIO_ALLOW_ZERO_BYTESUSED to keep old userspace
> +		 * applications working.
>  		 */
>  		if (b->memory == V4L2_MEMORY_USERPTR) {
>  			v4l2_planes[0].m.userptr = b->m.userptr;
> @@ -1306,11 +1322,16 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
>  			v4l2_planes[0].length = b->length;
>  		}
>  
> -		if (V4L2_TYPE_IS_OUTPUT(b->type))
> -			v4l2_planes[0].bytesused = b->bytesused ?
> -				b->bytesused : v4l2_planes[0].length;
> -		else
> +		if (V4L2_TYPE_IS_OUTPUT(b->type)) {
> +			if (vb->vb2_queue->io_flags &
> +				VB2_FILEIO_ALLOW_ZERO_BYTESUSED)
> +				v4l2_planes[0].bytesused = b->bytesused;
> +			else
> +				v4l2_planes[0].bytesused = b->bytesused ?
> +					b->bytesused : v4l2_planes[0].length;
> +		} else {
>  			v4l2_planes[0].bytesused = 0;
> +		}
>  
>  	}
>  
> diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
> index bd2cec2..0540bc3 100644
> --- a/include/media/videobuf2-core.h
> +++ b/include/media/videobuf2-core.h
> @@ -138,10 +138,13 @@ enum vb2_io_modes {
>   * by default the 'streaming' style is used by the file io emulator
>   * @VB2_FILEIO_READ_ONCE:	report EOF after reading the first buffer
>   * @VB2_FILEIO_WRITE_IMMEDIATELY:	queue buffer after each write() call
> + * @VB2_FILEIO_ALLOW_ZERO_BYTESUSED:	the driver setting this flag will handle
> + *					bytesused == 0 as a special case
>   */
>  enum vb2_fileio_flags {
>  	VB2_FILEIO_READ_ONCE		= (1 << 0),
>  	VB2_FILEIO_WRITE_IMMEDIATELY	= (1 << 1),
> +	VB2_FILEIO_ALLOW_ZERO_BYTESUSED	= (1 << 2),
>  };
>  
>  /**
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kamil Debski Feb. 18, 2015, 9:42 a.m. UTC | #5
Hi Hans,

> From: Hans Verkuil [mailto:hverkuil@xs4all.nl]
> Sent: Tuesday, February 17, 2015 10:11 AM
> 
> Hi Kamil,
> 
> On 12/16/14 12:36, Kamil Debski wrote:
> > The vb2: fix bytesused == 0 handling (8a75ffb) patch changed the
> > behavior of __fill_vb2_buffer function, so that if bytesused is 0 it
> > is set to the size of the buffer. However, bytesused set to 0 is used
> > by older codec drivers as as indication used to mark the end of
> stream.
> >
> > To keep backward compatibility, this patch adds a flag passed to the
> > vb2_queue_init function - VB2_FILEIO_ALLOW_ZERO_BYTESUSED. If the
> flag
> > is set upon initialization of the queue, the videobuf2 keeps the
> value
> > of bytesused intact and passes it to the driver.
> 
> What is the status of this patch series?

I have to admit that I had forgotten a bit about this patch, because of
other
important work. Thanks for reminding me :)
 
> Note that io_flags is really the wrong place for this flag, it should
> be io_modes. This flag has nothing to do with file I/O.

What do you think about adding a separate flags field into the vb2_queue
structure? This could be combined with changing io_flags to u8 or a bit
field
to save space.

Best wishes,
Hans Verkuil Feb. 18, 2015, 9:58 a.m. UTC | #6
On 02/18/15 10:42, Kamil Debski wrote:
> Hi Hans,
> 
>> From: Hans Verkuil [mailto:hverkuil@xs4all.nl]
>> Sent: Tuesday, February 17, 2015 10:11 AM
>>
>> Hi Kamil,
>>
>> On 12/16/14 12:36, Kamil Debski wrote:
>>> The vb2: fix bytesused == 0 handling (8a75ffb) patch changed the
>>> behavior of __fill_vb2_buffer function, so that if bytesused is 0 it
>>> is set to the size of the buffer. However, bytesused set to 0 is used
>>> by older codec drivers as as indication used to mark the end of
>> stream.
>>>
>>> To keep backward compatibility, this patch adds a flag passed to the
>>> vb2_queue_init function - VB2_FILEIO_ALLOW_ZERO_BYTESUSED. If the
>> flag
>>> is set upon initialization of the queue, the videobuf2 keeps the
>> value
>>> of bytesused intact and passes it to the driver.
>>
>> What is the status of this patch series?
> 
> I have to admit that I had forgotten a bit about this patch, because of
> other
> important work. Thanks for reminding me :)
>  
>> Note that io_flags is really the wrong place for this flag, it should
>> be io_modes. This flag has nothing to do with file I/O.
> 
> What do you think about adding a separate flags field into the vb2_queue
> structure? This could be combined with changing io_flags to u8 or a bit
> field
> to save space.

I think changing io_flags to a bitfield is a good idea.

	unsigned fileio_read_once:1;
	unsigned fileio_write_immediately:1;
	unsigned allow_zero_bytesused:1;

However, going back to allow_zero_bytesused: this has been broken for
quite some time without anyone complaining (other than you :-) ). Might
it not be better to just fix this properly by calling V4L2_DEC_CMD_STOP,
as done here: https://www.mail-archive.com/linux-media@vger.kernel.org/msg84916.html,
and drop the support for zero bytesused to mark EOS entirely?

I might be too optimistic here. Or perhaps at least add a pr_warn telling
users to switch to V4L2_DEC_CMD_STOP since this will be removed in 2017 or
whatever.

Regards,

	Hans
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kamil Debski Feb. 18, 2015, 10:31 a.m. UTC | #7
Hi,

> From: Hans Verkuil [mailto:hverkuil@xs4all.nl]
> Sent: Wednesday, February 18, 2015 10:58 AM
> 
> On 02/18/15 10:42, Kamil Debski wrote:
> > Hi Hans,
> >
> >> From: Hans Verkuil [mailto:hverkuil@xs4all.nl]
> >> Sent: Tuesday, February 17, 2015 10:11 AM
> >>
> >> Hi Kamil,
> >>
> >> On 12/16/14 12:36, Kamil Debski wrote:
> >>> The vb2: fix bytesused == 0 handling (8a75ffb) patch changed the
> >>> behavior of __fill_vb2_buffer function, so that if bytesused is 0
> it
> >>> is set to the size of the buffer. However, bytesused set to 0 is
> >>> used by older codec drivers as as indication used to mark the end
> of
> >> stream.
> >>>
> >>> To keep backward compatibility, this patch adds a flag passed to
> the
> >>> vb2_queue_init function - VB2_FILEIO_ALLOW_ZERO_BYTESUSED. If the
> >> flag
> >>> is set upon initialization of the queue, the videobuf2 keeps the
> >> value
> >>> of bytesused intact and passes it to the driver.
> >>
> >> What is the status of this patch series?
> >
> > I have to admit that I had forgotten a bit about this patch, because
> > of other important work. Thanks for reminding me :)
> >
> >> Note that io_flags is really the wrong place for this flag, it
> should
> >> be io_modes. This flag has nothing to do with file I/O.
> >
> > What do you think about adding a separate flags field into the
> > vb2_queue structure? This could be combined with changing io_flags to
> > u8 or a bit field to save space.
> 
> I think changing io_flags to a bitfield is a good idea.
> 
> 	unsigned fileio_read_once:1;
> 	unsigned fileio_write_immediately:1;
> 	unsigned allow_zero_bytesused:1;
> 
> However, going back to allow_zero_bytesused: this has been broken for
> quite some time without anyone complaining (other than you :-) ). 

If I remember correctly, it was Nicolas who reported to me the problem 
on the IRC.

> Might
> it not be better to just fix this properly by calling
> V4L2_DEC_CMD_STOP, as done here: https://www.mail-archive.com/linux-
> media@vger.kernel.org/msg84916.html,
> and drop the support for zero bytesused to mark EOS entirely?

I think it would be good to have the backward compatibility for some time.

> I might be too optimistic here. Or perhaps at least add a pr_warn
> telling users to switch to V4L2_DEC_CMD_STOP since this will be removed
> in 2017 or whatever.

Where do you see the pr_warn? I guess it would be good if it was only
displayed once and only when the app uses bytesused == 0 to signal the
EOS. Do you think alike?


> 
> Regards,
> 
> 	Hans

Best wishes,
Hans Verkuil Feb. 18, 2015, 10:43 a.m. UTC | #8
On 02/18/15 11:31, Kamil Debski wrote:
> Hi,
> 
>> From: Hans Verkuil [mailto:hverkuil@xs4all.nl]
>> Sent: Wednesday, February 18, 2015 10:58 AM
>>
>> On 02/18/15 10:42, Kamil Debski wrote:
>>> Hi Hans,
>>>
>>>> From: Hans Verkuil [mailto:hverkuil@xs4all.nl]
>>>> Sent: Tuesday, February 17, 2015 10:11 AM
>>>>
>>>> Hi Kamil,
>>>>
>>>> On 12/16/14 12:36, Kamil Debski wrote:
>>>>> The vb2: fix bytesused == 0 handling (8a75ffb) patch changed the
>>>>> behavior of __fill_vb2_buffer function, so that if bytesused is 0
>> it
>>>>> is set to the size of the buffer. However, bytesused set to 0 is
>>>>> used by older codec drivers as as indication used to mark the end
>> of
>>>> stream.
>>>>>
>>>>> To keep backward compatibility, this patch adds a flag passed to
>> the
>>>>> vb2_queue_init function - VB2_FILEIO_ALLOW_ZERO_BYTESUSED. If the
>>>> flag
>>>>> is set upon initialization of the queue, the videobuf2 keeps the
>>>> value
>>>>> of bytesused intact and passes it to the driver.
>>>>
>>>> What is the status of this patch series?
>>>
>>> I have to admit that I had forgotten a bit about this patch, because
>>> of other important work. Thanks for reminding me :)
>>>
>>>> Note that io_flags is really the wrong place for this flag, it
>> should
>>>> be io_modes. This flag has nothing to do with file I/O.
>>>
>>> What do you think about adding a separate flags field into the
>>> vb2_queue structure? This could be combined with changing io_flags to
>>> u8 or a bit field to save space.
>>
>> I think changing io_flags to a bitfield is a good idea.
>>
>> 	unsigned fileio_read_once:1;
>> 	unsigned fileio_write_immediately:1;
>> 	unsigned allow_zero_bytesused:1;
>>
>> However, going back to allow_zero_bytesused: this has been broken for
>> quite some time without anyone complaining (other than you :-) ). 
> 
> If I remember correctly, it was Nicolas who reported to me the problem 
> on the IRC.
> 
>> Might
>> it not be better to just fix this properly by calling
>> V4L2_DEC_CMD_STOP, as done here: https://www.mail-archive.com/linux-
>> media@vger.kernel.org/msg84916.html,
>> and drop the support for zero bytesused to mark EOS entirely?
> 
> I think it would be good to have the backward compatibility for some time.
> 
>> I might be too optimistic here. Or perhaps at least add a pr_warn
>> telling users to switch to V4L2_DEC_CMD_STOP since this will be removed
>> in 2017 or whatever.
> 
> Where do you see the pr_warn? I guess it would be good if it was only
> displayed once and only when the app uses bytesused == 0 to signal the
> EOS. Do you think alike?

Right, pr_warn_once() would do that.

As I discussed with Pawel on irc I also think we need to do a pr_warn_once
if the application doesn't set bytesused for output streams. Right now we
replace bytesused by length to cater for bad apps, but I really hate that.

I'd like to eventually require a proper setting for bytesused, but that
means apps need to be informed that they do something wrong. Unfortunately,
other than gstreamer I would expect that all those apps are closed source
running on embedded systems.

Nicolas, can you confirm that gstreamer is filling in bytesused for output
buffers correctly? (I.e., doesn't leave it to 0). I may have mentioned this
before, but have you run gstreamer with valgrind? valgrind 3.10 now supports
all v4l2 ioctls.

Regards,

	Hans

> 
> 
>>
>> Regards,
>>
>> 	Hans
> 
> Best wishes,
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
index d09a891..1068dbb 100644
--- a/drivers/media/v4l2-core/videobuf2-core.c
+++ b/drivers/media/v4l2-core/videobuf2-core.c
@@ -1276,13 +1276,23 @@  static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
 			 * userspace clearly never bothered to set it and
 			 * it's a safe assumption that they really meant to
 			 * use the full plane sizes.
+			 *
+			 * Some drivers, e.g. old codec drivers, use bytesused
+			 * == 0 as a way to indicate that streaming is finished.
+			 * In that case, the driver should use the following
+			 * io_flag VB2_FILEIO_ALLOW_ZERO_BYTESUSED to keep old
+			 * userspace applications working.
 			 */
 			for (plane = 0; plane < vb->num_planes; ++plane) {
 				struct v4l2_plane *pdst = &v4l2_planes[plane];
 				struct v4l2_plane *psrc = &b->m.planes[plane];
 
-				pdst->bytesused = psrc->bytesused ?
-					psrc->bytesused : pdst->length;
+				if (vb->vb2_queue->io_flags &
+					VB2_FILEIO_ALLOW_ZERO_BYTESUSED)
+					pdst->bytesused = psrc->bytesused;
+				else
+					pdst->bytesused = psrc->bytesused ?
+						psrc->bytesused : pdst->length;
 				pdst->data_offset = psrc->data_offset;
 			}
 		}
@@ -1295,6 +1305,12 @@  static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
 		 *
 		 * If bytesused == 0 for the output buffer, then fall back
 		 * to the full buffer size as that's a sensible default.
+		 *
+		 * Some drivers, e.g. old codec drivers, use bytesused == 0
+		 * as a way to indicate that streaming is finished. In that
+		 * case, the driver should use the following io_flag
+		 * VB2_FILEIO_ALLOW_ZERO_BYTESUSED to keep old userspace
+		 * applications working.
 		 */
 		if (b->memory == V4L2_MEMORY_USERPTR) {
 			v4l2_planes[0].m.userptr = b->m.userptr;
@@ -1306,11 +1322,16 @@  static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
 			v4l2_planes[0].length = b->length;
 		}
 
-		if (V4L2_TYPE_IS_OUTPUT(b->type))
-			v4l2_planes[0].bytesused = b->bytesused ?
-				b->bytesused : v4l2_planes[0].length;
-		else
+		if (V4L2_TYPE_IS_OUTPUT(b->type)) {
+			if (vb->vb2_queue->io_flags &
+				VB2_FILEIO_ALLOW_ZERO_BYTESUSED)
+				v4l2_planes[0].bytesused = b->bytesused;
+			else
+				v4l2_planes[0].bytesused = b->bytesused ?
+					b->bytesused : v4l2_planes[0].length;
+		} else {
 			v4l2_planes[0].bytesused = 0;
+		}
 
 	}
 
diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
index bd2cec2..0540bc3 100644
--- a/include/media/videobuf2-core.h
+++ b/include/media/videobuf2-core.h
@@ -138,10 +138,13 @@  enum vb2_io_modes {
  * by default the 'streaming' style is used by the file io emulator
  * @VB2_FILEIO_READ_ONCE:	report EOF after reading the first buffer
  * @VB2_FILEIO_WRITE_IMMEDIATELY:	queue buffer after each write() call
+ * @VB2_FILEIO_ALLOW_ZERO_BYTESUSED:	the driver setting this flag will handle
+ *					bytesused == 0 as a special case
  */
 enum vb2_fileio_flags {
 	VB2_FILEIO_READ_ONCE		= (1 << 0),
 	VB2_FILEIO_WRITE_IMMEDIATELY	= (1 << 1),
+	VB2_FILEIO_ALLOW_ZERO_BYTESUSED	= (1 << 2),
 };
 
 /**