diff mbox series

[FFmpeg-devel,v3,1/4] avutil/hwcontext_qsv: derive QSV frames to D3D11VA frames

Message ID 20220505105318.716-1-tong1.wu@intel.com
State New
Headers show
Series [FFmpeg-devel,v3,1/4] avutil/hwcontext_qsv: derive QSV frames to D3D11VA frames | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Wu, Tong1 May 5, 2022, 10:53 a.m. UTC
Fixes:
$ ffmpeg.exe -y -hwaccel qsv -init_hw_device d3d11va=d3d11 \
-init_hw_device qsv=qsv@d3d11 -c:v h264_qsv -i input.h264 \
-vf "hwmap=derive_device=d3d11va,format=d3d11" -f null -

Signed-off-by: Tong Wu <tong1.wu@intel.com>
---
 libavutil/hwcontext_qsv.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

Comments

Soft Works May 5, 2022, 11:52 a.m. UTC | #1
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Tong
> Wu
> Sent: Thursday, May 5, 2022 12:53 PM
> To: ffmpeg-devel@ffmpeg.org
> Cc: Tong Wu <tong1.wu@intel.com>
> Subject: [FFmpeg-devel] [PATCH v3 1/4] avutil/hwcontext_qsv: derive
> QSV frames to D3D11VA frames
> 
> Fixes:
> $ ffmpeg.exe -y -hwaccel qsv -init_hw_device d3d11va=d3d11 \
> -init_hw_device qsv=qsv@d3d11 -c:v h264_qsv -i input.h264 \
> -vf "hwmap=derive_device=d3d11va,format=d3d11" -f null -
> 
> Signed-off-by: Tong Wu <tong1.wu@intel.com>
> ---
>  libavutil/hwcontext_qsv.c | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
> index b28dcffe2a..65af7130b8 100644
> --- a/libavutil/hwcontext_qsv.c
> +++ b/libavutil/hwcontext_qsv.c
> @@ -1281,12 +1281,23 @@ static int
> qsv_frames_derive_from(AVHWFramesContext *dst_ctx,
>  #if CONFIG_D3D11VA
>      case AV_HWDEVICE_TYPE_D3D11VA:
>          {
> +            dst_ctx->initial_pool_size = src_ctx->initial_pool_size;
>              AVD3D11VAFramesContext *dst_hwctx = dst_ctx->hwctx;
> -            mfxHDLPair *pair = (mfxHDLPair*)src_hwctx-
> >surfaces[i].Data.MemId;
> -            dst_hwctx->texture = (ID3D11Texture2D*)pair->first;
> +            dst_hwctx->texture_infos = av_calloc(src_hwctx-
> >nb_surfaces,
> +                                                 sizeof(*dst_hwctx-
> >texture_infos));
>              if (src_hwctx->frame_type & MFX_MEMTYPE_SHARED_RESOURCE)
>                  dst_hwctx->MiscFlags = D3D11_RESOURCE_MISC_SHARED;
>              dst_hwctx->BindFlags =
> qsv_get_d3d11va_bind_flags(src_hwctx->frame_type);

This is not right. QSV frames are not only created from here
(hwcontext_qsv) but also from qsvvpp.c AND also by MSDK internally
as VPP output frames, which means that we cannot assume the rules
we are using here being followed.

You need to query those flags from the (first) texture instead.

	
> +            for (i = 0; i < src_hwctx->nb_surfaces; i++) {
> +                mfxHDLPair* pair = (mfxHDLPair*)src_hwctx-
> >surfaces[i].Data.MemId;
> +                dst_hwctx->texture_infos[i].texture =
> (ID3D11Texture2D*)pair->first;
> +                if (dst_hwctx->BindFlags & D3D11_BIND_RENDER_TARGET)
> {
> +                    dst_hwctx->texture_infos[i].index = 0;
> +                }
> +                else {
> +                    dst_hwctx->texture_infos[i].index =
> (intptr_t)pair->second;
> +                }
> +            }

Same as above here. With MSDK it is not guaranteed that VPP
output frames will be array textures. This depends on the MSDK
runtime version.
They always have the flag D3D11_BIND_RENDER_TARGET, so that's
not an appropriate condition.

I would check .second for MFX_INFINITE instead.

Kind regards,
softworkz
Wu, Tong1 May 6, 2022, 1:05 a.m. UTC | #2
> -----Original Message-----
> From: Soft Works <softworkz@hotmail.com>
> Sent: Thursday, May 5, 2022 7:53 PM
> To: FFmpeg development discussions and patches <ffmpeg-
> devel@ffmpeg.org>
> Cc: Wu, Tong1 <tong1.wu@intel.com>
> Subject: RE: [FFmpeg-devel] [PATCH v3 1/4] avutil/hwcontext_qsv: derive
> QSV frames to D3D11VA frames
> 
> 
> 
> > -----Original Message-----
> > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> Tong
> > Wu
> > Sent: Thursday, May 5, 2022 12:53 PM
> > To: ffmpeg-devel@ffmpeg.org
> > Cc: Tong Wu <tong1.wu@intel.com>
> > Subject: [FFmpeg-devel] [PATCH v3 1/4] avutil/hwcontext_qsv: derive
> > QSV frames to D3D11VA frames
> >
> > Fixes:
> > $ ffmpeg.exe -y -hwaccel qsv -init_hw_device d3d11va=d3d11 \
> > -init_hw_device qsv=qsv@d3d11 -c:v h264_qsv -i input.h264 \ -vf
> > "hwmap=derive_device=d3d11va,format=d3d11" -f null -
> >
> > Signed-off-by: Tong Wu <tong1.wu@intel.com>
> > ---
> >  libavutil/hwcontext_qsv.c | 15 +++++++++++++--
> >  1 file changed, 13 insertions(+), 2 deletions(-)
> >
> > diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
> > index b28dcffe2a..65af7130b8 100644
> > --- a/libavutil/hwcontext_qsv.c
> > +++ b/libavutil/hwcontext_qsv.c
> > @@ -1281,12 +1281,23 @@ static int
> > qsv_frames_derive_from(AVHWFramesContext *dst_ctx,  #if
> CONFIG_D3D11VA
> >      case AV_HWDEVICE_TYPE_D3D11VA:
> >          {
> > +            dst_ctx->initial_pool_size = src_ctx->initial_pool_size;
> >              AVD3D11VAFramesContext *dst_hwctx = dst_ctx->hwctx;
> > -            mfxHDLPair *pair = (mfxHDLPair*)src_hwctx-
> > >surfaces[i].Data.MemId;
> > -            dst_hwctx->texture = (ID3D11Texture2D*)pair->first;
> > +            dst_hwctx->texture_infos = av_calloc(src_hwctx-
> > >nb_surfaces,
> > +                                                 sizeof(*dst_hwctx-
> > >texture_infos));
> >              if (src_hwctx->frame_type & MFX_MEMTYPE_SHARED_RESOURCE)
> >                  dst_hwctx->MiscFlags = D3D11_RESOURCE_MISC_SHARED;
> >              dst_hwctx->BindFlags =
> > qsv_get_d3d11va_bind_flags(src_hwctx->frame_type);
> 
> This is not right. QSV frames are not only created from here
> (hwcontext_qsv) but also from qsvvpp.c AND also by MSDK internally as VPP
> output frames, which means that we cannot assume the rules we are using
> here being followed.
> 
> You need to query those flags from the (first) texture instead.
> 

Thanks, will resubmit the patchset.

> 
> > +            for (i = 0; i < src_hwctx->nb_surfaces; i++) {
> > +                mfxHDLPair* pair = (mfxHDLPair*)src_hwctx-
> > >surfaces[i].Data.MemId;
> > +                dst_hwctx->texture_infos[i].texture =
> > (ID3D11Texture2D*)pair->first;
> > +                if (dst_hwctx->BindFlags & D3D11_BIND_RENDER_TARGET)
> > {
> > +                    dst_hwctx->texture_infos[i].index = 0;
> > +                }
> > +                else {
> > +                    dst_hwctx->texture_infos[i].index =
> > (intptr_t)pair->second;
> > +                }
> > +            }
> 
> Same as above here. With MSDK it is not guaranteed that VPP output frames
> will be array textures. This depends on the MSDK runtime version.
> They always have the flag D3D11_BIND_RENDER_TARGET, so that's not an
> appropriate condition.
> 
> I would check .second for MFX_INFINITE instead.
> 
> Kind regards,
> softworkz
diff mbox series

Patch

diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
index b28dcffe2a..65af7130b8 100644
--- a/libavutil/hwcontext_qsv.c
+++ b/libavutil/hwcontext_qsv.c
@@ -1281,12 +1281,23 @@  static int qsv_frames_derive_from(AVHWFramesContext *dst_ctx,
 #if CONFIG_D3D11VA
     case AV_HWDEVICE_TYPE_D3D11VA:
         {
+            dst_ctx->initial_pool_size = src_ctx->initial_pool_size;
             AVD3D11VAFramesContext *dst_hwctx = dst_ctx->hwctx;
-            mfxHDLPair *pair = (mfxHDLPair*)src_hwctx->surfaces[i].Data.MemId;
-            dst_hwctx->texture = (ID3D11Texture2D*)pair->first;
+            dst_hwctx->texture_infos = av_calloc(src_hwctx->nb_surfaces,
+                                                 sizeof(*dst_hwctx->texture_infos));
             if (src_hwctx->frame_type & MFX_MEMTYPE_SHARED_RESOURCE)
                 dst_hwctx->MiscFlags = D3D11_RESOURCE_MISC_SHARED;
             dst_hwctx->BindFlags = qsv_get_d3d11va_bind_flags(src_hwctx->frame_type);
+            for (i = 0; i < src_hwctx->nb_surfaces; i++) {
+                mfxHDLPair* pair = (mfxHDLPair*)src_hwctx->surfaces[i].Data.MemId;
+                dst_hwctx->texture_infos[i].texture = (ID3D11Texture2D*)pair->first;
+                if (dst_hwctx->BindFlags & D3D11_BIND_RENDER_TARGET) {
+                    dst_hwctx->texture_infos[i].index = 0;
+                }
+                else {
+                    dst_hwctx->texture_infos[i].index = (intptr_t)pair->second;
+                }
+            }
         }
         break;
 #endif