[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