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

Reply via email to