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 |
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 |
> -----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
> -----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 --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
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(-)