[PATCH v3 1/5] [media] v4l: add porter duff blend controls

Hans Verkuil hverkuil at xs4all.nl
Mon Jul 31 01:12:36 PDT 2017


On 07/31/2017 05:07 AM, Jacob Chen wrote:
> At peresent, we don't have a control for Compositing and Blend.
> All drivers are just doing copies while actually many hardwares
> supports more functions.
> 
> So Adding V4L2 controls for Compositing and Blend, used for for
> composting streams.
> 
> The values are based on porter duff operations.
> Defined in below links.
> https://developer.xamarin.com/api/type/Android.Graphics.PorterDuff+Mode/
> 
> Signed-off-by: Jacob Chen <jacob-chen at iotwrt.com>
> Suggested-by: Nicolas Dufresne <nicolas at ndufresne.ca>
> ---
>  drivers/media/v4l2-core/v4l2-ctrls.c | 20 +++++++++++++++++++-
>  include/uapi/linux/v4l2-controls.h   | 16 +++++++++++++++-
>  2 files changed, 34 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
> index b9e08e3..561d7d5 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
> @@ -478,7 +478,21 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
>  		"Region Grid",
>  		NULL,
>  	};
> -
> +	static const char * const porter_duff_modes[] = {
> +		"Source",
> +		"Source Top",
> +		"Source In",
> +		"Source Out",
> +		"Source Over",
> +		"Destination",
> +		"Destination Top",
> +		"Destination In",
> +		"Destination Out",
> +		"Destination Over",
> +		"Add",
> +		"Clear",
> +		NULL
> +	};
>  
>  	switch (id) {
>  	case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
> @@ -564,6 +578,8 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
>  		return vpx_golden_frame_sel;
>  	case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
>  		return jpeg_chroma_subsampling;
> +	case V4L2_CID_PORTER_DUFF_MODE:
> +		return porter_duff_modes;
>  	case V4L2_CID_DV_TX_MODE:
>  		return dv_tx_mode;
>  	case V4L2_CID_DV_TX_RGB_RANGE:
> @@ -886,6 +902,7 @@ const char *v4l2_ctrl_get_name(u32 id)
>  	case V4L2_CID_PIXEL_RATE:		return "Pixel Rate";
>  	case V4L2_CID_TEST_PATTERN:		return "Test Pattern";
>  	case V4L2_CID_DEINTERLACING_MODE:	return "Deinterlacing Mode";
> +	case V4L2_CID_PORTER_DUFF_MODE:		return "PorterDuff Blend Modes";
>  
>  	/* DV controls */
>  	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
> @@ -1060,6 +1077,7 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
>  	case V4L2_CID_DV_RX_IT_CONTENT_TYPE:
>  	case V4L2_CID_TEST_PATTERN:
>  	case V4L2_CID_DEINTERLACING_MODE:
> +	case V4L2_CID_PORTER_DUFF_MODE:
>  	case V4L2_CID_TUNE_DEEMPHASIS:
>  	case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL:
>  	case V4L2_CID_DETECT_MD_MODE:
> diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
> index 0d2e1e0..9543b4b 100644
> --- a/include/uapi/linux/v4l2-controls.h
> +++ b/include/uapi/linux/v4l2-controls.h
> @@ -893,7 +893,21 @@ enum v4l2_jpeg_chroma_subsampling {
>  #define V4L2_CID_PIXEL_RATE			(V4L2_CID_IMAGE_PROC_CLASS_BASE + 2)
>  #define V4L2_CID_TEST_PATTERN			(V4L2_CID_IMAGE_PROC_CLASS_BASE + 3)
>  #define V4L2_CID_DEINTERLACING_MODE		(V4L2_CID_IMAGE_PROC_CLASS_BASE + 4)
> -
> +#define V4L2_CID_PORTER_DUFF_MODE		(V4L2_CID_IMAGE_PROC_CLASS_BASE + 5)

I recommend that you add a link to e.g. https://en.wikipedia.org/wiki/Alpha_compositing
as a comment here.

> +enum v4l2_porter_duff_mode {
> +	V4L2_PORTER_DUFF_SRC			= 0,
> +	V4L2_PORTER_DUFF_SRCATOP		= 1,
> +	V4L2_PORTER_DUFF_SRCIN			= 2,
> +	V4L2_PORTER_DUFF_SRCOUT			= 3,
> +	V4L2_PORTER_DUFF_SRCOVER		= 4,
> +	V4L2_PORTER_DUFF_DST			= 5,
> +	V4L2_PORTER_DUFF_DSTATOP		= 6,
> +	V4L2_PORTER_DUFF_DSTIN			= 7,
> +	V4L2_PORTER_DUFF_DSTOUT			= 8,
> +	V4L2_PORTER_DUFF_DSTOVER		= 9,
> +	V4L2_PORTER_DUFF_ADD			= 10,
> +	V4L2_PORTER_DUFF_CLEAR			= 11,
> +};
>  
>  /*  DV-class control IDs defined by V4L2 */
>  #define V4L2_CID_DV_CLASS_BASE			(V4L2_CTRL_CLASS_DV | 0x900)
> 

This control also has to be documented in Documentation/media/uapi/v4l/extended-controls.rst.

Regards,

	Hans



More information about the linux-arm-kernel mailing list