90240a79506a3c400f3af4cb0b08746ae87c79e2
The conversion of pointers to integers is implementation defined and
differs between g++ and clang++ when utilising a uint64_t type.
#include <iostream>
int main(int argc, char **argv)
{
void *ptr = reinterpret_cast<void *>(0xf1234567);
uint64_t u64 = reinterpret_cast<uint64_t>(ptr);
uint64_t uint64 = reinterpret_cast<uintptr_t>(ptr);
std::cout << "ptr " << ptr
<< " ptr -> u64 0x" << std::hex << u64
<< " ptr -> uintptr_t -> u64 0x" << std::hex << uint64
<< std::endl;
return 0;
}
When compiled with g++ for a 32-bit platform produces the following
unexpected output:
ptr 0xf1234567 ptr -> u64 0xfffffffff1234567 ptr -> uintptr_t -> u64 0xf1234567
The standards states:
"A pointer can be explicitly converted to any integral type large enough
to hold all values of its type. The mapping function is
implementation-defined. [Note: It is intended to be unsurprising to
those who know the addressing structure of the underlying machine. — end
note]"
And as such the g++ implementation appears to be little more surprising
than expected in this situation.
The MediaDevice passes pointers to the kernel via the struct
media_v2_topology in which pointers are cast using a uint64 type (__u64),
which is affected by the sign extension described above when BIT(32) is
set and causes an invalid address to be given to the kernel.
Ensure that we cast using uintptr_t which is not affected by the sign
extension issue.
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
.. 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:
::
git clone git://linuxtv.org/libcamera.git
cd libcamera
meson 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}
for libcamera: [required]
meson (>= 0.47) ninja-build python3-yaml
If your distribution doesn't provide a recent enough version of meson,
you can install or upgrade it using pip3.
.. code::
pip3 install --user meson
pip3 install --user --upgrade meson
for device hotplug enumeration: [optional]
pkg-config libudev-dev
for qcam: [optional]
qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5
for documentation: [optional]
python3-sphinx doxygen
.. section-end-getting-started
Description
Languages
C++
69.3%
C
17.8%
Python
10.4%
Meson
1.5%
Shell
0.7%
Other
0.3%