[FFmpeg-devel] [PATCH 6/9] lavfi: move AVFilterLink declaration to its own header.

Paul B Mahol onemda at gmail.com
Tue Dec 27 23:36:52 EET 2016


On 12/27/16, James Almer <jamrial at gmail.com> wrote:
> On 12/27/2016 3:02 PM, Nicolas George wrote:
>> AVFilterLink contains fields of internal types that are better
>> isolated. Furthermore, with the prospect of inter-filters
>> threading, it is better if filters do not access links directly.
>>
>> Signed-off-by: Nicolas George <george at nsup.org>
>> ---
>>  libavfilter/Makefile       |   1 +
>>  libavfilter/avfilter.h     | 217 +--------------------------------------
>>  libavfilter/avfilterlink.h | 248
>> +++++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 250 insertions(+), 216 deletions(-)
>>  create mode 100644 libavfilter/avfilterlink.h
>>
>>
>> That way, making it public or private is just a matter of changing one
>> line
>> in the Makefile.
>>
>
> [...]
>
>> diff --git a/libavfilter/avfilterlink.h b/libavfilter/avfilterlink.h
>> new file mode 100644
>> index 0000000000..51ab322ae9
>> --- /dev/null
>> +++ b/libavfilter/avfilterlink.h
>> @@ -0,0 +1,248 @@
>> +/*
>> + * AVFilterLink definition
>> + * Copyright (c) 2007 Bobby Bingham
>> + *
>> + * This file is part of FFmpeg.
>> + *
>> + * FFmpeg is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU Lesser General Public License
>> + * as published by the Free Software Foundation; either
>> + * version 2.1 of the License, or (at your option) any later version.
>> + *
>> + * FFmpeg is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU Lesser General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU Lesser General Public
>> License
>> + * along with FFmpeg; if not, write to the Free Software Foundation,
>> Inc.,
>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>> + */
>> +
>> +#ifndef AVFILTER_AVFILTERLINK_H
>> +#define AVFILTER_AVFILTERLINK_H
>> +
>> +#include "avfilter.h"
>> +
>> +#ifdef FF_INTERNAL_FIELDS
>> +# include "framequeue.h"
>> +#endif
>> +
>> +/**
>> + * 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;
>> +
>> +    /*****************************************************************
>> +     * All fields below this line are not part of the public API. They
>> +     * may not be used outside of libavfilter and can be changed and
>> +     * removed at will.
>> +     * New public fields should be added right above.
>> +     *****************************************************************
>> +     */
>> +    /**
>> +     * 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;
>> +
>> +#ifndef FF_INTERNAL_FIELDS
>> +
>> +    /**
>> +     * Internal structure members.
>> +     * The fields below this limit are internal for libavfilter's use
>> +     * and must in no way be accessed by applications.
>
> How is this any different than the above notice? Everything below time_base
> is also meant for internal use and shouldn't be accessed by applications or
> other ffmpeg libraries.
> Is extending the scope of FF_INTERNAL_FIELDS to cover the above fields your
> intention for the next major bump?
>
>> +     */
>> +    char reserved[0xF000];
>
> What's the point in reserving space like this? And isn't 60kb a bit
> overkill?
>
> I insist this is just ugly and unconventional.
>

Yes, what's point of that?


More information about the ffmpeg-devel mailing list