st/va: properly defines VAImageFormat formats and improve VaCreateImage

Added PIPE_VIDEO_CHROMA_FORMAT_NONE in p_format.h
and return it by default in ChromaToPipe.

Renamed YCbCrToPipe to VaFourccToPipeFormat because it now
contains RGB.

Implemented PipeFormatToVaFourcc which will be used later in
VlVaDeriveImage.

Note that gstreamer-vaapi check all the VAImageFormat fields.

Signed-off-by: Julien Isorce <j.isorce@samsung.com>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
This commit is contained in:
Julien Isorce
2015-10-30 11:42:44 +00:00
committed by Christian König
parent 7b8cc37585
commit 87109e5f88
3 changed files with 57 additions and 11 deletions
+2 -1
View File
@@ -444,7 +444,8 @@ enum pipe_video_chroma_format
PIPE_VIDEO_CHROMA_FORMAT_400,
PIPE_VIDEO_CHROMA_FORMAT_420,
PIPE_VIDEO_CHROMA_FORMAT_422,
PIPE_VIDEO_CHROMA_FORMAT_444
PIPE_VIDEO_CHROMA_FORMAT_444,
PIPE_VIDEO_CHROMA_FORMAT_NONE
};
#ifdef __cplusplus
+18 -6
View File
@@ -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,8 +89,8 @@ 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) {
format = YCbCrToPipe(formats[i].fourcc);
for (i = 0; i < ARRAY_SIZE(formats); ++i) {
format = VaFourccToPipeFormat(formats[i].fourcc);
if (pscreen->is_video_format_supported(pscreen, format,
PIPE_VIDEO_PROFILE_UNKNOWN,
PIPE_VIDEO_ENTRYPOINT_BITSTREAM))
@@ -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;
@@ -235,7 +247,7 @@ vlVaGetImage(VADriverContextP ctx, VASurfaceID surface, int x, int y,
if (!img_buf)
return VA_STATUS_ERROR_INVALID_BUFFER;
format = YCbCrToPipe(vaimage->format.fourcc);
format = VaFourccToPipeFormat(vaimage->format.fourcc);
if (format == PIPE_FORMAT_NONE)
return VA_STATUS_ERROR_OPERATION_FAILED;
@@ -330,7 +342,7 @@ vlVaPutImage(VADriverContextP ctx, VASurfaceID surface, VAImageID image,
if (!img_buf)
return VA_STATUS_ERROR_INVALID_BUFFER;
format = YCbCrToPipe(vaimage->format.fourcc);
format = VaFourccToPipeFormat(vaimage->format.fourcc);
if (format == PIPE_FORMAT_NONE)
return VA_STATUS_ERROR_OPERATION_FAILED;
+37 -4
View File
@@ -46,7 +46,7 @@
#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)
@@ -59,13 +59,12 @@ ChromaToPipe(int format)
case VA_RT_FORMAT_YUV444:
return PIPE_VIDEO_CHROMA_FORMAT_444;
default:
assert(0);
return PIPE_VIDEO_CHROMA_FORMAT_420;
return PIPE_VIDEO_CHROMA_FORMAT_NONE;
}
}
static inline enum pipe_format
YCbCrToPipe(unsigned format)
VaFourccToPipeFormat(unsigned format)
{
switch(format) {
case VA_FOURCC('N','V','1','2'):
@@ -80,12 +79,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
PipeFormatToVaFourcc(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)
{