[Mesa-dev] [PATCH 2/2] st/va: Return correct width and height for encode/decode support

Christian König ckoenig.leichtzumerken at gmail.com
Tue Oct 10 07:33:32 UTC 2017


Am 09.10.2017 um 22:45 schrieb Mark Thompson:
> Previously this would return the largest possible buffer size, which is
> much larger than the codecs themselves support.  This caused confusion
> when client applications attempted to decode 8K video thinking it was
> supported when it isn't.
>
> Signed-off-by: Mark Thompson <sw at jkqxz.net>

Reviewed-by: Christian König <christian.koenig at amd.com>

> ---
> Before this change, when given an 8K H.264 video mpv would appear to be decoding with VAAPI but display a blank screen.
>
> After, it correctly reports
> "[ffmpeg/video] h264: Hardware does not support image size 7680x4320 (constraints: width 0-4096 height 0-4096)."
> and falls back to software decoding.
>
>
>   src/gallium/state_trackers/va/surface.c | 40 ++++++++++++++++++++++++---------
>   1 file changed, 30 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/state_trackers/va/surface.c b/src/gallium/state_trackers/va/surface.c
> index 76e562717a..b00aff37b7 100644
> --- a/src/gallium/state_trackers/va/surface.c
> +++ b/src/gallium/state_trackers/va/surface.c
> @@ -476,17 +476,37 @@ vlVaQuerySurfaceAttributes(VADriverContextP ctx, VAConfigID config_id,
>      attribs[i].value.value.p = NULL; /* ignore */
>      i++;
>   
> -   attribs[i].type = VASurfaceAttribMaxWidth;
> -   attribs[i].value.type = VAGenericValueTypeInteger;
> -   attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE;
> -   attribs[i].value.value.i = vl_video_buffer_max_size(pscreen);
> -   i++;
> +   if (config->entrypoint != PIPE_VIDEO_ENTRYPOINT_UNKNOWN) {
> +      attribs[i].type = VASurfaceAttribMaxWidth;
> +      attribs[i].value.type = VAGenericValueTypeInteger;
> +      attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE;
> +      attribs[i].value.value.i =
> +         pscreen->get_video_param(pscreen,
> +                                  config->profile, config->entrypoint,
> +                                  PIPE_VIDEO_CAP_MAX_WIDTH);
> +      i++;
>   
> -   attribs[i].type = VASurfaceAttribMaxHeight;
> -   attribs[i].value.type = VAGenericValueTypeInteger;
> -   attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE;
> -   attribs[i].value.value.i = vl_video_buffer_max_size(pscreen);
> -   i++;
> +      attribs[i].type = VASurfaceAttribMaxHeight;
> +      attribs[i].value.type = VAGenericValueTypeInteger;
> +      attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE;
> +      attribs[i].value.value.i =
> +         pscreen->get_video_param(pscreen,
> +                                  config->profile, config->entrypoint,
> +                                  PIPE_VIDEO_CAP_MAX_HEIGHT);
> +      i++;
> +   } else {
> +      attribs[i].type = VASurfaceAttribMaxWidth;
> +      attribs[i].value.type = VAGenericValueTypeInteger;
> +      attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE;
> +      attribs[i].value.value.i = vl_video_buffer_max_size(pscreen);
> +      i++;
> +
> +      attribs[i].type = VASurfaceAttribMaxHeight;
> +      attribs[i].value.type = VAGenericValueTypeInteger;
> +      attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE;
> +      attribs[i].value.value.i = vl_video_buffer_max_size(pscreen);
> +      i++;
> +   }
>   
>      if (i > *num_attribs) {
>         *num_attribs = i;




More information about the mesa-dev mailing list