[Mesa-dev] [PATCH] radeonsi/uvd: fix interlaced video buffer height alignment

Christian König deathsimple at vodafone.de
Tue Sep 12 15:37:27 UTC 2017


Am 12.09.2017 um 17:32 schrieb Leo Liu:
>
>
> On 09/12/2017 11:23 AM, Christian König wrote:
>> I don't think this is correct. A long long time ago I've came up with 
>> this because the firmware didn't liked what you proposed below.
> Since this change only affects 720p video, so I did quite a bit tests 
> on 720p video dec/enc, and haven't see any problem.
>
> Can you point out some failed case?

No, I briefly remember the issue was with some low res MPEG2 stream, but 
no idea which one exactly.

>
>>
>> Instead we should rather fix the scaler to use the original 
>> width/height of the video buffer and not the adjusted width/height of 
>> the resources.
> To be honest, I don't really want to touch here, that's why I sent 
> this patch alone for RFC, and also why I was got workaround for OMX 
> one year ago, but now encounter the same again, and it seems not easy 
> to fix on the blit, since it's scaling, not like OMX case, I can use 
> src rect for dst.

I think the problem is simply that you use the wrong variables.

See there are video_buffer->width/heigth which are the original values 
the application requested (IIRC) and there are the 
pipe_resource->width/height which are aligned so that the hardware can 
deal with them.

So while scaling we need to look at video_buffer->width/height instead 
of the resource width/height to figure out the destination area of the blit.

Regards,
Christian.

>
> Regards,
> Leo
>
>
>>
>> Regards,
>> Christian.
>>
>> Am 12.09.2017 um 15:56 schrieb Leo Liu:
>>> In code:
>>>     template.height = align(tmpl->height / array_size, 
>>> VL_MACROBLOCK_HEIGHT);
>>>     ...
>>>     template.height *= array_size;
>>>
>>> It turns out the height will be aligned with 2*VL_MACROBLOCK_HEIGHT.
>>> The problematic case for example is when VA-API postproc scaling with
>>> blit between interlaced buffers, if the size is 720 in height, it will
>>> be actually scaled to 736 in height, so the scaled video will crop out
>>> the extra 16 lines of height.
>>>
>>> Another example is when deint with 720p video from interlaced buffer
>>> to progressive buffer. This problem happened on OMX, and got workaround
>>> with patch:
>>>
>>> (0c374a777 st/omx/dec: set dst rect to match src size
>>>
>>> When creating interlaced video buffer, hegith set to "template.height =
>>> align(tmpl->height/ array_size, VL_MACROBLOCK_HEIGHT);", and we use
>>> "template.height *= array_size;" for the buffer height, so it actually
>>> aligned with 32. With progressive video buffer it still aligned with 
>>> 16,
>>> thus causing different height between interlaced buffer and progressive
>>> buffer for 4K (height=2160), and 720p (height=720).
>>>
>>> When transcode the video, this will cause the 16 lines corruption
>>> at the bottom of the encode video.)
>>>
>>> Signed-off-by: Leo Liu <leo.liu at amd.com>
>>> ---
>>>   src/gallium/drivers/radeonsi/si_uvd.c | 2 +-
>>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/src/gallium/drivers/radeonsi/si_uvd.c 
>>> b/src/gallium/drivers/radeonsi/si_uvd.c
>>> index 2441ad248c..e4c55c20e1 100644
>>> --- a/src/gallium/drivers/radeonsi/si_uvd.c
>>> +++ b/src/gallium/drivers/radeonsi/si_uvd.c
>>> @@ -62,7 +62,7 @@ struct pipe_video_buffer 
>>> *si_video_buffer_create(struct pipe_context *pipe,
>>>       array_size = tmpl->interlaced ? 2 : 1;
>>>       template = *tmpl;
>>>       template.width = align(tmpl->width, VL_MACROBLOCK_WIDTH);
>>> -    template.height = align(tmpl->height / array_size, 
>>> VL_MACROBLOCK_HEIGHT);
>>> +    template.height = align(tmpl->height, VL_MACROBLOCK_HEIGHT) / 
>>> array_size;
>>>         vl_video_buffer_template(&templ, &template, 
>>> resource_formats[0], 1, array_size, PIPE_USAGE_DEFAULT, 0);
>>>       /* TODO: get tiling working */
>>
>>
>



More information about the mesa-dev mailing list