summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/include/pipe/p_format.h3
-rw-r--r--src/gallium/state_trackers/va/image.c24
-rw-r--r--src/gallium/state_trackers/va/va_private.h41
3 files changed, 57 insertions, 11 deletions
diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h
index b2646d44c74..5f0690e5ae6 100644
--- a/src/gallium/include/pipe/p_format.h
+++ b/src/gallium/include/pipe/p_format.h
@@ -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
diff --git a/src/gallium/state_trackers/va/image.c b/src/gallium/state_trackers/va/image.c
index b37a9714437..0d961b1f8a2 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,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;
diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h
index 93af1be19a7..56c6b029ff2 100644
--- a/src/gallium/state_trackers/va/va_private.h
+++ b/src/gallium/state_trackers/va/va_private.h
@@ -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)
{