No description
Find a file
Kieran Bingham aee16c0691 libcamera v0.3.0
abi-compliance checker reports 99.7% binary compatibility and 99.9% source
compatibility between v0.2.0 and v0.3.0. The SONAME has been updated
accordingly and applications must be relinked against this version of
libcamera.

 Total binary compatibility problems: 2, warnings: 0
 Total source compatibility problems: 2, warnings: 0

Specifically, the symbol
  - ControlList::merge(struct ControlList const& source )
 has been replaced with the new symbol:
  - ControlList::merge ( struct ControlList const& source, enum ControlList::MergePolicy policy )

The following commits in this release relate to either a bug fix or improvement
to existing commit.

 - utils: ipc: extract-docs: Fix escape characters in regex
   - Reported-by: Nicolas Dufresne <nicolas@ndufresne.ca>
 - libcamera: Remove empty formats.c
   - Fixes: e0a51061bc ("libcamera: formats: Add 14-bits Bayer RAW formats")
 - libcamera: bayer_format: Add Y12 to bayerToFormat
   - Fixes: ec63095716 ("libcamera: bayer_format: Add unpacked mono 12-bit format to the conversion table")
 - apps: common: dng_writer: Add a default case for switch-case on a modulo
   - Bug: https://bugs.libcamera.org/show_bug.cgi?id=207
 - utils: mojom: Fix build error caused by the mojom tool update
   - Fixes: d17de86904 ("utils: ipc: Update mojo")
 - libcamera: formats: Fix planes bounds check
   - Fixes: e83727a194 ("libcamera: PixelFormatInfo: Add functions stride and frameSize")
 - utils: ipu3: Fix return value check on file output
   - Fixes: 23ac77dc4a ("utils: ipu3: Add IPU3 raw capture unpack utility")
 - ipa: libipa: histogram: Fix documentation of constructor
   - Fixes: 1dc01bc9e6 ("ipa: libipa: histogram: Add transform parameter to constructor")
 - gstreamer: Fix string memory leak
   - Fixes: fc9783acc6 ("gstreamer: Provide colorimetry <> ColorSpace mappings")
 - gstreamer: Use copied camera name
   - Fixes: 58feb69f85 ("gst: libcamerasrc: Implement selection and acquisition")

