> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-boun...@ffmpeg.org> On Behalf Of Tong
> Wu
> Sent: Thursday, May 5, 2022 12:53 PM
> To: ffmpeg-devel@ffmpeg.org
> Cc: Tong Wu <tong1...@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...@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
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to