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 */
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:60
int ff_dxva2_decode_init(AVCodecContext *avctx)
Definition: dxva2.c:649
This structure is used to provides the necessary configurations and data to the Direct3D11 FFmpeg HWA...
Definition: d3d11va.h:59
static enum AVPixelFormat pix_fmt
int ff_dxva2_common_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Definition: dxva2.c:586
This structure describes decoded (raw) audio or video data.
Definition: frame.h:295
int ff_dxva2_commit_buffer(AVCodecContext *, AVDXVAContext *, DECODER_BUFFER_DESC *, unsigned type, const void *data, unsigned size, unsigned mb_count)
Definition: dxva2.c:791
ptrdiff_t const GLvoid * data
Definition: opengl_enc.c:100
An API-specific header for AV_HWDEVICE_TYPE_D3D11VA.
An API-specific header for AV_HWDEVICE_TYPE_DXVA2.
GLint GLenum type
Definition: opengl_enc.c:104
Public libavcodec D3D11VA header.
unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx, const AVDXVAContext *, const AVFrame *frame)
Definition: dxva2.c:764
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
DXVA_Qmatrix_HEVC qm
Definition: dxva2_hevc.c:33
ptrdiff_t size
Definition: opengl_enc.c:100
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
AVHWDeviceContext * device_ctx
Public libavcodec DXVA2 header.
Libavcodec external API header.
main external API structure.
Definition: avcodec.h:1567
void DECODER_BUFFER_DESC
AVBufferRef * decoder_ref
A reference to a data buffer.
Definition: buffer.h:81
common internal api header.
AVDXVAContext ctx
int ff_dxva2_decode_uninit(AVCodecContext *avctx)
Definition: dxva2.c:724
DXVA_PicParams_HEVC pp
Definition: dxva2_hevc.c:32
int ff_dxva2_is_d3d11(const AVCodecContext *avctx)
Definition: dxva2.c:1045
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
This structure is used to provides the necessary configurations and data to the DXVA2 FFmpeg HWAccel ...
Definition: dxva2.h:57