From 7deff646e8e8e8e061d7844c011954e2fa92d6c2 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 7 Jan 2021 10:20:26 +0000 Subject: [PATCH] MMAL/IL: Add support for the 16bpp Bayer/Grey raw 10/12/14 formats Unicam can unpack to 16bpp, but only using the bottom N bits, and V4L2 supports them all. It is also far easier for a CPU to process. Adds support to the framework and to the ISP component (changes the black level config). --- interface/mmal/mmal_encodings.h | 23 +++++++++++ interface/mmal/util/mmal_il.c | 39 +++++++++++++++++++ interface/vmcs_host/khronos/IL/OMX_IVCommon.h | 6 +++ 3 files changed, 68 insertions(+) diff --git a/interface/mmal/mmal_encodings.h b/interface/mmal/mmal_encodings.h index 3ba2fc4..11566fa 100644 --- a/interface/mmal/mmal_encodings.h +++ b/interface/mmal/mmal_encodings.h @@ -145,12 +145,35 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define MMAL_ENCODING_BAYER_SGRBG10DPCM8 MMAL_FOURCC('B','D','1','0') //GRBG #define MMAL_ENCODING_BAYER_SRGGB10DPCM8 MMAL_FOURCC('b','R','A','8') //RGGB +//10 bit per pixel unpacked (16bit) Bayer formats. +#define MMAL_ENCODING_BAYER_SBGGR10 MMAL_FOURCC('B','G','1','0') //BGGR +#define MMAL_ENCODING_BAYER_SGRBG10 MMAL_FOURCC('B','A','1','0') //GRBG +#define MMAL_ENCODING_BAYER_SGBRG10 MMAL_FOURCC('G','B','1','0') //GBRG +#define MMAL_ENCODING_BAYER_SRGGB10 MMAL_FOURCC('R','G','1','0') //RGGB + +//12 bit per pixel unpacked (16bit) Bayer formats +#define MMAL_ENCODING_BAYER_SBGGR12 MMAL_FOURCC('B','G','1','2') //BGGR +#define MMAL_ENCODING_BAYER_SGRBG12 MMAL_FOURCC('B','A','1','2') //GRBG +#define MMAL_ENCODING_BAYER_SGBRG12 MMAL_FOURCC('G','B','1','2') //GBRG +#define MMAL_ENCODING_BAYER_SRGGB12 MMAL_FOURCC('R','G','1','2') //RGGB + +//14 bit per pixel unpacked (16bit) Bayer formats +#define MMAL_ENCODING_BAYER_SBGGR14 MMAL_FOURCC('B','G','1','4') //BGGR +#define MMAL_ENCODING_BAYER_SGBRG14 MMAL_FOURCC('G','B','1','4') //GBRG +#define MMAL_ENCODING_BAYER_SGRBG14 MMAL_FOURCC('G','R','1','4') //GRBG +#define MMAL_ENCODING_BAYER_SRGGB14 MMAL_FOURCC('R','G','1','4') //RGGB + //MIPI packed monochrome images #define MMAL_ENCODING_GREY MMAL_FOURCC('G', 'R', 'E', 'Y') //8bpp Greyscale #define MMAL_ENCODING_Y10P MMAL_FOURCC('Y', '1', '0', 'P') //10bpp Greyscale, MIPI RAW10 packed #define MMAL_ENCODING_Y12P MMAL_FOURCC('Y', '1', '2', 'P') //12bpp Greyscale, MIPI RAW12 packed #define MMAL_ENCODING_Y14P MMAL_FOURCC('Y', '1', '4', 'P') //14bpp Greyscale, MIPI RAW14 packed #define MMAL_ENCODING_Y16 MMAL_FOURCC('Y', '1', '6', ' ') //16bpp Greyscale +//Unpacked monochrome formats (16bit per sample, but only N LSBs used) +#define MMAL_ENCODING_Y10 MMAL_FOURCC('Y', '1', '0', ' ') //10bpp Greyscale +#define MMAL_ENCODING_Y12 MMAL_FOURCC('Y', '1', '2', ' ') //12bpp Greyscale +#define MMAL_ENCODING_Y14 MMAL_FOURCC('Y', '1', '4', ' ') //14bpp Greyscale + /** SAND Video (YUVUV128) format, native format understood by VideoCore. * This format is *not* opaque - if requested you will receive full frames diff --git a/interface/mmal/util/mmal_il.c b/interface/mmal/util/mmal_il.c index bb32cd5..f3ced77 100644 --- a/interface/mmal/util/mmal_il.c +++ b/interface/mmal/util/mmal_il.c @@ -767,6 +767,10 @@ static struct { {MMAL_ENCODING_BAYER_SGRBG12P, OMX_COLOR_FormatRawBayer12bit}, {MMAL_ENCODING_BAYER_SGBRG12P, OMX_COLOR_FormatRawBayer12bit}, {MMAL_ENCODING_BAYER_SRGGB12P, OMX_COLOR_FormatRawBayer12bit}, + {MMAL_ENCODING_BAYER_SBGGR14P, OMX_COLOR_FormatRawBayer14bit}, + {MMAL_ENCODING_BAYER_SGRBG14P, OMX_COLOR_FormatRawBayer14bit}, + {MMAL_ENCODING_BAYER_SGBRG14P, OMX_COLOR_FormatRawBayer14bit}, + {MMAL_ENCODING_BAYER_SRGGB14P, OMX_COLOR_FormatRawBayer14bit}, {MMAL_ENCODING_BAYER_SBGGR16, OMX_COLOR_FormatRawBayer16bit}, {MMAL_ENCODING_BAYER_SGBRG16, OMX_COLOR_FormatRawBayer16bit}, {MMAL_ENCODING_BAYER_SGRBG16, OMX_COLOR_FormatRawBayer16bit}, @@ -786,6 +790,21 @@ static struct { {MMAL_ENCODING_Y12P, OMX_COLOR_FormatRawGrey12bit}, {MMAL_ENCODING_Y14P, OMX_COLOR_FormatRawGrey14bit}, {MMAL_ENCODING_Y16, OMX_COLOR_FormatRawGrey16bit}, + {MMAL_ENCODING_Y10, OMX_COLOR_FormatRawGrey10bit16bpp}, + {MMAL_ENCODING_Y12, OMX_COLOR_FormatRawGrey12bit16bpp}, + {MMAL_ENCODING_Y14, OMX_COLOR_FormatRawGrey14bit16bpp}, + {MMAL_ENCODING_BAYER_SBGGR10, OMX_COLOR_FormatRawBayer10bit16bpp}, + {MMAL_ENCODING_BAYER_SGRBG10, OMX_COLOR_FormatRawBayer10bit16bpp}, + {MMAL_ENCODING_BAYER_SGBRG10, OMX_COLOR_FormatRawBayer10bit16bpp}, + {MMAL_ENCODING_BAYER_SRGGB10, OMX_COLOR_FormatRawBayer10bit16bpp}, + {MMAL_ENCODING_BAYER_SBGGR12, OMX_COLOR_FormatRawBayer12bit16bpp}, + {MMAL_ENCODING_BAYER_SGRBG12, OMX_COLOR_FormatRawBayer12bit16bpp}, + {MMAL_ENCODING_BAYER_SGBRG12, OMX_COLOR_FormatRawBayer12bit16bpp}, + {MMAL_ENCODING_BAYER_SRGGB12, OMX_COLOR_FormatRawBayer12bit16bpp}, + {MMAL_ENCODING_BAYER_SBGGR14, OMX_COLOR_FormatRawBayer14bit16bpp}, + {MMAL_ENCODING_BAYER_SGRBG14, OMX_COLOR_FormatRawBayer14bit16bpp}, + {MMAL_ENCODING_BAYER_SGBRG14, OMX_COLOR_FormatRawBayer14bit16bpp}, + {MMAL_ENCODING_BAYER_SRGGB14, OMX_COLOR_FormatRawBayer14bit16bpp}, {MMAL_ENCODING_UNKNOWN, OMX_COLOR_FormatUnused} }; @@ -828,6 +847,11 @@ static struct { {MMAL_ENCODING_BAYER_SGBRG12P, OMX_COLOR_FormatRawBayer12bit, OMX_BayerOrderGBRG}, {MMAL_ENCODING_BAYER_SRGGB12P, OMX_COLOR_FormatRawBayer12bit, OMX_BayerOrderRGGB}, + {MMAL_ENCODING_BAYER_SBGGR14P, OMX_COLOR_FormatRawBayer14bit, OMX_BayerOrderBGGR}, + {MMAL_ENCODING_BAYER_SGRBG14P, OMX_COLOR_FormatRawBayer14bit, OMX_BayerOrderGRBG}, + {MMAL_ENCODING_BAYER_SGBRG14P, OMX_COLOR_FormatRawBayer14bit, OMX_BayerOrderGBRG}, + {MMAL_ENCODING_BAYER_SRGGB14P, OMX_COLOR_FormatRawBayer14bit, OMX_BayerOrderRGGB}, + {MMAL_ENCODING_BAYER_SBGGR16, OMX_COLOR_FormatRawBayer16bit, OMX_BayerOrderBGGR}, {MMAL_ENCODING_BAYER_SGRBG16, OMX_COLOR_FormatRawBayer16bit, OMX_BayerOrderGRBG}, {MMAL_ENCODING_BAYER_SGBRG16, OMX_COLOR_FormatRawBayer16bit, OMX_BayerOrderGBRG}, @@ -838,6 +862,21 @@ static struct { {MMAL_ENCODING_BAYER_SGBRG10DPCM8,OMX_COLOR_FormatRawBayer8bitcompressed, OMX_BayerOrderGBRG}, {MMAL_ENCODING_BAYER_SRGGB10DPCM8,OMX_COLOR_FormatRawBayer8bitcompressed, OMX_BayerOrderRGGB}, + {MMAL_ENCODING_BAYER_SBGGR10, OMX_COLOR_FormatRawBayer10bit16bpp, OMX_BayerOrderBGGR}, + {MMAL_ENCODING_BAYER_SGRBG10, OMX_COLOR_FormatRawBayer10bit16bpp, OMX_BayerOrderGRBG}, + {MMAL_ENCODING_BAYER_SGBRG10, OMX_COLOR_FormatRawBayer10bit16bpp, OMX_BayerOrderGBRG}, + {MMAL_ENCODING_BAYER_SRGGB10, OMX_COLOR_FormatRawBayer10bit16bpp, OMX_BayerOrderRGGB}, + + {MMAL_ENCODING_BAYER_SBGGR12, OMX_COLOR_FormatRawBayer12bit16bpp, OMX_BayerOrderBGGR}, + {MMAL_ENCODING_BAYER_SGRBG12, OMX_COLOR_FormatRawBayer12bit16bpp, OMX_BayerOrderGRBG}, + {MMAL_ENCODING_BAYER_SGBRG12, OMX_COLOR_FormatRawBayer12bit16bpp, OMX_BayerOrderGBRG}, + {MMAL_ENCODING_BAYER_SRGGB12, OMX_COLOR_FormatRawBayer12bit16bpp, OMX_BayerOrderRGGB}, + + {MMAL_ENCODING_BAYER_SBGGR14, OMX_COLOR_FormatRawBayer14bit16bpp, OMX_BayerOrderBGGR}, + {MMAL_ENCODING_BAYER_SGRBG14, OMX_COLOR_FormatRawBayer14bit16bpp, OMX_BayerOrderGRBG}, + {MMAL_ENCODING_BAYER_SGBRG14, OMX_COLOR_FormatRawBayer14bit16bpp, OMX_BayerOrderGBRG}, + {MMAL_ENCODING_BAYER_SRGGB14, OMX_COLOR_FormatRawBayer14bit16bpp, OMX_BayerOrderRGGB}, + {MMAL_ENCODING_UNKNOWN, OMX_COLOR_FormatMax, OMX_BayerOrderMax} }; diff --git a/interface/vmcs_host/khronos/IL/OMX_IVCommon.h b/interface/vmcs_host/khronos/IL/OMX_IVCommon.h index 7ef87ba..601fe7c 100644 --- a/interface/vmcs_host/khronos/IL/OMX_IVCommon.h +++ b/interface/vmcs_host/khronos/IL/OMX_IVCommon.h @@ -157,6 +157,12 @@ typedef enum OMX_COLOR_FORMATTYPE { OMX_COLOR_FormatRawGrey12bit, OMX_COLOR_FormatRawGrey14bit, OMX_COLOR_FormatRawGrey16bit, + OMX_COLOR_FormatRawBayer10bit16bpp, + OMX_COLOR_FormatRawBayer12bit16bpp, + OMX_COLOR_FormatRawBayer14bit16bpp, + OMX_COLOR_FormatRawGrey10bit16bpp, + OMX_COLOR_FormatRawGrey12bit16bpp, + OMX_COLOR_FormatRawGrey14bit16bpp, OMX_COLOR_FormatMax = 0x7FFFFFFF } OMX_COLOR_FORMATTYPE;