On 26/02/16 11:46, wm4 wrote: > On Thu, 25 Feb 2016 23:47:39 +0000 > Mark Thompson <[email protected]> wrote: > >> --- >> libavutil/hwcontext.c | 45 ++++++++++++++++++++++++++++ >> libavutil/hwcontext.h | 68 >> ++++++++++++++++++++++++++++++++++++++++++ >> libavutil/hwcontext_internal.h | 10 +++++++ >> 3 files changed, 123 insertions(+) >> >> diff --git a/libavutil/hwcontext.c b/libavutil/hwcontext.c >> index b6d0518..a00a7e6 100644 >> --- a/libavutil/hwcontext.c >> +++ b/libavutil/hwcontext.c >> @@ -400,3 +400,48 @@ int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, >> AVFrame *frame, int flags) >> >> return 0; >> } >> + >> +AVHWFramesConstraints *av_hwframe_constraints_alloc(void) >> +{ >> + AVHWFramesConstraints *constraints; >> + >> + constraints = av_mallocz(sizeof(*constraints)); >> + if (!constraints) >> + return NULL; >> + >> + constraints->min_width = constraints->min_height = 0; >> + constraints->max_width = constraints->max_height = INT_MAX; >> + >> + return constraints; >> +} >> + >> +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); >> +} >> + >> +void av_hwframe_constraints_free(AVHWFramesConstraints *constraints) >> +{ >> + av_freep(&constraints->valid_sw_formats); >> + av_freep(&constraints); >> +} >> + >> +int av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, >> + const void *hwconfig, >> + AVHWFramesConstraints *constraints) >> +{ >> + AVHWDeviceContext *ctx = (AVHWDeviceContext*)ref->data; >> + const HWContextType *hw_type = ctx->internal->hw_type; >> + >> + if (!hw_type->frames_get_constraints) >> + return AVERROR(ENOSYS); >> + >> + return hw_type->frames_get_constraints(ctx, hwconfig, constraints); >> +} >> + >> diff --git a/libavutil/hwcontext.h b/libavutil/hwcontext.h >> index 81ae817..f49a58a 100644 >> --- a/libavutil/hwcontext.h >> +++ b/libavutil/hwcontext.h >> @@ -326,4 +326,72 @@ 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. >> + */ >> +typedef struct AVHWFramesConstraints { >> + /** >> + * A list of possible values for sw_format in the hw_frames_ctx. >> + * The list is terminated by AV_PIX_FMT_NONE and must be freed by the >> + * caller with av_free() when the whole constraint structure is freed. >> + * 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 an AVHWFrameConstraints structure for a given hwdevice. >> + * >> + * @return The newly created AVHWFrameConstraints structure. >> + */ >> +AVHWFramesConstraints *av_hwframe_constraints_alloc(void); >> + >> +/** >> + * Free an AVHWFrameConstraints structure. >> + * >> + * @param constraints The (filled or unfilled) AVHWFrameConstraints >> structure. >> + */ >> +void av_hwframe_constraints_free(AVHWFramesConstraints *constraints); >> + >> +/** >> + * Allocate a HW-specific configuration structure for a given HW device. >> + * >> + * @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. >> + * @param constraints on successful return, the constraints which apply >> + * to frames in this device configuration. >> + * @return 0 on success, a negative AVERROR code on failure. >> + */ >> +int av_hwdevice_get_hwframe_constraints(AVBufferRef *device_ctx, >> + const void *hwconfig, >> + AVHWFramesConstraints *constraints); >> + >> #endif /* AVUTIL_HWCONTEXT_H */ >> diff --git a/libavutil/hwcontext_internal.h b/libavutil/hwcontext_internal.h >> index 641232f..27de1f9 100644 >> --- a/libavutil/hwcontext_internal.h >> +++ b/libavutil/hwcontext_internal.h >> @@ -48,6 +48,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); >> > > Maybe I'm a bit too late to the party, but... > > This seems all a bit roundabout. Can't the implementation just alloc > the struct and return it from HWContextType.frames_get_constraints, > instead of making the common call alloc it and requiring a > device_hwconfig_size field? > > Only av_hwframe_constraints_free() seems to be required as public API.
Hmm. That makes sense to remove the allocation step, but I don't see how it can change anything else. How are you getting the user-filled hwconfig information to get_constraints in that case? _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