core:
 - include: linux: Update kernel headers to version v6.7
 - libcamera: v4l2_subdevice: Enable streams API when supported
 - libcamera: base: signal: Update Qt documentation link to Qt 6
 - Documentation: Update Qt documentation links to Qt 6
 - test: gstreamer: Use env instead of registry edit
 - libcamera: Remove empty formats.c
 - libcamera: formats: Add 16-bit mono format
 - libcamera: formats: Fix sort ordering of R10_CSI2P
 - libcamera: bayer_format: Add Y12 to bayerToFormat
 - libcamera: v4l2_subdevice: Explain sort order of formatInfoMap
 - libcamera: object: Fix thread-bound reference in documentation
 - libcamera: signal: Replace object.h inclusion with forward declatation
 - test: object-delete: Test deferred delete just before thread stops
 - libcamera: thread: Ensure deferred deletion of all objects before stopping
 - test: event-thread: Destroy Object from correct thread context
 - test: message: Remove incorrect slow receiver test
 - test: message: Destroy Object from correct thread context
 - test: signal-threads: Destroy Object from correct thread context
 - test: timer-thread: Move timer start from wrong thread to separate test
 - test: timer-thread: Destroy Object from correct thread context
 - libcamera: object: Document and ensure Object deletion constraints
 - libcamera: object: Add and use thread-bound assertion
 - utils: mojom: Fix build error caused by the mojom tool update
 - include: linux: Add RKISP1_V_IMX8MP version
 - libcamera: utils: Add to_underlying() helper function
 - libcamera: Use utils::to_underlying()
 - libcamera: formats: Fix typos in PixelFormatInfo documentation
 - utils: checkstyle.py: Don't presume python3 location
 - utils: checkstyle.py: Update LogCategoryChecker regexp
 - utils: rkisp1: gen-csc-table.py: Don't presume python3 location
 - libcamera: formats: Fix planes bounds check
 - utils: ipu3: Fix return value check on file output
 - README.rst: Report py dependencies
 - meson_options: Autodetect pycamera support
 - libcamera: controls: Fix typo on thermal
 - guides: pipeline-handler: Fix controlInfo_ initialization
 - libcamera: v4l2_subdevice: Add 14-bit Bayer formats
 - utils: checkstyle.py: Add Co-developed-by to known_trailers
 - utils: checkstyle.py: Fix known_trailers sort order
 - libcamera: framebuffer_allocator: Move from argument in constructor
 - libcamera: framebuffer_allocator: Use default destructor
 - libcamera: framebuffer_allocator: Remove entry if allocation fails
 - libcamera: controls: Add policy parameter to ControlList::merge()
 - libcamera: v4l2_subdevice: Rename V4L2SubdeviceFormatInfo
 - libcamera: v4l2_subdevice: Add code member to MediaBusFormatInfo
 - libcamera: v4l2_subdevice: Expose media bus format info as internal API
 - libcamera: v4l2_subdevice: Extend MediaBusFormatInfo with metadata formats
 - libcamera: v4l2_subdevice: Drop V4L2SubdeviceFormat::bitsPerPixel()
 - libcamera: v4l2_subdevice: Rename V4L2SubdeviceFormat::mbus_code to code
 - libcamera: v4l2_subdevice: Add stream support to get/set functions
 - libcamera: v4l2_subdevice: Replace Routing::toString() with operator<<()
 - libcamera: v4l2_subdevice: Add V4L2Subdevice::Route structure
 - libcamera: camera_sensor: Move related classes to subdirectory
 - libcamera: camera_sensor: Drop updateControlInfo() function
 - libcamera: camera_sensor: Reorder functions
 - libcamera: camera_sensor: Test for read-only HBLANK with READ_ONLY flag
 - libcamera: camera_sensor: Expose the Bayer order
 - checkstyle: Work around bug in difflib
 - utils: tuning: readme: Improve names of dependency packages
 - libcamera: internal: Move dma_heaps.[h, cpp] to common directories
 - libcamera: dma_heaps: extend DmaHeap class to support system heap
 - libcamera: internal: Move SharedMemObject class to a common directory
 - libcamera: shared_mem_object: Rename SIZE constant to `size'
 - libcamera: shared_mem_object: Reorganize the code and document the SharedMemObject class
 - libcamera: software_isp: Add SwStatsCpu class
 - libcamera: software_isp: Add Debayer base class
 - libcamera: software_isp: Add DebayerCpu class
 - libcamera: Introduce SoftwareIsp
 - libcamera: swstats_cpu: Add support for 8, 10 and 12 bpp unpacked bayer input
 - libcamera: debayer_cpu: Add support for 8, 10 and 12 bpp unpacked bayer input
 - libcamera: debayer_cpu: Add BGR888 output support
 - libcamera: Add "Software ISP benchmarking" documentation
 - libcamera: software_isp: Apply black level compensation
 - Documentation: coding-style: Clean up header guard style
 - utils: checkstyle.py: Use r'' strings for regular expressions
 - utils: checkstyle.py: Drop period at end of Doxygen one liners
 - libcamera: device_enumerator: Fix spell error
 - libcamera: Fix output spelling error
 - libcamera: utils: Avoid infinite recursion with strtod()
 - libcamera: shared_mem_object: Fix compilation with uClibc
 - meson: Deprecate bitwise operations between different enumeration type
 - Revert "meson: Deprecate bitwise operations between different enumeration type"
 - test: Don't add current build directory to include path
 - libcamera: controls: Generate enum value-name maps
 - libcamera: Drop file name from header comment blocks
 - libcamera: Drop file name from header comment blocks in templates
 - libcamera: Drop remaining file name from header comment blocks
 - test: gstreamer: Simplify single stream test
 - Documentation: Add option to treat Doxygen warnings as errors
 - libcamera: camera_manager: Add environment variable to order pipelines match
 - include: linux: Add RGB48 formats
 - libcamera: formats: Add RGB48 formats
 - include: linux: Add PiSP specific image and config buffer formats
 - libcamera: formats: Add PiSP specific image and config buffer formats
 - libcamera: v4l2_subdevice: Add missing MEDIA_BUS_FMT_xxxx16_1X16 info

pipeline:
 - pipeline: rpi: Always initialize the embedded buffer in tryRunPipeline
 - pipeline: rpi: vc4: Use an unpacked format if no packed one is available
 - pipeline: simple: Add support for MediaTek MT8365 platforms
 - libcamera: pipeline: Add Mali-C55 ISP pipeline
 - libcamera: pipeline: simple: fix size adjustment in validate()
 - libcamera: pipeline: simple: Rename converterBuffers_ and related vars
 - libcamera: pipeline: simple: Enable use of Soft ISP and Soft IPA
 - ipu3: Use posix basename
 - pipeline: rpi: Avoid duplicating size range for the same pixel format
 - libcamera: pipeline: Rename pipelines to a shorter name
 - libcamera: pipeline: Add a get factory by name helper

ipa:
 - libipa: camera_sensor_helper: Mark createInstance() with override
 - utils: ipc: extract-docs: Fix escape characters in regex
 - ipa: rkisp1: agc: Wrap variable length C arrays in spans
 - ipa: rkisp1: Store hardware parameters in IPA context
 - ipa: rkisp1: Fix histogram weights configuration
 - ipa: rkisp1: Support the i.MX8MP ISP version
 - ipa: rpi: cam_helper: Extend embedded data parsing to RAW14 modes
 - utils: ipc: Fix event functions with no parameters
 - utils: ipc: Fix async main interface functions with no parameters
 - libcamera: ipa: Add Soft IPA
 - libcamera: libipa: camera_sensor: Add Sony IMX283 sensor properties
 - libcamera: libipa: camera_sensor: Add Sony IMX335 sensor properties
 - libcamera: libipa: camera_sensor: Add Sony IMX415 sensor properties
 - ipa: libipa: Allow creation of empty Histogram
 - ipa: libipa: Add ExposureModeHelper
 - ipa: libipa: Add AgcMeanLuminance base class
 - ipa: ipu3: Derive ipu3::algorithms::Agc from AgcMeanLuminance
 - ipa: ipu3: Remove bespoke AGC functions from IPU3
 - ipa: rkisp1: Derive rkisp1::algorithms::Agc from AgcMeanLuminance
 - ipa: rkisp1: Remove bespoke Agc functions
 - ipa: libipa: histogram: Add transform parameter to constructor
 - ipa: rpi: Fix for incorrectly reported max shutter speed
 - ipa: rkisp1: agc: Fix histogram construction
 - ipa: libipa: histogram: Fix documentation of constructor
 - ipa: rpi: Add HDR support
 - ipa: rpi: Add accessor function for monoSensor_

apps:
 - gstreamer: Add meson devenv support
 - apps: common: dng_writer: Add a default case for switch-case on a modulo
 - doc: gstreamer: Add missing queues
 - gstreamer: Map R8/R16 pixel format
 - gstreamer: Map 10/12/14/16 bayer formats supports
 - cam: capture_script: Make parseRectangles work for non-array
 - apps: lc-compliance: Check that requests complete successfully
 - apps: lc-compliance: Fix typo in comment
 - apps: lc-compliance: Re-organize source directory
 - android: camera_device: Save capture settings unconditionally
 - v4l2: Unset _TIME_BITS in addition to _FILE_OFFSET_BITS
 - v4l2: meson: Keep defines sorted alphabetically
 - apps: cam: Add support for PPM output format
 - android: camera_device: Always clear descriptors_ in stop()
 - apps: cam: Fix C++20 deprecation warning
 - apps: qcam: Use standard key sequence for quit action
 - gstreamer: Fix string memory leak
 - gstreamer: Use copied camera name

Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-05-19 16:54:11 +01:00
.reuse Documentation: Introduce Camera Sensor Model 2023-09-27 14:35:33 +03:00
Documentation libcamera: camera_manager: Add environment variable to order pipelines match 2024-05-14 23:22:55 +01:00
include libcamera: formats: Add PiSP specific image and config buffer formats 2024-05-16 16:11:06 +01:00
LICENSES Documentation: theme: Specify license of search.png 2022-09-30 21:51:14 +03:00
package/gentoo/media-libs/libcamera libcamera: Standardize URLs to git repositories 2021-09-24 13:25:33 +03:00
src ipa: rpi: Add accessor function for monoSensor_ 2024-05-16 16:11:06 +01:00
subprojects subprojects: Drop leftovers of pybind11 2023-06-04 11:48:00 +03:00
test libcamera: pipeline: Rename pipelines to a shorter name 2024-05-14 23:20:29 +01:00
utils libcamera: Drop remaining file name from header comment blocks 2024-05-09 23:31:15 +03:00
.clang-format libcamera: Remove duplicated SortIncludes in .clang-format 2023-08-02 00:50:31 +03:00
.clang-tidy libcamera: Add missing SPDX headers for miscellaneous CC0-1.0 contents 2022-09-30 21:51:23 +03:00
.gitignore libcamera: Restrict .gitignore build/ and patches/ to the root directory 2021-12-14 12:03:12 +02:00
COPYING.rst libcamera: Summarize licensing terms in COPYING.rst 2020-06-26 15:18:25 +03:00
meson.build libcamera v0.3.0 2024-05-19 16:54:11 +01:00
meson_options.txt Documentation: Add option to treat Doxygen warnings as errors 2024-05-14 14:52:55 +03:00
README.rst README.rst: Report py dependencies 2024-02-28 11:43:34 +00:00

.. SPDX-License-Identifier: CC-BY-SA-4.0

.. section-begin-libcamera

===========
 libcamera
===========

**A complex camera support library for Linux, Android, and ChromeOS**

Cameras are complex devices that need heavy hardware image processing
operations. Control of the processing is based on advanced algorithms that must
run on a programmable processor. This has traditionally been implemented in a
dedicated MCU in the camera, but in embedded devices algorithms have been moved
to the main CPU to save cost. Blurring the boundary between camera devices and
Linux often left the user with no other option than a vendor-specific
closed-source solution.

To address this problem the Linux media community has very recently started
collaboration with the industry to develop a camera stack that will be
open-source-friendly while still protecting vendor core IP. libcamera was born
out of that collaboration and will offer modern camera support to Linux-based
systems, including traditional Linux distributions, ChromeOS and Android.

.. section-end-libcamera
.. section-begin-getting-started

Getting Started
---------------

To fetch the sources, build and install:

.. code::

  git clone https://git.libcamera.org/libcamera/libcamera.git
  cd libcamera
  meson setup build
  ninja -C build install

Dependencies
~~~~~~~~~~~~

The following Debian/Ubuntu packages are required for building libcamera.
Other distributions may have differing package names:

A C++ toolchain: [required]
        Either {g++, clang}

Meson Build system: [required]
        meson (>= 0.60) ninja-build pkg-config

for the libcamera core: [required]
        libyaml-dev python3-yaml python3-ply python3-jinja2

for IPA module signing: [recommended]
        Either libgnutls28-dev or libssl-dev, openssl

        Without IPA module signing, all IPA modules will be isolated in a
        separate process. This adds an unnecessary extra overhead at runtime.

for improved debugging: [optional]
        libdw-dev libunwind-dev

        libdw and libunwind provide backtraces to help debugging assertion
        failures. Their functions overlap, libdw provides the most detailed
        information, and libunwind is not needed if both libdw and the glibc
        backtrace() function are available.

for device hotplug enumeration: [optional]
        libudev-dev

for documentation: [optional]
        python3-sphinx doxygen graphviz texlive-latex-extra

for gstreamer: [optional]
        libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev

for Python bindings: [optional]
        libpython3-dev pybind11-dev

for cam: [optional]
        libevent-dev is required to support cam, however the following
        optional dependencies bring more functionality to the cam test
        tool:

        - libdrm-dev: Enables the KMS sink
        - libjpeg-dev: Enables MJPEG on the SDL sink
        - libsdl2-dev: Enables the SDL sink

for qcam: [optional]
        libtiff-dev qtbase5-dev qttools5-dev-tools

for tracing with lttng: [optional]
        liblttng-ust-dev python3-jinja2 lttng-tools

for android: [optional]
        libexif-dev libjpeg-dev

for Python bindings: [optional]
        pybind11-dev

for lc-compliance: [optional]
        libevent-dev libgtest-dev

for abi-compat.sh: [optional]
        abi-compliance-checker

Basic testing with cam utility
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The ``cam`` utility can be used for basic testing. You can list the cameras
detected on the system with ``cam -l``, and capture ten frames from the first
camera and save them to disk with ``cam -c 1 --capture=10 --file``. See
``cam -h`` for more information about the ``cam`` tool.

In case of problems, a detailed debug log can be obtained from libcamera by
setting the ``LIBCAMERA_LOG_LEVELS`` environment variable:

.. code::

    :~$ LIBCAMERA_LOG_LEVELS=*:DEBUG cam -l

Using GStreamer plugin
~~~~~~~~~~~~~~~~~~~~~~

To use the GStreamer plugin from the source tree, use the meson ``devenv``
command.  This will create a new shell instance with the ``GST_PLUGIN_PATH``
environment set accordingly.

.. code::

  meson devenv -C build

The debugging tool ``gst-launch-1.0`` can be used to construct a pipeline and
test it. The following pipeline will stream from the camera named "Camera 1"
onto the OpenGL accelerated display element on your system.

.. code::

  gst-launch-1.0 libcamerasrc camera-name="Camera 1" ! queue ! glimagesink

To show the first camera found you can omit the camera-name property, or you
can list the cameras and their capabilities using:

.. code::

  gst-device-monitor-1.0 Video

This will also show the supported stream sizes which can be manually selected
if desired with a pipeline such as:

.. code::

  gst-launch-1.0 libcamerasrc ! 'video/x-raw,width=1280,height=720' ! \
       queue ! glimagesink

The libcamerasrc element has two log categories, named libcamera-provider (for
the video device provider) and libcamerasrc (for the operation of the camera).
All corresponding debug messages can be enabled by setting the ``GST_DEBUG``
environment variable to ``libcamera*:7``.

Presently, to prevent element negotiation failures it is required to specify
the colorimetry and framerate as part of your pipeline construction. For
instance, to capture and encode as a JPEG stream and receive on another device
the following example could be used as a starting point:

.. code::

   gst-launch-1.0 libcamerasrc ! \
        video/x-raw,colorimetry=bt709,format=NV12,width=1280,height=720,framerate=30/1 ! \
        queue ! jpegenc ! multipartmux ! \
        tcpserversink host=0.0.0.0 port=5000

Which can be received on another device over the network with:

.. code::

   gst-launch-1.0 tcpclientsrc host=$DEVICE_IP port=5000 ! \
        multipartdemux ! jpegdec ! autovideosink

.. section-end-getting-started

Troubleshooting
~~~~~~~~~~~~~~~

Several users have reported issues with meson installation, crux of the issue
is a potential version mismatch between the version that root uses, and the
version that the normal user uses. On calling `ninja -C build`, it can't find
the build.ninja module. This is a snippet of the error message.

::

  ninja: Entering directory `build'
  ninja: error: loading 'build.ninja': No such file or directory

This can be solved in two ways:

1. Don't install meson again if it is already installed system-wide.

2. If a version of meson which is different from the system-wide version is
   already installed, uninstall that meson using pip3, and install again without
   the --user argument.