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

From: Hans Verkuil
Date: Mon Jul 31 2017 - 04:12:49 EST


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@xxxxxxxxxx>
> Suggested-by: Nicolas Dufresne <nicolas@xxxxxxxxxxxx>
> ---
> 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