No description
Find a file
Kieran Bingham 89227a428a libcamera v0.2.0
ABI Compliance:

abi-compliance-checker reports  94.6% binary compatibilty and 97.6% source
compatibility between 0.1.0 and 0.2.0. The SONAME has been updated accordingly
and applications must be relinked against this version of libcamera.

 - Binary compatibility: 94.6%
 - Source compatibility: 97.6%
 - Total binary compatibility problems: 5, warnings: 2
 - Total source compatibility problems: 3, warnings: 3

The key ABI/API differences here are:

 - AeFlicker

   The control "SceneFlicker" has been removed and replaced by
   AeFlickerMode, AeFlickerDetected and AeFlickerPeriod.

 - struct CameraConfiguration

   Field transform has been removed from the middle position of this structural type.
   Field orientation has been added at the middle position of this structural type.
   Field sensorConfig has been added at the middle position of this structural type.
   Size of this type has been changed from 40 bytes to 96 bytes.

Bugs:

The following bugs are resolved with this release:

 https://bugs.libcamera.org:
 - Bug 91 - libcamerasrc is missing EOS handling
 - Bug 199 - Install error on Ubuntu for Orange Pi 5
 - Bug 205 - ipa_proxy_worker.cpp fails to compile if an interface function has
             two arguments of SharedFD type
 - Bug 206 - Fails to build with Python 3.12

 https://github.com/raspberrypi/libcamera/issues:
 - Assertion '!this->empty()' failed in libcamera::utils::Duration - libcamera-tools 0.0.5-1 #64

Integration overview:

core:
 - utils: checkstyle.py: Treat Malformed trailers as a CommitIssue
 - utils: checkstyle.py: Initialise staged trailers
 - utils: checkstyle.py: Derive Amendment from Commit
 - utils: checkstyle.py: Check trailers for Amendment commits
 - libcamera: controls: Add controls for AEC/AGC flicker avoidance
 - libcamera: yaml: Increase the YAML parser limit
 - utils: checkstyle.py: Extract title and trailers with one command
 - meson: Correctly locate libc++
 - Documentation: theme: Fix compilation with Sphinx >= 7.0.0
 - libcamera: Remove duplicated SortIncludes in `.clang-format`
 - libcamera: stream: Document stride will be 0 for compressed formats
 - README.rst: Drop recommendation to install meson using pip3
 - meson: Don't set _FORTIFY_SOURCE for ChromeOS
 - meson: Simplify check for _FORTIFY_SOURCE
 - libcamera: formats: Fix typo in YV444 V4L2PixelFormat listing
 - Documentation: Introduce Camera Sensor Model
 - libcamera: camera: Introduce SensorConfiguration
 - libcamera: camera_sensor: Support SensorConfiguration
 - libcamera: converter: A few fixes to ConverterFactoryBase documentation
 - libcamera: converter: drop unnecessary #include directive
 - utils: update-kernel-headers: Support git worktrees
 - libcamera: camera_sensor: Cache rotationTransform_
 - libcamera: camera: Introduce Orientation
 - Documentation: Add figures to document Orientation
 - libcamera: properties: Make 'Rotation' the mounting rotation
 - libcamera: transform: Add functions to convert Orientation
 - libcamera: transform: Invert operator*() operands
 - libcamera: transform: Add operations with Orientation
 - test: Add unit test for Transform and Orientation
 - libcamera: Use CameraConfiguration::orientation
 - libcamera: camera_sensor: Cache mounting orientation instead of transform
 - libcamera: transform: Fold transformToOrientation() in its only caller
 - libcamera: transform: Make the transformFromOrientation() function static
 - libcamera: controls: Add controls for HDR
 - libcamera: camera_sensor: Only access V4L_CID_HBLANK if existing
 - Documentation: Add code of conduct
 - Documentation: code-of-conduct: Convert to reStructuredText
 - Documentation: code-of-conduct: Add license information
 - Documentation: code-of-conduct: Add contact information
 - Documentation: contributing: Integrate the code of conduct
 - README.rst: Use code directive for all code examples
 - Documentation: Fix list indentation
 - controls: Add vendor control/property support to generation scripts
 - controls: Update argument handling for controls generation scripts
 - build: controls: Rework how controls and properties are generated
 - libcamera: control: Add vendor control id range reservation
 - libcamera: controls: Use vendor tags for draft controls and properties
 - documentation: Document vendor specific controls and properties handling
 - README.rst: Drop indirect dependencies on Qt5 packages
 - README.rst: Document dependencies for the Python bindings
 - meson_options: Sort options alphabetically
 - meson: Tag all installed files
 - test: log: log_process: Log an error when failing due to incorrect message
 - test: log: log_process: Fix uninitialized variable on process exit failure
 - test: log: log_process: Improve debugging on process exit failures
 - test: log: log_process: Increase process exit timeout
 - test: ipc: unixsocket: Increase process exit timeout
 - test: gstreamer: Remove videoconvert element from pipeline
 - README.rst: Add missing libgtest-dev dependency for lc-compliance
 - meson: Replace hack with usage of '@BASENAME@'
 - libcamera: camera: Fix unused variable compiler warning
 - Documentation: camera-sensor-model: Support Sphinx < 2.0
 - libcamera: camera_sensor: Add OV64A40 sensor properties
 - utils: ipc: Fix deserialization of multiple fd parameters
 - libcamera: device_enumerator: ensure deviceNode is not empty
 - utils: ipc: mojom_libcamera_generator.py: Fix Python warning
 - libcamera: framebuffer_allocator: Remove unnecessary `clear()`
 - hooks: pre-push: Disable interpretation of escape sequences
 - libcamera: geometry: Correct doxygen reference to classes
 - utils: update-mojo.sh: Properly remove old sources
 - utils: update-mojo.sh: Exit immediately on error
 - utils: update-mojo.sh: Change to the libcamera source directory
 - utils: update-mojo.sh: Reject a dirty libcamera tree
 - utils: update-mojo.sh: Commit the mojo update
 - utils: ipc: generate.py: Add bindings directory to Python path
 - utils: ipc: generate.py: Disable attributes checker
 - utils: ipc: Update mojo

pipeline:
 - libcamera: rpi: pipeline_base: Remove populateSensorFormats()
 - libcamera: rpi: pipeline_base: Move findBestFormat to CameraData
 - libcamera: rpi: pipeline_base: Cache sensor format
 - pipeline: rpi: Don't call toV4L2DeviceFormat() from validate()
 - pipeline: rpi: Increase buffer import count to 32
 - pipeline: rpi: Remove additional external dma buf handling logic
 - pipeline: rpi: Rename RPi::Stream::setExternalBuffer()
 - pipeline: rpi: Simplify buffer id generation
 - pipeline: rpi: Reset the frame lengths queue during configure
 - libcamera: rpi: Handle SensorConfiguration
 - libcamera: rpi: Allow platformValidate() to adjust format strides
 - libcamera: rpi: Fix wrong comment indentation
 - libcamera: rpi: Make isRaw/isYuv/isRgb static functions
 - libcamera: rpi: Cache rawStreams and outStreams
 - libcamera: rpi: Add some helpers to PipelineHandlerBase
 - libcamera: rpi: Simplify validate() and configure() for RAW streams
 - libcamera: rpi: Change default stream formats
 - libcamera: rpi: Simplify validate() and configure() for YUV/RGB streams
 - pipeline: rpi: Add RequiresMmap flag to RPi::Stream
 - pipeline: rpi: Add Recurrent and Needs32bitConv flags to RPi::Stream
 - pipeline: rpi: Add SharedMemObject class
 - pipeline: rpi: Add SW downscale status to RPi::Stream
 - pipeline: rpi: Move flip handling validation code
 - pipeline: rpi: Make color space members in RPiCameraConfiguration public
 - pipeline: rpi: vc4: Allocate more embedded data buffers
 - pipeline: rpi: Remove unused variable
 - pipeline: rpi: vc4: Fix drop frame bug when no ISP streams are configured
 - pipeline: rpi: Add some useful logging messages
 - libcamera: pipeline: Fix c++20 compile warning
 - pipeline: rpi: Respect provided stride

