[vlc-devel] [PATCH] direct3d11: support YV12 which works better with DXVA2

Steve Lhomme robux4 at videolabs.io
Wed Apr 1 13:06:56 CEST 2015


The same dual mapping exists in D3D9:

http://git.videolan.org/?p=vlc.git;a=blob;f=modules/video_output/msw/direct3d9.c;h=56d053bbb4044ccccbabe7b3b2d2038aa0e062b5;hb=HEAD#l859

On Wed, Apr 1, 2015 at 12:56 PM, Steve Lhomme <robux4 at videolabs.io> wrote:
> Yes, this is why they have the exact same mapping. In msw/commons.c
> the planes are inverted for one of the variants.
>
> When you select NV12 in DXVA2 (the default), dxva2 converts it to YV12
> internally (not I420) on output. And so D3D11 doesn't know about YV12
> and thus swscale is involved.
>
> http://git.videolan.org/?p=vlc.git;a=blob;f=modules/codec/avcodec/dxva2.c;h=f9e7c405dee03d372f18efa44a7f125e3c21b739;hb=HEAD#l1030
>
> I'm working on getting rid of this unnecessary conversion and use NV12
> all the way through. This is the preferred DXVA format and also the
> only 4:2:0 format supported in D3D11.
>
> This patch is still valid in any case.
>
>
> On Wed, Apr 1, 2015 at 12:19 PM, Jean-Baptiste Kempf <jb at videolan.org> wrote:
>> On 01 Apr, Steve Lhomme wrote :
>>> --
>>> swscale won't be needed between DXVA2 and D3D11
>>
>> This cannot be right.
>>
>> U and V are inverted between I420 and YV12.
>>
>>> ---
>>>  modules/video_output/msw/direct3d11.c | 2 ++
>>>  1 file changed, 2 insertions(+)
>>>
>>> diff --git a/modules/video_output/msw/direct3d11.c b/modules/video_output/msw/direct3d11.c
>>> index 8ce639d..d9a140f 100644
>>> --- a/modules/video_output/msw/direct3d11.c
>>> +++ b/modules/video_output/msw/direct3d11.c
>>> @@ -74,6 +74,7 @@ typedef struct
>>>
>>>  static const d3d_format_t d3d_formats[] = {
>>>      { "I420",     DXGI_FORMAT_NV12,           VLC_CODEC_I420,     DXGI_FORMAT_R8_UNORM,           DXGI_FORMAT_R8G8_UNORM },
>>> +    { "YV12",     DXGI_FORMAT_NV12,           VLC_CODEC_YV12,     DXGI_FORMAT_R8_UNORM,           DXGI_FORMAT_R8G8_UNORM },
>>>      { "NV12",     DXGI_FORMAT_NV12,           VLC_CODEC_NV12,     DXGI_FORMAT_R8_UNORM,           DXGI_FORMAT_R8G8_UNORM },
>>>  #ifdef BROKEN_PIXEL
>>>      { "YUY2",     DXGI_FORMAT_YUY2,           VLC_CODEC_I422,     DXGI_FORMAT_R8G8B8A8_UNORM,     0 },
>>> @@ -749,6 +750,7 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmt)
>>>          else
>>>              sys->d3dPxShader = globPixelShaderBiplanarYUV_BT601_2RGB;
>>>          break;
>>> +    case VLC_CODEC_YV12:
>>>      case VLC_CODEC_I420:
>>>          if( fmt->i_height > 576 )
>>>              sys->d3dPxShader = globPixelShaderBiplanarI420_BT709_2RGB;
>>> --
>>> 2.3.0
>>>
>>> _______________________________________________
>>> vlc-devel mailing list
>>> To unsubscribe or modify your subscription options:
>>> https://mailman.videolan.org/listinfo/vlc-devel
>>
>> --
>> With my kindest regards,
>>
>> --
>> Jean-Baptiste Kempf
>> http://www.jbkempf.com/ - +33 672 704 734
>> Sent from my Electronic Device
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel



More information about the vlc-devel mailing list