Age | Commit message (Collapse) | Author |
|
The signal.h header doesn't need to include object.h. Replace it with a
forward declaration, and instead include object.h in source files that
require it. It can speed up compilation a little bit, but more
importantly avoids unintended dependencies from the Signal class to the
Object class to be added later as the compiler will catch them.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
|
|
Python 3.12 starts emitting the following warning when building libcamera:
.../utils/ipc/generators/mojom_libcamera_generator.py:372:
SyntaxWarning: invalid escape sequence '\.'
if not re.match('^ipa\.[0-9A-Za-z_]+', namespace):
`r' prefix is now required before the regexp.
Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
|
|
The IPADataSerializer::deserializer attempts to optimise code paths and
remove potentially unused code where multiple File Descriptors were not
expected to be utilised.
The addition of multiple SharedFD entries in the IPC highlights this as
a bug.
Clean up the conditionals to ensure that all File Descriptors are
correctly deserialized.
Bug: https://bugs.libcamera.org/show_bug.cgi?id=205
Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Tested-by: Andrey Konovalov <andrey.konovalov@linaro.org>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
|
id='n96' href='#n96'>96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2021, Ideas on Board Oy
*
* image.cpp - Multi-planar image with access to pixel data
*/
#include "image.h"
#include <assert.h>
#include <errno.h>
#include <iostream>
#include <map>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>
using namespace libcamera;
std::unique_ptr<Image> Image::fromFrameBuffer(const FrameBuffer *buffer, MapMode mode)
{
std::unique_ptr<Image> image{ new Image() };
assert(!buffer->planes().empty());
int mmapFlags = 0;
if (mode & MapMode::ReadOnly)
mmapFlags |= PROT_READ;
if (mode & MapMode::WriteOnly)
mmapFlags |= PROT_WRITE;
struct MappedBufferInfo {
uint8_t *address = nullptr;
size_t mapLength = 0;
size_t dmabufLength = 0;
};
std::map<int, MappedBufferInfo> mappedBuffers;
for (const FrameBuffer::Plane &plane : buffer->planes()) {
const int fd = plane.fd.get();
if (mappedBuffers.find(fd) == mappedBuffers.end()) {
const size_t length = lseek(fd, 0, SEEK_END);
mappedBuffers[fd] = MappedBufferInfo{ nullptr, 0, length };
}
const size_t length = mappedBuffers[fd].dmabufLength;
if (plane.offset > length ||
plane.offset + plane.length > length) {
std::cerr << "plane is out of buffer: buffer length="
<< length << ", plane offset=" << plane.offset
<< ", plane length=" << plane.length
<< std::endl;
return nullptr;
}
size_t &mapLength = mappedBuffers[fd].mapLength;
mapLength = std::max(mapLength,
static_cast<size_t>(plane.offset + plane.length));
}
for (const FrameBuffer::Plane &plane : buffer->planes()) {
const int fd = plane.fd.get();
auto &info = mappedBuffers[fd];
if (!info.address) {
void *address = mmap(nullptr, info.mapLength, mmapFlags,
MAP_SHARED, fd, 0);
if (address == MAP_FAILED) {
int error = -errno;
std::cerr << "Failed to mmap plane: "
<< strerror(-error) << std::endl;
return nullptr;
}
info.address = static_cast<uint8_t *>(address);
image->maps_.emplace_back(info.address, info.mapLength);
}
image->planes_.emplace_back(info.address + plane.offset, plane.length);
}
return image;
}
Image::Image() = default;
Image::~Image()
{
for (Span<uint8_t> &map : maps_)
munmap(map.data(), map.size());
}
unsigned int Image::numPlanes() const
{
return planes_.size();
}
Span<uint8_t> Image::data(unsigned int plane)
{
assert(plane <= planes_.size());
return planes_[plane];
}
Span<const uint8_t> Image::data(unsigned int plane) const
{
assert(plane <= planes_.size());
return planes_[plane];
}
|