Re: RFC: VIDIOC_ADD_BUFS, a VIDIOC_CREATE_BUFS replacement

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 21/02/2024 16:39, Nicolas Dufresne wrote:
> Le mercredi 21 février 2024 à 11:43 +0100, Hans Verkuil a écrit :
>> On 16/02/2024 20:49, Nicolas Dufresne wrote:
>>> Le lundi 12 février 2024 à 09:38 +0100, Hans Verkuil a écrit :
>>>> On 09/02/2024 19:03, Nicolas Dufresne wrote:
>>>>> Hi,
>>>>>
>>>>> Le jeudi 08 février 2024 à 09:31 +0100, Hans Verkuil a écrit :
>>>>>> Hi all,
>>>>>>
>>>>>> Benjamin Gaignard's 'DELETE_BUFS' series [1] is almost ready, but there is
>>>>>> one outstanding issue: it works closely together with VIDIOC_CREATE_BUFS,
>>>>>> but that ioctl has long since been a thorn in my eye due to the use of
>>>>>> struct v4l2_format embedded in the struct v4l2_create_buffers. This makes
>>>>>> it hard to use in applications.
>>>>>>
>>>>>> The only fields of that struct v4l2_format that are actually used are:
>>>>>>
>>>>>> type
>>>>>>
>>>>>> and, depending on 'type':
>>>>>>
>>>>>> pix.sizeimage
>>>>>> pix_mp.num_planes, pix_mp.plane_fmt.sizeimage
>>>>>> sdr.buffersize
>>>>>> meta.buffersize
>>>>>> vbi.samples_per_line, vbi.count
>>>>>> sliced.io_size
>>>>>
>>>>> Sorry to disrupt, but that is only true since no driver support allocating for a
>>>>> different target input. In stateless CODEC drivers, when these are used as
>>>>> reference frame, extra space is needed to store reference data like motion
>>>>> vectors and more.
>>>>>
>>>>> The size of the data will vary depending on the width/height and pixelformat
>>>>> (from which we can deduce the depth). Of course, some driver will only operate
>>>>> with secondary buffer (post processed display buffer), which is the case for the
>>>>> driver this feature is being demonstrated, but won't be true for other drivers.
>>>>>
>>>>> I sincerely think this RFC does not work for the use case we are adding delete
>>>>> bufs for.
>>>>
>>>> I don't understand your reply. I'm not sure if you are talking about the fields
>>>> that VIDIOC_CREATE_BUFS uses, or about the proposed new ioctl.
>>>>
>>>> If you are talking about CREATE_BUFS, then it really is ignoring all other
>>>> fields from the struct v4l2_format. See vb2_create_bufs() in videobuf2-v4l2.c.
>>>
>>> Which demonstrate that the API is not fully implemented. What in my opinion it
>>> should be doing is to pass the format structure to the driver try_format for the
>>> adjustments to the format to take place. The updated fmt is then returned like
>>> any other calls in V4L2, and buffers are allocated according to that.
>>
>> No, that's really messy. Really, CREATE_BUFS should just use the buffer size
>> given. If the application wants to call TRY_FMT to obtain the size, then it is
>> free to do so and just use that in CREATE_BUFS. It is a bad idea to combine
> 
> There is no IF here, generic application must defer to the driver the
> calculation of the strides (bytesperline) and plane sizes. Otherwise, userspace
> must hardcode HW specific details (like gralloc/Android and minigbm(chromeos)).
> We don't want this for generic Linux software.
> 
>> TRY_FMT and creating new buffers into one ioctl. It should never have been
>> designed like that, and the fact that for all those years nobody bothered to
>> try to do anything with the format field besides getting the buffer size clearly
>> indicates that. It makes the ioctl much too complicated.
> 
> Fine, if you don't think the original design is worth the intended optimization.
> 
>>
>>>
>>>>
>>>> If you are talking about my proposed ADD_BUFS ioctl: what is missing there
>>>> that you need?
>>>
>>> As I explain, allocation size is not something application can calculate easily
>>> for codec driver reference frames. Width, height and bitdepth will have an
>>> impact on the size in a very hardware specific way. There is a solution of
>>> course to use your proposal, which is that user must call TRY_FMT themself in
>>> order to obtain the correct size from the driver (and due to how create bufs in
>>> currently implemented by vb2, it is already thecase). I'm not too concern, we
>>> just loose the powerful (or over engineered, up to you to decide) bit of
>>> CREATE_BUFS (the API, not its implementation), which could have avoided having
>>> to do 2 ioctl. Its likely not a hot path, so again, I'm not worried.
>>>
>>> I do dislike though that this come up after a year of submitting and updating
>>> the original proposal and hope some coding effort will be shared as our budget
>>> owners are reaching their tolerance limits.
>>
>> The only question here is whether to call the new ioctl 'DELETE_BUFS' or 'REMOVE_BUFS'.
>>
>> If you have no particular preference, then I will just ask Benjamin to rename
>> it to REMOVE_BUFS and post a v20. It should be ready to go, hopefully.
> 
> Works for me, we'll rename it REMOVE_BUFS, but we will leave to someone else the
> implementation of ADD_BUFS (and the deprecation of CREATE_BUFS).

I always intended to implement ADD_BUFS myself. My apologies if I ever gave the
impression that I expected Collabora to do that, that was never the case.

Regards,

	Hans

