[libcamera-devel] [PATCH] libcamera: add hi846 camera sensor properties
Martin Kepplinger
martin.kepplinger at puri.sm
Mon Sep 6 14:51:47 CEST 2021
Am Montag, dem 06.09.2021 um 04:37 +0300 schrieb Laurent Pinchart:
> Hi Martin,
>
> Thank you for the patch.
>
> On Thu, Sep 02, 2021 at 08:44:16AM +0200, Martin Kepplinger wrote:
> > Add camera sensor properties for the Hynix hi846 sensor.
> > The part is also called YACG4D0C9SHC and a datasheet can be found
> > at
> > https://product.skhynix.com/products/cis/cis.go
> >
> > This is the selfie camera in the Librem 5 phone.
> >
> > Signed-off-by: Martin Kepplinger <martin.kepplinger at puri.sm>
> > ---
> >
> > Note that the driver is not yet merged into the mainline but being
> > reviewed:
> > https://lore.kernel.org/linux-media/20210831134344.1673318-1-martin.kepplinger@puri.sm/
>
> It's well on its way to upstream so that's fine with me.
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
> > libcamera doesn't warn about anything when using the camera. `cam`
> > streams
> > and qcam shows a (non-debayered) image.
>
> qcam supports debayering when using the GLES rendered (-r gles), but
> doesn't yet support 16-bit formats. The following patch is completely
> untested but may help. Would you be able to give it a try ?
>
> diff --git a/src/qcam/assets/shader/bayer_8.frag
> b/src/qcam/assets/shader/bayer_8.frag
> index 4ece44ab5650..b924e8c6ff0a 100644
> --- a/src/qcam/assets/shader/bayer_8.frag
> +++ b/src/qcam/assets/shader/bayer_8.frag
> @@ -22,10 +22,15 @@ varying vec4 center;
> varying vec4 yCoord;
> varying vec4 xCoord;
>
> +#if defined(BAYER_16BPP)
> +#define fetch(x, y) texture2D(tex_y, vec2(x, y)).a
> +#else
> +#define fetch(x, y) texture2D(tex_y, vec2(x, y)).r
> +#endif
> +
> void main(void) {
> - #define fetch(x, y) texture2D(tex_y, vec2(x, y)).r
>
> - float C = texture2D(tex_y, center.xy).r; // ( 0, 0)
> + float C = fetch(center.x, center.y); // ( 0, 0)
> const vec4 kC = vec4( 4.0, 6.0, 5.0, 5.0) / 8.0;
>
> // Determine which of four types of pixels we are on.
> diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
> index 32232faa2ad8..83ee0c7d54bf 100644
> --- a/src/qcam/viewfinder_gl.cpp
> +++ b/src/qcam/viewfinder_gl.cpp
> @@ -53,6 +53,11 @@ static const QList<libcamera::PixelFormat>
> supportedFormats{
> libcamera::formats::SGBRG12_CSI2P,
> libcamera::formats::SGRBG12_CSI2P,
> libcamera::formats::SRGGB12_CSI2P,
> + /* Raw Bayer 16-bit */
> + libcamera::formats::SBGGR16,
> + libcamera::formats::SGBRG16,
> + libcamera::formats::SGRBG16,
> + libcamera::formats::SRGGB16,
> };
>
> ViewFinderGL::ViewFinderGL(QWidget *parent)
> @@ -226,6 +231,9 @@ bool ViewFinderGL::selectFormat(const
> libcamera::PixelFormat &format)
> fragmentShaderDefines_.append("#define RGB_PATTERN
> bgr");
> fragmentShaderFile_ = ":RGB.frag";
> break;
> + case libcamera::formats::SBGGR16:
> + fragmentShaderDefines_.append("#define BAYER_16BPP");
> + [[fallthrough]];
> case libcamera::formats::SBGGR8:
> firstRed_.setX(1.0);
> firstRed_.setY(1.0);
> @@ -233,6 +241,9 @@ bool ViewFinderGL::selectFormat(const
> libcamera::PixelFormat &format)
> fragmentShaderFile_ = ":bayer_8.frag";
> textureMinMagFilters_ = GL_NEAREST;
> break;
> + case libcamera::formats::SGBRG16:
> + fragmentShaderDefines_.append("#define BAYER_16BPP");
> + [[fallthrough]];
> case libcamera::formats::SGBRG8:
> firstRed_.setX(0.0);
> firstRed_.setY(1.0);
> @@ -240,6 +251,9 @@ bool ViewFinderGL::selectFormat(const
> libcamera::PixelFormat &format)
> fragmentShaderFile_ = ":bayer_8.frag";
> textureMinMagFilters_ = GL_NEAREST;
> break;
> + case libcamera::formats::SGRBG16:
> + fragmentShaderDefines_.append("#define BAYER_16BPP");
> + [[fallthrough]];
> case libcamera::formats::SGRBG8:
> firstRed_.setX(1.0);
> firstRed_.setY(0.0);
> @@ -247,6 +261,9 @@ bool ViewFinderGL::selectFormat(const
> libcamera::PixelFormat &format)
> fragmentShaderFile_ = ":bayer_8.frag";
> textureMinMagFilters_ = GL_NEAREST;
> break;
> + case libcamera::formats::SRGGB16:
> + fragmentShaderDefines_.append("#define BAYER_16BPP");
> + [[fallthrough]];
> case libcamera::formats::SRGGB8:
> firstRed_.setX(0.0);
> firstRed_.setY(0.0);
> @@ -697,6 +714,36 @@ void ViewFinderGL::doRender()
> 1.0f / (size_.height()
> - 1));
> break;
>
> + case libcamera::formats::SBGGR16:
> + case libcamera::formats::SGBRG16:
> + case libcamera::formats::SGRBG16:
> + case libcamera::formats::SRGGB16:
> + /*
> + * Raw Bayer 16-bit formats are stored in a
> GL_LUMINANCE_ALPHA
> + * texture. The texture width is equal to half the
> stride.
> + */
> + glActiveTexture(GL_TEXTURE0);
> + configureTexture(*textures_[0]);
> + glTexImage2D(GL_TEXTURE_2D,
> + 0,
> + GL_LUMINANCE_ALPHA,
> + stride_ / 2,
> + size_.height(),
> + 0,
> + GL_LUMINANCE_ALPHA,
> + GL_UNSIGNED_BYTE,
> + image_->data(0).data());
builds when using data_ here (if that's correct?)
without further inspection, qcam shows a black image stream with this
(the ugly debayered image at least shows something so gain should be
enough to see something).
the fps are quite good though :)
> + shaderProgram_.setUniformValue(textureUniformY_, 0);
> + shaderProgram_.setUniformValue(textureUniformBayerFir
> stRed_,
> + firstRed_);
> + shaderProgram_.setUniformValue(textureUniformSize_,
> + size_.width(), /* in
> pixels */
> + size_.height());
> + shaderProgram_.setUniformValue(textureUniformStep_,
> + 1.0f / (stride_ / 2 -
> 1),
> + 1.0f / (size_.height()
> - 1));
> + break;
> +
> default:
> break;
> };
>
>
> > src/libcamera/camera_sensor_properties.cpp | 18 ++++++++++++++++++
> > 1 file changed, 18 insertions(+)
> >
> > diff --git a/src/libcamera/camera_sensor_properties.cpp
> > b/src/libcamera/camera_sensor_properties.cpp
> > index 4ee45e72..39bb282d 100644
> > --- a/src/libcamera/camera_sensor_properties.cpp
> > +++ b/src/libcamera/camera_sensor_properties.cpp
> > @@ -52,6 +52,24 @@ LOG_DEFINE_CATEGORY(CameraSensorProperties)
> > const CameraSensorProperties *CameraSensorProperties::get(const
> > std::string &sensor)
> > {
> > static const std::map<std::string, const
> > CameraSensorProperties> sensorProps = {
> > + { "hi846", {
> > + .unitCellSize = { 1120, 1120 },
> > + .testPatternModes = {
> > + { 0,
> > controls::draft::TestPatternModeOff },
> > + { 1,
> > controls::draft::TestPatternModeSolidColor },
> > + { 2,
> > controls::draft::TestPatternModeColorBars },
> > + { 3,
> > controls::draft::TestPatternModeColorBarsFadeToGray },
> > + { 4,
> > controls::draft::TestPatternModePn9 },
> > + /*
> > + * No corresponding test pattern
> > mode for:
> > + * 5: "Gradient Horizontal"
> > + * 6: "Gradient Vertical"
> > + * 7: "Check Board"
> > + * 8: "Slant Pattern"
> > + * 9: "Resolution Pattern"
> > + */
> > + },
> > + } },
> > { "imx219", {
> > .unitCellSize = { 1120, 1120 },
> > .testPatternModes = {
>
More information about the libcamera-devel
mailing list