Message ID | 20240502080925.31730-3-naush@raspberrypi.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Naush On Thu, May 02, 2024 at 09:09:22AM GMT, Naushir Patuck wrote: > Add the Raspberry Pi 5 PiSP specific verification format: > - V4L2_PIX_FMT_RPI_BE > > Add the Raspberry Pi 5 PiSP specific compressed Bayer format types 1/2: > - V4L2_PIX_FMT_PISP_COMP1_xxx > - V4L2_PIX_FMT_PISP_COMP2_xxx > > Add the Raspberry Pi 5 PiSP Frontend and Backend config formats: > - V4L2_META_FMT_RPI_FE_CFG > - V4L2_META_FMT_RPI_BE_CFG > > Add the Raspberry Pi 5 PiSP Frontend statistics format: > - V4L2_META_FMT_RPI_FE_STATS > > Add 16-bit Bayer formats: > - MEDIA_BUS_FMT_Sxxx16_1X16 > > Signed-off-by: Naushir Patuck <naush@raspberrypi.com> > Reviewed-by: David Plowman <david.plowman@raspberrypi.com> > --- > include/libcamera/internal/bayer_format.h | 2 + > include/linux/drm_fourcc.h | 5 +++ > include/linux/videodev2.h | 21 ++++++++++ > src/libcamera/bayer_format.cpp | 14 +++++++ > src/libcamera/formats.cpp | 51 ++++++++++++++++++++++- > src/libcamera/formats.yaml | 16 +++++++ > src/libcamera/v4l2_pixelformat.cpp | 10 +++++ > src/libcamera/v4l2_subdevice.cpp | 28 +++++++++++++ > 8 files changed, 146 insertions(+), 1 deletion(-) > > diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h > index 78ba3969913d..164743f7e9f6 100644 > --- a/include/libcamera/internal/bayer_format.h > +++ b/include/libcamera/internal/bayer_format.h > @@ -34,6 +34,8 @@ public: > None = 0, > CSI2 = 1, > IPU3 = 2, > + PISP1 = 3, > + PISP2 = 4, > }; > > constexpr BayerFormat() > diff --git a/include/linux/drm_fourcc.h b/include/linux/drm_fourcc.h > index 4ee421b95730..322563763cbc 100644 > --- a/include/linux/drm_fourcc.h > +++ b/include/linux/drm_fourcc.h > @@ -490,6 +490,7 @@ extern "C" { > #define DRM_FORMAT_MOD_VENDOR_ALLWINNER 0x09 > #define DRM_FORMAT_MOD_VENDOR_AMLOGIC 0x0a > #define DRM_FORMAT_MOD_VENDOR_MIPI 0x0b > +#define DRM_FORMAT_MOD_VENDOR_RPI 0x0c > > /* add more to the end as needed */ > > @@ -1670,6 +1671,10 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier) > */ > #define MIPI_FORMAT_MOD_CSI2_PACKED fourcc_mod_code(MIPI, 1) > > +#define PISP_FORMAT_MOD_COMPRESS_MODE1 fourcc_mod_code(RPI, 1) > +#define PISP_FORMAT_MOD_COMPRESS_MODE2 fourcc_mod_code(RPI, 2) > +#define PISP_FORMAT_MOD_VERIFICATION fourcc_mod_code(RPI, 3) > + Ideally, this should have been resolved upstream https://www.spinics.net/lists/dri-devel/msg435203.html but this hasn't progressed much, as we got stuck at https://www.spinics.net/lists/dri-devel/msg435537.html as we would need to uptream the DRM Bayer format first, but not in the form they are today. So I guess is fine keeping this downstream for the moment ? > #if defined(__cplusplus) > } > #endif > diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h > index ba48d2c89726..226665b59d58 100644 > --- a/include/linux/videodev2.h > +++ b/include/linux/videodev2.h > @@ -789,6 +789,18 @@ struct v4l2_pix_format { > #define V4L2_PIX_FMT_IPU3_SGRBG10 v4l2_fourcc('i', 'p', '3', 'G') /* IPU3 packed 10-bit GRBG bayer */ > #define V4L2_PIX_FMT_IPU3_SRGGB10 v4l2_fourcc('i', 'p', '3', 'r') /* IPU3 packed 10-bit RGGB bayer */ > > +/* Raspberry Pi PiSP compressed formats. */ > +#define V4L2_PIX_FMT_PISP_COMP1_RGGB v4l2_fourcc('P', 'C', '1', 'R') /* PiSP 8-bit mode 1 compressed RGGB bayer */ > +#define V4L2_PIX_FMT_PISP_COMP1_GRBG v4l2_fourcc('P', 'C', '1', 'G') /* PiSP 8-bit mode 1 compressed GRBG bayer */ > +#define V4L2_PIX_FMT_PISP_COMP1_GBRG v4l2_fourcc('P', 'C', '1', 'g') /* PiSP 8-bit mode 1 compressed GBRG bayer */ > +#define V4L2_PIX_FMT_PISP_COMP1_BGGR v4l2_fourcc('P', 'C', '1', 'B') /* PiSP 8-bit mode 1 compressed BGGR bayer */ > +#define V4L2_PIX_FMT_PISP_COMP1_MONO v4l2_fourcc('P', 'C', '1', 'M') /* PiSP 8-bit mode 1 compressed monochrome */ > +#define V4L2_PIX_FMT_PISP_COMP2_RGGB v4l2_fourcc('P', 'C', '2', 'R') /* PiSP 8-bit mode 2 compressed RGGB bayer */ > +#define V4L2_PIX_FMT_PISP_COMP2_GRBG v4l2_fourcc('P', 'C', '2', 'G') /* PiSP 8-bit mode 2 compressed GRBG bayer */ > +#define V4L2_PIX_FMT_PISP_COMP2_GBRG v4l2_fourcc('P', 'C', '2', 'g') /* PiSP 8-bit mode 2 compressed GBRG bayer */ > +#define V4L2_PIX_FMT_PISP_COMP2_BGGR v4l2_fourcc('P', 'C', '2', 'B') /* PiSP 8-bit mode 2 compressed BGGR bayer */ > +#define V4L2_PIX_FMT_PISP_COMP2_MONO v4l2_fourcc('P', 'C', '2', 'M') /* PiSP 8-bit mode 2 compressed monochrome */ > + Ack > /* SDR formats - used only for Software Defined Radio devices */ > #define V4L2_SDR_FMT_CU8 v4l2_fourcc('C', 'U', '0', '8') /* IQ u8 */ > #define V4L2_SDR_FMT_CU16LE v4l2_fourcc('C', 'U', '1', '6') /* IQ u16le */ > @@ -818,6 +830,15 @@ struct v4l2_pix_format { > #define V4L2_META_FMT_RK_ISP1_PARAMS v4l2_fourcc('R', 'K', '1', 'P') /* Rockchip ISP1 3A Parameters */ > #define V4L2_META_FMT_RK_ISP1_STAT_3A v4l2_fourcc('R', 'K', '1', 'S') /* Rockchip ISP1 3A Statistics */ > > +/* The metadata format identifier for BE configuration buffers. */ > +#define V4L2_META_FMT_RPI_BE_CFG v4l2_fourcc('R', 'P', 'B', 'C') > + > +/* The metadata format identifier for FE configuration buffers. */ > +#define V4L2_META_FMT_RPI_FE_CFG v4l2_fourcc('R', 'P', 'F', 'C') > + > +/* The metadata format identifier for FE stats buffers. */ > +#define V4L2_META_FMT_RPI_FE_STATS v4l2_fourcc('R', 'P', 'F', 'S') > + The comments and ordering might end up being different as BE and FE are being upstreamed separately. I guess it's fine! > /* priv field value to indicates that subsequent fields are valid. */ > #define V4L2_PIX_FMT_PRIV_MAGIC 0xfeedcafe > > diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp > index 20aedfa6d925..ed6f7d62a7a3 100644 > --- a/src/libcamera/bayer_format.cpp > +++ b/src/libcamera/bayer_format.cpp > @@ -164,6 +164,14 @@ const std::map<BayerFormat, Formats, BayerFormatComparator> bayerToFormat{ > { formats::SGRBG16, V4L2PixelFormat(V4L2_PIX_FMT_SGRBG16) } }, > { { BayerFormat::RGGB, 16, BayerFormat::Packing::None }, > { formats::SRGGB16, V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16) } }, > + { { BayerFormat::BGGR, 16, BayerFormat::Packing::PISP1 }, > + { formats::BGGR_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR) } }, > + { { BayerFormat::GBRG, 16, BayerFormat::Packing::PISP1 }, > + { formats::GBRG_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG) } }, > + { { BayerFormat::GRBG, 16, BayerFormat::Packing::PISP1 }, > + { formats::GRBG_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG) } }, > + { { BayerFormat::RGGB, 16, BayerFormat::Packing::PISP1 }, > + { formats::RGGB_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB) } }, > { { BayerFormat::MONO, 8, BayerFormat::Packing::None }, > { formats::R8, V4L2PixelFormat(V4L2_PIX_FMT_GREY) } }, > { { BayerFormat::MONO, 10, BayerFormat::Packing::None }, > @@ -174,6 +182,8 @@ const std::map<BayerFormat, Formats, BayerFormatComparator> bayerToFormat{ > { formats::R12, V4L2PixelFormat(V4L2_PIX_FMT_Y12) } }, > { { BayerFormat::MONO, 16, BayerFormat::Packing::None }, > { formats::R16, V4L2PixelFormat(V4L2_PIX_FMT_Y16) } }, > + { { BayerFormat::MONO, 16, BayerFormat::Packing::PISP1 }, > + { formats::MONO_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO) } }, > }; > > const std::unordered_map<unsigned int, BayerFormat> mbusCodeToBayer{ > @@ -303,6 +313,10 @@ std::ostream &operator<<(std::ostream &out, const BayerFormat &f) > out << "-CSI2P"; > else if (f.packing == BayerFormat::Packing::IPU3) > out << "-IPU3P"; > + else if (f.packing == BayerFormat::Packing::PISP1) > + out << "-PISP1"; > + else if (f.packing == BayerFormat::Packing::PISP2) > + out << "-PISP2"; > > return out; > } > diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp > index 21a7719e84c4..855c5f98d378 100644 > --- a/src/libcamera/formats.cpp > +++ b/src/libcamera/formats.cpp > @@ -547,6 +547,16 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{ > .pixelsPerGroup = 1, > .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, > } }, > + { formats::MONO_PISP_COMP1, { > + .name = "MONO_PISP_COMP1", > + .format = formats::MONO_PISP_COMP1, > + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO), }, > + .bitsPerPixel = 8, > + .colourEncoding = PixelFormatInfo::ColourEncodingYUV, > + .packed = true, > + .pixelsPerGroup = 1, > + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, Being this 1 byte per pixel and 1 pixel per group , shouldn't this be { 1, 1} ? > + } }, > > /* Bayer formats. */ > { formats::SBGGR8, { > @@ -910,7 +920,46 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{ > .pixelsPerGroup = 25, > .planes = {{ { 32, 1 }, { 0, 0 }, { 0, 0 } }}, > } }, > - > + { formats::BGGR_PISP_COMP1, { > + .name = "BGGR_PISP_COMP1", > + .format = formats::BGGR_PISP_COMP1, > + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR), }, > + .bitsPerPixel = 8, > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, > + .packed = true, > + .pixelsPerGroup = 2, > + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, > + } }, > + { formats::GBRG_PISP_COMP1, { > + .name = "GBRG_PISP_COMP1", > + .format = formats::GBRG_PISP_COMP1, > + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG), }, > + .bitsPerPixel = 8, > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, > + .packed = true, > + .pixelsPerGroup = 2, > + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, > + } }, > + { formats::GRBG_PISP_COMP1, { > + .name = "GRBG_PISP_COMP1", > + .format = formats::GRBG_PISP_COMP1, > + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG), }, > + .bitsPerPixel = 8, > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, > + .packed = true, > + .pixelsPerGroup = 2, > + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, > + } }, > + { formats::RGGB_PISP_COMP1, { > + .name = "RGGB_PISP_COMP1", > + .format = formats::RGGB_PISP_COMP1, > + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB), }, > + .bitsPerPixel = 8, > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, > + .packed = true, > + .pixelsPerGroup = 2, > + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, > + } }, Ack! > /* Compressed formats. */ > { formats::MJPEG, { > .name = "MJPEG", > diff --git a/src/libcamera/formats.yaml b/src/libcamera/formats.yaml > index bde2cc803b98..fe027a7cce70 100644 > --- a/src/libcamera/formats.yaml > +++ b/src/libcamera/formats.yaml > @@ -190,4 +190,20 @@ formats: > - SBGGR10_IPU3: > fourcc: DRM_FORMAT_SBGGR10 > mod: IPU3_FORMAT_MOD_PACKED > + > + - RGGB_PISP_COMP1: > + fourcc: DRM_FORMAT_SRGGB16 > + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 > + - GRBG_PISP_COMP1: > + fourcc: DRM_FORMAT_SGRBG16 > + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 > + - GBRG_PISP_COMP1: > + fourcc: DRM_FORMAT_SGBRG16 > + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 > + - BGGR_PISP_COMP1: > + fourcc: DRM_FORMAT_SBGGR16 > + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 > + - MONO_PISP_COMP1: > + fourcc: DRM_FORMAT_R16 > + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 > ... > diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp > index efb6f2940235..977ae5834017 100644 > --- a/src/libcamera/v4l2_pixelformat.cpp > +++ b/src/libcamera/v4l2_pixelformat.cpp > @@ -207,6 +207,16 @@ const std::map<V4L2PixelFormat, V4L2PixelFormat::Info> vpf2pf{ > { formats::SGRBG16, "16-bit Bayer GRGR/BGBG" } }, > { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16), > { formats::SRGGB16, "16-bit Bayer RGRG/GBGB" } }, > + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR), > + { formats::BGGR_PISP_COMP1, "16-bit Bayer BGBG/GRGR PiSP Compress Mode 1" } }, > + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG), > + { formats::GBRG_PISP_COMP1, "16-bit Bayer GBGB/RGRG PiSP Compress Mode 1" } }, > + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG), > + { formats::GRBG_PISP_COMP1, "16-bit Bayer GRGR/BGBG PiSP Compress Mode 1" } }, > + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB), > + { formats::RGGB_PISP_COMP1, "16-bit Bayer RGRG/GBGB PiSP Compress Mode 1" } }, > + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO), > + { formats::MONO_PISP_COMP1, "16-bit Mono PiSP Compress Mode 1" } }, > > /* Compressed formats. */ > { V4L2PixelFormat(V4L2_PIX_FMT_MJPEG), > diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp > index 1076b7006b0b..60852efee6b4 100644 > --- a/src/libcamera/v4l2_subdevice.cpp > +++ b/src/libcamera/v4l2_subdevice.cpp > @@ -651,6 +651,34 @@ const std::map<uint32_t, MediaBusFormatInfo> mediaBusFormatInfo{ > .bitsPerPixel = 14, > .colourEncoding = PixelFormatInfo::ColourEncodingRAW, > } }, > + { MEDIA_BUS_FMT_SBGGR16_1X16, { > + .name = "SBGGR16_1x16", It seems to me the other format names use capital 'X' > + .code = MEDIA_BUS_FMT_SBGGR16_1X16, > + .type = MediaBusFormatInfo::Type::Image, > + .bitsPerPixel = 16, > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW > + } }, > + { MEDIA_BUS_FMT_SGBRG16_1X16, { > + .name = "SGBRG16_1x16", > + .code = MEDIA_BUS_FMT_SGBRG16_1X16, > + .type = MediaBusFormatInfo::Type::Image, > + .bitsPerPixel = 16, > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW > + } }, > + { MEDIA_BUS_FMT_SGRBG16_1X16, { > + .name = "SGRBG16_1x16", > + .code = MEDIA_BUS_FMT_SGRBG16_1X16, > + .type = MediaBusFormatInfo::Type::Image, > + .bitsPerPixel = 16, > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW > + } }, > + { MEDIA_BUS_FMT_SRGGB16_1X16, { > + .name = "SRGGB16_1x16", > + .code = MEDIA_BUS_FMT_SRGGB16_1X16, > + .type = MediaBusFormatInfo::Type::Image, > + .bitsPerPixel = 16, > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW > + } }, These are unrelated to the PiSP formats, right ? (just for my understanding). I think it's anyway good to have them here (if unrelared, possibily in a separate patch ?) Nit on the here above formats name ('x' vs 'X') apart, the rest looks good Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Thanks j > /* \todo Clarify colour encoding for HSV formats */ > { MEDIA_BUS_FMT_AHSV8888_1X32, { > .name = "AHSV8888_1X32", > -- > 2.34.1 >
Hi Jacopo, Thanks for the feedback! On Thu, 2 May 2024 at 10:38, Jacopo Mondi <jacopo.mondi@ideasonboard.com> wrote: > > Hi Naush > > On Thu, May 02, 2024 at 09:09:22AM GMT, Naushir Patuck wrote: > > Add the Raspberry Pi 5 PiSP specific verification format: > > - V4L2_PIX_FMT_RPI_BE > > > > Add the Raspberry Pi 5 PiSP specific compressed Bayer format types 1/2: > > - V4L2_PIX_FMT_PISP_COMP1_xxx > > - V4L2_PIX_FMT_PISP_COMP2_xxx > > > > Add the Raspberry Pi 5 PiSP Frontend and Backend config formats: > > - V4L2_META_FMT_RPI_FE_CFG > > - V4L2_META_FMT_RPI_BE_CFG > > > > Add the Raspberry Pi 5 PiSP Frontend statistics format: > > - V4L2_META_FMT_RPI_FE_STATS > > > > Add 16-bit Bayer formats: > > - MEDIA_BUS_FMT_Sxxx16_1X16 > > > > Signed-off-by: Naushir Patuck <naush@raspberrypi.com> > > Reviewed-by: David Plowman <david.plowman@raspberrypi.com> > > --- > > include/libcamera/internal/bayer_format.h | 2 + > > include/linux/drm_fourcc.h | 5 +++ > > include/linux/videodev2.h | 21 ++++++++++ > > src/libcamera/bayer_format.cpp | 14 +++++++ > > src/libcamera/formats.cpp | 51 ++++++++++++++++++++++- > > src/libcamera/formats.yaml | 16 +++++++ > > src/libcamera/v4l2_pixelformat.cpp | 10 +++++ > > src/libcamera/v4l2_subdevice.cpp | 28 +++++++++++++ > > 8 files changed, 146 insertions(+), 1 deletion(-) > > > > diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h > > index 78ba3969913d..164743f7e9f6 100644 > > --- a/include/libcamera/internal/bayer_format.h > > +++ b/include/libcamera/internal/bayer_format.h > > @@ -34,6 +34,8 @@ public: > > None = 0, > > CSI2 = 1, > > IPU3 = 2, > > + PISP1 = 3, > > + PISP2 = 4, > > }; > > > > constexpr BayerFormat() > > diff --git a/include/linux/drm_fourcc.h b/include/linux/drm_fourcc.h > > index 4ee421b95730..322563763cbc 100644 > > --- a/include/linux/drm_fourcc.h > > +++ b/include/linux/drm_fourcc.h > > @@ -490,6 +490,7 @@ extern "C" { > > #define DRM_FORMAT_MOD_VENDOR_ALLWINNER 0x09 > > #define DRM_FORMAT_MOD_VENDOR_AMLOGIC 0x0a > > #define DRM_FORMAT_MOD_VENDOR_MIPI 0x0b > > +#define DRM_FORMAT_MOD_VENDOR_RPI 0x0c > > > > /* add more to the end as needed */ > > > > @@ -1670,6 +1671,10 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier) > > */ > > #define MIPI_FORMAT_MOD_CSI2_PACKED fourcc_mod_code(MIPI, 1) > > > > +#define PISP_FORMAT_MOD_COMPRESS_MODE1 fourcc_mod_code(RPI, 1) > > +#define PISP_FORMAT_MOD_COMPRESS_MODE2 fourcc_mod_code(RPI, 2) > > +#define PISP_FORMAT_MOD_VERIFICATION fourcc_mod_code(RPI, 3) > > + > > Ideally, this should have been resolved upstream > https://www.spinics.net/lists/dri-devel/msg435203.html > > but this hasn't progressed much, as we got stuck at > https://www.spinics.net/lists/dri-devel/msg435537.html > > as we would need to uptream the DRM Bayer format first, but not in the > form they are today. > > So I guess is fine keeping this downstream for the moment ? > > > #if defined(__cplusplus) > > } > > #endif > > diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h > > index ba48d2c89726..226665b59d58 100644 > > --- a/include/linux/videodev2.h > > +++ b/include/linux/videodev2.h > > @@ -789,6 +789,18 @@ struct v4l2_pix_format { > > #define V4L2_PIX_FMT_IPU3_SGRBG10 v4l2_fourcc('i', 'p', '3', 'G') /* IPU3 packed 10-bit GRBG bayer */ > > #define V4L2_PIX_FMT_IPU3_SRGGB10 v4l2_fourcc('i', 'p', '3', 'r') /* IPU3 packed 10-bit RGGB bayer */ > > > > +/* Raspberry Pi PiSP compressed formats. */ > > +#define V4L2_PIX_FMT_PISP_COMP1_RGGB v4l2_fourcc('P', 'C', '1', 'R') /* PiSP 8-bit mode 1 compressed RGGB bayer */ > > +#define V4L2_PIX_FMT_PISP_COMP1_GRBG v4l2_fourcc('P', 'C', '1', 'G') /* PiSP 8-bit mode 1 compressed GRBG bayer */ > > +#define V4L2_PIX_FMT_PISP_COMP1_GBRG v4l2_fourcc('P', 'C', '1', 'g') /* PiSP 8-bit mode 1 compressed GBRG bayer */ > > +#define V4L2_PIX_FMT_PISP_COMP1_BGGR v4l2_fourcc('P', 'C', '1', 'B') /* PiSP 8-bit mode 1 compressed BGGR bayer */ > > +#define V4L2_PIX_FMT_PISP_COMP1_MONO v4l2_fourcc('P', 'C', '1', 'M') /* PiSP 8-bit mode 1 compressed monochrome */ > > +#define V4L2_PIX_FMT_PISP_COMP2_RGGB v4l2_fourcc('P', 'C', '2', 'R') /* PiSP 8-bit mode 2 compressed RGGB bayer */ > > +#define V4L2_PIX_FMT_PISP_COMP2_GRBG v4l2_fourcc('P', 'C', '2', 'G') /* PiSP 8-bit mode 2 compressed GRBG bayer */ > > +#define V4L2_PIX_FMT_PISP_COMP2_GBRG v4l2_fourcc('P', 'C', '2', 'g') /* PiSP 8-bit mode 2 compressed GBRG bayer */ > > +#define V4L2_PIX_FMT_PISP_COMP2_BGGR v4l2_fourcc('P', 'C', '2', 'B') /* PiSP 8-bit mode 2 compressed BGGR bayer */ > > +#define V4L2_PIX_FMT_PISP_COMP2_MONO v4l2_fourcc('P', 'C', '2', 'M') /* PiSP 8-bit mode 2 compressed monochrome */ > > + > > Ack > > > /* SDR formats - used only for Software Defined Radio devices */ > > #define V4L2_SDR_FMT_CU8 v4l2_fourcc('C', 'U', '0', '8') /* IQ u8 */ > > #define V4L2_SDR_FMT_CU16LE v4l2_fourcc('C', 'U', '1', '6') /* IQ u16le */ > > @@ -818,6 +830,15 @@ struct v4l2_pix_format { > > #define V4L2_META_FMT_RK_ISP1_PARAMS v4l2_fourcc('R', 'K', '1', 'P') /* Rockchip ISP1 3A Parameters */ > > #define V4L2_META_FMT_RK_ISP1_STAT_3A v4l2_fourcc('R', 'K', '1', 'S') /* Rockchip ISP1 3A Statistics */ > > > > +/* The metadata format identifier for BE configuration buffers. */ > > +#define V4L2_META_FMT_RPI_BE_CFG v4l2_fourcc('R', 'P', 'B', 'C') > > + > > +/* The metadata format identifier for FE configuration buffers. */ > > +#define V4L2_META_FMT_RPI_FE_CFG v4l2_fourcc('R', 'P', 'F', 'C') > > + > > +/* The metadata format identifier for FE stats buffers. */ > > +#define V4L2_META_FMT_RPI_FE_STATS v4l2_fourcc('R', 'P', 'F', 'S') > > + > > The comments and ordering might end up being different as BE and FE > are being upstreamed separately. I guess it's fine! > > > /* priv field value to indicates that subsequent fields are valid. */ > > #define V4L2_PIX_FMT_PRIV_MAGIC 0xfeedcafe > > > > diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp > > index 20aedfa6d925..ed6f7d62a7a3 100644 > > --- a/src/libcamera/bayer_format.cpp > > +++ b/src/libcamera/bayer_format.cpp > > @@ -164,6 +164,14 @@ const std::map<BayerFormat, Formats, BayerFormatComparator> bayerToFormat{ > > { formats::SGRBG16, V4L2PixelFormat(V4L2_PIX_FMT_SGRBG16) } }, > > { { BayerFormat::RGGB, 16, BayerFormat::Packing::None }, > > { formats::SRGGB16, V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16) } }, > > + { { BayerFormat::BGGR, 16, BayerFormat::Packing::PISP1 }, > > + { formats::BGGR_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR) } }, > > + { { BayerFormat::GBRG, 16, BayerFormat::Packing::PISP1 }, > > + { formats::GBRG_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG) } }, > > + { { BayerFormat::GRBG, 16, BayerFormat::Packing::PISP1 }, > > + { formats::GRBG_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG) } }, > > + { { BayerFormat::RGGB, 16, BayerFormat::Packing::PISP1 }, > > + { formats::RGGB_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB) } }, > > { { BayerFormat::MONO, 8, BayerFormat::Packing::None }, > > { formats::R8, V4L2PixelFormat(V4L2_PIX_FMT_GREY) } }, > > { { BayerFormat::MONO, 10, BayerFormat::Packing::None }, > > @@ -174,6 +182,8 @@ const std::map<BayerFormat, Formats, BayerFormatComparator> bayerToFormat{ > > { formats::R12, V4L2PixelFormat(V4L2_PIX_FMT_Y12) } }, > > { { BayerFormat::MONO, 16, BayerFormat::Packing::None }, > > { formats::R16, V4L2PixelFormat(V4L2_PIX_FMT_Y16) } }, > > + { { BayerFormat::MONO, 16, BayerFormat::Packing::PISP1 }, > > + { formats::MONO_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO) } }, > > }; > > > > const std::unordered_map<unsigned int, BayerFormat> mbusCodeToBayer{ > > @@ -303,6 +313,10 @@ std::ostream &operator<<(std::ostream &out, const BayerFormat &f) > > out << "-CSI2P"; > > else if (f.packing == BayerFormat::Packing::IPU3) > > out << "-IPU3P"; > > + else if (f.packing == BayerFormat::Packing::PISP1) > > + out << "-PISP1"; > > + else if (f.packing == BayerFormat::Packing::PISP2) > > + out << "-PISP2"; > > > > return out; > > } > > diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp > > index 21a7719e84c4..855c5f98d378 100644 > > --- a/src/libcamera/formats.cpp > > +++ b/src/libcamera/formats.cpp > > @@ -547,6 +547,16 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{ > > .pixelsPerGroup = 1, > > .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, > > } }, > > + { formats::MONO_PISP_COMP1, { > > + .name = "MONO_PISP_COMP1", > > + .format = formats::MONO_PISP_COMP1, > > + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO), }, > > + .bitsPerPixel = 8, > > + .colourEncoding = PixelFormatInfo::ColourEncodingYUV, > > + .packed = true, > > + .pixelsPerGroup = 1, > > + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, > > Being this 1 byte per pixel and 1 pixel per group , shouldn't this be { 1, 1} ? Ack, will fix for next version. > > > + } }, > > > > /* Bayer formats. */ > > { formats::SBGGR8, { > > @@ -910,7 +920,46 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{ > > .pixelsPerGroup = 25, > > .planes = {{ { 32, 1 }, { 0, 0 }, { 0, 0 } }}, > > } }, > > - > > + { formats::BGGR_PISP_COMP1, { > > + .name = "BGGR_PISP_COMP1", > > + .format = formats::BGGR_PISP_COMP1, > > + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR), }, > > + .bitsPerPixel = 8, > > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, > > + .packed = true, > > + .pixelsPerGroup = 2, > > + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, > > + } }, > > + { formats::GBRG_PISP_COMP1, { > > + .name = "GBRG_PISP_COMP1", > > + .format = formats::GBRG_PISP_COMP1, > > + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG), }, > > + .bitsPerPixel = 8, > > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, > > + .packed = true, > > + .pixelsPerGroup = 2, > > + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, > > + } }, > > + { formats::GRBG_PISP_COMP1, { > > + .name = "GRBG_PISP_COMP1", > > + .format = formats::GRBG_PISP_COMP1, > > + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG), }, > > + .bitsPerPixel = 8, > > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, > > + .packed = true, > > + .pixelsPerGroup = 2, > > + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, > > + } }, > > + { formats::RGGB_PISP_COMP1, { > > + .name = "RGGB_PISP_COMP1", > > + .format = formats::RGGB_PISP_COMP1, > > + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB), }, > > + .bitsPerPixel = 8, > > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, > > + .packed = true, > > + .pixelsPerGroup = 2, > > + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, > > + } }, > > Ack! > > > /* Compressed formats. */ > > { formats::MJPEG, { > > .name = "MJPEG", > > diff --git a/src/libcamera/formats.yaml b/src/libcamera/formats.yaml > > index bde2cc803b98..fe027a7cce70 100644 > > --- a/src/libcamera/formats.yaml > > +++ b/src/libcamera/formats.yaml > > @@ -190,4 +190,20 @@ formats: > > - SBGGR10_IPU3: > > fourcc: DRM_FORMAT_SBGGR10 > > mod: IPU3_FORMAT_MOD_PACKED > > + > > + - RGGB_PISP_COMP1: > > + fourcc: DRM_FORMAT_SRGGB16 > > + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 > > + - GRBG_PISP_COMP1: > > + fourcc: DRM_FORMAT_SGRBG16 > > + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 > > + - GBRG_PISP_COMP1: > > + fourcc: DRM_FORMAT_SGBRG16 > > + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 > > + - BGGR_PISP_COMP1: > > + fourcc: DRM_FORMAT_SBGGR16 > > + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 > > + - MONO_PISP_COMP1: > > + fourcc: DRM_FORMAT_R16 > > + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 > > ... > > diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp > > index efb6f2940235..977ae5834017 100644 > > --- a/src/libcamera/v4l2_pixelformat.cpp > > +++ b/src/libcamera/v4l2_pixelformat.cpp > > @@ -207,6 +207,16 @@ const std::map<V4L2PixelFormat, V4L2PixelFormat::Info> vpf2pf{ > > { formats::SGRBG16, "16-bit Bayer GRGR/BGBG" } }, > > { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16), > > { formats::SRGGB16, "16-bit Bayer RGRG/GBGB" } }, > > + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR), > > + { formats::BGGR_PISP_COMP1, "16-bit Bayer BGBG/GRGR PiSP Compress Mode 1" } }, > > + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG), > > + { formats::GBRG_PISP_COMP1, "16-bit Bayer GBGB/RGRG PiSP Compress Mode 1" } }, > > + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG), > > + { formats::GRBG_PISP_COMP1, "16-bit Bayer GRGR/BGBG PiSP Compress Mode 1" } }, > > + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB), > > + { formats::RGGB_PISP_COMP1, "16-bit Bayer RGRG/GBGB PiSP Compress Mode 1" } }, > > + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO), > > + { formats::MONO_PISP_COMP1, "16-bit Mono PiSP Compress Mode 1" } }, > > > > /* Compressed formats. */ > > { V4L2PixelFormat(V4L2_PIX_FMT_MJPEG), > > diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp > > index 1076b7006b0b..60852efee6b4 100644 > > --- a/src/libcamera/v4l2_subdevice.cpp > > +++ b/src/libcamera/v4l2_subdevice.cpp > > @@ -651,6 +651,34 @@ const std::map<uint32_t, MediaBusFormatInfo> mediaBusFormatInfo{ > > .bitsPerPixel = 14, > > .colourEncoding = PixelFormatInfo::ColourEncodingRAW, > > } }, > > + { MEDIA_BUS_FMT_SBGGR16_1X16, { > > + .name = "SBGGR16_1x16", > > It seems to me the other format names use capital 'X' Ack. > > > + .code = MEDIA_BUS_FMT_SBGGR16_1X16, > > + .type = MediaBusFormatInfo::Type::Image, > > + .bitsPerPixel = 16, > > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW > > + } }, > > + { MEDIA_BUS_FMT_SGBRG16_1X16, { > > + .name = "SGBRG16_1x16", > > + .code = MEDIA_BUS_FMT_SGBRG16_1X16, > > + .type = MediaBusFormatInfo::Type::Image, > > + .bitsPerPixel = 16, > > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW > > + } }, > > + { MEDIA_BUS_FMT_SGRBG16_1X16, { > > + .name = "SGRBG16_1x16", > > + .code = MEDIA_BUS_FMT_SGRBG16_1X16, > > + .type = MediaBusFormatInfo::Type::Image, > > + .bitsPerPixel = 16, > > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW > > + } }, > > + { MEDIA_BUS_FMT_SRGGB16_1X16, { > > + .name = "SRGGB16_1x16", > > + .code = MEDIA_BUS_FMT_SRGGB16_1X16, > > + .type = MediaBusFormatInfo::Type::Image, > > + .bitsPerPixel = 16, > > + .colourEncoding = PixelFormatInfo::ColourEncodingRAW > > + } }, > > These are unrelated to the PiSP formats, right ? (just for my > understanding). I think it's anyway good to have them here (if > unrelared, possibily in a separate patch ?) Correct, they are unrelated. I'll move them to a separate patch. > > Nit on the here above formats name ('x' vs 'X') apart, the rest looks > good > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > Thanks > j > > > /* \todo Clarify colour encoding for HSV formats */ > > { MEDIA_BUS_FMT_AHSV8888_1X32, { > > .name = "AHSV8888_1X32", > > -- > > 2.34.1 > >
diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h index 78ba3969913d..164743f7e9f6 100644 --- a/include/libcamera/internal/bayer_format.h +++ b/include/libcamera/internal/bayer_format.h @@ -34,6 +34,8 @@ public: None = 0, CSI2 = 1, IPU3 = 2, + PISP1 = 3, + PISP2 = 4, }; constexpr BayerFormat() diff --git a/include/linux/drm_fourcc.h b/include/linux/drm_fourcc.h index 4ee421b95730..322563763cbc 100644 --- a/include/linux/drm_fourcc.h +++ b/include/linux/drm_fourcc.h @@ -490,6 +490,7 @@ extern "C" { #define DRM_FORMAT_MOD_VENDOR_ALLWINNER 0x09 #define DRM_FORMAT_MOD_VENDOR_AMLOGIC 0x0a #define DRM_FORMAT_MOD_VENDOR_MIPI 0x0b +#define DRM_FORMAT_MOD_VENDOR_RPI 0x0c /* add more to the end as needed */ @@ -1670,6 +1671,10 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier) */ #define MIPI_FORMAT_MOD_CSI2_PACKED fourcc_mod_code(MIPI, 1) +#define PISP_FORMAT_MOD_COMPRESS_MODE1 fourcc_mod_code(RPI, 1) +#define PISP_FORMAT_MOD_COMPRESS_MODE2 fourcc_mod_code(RPI, 2) +#define PISP_FORMAT_MOD_VERIFICATION fourcc_mod_code(RPI, 3) + #if defined(__cplusplus) } #endif diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index ba48d2c89726..226665b59d58 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -789,6 +789,18 @@ struct v4l2_pix_format { #define V4L2_PIX_FMT_IPU3_SGRBG10 v4l2_fourcc('i', 'p', '3', 'G') /* IPU3 packed 10-bit GRBG bayer */ #define V4L2_PIX_FMT_IPU3_SRGGB10 v4l2_fourcc('i', 'p', '3', 'r') /* IPU3 packed 10-bit RGGB bayer */ +/* Raspberry Pi PiSP compressed formats. */ +#define V4L2_PIX_FMT_PISP_COMP1_RGGB v4l2_fourcc('P', 'C', '1', 'R') /* PiSP 8-bit mode 1 compressed RGGB bayer */ +#define V4L2_PIX_FMT_PISP_COMP1_GRBG v4l2_fourcc('P', 'C', '1', 'G') /* PiSP 8-bit mode 1 compressed GRBG bayer */ +#define V4L2_PIX_FMT_PISP_COMP1_GBRG v4l2_fourcc('P', 'C', '1', 'g') /* PiSP 8-bit mode 1 compressed GBRG bayer */ +#define V4L2_PIX_FMT_PISP_COMP1_BGGR v4l2_fourcc('P', 'C', '1', 'B') /* PiSP 8-bit mode 1 compressed BGGR bayer */ +#define V4L2_PIX_FMT_PISP_COMP1_MONO v4l2_fourcc('P', 'C', '1', 'M') /* PiSP 8-bit mode 1 compressed monochrome */ +#define V4L2_PIX_FMT_PISP_COMP2_RGGB v4l2_fourcc('P', 'C', '2', 'R') /* PiSP 8-bit mode 2 compressed RGGB bayer */ +#define V4L2_PIX_FMT_PISP_COMP2_GRBG v4l2_fourcc('P', 'C', '2', 'G') /* PiSP 8-bit mode 2 compressed GRBG bayer */ +#define V4L2_PIX_FMT_PISP_COMP2_GBRG v4l2_fourcc('P', 'C', '2', 'g') /* PiSP 8-bit mode 2 compressed GBRG bayer */ +#define V4L2_PIX_FMT_PISP_COMP2_BGGR v4l2_fourcc('P', 'C', '2', 'B') /* PiSP 8-bit mode 2 compressed BGGR bayer */ +#define V4L2_PIX_FMT_PISP_COMP2_MONO v4l2_fourcc('P', 'C', '2', 'M') /* PiSP 8-bit mode 2 compressed monochrome */ + /* SDR formats - used only for Software Defined Radio devices */ #define V4L2_SDR_FMT_CU8 v4l2_fourcc('C', 'U', '0', '8') /* IQ u8 */ #define V4L2_SDR_FMT_CU16LE v4l2_fourcc('C', 'U', '1', '6') /* IQ u16le */ @@ -818,6 +830,15 @@ struct v4l2_pix_format { #define V4L2_META_FMT_RK_ISP1_PARAMS v4l2_fourcc('R', 'K', '1', 'P') /* Rockchip ISP1 3A Parameters */ #define V4L2_META_FMT_RK_ISP1_STAT_3A v4l2_fourcc('R', 'K', '1', 'S') /* Rockchip ISP1 3A Statistics */ +/* The metadata format identifier for BE configuration buffers. */ +#define V4L2_META_FMT_RPI_BE_CFG v4l2_fourcc('R', 'P', 'B', 'C') + +/* The metadata format identifier for FE configuration buffers. */ +#define V4L2_META_FMT_RPI_FE_CFG v4l2_fourcc('R', 'P', 'F', 'C') + +/* The metadata format identifier for FE stats buffers. */ +#define V4L2_META_FMT_RPI_FE_STATS v4l2_fourcc('R', 'P', 'F', 'S') + /* priv field value to indicates that subsequent fields are valid. */ #define V4L2_PIX_FMT_PRIV_MAGIC 0xfeedcafe diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp index 20aedfa6d925..ed6f7d62a7a3 100644 --- a/src/libcamera/bayer_format.cpp +++ b/src/libcamera/bayer_format.cpp @@ -164,6 +164,14 @@ const std::map<BayerFormat, Formats, BayerFormatComparator> bayerToFormat{ { formats::SGRBG16, V4L2PixelFormat(V4L2_PIX_FMT_SGRBG16) } }, { { BayerFormat::RGGB, 16, BayerFormat::Packing::None }, { formats::SRGGB16, V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16) } }, + { { BayerFormat::BGGR, 16, BayerFormat::Packing::PISP1 }, + { formats::BGGR_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR) } }, + { { BayerFormat::GBRG, 16, BayerFormat::Packing::PISP1 }, + { formats::GBRG_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG) } }, + { { BayerFormat::GRBG, 16, BayerFormat::Packing::PISP1 }, + { formats::GRBG_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG) } }, + { { BayerFormat::RGGB, 16, BayerFormat::Packing::PISP1 }, + { formats::RGGB_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB) } }, { { BayerFormat::MONO, 8, BayerFormat::Packing::None }, { formats::R8, V4L2PixelFormat(V4L2_PIX_FMT_GREY) } }, { { BayerFormat::MONO, 10, BayerFormat::Packing::None }, @@ -174,6 +182,8 @@ const std::map<BayerFormat, Formats, BayerFormatComparator> bayerToFormat{ { formats::R12, V4L2PixelFormat(V4L2_PIX_FMT_Y12) } }, { { BayerFormat::MONO, 16, BayerFormat::Packing::None }, { formats::R16, V4L2PixelFormat(V4L2_PIX_FMT_Y16) } }, + { { BayerFormat::MONO, 16, BayerFormat::Packing::PISP1 }, + { formats::MONO_PISP_COMP1, V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO) } }, }; const std::unordered_map<unsigned int, BayerFormat> mbusCodeToBayer{ @@ -303,6 +313,10 @@ std::ostream &operator<<(std::ostream &out, const BayerFormat &f) out << "-CSI2P"; else if (f.packing == BayerFormat::Packing::IPU3) out << "-IPU3P"; + else if (f.packing == BayerFormat::Packing::PISP1) + out << "-PISP1"; + else if (f.packing == BayerFormat::Packing::PISP2) + out << "-PISP2"; return out; } diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp index 21a7719e84c4..855c5f98d378 100644 --- a/src/libcamera/formats.cpp +++ b/src/libcamera/formats.cpp @@ -547,6 +547,16 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{ .pixelsPerGroup = 1, .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, } }, + { formats::MONO_PISP_COMP1, { + .name = "MONO_PISP_COMP1", + .format = formats::MONO_PISP_COMP1, + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO), }, + .bitsPerPixel = 8, + .colourEncoding = PixelFormatInfo::ColourEncodingYUV, + .packed = true, + .pixelsPerGroup = 1, + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, + } }, /* Bayer formats. */ { formats::SBGGR8, { @@ -910,7 +920,46 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{ .pixelsPerGroup = 25, .planes = {{ { 32, 1 }, { 0, 0 }, { 0, 0 } }}, } }, - + { formats::BGGR_PISP_COMP1, { + .name = "BGGR_PISP_COMP1", + .format = formats::BGGR_PISP_COMP1, + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR), }, + .bitsPerPixel = 8, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + .packed = true, + .pixelsPerGroup = 2, + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, + } }, + { formats::GBRG_PISP_COMP1, { + .name = "GBRG_PISP_COMP1", + .format = formats::GBRG_PISP_COMP1, + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG), }, + .bitsPerPixel = 8, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + .packed = true, + .pixelsPerGroup = 2, + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, + } }, + { formats::GRBG_PISP_COMP1, { + .name = "GRBG_PISP_COMP1", + .format = formats::GRBG_PISP_COMP1, + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG), }, + .bitsPerPixel = 8, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + .packed = true, + .pixelsPerGroup = 2, + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, + } }, + { formats::RGGB_PISP_COMP1, { + .name = "RGGB_PISP_COMP1", + .format = formats::RGGB_PISP_COMP1, + .v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB), }, + .bitsPerPixel = 8, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW, + .packed = true, + .pixelsPerGroup = 2, + .planes = {{ { 2, 1 }, { 0, 0 }, { 0, 0 } }}, + } }, /* Compressed formats. */ { formats::MJPEG, { .name = "MJPEG", diff --git a/src/libcamera/formats.yaml b/src/libcamera/formats.yaml index bde2cc803b98..fe027a7cce70 100644 --- a/src/libcamera/formats.yaml +++ b/src/libcamera/formats.yaml @@ -190,4 +190,20 @@ formats: - SBGGR10_IPU3: fourcc: DRM_FORMAT_SBGGR10 mod: IPU3_FORMAT_MOD_PACKED + + - RGGB_PISP_COMP1: + fourcc: DRM_FORMAT_SRGGB16 + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 + - GRBG_PISP_COMP1: + fourcc: DRM_FORMAT_SGRBG16 + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 + - GBRG_PISP_COMP1: + fourcc: DRM_FORMAT_SGBRG16 + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 + - BGGR_PISP_COMP1: + fourcc: DRM_FORMAT_SBGGR16 + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 + - MONO_PISP_COMP1: + fourcc: DRM_FORMAT_R16 + mod: PISP_FORMAT_MOD_COMPRESS_MODE1 ... diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp index efb6f2940235..977ae5834017 100644 --- a/src/libcamera/v4l2_pixelformat.cpp +++ b/src/libcamera/v4l2_pixelformat.cpp @@ -207,6 +207,16 @@ const std::map<V4L2PixelFormat, V4L2PixelFormat::Info> vpf2pf{ { formats::SGRBG16, "16-bit Bayer GRGR/BGBG" } }, { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16), { formats::SRGGB16, "16-bit Bayer RGRG/GBGB" } }, + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_BGGR), + { formats::BGGR_PISP_COMP1, "16-bit Bayer BGBG/GRGR PiSP Compress Mode 1" } }, + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GBRG), + { formats::GBRG_PISP_COMP1, "16-bit Bayer GBGB/RGRG PiSP Compress Mode 1" } }, + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_GRBG), + { formats::GRBG_PISP_COMP1, "16-bit Bayer GRGR/BGBG PiSP Compress Mode 1" } }, + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_RGGB), + { formats::RGGB_PISP_COMP1, "16-bit Bayer RGRG/GBGB PiSP Compress Mode 1" } }, + { V4L2PixelFormat(V4L2_PIX_FMT_PISP_COMP1_MONO), + { formats::MONO_PISP_COMP1, "16-bit Mono PiSP Compress Mode 1" } }, /* Compressed formats. */ { V4L2PixelFormat(V4L2_PIX_FMT_MJPEG), diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp index 1076b7006b0b..60852efee6b4 100644 --- a/src/libcamera/v4l2_subdevice.cpp +++ b/src/libcamera/v4l2_subdevice.cpp @@ -651,6 +651,34 @@ const std::map<uint32_t, MediaBusFormatInfo> mediaBusFormatInfo{ .bitsPerPixel = 14, .colourEncoding = PixelFormatInfo::ColourEncodingRAW, } }, + { MEDIA_BUS_FMT_SBGGR16_1X16, { + .name = "SBGGR16_1x16", + .code = MEDIA_BUS_FMT_SBGGR16_1X16, + .type = MediaBusFormatInfo::Type::Image, + .bitsPerPixel = 16, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW + } }, + { MEDIA_BUS_FMT_SGBRG16_1X16, { + .name = "SGBRG16_1x16", + .code = MEDIA_BUS_FMT_SGBRG16_1X16, + .type = MediaBusFormatInfo::Type::Image, + .bitsPerPixel = 16, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW + } }, + { MEDIA_BUS_FMT_SGRBG16_1X16, { + .name = "SGRBG16_1x16", + .code = MEDIA_BUS_FMT_SGRBG16_1X16, + .type = MediaBusFormatInfo::Type::Image, + .bitsPerPixel = 16, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW + } }, + { MEDIA_BUS_FMT_SRGGB16_1X16, { + .name = "SRGGB16_1x16", + .code = MEDIA_BUS_FMT_SRGGB16_1X16, + .type = MediaBusFormatInfo::Type::Image, + .bitsPerPixel = 16, + .colourEncoding = PixelFormatInfo::ColourEncodingRAW + } }, /* \todo Clarify colour encoding for HSV formats */ { MEDIA_BUS_FMT_AHSV8888_1X32, { .name = "AHSV8888_1X32",