X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fdxva2_internal.h;h=3b651a42bc1dc021abcef539c5e526d9315beb24;hb=5c018ee18895f88e9e1d2174059dcdd48bf872d2;hp=e2305b1a2471518f4e10cb1fc5ac935e3138cc0c;hpb=fa84506177f0246b30d4ea6a99ee5d419f3e4550;p=ffmpeg diff --git a/libavcodec/dxva2_internal.h b/libavcodec/dxva2_internal.h index e2305b1a247..3b651a42bc1 100644 --- a/libavcodec/dxva2_internal.h +++ b/libavcodec/dxva2_internal.h @@ -23,12 +23,16 @@ #ifndef AVCODEC_DXVA_INTERNAL_H #define AVCODEC_DXVA_INTERNAL_H -#define _WIN32_WINNT 0x0600 #define COBJMACROS #include "config.h" +#if CONFIG_DXVA2 #include "dxva2.h" +#endif +#if CONFIG_D3D11VA +#include "d3d11va.h" +#endif #if HAVE_DXVA_H #include #endif @@ -36,22 +40,73 @@ #include "avcodec.h" #include "mpegvideo.h" -void *ff_dxva2_get_surface(const Picture *picture); +typedef void DECODER_BUFFER_DESC; + +typedef union { +#if CONFIG_D3D11VA + struct AVD3D11VAContext d3d11va; +#endif +#if CONFIG_DXVA2 + struct dxva_context dxva2; +#endif +} AVDXVAContext; + +#if CONFIG_D3D11VA +#define D3D11VA_CONTEXT(ctx) (&ctx->d3d11va) +#endif +#if CONFIG_DXVA2 +#define DXVA2_CONTEXT(ctx) (&ctx->dxva2) +#endif + +#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_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_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_BITSTREAM(avctx, ctx) (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.cfg->ConfigBitstreamRaw : ctx->dxva2.cfg->ConfigBitstreamRaw) +#define DXVA_CONTEXT_CFG_INTRARESID(avctx, ctx) (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.cfg->ConfigIntraResidUnsigned : ctx->dxva2.cfg->ConfigIntraResidUnsigned) +#define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.cfg->ConfigResidDiffAccelerator : ctx->dxva2.cfg->ConfigResidDiffAccelerator) +#elif CONFIG_DXVA2 +#define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->dxva2.workaround) +#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_REPORT_ID(avctx, ctx) (*(&ctx->dxva2.report_id)) +#define DXVA_CONTEXT_CFG(avctx, ctx) (ctx->dxva2.cfg) +#define DXVA_CONTEXT_CFG_BITSTREAM(avctx, ctx) (ctx->dxva2.cfg->ConfigBitstreamRaw) +#define DXVA_CONTEXT_CFG_INTRARESID(avctx, ctx) (ctx->dxva2.cfg->ConfigIntraResidUnsigned) +#define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) (ctx->dxva2.cfg->ConfigResidDiffAccelerator) +#elif CONFIG_D3D11VA +#define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->d3d11va.workaround) +#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_REPORT_ID(avctx, ctx) (*(&ctx->d3d11va.report_id)) +#define DXVA_CONTEXT_CFG(avctx, ctx) (ctx->d3d11va.cfg) +#define DXVA_CONTEXT_CFG_BITSTREAM(avctx, ctx) (ctx->d3d11va.cfg->ConfigBitstreamRaw) +#define DXVA_CONTEXT_CFG_INTRARESID(avctx, ctx) (ctx->d3d11va.cfg->ConfigIntraResidUnsigned) +#define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) (ctx->d3d11va.cfg->ConfigResidDiffAccelerator) +#endif + +void *ff_dxva2_get_surface(const AVFrame *frame); -unsigned ff_dxva2_get_surface_index(const struct dxva_context *, - const Picture *picture); +unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx, + const AVDXVAContext *, + const AVFrame *frame); -int ff_dxva2_commit_buffer(AVCodecContext *, struct dxva_context *, - DXVA2_DecodeBufferDesc *, +int ff_dxva2_commit_buffer(AVCodecContext *, AVDXVAContext *, + DECODER_BUFFER_DESC *, unsigned type, const void *data, unsigned size, unsigned mb_count); -int ff_dxva2_common_end_frame(AVCodecContext *, MpegEncContext *, +int ff_dxva2_common_end_frame(AVCodecContext *, AVFrame *, const void *pp, unsigned pp_size, const void *qm, unsigned qm_size, int (*commit_bs_si)(AVCodecContext *, - DXVA2_DecodeBufferDesc *bs, - DXVA2_DecodeBufferDesc *slice)); + DECODER_BUFFER_DESC *bs, + DECODER_BUFFER_DESC *slice)); #endif /* AVCODEC_DXVA_INTERNAL_H */