diff options
Diffstat (limited to 'video/hwdec.h')
-rw-r--r-- | video/hwdec.h | 102 |
1 files changed, 67 insertions, 35 deletions
diff --git a/video/hwdec.h b/video/hwdec.h index 898b035361..5d563c983b 100644 --- a/video/hwdec.h +++ b/video/hwdec.h @@ -7,32 +7,38 @@ struct mp_image_pool; // keep in sync with --hwdec option (see mp_hwdec_names) enum hwdec_type { - HWDEC_AUTO = -1, HWDEC_NONE = 0, - HWDEC_VDPAU = 1, - HWDEC_VIDEOTOOLBOX = 3, - HWDEC_VAAPI = 4, - HWDEC_VAAPI_COPY = 5, - HWDEC_DXVA2 = 6, - HWDEC_DXVA2_COPY = 7, - HWDEC_D3D11VA_COPY = 8, - HWDEC_RPI = 9, - HWDEC_MEDIACODEC = 10, + HWDEC_AUTO, + HWDEC_AUTO_COPY, + HWDEC_VDPAU, + HWDEC_VIDEOTOOLBOX, + HWDEC_VAAPI, + HWDEC_VAAPI_COPY, + HWDEC_DXVA2, + HWDEC_DXVA2_COPY, + HWDEC_D3D11VA, + HWDEC_D3D11VA_COPY, + HWDEC_RPI, + HWDEC_MEDIACODEC, }; +#define HWDEC_IS_AUTO(x) ((x) == HWDEC_AUTO || (x) == HWDEC_AUTO_COPY) + // hwdec_type names (options.c) extern const struct m_opt_choice_alternatives mp_hwdec_names[]; struct mp_hwdec_ctx { - enum hwdec_type type; - - void *priv; // for free use by hwdec implementation + enum hwdec_type type; // (never HWDEC_NONE or HWDEC_IS_AUTO) + const char *driver_name; // NULL if unknown/not loaded - // API-specific, not needed by all backends. - struct mp_vdpau_ctx *vdpau_ctx; - struct mp_vaapi_ctx *vaapi_ctx; - struct mp_d3d_ctx *d3d_ctx; - uint32_t (*get_vt_fmt)(struct mp_hwdec_ctx *ctx); + // This is never NULL. Its meaning depends on the .type field: + // HWDEC_VDPAU: struct mp_vaapi_ctx* + // HWDEC_VIDEOTOOLBOX: struct mp_vt_ctx* + // HWDEC_VAAPI: struct mp_vaapi_ctx* + // HWDEC_D3D11VA: ID3D11Device* + // HWDEC_DXVA2: IDirect3DDevice9* + // HWDEC_DXVA2_COPY: IDirect3DDevice9* + void *ctx; // Optional. // Allocates a software image from the pool, downloads the hw image from @@ -44,24 +50,50 @@ struct mp_hwdec_ctx { struct mp_image_pool *swpool); }; -// Used to communicate hardware decoder API handles from VO to video decoder. -// The VO can set the context pointer for supported APIs. -struct mp_hwdec_info { - // (Since currently only 1 hwdec API is loaded at a time, this pointer - // simply maps to the loaded one.) - struct mp_hwdec_ctx *hwctx; - - // Can be used to lazily load a requested API. - // api_name is e.g. "vdpau" (like the fields above, without "_ctx") - // Can be NULL, is idempotent, caller checks hwctx fields for success/access. - // Due to threading, the callback is the only code that is allowed to - // change fields in this struct after initialization. - void (*load_api)(struct mp_hwdec_info *info, const char *api_name); - void *load_api_ctx; +struct mp_vt_ctx { + void *priv; + uint32_t (*get_vt_fmt)(struct mp_vt_ctx *ctx); }; -// Trivial helper to call info->load_api(). -// Implemented in vd_lavc.c. -void hwdec_request_api(struct mp_hwdec_info *info, const char *api_name); +// Used to communicate hardware decoder device handles from VO to video decoder. +struct mp_hwdec_devices; + +struct mp_hwdec_devices *hwdec_devices_create(void); +void hwdec_devices_destroy(struct mp_hwdec_devices *devs); + +// Return the device context for the given API type. Returns NULL if none +// available. Logically, the returned pointer remains valid until VO +// uninitialization is started (all users of it must be uninitialized before). +// hwdec_devices_request() may be used before this to lazily load devices. +struct mp_hwdec_ctx *hwdec_devices_get(struct mp_hwdec_devices *devs, + enum hwdec_type type); + +// For code which still strictly assumes there is 1 (or none) device. +struct mp_hwdec_ctx *hwdec_devices_get_first(struct mp_hwdec_devices *devs); + +// Add this to the list of internal devices. Adding the same pointer twice must +// be avoided. +void hwdec_devices_add(struct mp_hwdec_devices *devs, struct mp_hwdec_ctx *ctx); + +// Remove this from the list of internal devices. Idempotent/ignores entries +// not added yet. +void hwdec_devices_remove(struct mp_hwdec_devices *devs, struct mp_hwdec_ctx *ctx); + +// Can be used to enable lazy loading of an API with hwdec_devices_request(). +// If used at all, this must be set/unset during initialization/uninitialization, +// as concurrent use with hwdec_devices_request() is a race condition. +void hwdec_devices_set_loader(struct mp_hwdec_devices *devs, + void (*load_api)(void *ctx, enum hwdec_type type), void *load_api_ctx); + +// Cause VO to lazily load the requested device, and will block until this is +// done (even if not available). +void hwdec_devices_request(struct mp_hwdec_devices *devs, enum hwdec_type type); + +// Convenience function: +// - return NULL if devs==NULL +// - call hwdec_devices_request(devs, type) +// - call hwdec_devices_get(devs, type) +// - then return the mp_hwdec_ctx.ctx field +void *hwdec_devices_load(struct mp_hwdec_devices *devs, enum hwdec_type type); #endif |