From 318908e6c6f8e12d71096e7d5ab6e03ed4ca67bb Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Thu, 22 Oct 2015 15:50:49 +0100 Subject: render: extract out yuv->rgb coefs Signed-off-by: Lionel Landwerlin Reviewed-by: Zhao Yakui Reviewed-by: Sean V Kelley --- 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 a170aee1..f6db8873 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 45d55ea2..1bfe04cf 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 fa48243f..b45543a2 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 f941d1b2..2e24353b 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 00000000..db817b44 --- /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 00000000..f58f903b --- /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 +#include + +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__ */ -- cgit v1.2.1