FFmpeg
dxva2_internal.h
Go to the documentation of this file.
1 /*
2  * DXVA2 HW acceleration
3  *
4  * copyright (c) 2010 Laurent Aimar
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #ifndef AVCODEC_DXVA2_INTERNAL_H
24 #define AVCODEC_DXVA2_INTERNAL_H
25 
26 #define COBJMACROS
27 
28 #include "config.h"
29 
30 /* define the proper COM entries before forcing desktop APIs */
31 #include <objbase.h>
32 
33 #if CONFIG_DXVA2
34 #include "dxva2.h"
36 #endif
37 #if CONFIG_D3D11VA
38 #include "d3d11va.h"
40 #endif
41 #if HAVE_DXVA_H
42 /* When targeting WINAPI_FAMILY_PHONE_APP or WINAPI_FAMILY_APP, dxva.h
43  * defines nothing. Force the struct definitions to be visible. */
44 #undef WINAPI_FAMILY
45 #define WINAPI_FAMILY WINAPI_FAMILY_DESKTOP_APP
46 #undef _CRT_BUILD_DESKTOP_APP
47 #define _CRT_BUILD_DESKTOP_APP 0
48 #include <dxva.h>
49 #endif
50 
51 #include "libavutil/hwcontext.h"
52 
53 #include "avcodec.h"
54 #include "internal.h"
55 
56 typedef void DECODER_BUFFER_DESC;
57 
58 typedef union {
59 #if CONFIG_D3D11VA
60  struct AVD3D11VAContext d3d11va;
61 #endif
62 #if CONFIG_DXVA2
63  struct dxva_context dxva2;
64 #endif
66 
67 typedef struct FFDXVASharedContext {
69 
70  // FF_DXVA2_WORKAROUND_* flags
71  uint64_t workaround;
72 
73  // E.g. AV_PIX_FMT_D3D11 (same as AVCodecContext.pix_fmt, except during init)
75 
77 
78 #if CONFIG_D3D11VA
79  ID3D11VideoDecoder *d3d11_decoder;
80  D3D11_VIDEO_DECODER_CONFIG d3d11_config;
81  ID3D11VideoDecoderOutputView **d3d11_views;
82  int nb_d3d11_views;
83  ID3D11Texture2D *d3d11_texture;
84 #endif
85 
86 #if CONFIG_DXVA2
87  IDirectXVideoDecoder *dxva2_decoder;
88  IDirectXVideoDecoderService *dxva2_service;
89  DXVA2_ConfigPictureDecode dxva2_config;
90 #endif
91 
92  // Legacy (but used by code outside of setup)
93  // In generic mode, DXVA_CONTEXT() will return a pointer to this.
96 
97 #define DXVA_SHARED_CONTEXT(avctx) ((FFDXVASharedContext *)((avctx)->internal->hwaccel_priv_data))
98 
99 #define DXVA_CONTEXT(avctx) (AVDXVAContext *)((avctx)->hwaccel_context ? (avctx)->hwaccel_context : (&(DXVA_SHARED_CONTEXT(avctx)->ctx)))
100 
101 #define D3D11VA_CONTEXT(ctx) (&ctx->d3d11va)
102 #define DXVA2_CONTEXT(ctx) (&ctx->dxva2)
103 
104 #if CONFIG_D3D11VA && CONFIG_DXVA2
105 #define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ff_dxva2_is_d3d11(avctx) ? ctx->d3d11va.workaround : ctx->dxva2.workaround)
106 #define DXVA_CONTEXT_COUNT(avctx, ctx) (ff_dxva2_is_d3d11(avctx) ? ctx->d3d11va.surface_count : ctx->dxva2.surface_count)
107 #define DXVA_CONTEXT_DECODER(avctx, ctx) (ff_dxva2_is_d3d11(avctx) ? (void *)ctx->d3d11va.decoder : (void *)ctx->dxva2.decoder)
108 #define DXVA_CONTEXT_REPORT_ID(avctx, ctx) (*(ff_dxva2_is_d3d11(avctx) ? &ctx->d3d11va.report_id : &ctx->dxva2.report_id))
109 #define DXVA_CONTEXT_CFG(avctx, ctx) (ff_dxva2_is_d3d11(avctx) ? (void *)ctx->d3d11va.cfg : (void *)ctx->dxva2.cfg)
110 #define DXVA_CONTEXT_CFG_BITSTREAM(avctx, ctx) (ff_dxva2_is_d3d11(avctx) ? ctx->d3d11va.cfg->ConfigBitstreamRaw : ctx->dxva2.cfg->ConfigBitstreamRaw)
111 #define DXVA_CONTEXT_CFG_INTRARESID(avctx, ctx) (ff_dxva2_is_d3d11(avctx) ? ctx->d3d11va.cfg->ConfigIntraResidUnsigned : ctx->dxva2.cfg->ConfigIntraResidUnsigned)
112 #define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) (ff_dxva2_is_d3d11(avctx) ? ctx->d3d11va.cfg->ConfigResidDiffAccelerator : ctx->dxva2.cfg->ConfigResidDiffAccelerator)
113 #define DXVA_CONTEXT_VALID(avctx, ctx) (DXVA_CONTEXT_DECODER(avctx, ctx) && \
114  DXVA_CONTEXT_CFG(avctx, ctx) && \
115  (ff_dxva2_is_d3d11(avctx) || ctx->dxva2.surface_count))
116 #elif CONFIG_DXVA2
117 #define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->dxva2.workaround)
118 #define DXVA_CONTEXT_COUNT(avctx, ctx) (ctx->dxva2.surface_count)
119 #define DXVA_CONTEXT_DECODER(avctx, ctx) (ctx->dxva2.decoder)
120 #define DXVA_CONTEXT_REPORT_ID(avctx, ctx) (*(&ctx->dxva2.report_id))
121 #define DXVA_CONTEXT_CFG(avctx, ctx) (ctx->dxva2.cfg)
122 #define DXVA_CONTEXT_CFG_BITSTREAM(avctx, ctx) (ctx->dxva2.cfg->ConfigBitstreamRaw)
123 #define DXVA_CONTEXT_CFG_INTRARESID(avctx, ctx) (ctx->dxva2.cfg->ConfigIntraResidUnsigned)
124 #define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) (ctx->dxva2.cfg->ConfigResidDiffAccelerator)
125 #define DXVA_CONTEXT_VALID(avctx, ctx) (ctx->dxva2.decoder && ctx->dxva2.cfg && ctx->dxva2.surface_count)
126 #elif CONFIG_D3D11VA
127 #define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->d3d11va.workaround)
128 #define DXVA_CONTEXT_COUNT(avctx, ctx) (ctx->d3d11va.surface_count)
129 #define DXVA_CONTEXT_DECODER(avctx, ctx) (ctx->d3d11va.decoder)
130 #define DXVA_CONTEXT_REPORT_ID(avctx, ctx) (*(&ctx->d3d11va.report_id))
131 #define DXVA_CONTEXT_CFG(avctx, ctx) (ctx->d3d11va.cfg)
132 #define DXVA_CONTEXT_CFG_BITSTREAM(avctx, ctx) (ctx->d3d11va.cfg->ConfigBitstreamRaw)
133 #define DXVA_CONTEXT_CFG_INTRARESID(avctx, ctx) (ctx->d3d11va.cfg->ConfigIntraResidUnsigned)
134 #define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) (ctx->d3d11va.cfg->ConfigResidDiffAccelerator)
135 #define DXVA_CONTEXT_VALID(avctx, ctx) (ctx->d3d11va.decoder && ctx->d3d11va.cfg)
136 #endif
137 
138 unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx,
139  const AVDXVAContext *,
140  const AVFrame *frame);
141 
144  unsigned type, const void *data, unsigned size,
145  unsigned mb_count);
146 
147 
149  const void *pp, unsigned pp_size,
150  const void *qm, unsigned qm_size,
151  int (*commit_bs_si)(AVCodecContext *,
153  DECODER_BUFFER_DESC *slice));
154 
156 
158 
160  AVBufferRef *hw_frames_ctx);
161 
162 int ff_dxva2_is_d3d11(const AVCodecContext *avctx);
163 
164 #endif /* AVCODEC_DXVA2_INTERNAL_H */
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
FFDXVASharedContext::pix_fmt
enum AVPixelFormat pix_fmt
Definition: dxva2_internal.h:74
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:295
internal.h
ff_dxva2_common_end_frame
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 *, DECODER_BUFFER_DESC *bs, DECODER_BUFFER_DESC *slice))
Definition: dxva2.c:880
data
const char data[16]
Definition: mxf.c:91
ff_dxva2_get_surface_index
unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx, const AVDXVAContext *, const AVFrame *frame)
Definition: dxva2.c:764
ff_dxva2_common_frame_params
int ff_dxva2_common_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Definition: dxva2.c:586
FFDXVASharedContext::workaround
uint64_t workaround
Definition: dxva2_internal.h:71
FFDXVASharedContext::device_ctx
AVHWDeviceContext * device_ctx
Definition: dxva2_internal.h:76
AVD3D11VAContext
This structure is used to provides the necessary configurations and data to the Direct3D11 FFmpeg HWA...
Definition: d3d11va.h:59
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:60
FFDXVASharedContext::ctx
AVDXVAContext ctx
Definition: dxva2_internal.h:94
ff_dxva2_decode_init
int ff_dxva2_decode_init(AVCodecContext *avctx)
Definition: dxva2.c:649
FFDXVASharedContext
Definition: dxva2_internal.h:67
dxva_context
This structure is used to provides the necessary configurations and data to the DXVA2 FFmpeg HWAccel ...
Definition: dxva2.h:57
hwcontext_dxva2.h
size
int size
Definition: twinvq_data.h:11134
AVDXVAContext
Definition: dxva2_internal.h:58
DECODER_BUFFER_DESC
void DECODER_BUFFER_DESC
Definition: dxva2_internal.h:56
ff_dxva2_is_d3d11
int ff_dxva2_is_d3d11(const AVCodecContext *avctx)
Definition: dxva2.c:1045
d3d11va.h
ff_dxva2_commit_buffer
int ff_dxva2_commit_buffer(AVCodecContext *, AVDXVAContext *, DECODER_BUFFER_DESC *, unsigned type, const void *data, unsigned size, unsigned mb_count)
Definition: dxva2.c:791
avcodec.h
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
dxva2.h
AVCodecContext
main external API structure.
Definition: avcodec.h:1565
config.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:81
hwcontext.h
FFDXVASharedContext::decoder_ref
AVBufferRef * decoder_ref
Definition: dxva2_internal.h:68
hwcontext_d3d11va.h
ff_dxva2_decode_uninit
int ff_dxva2_decode_uninit(AVCodecContext *avctx)
Definition: dxva2.c:724