[Mesa-dev] [PATCH 3/9] st/va: add conversion for yv12 to nv12in putimage v2
Christian König
deathsimple at vodafone.de
Mon Jul 25 11:43:15 UTC 2016
Am 23.07.2016 um 01:51 schrieb Andy Furniss:
> 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"
I have to confes I didn't understood the comment either, but I also
didn't spend to much time on it.
To make nails with head I just gone ahead and committed the patchset :)
Please open bug reports for any remaining issues.
Cheers,
Christian.
>
>
> 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