[FFmpeg-devel] [PATCH 6/9] lavfi: move AVFilterLink declaration to its own header.
James Almer
jamrial at gmail.com
Tue Dec 27 20:35:01 EET 2016
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.
> +
> +#else /* FF_INTERNAL_FIELDS */
> +
> + /**
> + * 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_INTERNAL_FIELDS */
> +
> +};
> +
> +#endif /* AVFILTER_AVFILTERLINK_H */
>
More information about the ffmpeg-devel
mailing list