21#define DXVA2API_USE_BITFIELDS
43#define FF_D3DCREATE_FLAGS (D3DCREATE_SOFTWARE_VERTEXPROCESSING | \
44 D3DCREATE_MULTITHREADED | \
45 D3DCREATE_FPU_PRESERVE)
49 .BackBufferWidth = 640,
50 .BackBufferHeight = 480,
52 .SwapEffect = D3DSWAPEFFECT_DISCARD,
53 .Flags = D3DPRESENTFLAG_VIDEO,
70 IDirectXVideoAccelerationService *
service;
106DEFINE_GUID(video_decoder_service, 0xfc51a551, 0xd5e7, 0x11d9, 0xaf, 0x55, 0x00, 0x05, 0x4e, 0x43, 0xff, 0x02);
107DEFINE_GUID(video_processor_service, 0xfc51a552, 0xd5e7, 0x11d9, 0xaf, 0x55, 0x00, 0x05, 0x4e, 0x43, 0xff, 0x02);
119 if (
s->surfaces_internal) {
121 if (
s->surfaces_internal[
i])
122 IDirect3DSurface9_Release(
s->surfaces_internal[
i]);
128 IDirectXVideoAccelerationService_Release(
s->service);
132 if (
s->device_handle != INVALID_HANDLE_VALUE) {
133 IDirect3DDeviceManager9_CloseDeviceHandle(device_hwctx->
devmgr,
s->device_handle);
134 s->device_handle = INVALID_HANDLE_VALUE;
152 s->nb_surfaces_used++;
170 if (
ctx->initial_pool_size <= 0)
173 hr = IDirect3DDeviceManager9_OpenDeviceHandle(device_hwctx->
devmgr, &
s->device_handle);
179 hr = IDirect3DDeviceManager9_GetVideoService(device_hwctx->
devmgr,
181 decode ? &video_decoder_service : &video_processor_service,
182 (
void **)&
s->service);
201 sizeof(*
s->surfaces_internal));
202 if (!
s->surfaces_internal)
205 hr = IDirectXVideoAccelerationService_CreateSurface(
s->service,
207 ctx->initial_pool_size - 1,
208 s->format, D3DPOOL_DEFAULT, 0,
210 s->surfaces_internal,
NULL);
222 frames_hwctx->
surfaces =
s->surfaces_internal;
234 if (hwctx->
surface_type != DXVA2_VideoDecoderRenderTarget &&
235 hwctx->
surface_type != DXVA2_VideoProcessorRenderTarget) {
241 s->device_handle = INVALID_HANDLE_VALUE;
279 fmts[0] =
ctx->sw_format;
289 IDirect3DSurface9 *surface = (IDirect3DSurface9*)hwmap->
source->
data[3];
290 IDirect3DSurface9_UnlockRect(surface);
297 IDirect3DSurface9 *surface = (IDirect3DSurface9*)
src->data[3];
299 D3DSURFACE_DESC surfaceDesc;
300 D3DLOCKED_RECT LockedRect;
302 int i, err, nb_planes;
307 hr = IDirect3DSurface9_GetDesc(surface, &surfaceDesc);
314 lock_flags |= D3DLOCK_READONLY;
316 lock_flags |= D3DLOCK_DISCARD;
318 hr = IDirect3DSurface9_LockRect(surface, &LockedRect,
NULL, lock_flags);
337 for (
i = 0;
i < nb_planes;
i++)
338 dst->linesize[
i] = LockedRect.Pitch;
341 (uint8_t*)LockedRect.pBits,
dst->linesize);
344 dst->data[1] = (uint8_t*)
map->palette_dummy;
348 IDirect3DSurface9_UnlockRect(surface);
358 if (
src->format !=
ctx->sw_format)
364 map->format =
dst->format;
371 ctx->sw_format,
src->width,
src->height);
382 ptrdiff_t src_linesize[4], dst_linesize[4];
385 if (
dst->format !=
ctx->sw_format)
391 map->format =
dst->format;
397 for (
i = 0;
i < 4;
i++) {
398 dst_linesize[
i] =
dst->linesize[
i];
399 src_linesize[
i] =
map->linesize[
i];
402 ctx->sw_format,
src->width,
src->height);
415 dst->format =
ctx->sw_format;
437 IDirect3DDeviceManager9_Release(hwctx->
devmgr);
443 IDirect3D9_Release(priv->
d3d9);
458 D3DDISPLAYMODE d3ddm;
466 priv->
d3d9 = createD3D(D3D_SDK_VERSION);
472 IDirect3D9_GetAdapterDisplayMode(priv->
d3d9, adapter, &d3ddm);
474 d3dpp.BackBufferFormat = d3ddm.Format;
476 hr = IDirect3D9_CreateDevice(priv->
d3d9, adapter, D3DDEVTYPE_HAL, GetDesktopWindow(),
491 D3DDISPLAYMODEEX modeex = {0};
492 IDirect3D9Ex *d3d9ex =
NULL;
493 IDirect3DDevice9Ex *exdev =
NULL;
499 hr = createD3DEx(D3D_SDK_VERSION, &d3d9ex);
503 modeex.Size =
sizeof(D3DDISPLAYMODEEX);
504 hr = IDirect3D9Ex_GetAdapterDisplayModeEx(d3d9ex, adapter, &modeex,
NULL);
506 IDirect3D9Ex_Release(d3d9ex);
510 d3dpp.BackBufferFormat = modeex.Format;
512 hr = IDirect3D9Ex_CreateDeviceEx(d3d9ex, adapter, D3DDEVTYPE_HAL, GetDesktopWindow(),
514 &d3dpp,
NULL, &exdev);
516 IDirect3D9Ex_Release(d3d9ex);
521 priv->
d3d9 = (IDirect3D9 *)d3d9ex;
532 unsigned resetToken = 0;
533 UINT adapter = D3DADAPTER_DEFAULT;
538 adapter = atoi(device);
544 ctx->user_opaque = priv;
549 priv->
d3dlib = dlopen(
"d3d9.dll", 0);
554 priv->
dxva2lib = dlopen(
"dxva2.dll", 0);
561 "DXVA2CreateDirect3DDeviceManager9");
562 if (!createDeviceManager) {
574 hr = createDeviceManager(&resetToken, &hwctx->
devmgr);
580 hr = IDirect3DDeviceManager9_ResetDevice(hwctx->
devmgr, priv->
d3d9device, resetToken);
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
simple assert() macros that are a bit more flexible than ISO C assert().
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
common internal and external API header
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
static enum AVPixelFormat pix_fmt
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
AVBufferPool * av_buffer_pool_init2(size_t size, void *opaque, AVBufferRef *(*alloc)(void *opaque, size_t size), void(*pool_free)(void *opaque))
Allocate and initialize a buffer pool with a more complex allocator.
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
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.
void av_image_copy_uc_from(uint8_t *const dst_data[4], const ptrdiff_t dst_linesizes[4], const uint8_t *const src_data[4], const ptrdiff_t src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height)
Copy image data located in uncacheable (e.g.
static void av_image_copy2(uint8_t *const dst_data[4], const int dst_linesizes[4], uint8_t *const src_data[4], const int src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height)
Wrapper around av_image_copy() to workaround the limitation that the conversion from uint8_t * const ...
int ff_hwframe_map_create(AVBufferRef *hwframe_ref, AVFrame *dst, const AVFrame *src, void(*unmap)(AVHWFramesContext *ctx, HWMapDescriptor *hwmap), void *priv)
@ AV_HWFRAME_MAP_READ
The mapping must be readable.
@ AV_HWFRAME_MAP_WRITE
The mapping must be writeable.
@ AV_HWFRAME_MAP_OVERWRITE
The mapped frame will be overwritten completely in subsequent operations, so the current frame data n...
AVHWFrameTransferDirection
static AVBufferRef * dxva2_pool_alloc(void *opaque, size_t size)
static int dxva2_device_create9ex(AVHWDeviceContext *ctx, UINT adapter)
static void dxva2_unmap_frame(AVHWFramesContext *ctx, HWMapDescriptor *hwmap)
#define FF_D3DCREATE_FLAGS
static int dxva2_device_create9(AVHWDeviceContext *ctx, UINT adapter)
static void dxva2_device_free(AVHWDeviceContext *ctx)
static int dxva2_transfer_data_to(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src)
const HWContextType ff_hwcontext_type_dxva2
static void dxva2_frames_uninit(AVHWFramesContext *ctx)
DEFINE_GUID(video_decoder_service, 0xfc51a551, 0xd5e7, 0x11d9, 0xaf, 0x55, 0x00, 0x05, 0x4e, 0x43, 0xff, 0x02)
static const D3DPRESENT_PARAMETERS dxva2_present_params
static int dxva2_device_create(AVHWDeviceContext *ctx, const char *device, AVDictionary *opts, int flags)
static void dxva2_pool_release_dummy(void *opaque, uint8_t *data)
IDirect3D9 *WINAPI pDirect3DCreate9(UINT)
static int dxva2_get_buffer(AVHWFramesContext *ctx, AVFrame *frame)
HRESULT WINAPI pDirect3DCreate9Ex(UINT, IDirect3D9Ex **)
static int dxva2_map_frame(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src, int flags)
static int dxva2_transfer_get_formats(AVHWFramesContext *ctx, enum AVHWFrameTransferDirection dir, enum AVPixelFormat **formats)
static int dxva2_map_from(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src, int flags)
static int dxva2_init_pool(AVHWFramesContext *ctx)
HRESULT WINAPI pCreateDeviceManager9(UINT *, IDirect3DDeviceManager9 **)
static int dxva2_transfer_data_from(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src)
static int dxva2_frames_init(AVHWFramesContext *ctx)
An API-specific header for AV_HWDEVICE_TYPE_DXVA2.
static FFHWFramesContext * ffhwframesctx(AVHWFramesContext *ctx)
const VDPAUPixFmtMap * map
#define MKTAG(a, b, c, d)
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
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.
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
@ AV_PIX_FMT_VUYX
packed VUYX 4:4:4:4, 32bpp, Variant of VUYA where alpha channel is left undefined
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
#define FF_ARRAY_ELEMS(a)
A reference to a data buffer.
This struct is allocated as AVHWDeviceContext.hwctx.
IDirect3DDeviceManager9 * devmgr
This struct is allocated as AVHWFramesContext.hwctx.
IDirect3DSurface9 ** surfaces
The surface pool.
DWORD surface_type
The surface type (e.g.
IDirectXVideoDecoder * decoder_to_release
Certain drivers require the decoder to be destroyed before the surfaces.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
This struct describes a set or pool of "hardware" frames (i.e.
IDirect3DDevice9 * d3d9device
AVDXVA2FramesContext p
The public AVDXVA2FramesContext.
IDirectXVideoAccelerationService * service
IDirect3DSurface9 ** surfaces_internal
uint32_t palette_dummy[256]
AVBufferPool * pool_internal
void * priv
Hardware-specific private data associated with the mapping.
AVFrame * source
A reference to the original source of the mapping.
#define av_malloc_array(a, b)
static AVFormatContext * ctx
static AVDictionary * opts
static enum AVPixelFormat supported_formats[]