[PATCH] libcamera: pipeline: Add Mali-C55 ISP pipeline

Barnabás Pőcze pobrn at protonmail.com
Fri Mar 15 03:28:26 CET 2024


Hi


2024. március 14., csütörtök 15:07 keltezéssel, Jacopo Mondi <jacopo.mondi at ideasonboard.com> írta:

> [...]
> diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
> new file mode 100644
> index 000000000000..4508214b864d
> --- /dev/null
> +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
> @@ -0,0 +1,1081 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2024, Ideas on Board Oy
> + *
> + * mali-c55.cpp - Pipeline Handler for ARM's Mali-C55 ISP
> + */
> +
> +#include <algorithm>
> +#include <array>
> +#include <map>
> +#include <memory>
> +#include <set>
> +#include <string>
> +
> +#include <linux/media-bus-format.h>
> +#include <linux/media.h>
> +
> +#include <libcamera/base/log.h>
> +
> +#include <libcamera/camera.h>
> +#include <libcamera/formats.h>
> +#include <libcamera/geometry.h>
> +#include <libcamera/stream.h>
> +
> +#include "libcamera/internal/bayer_format.h"
> +#include "libcamera/internal/camera.h"
> +#include "libcamera/internal/camera_sensor.h"
> +#include "libcamera/internal/device_enumerator.h"
> +#include "libcamera/internal/media_device.h"
> +#include "libcamera/internal/pipeline_handler.h"
> +#include "libcamera/internal/v4l2_subdevice.h"
> +#include "libcamera/internal/v4l2_videodevice.h"
> +
> +namespace {
> +
> +bool isFormatRaw(const libcamera::PixelFormat &pixFmt)
> +{
> +	return libcamera::PixelFormatInfo::info(pixFmt).colourEncoding ==
> +	       libcamera::PixelFormatInfo::ColourEncodingRAW;
> +}
> +
> +}; /* namespace */
> +
> +namespace libcamera {

Does this need to be in the libcamera namespace? This will export a lot of
symbols that don't really need to be exported as far as I can see.
(Maybe in the future?) (Although to be fair, this affects most [all?] pipeline handlers.)


> [...]
> +std::unique_ptr<CameraConfiguration>
> +PipelineHandlerMaliC55::generateConfiguration(Camera *camera,
> +					      Span<const StreamRole> roles)
> +{
> +	MaliC55CameraData *data = cameraData(camera);
> +	std::unique_ptr<CameraConfiguration> config =
> +		std::make_unique<MaliC55CameraConfiguration>(data);
> +	bool frPipeAvailable = true;
> +
> +	if (roles.empty())
> +		return config;
> +
> +	/* Check if one stream is RAW to reserve the FR pipe for it. */
> +	if (std::find_if(roles.begin(), roles.end(),
> +			 [](const StreamRole &role) {
> +				 return role == StreamRole::Raw;
> +			 }) != roles.end())

Doesn't

  if (std::find(roles.begin(), roles.end(), StreamRole::Raw) != roles.end())

work?


> +		frPipeAvailable = false;
> +
> +	for (const StreamRole &role : roles) {
> +		struct MaliC55Pipe *pipe;
> +
> +		/* Assign pipe for this role. */
> +		if (role == StreamRole::Raw) {
> +			pipe = &pipes_[MaliC55FR];
> +		} else {
> +			if (frPipeAvailable) {
> +				pipe = &pipes_[MaliC55FR];
> +				frPipeAvailable = false;
> +			} else {
> +				pipe = &pipes_[MaliC55DS];
> +			}
> +		}
> +
> +		Size size = std::min(Size{ 1920, 1080 }, data->resolution());
> +		PixelFormat pixelFormat;
> +
> +		switch (role) {
> +		case StreamRole::StillCapture:
> +			size = data->resolution();
> +			/* fall-through */

  [[fallthrough]];

?

> +		case StreamRole::VideoRecording:
> +			pixelFormat = formats::NV12;
> +			break;
> +
> +		case StreamRole::Viewfinder:
> +			pixelFormat = formats::RGB565;
> +			break;
> +
> +		case StreamRole::Raw:
> +			pixelFormat = data->bestRawFormat();
> +			if (!pixelFormat.isValid()) {
> +				LOG(MaliC55, Error)
> +					<< "Camera does not support RAW formats";
> +				continue;
> +			}
> +
> +			size = data->resolution();
> +			break;
> +
> +		default:
> +			LOG(MaliC55, Error)
> +				<< "Requested stream role not supported: " << role;
> +			return config;
> +		}
> [...]


Regards,
Barnabás Pőcze


More information about the libcamera-devel mailing list