diff options
Diffstat (limited to 'video/hwdec.h')
-rw-r--r-- | video/hwdec.h | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/video/hwdec.h b/video/hwdec.h new file mode 100644 index 0000000..723c60f --- /dev/null +++ b/video/hwdec.h @@ -0,0 +1,108 @@ +#ifndef MP_HWDEC_H_ +#define MP_HWDEC_H_ + +#include <libavutil/buffer.h> + +#include "options/m_option.h" + +struct mp_image_pool; + +struct mp_hwdec_ctx { + const char *driver_name; // NULL if unknown/not loaded + + // libavutil-wrapped context, if available. + struct AVBufferRef *av_device_ref; // AVHWDeviceContext* + + // List of allowed IMGFMT_s, terminated with 0. + // If NULL, all software formats are considered to be supported. + const int *supported_formats; + // HW format used by the hwdec + int hw_imgfmt; + + // The name of this hwdec's matching conversion filter if available. + // This will be used for hardware conversion of frame formats. + // NULL otherwise. + const char *conversion_filter_name; + + // The libavutil hwconfig to be used when querying constraints for the + // conversion filter. Can be NULL if no special config is required. + void *conversion_config; +}; + +// 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); + +struct mp_hwdec_ctx *hwdec_devices_get_by_imgfmt(struct mp_hwdec_devices *devs, + int hw_imgfmt); + +// 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); + +// Return the n-th device. NULL if none. +struct mp_hwdec_ctx *hwdec_devices_get_n(struct mp_hwdec_devices *devs, int n); + +// 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. This is not thread-safe. +void hwdec_devices_remove(struct mp_hwdec_devices *devs, struct mp_hwdec_ctx *ctx); + +struct hwdec_imgfmt_request { + int imgfmt; + bool probing; +}; + +// 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, struct hwdec_imgfmt_request *params), + void *load_api_ctx); + +// Cause VO to lazily load all devices for a specified img format, and will +// block until this is done (even if not available). Pass IMGFMT_NONE to load +// all available devices. +void hwdec_devices_request_for_img_fmt(struct mp_hwdec_devices *devs, + struct hwdec_imgfmt_request *params); + +// Return "," concatenated list (for introspection/debugging). Use talloc_free(). +char *hwdec_devices_get_names(struct mp_hwdec_devices *devs); + +struct mp_image; +struct mpv_global; + +struct hwcontext_create_dev_params { + bool probing; // if true, don't log errors if unavailable +}; + +// Per AV_HWDEVICE_TYPE_* functions, queryable via hwdec_get_hwcontext_fns(). +// All entries are strictly optional. +struct hwcontext_fns { + int av_hwdevice_type; + // Fill in special format-specific requirements. + void (*refine_hwframes)(struct AVBufferRef *hw_frames_ctx); + // Returns a AVHWDeviceContext*. Used for copy hwdecs. + struct AVBufferRef *(*create_dev)(struct mpv_global *global, + struct mp_log *log, + struct hwcontext_create_dev_params *params); + // Return whether this is using some sort of sub-optimal emulation layer. + bool (*is_emulated)(struct AVBufferRef *hw_device_ctx); +}; + +// The parameter is of type enum AVHWDeviceType (as in int to avoid extensive +// recursive includes). May return NULL for unknown device types. +const struct hwcontext_fns *hwdec_get_hwcontext_fns(int av_hwdevice_type); + +extern const struct hwcontext_fns hwcontext_fns_cuda; +extern const struct hwcontext_fns hwcontext_fns_d3d11; +extern const struct hwcontext_fns hwcontext_fns_drmprime; +extern const struct hwcontext_fns hwcontext_fns_dxva2; +extern const struct hwcontext_fns hwcontext_fns_vaapi; +extern const struct hwcontext_fns hwcontext_fns_vdpau; + +#endif |