[Mesa-dev] [PATCH 04/12] st/va: use correct pitch value for deriveimage call
Christian König
deathsimple at vodafone.de
Fri Jul 1 12:29:15 UTC 2016
Am 30.06.2016 um 20:30 schrieb Boyuan Zhang:
> Signed-off-by: Boyuan Zhang <boyuan.zhang at amd.com>
> ---
> src/gallium/state_trackers/va/image.c | 55 ++++++++++++++++++++++++++++++++---
> 1 file changed, 51 insertions(+), 4 deletions(-)
>
> diff --git a/src/gallium/state_trackers/va/image.c b/src/gallium/state_trackers/va/image.c
> index 1b956e3..c82b554 100644
> --- a/src/gallium/state_trackers/va/image.c
> +++ b/src/gallium/state_trackers/va/image.c
> @@ -185,10 +185,12 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image)
> vlVaSurface *surf;
> vlVaBuffer *img_buf;
> VAImage *img;
> + struct pipe_sampler_view **views;
> struct pipe_surface **surfaces;
> int w;
> int h;
> int i;
> + int pitch[3];
>
> if (!ctx)
> return VA_STATUS_ERROR_INVALID_CONTEXT;
> @@ -220,6 +222,51 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image)
> w = align(surf->buffer->width, 2);
> h = align(surf->buffer->height, 2);
>
> + switch (img->format.fourcc) {
> + case VA_FOURCC('N','V','1','2'):
> + img->num_planes = 2;
> + break;
> +
> + case VA_FOURCC('I','4','2','0'):
> + case VA_FOURCC('Y','V','1','2'):
> + img->num_planes = 3;
> + break;
> +
> + case VA_FOURCC('U','Y','V','Y'):
> + case VA_FOURCC('Y','U','Y','V'):
> + 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;
> + break;
This switch is unnecessary for not present planes the views will just be
empty.
Additional to that images can only handle single plane formats for now.
Regards,
Christian.
> +
> + default:
> + /* VaDeriveImage is designed for contiguous planes. */
> + FREE(img);
> + return VA_STATUS_ERROR_INVALID_IMAGE_FORMAT;
> + }
> +
> + views = surf->buffer->get_sampler_view_planes(surf->buffer);
> + if (!views)
> + return VA_STATUS_ERROR_OPERATION_FAILED;
> +
> + for (i = 0; i < img->num_planes; i++) {
> + unsigned width, height;
> + if (!views[i]) continue;
> + vlVaVideoSurfaceSize(surf, i, &width, &height);
> + struct pipe_box box = {0, 0, 0, width, height, 1};
> + struct pipe_transfer *transfer;
> + uint8_t *map;
> + map = drv->pipe->transfer_map(drv->pipe, views[i]->texture, 0,
> + PIPE_TRANSFER_READ, &box, &transfer);
> + if (!map)
> + return VA_STATUS_ERROR_OPERATION_FAILED;
> +
> + pitch[i] = transfer->stride;
> + pipe_transfer_unmap(drv->pipe, transfer);
> + }
> +
> for (i = 0; i < ARRAY_SIZE(formats); ++i) {
> if (img->format.fourcc == formats[i].fourcc) {
> img->format = formats[i];
> @@ -231,9 +278,9 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image)
> case VA_FOURCC('U','Y','V','Y'):
> case VA_FOURCC('Y','U','Y','V'):
> img->num_planes = 1;
> - img->pitches[0] = w * 2;
> + img->pitches[0] = pitch[0] * 2;
> img->offsets[0] = 0;
> - img->data_size = w * h * 2;
> + img->data_size = pitch[0] * h * 2;
> break;
>
> case VA_FOURCC('B','G','R','A'):
> @@ -241,9 +288,9 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image)
> case VA_FOURCC('B','G','R','X'):
> case VA_FOURCC('R','G','B','X'):
> img->num_planes = 1;
> - img->pitches[0] = w * 4;
> + img->pitches[0] = pitch[0] * 4;
> img->offsets[0] = 0;
> - img->data_size = w * h * 4;
> + img->data_size = pitch[0] * h * 4;
> break;
>
> default:
More information about the mesa-dev
mailing list