[Mesa-dev] [PATCH 3/9] st/va: add conversion for yv12 to nv12in putimage v2
Andy Furniss
adf.lists at gmail.com
Fri Jul 22 23:51:13 UTC 2016
Christian König wrote:
> From: Boyuan Zhang <boyuan.zhang at amd.com>
>
> For putimage call, if image format is yv12 (or IYUV with U V field swap)
This comment confuses me
AIUI + checking on fourcc.org yv12 is YVU and IYUV/I420 is YUV and nv12
is UVUVUV... so compared to the normal way of writing yuv/yCbCr
I wouldn't call IYUV as being the one "with U V field swap"
and
> surface format is nv12, then we need to convert yv12 to nv12 and then copy
> the converted data from image to surface. We can't use the existing logic
> where surface is destroyed and re-created with yv12 format.
>
> v2 (chk): fix some compiler warnings and commit message
>
> Signed-off-by: Boyuan Zhang <boyuan.zhang at amd.com>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
> src/gallium/state_trackers/va/image.c | 34 +++++++++++++++++++++++++++-------
> 1 file changed, 27 insertions(+), 7 deletions(-)
>
> diff --git a/src/gallium/state_trackers/va/image.c b/src/gallium/state_trackers/va/image.c
> index 1b956e3..0364556 100644
> --- a/src/gallium/state_trackers/va/image.c
> +++ b/src/gallium/state_trackers/va/image.c
> @@ -471,7 +471,9 @@ vlVaPutImage(VADriverContextP ctx, VASurfaceID surface, VAImageID image,
> return VA_STATUS_ERROR_OPERATION_FAILED;
> }
>
> - if (format != surf->buffer->buffer_format) {
> + if ((format != surf->buffer->buffer_format) &&
> + ((format != PIPE_FORMAT_YV12) || (surf->buffer->buffer_format != PIPE_FORMAT_NV12)) &&
> + ((format != PIPE_FORMAT_IYUV) || (surf->buffer->buffer_format != PIPE_FORMAT_NV12))) {
> struct pipe_video_buffer *tmp_buf;
> struct pipe_video_buffer templat = surf->templat;
>
> @@ -513,12 +515,30 @@ vlVaPutImage(VADriverContextP ctx, VASurfaceID surface, VAImageID image,
> unsigned width, height;
> if (!views[i]) continue;
> vlVaVideoSurfaceSize(surf, i, &width, &height);
> - for (j = 0; j < views[i]->texture->array_size; ++j) {
> - struct pipe_box dst_box = {0, 0, j, width, height, 1};
> - drv->pipe->transfer_inline_write(drv->pipe, views[i]->texture, 0,
> - PIPE_TRANSFER_WRITE, &dst_box,
> - data[i] + pitches[i] * j,
> - pitches[i] * views[i]->texture->array_size, 0);
> + if (((format == PIPE_FORMAT_YV12) || (format == PIPE_FORMAT_IYUV)) &&
> + (surf->buffer->buffer_format == PIPE_FORMAT_NV12)) {
> + struct pipe_transfer *transfer = NULL;
> + uint8_t *map = NULL;
> + struct pipe_box dst_box_1 = {0, 0, 0, width, height, 1};
> + map = drv->pipe->transfer_map(drv->pipe,
> + views[i]->texture,
> + 0,
> + PIPE_TRANSFER_DISCARD_RANGE,
> + &dst_box_1, &transfer);
> + if (map == NULL)
> + return VA_STATUS_ERROR_OPERATION_FAILED;
> +
> + u_copy_yv12_img_to_nv12_surf ((ubyte * const*)data, map, width, height,
> + pitches[i], transfer->stride, i);
> + pipe_transfer_unmap(drv->pipe, transfer);
> + } else {
> + for (j = 0; j < views[i]->texture->array_size; ++j) {
> + struct pipe_box dst_box = {0, 0, j, width, height, 1};
> + drv->pipe->transfer_inline_write(drv->pipe, views[i]->texture, 0,
> + PIPE_TRANSFER_WRITE, &dst_box,
> + data[i] + pitches[i] * j,
> + pitches[i] * views[i]->texture->array_size, 0);
> + }
> }
> }
> pipe_mutex_unlock(drv->mutex);
>
More information about the mesa-dev
mailing list