[Mesa-dev] [PATCH v4 8/9] st/va: implement VaDeriveImage
Emil Velikov
emil.l.velikov at gmail.com
Thu Oct 29 15:03:04 PDT 2015
Hi Julien,
One can separate the errors checks and get those separately (+stable).
I'll let others be the judge of that - I'm just going to point the
sections I have in mind.
On 29 October 2015 at 17:40, Julien Isorce <j.isorce at samsung.com> wrote:
> @@ -73,6 +76,10 @@ vlVaBufferSetNumElements(VADriverContextP ctx, VABufferID buf_id,
> return VA_STATUS_ERROR_INVALID_CONTEXT;
>
> buf = handle_table_get(VL_VA_DRIVER(ctx)->htab, buf_id);
> +
> + if (!buf || buf->derived_surface.resource)
> + return VA_STATUS_ERROR_INVALID_BUFFER;
> +
Here ...
> @@ -86,16 +93,32 @@ vlVaBufferSetNumElements(VADriverContextP ctx, VABufferID buf_id,
> VAStatus
> vlVaMapBuffer(VADriverContextP ctx, VABufferID buf_id, void **pbuff)
> {
> + vlVaDriver *drv;
> vlVaBuffer *buf;
>
> if (!ctx)
> return VA_STATUS_ERROR_INVALID_CONTEXT;
>
> - buf = handle_table_get(VL_VA_DRIVER(ctx)->htab, buf_id);
> + if (!pbuff)
> + return VA_STATUS_ERROR_INVALID_BUFFER;
> +
> + drv = VL_VA_DRIVER(ctx);
> +
> + buf = handle_table_get(drv->htab, buf_id);
... and these two.
> diff --git a/src/gallium/state_trackers/va/image.c b/src/gallium/state_trackers/va/image.c
> index 8e64673..f266ce8 100644
> --- a/src/gallium/state_trackers/va/image.c
> +++ b/src/gallium/state_trackers/va/image.c
> @@ -184,10 +184,95 @@ vlVaCreateImage(VADriverContextP ctx, VAImageFormat *format, int width, int heig
> VAStatus
> vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image)
> {
> + vlVaDriver *drv;
> + vlVaSurface *surf;
> + vlVaBuffer *img_buf;
> + VAImage *img;
> + struct pipe_surface **surfaces;
> + int w;
> + int h;
> + int i;
> +
> if (!ctx)
> return VA_STATUS_ERROR_INVALID_CONTEXT;
>
> - return VA_STATUS_ERROR_UNIMPLEMENTED;
> + drv = VL_VA_DRIVER(ctx);
> +
> + if (!drv)
> + return VA_STATUS_ERROR_INVALID_CONTEXT;
> +
> + surf = handle_table_get(drv->htab, surface);
> +
> + if (!surf || !surf->buffer || surf->buffer->interlaced)
> + return VA_STATUS_ERROR_INVALID_SURFACE;
> +
> + surfaces = surf->buffer->get_surfaces(surf->buffer);
> + if (!surfaces || !surfaces[0]->texture)
> + return VA_STATUS_ERROR_ALLOCATION_FAILED;
> +
> + img = CALLOC(1, sizeof(VAImage));
> + if (!img)
> + return VA_STATUS_ERROR_ALLOCATION_FAILED;
> +
> + img->format.fourcc = PipeToYCbCr(surf->buffer->buffer_format);
> + img->buf = VA_INVALID_ID;
> + img->width = surf->buffer->width;
> + img->height = surf->buffer->height;
> + img->num_palette_entries = 0;
> + img->entry_bytes = 0;
> + w = align(surf->buffer->width, 2);
> + h = align(surf->buffer->height, 2);
> +
> + for (i = 0; i < ARRAY_SIZE(formats); ++i) {
> + if (img->format.fourcc == formats[i].fourcc)
> + img->format = formats[i];
Break out of the loop ? Not a big deal either way.
-Emil
More information about the mesa-dev
mailing list