This is an improvement, but I think you need to clip the box to

1. Size of the surface
2. Size of the image

I think that there are clipping helpers available to do that (maybe
pipe_box_clip or so? I forget, check the auxiliary dir). Christian -
does that make sense to you?

Cheers,

  -ilia
On Fri, Oct 5, 2018 at 12:01 PM <boyuan.zh...@amd.com> wrote:
>
> From: Boyuan Zhang <boyuan.zh...@amd.com>
>
> vlVaGetImage should respect the width, height, and coordinates x and y that
> passed in. Therefore, pipe_box should be created with the passed in values
> instead of surface width/height.
>
> Signed-off-by: Boyuan Zhang <boyuan.zh...@amd.com>
> ---
>  src/gallium/state_trackers/va/image.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/state_trackers/va/image.c 
> b/src/gallium/state_trackers/va/image.c
> index 3f892c9..c9f6f18 100644
> --- a/src/gallium/state_trackers/va/image.c
> +++ b/src/gallium/state_trackers/va/image.c
> @@ -400,11 +400,14 @@ vlVaGetImage(VADriverContextP ctx, VASurfaceID surface, 
> int x, int y,
>     }
>
>     for (i = 0; i < vaimage->num_planes; i++) {
> -      unsigned width, height;
> +      unsigned w = align(width, 2);
> +      unsigned h = align(height, 2);
>        if (!views[i]) continue;
> -      vlVaVideoSurfaceSize(surf, i, &width, &height);
> +      vl_video_buffer_adjust_size(&w, &h, i,
> +                                  surf->templat.chroma_format,
> +                                  surf->templat.interlaced);
>        for (j = 0; j < views[i]->texture->array_size; ++j) {
> -         struct pipe_box box = {0, 0, j, width, height, 1};
> +         struct pipe_box box = {x, y, j, w, h, 1};
>           struct pipe_transfer *transfer;
>           uint8_t *map;
>           map = drv->pipe->transfer_map(drv->pipe, views[i]->texture, 0,
> --
> 2.7.4
>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to