lavu: add a way to query hwcontext frame constraints
Signed-off-by: Anton Khirnov <anton@khirnov.net>
This commit is contained in:
parent
1098f5c049
commit
b1f01e85a9
@ -13,6 +13,9 @@ libavutil: 2015-08-28
|
|||||||
|
|
||||||
API changes, most recent first:
|
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
|
2016-02-23 - 9200514 - lavf 57.5.0 - avformat.h
|
||||||
Add AVStream.codecpar, deprecate AVStream.codec.
|
Add AVStream.codecpar, deprecate AVStream.codec.
|
||||||
|
|
||||||
|
@ -400,3 +400,48 @@ int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
|
|||||||
|
|
||||||
return 0;
|
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);
|
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 */
|
#endif /* AVUTIL_HWCONTEXT_H */
|
||||||
|
@ -47,6 +47,12 @@ typedef struct HWContextType {
|
|||||||
*/
|
*/
|
||||||
size_t device_priv_size;
|
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,
|
* size of the public frame pool hardware-specific context,
|
||||||
* i.e. AVHWFramesContext.hwctx
|
* i.e. AVHWFramesContext.hwctx
|
||||||
@ -61,6 +67,10 @@ typedef struct HWContextType {
|
|||||||
int (*device_init)(AVHWDeviceContext *ctx);
|
int (*device_init)(AVHWDeviceContext *ctx);
|
||||||
void (*device_uninit)(AVHWDeviceContext *ctx);
|
void (*device_uninit)(AVHWDeviceContext *ctx);
|
||||||
|
|
||||||
|
int (*frames_get_constraints)(AVHWDeviceContext *ctx,
|
||||||
|
const void *hwconfig,
|
||||||
|
AVHWFramesConstraints *constraints);
|
||||||
|
|
||||||
int (*frames_init)(AVHWFramesContext *ctx);
|
int (*frames_init)(AVHWFramesContext *ctx);
|
||||||
void (*frames_uninit)(AVHWFramesContext *ctx);
|
void (*frames_uninit)(AVHWFramesContext *ctx);
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define LIBAVUTIL_VERSION_MAJOR 55
|
#define LIBAVUTIL_VERSION_MAJOR 55
|
||||||
#define LIBAVUTIL_VERSION_MINOR 6
|
#define LIBAVUTIL_VERSION_MINOR 7
|
||||||
#define LIBAVUTIL_VERSION_MICRO 0
|
#define LIBAVUTIL_VERSION_MICRO 0
|
||||||
|
|
||||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
|
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user