[libcamera-devel] [PATCH v2 0/7] Introduce formats:: namespace for libcamera pixel formats

scerveau scerveau at collabora.com
Wed Jun 10 15:08:00 CEST 2020


Hi Laurent,

I was suspecting something like that regarding the drm includes but
could you explain why you dont want to depend on the libdrm package as a 
few runtime dependencies are necessary already ?

Regards.

Stéphane

On 10/6/20 14:57, Laurent Pinchart wrote:
> Hi Stéphane,
> 
> On Wed, Jun 10, 2020 at 02:49:31PM +0200, scerveau wrote:
>> Hello Laurent,
>>
>> Yesterday I tried a different approach from previous attempt, where I
>> proposed to install the libdrm headers in libcamera include folders.
>>
>> Indeed I succeeded to make libcamera compile without including
>> drm_fourcc.h in pixel_format.h, see attached patches.
>>
>> This is building correctly on my machine (ubuntu 18.04) with a simple
>> `meson build`. But I might have missed use cases.
>>
>> Concerning the libdrm dependency or includes, I haven't noticed with
>> Debian/Buster or ArchLinux/latest (docker images) any issue mentioned
>> with libdrm include folder. Both can be found with pkg-config on Ubuntu
>> as well.
> 
> The issue is that we wanted to depend in the Linux kernel DRM headers,
> not the libdrm package. libcamera doesn't interact with DRM directly, so
> depending on libdrm wasn't something we wanted to consider. The Linux
> kernel DRM headers contain drm_fourcc.h, which we initially thought
> would be enough, but it turned out that distributions don't all ship the
> DRM headers as part of the Linux kernel headers package.
> 
>> On the other hand your approach might be better, to remove the
>> dependency to libdrm and create your own define for the format if it's
>> going to be the only dependency, the project will have to libdrm.
>>
>> But in this case the patch is missing to remove those files then:
>>
>> - drm.h
>> - drm_fourcc.h
>> - drm_mode.h
> 
> drm.h and drm_mode.h should indeed be dropped. drm_fourcc.h is still
> used by gen-formats.py to generate the formats.h header, so we need to
> keep it.4
> 
>> On 10/6/20 1:23, Laurent Pinchart wrote:
>>> Hello,
>>>
>>> This patch series is an attempt to fix a problem caused by a direct
>>> dependency on drm_fourcc.h in the libcamera public API.
>>>
>>> libcamera specifies pixel formats using the DRM pixel format FourCC and
>>> modifiers. This requires both internal code and applications to include
>>> drm_fourcc.h. For internal code, we carry a copy of the header to avoid
>>> external dependencies. For third-party applications, however,
>>> drm_fourcc.h needs to be accessible from system includes. It turns out
>>> that the file is shipped by two different packages:
>>>
>>> - libdrm, which typically installs it in /usr/include/libdrm/
>>> - kernel headers or libc headers, which typically installs it in
>>>     /usr/include/drm
>>>
>>> We don't want to make libdrm a dependency for applications using
>>> libcamera. Unfortunately, depending on drm_fourcc.h being provided by
>>> the distribution kernel headers or libc headers package causes issues,
>>> as not all distributions install the header in /usr/include/drm/. Ubuntu
>>> and Gentoo do, but Debian and Arch don't.
>>>
>>> The best option may be to remove the dependency on the macros provided
>>> by drm_fourcc.h, while keeping the pixel format numerical values
>>> identical. This is what this patch series attempts to do.
>>>
>>> Patch 1/7 creates a new libcamera::formats:: namespace and populates it
>>> with constants (in the form of constexpr) for all supported pixel
>>> formats. The values are automatically generated from a list of formats,
>>> stored in formats.yaml, and the numerical values for the DRM FourCCs and
>>> modifiers are extracted from drm_fourcc.h.
>>>
>>> Patches 2/7 to 7/8 then replace usage of the DRM_FORMAT_* macros through
>>> the code.
>>>
>>> Laurent Pinchart (7):
>>>     libcamera: Define constants for pixel formats in the public API
>>>     gst: Replace explicit DRM FourCCs with libcamera formats
>>>     qcam: Replace explicit DRM FourCCs with libcamera formats
>>>     v4l2: Replace explicit DRM FourCCs with libcamera formats
>>>     test: Replace explicit DRM FourCCs with libcamera formats
>>>     libcamera: pipeline: Replace explicit DRM FourCCs with libcamera
>>>       formats
>>>     libcamera: Replace explicit DRM FourCCs with libcamera formats
>>>
>>>    include/libcamera/formats.h.in                |  44 ++++++
>>>    include/libcamera/gen-formats.py              | 118 ++++++++++++++
>>>    include/libcamera/meson.build                 |  22 +++
>>>    include/libcamera/pixel_format.h              |   2 -
>>>    src/android/camera_device.cpp                 |   9 +-
>>>    src/gstreamer/gstlibcamera-utils.cpp          |  62 ++++----
>>>    src/libcamera/formats.cpp                     | 148 +++++++++---------
>>>    src/libcamera/formats.yaml                    | 124 +++++++++++++++
>>>    src/libcamera/pipeline/ipu3/ipu3.cpp          |  16 +-
>>>    .../pipeline/raspberrypi/raspberrypi.cpp      |  10 +-
>>>    src/libcamera/pipeline/rkisp1/rkisp1.cpp      |  19 +--
>>>    src/libcamera/pipeline/vimc/vimc.cpp          |  11 +-
>>>    src/libcamera/pixel_format.cpp                |   4 +-
>>>    src/libcamera/v4l2_pixelformat.cpp            |  83 +++++-----
>>>    src/qcam/dng_writer.cpp                       |  17 +-
>>>    src/qcam/format_converter.cpp                 |  36 +++--
>>>    src/qcam/viewfinder.cpp                       |  10 +-
>>>    src/v4l2/v4l2_camera_proxy.cpp                |  29 ++--
>>>    test/v4l2_videodevice/buffer_cache.cpp        |   3 +-
>>>    19 files changed, 540 insertions(+), 227 deletions(-)
>>>    create mode 100644 include/libcamera/formats.h.in
>>>    create mode 100755 include/libcamera/gen-formats.py
>>>    create mode 100644 src/libcamera/formats.yaml
> 


More information about the libcamera-devel mailing list