summaryrefslogtreecommitdiff
path: root/src/apps/cam/image.cpp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-10-20 01:25:45 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-10-24 23:11:37 +0300
commita8113fb3a89984cc65d51436480cee45b60543e8 (patch)
treef54e072d0b169004bcf2fc4b6262fccf2759e60a /src/apps/cam/image.cpp
parent11f5c3ad0561a4e4b1e06f477ab2022c69803ad2 (diff)
apps: Share common source between applications
Multiple source files in the src/apps/cam/ directory are used by cam, qcam and lc-compliance. They are compiled separately for each application. Move them to a new src/apps/common/ directory and compile them in a static library to decrease the number of compilation operations. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src/apps/cam/image.cpp')
-rw-r--r--src/apps/cam/image.cpp109
1 files changed, 0 insertions, 109 deletions
diff --git a/src/apps/cam/image.cpp b/src/apps/cam/image.cpp
deleted file mode 100644
index fe2cc6da..00000000
--- a/src/apps/cam/image.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/* 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];
-}