[Mesa-dev] [PATCH v4 1/9] st/va: properly defines VAImageFormat formats and improve VaCreateImage

Christian König deathsimple at vodafone.de
Thu Oct 29 12:07:22 PDT 2015


> @@ -80,12 +82,46 @@ YCbCrToPipe(unsigned format)
...
> +PipeToYCbCr(enum pipe_format p_format)

You should probably rename those two functions as well, cause when we 
start to handle RGB formats as well the name doesn't match any more.

BTW when do you use PipeToYCbCr?

Regards,
Christian.

On 29.10.2015 18:40, Julien Isorce wrote:
> Also add RGBA, RGBX and BGRX.
> Also extend ChromaToPipe and implement PipeToYCbCr.
>
> Note that gstreamer-vaapi check all the VAImageFormat fields.
>
> Signed-off-by: Julien Isorce <j.isorce at samsung.com>
> ---
>   src/gallium/state_trackers/va/image.c      | 18 +++++++++++---
>   src/gallium/state_trackers/va/va_private.h | 38 +++++++++++++++++++++++++++++-
>   2 files changed, 52 insertions(+), 4 deletions(-)
>
> diff --git a/src/gallium/state_trackers/va/image.c b/src/gallium/state_trackers/va/image.c
> index b37a971..84d94c8 100644
> --- a/src/gallium/state_trackers/va/image.c
> +++ b/src/gallium/state_trackers/va/image.c
> @@ -37,14 +37,21 @@
>   
>   #include "va_private.h"
>   
> -static const VAImageFormat formats[VL_VA_MAX_IMAGE_FORMATS] =
> +static const VAImageFormat formats[] =
>   {
>      {VA_FOURCC('N','V','1','2')},
>      {VA_FOURCC('I','4','2','0')},
>      {VA_FOURCC('Y','V','1','2')},
>      {VA_FOURCC('Y','U','Y','V')},
>      {VA_FOURCC('U','Y','V','Y')},
> -   {VA_FOURCC('B','G','R','A')}
> +   {.fourcc = VA_FOURCC('B','G','R','A'), .byte_order = VA_LSB_FIRST, 32, 32,
> +    0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000},
> +   {.fourcc = VA_FOURCC('R','G','B','A'), .byte_order = VA_LSB_FIRST, 32, 32,
> +    0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000},
> +   {.fourcc = VA_FOURCC('B','G','R','X'), .byte_order = VA_LSB_FIRST, 32, 24,
> +    0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000},
> +   {.fourcc = VA_FOURCC('R','G','B','X'), .byte_order = VA_LSB_FIRST, 32, 24,
> +    0x000000ff, 0x0000ff00, 0x00ff0000, 0x00000000}
>   };
>   
>   static void
> @@ -72,6 +79,8 @@ vlVaQueryImageFormats(VADriverContextP ctx, VAImageFormat *format_list, int *num
>      enum pipe_format format;
>      int i;
>   
> +   STATIC_ASSERT(ARRAY_SIZE(formats) == VL_VA_MAX_IMAGE_FORMATS);
> +
>      if (!ctx)
>         return VA_STATUS_ERROR_INVALID_CONTEXT;
>   
> @@ -80,7 +89,7 @@ vlVaQueryImageFormats(VADriverContextP ctx, VAImageFormat *format_list, int *num
>   
>      *num_formats = 0;
>      pscreen = VL_VA_PSCREEN(ctx);
> -   for (i = 0; i < VL_VA_MAX_IMAGE_FORMATS; ++i) {
> +   for (i = 0; i < ARRAY_SIZE(formats); ++i) {
>         format = YCbCrToPipe(formats[i].fourcc);
>         if (pscreen->is_video_format_supported(pscreen, format,
>             PIPE_VIDEO_PROFILE_UNKNOWN,
> @@ -149,6 +158,9 @@ vlVaCreateImage(VADriverContextP ctx, VAImageFormat *format, int width, int heig
>         break;
>   
>      case VA_FOURCC('B','G','R','A'):
> +   case VA_FOURCC('R','G','B','A'):
> +   case VA_FOURCC('B','G','R','X'):
> +   case VA_FOURCC('R','G','B','X'):
>         img->num_planes = 1;
>         img->pitches[0] = w * 4;
>         img->offsets[0] = 0;
> diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h
> index 93af1be..6a0bd41 100644
> --- a/src/gallium/state_trackers/va/va_private.h
> +++ b/src/gallium/state_trackers/va/va_private.h
> @@ -46,12 +46,14 @@
>   #define VL_VA_DRIVER(ctx) ((vlVaDriver *)ctx->pDriverData)
>   #define VL_VA_PSCREEN(ctx) (VL_VA_DRIVER(ctx)->vscreen->pscreen)
>   
> -#define VL_VA_MAX_IMAGE_FORMATS 6
> +#define VL_VA_MAX_IMAGE_FORMATS 9
>   
>   static inline enum pipe_video_chroma_format
>   ChromaToPipe(int format)
>   {
>      switch (format) {
> +   case VA_RT_FORMAT_YUV400:
> +      return PIPE_VIDEO_CHROMA_FORMAT_400;
>      case VA_RT_FORMAT_YUV420:
>         return PIPE_VIDEO_CHROMA_FORMAT_420;
>      case VA_RT_FORMAT_YUV422:
> @@ -80,12 +82,46 @@ YCbCrToPipe(unsigned format)
>         return PIPE_FORMAT_UYVY;
>      case VA_FOURCC('B','G','R','A'):
>         return PIPE_FORMAT_B8G8R8A8_UNORM;
> +   case VA_FOURCC('R','G','B','A'):
> +      return PIPE_FORMAT_R8G8B8A8_UNORM;
> +   case VA_FOURCC('B','G','R','X'):
> +      return PIPE_FORMAT_B8G8R8X8_UNORM;
> +   case VA_FOURCC('R','G','B','X'):
> +      return PIPE_FORMAT_R8G8B8X8_UNORM;
>      default:
>         assert(0);
>         return PIPE_FORMAT_NONE;
>      }
>   }
>   
> +static inline unsigned
> +PipeToYCbCr(enum pipe_format p_format)
> +{
> +   switch (p_format) {
> +   case PIPE_FORMAT_NV12:
> +      return VA_FOURCC('N','V','1','2');
> +   case PIPE_FORMAT_IYUV:
> +      return VA_FOURCC('I','4','2','0');
> +   case PIPE_FORMAT_YV12:
> +      return VA_FOURCC('Y','V','1','2');
> +   case PIPE_FORMAT_UYVY:
> +      return VA_FOURCC('U','Y','V','Y');
> +   case PIPE_FORMAT_YUYV:
> +      return VA_FOURCC('Y','U','Y','V');
> +   case PIPE_FORMAT_B8G8R8A8_UNORM:
> +      return VA_FOURCC('B','G','R','A');
> +   case PIPE_FORMAT_R8G8B8A8_UNORM:
> +      return VA_FOURCC('R','G','B','A');
> +   case PIPE_FORMAT_B8G8R8X8_UNORM:
> +      return VA_FOURCC('B','G','R','X');
> +   case PIPE_FORMAT_R8G8B8X8_UNORM:
> +      return VA_FOURCC('R','G','B','X');
> +   default:
> +      assert(0);
> +      return -1;
> +   }
> +}
> +
>   static inline VAProfile
>   PipeToProfile(enum pipe_video_profile profile)
>   {



More information about the mesa-dev mailing list