[libcamera-devel] [RFC PATCH 1/5] rpi: cam_helper_imx708: Use Span<> to pass PDAF data
Naushir Patuck
naush at raspberrypi.com
Fri Jun 30 14:44:47 CEST 2023
Hi Umang,
Thank you for this work.
On Fri, 30 Jun 2023 at 13:03, Umang Jain <umang.jain at ideasonboard.com> wrote:
>
> Instead of passing raw buffer pointer and length, construct a Span<>
> and pass it in parsePdafData().
>
> While at it, introduce a constexpr which denotes the scanline of the
> PDAF data in the embedded data. Use that constexpr to compute the
> offset of PDAF buffer in the embedded data.
>
> Np functional changes intended in this patch.
>
> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> ---
> src/ipa/rpi/cam_helper/cam_helper_imx708.cpp | 25 +++++++++++---------
> 1 file changed, 14 insertions(+), 11 deletions(-)
>
> diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp
> index 641ba18f..b24ee643 100644
> --- a/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp
> +++ b/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp
> @@ -42,6 +42,9 @@ constexpr std::initializer_list<uint32_t> registerList =
> { expHiReg, expLoReg, gainHiReg, gainLoReg, lineLengthHiReg,
> lineLengthLoReg, frameLengthHiReg, frameLengthLoReg, temperatureReg };
>
> +/* PDAF data is expect to occupy the third scanline of embedded data. */
> +constexpr uint32_t pdafLineOffsetImx708 = 2;
Could this live in the private member area of the helper class? We have other
const values listed there. Also, I would remove the "Imx708" suffix.
Regards,
Naush
> +
> class CamHelperImx708 : public CamHelper
> {
> public:
> @@ -75,7 +78,7 @@ private:
> void populateMetadata(const MdParser::RegisterMap ®isters,
> Metadata &metadata) const override;
>
> - static bool parsePdafData(const uint8_t *ptr, size_t len, unsigned bpp,
> + static bool parsePdafData(libcamera::Span<const uint8_t> &pdafData, unsigned bpp,
> PdafRegions &pdaf);
>
> bool parseAEHist(const uint8_t *ptr, size_t len, unsigned bpp);
> @@ -116,17 +119,16 @@ void CamHelperImx708::prepare(libcamera::Span<const uint8_t> buffer, Metadata &m
>
> parseEmbeddedData(buffer, metadata);
>
> - /*
> - * Parse PDAF data, which we expect to occupy the third scanline
> - * of embedded data. As PDAF is quite sensor-specific, it's parsed here.
> - */
> + /* Parse sensor-specific PDAF data. */
> size_t bytesPerLine = (mode_.width * mode_.bitdepth) >> 3;
> + size_t pdafDataOffset = pdafLineOffsetImx708 * bytesPerLine;
>
> - if (buffer.size() > 2 * bytesPerLine) {
> + if (buffer.size() > pdafDataOffset) {
> PdafRegions pdaf;
> - if (parsePdafData(&buffer[2 * bytesPerLine],
> - buffer.size() - 2 * bytesPerLine,
> - mode_.bitdepth, pdaf))
> + libcamera::Span<const uint8_t> pdafData{ &buffer[pdafDataOffset],
> + buffer.size() - pdafDataOffset };
> +
> + if (parsePdafData(pdafData, mode_.bitdepth, pdaf))
> metadata.set("pdaf.regions", pdaf);
> }
>
> @@ -241,9 +243,10 @@ void CamHelperImx708::populateMetadata(const MdParser::RegisterMap ®isters,
> metadata.set("device.status", deviceStatus);
> }
>
> -bool CamHelperImx708::parsePdafData(const uint8_t *ptr, size_t len,
> - unsigned bpp, PdafRegions &pdaf)
> +bool CamHelperImx708::parsePdafData(Span<const uint8_t> &data, unsigned bpp, PdafRegions &pdaf)
> {
> + const uint8_t *ptr = data.data();
> + unsigned int len = data.size();
> size_t step = bpp >> 1; /* bytes per PDAF grid entry */
>
> if (bpp < 10 || bpp > 12 || len < 194 * step || ptr[0] != 0 || ptr[1] >= 0x40) {
> --
> 2.39.1
>
More information about the libcamera-devel
mailing list