[Libva] [PATCH 2/7] render: extract out yuv->rgb coefs

Zhao Yakui yakui.zhao at intel.com
Thu Nov 5 16:38:42 PST 2015


On 11/04/2015 11:27 PM, Lionel Landwerlin wrote:

This looks good to me.

Thanks.
    Yakui

> ---
>   src/Makefile.am      |  2 ++
>   src/gen8_render.c    | 32 +++++------------------
>   src/gen9_render.c    | 32 +++++------------------
>   src/i965_render.c    | 32 +++++------------------
>   src/i965_yuv_coefs.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>   src/i965_yuv_coefs.h | 36 ++++++++++++++++++++++++++
>   6 files changed, 131 insertions(+), 76 deletions(-)
>   create mode 100644 src/i965_yuv_coefs.c
>   create mode 100644 src/i965_yuv_coefs.h
>
> diff --git a/src/Makefile.am b/src/Makefile.am
> index a170aee..f6db887 100755
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -84,6 +84,7 @@ source_c = \
>   	i965_media_mpeg2.c	\
>   	i965_gpe_utils.c	\
>   	i965_post_processing.c	\
> +	i965_yuv_coefs.c	\
>   	gen8_post_processing.c	\
>   	i965_render.c		\
>   	i965_vpp_avs.c		\
> @@ -128,6 +129,7 @@ source_h = \
>   	i965_render.h           \
>   	i965_structs.h		\
>   	i965_vpp_avs.h		\
> +	i965_yuv_coefs.h	\
>   	intel_batchbuffer.h     \
>   	intel_batchbuffer_dump.h\
>   	intel_compiler.h	\
> diff --git a/src/gen8_render.c b/src/gen8_render.c
> index 45d55ea..1bfe04c 100644
> --- a/src/gen8_render.c
> +++ b/src/gen8_render.c
> @@ -45,6 +45,7 @@
>   #include "i965_defines.h"
>   #include "i965_drv_video.h"
>   #include "i965_structs.h"
> +#include "i965_yuv_coefs.h"
>
>   #include "i965_render.h"
>
> @@ -124,25 +125,6 @@ static struct i965_kernel render_kernels_gen8[] = {
>   #define URB_CS_ENTRIES	      4
>   #define URB_CS_ENTRY_SIZE     4
>
> -static float yuv_to_rgb_bt601[3][4] = {
> -{1.164,		0,	1.596,		-0.06275,},
> -{1.164,		-0.392,	-0.813,		-0.50196,},
> -{1.164,		2.017,	0,		-0.50196,},
> -};
> -
> -static float yuv_to_rgb_bt709[3][4] = {
> -{1.164,		0,	1.793,		-0.06275,},
> -{1.164,		-0.213,	-0.533,		-0.50196,},
> -{1.164,		2.112,	0,		-0.50196,},
> -};
> -
> -static float yuv_to_rgb_smpte_240[3][4] = {
> -{1.164,		0,	1.794,		-0.06275,},
> -{1.164,		-0.258,	-0.5425,	-0.50196,},
> -{1.164,		2.078,	0,		-0.50196,},
> -};
> -
> -
>   static void
>   gen8_render_set_surface_tiling(struct gen8_surface_state *ss, uint32_t tiling)
>   {
> @@ -784,6 +766,8 @@ gen8_render_upload_constants(VADriverContextP ctx,
>       float saturation = (float)i965->saturation_attrib->value / DEFAULT_SATURATION;
>       float *yuv_to_rgb;
>       unsigned int color_flag;
> +    const float* yuv_coefs;
> +    size_t coefs_length;
>
>       dri_bo_map(render_state->dynamic_state.bo, 1);
>       assert(render_state->dynamic_state.bo->virtual);
> @@ -820,12 +804,10 @@ gen8_render_upload_constants(VADriverContextP ctx,
>
>       color_flag = flags&  VA_SRC_COLOR_MASK;
>       yuv_to_rgb = (float *)constant_buffer + 8;
> -    if (color_flag == VA_SRC_BT709)
> -        memcpy(yuv_to_rgb, yuv_to_rgb_bt709, sizeof(yuv_to_rgb_bt709));
> -    else if (color_flag == VA_SRC_SMPTE_240)
> -        memcpy(yuv_to_rgb, yuv_to_rgb_smpte_240, sizeof(yuv_to_rgb_smpte_240));
> -    else
> -        memcpy(yuv_to_rgb, yuv_to_rgb_bt601, sizeof(yuv_to_rgb_bt601));
> +
> +    yuv_coefs = i915_color_standard_to_coefs(i915_filter_to_color_standard(color_flag),
> +&coefs_length);
> +    memcpy(yuv_to_rgb, yuv_coefs, coefs_length);
>
>       dri_bo_unmap(render_state->dynamic_state.bo);
>   }
> diff --git a/src/gen9_render.c b/src/gen9_render.c
> index fa48243..b45543a 100644
> --- a/src/gen9_render.c
> +++ b/src/gen9_render.c
> @@ -45,6 +45,7 @@
>   #include "i965_defines.h"
>   #include "i965_drv_video.h"
>   #include "i965_structs.h"
> +#include "i965_yuv_coefs.h"
>
>   #include "i965_render.h"
>
> @@ -118,25 +119,6 @@ static struct i965_kernel render_kernels_gen9[] = {
>   #define URB_CS_ENTRIES	      4
>   #define URB_CS_ENTRY_SIZE     4
>
> -static float yuv_to_rgb_bt601[3][4] = {
> -{1.164,		0,	1.596,		-0.06275,},
> -{1.164,		-0.392,	-0.813,		-0.50196,},
> -{1.164,		2.017,	0,		-0.50196,},
> -};
> -
> -static float yuv_to_rgb_bt709[3][4] = {
> -{1.164,		0,	1.793,		-0.06275,},
> -{1.164,		-0.213,	-0.533,		-0.50196,},
> -{1.164,		2.112,	0,		-0.50196,},
> -};
> -
> -static float yuv_to_rgb_smpte_240[3][4] = {
> -{1.164,		0,	1.794,		-0.06275,},
> -{1.164,		-0.258,	-0.5425,	-0.50196,},
> -{1.164,		2.078,	0,		-0.50196,},
> -};
> -
> -
>   static void
>   gen9_render_set_surface_tiling(struct gen8_surface_state *ss, uint32_t tiling)
>   {
> @@ -775,6 +757,8 @@ gen9_render_upload_constants(VADriverContextP ctx,
>       float saturation = (float)i965->saturation_attrib->value / DEFAULT_SATURATION;
>       float *yuv_to_rgb;
>       unsigned int color_flag;
> +    const float* yuv_coefs;
> +    size_t coefs_length;
>
>       dri_bo_map(render_state->dynamic_state.bo, 1);
>       assert(render_state->dynamic_state.bo->virtual);
> @@ -811,12 +795,10 @@ gen9_render_upload_constants(VADriverContextP ctx,
>
>       color_flag = flags&  VA_SRC_COLOR_MASK;
>       yuv_to_rgb = (float *)constant_buffer + 8;
> -    if (color_flag == VA_SRC_BT709)
> -        memcpy(yuv_to_rgb, yuv_to_rgb_bt709, sizeof(yuv_to_rgb_bt709));
> -    else if (color_flag == VA_SRC_SMPTE_240)
> -        memcpy(yuv_to_rgb, yuv_to_rgb_smpte_240, sizeof(yuv_to_rgb_smpte_240));
> -    else
> -        memcpy(yuv_to_rgb, yuv_to_rgb_bt601, sizeof(yuv_to_rgb_bt601));
> +
> +    yuv_coefs = i915_color_standard_to_coefs(i915_filter_to_color_standard(color_flag),
> +&coefs_length);
> +    memcpy(yuv_to_rgb, yuv_coefs, coefs_length);
>
>       dri_bo_unmap(render_state->dynamic_state.bo);
>   }
> diff --git a/src/i965_render.c b/src/i965_render.c
> index f941d1b..2e24353 100644
> --- a/src/i965_render.c
> +++ b/src/i965_render.c
> @@ -44,6 +44,7 @@
>   #include "i965_defines.h"
>   #include "i965_drv_video.h"
>   #include "i965_structs.h"
> +#include "i965_yuv_coefs.h"
>
>   #include "i965_render.h"
>
> @@ -311,24 +312,6 @@ static struct i965_kernel render_kernels_gen7_haswell[] = {
>   #define URB_CS_ENTRIES	      4
>   #define URB_CS_ENTRY_SIZE     4
>
> -static float yuv_to_rgb_bt601[3][4] = {
> -{1.164,		0,	1.596,		-0.06275,},
> -{1.164,		-0.392,	-0.813,		-0.50196,},
> -{1.164,		2.017,	0,		-0.50196,},
> -};
> -
> -static float yuv_to_rgb_bt709[3][4] = {
> -{1.164,		0,	1.793,		-0.06275,},
> -{1.164,		-0.213,	-0.533,		-0.50196,},
> -{1.164,		2.112,	0,		-0.50196,},
> -};
> -
> -static float yuv_to_rgb_smpte_240[3][4] = {
> -{1.164,		0,	1.794,		-0.06275,},
> -{1.164,		-0.258,	-0.5425,	-0.50196,},
> -{1.164,		2.078,	0,		-0.50196,},
> -};
> -
>   static void
>   i965_render_vs_unit(VADriverContextP ctx)
>   {
> @@ -1094,7 +1077,8 @@ i965_render_upload_constants(VADriverContextP ctx,
>       float hue = (float)i965->hue_attrib->value / 180 * PI;
>       float saturation = (float)i965->saturation_attrib->value / DEFAULT_SATURATION;
>       float *yuv_to_rgb;
> -    unsigned int color_flag;
> +    const float* yuv_coefs;
> +    size_t coefs_length;
>
>       dri_bo_map(render_state->curbe.bo, 1);
>       assert(render_state->curbe.bo->virtual);
> @@ -1125,14 +1109,10 @@ i965_render_upload_constants(VADriverContextP ctx,
>       *color_balance_base++ = cos(hue) * contrast * saturation;
>       *color_balance_base++ = sin(hue) * contrast * saturation;
>
> -    color_flag = flags&  VA_SRC_COLOR_MASK;
>       yuv_to_rgb = (float *)constant_buffer + 8;
> -    if (color_flag == VA_SRC_BT709)
> -        memcpy(yuv_to_rgb, yuv_to_rgb_bt709, sizeof(yuv_to_rgb_bt709));
> -    else if (color_flag == VA_SRC_SMPTE_240)
> -        memcpy(yuv_to_rgb, yuv_to_rgb_smpte_240, sizeof(yuv_to_rgb_smpte_240));
> -    else
> -        memcpy(yuv_to_rgb, yuv_to_rgb_bt601, sizeof(yuv_to_rgb_bt601));
> +    yuv_coefs = i915_color_standard_to_coefs(i915_filter_to_color_standard(flags&  VA_SRC_COLOR_MASK),
> +&coefs_length);
> +    memcpy(yuv_to_rgb, yuv_coefs, coefs_length);
>
>       dri_bo_unmap(render_state->curbe.bo);
>   }
> diff --git a/src/i965_yuv_coefs.c b/src/i965_yuv_coefs.c
> new file mode 100644
> index 0000000..db817b4
> --- /dev/null
> +++ b/src/i965_yuv_coefs.c
> @@ -0,0 +1,73 @@
> +/*
> + * Copyright © 2015 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction, including
> + * without limitation the rights to use, copy, modify, merge, publish,
> + * distribute, sub license, and/or sell copies of the Software, and to
> + * permit persons to whom the Software is furnished to do so, subject to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> + * next paragraph) shall be included in all copies or substantial portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> + * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#include "i965_yuv_coefs.h"
> +
> +static const float yuv_to_rgb_bt601[] = {
> +    1.164,		0,	1.596,		-0.06275,
> +    1.164,		-0.392,	-0.813,		-0.50196,
> +    1.164,		2.017,	0,		-0.50196,
> +};
> +
> +static const float yuv_to_rgb_bt709[] = {
> +    1.164,		0,	1.793,		-0.06275,
> +    1.164,		-0.213,	-0.533,		-0.50196,
> +    1.164,		2.112,	0,		-0.50196,
> +};
> +
> +static const float yuv_to_rgb_smpte_240[] = {
> +    1.164,		0,	1.794,		-0.06275,
> +    1.164,		-0.258,	-0.5425,	-0.50196,
> +    1.164,		2.078,	0,		-0.50196,
> +};
> +
> +VAProcColorStandardType i915_filter_to_color_standard (unsigned int filter) {
> +    switch (filter&  VA_SRC_COLOR_MASK) {
> +    case VA_SRC_BT601:
> +        return VAProcColorStandardBT601;
> +    case VA_SRC_BT709:
> +        return VAProcColorStandardBT709;
> +    case VA_SRC_SMPTE_240:
> +        return VAProcColorStandardSMPTE240M;
> +    default:
> +        return VAProcColorStandardBT601;
> +    }
> +}
> +
> +const float *i915_color_standard_to_coefs (VAProcColorStandardType standard, size_t *length) {
> +    switch (standard) {
> +    case VAProcColorStandardBT601:
> +        *length = sizeof(yuv_to_rgb_bt601);
> +        return yuv_to_rgb_bt601;
> +    case VAProcColorStandardBT709:
> +        *length = sizeof(yuv_to_rgb_bt709);
> +        return yuv_to_rgb_bt709;
> +    case VAProcColorStandardSMPTE240M:
> +        *length = sizeof(yuv_to_rgb_smpte_240);
> +        return yuv_to_rgb_smpte_240;
> +    default:
> +        *length = sizeof(yuv_to_rgb_bt601);
> +        return yuv_to_rgb_bt601;
> +    }
> +}
> diff --git a/src/i965_yuv_coefs.h b/src/i965_yuv_coefs.h
> new file mode 100644
> index 0000000..f58f903
> --- /dev/null
> +++ b/src/i965_yuv_coefs.h
> @@ -0,0 +1,36 @@
> +/*
> + * Copyright © 2015 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction, including
> + * without limitation the rights to use, copy, modify, merge, publish,
> + * distribute, sub license, and/or sell copies of the Software, and to
> + * permit persons to whom the Software is furnished to do so, subject to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> + * next paragraph) shall be included in all copies or substantial portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> + * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#ifndef __I965_YUV_COEFS_H__
> +#define __I965_YUV_COEFS_H__
> +
> +#include "sysdeps.h"
> +
> +#include<va/va.h>
> +#include<va/va_vpp.h>
> +
> +VAProcColorStandardType i915_filter_to_color_standard (unsigned int filter);
> +const float *i915_color_standard_to_coefs (VAProcColorStandardType standard, size_t *length);
> +
> +#endif /* __I965_YUV_COEFS_H__ */



More information about the Libva mailing list