30 #include <dxgidebug.h>
58 d3dlib = LoadLibrary(
"d3d11.dll");
59 dxgilib = LoadLibrary(
"dxgi.dll");
60 if (!d3dlib || !dxgilib)
63 mD3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE) GetProcAddress(d3dlib,
"D3D11CreateDevice");
94 WaitForSingleObjectEx(ctx, INFINITE,
FALSE);
108 ID3D11Texture2D_Release(frames_hwctx->
texture);
117 const void *hwconfig,
121 int nb_sw_formats = 0;
131 UINT format_support = 0;
133 if (
SUCCEEDED(hr) && (format_support & D3D11_FORMAT_SUPPORT_TEXTURE2D))
150 ID3D11Texture2D_Release((ID3D11Texture2D *)opaque);
159 ID3D11Texture2D_Release(tex);
168 ID3D11Texture2D_Release(tex);
182 ID3D11Texture2D *tex;
183 D3D11_TEXTURE2D_DESC texDesc = {
188 .SampleDesc = { .Count = 1 },
190 .Usage = D3D11_USAGE_DEFAULT,
195 hr = ID3D11Device_CreateTexture2D(device_hwctx->
device, &texDesc,
NULL, &tex);
209 D3D11_TEXTURE2D_DESC texDesc;
214 ID3D11Texture2D_GetDesc(hwctx->
texture, &texDesc);
221 ID3D11Texture2D_AddRef(hwctx->
texture);
233 D3D11_TEXTURE2D_DESC texDesc;
247 texDesc = (D3D11_TEXTURE2D_DESC){
252 .SampleDesc = { .Count = 1 },
254 .Usage = D3D11_USAGE_DEFAULT,
260 D3D11_TEXTURE2D_DESC texDesc2;
261 ID3D11Texture2D_GetDesc(hwctx->
texture, &texDesc2);
263 if (texDesc.Width != texDesc2.Width ||
264 texDesc.Height != texDesc2.Height ||
265 texDesc.Format != texDesc2.Format) {
269 }
else if (texDesc.ArraySize > 0) {
270 hr = ID3D11Device_CreateTexture2D(device_hwctx->
device, &texDesc,
NULL, &hwctx->
texture);
319 if (s->
format == DXGI_FORMAT_420_OPAQUE)
332 D3D11_TEXTURE2D_DESC texDesc = {
337 .SampleDesc = { .Count = 1 },
339 .Usage = D3D11_USAGE_STAGING,
340 .CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE,
354 D3D11_TEXTURE2D_DESC *
desc,
355 D3D11_MAPPED_SUBRESOURCE *
map)
359 for (i = 0; i < 4; i++)
360 linesize[i] = map->RowPitch;
363 (
uint8_t*)map->pData, linesize);
375 ID3D11Resource *texture = (ID3D11Resource *)(ID3D11Texture2D *)frame->
data[0];
377 ID3D11Resource *staging;
382 D3D11_TEXTURE2D_DESC
desc;
383 D3D11_MAPPED_SUBRESOURCE
map;
402 ID3D11DeviceContext_CopySubresourceRegion(device_hwctx->
device_context,
404 texture, index,
NULL);
407 staging, 0, D3D11_MAP_READ, 0, &map);
416 ID3D11DeviceContext_Unmap(device_hwctx->
device_context, staging, 0);
419 staging, 0, D3D11_MAP_WRITE, 0, &map);
428 ID3D11DeviceContext_Unmap(device_hwctx->
device_context, staging, 0);
430 ID3D11DeviceContext_CopySubresourceRegion(device_hwctx->
device_context,
431 texture, index, 0, 0, 0,
449 if (!device_hwctx->
lock) {
466 hr = ID3D11DeviceContext_QueryInterface(device_hwctx->
device, &IID_ID3D11VideoDevice,
473 hr = ID3D11DeviceContext_QueryInterface(device_hwctx->
device_context, &IID_ID3D11VideoContext,
486 if (device_hwctx->
device) {
487 ID3D11Device_Release(device_hwctx->
device);
507 CloseHandle(device_hwctx->
lock_ctx);
519 IDXGIAdapter *pAdapter =
NULL;
520 ID3D10Multithread *pMultithread;
521 UINT creationFlags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT;
527 if (!LoadLibrary(
"d3d11_1sdklayers.dll"))
532 creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
542 IDXGIFactory2 *pDXGIFactory;
545 int adapter = atoi(device);
546 if (
FAILED(IDXGIFactory2_EnumAdapters(pDXGIFactory, adapter, &pAdapter)))
548 IDXGIFactory2_Release(pDXGIFactory);
553 DXGI_ADAPTER_DESC
desc;
554 hr = IDXGIAdapter2_GetDesc(pAdapter, &desc);
557 desc.VendorId, desc.DeviceId, desc.Description);
561 hr =
mD3D11CreateDevice(pAdapter, pAdapter ? D3D_DRIVER_TYPE_UNKNOWN : D3D_DRIVER_TYPE_HARDWARE,
NULL, creationFlags,
NULL, 0,
564 IDXGIAdapter_Release(pAdapter);
570 hr = ID3D11Device_QueryInterface(device_hwctx->
device, &IID_ID3D10Multithread, (
void **)&pMultithread);
572 ID3D10Multithread_SetMultithreadProtected(pMultithread,
TRUE);
573 ID3D10Multithread_Release(pMultithread);
576 #if !HAVE_UWP && HAVE_DXGIDEBUG_H
578 HANDLE dxgidebug_dll = LoadLibrary(
"dxgidebug.dll");
580 HRESULT (WINAPI * pf_DXGIGetDebugInterface)(
const GUID *riid,
void **ppDebug)
581 = (
void *)GetProcAddress(dxgidebug_dll,
"DXGIGetDebugInterface");
582 if (pf_DXGIGetDebugInterface) {
583 IDXGIDebug *dxgi_debug =
NULL;
584 hr = pf_DXGIGetDebugInterface(&IID_IDXGIDebug, (
void**)&dxgi_debug);
586 IDXGIDebug_ReportLiveObjects(dxgi_debug, DXGI_DEBUG_ALL, DXGI_DEBUG_RLO_ALL);
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
static AVOnce functions_loaded
static int d3d11va_create_staging_texture(AVHWFramesContext *ctx)
static const struct @282 supported_formats[]
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
An API-specific header for AV_HWDEVICE_TYPE_D3D11VA.
static int device_init(AVFormatContext *ctx, int *width, int *height, uint32_t pixelformat)
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
static void d3d11va_device_uninit(AVHWDeviceContext *hwdev)
static int d3d11va_transfer_get_formats(AVHWFramesContext *ctx, enum AVHWFrameTransferDirection dir, enum AVPixelFormat **formats)
static AVBufferRef * d3d11va_alloc_single(AVHWFramesContext *ctx)
int width
The allocated dimensions of the frames in this pool.
static void d3d11va_frames_uninit(AVHWFramesContext *ctx)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
enum AVPixelFormat pix_fmt
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.
AVBufferRef * hw_frames_ctx
For hwaccel-format frames, this should be a reference to the AVHWFramesContext describing the frame...
AVBufferPool * pool_internal
static int d3d11va_device_init(AVHWDeviceContext *hwdev)
static int d3d11va_frames_get_constraints(AVHWDeviceContext *ctx, const void *hwconfig, AVHWFramesConstraints *constraints)
static int d3d11va_get_buffer(AVHWFramesContext *ctx, AVFrame *frame)
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
ID3D11Device * device
Device used for texture creation and access.
D3D11 frame descriptor for pool allocation.
HRESULT(WINAPI * PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFactory)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static void d3d11va_default_unlock(void *ctx)
static PFN_D3D11_CREATE_DEVICE mD3D11CreateDevice
static int d3d11va_transfer_data(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src)
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
simple assert() macros that are a bit more flexible than ISO C assert().
AVBufferRef * av_buffer_create(uint8_t *data, int size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
static av_cold void load_functions(void)
void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], const uint8_t *src_data[4], const int src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height)
Copy image in src_data to dst_data.
static int d3d11va_frames_init(AVHWFramesContext *ctx)
ID3D11VideoContext * video_context
If unset, this will be set from the device_context field on init.
static void d3d11va_default_lock(void *ctx)
int initial_pool_size
Initial size of the frame pool.
static void free_texture(void *opaque, uint8_t *data)
ID3D11VideoDevice * video_device
If unset, this will be set from the device field on init.
AVHWDeviceContext * device_ctx
The parent AVHWDeviceContext.
intptr_t index
The index into the array texture element representing the frame, or 0 if the texture is not an array ...
static AVBufferRef * d3d11va_pool_alloc(void *opaque, int size)
AVBufferPool * av_buffer_pool_init2(int size, void *opaque, AVBufferRef *(*alloc)(void *opaque, int size), void(*pool_free)(void *opaque))
Allocate and initialize a buffer pool with a more complex allocator.
#define FF_ARRAY_ELEMS(a)
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
void(* unlock)(void *lock_ctx)
#define AV_LOG_INFO
Standard information.
int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height, uint8_t *ptr, const int linesizes[4])
Fill plane data pointers for an image with pixel format pix_fmt and height height.
This struct describes the constraints on hardware frames attached to a given device with a hardware-s...
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
uint8_t * data
The data buffer.
void * hwctx
The format-specific data, allocated and freed automatically along with this context.
ID3D11Texture2D * texture
The canonical texture used for pool allocation.
static int d3d11va_device_create(AVHWDeviceContext *ctx, const char *device, AVDictionary *opts, int flags)
This struct describes a set or pool of "hardware" frames (i.e.
enum AVPixelFormat * valid_hw_formats
A list of possible values for format in the hw_frames_ctx, terminated by AV_PIX_FMT_NONE.
const VDPAUPixFmtMap * map
AVHWFramesInternal * internal
Private data used internally by libavutil.
static enum AVPixelFormat pix_fmts[]
This struct is allocated as AVHWFramesContext.hwctx.
#define flags(name, subs,...)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Hardware surfaces for Direct3D11.
ID3D11Texture2D * staging_texture
A reference to a data buffer.
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
common internal and external API header
static AVBufferRef * wrap_texture_buf(ID3D11Texture2D *tex, int index)
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
AVHWFrameTransferDirection
AVBufferPool * pool
A pool from which the frames are allocated by av_hwframe_get_buffer().
static int ff_thread_once(char *control, void(*routine)(void))
enum AVPixelFormat * valid_sw_formats
A list of possible values for sw_format in the hw_frames_ctx, terminated by AV_PIX_FMT_NONE.
This struct is allocated as AVHWDeviceContext.hwctx.
void(* lock)(void *lock_ctx)
Callbacks for locking.
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
#define av_malloc_array(a, b)
#define INVALID_HANDLE_VALUE
static void fill_texture_ptrs(uint8_t *data[4], int linesize[4], AVHWFramesContext *ctx, D3D11_TEXTURE2D_DESC *desc, D3D11_MAPPED_SUBRESOURCE *map)
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
const HWContextType ff_hwcontext_type_d3d11va
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
AVPixelFormat
Pixel format.
static PFN_CREATE_DXGI_FACTORY mCreateDXGIFactory
ID3D11DeviceContext * device_context
If unset, this will be set from the device field on init.