> 
> regards,
> Nicolas
> 
>>
>> Regards,
>>
>> 	Hans
>>
>>>
>>> regards,
>>> Nicolas
>>>
>>>>
>>>> Regards,
>>>>
>>>> 	Hans
>>>>
>>>>>
>>>>> Nicolas
>>>>>
>>>>>>
>>>>>> See vb2_create_bufs() in videobuf2-v4l2.c.
>>>>>>
>>>>>> It's a pain to use since you need to fill in different fields
>>>>>> depending on the type in order to allocate the new buffer memory,
>>>>>> but all you want is just to give new buffer sizes.
>>>>>>
>>>>>> I propose to add a new ioctl:
>>>>>>
>>>>>> diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
>>>>>> index 03443833aaaa..a7398e4c85e7 100644
>>>>>> --- a/include/uapi/linux/videodev2.h
>>>>>> +++ b/include/uapi/linux/videodev2.h
>>>>>> @@ -2624,6 +2624,39 @@ struct v4l2_create_buffers {
>>>>>>  	__u32			reserved[5];
>>>>>>  };
>>>>>>
>>>>>> +/**
>>>>>> + * struct v4l2_add_buffers - VIDIOC_ADD_BUFS argument
>>>>>> + * @type:	enum v4l2_buf_type
>>>>>> + * @memory:	enum v4l2_memory; buffer memory type
>>>>>> + * @count:	entry: number of requested buffers,
>>>>>> + *		return: number of created buffers
>>>>>> + * @num_planes:	requested number of planes for each buffer
>>>>>> + * @sizes:	requested plane sizes for each buffer
>>>>>> + * @start_index:on return, index of the first created buffer
>>>>>> + * @total_count:on return, the total number of allocated buffers
>>>>>> + * @capabilities: capabilities of this buffer type.
>>>>>> + * @flags:	additional buffer management attributes (ignored unless the
>>>>>> + *		queue has V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS capability
>>>>>> + *		and configured for MMAP streaming I/O).
>>>>>> + * @max_num_buffers: if V4L2_BUF_CAP_SUPPORTS_MAX_NUM_BUFFERS capability flag is set
>>>>>> + *		this field indicate the maximum possible number of buffers
>>>>>> + *		for this queue.
>>>>>> + * @reserved:	future extensions
>>>>>> + */
>>>>>> +struct v4l2_add_buffers {
>>>>>> +	__u32			type;
>>>>>> +	__u32			memory;
>>>>>> +	__u32			count;
>>>>>> +	__u32			num_planes;
>>>>>> +	__u32			size[VIDEO_MAX_PLANES];
>>>>>> +	__u32			start_index;
>>>>>> +	__u32			total_count;
>>>>>> +	__u32			capabilities;
>>>>>> +	__u32			flags;
>>>>>> +	__u32			max_num_buffers;
>>>>>> +	__u32			reserved[7];
>>>>>> +};
>>>>>> +
>>>>>>  /**
>>>>>>   * struct v4l2_delete_buffers - VIDIOC_DELETE_BUFS argument
>>>>>>   * @index:	the first buffer to be deleted
>>>>>> @@ -2738,6 +2771,7 @@ struct v4l2_delete_buffers {
>>>>>>
>>>>>>  #define VIDIOC_QUERY_EXT_CTRL	_IOWR('V', 103, struct v4l2_query_ext_ctrl)
>>>>>>  #define VIDIOC_DELETE_BUFS	_IOWR('V', 104, struct v4l2_delete_buffers)
>>>>>> +#define VIDIOC_ADD_BUFS	_IOWR('V', 105, struct v4l2_add_buffers)
>>>>>>
>>>>>>
>>>>>>  /* Reminder: when adding new ioctls please add support for them to
>>>>>>
>>>>>> Note that this patch sits on top of [1].
>>>>>>
>>>>>> The new struct is mostly the same as v4l2_create_buffers, but replacing the
>>>>>> embedded v4l2_format with just the data it actually needs.  I also renamed
>>>>>> 'index' to 'start_index' and added a new 'total_count' field to report the
>>>>>> total number of buffers. VIDIOC_CREATE_BUFS used the 'index' field for that
>>>>>> when called with count == 0, but that is awkward once you allow for deleting
>>>>>> buffers.
>>>>>>
>>>>>> Implementing VIDIOC_ADD_BUFS would be very easy, it is almost all done in
>>>>>> vb2. Drivers would just need to point .vidioc_add_bufs to vb2_ioctl_add_bufs.
>>>>>>
>>>>>> The vb2_queue ops do not change since those are already based on just an
>>>>>> array of requested sizes.
>>>>>>
>>>>>> One reason I am bringing this up is that this has a potential impact on the
>>>>>> name of the new ioctl in [1]. Do we call it 'VIDIOC_DELETE_BUFS' or
>>>>>> 'VIDIOC_REMOVE_BUFS'?
>>>>>>
>>>>>> I like the ADD/REMOVE pair better than ADD/DELETE. I never quite liked
>>>>>> 'CREATE/DELETE' since buffer memory is only created/deleted in the MMAP
>>>>>> streaming case, not with DMABUF/USERPTR. I think add/remove are better names.
>>>>>>
>>>>>> I think CREATE/REMOVE is also acceptable, so I am leaning towards calling
>>>>>> the new ioctl in [1] VIDIOC_REMOVE_BUFS instead of VIDIOC_DELETE_BUFS.
>>>>>>
>>>>>> So, please comment on this RFC, both whether adding a CREATE_BUFS replacement
>>>>>> makes sense, and whether using REMOVE_BUFS instead of DELETE_BUFS makes sense.
>>>>>>
>>>>>> Ideally it would be nice to introduce both ADD_BUFS and REMOVE_BUFS at the
>>>>>> same time, so any userspace application that needs to use REMOVE_BUFS to
>>>>>> remove buffers can rely on the new ADD_BUFS ioctl being available as well.
>>>>>>
>>>>>> Regards,
>>>>>>
>>>>>> 	Hans
>>>>>>
>>>>>> [1]: https://patchwork.linuxtv.org/project/linux-media/list/?series=12195
>>>>>
>>>>
>>>
>>
> 





[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux