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>
284 lines
9.7 KiB
Meson
284 lines
9.7 KiB
Meson
# SPDX-License-Identifier: CC0-1.0
|
|
|
|
project('libcamera', 'c', 'cpp',
|
|
meson_version : '>= 0.60',
|
|
version : '0.2.0',
|
|
default_options : [
|
|
'werror=true',
|
|
'warning_level=2',
|
|
'cpp_std=c++17',
|
|
],
|
|
license : 'LGPL 2.1+')
|
|
|
|
# Generate version information. The libcamera_git_version variable contains the
|
|
# full version with build metadata (patch count and SHA1, e.g.
|
|
# 1.2.3+211-c94a24f4), while the libcamera_version variable contains the
|
|
# major.minor.patch (e.g. 1.2.3) only.
|
|
#
|
|
# If the source tree matches the last git version tag, the build metadata
|
|
# (e.g. +211-c94a24f4) is omitted from libcamera_git_version.
|
|
libcamera_git_version = run_command('utils/gen-version.sh',
|
|
meson.project_build_root(),
|
|
meson.project_source_root(),
|
|
check : false).stdout().strip()
|
|
|
|
# If the source tree isn't under git control, set libcamera_git_version to the
|
|
# meson project version.
|
|
if libcamera_git_version == ''
|
|
libcamera_git_version = meson.project_version()
|
|
endif
|
|
|
|
libcamera_version = libcamera_git_version.split('+')[0]
|
|
project_version = meson.project_version().split('+')[0]
|
|
|
|
# A shallow clone, or a clone without a reachable tag equivalent to the
|
|
# meson.project_version() could leave the project in a mis-described state.
|
|
# Produce a warning in this event, and fix to a best effort.
|
|
if libcamera_version != project_version
|
|
warning('The sources and meson.build disagree about the version: '
|
|
+ libcamera_version + ' != ' + project_version)
|
|
|
|
summary({'libcamera git version' : libcamera_git_version,
|
|
'Source version match' : false,
|
|
},
|
|
bool_yn : true, section : 'Versions')
|
|
|
|
# Re-run gen-version.sh to replace the git version (major.minor.patch) with
|
|
# the meson project version. The build metadata provided by git are kept.
|
|
libcamera_git_version = run_command('utils/gen-version.sh',
|
|
meson.project_build_root(),
|
|
meson.project_source_root(),
|
|
project_version,
|
|
check : false).stdout().strip()
|
|
libcamera_version = project_version
|
|
|
|
# Append a marker to show we have modified this version string.
|
|
libcamera_git_version += '-nvm'
|
|
endif
|
|
|
|
# The major and minor libcamera version components are used as the soname.
|
|
# No ABI/API compatibility is guaranteed between releases (x.y).
|
|
#
|
|
# When we declare a stable ABI/API we will provide a 1.0 release and the
|
|
# soversion at that point will be the 'major' release value (x).
|
|
semver = libcamera_version.split('.')
|
|
libcamera_soversion = semver[0] + '.' + semver[1]
|
|
|
|
summary({ 'Sources': libcamera_git_version, }, section : 'Versions')
|
|
|
|
# This script generates the .tarball-version file on a 'meson dist' command.
|
|
meson.add_dist_script('utils/run-dist.sh')
|
|
|
|
# Configure the build environment.
|
|
cc = meson.get_compiler('c')
|
|
cxx = meson.get_compiler('cpp')
|
|
config_h = configuration_data()
|
|
|
|
if cc.has_header_symbol('unistd.h', 'issetugid')
|
|
config_h.set('HAVE_ISSETUGID', 1)
|
|
endif
|
|
|
|
if cc.has_header_symbol('locale.h', 'locale_t', prefix : '#define _GNU_SOURCE')
|
|
config_h.set('HAVE_LOCALE_T', 1)
|
|
endif
|
|
|
|
if cc.has_header_symbol('stdlib.h', 'secure_getenv', prefix : '#define _GNU_SOURCE')
|
|
config_h.set('HAVE_SECURE_GETENV', 1)
|
|
endif
|
|
|
|
common_arguments = [
|
|
'-Wshadow',
|
|
'-include', meson.current_build_dir() / 'config.h',
|
|
]
|
|
|
|
c_arguments = []
|
|
cpp_arguments = []
|
|
|
|
if cc.get_id() == 'clang'
|
|
if cc.version().version_compare('<9')
|
|
error('clang version is too old, libcamera requires 9.0 or newer')
|
|
endif
|
|
|
|
# Turn _FORTIFY_SOURCE by default on. This is needed on clang only as gcc
|
|
# enables it by default. FORTIFY will not work properly with `-O0`, and may
|
|
# result in macro redefinition errors if the user already has a setting for
|
|
# `-D_FORTIFY_SOURCE`. Do not enable FORTIFY in either of those cases.
|
|
if get_option('optimization') != '0'
|
|
fortify = cc.get_define('_FORTIFY_SOURCE')
|
|
if fortify == ''
|
|
message('Adding _FORTIFY_SOURCE')
|
|
common_arguments += [
|
|
'-D_FORTIFY_SOURCE=2',
|
|
]
|
|
endif
|
|
endif
|
|
|
|
# Use libc++ by default if available instead of libstdc++ when compiling
|
|
# with clang.
|
|
if cc.find_library('c++', required : false).found()
|
|
cpp_arguments += [
|
|
'-stdlib=libc++',
|
|
]
|
|
endif
|
|
|
|
cpp_arguments += [
|
|
'-Wextra-semi',
|
|
'-Wthread-safety',
|
|
]
|
|
endif
|
|
|
|
if cc.get_id() == 'gcc'
|
|
if cc.version().version_compare('<8')
|
|
error('gcc version is too old, libcamera requires 8.0 or newer')
|
|
endif
|
|
|
|
# On gcc 8, the file system library is provided in a separate static
|
|
# library.
|
|
if cc.version().version_compare('<9')
|
|
cpp_arguments += [
|
|
'-lstdc++fs',
|
|
]
|
|
endif
|
|
|
|
# gcc 13 implements the C++23 version of automatic move from local
|
|
# variables in return statements (see
|
|
# https://en.cppreference.com/w/cpp/language/return). As a result, some
|
|
# previously required explicit std::move() in return statements generate
|
|
# warnings. Those moves can't be removed as older compiler versions could
|
|
# use copy constructors instead of move constructors. The easiest fix is to
|
|
# disable the warning. With -Wpessimizing-move enabled, the compiler will
|
|
# still warn of pessimizing moves, only the redundant but not pessimizing
|
|
# moves will be ignored.
|
|
if cc.version().version_compare('>=13')
|
|
cpp_arguments += [
|
|
'-Wno-redundant-move',
|
|
]
|
|
endif
|
|
|
|
# gcc 7.1 introduced processor-specific ABI breakages related to parameter
|
|
# passing on ARM platforms. This generates a large number of messages
|
|
# during compilation. Silence them.
|
|
if host_machine.cpu_family() == 'arm'
|
|
cpp_arguments += [
|
|
'-Wno-psabi',
|
|
]
|
|
endif
|
|
endif
|
|
|
|
# We use C99 designated initializers for arrays as C++ has no equivalent
|
|
# feature. Both gcc and clang support this extension, but recent
|
|
# versions of clang generate a warning that needs to be disabled.
|
|
if cc.has_argument('-Wno-c99-designator')
|
|
common_arguments += [
|
|
'-Wno-c99-designator',
|
|
]
|
|
endif
|
|
|
|
c_arguments += common_arguments
|
|
cpp_arguments += common_arguments
|
|
|
|
add_project_arguments(c_arguments, language : 'c')
|
|
add_project_arguments(cpp_arguments, language : 'cpp')
|
|
add_project_link_arguments(cpp_arguments, language : 'cpp')
|
|
|
|
libcamera_includes = include_directories('include')
|
|
|
|
# Sub-directories fill py_modules with their dependencies.
|
|
py_modules = []
|
|
|
|
# Libraries used by multiple components
|
|
liblttng = dependency('lttng-ust', required : get_option('tracing'))
|
|
|
|
# Pipeline handlers
|
|
#
|
|
pipelines = get_option('pipelines')
|
|
|
|
arch_arm = ['arm', 'aarch64']
|
|
arch_x86 = ['x86', 'x86_64']
|
|
pipelines_support = {
|
|
'imx8-isi': arch_arm,
|
|
'ipu3': arch_x86,
|
|
'rkisp1': arch_arm,
|
|
'rpi/vc4': arch_arm,
|
|
'simple': arch_arm,
|
|
'uvcvideo': ['any'],
|
|
'vimc': ['test'],
|
|
}
|
|
|
|
if pipelines.contains('all')
|
|
pipelines = pipelines_support.keys()
|
|
elif pipelines.contains('auto')
|
|
host_cpu = host_machine.cpu_family()
|
|
pipelines = []
|
|
foreach pipeline, archs : pipelines_support
|
|
if host_cpu in archs or 'any' in archs
|
|
pipelines += pipeline
|
|
endif
|
|
endforeach
|
|
endif
|
|
|
|
# Tests require the vimc pipeline handler, include it automatically when tests
|
|
# are enabled.
|
|
if get_option('test')
|
|
foreach pipeline, archs : pipelines_support
|
|
if 'test' in archs and pipeline not in pipelines
|
|
message('Enabling ' + pipeline + ' pipeline handler for tests')
|
|
pipelines += pipeline
|
|
endif
|
|
endforeach
|
|
endif
|
|
|
|
# Utilities are parsed first to provide support for other components.
|
|
subdir('utils')
|
|
|
|
subdir('include')
|
|
subdir('src')
|
|
|
|
# The documentation and test components are optional and can be disabled
|
|
# through configuration values. They are enabled by default.
|
|
|
|
subdir('Documentation')
|
|
subdir('test')
|
|
|
|
if not meson.is_cross_build()
|
|
kernel_version_req = '>= 5.0.0'
|
|
kernel_version = run_command('uname', '-r', check : true).stdout().strip()
|
|
if not kernel_version.version_compare(kernel_version_req)
|
|
warning('The current running kernel version @0@ is too old to run libcamera.'
|
|
.format(kernel_version))
|
|
warning('If you intend to use libcamera on this machine, please upgrade to a kernel @0@.'
|
|
.format(kernel_version_req))
|
|
endif
|
|
endif
|
|
|
|
# Create a symlink from the build root to the source root. This is used when
|
|
# running libcamera from the build directory to locate resources in the source
|
|
# directory (such as IPA configuration files).
|
|
run_command('ln', '-fsT', meson.project_source_root(), meson.project_build_root() / 'source',
|
|
check : true)
|
|
|
|
configure_file(output : 'config.h', configuration : config_h)
|
|
|
|
# Check for python installation and modules.
|
|
py_mod = import('python')
|
|
py_mod.find_installation('python3', modules : py_modules)
|
|
|
|
## Summarise Configurations
|
|
summary({
|
|
'Enabled pipelines': pipelines,
|
|
'Enabled IPA modules': enabled_ipa_names,
|
|
'Controls files': controls_files,
|
|
'Properties files': properties_files,
|
|
'Hotplug support': libudev.found(),
|
|
'Tracing support': tracing_enabled,
|
|
'Android support': android_enabled,
|
|
'GStreamer support': gst_enabled,
|
|
'Python bindings': pycamera_enabled,
|
|
'V4L2 emulation support': v4l2_enabled,
|
|
'cam application': cam_enabled,
|
|
'qcam application': qcam_enabled,
|
|
'lc-compliance application': lc_compliance_enabled,
|
|
'Unit tests': test_enabled,
|
|
},
|
|
section : 'Configuration',
|
|
bool_yn : true)
|