You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-07-11 14:30:22 +02:00
avcodec/d3d11va: use the proper slice index
The slice index expected by D3D11VA is the one from the texture not from the array or texture/slices. In VLC the slices we provide the decoder don't start from 0 and thus pictures appear in bogus order. With possible crashes and corruptions when using an invalid index. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
committed by
Michael Niedermayer
parent
1bda0ee530
commit
9b462a0b9d
@ -42,8 +42,18 @@ unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx,
|
|||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
for (i = 0; i < DXVA_CONTEXT_COUNT(avctx, ctx); i++)
|
for (i = 0; i < DXVA_CONTEXT_COUNT(avctx, ctx); i++)
|
||||||
if (DXVA_CONTEXT_SURFACE(avctx, ctx, i) == surface)
|
#if CONFIG_D3D11VA
|
||||||
|
if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD && ctx->d3d11va.surface[i] == surface)
|
||||||
|
{
|
||||||
|
D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC viewDesc;
|
||||||
|
ID3D11VideoDecoderOutputView_GetDesc(ctx->d3d11va.surface[i], &viewDesc);
|
||||||
|
return viewDesc.Texture2D.ArraySlice;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if CONFIG_DXVA2
|
||||||
|
if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD && ctx->dxva2.surface[i] == surface)
|
||||||
return i;
|
return i;
|
||||||
|
#endif
|
||||||
|
|
||||||
assert(0);
|
assert(0);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -70,7 +70,6 @@ typedef union {
|
|||||||
#if CONFIG_D3D11VA && CONFIG_DXVA2
|
#if CONFIG_D3D11VA && CONFIG_DXVA2
|
||||||
#define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.workaround : ctx->dxva2.workaround)
|
#define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.workaround : ctx->dxva2.workaround)
|
||||||
#define DXVA_CONTEXT_COUNT(avctx, ctx) (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.surface_count : ctx->dxva2.surface_count)
|
#define DXVA_CONTEXT_COUNT(avctx, ctx) (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.surface_count : ctx->dxva2.surface_count)
|
||||||
#define DXVA_CONTEXT_SURFACE(avctx, ctx, i) (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.surface[i] : ctx->dxva2.surface[i])
|
|
||||||
#define DXVA_CONTEXT_DECODER(avctx, ctx) (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.decoder : ctx->dxva2.decoder)
|
#define DXVA_CONTEXT_DECODER(avctx, ctx) (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.decoder : ctx->dxva2.decoder)
|
||||||
#define DXVA_CONTEXT_REPORT_ID(avctx, ctx) (*(avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? &ctx->d3d11va.report_id : &ctx->dxva2.report_id))
|
#define DXVA_CONTEXT_REPORT_ID(avctx, ctx) (*(avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? &ctx->d3d11va.report_id : &ctx->dxva2.report_id))
|
||||||
#define DXVA_CONTEXT_CFG(avctx, ctx) (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.cfg : ctx->dxva2.cfg)
|
#define DXVA_CONTEXT_CFG(avctx, ctx) (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.cfg : ctx->dxva2.cfg)
|
||||||
@ -80,7 +79,6 @@ typedef union {
|
|||||||
#elif CONFIG_DXVA2
|
#elif CONFIG_DXVA2
|
||||||
#define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->dxva2.workaround)
|
#define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->dxva2.workaround)
|
||||||
#define DXVA_CONTEXT_COUNT(avctx, ctx) (ctx->dxva2.surface_count)
|
#define DXVA_CONTEXT_COUNT(avctx, ctx) (ctx->dxva2.surface_count)
|
||||||
#define DXVA_CONTEXT_SURFACE(avctx, ctx, i) (ctx->dxva2.surface[i])
|
|
||||||
#define DXVA_CONTEXT_DECODER(avctx, ctx) (ctx->dxva2.decoder)
|
#define DXVA_CONTEXT_DECODER(avctx, ctx) (ctx->dxva2.decoder)
|
||||||
#define DXVA_CONTEXT_REPORT_ID(avctx, ctx) (*(&ctx->dxva2.report_id))
|
#define DXVA_CONTEXT_REPORT_ID(avctx, ctx) (*(&ctx->dxva2.report_id))
|
||||||
#define DXVA_CONTEXT_CFG(avctx, ctx) (ctx->dxva2.cfg)
|
#define DXVA_CONTEXT_CFG(avctx, ctx) (ctx->dxva2.cfg)
|
||||||
@ -90,7 +88,6 @@ typedef union {
|
|||||||
#elif CONFIG_D3D11VA
|
#elif CONFIG_D3D11VA
|
||||||
#define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->d3d11va.workaround)
|
#define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->d3d11va.workaround)
|
||||||
#define DXVA_CONTEXT_COUNT(avctx, ctx) (ctx->d3d11va.surface_count)
|
#define DXVA_CONTEXT_COUNT(avctx, ctx) (ctx->d3d11va.surface_count)
|
||||||
#define DXVA_CONTEXT_SURFACE(avctx, ctx, i) (ctx->d3d11va.surface[i])
|
|
||||||
#define DXVA_CONTEXT_DECODER(avctx, ctx) (ctx->d3d11va.decoder)
|
#define DXVA_CONTEXT_DECODER(avctx, ctx) (ctx->d3d11va.decoder)
|
||||||
#define DXVA_CONTEXT_REPORT_ID(avctx, ctx) (*(&ctx->d3d11va.report_id))
|
#define DXVA_CONTEXT_REPORT_ID(avctx, ctx) (*(&ctx->d3d11va.report_id))
|
||||||
#define DXVA_CONTEXT_CFG(avctx, ctx) (ctx->d3d11va.cfg)
|
#define DXVA_CONTEXT_CFG(avctx, ctx) (ctx->d3d11va.cfg)
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
#define LIBAVCODEC_VERSION_MAJOR 57
|
#define LIBAVCODEC_VERSION_MAJOR 57
|
||||||
#define LIBAVCODEC_VERSION_MINOR 61
|
#define LIBAVCODEC_VERSION_MINOR 61
|
||||||
#define LIBAVCODEC_VERSION_MICRO 100
|
#define LIBAVCODEC_VERSION_MICRO 102
|
||||||
|
|
||||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
||||||
LIBAVCODEC_VERSION_MINOR, \
|
LIBAVCODEC_VERSION_MINOR, \
|
||||||
|
Reference in New Issue
Block a user