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, \ | |||