summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gallium/state_trackers/va/image.c70
-rw-r--r--src/gallium/state_trackers/va/va_private.h4
2 files changed, 48 insertions, 26 deletions
diff --git a/src/gallium/state_trackers/va/image.c b/src/gallium/state_trackers/va/image.c
index a30155e26c9..022240df84f 100644
--- a/src/gallium/state_trackers/va/image.c
+++ b/src/gallium/state_trackers/va/image.c
@@ -44,6 +44,7 @@ static const VAImageFormat formats[VL_VA_MAX_IMAGE_FORMATS] =
{VA_FOURCC('Y','V','1','2')},
{VA_FOURCC('Y','U','Y','V')},
{VA_FOURCC('U','Y','V','Y')},
+ {VA_FOURCC('B','G','R','A')}
};
static void
@@ -93,7 +94,9 @@ vlVaQueryImageFormats(VADriverContextP ctx, VAImageFormat *format_list, int *num
VAStatus
vlVaCreateImage(VADriverContextP ctx, VAImageFormat *format, int width, int height, VAImage *image)
{
+ VAStatus status;
vlVaDriver *drv;
+ VAImage *img;
int w, h;
if (!ctx)
@@ -104,50 +107,66 @@ vlVaCreateImage(VADriverContextP ctx, VAImageFormat *format, int width, int heig
drv = VL_VA_DRIVER(ctx);
- image->image_id = handle_table_add(drv->htab, image);
- image->format = *format;
- image->width = width;
- image->height = height;
+ img = CALLOC(1, sizeof(VAImage));
+ if (!img)
+ return VA_STATUS_ERROR_ALLOCATION_FAILED;
+ img->image_id = handle_table_add(drv->htab, img);
+
+ img->format = *format;
+ img->width = width;
+ img->height = height;
w = align(width, 2);
h = align(width, 2);
switch (format->fourcc) {
case VA_FOURCC('N','V','1','2'):
- image->num_planes = 2;
- image->pitches[0] = w;
- image->offsets[0] = 0;
- image->pitches[1] = w;
- image->offsets[1] = w * h;
- image->data_size = w * h * 3 / 2;
+ img->num_planes = 2;
+ img->pitches[0] = w;
+ img->offsets[0] = 0;
+ img->pitches[1] = w;
+ img->offsets[1] = w * h;
+ img->data_size = w * h * 3 / 2;
break;
case VA_FOURCC('I','4','2','0'):
case VA_FOURCC('Y','V','1','2'):
- image->num_planes = 3;
- image->pitches[0] = w;
- image->offsets[0] = 0;
- image->pitches[1] = w / 2;
- image->offsets[1] = w * h;
- image->pitches[2] = w / 2;
- image->offsets[2] = w * h * 5 / 4;
- image->data_size = w * h * 3 / 2;
+ img->num_planes = 3;
+ img->pitches[0] = w;
+ img->offsets[0] = 0;
+ img->pitches[1] = w / 2;
+ img->offsets[1] = w * h;
+ img->pitches[2] = w / 2;
+ img->offsets[2] = w * h * 5 / 4;
+ img->data_size = w * h * 3 / 2;
break;
case VA_FOURCC('U','Y','V','Y'):
case VA_FOURCC('Y','U','Y','V'):
- image->num_planes = 1;
- image->pitches[0] = w * 2;
- image->offsets[0] = 0;
- image->data_size = w * h * 2;
+ img->num_planes = 1;
+ img->pitches[0] = w * 2;
+ img->offsets[0] = 0;
+ img->data_size = w * h * 2;
+ break;
+
+ case VA_FOURCC('B','G','R','A'):
+ img->num_planes = 1;
+ img->pitches[0] = w * 4;
+ img->offsets[0] = 0;
+ img->data_size = w * h * 4;
break;
default:
return VA_STATUS_ERROR_INVALID_IMAGE_FORMAT;
}
- return vlVaCreateBuffer(ctx, 0, VAImageBufferType,
- align(image->data_size, 16),
- 1, NULL, &image->buf);
+ status = vlVaCreateBuffer(ctx, 0, VAImageBufferType,
+ align(img->data_size, 16),
+ 1, NULL, &img->buf);
+ if (status != VA_STATUS_SUCCESS)
+ return status;
+ *image = *img;
+
+ return status;
}
VAStatus
@@ -172,6 +191,7 @@ vlVaDestroyImage(VADriverContextP ctx, VAImageID image)
return VA_STATUS_ERROR_INVALID_IMAGE;
handle_table_remove(VL_VA_DRIVER(ctx)->htab, image);
+ FREE(vaimage);
return vlVaDestroyBuffer(ctx, vaimage->buf);
}
diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h
index 7d2fc24ca71..f250f74d2ef 100644
--- a/src/gallium/state_trackers/va/va_private.h
+++ b/src/gallium/state_trackers/va/va_private.h
@@ -44,7 +44,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 5
+#define VL_VA_MAX_IMAGE_FORMATS 6
static inline enum pipe_video_chroma_format
ChromaToPipe(int format)
@@ -76,6 +76,8 @@ YCbCrToPipe(unsigned format)
return PIPE_FORMAT_YUYV;
case VA_FOURCC('U','Y','V','Y'):
return PIPE_FORMAT_UYVY;
+ case VA_FOURCC('B','G','R','A'):
+ return PIPE_FORMAT_B8G8R8A8_UNORM;
default:
assert(0);
return PIPE_FORMAT_NONE;