[FFmpeg-devel] [PATCH 6/6] lavfi: make AVFilterLink opaque in two major bumps.

wm4 nfxjfg at googlemail.com
Sun Dec 18 14:33:25 EET 2016


On Sun, 18 Dec 2016 13:22:21 +0100
Nicolas George <george at nsup.org> wrote:

> API-Change: libavfilter
> Signed-off-by: Nicolas George <george at nsup.org>
> ---
>  libavfilter/avfilter.h |   2 +
>  libavfilter/internal.h | 199 +++++++++++++++++++++++++++++++++++++++++++++++++
>  libavfilter/version.h  |   3 +
>  3 files changed, 204 insertions(+)
> 
> 
> Not sure what the preferred delay would be. I suspect not many programs use
> libavfilter yet. In the meantime, all new fields must be added at both
> places and tested.
> 
> 
> diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
> index 828b270..6109e58 100644
> --- a/libavfilter/avfilter.h
> +++ b/libavfilter/avfilter.h
> @@ -377,6 +377,7 @@ struct AVFilterContext {
>      unsigned ready;
>  };
>  
> +#if FF_API_AVFILTERLINK_PUBLIC
>  /**
>   * A link between two filters. This contains pointers to the source and
>   * destination filters between which this link exists, and the indexes of
> @@ -593,6 +594,7 @@ struct AVFilterLink {
>  #endif /* FF_INTERNAL_FIELDS */
>  
>  };
> +#endif /* FF_API_AVFILTERLINK_PUBLIC */
>  
>  /**
>   * Link two filters together.
> diff --git a/libavfilter/internal.h b/libavfilter/internal.h
> index a8b69fd..599be24 100644
> --- a/libavfilter/internal.h
> +++ b/libavfilter/internal.h
> @@ -145,6 +145,205 @@ struct AVFilterPad {
>      int needs_writable;
>  };
>  
> +#if !FF_API_AVFILTERLINK_PUBLIC
> +/**
> + * A link between two filters. This contains pointers to the source and
> + * destination filters between which this link exists, and the indexes of
> + * the pads involved. In addition, this link also contains the parameters
> + * which have been negotiated and agreed upon between the filter, such as
> + * image dimensions, format, etc.
> + */
> +struct AVFilterLink {
> +    AVFilterContext *src;       ///< source filter
> +    AVFilterPad *srcpad;        ///< output pad on the source filter
> +
> +    AVFilterContext *dst;       ///< dest filter
> +    AVFilterPad *dstpad;        ///< input pad on the dest filter
> +
> +    enum AVMediaType type;      ///< filter media type
> +
> +    /* These parameters apply only to video */
> +    int w;                      ///< agreed upon image width
> +    int h;                      ///< agreed upon image height
> +    AVRational sample_aspect_ratio; ///< agreed upon sample aspect ratio
> +    /* These parameters apply only to audio */
> +    uint64_t channel_layout;    ///< channel layout of current buffer (see libavutil/channel_layout.h)
> +    int sample_rate;            ///< samples per second
> +
> +    int format;                 ///< agreed upon media format
> +
> +    /**
> +     * Define the time base used by the PTS of the frames/samples
> +     * which will pass through this link.
> +     * During the configuration stage, each filter is supposed to
> +     * change only the output timebase, while the timebase of the
> +     * input link is assumed to be an unchangeable property.
> +     */
> +    AVRational time_base;
> +
> +    /**
> +     * Lists of formats and channel layouts supported by the input and output
> +     * filters respectively. These lists are used for negotiating the format
> +     * to actually be used, which will be loaded into the format and
> +     * channel_layout members, above, when chosen.
> +     *
> +     */
> +    AVFilterFormats *in_formats;
> +    AVFilterFormats *out_formats;
> +
> +    /**
> +     * Lists of channel layouts and sample rates used for automatic
> +     * negotiation.
> +     */
> +    AVFilterFormats  *in_samplerates;
> +    AVFilterFormats *out_samplerates;
> +    struct AVFilterChannelLayouts  *in_channel_layouts;
> +    struct AVFilterChannelLayouts *out_channel_layouts;
> +
> +    /**
> +     * Audio only, the destination filter sets this to a non-zero value to
> +     * request that buffers with the given number of samples should be sent to
> +     * it. AVFilterPad.needs_fifo must also be set on the corresponding input
> +     * pad.
> +     * Last buffer before EOF will be padded with silence.
> +     */
> +    int request_samples;
> +
> +    /** stage of the initialization of the link properties (dimensions, etc) */
> +    enum {
> +        AVLINK_UNINIT = 0,      ///< not started
> +        AVLINK_STARTINIT,       ///< started, but incomplete
> +        AVLINK_INIT             ///< complete
> +    } init_state;
> +
> +    /**
> +     * Graph the filter belongs to.
> +     */
> +    struct AVFilterGraph *graph;
> +
> +    /**
> +     * Current timestamp of the link, as defined by the most recent
> +     * frame(s), in link time_base units.
> +     */
> +    int64_t current_pts;
> +
> +    /**
> +     * Current timestamp of the link, as defined by the most recent
> +     * frame(s), in AV_TIME_BASE units.
> +     */
> +    int64_t current_pts_us;
> +
> +    /**
> +     * Index in the age array.
> +     */
> +    int age_index;
> +
> +    /**
> +     * Frame rate of the stream on the link, or 1/0 if unknown or variable;
> +     * if left to 0/0, will be automatically copied from the first input
> +     * of the source filter if it exists.
> +     *
> +     * Sources should set it to the best estimation of the real frame rate.
> +     * If the source frame rate is unknown or variable, set this to 1/0.
> +     * Filters should update it if necessary depending on their function.
> +     * Sinks can use it to set a default output frame rate.
> +     * It is similar to the r_frame_rate field in AVStream.
> +     */
> +    AVRational frame_rate;
> +
> +    /**
> +     * Buffer partially filled with samples to achieve a fixed/minimum size.
> +     */
> +    AVFrame *partial_buf;
> +
> +    /**
> +     * Size of the partial buffer to allocate.
> +     * Must be between min_samples and max_samples.
> +     */
> +    int partial_buf_size;
> +
> +    /**
> +     * Minimum number of samples to filter at once. If filter_frame() is
> +     * called with fewer samples, it will accumulate them in partial_buf.
> +     * This field and the related ones must not be changed after filtering
> +     * has started.
> +     * If 0, all related fields are ignored.
> +     */
> +    int min_samples;
> +
> +    /**
> +     * Maximum number of samples to filter at once. If filter_frame() is
> +     * called with more samples, it will split them.
> +     */
> +    int max_samples;
> +
> +    /**
> +     * Number of channels.
> +     */
> +    int channels;
> +
> +    /**
> +     * Link processing flags.
> +     */
> +    unsigned flags;
> +
> +    /**
> +     * Number of past frames sent through the link.
> +     */
> +    int64_t frame_count_in, frame_count_out;
> +
> +    /**
> +     * A pointer to a FFVideoFramePool struct.
> +     */
> +    void *video_frame_pool;
> +
> +    /**
> +     * True if a frame is currently wanted on the output of this filter.
> +     * Set when ff_request_frame() is called by the output,
> +     * cleared when a frame is filtered.
> +     */
> +    int frame_wanted_out;
> +
> +    /**
> +     * For hwaccel pixel formats, this should be a reference to the
> +     * AVHWFramesContext describing the frames.
> +     */
> +    AVBufferRef *hw_frames_ctx;
> +
> +    /**
> +     * Queue of frames waiting to be filtered.
> +     */
> +    FFFrameQueue fifo;
> +
> +    /**
> +     * If set, the source filter can not generate a frame as is.
> +     * The goal is to avoid repeatedly calling the request_frame() method on
> +     * the same link.
> +     */
> +    int frame_blocked_in;
> +
> +    /**
> +     * Link input status.
> +     * If not zero, all attempts of filter_frame will fail with the
> +     * corresponding code.
> +     */
> +    int status_in;
> +
> +    /**
> +     * Timestamp of the input status change.
> +     */
> +    int64_t status_in_pts;
> +
> +    /**
> +     * Link output status.
> +     * If not zero, all attempts of request_frame will fail with the
> +     * corresponding code.
> +     */
> +    int status_out;
> +
> +};
> +#endif /* !FF_API_AVFILTERLINK_PUBLIC */
> +
>  struct AVFilterGraphInternal {
>      void *thread;
>      avfilter_execute_func *thread_execute;
> diff --git a/libavfilter/version.h b/libavfilter/version.h
> index e3bd8d0..8256781 100644
> --- a/libavfilter/version.h
> +++ b/libavfilter/version.h
> @@ -67,5 +67,8 @@
>  #ifndef FF_API_NOCONST_GET_NAME
>  #define FF_API_NOCONST_GET_NAME             (LIBAVFILTER_VERSION_MAJOR < 7)
>  #endif
> +#ifndef FF_API_AVFILTERLINK_PUBLIC
> +#define FF_API_AVFILTERLINK_PUBLIC          (LIBAVFILTER_VERSION_MAJOR < 8)
> +#endif
>  
>  #endif /* AVFILTER_VERSION_H */

Did you send the same patches to Libav? This makes the API incompatible
with Libav.


More information about the ffmpeg-devel mailing list