Signed-off-by: Anton Khirnov <anton@khirnov.net>tags/n3.1
| @@ -13,6 +13,9 @@ libavutil: 2015-08-28 | |||
| API changes, most recent first: | |||
| 2016-xx-xx - xxxxxxx - lavu 55.7.0 - hwcontext.h | |||
| Add AVHWFramesConstraints and associated API. | |||
| 2016-02-23 - 9200514 - lavf 57.5.0 - avformat.h | |||
| Add AVStream.codecpar, deprecate AVStream.codec. | |||
| @@ -400,3 +400,48 @@ int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags) | |||
| return 0; | |||
| } | |||
| void *av_hwdevice_hwconfig_alloc(AVBufferRef *ref) | |||
| { | |||
| AVHWDeviceContext *ctx = (AVHWDeviceContext*)ref->data; | |||
| const HWContextType *hw_type = ctx->internal->hw_type; | |||
| if (hw_type->device_hwconfig_size == 0) | |||
| return NULL; | |||
| return av_mallocz(hw_type->device_hwconfig_size); | |||
| } | |||
| AVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, | |||
| const void *hwconfig) | |||
| { | |||
| AVHWDeviceContext *ctx = (AVHWDeviceContext*)ref->data; | |||
| const HWContextType *hw_type = ctx->internal->hw_type; | |||
| AVHWFramesConstraints *constraints; | |||
| if (!hw_type->frames_get_constraints) | |||
| return NULL; | |||
| constraints = av_mallocz(sizeof(*constraints)); | |||
| if (!constraints) | |||
| return NULL; | |||
| constraints->min_width = constraints->min_height = 0; | |||
| constraints->max_width = constraints->max_height = INT_MAX; | |||
| if (hw_type->frames_get_constraints(ctx, hwconfig, constraints) >= 0) { | |||
| return constraints; | |||
| } else { | |||
| av_hwframe_constraints_free(&constraints); | |||
| return NULL; | |||
| } | |||
| } | |||
| void av_hwframe_constraints_free(AVHWFramesConstraints **constraints) | |||
| { | |||
| if (*constraints) { | |||
| av_freep(&(*constraints)->valid_hw_formats); | |||
| av_freep(&(*constraints)->valid_sw_formats); | |||
| } | |||
| av_freep(constraints); | |||
| } | |||
| @@ -326,4 +326,73 @@ int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ctx, | |||
| enum AVPixelFormat **formats, int flags); | |||
| /** | |||
| * This struct describes the constraints on hardware frames attached to | |||
| * a given device with a hardware-specific configuration. This is returned | |||
| * by av_hwdevice_get_hwframe_constraints() and must be freed by | |||
| * av_hwframe_constraints_free() after use. | |||
| */ | |||
| typedef struct AVHWFramesConstraints { | |||
| /** | |||
| * A list of possible values for format in the hw_frames_ctx, | |||
| * terminated by AV_PIX_FMT_NONE. This member will always be filled. | |||
| */ | |||
| enum AVPixelFormat *valid_hw_formats; | |||
| /** | |||
| * A list of possible values for sw_format in the hw_frames_ctx, | |||
| * terminated by AV_PIX_FMT_NONE. Can be NULL if this information is | |||
| * not known. | |||
| */ | |||
| enum AVPixelFormat *valid_sw_formats; | |||
| /** | |||
| * The minimum size of frames in this hw_frames_ctx. | |||
| * (Zero if not known.) | |||
| */ | |||
| int min_width; | |||
| int min_height; | |||
| /** | |||
| * The maximum size of frames in this hw_frames_ctx. | |||
| * (INT_MAX if not known / no limit.) | |||
| */ | |||
| int max_width; | |||
| int max_height; | |||
| } AVHWFramesConstraints; | |||
| /** | |||
| * Allocate a HW-specific configuration structure for a given HW device. | |||
| * After use, the user must free all members as required by the specific | |||
| * hardware structure being used, then free the structure itself with | |||
| * av_free(). | |||
| * | |||
| * @param device_ctx a reference to the associated AVHWDeviceContext. | |||
| * @return The newly created HW-specific configuration structure on | |||
| * success or NULL on failure. | |||
| */ | |||
| void *av_hwdevice_hwconfig_alloc(AVBufferRef *device_ctx); | |||
| /** | |||
| * Get the constraints on HW frames given a device and the HW-specific | |||
| * configuration to be used with that device. If no HW-specific | |||
| * confgiuration is provided, returns the maximum possible capabilities | |||
| * of the device. | |||
| * | |||
| * @param device_ctx a reference to the associated AVHWDeviceContext. | |||
| * @param hwconfig a filled HW-specific configuration structure, or NULL | |||
| * to return the maximum possible capabilities of the device. | |||
| * @return AVHWFramesConstraints structure describing the constraints | |||
| * on the device, or NULL if not available. | |||
| */ | |||
| AVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, | |||
| const void *hwconfig); | |||
| /** | |||
| * Free an AVHWFrameConstraints structure. | |||
| * | |||
| * @param constraints The (filled or unfilled) AVHWFrameConstraints structure. | |||
| */ | |||
| void av_hwframe_constraints_free(AVHWFramesConstraints **constraints); | |||
| #endif /* AVUTIL_HWCONTEXT_H */ | |||
| @@ -47,6 +47,12 @@ typedef struct HWContextType { | |||
| */ | |||
| size_t device_priv_size; | |||
| /** | |||
| * Size of the hardware-specific device configuration. | |||
| * (Used to query hwframe constraints.) | |||
| */ | |||
| size_t device_hwconfig_size; | |||
| /** | |||
| * size of the public frame pool hardware-specific context, | |||
| * i.e. AVHWFramesContext.hwctx | |||
| @@ -61,6 +67,10 @@ typedef struct HWContextType { | |||
| int (*device_init)(AVHWDeviceContext *ctx); | |||
| void (*device_uninit)(AVHWDeviceContext *ctx); | |||
| int (*frames_get_constraints)(AVHWDeviceContext *ctx, | |||
| const void *hwconfig, | |||
| AVHWFramesConstraints *constraints); | |||
| int (*frames_init)(AVHWFramesContext *ctx); | |||
| void (*frames_uninit)(AVHWFramesContext *ctx); | |||
| @@ -54,7 +54,7 @@ | |||
| */ | |||
| #define LIBAVUTIL_VERSION_MAJOR 55 | |||
| #define LIBAVUTIL_VERSION_MINOR 6 | |||
| #define LIBAVUTIL_VERSION_MINOR 7 | |||
| #define LIBAVUTIL_VERSION_MICRO 0 | |||
| #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | |||