[ANN] Report of Media Summit: V4L2 Future Work

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

 



Media Summit: V4L2 Future Work
October 30, 2019 - Lyon, France

Many thanks to the Linux Foundation for hosting this meeting. Much appreciated!

Please reply to this report with any comments/corrections. Especially if I missed
any action items or attendees!


Original announcement:

https://lore.kernel.org/linux-media/2ef17f32-5957-7b52-fea3-19913ec1c7b3@xxxxxxxxx/T/


Attendees:

Michael Ashton <mpa@xxxxxx> (Facebook/Oculus)
Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx>
Alexandre Courbot <acourbot@xxxxxxxxxxxx> (Google, Chrome OS)
Nicolas Dufresne <nicolas@xxxxxxxxxxxxx>
Tomasz Figa <tfiga@xxxxxxxxxxxx> (Google, Chrome OS)
Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx>
Daniel Gomez <daniel@xxxxxxxx>
Peter Griffin <peter.griffin@xxxxxxxxxx>
Dafna Hirschfeld <dafna.hirschfeld@xxxxxxxxxxxxx>
Eugen Hristev <eugen.hristev@xxxxxxxxxxxxx>
Shuah Khan <skhan@xxxxxxxxxxxxxxxxxxx>
Helen Koike <helen.koike@xxxxxxxxxxxxx>
Jacopo Mondi <jacopo@xxxxxxxxxx>
Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>
Niklas Söderlund <niklas.soderlund@xxxxxxxxxxxx>
Stanimir Varbanov <stanimir.varbanov@xxxxxxxxxx>
Hans Verkuil <hverkuil@xxxxxxxxx> (Cisco Systems Norway)


V4L2 Future Work
----------------

This discussion was intentionally not very structured. The goal was
to see what the main pain points are and how to fix those.

Boris Brezillon made an RFC v3 with proposed new ioctls:

https://patchwork.linuxtv.org/cover/59345/


The main blockers for drivers/userspace today with our current
API are:

- Missing format (DRM) modifier support
- one dmabuf fd with per-plane offsets (mplane API today requires
  separate dmabuf fds for each plane)
- userspace cannot specify offsets of planes

Note that the DRM modifiers are per frame and not per plane.
Typically the modifiers describe tiled and/or compressed formats.
Compressed formats are typically lossless HW compression schemes
(often proprietary) used to reduce memory bandwidth. Compressed
formats are considered opaque formats by userspace.

EGL has a dma-buf extension that supports modifiers (see
EXT_image_dma_buf_import_modifiers). Also see Wayland protocol:
https://gitlab.freedesktop.org/wayland/wayland-protocols/blob/master/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml


While not strictly a blocker feature, it is desirable to get
rid of the distinction between the single and multiplane APIs
and always describe formats as multiplane. The advantage of
the multiplane API is that bytesperline and sizeimage are
described per plane, which is much easier to understand, and it
does not require userspace to calculate bytesperline for the chroma
planes.


The RFCv3 replaces v4l2_format with a new struct, but the consensus
was that it is much better to create a new ioctl just to replace the
v4l2_pix_format struct and leave the other structs in the v4l2_format
union alone. Two reasons: there is no need to change anything for the
other VBI etc. buffer types, it's only v4l2_pix_format that no longer
scales; and it is easy to extend a struct v4l2_pix_format_ext in the
future. You can't really do that if it is in a union.


If a new ENUM_FMT_EXT ioctl is created, then let it return all
pixelformats + modifiers combinations rather than having to enumerate
over all combinations. This reduces the number of ioctl calls that
userspace has to do.

To indicate if a format supports supports putting all planes in one
buffer, or supports putting each plane in a separate buffer, new format
flags are needed. Userspace needs to know this.

The vb2 core should check if all planes belong to the same buffer or not,
and validate it based on the driver requirements. I.e. in the case of
dmabuf import it should check that all dmabuf FDs refer to the same
memory and that the per-plane offsets are valid.

The current RFCv3 drops the v4l2_timecode field. Nicolas mentioned that
while this is not used by any mainline drivers (except virtual drivers)
this is in fact used by out-of-tree drivers. While they don't use the
same struct, they do return this information since it is used by broadcast
systems. So this field needs to return.


In the past there was a discussion of creating new fourcc codes to
describe pixelformats for both DRM and V4L2. This didn't work out, but
it was suggested that we just document the mapping between DRM and V4L2
pixelformats as a reference to end-users. We can maintain that as part of
our V4L2 documentation.


The suggestion was made to add a channel number to the new format struct
and to the streaming I/O ioctls to indicate support for streaming
multiple channels. This would allow the M2M framework to support multiple
capture and output streams per instance, something that is not possible
today. One use-case would be support for H.264 Scalable Video Coding.
Another is support for compositors.

This would need more research, but the new API should prepare for this.


A known outstanding issue is syncing buffers between the CPU and the
device. Drivers that want to update the buffer before returning it
to userspace do not make the right dmabuf calls. A patch series fixing
this was never finished. Google offered to pick this up and give it
another try.


The general consensus was that these proposed new ioctls only address
part of the problems. The complexity of modern camera pipelines creates
too many video and v4l-subdev devices, making it very hard for userspace
to control all of this.

Ideally it should be possible to control a camera ISP through a single
/dev/mediaX only, rather than though a myriad of other devices. This
is however a huge change, requiring a lot of work. Quite possible a
completely new API would be required for this. There is real interest
in solving this problem, which includes assigning resources to work
on this.

Google will collect some requirements and report on that later this year.
Based on that we might decide on a three day brainstorm session in
Brussels before or after FOSDEM (Feb 1-2, 2020).


Action Items
------------

Nicolas Dufresne:

- provide more info about timecode use in userspace for Hans Verkuil
  to verify if struct v4l2_timecode provides sufficient information.

Tomasz Figa:

- Check if we can drop support for using two memory banks for luma and
  chroma planes? It's only used by the s5p architecture, and dropping
  support for that would simplify some of the code. Note that s5p doesn't
  support dmabuf.

- Continue work on my old patch series dealing with dma_buf_begin/end_cpu_access():

  https://git.linuxtv.org/hverkuil/media_tree.git/log/?h=vb2-cpu-access

  This series converts most drivers to use these dmabuf functions.

  See also this thread: https://patchwork.kernel.org/patch/7159871/
  As mentioned in my last reply, the outstanding drivers that are not
  converted are netup_unidvb, coda, exynos4-is, rcar_jpu and au0828:
  as far as I remember I did not know how to convert coda and exynos4-is
  and never found the time to figure that out. The others are new and need
  to be looked at again. There are probably more drivers that need work
  since my patch series is from September 2015.

- Collect API requirements for a camera ISP API and report on that later
  this year.

Boris Brezillon:

- Post an RFCv4 that takes more of these issues into accounts. Research
  multistream support a bit more to see what would be involved adding support
  for that.



[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