/* 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 #include #include #include #include #include #include using namespace libcamera; std::unique_ptr Image::fromFrameBuffer(const FrameBuffer *buffer, MapMode mode) { std::unique_ptr 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 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(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(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 &map : maps_) munmap(map.data(), map.size()); } unsigned int Image::numPlanes() const { return planes_.size(); } Span Image::data(unsigned int plane) { assert(plane <= planes_.size()); return planes_[plane]; } Span Image::data(unsigned int plane) const { assert(plane <= planes_.size()); return planes_[plane]; } ibcamera.git/tree/src/ipa/libipa?id=b7ce7e1d342a5f278e6688e23132526f12b728a2'>libipa/algorithm.h
blob: 032a05b56635e3f292afd7d71bf315f4efc30994 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2021, Ideas On Board
 *
 * algorithm.h - ISP control algorithm interface
 */
#pragma once

namespace libcamera {

namespace ipa {

template<typename Context, typename FrameContext, typename Config,
	 typename Params, typename Stats>
class Algorithm
{
public:
	virtual ~Algorithm() {}

	virtual int configure([[maybe_unused]] Context &context,
			      [[maybe_unused]] const Config &configInfo)
	{
		return 0;
	}

	virtual void prepare([[maybe_unused]] Context &context,
			     [[maybe_unused]] Params *params)
	{
	}

	virtual void process([[maybe_unused]] Context &context,
			     [[maybe_unused]] FrameContext *frameContext,
			     [[maybe_unused]] const Stats *stats)
	{
	}
};

} /* namespace ipa */

} /* namespace libcamera */