Commit cc552b62 authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Mauro Carvalho Chehab
Browse files

[media] V4L: soc-camera: add a new packing for YUV 4:2:0 type formats



12-bit formats, similar to YUV 4:2:0 occupy 3 bytes for each two pixels
and cannot be described by any of the existing SOC_MBUS_PACKING_* macros.
This patch adds a new one SOC_MBUS_PACKING_1_5X8 to describe such
formats and extends soc_mbus_samples_per_pixel() to support it.

Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent e9ceeced
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -756,8 +756,10 @@ static void configure_geometry(struct mx3_camera_dev *mx3_cam,
		 * the width parameter count the number of samples to
		 * capture to complete the whole image width.
		 */
		width *= soc_mbus_samples_per_pixel(fmt);
		BUG_ON(width < 0);
		unsigned int num, den;
		int ret = soc_mbus_samples_per_pixel(fmt, &num, &den);
		BUG_ON(ret < 0);
		width = width * num / den;
	}

	/* Setup frame size - this cannot be changed on-the-fly... */
+16 −3
Original line number Diff line number Diff line
@@ -172,16 +172,27 @@ static const struct soc_mbus_lookup mbus_fmt[] = {
},
};

int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf)
int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf,
			unsigned int *numerator, unsigned int *denominator)
{
	switch (mf->packing) {
	case SOC_MBUS_PACKING_NONE:
	case SOC_MBUS_PACKING_EXTEND16:
		return 1;
		*numerator = 1;
		*denominator = 1;
		return 0;
	case SOC_MBUS_PACKING_2X8_PADHI:
	case SOC_MBUS_PACKING_2X8_PADLO:
		return 2;
		*numerator = 2;
		*denominator = 1;
		return 0;
	case SOC_MBUS_PACKING_1_5X8:
		*numerator = 3;
		*denominator = 2;
		return 0;
	case SOC_MBUS_PACKING_VARIABLE:
		*numerator = 0;
		*denominator = 1;
		return 0;
	}
	return -EINVAL;
@@ -197,6 +208,8 @@ s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
	case SOC_MBUS_PACKING_2X8_PADLO:
	case SOC_MBUS_PACKING_EXTEND16:
		return width * 2;
	case SOC_MBUS_PACKING_1_5X8:
		return width * 3 / 2;
	case SOC_MBUS_PACKING_VARIABLE:
		return 0;
	}
+8 −2
Original line number Diff line number Diff line
@@ -16,12 +16,16 @@

/**
 * enum soc_mbus_packing - data packing types on the media-bus
 * @SOC_MBUS_PACKING_NONE:	no packing, bit-for-bit transfer to RAM
 * @SOC_MBUS_PACKING_NONE:	no packing, bit-for-bit transfer to RAM, one
 *				sample represents one pixel
 * @SOC_MBUS_PACKING_2X8_PADHI:	16 bits transferred in 2 8-bit samples, in the
 *				possibly incomplete byte high bits are padding
 * @SOC_MBUS_PACKING_2X8_PADLO:	as above, but low bits are padding
 * @SOC_MBUS_PACKING_EXTEND16:	sample width (e.g., 10 bits) has to be extended
 *				to 16 bits
 * @SOC_MBUS_PACKING_VARIABLE:	compressed formats with variable packing
 * @SOC_MBUS_PACKING_1_5X8:	used for packed YUV 4:2:0 formats, where 4
 *				pixels occupy 6 bytes in RAM
 */
enum soc_mbus_packing {
	SOC_MBUS_PACKING_NONE,
@@ -29,6 +33,7 @@ enum soc_mbus_packing {
	SOC_MBUS_PACKING_2X8_PADLO,
	SOC_MBUS_PACKING_EXTEND16,
	SOC_MBUS_PACKING_VARIABLE,
	SOC_MBUS_PACKING_1_5X8,
};

/**
@@ -75,6 +80,7 @@ const struct soc_mbus_pixelfmt *soc_mbus_find_fmtdesc(
const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
	enum v4l2_mbus_pixelcode code);
s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf);
int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf);
int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf,
			unsigned int *numerator, unsigned int *denominator);

#endif