On Fri, 26 Feb 2016 12:06:09 +0000
Mark Thompson <[email protected]> wrote:

> 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?

I didn't know there was supposed to be any.
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to