FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
hwcontext_d3d11va.h
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #ifndef AVUTIL_HWCONTEXT_D3D11VA_H
20 #define AVUTIL_HWCONTEXT_D3D11VA_H
21 
22 /**
23  * @file
24  * An API-specific header for AV_HWDEVICE_TYPE_D3D11VA.
25  *
26  * The default pool implementation will be fixed-size if initial_pool_size is
27  * set (and allocate elements from an array texture). Otherwise it will allocate
28  * individual textures. Be aware that decoding requires a single array texture.
29  *
30  * Using sw_format==AV_PIX_FMT_YUV420P has special semantics, and maps to
31  * DXGI_FORMAT_420_OPAQUE. av_hwframe_transfer_data() is not supported for
32  * this format. Refer to MSDN for details.
33  *
34  * av_hwdevice_ctx_create() for this device type supports a key named "debug"
35  * for the AVDictionary entry. If this is set to any value, the device creation
36  * code will try to load various supported D3D debugging layers.
37  */
38 
39 #include <d3d11.h>
40 
41 /**
42  * This struct is allocated as AVHWDeviceContext.hwctx
43  */
44 typedef struct AVD3D11VADeviceContext {
45  /**
46  * Device used for texture creation and access. This can also be used to
47  * set the libavcodec decoding device.
48  *
49  * Must be set by the user. This is the only mandatory field - the other
50  * device context fields are set from this and are available for convenience.
51  *
52  * Deallocating the AVHWDeviceContext will always release this interface,
53  * and it does not matter whether it was user-allocated.
54  */
55  ID3D11Device *device;
56 
57  /**
58  * If unset, this will be set from the device field on init.
59  *
60  * Deallocating the AVHWDeviceContext will always release this interface,
61  * and it does not matter whether it was user-allocated.
62  */
63  ID3D11DeviceContext *device_context;
64 
65  /**
66  * If unset, this will be set from the device field on init.
67  *
68  * Deallocating the AVHWDeviceContext will always release this interface,
69  * and it does not matter whether it was user-allocated.
70  */
71  ID3D11VideoDevice *video_device;
72 
73  /**
74  * If unset, this will be set from the device_context field on init.
75  *
76  * Deallocating the AVHWDeviceContext will always release this interface,
77  * and it does not matter whether it was user-allocated.
78  */
79  ID3D11VideoContext *video_context;
80 
81  /**
82  * Callbacks for locking. They protect accesses to device_context and
83  * video_context calls. They also protect access to the internal staging
84  * texture (for av_hwframe_transfer_data() calls). They do NOT protect
85  * access to hwcontext or decoder state in general.
86  *
87  * If unset on init, the hwcontext implementation will set them to use an
88  * internal mutex.
89  *
90  * The underlying lock must be recursive. lock_ctx is for free use by the
91  * locking implementation.
92  */
93  void (*lock)(void *lock_ctx);
94  void (*unlock)(void *lock_ctx);
95  void *lock_ctx;
97 
98 /**
99  * D3D11 frame descriptor for pool allocation.
100  *
101  * In user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs
102  * with the data pointer pointing at an object of this type describing the
103  * planes of the frame.
104  *
105  * This has no use outside of custom allocation, and AVFrame AVBufferRef do not
106  * necessarily point to an instance of this struct.
107  */
108 typedef struct AVD3D11FrameDescriptor {
109  /**
110  * The texture in which the frame is located. The reference count is
111  * managed by the AVBufferRef, and destroying the reference will release
112  * the interface.
113  *
114  * Normally stored in AVFrame.data[0].
115  */
116  ID3D11Texture2D *texture;
117 
118  /**
119  * The index into the array texture element representing the frame, or 0
120  * if the texture is not an array texture.
121  *
122  * Normally stored in AVFrame.data[1] (cast from intptr_t).
123  */
124  intptr_t index;
126 
127 /**
128  * This struct is allocated as AVHWFramesContext.hwctx
129  */
130 typedef struct AVD3D11VAFramesContext {
131  /**
132  * The canonical texture used for pool allocation. If this is set to NULL
133  * on init, the hwframes implementation will allocate and set an array
134  * texture if initial_pool_size > 0.
135  *
136  * The only situation when the API user should set this is:
137  * - the user wants to do manual pool allocation (setting
138  * AVHWFramesContext.pool), instead of letting AVHWFramesContext
139  * allocate the pool
140  * - of an array texture
141  * - and wants it to use it for decoding
142  * - this has to be done before calling av_hwframe_ctx_init()
143  *
144  * Deallocating the AVHWFramesContext will always release this interface,
145  * and it does not matter whether it was user-allocated.
146  *
147  * This is in particular used by the libavcodec D3D11VA hwaccel, which
148  * requires a single array texture. It will create ID3D11VideoDecoderOutputView
149  * objects for each array texture element on decoder initialization.
150  */
151  ID3D11Texture2D *texture;
152 
153  /**
154  * D3D11_TEXTURE2D_DESC.BindFlags used for texture creation. The user must
155  * at least set D3D11_BIND_DECODER if the frames context is to be used for
156  * video decoding.
157  * This field is ignored/invalid if a user-allocated texture is provided.
158  */
160 
161  /**
162  * D3D11_TEXTURE2D_DESC.MiscFlags used for texture creation.
163  * This field is ignored/invalid if a user-allocated texture is provided.
164  */
167 
168 #endif /* AVUTIL_HWCONTEXT_D3D11VA_H */
ID3D11Texture2D * texture
The texture in which the frame is located.
UINT MiscFlags
D3D11_TEXTURE2D_DESC.MiscFlags used for texture creation.
UINT BindFlags
D3D11_TEXTURE2D_DESC.BindFlags used for texture creation.
ID3D11Device * device
Device used for texture creation and access.
D3D11 frame descriptor for pool allocation.
ID3D11VideoContext * video_context
If unset, this will be set from the device_context field on init.
ID3D11VideoDevice * video_device
If unset, this will be set from the device field on init.
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
intptr_t index
The index into the array texture element representing the frame, or 0 if the texture is not an array ...
void(* unlock)(void *lock_ctx)
ID3D11Texture2D * texture
The canonical texture used for pool allocation.
This struct is allocated as AVHWFramesContext.hwctx.
This struct is allocated as AVHWDeviceContext.hwctx.
void(* lock)(void *lock_ctx)
Callbacks for locking.
unsigned int UINT
ID3D11DeviceContext * device_context
If unset, this will be set from the device field on init.