From b8ac9bb9ea8e63f7ec13fd5bcb9bbb52d035df13 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Sat, 11 May 2019 18:04:05 -0400 Subject: [PATCH] surface: Only set format if unset The vaCreateSurface2 may be called multiple times, setting the format again would lead to EBUSY being returned as you cannot change the format if you have buffers allocated. Signed-off-by: Nicolas Dufresne --- src/surface.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/surface.c b/src/surface.c index 38954cc..a6abb9b 100644 --- a/src/surface.c +++ b/src/surface.c @@ -71,29 +71,35 @@ VAStatus RequestCreateSurfaces2(VADriverContextP context, unsigned int format, if (format != VA_RT_FORMAT_YUV420) return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT; - found = v4l2_find_format(driver_data->video_fd, - V4L2_BUF_TYPE_VIDEO_CAPTURE, - V4L2_PIX_FMT_SUNXI_TILED_NV12); - if (found) - video_format = video_format_find(V4L2_PIX_FMT_SUNXI_TILED_NV12); - found = v4l2_find_format(driver_data->video_fd, - V4L2_BUF_TYPE_VIDEO_CAPTURE, - V4L2_PIX_FMT_NV12); - if (found) - video_format = video_format_find(V4L2_PIX_FMT_NV12); + if (!driver_data->video_format) { + found = v4l2_find_format(driver_data->video_fd, + V4L2_BUF_TYPE_VIDEO_CAPTURE, + V4L2_PIX_FMT_SUNXI_TILED_NV12); + if (found) + video_format = video_format_find(V4L2_PIX_FMT_SUNXI_TILED_NV12); - if (video_format == NULL) - return VA_STATUS_ERROR_OPERATION_FAILED; + found = v4l2_find_format(driver_data->video_fd, + V4L2_BUF_TYPE_VIDEO_CAPTURE, + V4L2_PIX_FMT_NV12); + if (found) + video_format = video_format_find(V4L2_PIX_FMT_NV12); - driver_data->video_format = video_format; + if (video_format == NULL) + return VA_STATUS_ERROR_OPERATION_FAILED; - capture_type = v4l2_type_video_capture(video_format->v4l2_mplane); + driver_data->video_format = video_format; - rc = v4l2_set_format(driver_data->video_fd, capture_type, - video_format->v4l2_format, width, height); - if (rc < 0) - return VA_STATUS_ERROR_OPERATION_FAILED; + capture_type = v4l2_type_video_capture(video_format->v4l2_mplane); + + rc = v4l2_set_format(driver_data->video_fd, capture_type, + video_format->v4l2_format, width, height); + if (rc < 0) + return VA_STATUS_ERROR_OPERATION_FAILED; + } else { + video_format = driver_data->video_format; + capture_type = v4l2_type_video_capture(video_format->v4l2_mplane); + } rc = v4l2_get_format(driver_data->video_fd, capture_type, &format_width, &format_height, destination_bytesperlines,