ipa:
 - ipa: rpi: common: Handle AEC/AGC flicker controls
 - utils: raspberrypi: ctt: Improved color matrix fitting
 - ipa: rpi: vc4: data: Updated color matrices for RPi Cameras
 - utils: raspberrypi: ctt: Code tidying
 - ipa: rpi: Fix the reporting of Focus FoMs
 - ipa: rpi: imx290: Hide one frame on startup
 - ipa: rpi: agc: Fetch AWB status in process method, not prepare
 - ipa: rpi: agc: Filter exposures before dealing with digital gain
 - ipa: rpi: agc: Split AgcStatus into AgcStatus and AgcPrepareStatus
 - ipa: rpi: vc4: Make the StatisticsPtr construction clearer
 - ipa: rpi: histogram: Add interBinMean()
 - ipa: rpi: agc: Reorganise code for multi-channel AGC
 - ipa: rpi: agc: Implementation of multi-channel AGC
 - ipa: rpi: agc: Add AgcChannelConstraint class
 - ipa: rpi: agc: Use channel constraints in the AGC algorithm
 - ipa: rpi: Fix segfault when parsing invalid json file
 - ipa: rpi: Fix frame count logic when running algorithms
 - ipa: rpi: Avoid skipping IPAs on the first frame after the drop frames
 - ipa: rpi: Add IpaBase::platformStart() member function
 - mojom: pipeline: ipa: rpi: Add fields for PiSP objects
 - ipa: rpi: Add try_lock() to RPiController::Metadata
 - ipa: rpi: Add statsInline to the Controller hardware description
 - ipa: rpi: Add PiSP definitions to the Controller hardware description
 - ipa: rpi: Prepare ALSC for PiSP support
 - ipa: rpi: Prepare AWB for PiSP support
 - ipa: rpi: Add new algorithms for PiSP
 - build: ipa: Fix bug in building multiple IPA interfaces with the same mojom file
 - ipa: rpi: agc: Add an AGC stable region
 - ipa: rpi: contrast: Allow adaptive contrast enhancement to be disabled
 - ipa: rpi: denoise: Support different denoise configurations
 - ipa: rpi: agc: Avoid overwriting caller's statistics pointer
 - ipa: rpi: agc: When AGC channels are changed, start with the 1st channel
 - ipa: rpi: hdr: Add the ability to alter the LSC table
 - ipa: rpi: alsc: Do not re-read the alsc.status metadata
 - ipa: rpi: agc: Allow AGC channels to avoid using "fast desaturation"
 - ipa: rpi: vc4: Move denoise control handling into the VC4 derived IPA
 - ipa: rpi: agc: Fetch AWB status in the prepare method
 - ipa: rpi: agc: Make AGC controls affect all channels
 - ipa: rpi: alsc: Do not allow zero colour ratio statistics
 - ipa: rpi: agc: Fix bug where AeLocked was never getting set
 - ipa: rpi: cac: Minor code improvements and tidying
 - ipa: rpi: Add hardware line rate constraints
 - ipa: rpi: Allow the mean of an empty histogram interval
 - ipa: rpi: black_level: Add an initialValues method
 - ipa: rpi: awb: Add an initialValues method
 - utils: raspberrypi: ctt: Improve the Macbeth Chart search reliability
 - build: controls: Add Raspberry Pi vendor specific controls
 - ipa: vc4: Implement the StatsOutputEnable vendor control
 - ipa: rpi: Provide a Camera Helper for the OV64A40
 - libipa: camera_sensor_helper: Add OV64A40 helper
 - ipa: rpi: vc4: Add OV64A40 tuning files
 - ipa: rpi: Implement HDR control
 - ipa: rpi: vc4: data: Update tuning files for HDR

apps:
 - android: camera_device: Fix requestedStream handling
 - py: Add the SensorConfiguration class
 - py: gen-py-controls: Remove SceneFlicker workaround
 - apps: qcam: Add support for RGB565
 - py: libcamera: Define and use Orientation
 - apps: cam: Add option to set stream orientation
 - py: cam: Add option to set stream orientation
 - gstreamer: Implement element EOS handling
 - gstreamer: Fix unused variable error
 - test: gstreamer: Fix indentation in comments
 - gstreamer: Move negotiation logic to separate function
 - gstreamer: Add GstLibcameraSrcState::clearRequests method
 - gstreamer: Implement renegotiation
 - lc-compliance: Set minimum version for gtest dependency
 - gstreamer: Support for pre-1.16 GstEvent
 - apps: lc-compliance: Fix source file ordering in meson.build

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-01-09 17:21:06 +00:00
.reuse Documentation: Introduce Camera Sensor Model 2023-09-27 14:35:33 +03:00
Documentation Documentation: camera-sensor-model: Support Sphinx < 2.0 2024-01-09 15:35:06 +00:00
include build: controls: Add Raspberry Pi vendor specific controls 2024-01-09 15:39:03 +00: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 libcamera: geometry: Correct doxygen reference to classes 2024-01-09 15:39:04 +00:00
subprojects subprojects: Drop leftovers of pybind11 2023-06-04 11:48:00 +03:00
test test: gstreamer: Remove videoconvert element from pipeline 2023-12-07 18:59:42 +02:00
utils utils: ipc: Update mojo 2024-01-09 15:39:05 +00: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.2.0 2024-01-09 17:21:06 +00:00
meson_options.txt meson_options: Sort options alphabetically 2023-12-06 02:06:18 +02:00
README.rst README.rst: Add missing libgtest-dev dependency for lc-compliance 2023-12-07 19:37:50 +02: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 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 GStreamer plugin from source tree, set the following environment so that
GStreamer can find it. This isn't necessary when libcamera is installed.

.. code::

  export GST_PLUGIN_PATH=$(pwd)/build/src/gstreamer

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" ! 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' ! \
        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 ! \
        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.