[libcamera-devel] [PATCH 0/4] libcamera: Fix kernel deprecation warning with output buffers
Jacopo Mondi
jacopo at jmondi.org
Mon Oct 3 09:55:52 CEST 2022
Hi Laurent
On Sun, Oct 02, 2022 at 03:36:08AM +0300, Laurent Pinchart via libcamera-devel wrote:
> Hello,
>
> This patch series fixes a warning printed by videobuf2.
>
> The V4L2 API specification indicates that, for an output video device,
> the driver will interpret a zero bytesused value as the buffer length
> (for v4l2_buffer) or the plane length (for v4l2_plane). The videobuf2
> framework implements this behaviour, but also considers this case as
> deprecated and prints a warning:
>
> [ 54.375534] use of bytesused == 0 is deprecated and will be removed in the future,
> [ 54.388026] use the actual size instead.
This really seems something that should be improved on the kernel
side. If I got it right, bytesused == 0 was used by old codec drivers
to signal end of streaming, and a flag has been added to signal to
videobuf2 that bytesused == 0 is "fine" and maintain compatibility
with such drivers.
I wonder if instead we should have a flag to signal to videobuf that
it should care about bytesused for OUTPUT buffers, so that such old
codec drivers can continue using the == 0 trick, and ignore it for all
other drivers and use the buffer/plane length.
I've cc-ed Hans to know his opinion here..
>
> This is triggered by the RkISP1 and IPU3 pipeline handlers, which don't
> set bytesused for the parameters buffers.
>
> There are multiple ways to fix this issue, and as I couldn't decide
> which one is best, I've included two in this series.
>
> Patch 1/4 is the simple fix, it sets bytesused to the buffer or plane
> length before calling VIDIOC_QBUF, essentially replicating in userspace
> the kernel behaviour that videobuf2 considers deprecated. It may however
> not be considered right, one may argue that the user of the
> V4L2VideoDevice should always set the bytesused values correctly.
>
Since you've already gone for the full solution in patches 2, 3 and
4...
> Patches 2/4 to 4/4 are an attempt at setting bytesused correctly. As the
> FrameBuffer metadata is private and only accessible in const form
> outside of the class (with the exception of V4L2VideoDevice that is
> listed as a friend), patch 2/4 first makes mutable access to the
> metadata possible. In order to avoid exposing mutable access to
> applications, it moves the metadata (and the other remaining private
> members of the FrameBuffer class) to the FrameBuffer::Private class, and
> exposes a mutable accessor there. Patches 3/4 and 4/4 then use that
> accessor to set the bytesused values in the RkISP1 and IPU3 pipeline
> handlers.
... I don't see why we should instead go for the simple fix if we
expect it to fall short as soon as we have variable lenght devices.
Unless of course, we need a short term fix and it's possible to fix it
on the kernel side...
>
> One nice side effect of patch 2/4 is that the V4L2VideoDevice class
> doesn't need to be listed as a friend of the FrameBuffer class anymore.
> If 1/4 is considered a good fix, I would thus be tempted to still merge
> 2/4 just to drop the friend statement.
>
> 3/4 and 4/4 currently hardcode the bytesused value to the size of the
> parameters buffer structure. This works fine with the RkISP1 and IPU3
> pipeline handlers as the parameters buffers have a fixed size, but other
> devices in the future may use a variable-size buffer which would require
> the IPA module to pass the data size to the pipeline handler. I was
> tempted to do the same for RkISP1 and IPU3 for correctness, but decided
> it was probably not worth it.
>
> Note also that, if a future device requires variable-size buffers, the
> approach in patch 1/4 won't work anymore, the more complex fix will then
> be required.
>
> Laurent Pinchart (4):
> libcamera: v4l2_videodevice: Ensure non-zero bytesused for output
> buffers
> libcamera: framebuffer: Move remaining private data to Private class
> pipeline: ipu3: Set bytesused before queuing parameters buffer
> pipeline: rkisp1: Set bytesused before queuing parameters buffer
>
> include/libcamera/framebuffer.h | 19 ++----
> include/libcamera/internal/framebuffer.h | 10 +++-
> .../mm/cros_frame_buffer_allocator.cpp | 8 +--
> .../mm/generic_frame_buffer_allocator.cpp | 9 +--
> src/libcamera/framebuffer.cpp | 58 ++++++++++++-------
> src/libcamera/pipeline/ipu3/ipu3.cpp | 4 ++
> src/libcamera/pipeline/rkisp1/rkisp1.cpp | 4 ++
> src/libcamera/v4l2_videodevice.cpp | 30 +++++-----
> 8 files changed, 85 insertions(+), 57 deletions(-)
>
>
> base-commit: 79f0fc937d95cbf1bd39f04dfd8b83206bda5098
> --
> Regards,
>
> Laurent Pinchart
>
More information about the libcamera-devel
mailing list