On 04/07/2014 09:20 AM, Pawel Osciak wrote:
> I'm thinking, that if we are doing this, perhaps we should just update
> the API to allow this case, i.e. say that if the bytesused is not set
With 'not set' you mean 'is 0', right?
> for any planes, length will be used by default?
> This would be backwards-compatible.
I agree with that. I'll update the doc.
Regards,
Hans
>
> On Tue, Mar 11, 2014 at 6:20 AM, Hans Verkuil <[email protected]> wrote:
>> From: Hans Verkuil <[email protected]>
>>
>> The application should really always fill in bytesused for output
>> buffers, unfortunately the vb2 framework never checked for that.
>>
>> So for single planar formats replace a bytesused of 0 by the length
>> of the buffer, and for multiplanar format do the same if bytesused is
>> 0 for ALL planes.
>>
>> This seems to be what the user really intended if v4l2_buffer was
>> just memset to 0.
>>
>> I'm afraid that just checking for this and returning an error would
>> break too many applications. Quite a few drivers never check for bytesused
>> at all and just use the buffer length instead.
>>
>> Signed-off-by: Hans Verkuil <[email protected]>
>
> Acked-by: Pawel Osciak <[email protected]>
>
>> ---
>> drivers/media/v4l2-core/videobuf2-core.c | 32
>> +++++++++++++++++++++++++++-----
>> 1 file changed, 27 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/media/v4l2-core/videobuf2-core.c
>> b/drivers/media/v4l2-core/videobuf2-core.c
>> index 1a09442..83e78e9 100644
>> --- a/drivers/media/v4l2-core/videobuf2-core.c
>> +++ b/drivers/media/v4l2-core/videobuf2-core.c
>> @@ -1145,19 +1145,35 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb,
>> const struct v4l2_buffer *b
>> memset(v4l2_planes[plane].reserved, 0,
>> sizeof(v4l2_planes[plane].reserved));
>> v4l2_planes[plane].data_offset = 0;
>> + v4l2_planes[plane].bytesused = 0;
>> }
>>
>> /* Fill in driver-provided information for OUTPUT types */
>> if (V4L2_TYPE_IS_OUTPUT(b->type)) {
>> + bool bytesused_is_used;
>> +
>> + /* Check if bytesused == 0 for all planes */
>> + for (plane = 0; plane < vb->num_planes; ++plane)
>> + if (b->m.planes[plane].bytesused)
>> + break;
>> + bytesused_is_used = plane < vb->num_planes;
>> +
>> /*
>> * Will have to go up to b->length when API starts
>> * accepting variable number of planes.
>> + *
>> + * If bytesused_is_used is false, then fall back to
>> the
>> + * full buffer size. In that case userspace clearly
>> + * never bothered to set it and it's a safe
>> assumption
>> + * that they really meant to use the full plane
>> sizes.
>> */
>> for (plane = 0; plane < vb->num_planes; ++plane) {
>> - v4l2_planes[plane].bytesused =
>> - b->m.planes[plane].bytesused;
>> - v4l2_planes[plane].data_offset =
>> - b->m.planes[plane].data_offset;
>> + struct v4l2_plane *pdst =
>> &v4l2_planes[plane];
>> + struct v4l2_plane *psrc =
>> &b->m.planes[plane];
>> +
>> + pdst->bytesused = bytesused_is_used ?
>> + psrc->bytesused : psrc->length;
>> + pdst->data_offset = psrc->data_offset;
>> }
>> }
>>
>> @@ -1183,9 +1199,15 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb,
>> const struct v4l2_buffer *b
>> * so fill in relevant v4l2_buffer struct fields instead.
>> * In videobuf we use our internal V4l2_planes struct for
>> * single-planar buffers as well, for simplicity.
>> + *
>> + * If bytesused == 0, then fall back to the full buffer size
>> + * as that's a sensible default.
>> */
>> if (V4L2_TYPE_IS_OUTPUT(b->type))
>> - v4l2_planes[0].bytesused = b->bytesused;
>> + v4l2_planes[0].bytesused =
>> + b->bytesused ? b->bytesused : b->length;
>> + else
>> + v4l2_planes[0].bytesused = 0;
>> /* Single-planar buffers never use data_offset */
>> v4l2_planes[0].data_offset = 0;
>>
>> --
>> 1.9.0
>>
>
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html