Browse Source

lavu: add a way to query hwcontext frame constraints

Signed-off-by: Anton Khirnov <anton@khirnov.net>
tags/n3.1
Mark Thompson Anton Khirnov 9 years ago
parent
commit
b1f01e85a9
5 changed files with 128 additions and 1 deletions
  1. +3
    -0
      doc/APIchanges
  2. +45
    -0
      libavutil/hwcontext.c
  3. +69
    -0
      libavutil/hwcontext.h
  4. +10
    -0
      libavutil/hwcontext_internal.h
  5. +1
    -1
      libavutil/version.h

+ 3
- 0
doc/APIchanges View File

@@ -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.



+ 45
- 0
libavutil/hwcontext.c View File

@@ -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);
}

+ 69
- 0
libavutil/hwcontext.h View File

@@ -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 */

+ 10
- 0
libavutil/hwcontext_internal.h View File

@@ -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);



+ 1
- 1
libavutil/version.h View File

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


Loading…
Cancel
Save