fftools/ffmpeg_filter: Move some declaration to new header file

to allow filtergraph printing to access the information.

Signed-off-by: softworkz <softworkz@hotmail.com>
This commit is contained in:
softworkz
2025-04-11 06:01:57 +02:00
parent b71b444a3a
commit 34bb7f5d87
2 changed files with 235 additions and 189 deletions

View File

@ -21,6 +21,7 @@
#include <stdint.h>
#include "ffmpeg.h"
#include "ffmpeg_filter.h"
#include "libavfilter/avfilter.h"
#include "libavfilter/buffersink.h"
@ -42,44 +43,6 @@
// FIXME private header, used for mid_pred()
#include "libavcodec/mathops.h"
typedef struct FilterGraphPriv {
FilterGraph fg;
// name used for logging
char log_name[32];
int is_simple;
// true when the filtergraph contains only meta filters
// that do not modify the frame data
int is_meta;
// source filters are present in the graph
int have_sources;
int disable_conversions;
unsigned nb_outputs_done;
const char *graph_desc;
int nb_threads;
// frame for temporarily holding output from the filtergraph
AVFrame *frame;
// frame for sending output to the encoder
AVFrame *frame_enc;
Scheduler *sch;
unsigned sch_idx;
} FilterGraphPriv;
static FilterGraphPriv *fgp_from_fg(FilterGraph *fg)
{
return (FilterGraphPriv*)fg;
}
static const FilterGraphPriv *cfgp_from_cfg(const FilterGraph *fg)
{
return (const FilterGraphPriv*)fg;
}
// data that is local to the filter thread and not visible outside of it
typedef struct FilterGraphThread {
@ -102,157 +65,6 @@ typedef struct FilterGraphThread {
uint8_t *eof_out;
} FilterGraphThread;
typedef struct InputFilterPriv {
InputFilter ifilter;
InputFilterOptions opts;
int index;
AVFilterContext *filter;
// used to hold submitted input
AVFrame *frame;
/* for filters that are not yet bound to an input stream,
* this stores the input linklabel, if any */
uint8_t *linklabel;
// filter data type
enum AVMediaType type;
// source data type: AVMEDIA_TYPE_SUBTITLE for sub2video,
// same as type otherwise
enum AVMediaType type_src;
int eof;
int bound;
int drop_warned;
uint64_t nb_dropped;
// parameters configured for this input
int format;
int width, height;
AVRational sample_aspect_ratio;
enum AVColorSpace color_space;
enum AVColorRange color_range;
int sample_rate;
AVChannelLayout ch_layout;
AVRational time_base;
AVFrameSideData **side_data;
int nb_side_data;
AVFifo *frame_queue;
AVBufferRef *hw_frames_ctx;
int displaymatrix_present;
int displaymatrix_applied;
int32_t displaymatrix[9];
int downmixinfo_present;
AVDownmixInfo downmixinfo;
struct {
AVFrame *frame;
int64_t last_pts;
int64_t end_pts;
/// marks if sub2video_update should force an initialization
unsigned int initialize;
} sub2video;
} InputFilterPriv;
static InputFilterPriv *ifp_from_ifilter(InputFilter *ifilter)
{
return (InputFilterPriv*)ifilter;
}
typedef struct FPSConvContext {
AVFrame *last_frame;
/* number of frames emitted by the video-encoding sync code */
int64_t frame_number;
/* history of nb_frames_prev, i.e. the number of times the
* previous frame was duplicated by vsync code in recent
* do_video_out() calls */
int64_t frames_prev_hist[3];
uint64_t dup_warning;
int last_dropped;
int dropped_keyframe;
enum VideoSyncMethod vsync_method;
AVRational framerate;
AVRational framerate_max;
const AVRational *framerate_supported;
int framerate_clip;
} FPSConvContext;
typedef struct OutputFilterPriv {
OutputFilter ofilter;
int index;
void *log_parent;
char log_name[32];
char *name;
AVFilterContext *filter;
/* desired output stream properties */
int format;
int width, height;
int sample_rate;
AVChannelLayout ch_layout;
enum AVColorSpace color_space;
enum AVColorRange color_range;
AVFrameSideData **side_data;
int nb_side_data;
// time base in which the output is sent to our downstream
// does not need to match the filtersink's timebase
AVRational tb_out;
// at least one frame with the above timebase was sent
// to our downstream, so it cannot change anymore
int tb_out_locked;
AVRational sample_aspect_ratio;
AVDictionary *sws_opts;
AVDictionary *swr_opts;
// those are only set if no format is specified and the encoder gives us multiple options
// They point directly to the relevant lists of the encoder.
const int *formats;
const AVChannelLayout *ch_layouts;
const int *sample_rates;
const enum AVColorSpace *color_spaces;
const enum AVColorRange *color_ranges;
AVRational enc_timebase;
int64_t trim_start_us;
int64_t trim_duration_us;
// offset for output timestamps, in AV_TIME_BASE_Q
int64_t ts_offset;
int64_t next_pts;
FPSConvContext fps;
unsigned flags;
} OutputFilterPriv;
static OutputFilterPriv *ofp_from_ofilter(OutputFilter *ofilter)
{
return (OutputFilterPriv*)ofilter;
}
typedef struct FilterCommand {
char *target;
char *command;

234
fftools/ffmpeg_filter.h Normal file
View File

@ -0,0 +1,234 @@
/*
* 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 FFTOOLS_FFMPEG_FILTER_H
#define FFTOOLS_FFMPEG_FILTER_H
#include "ffmpeg.h"
#include <stdint.h>
#include "ffmpeg_sched.h"
#include "sync_queue.h"
#include "libavfilter/avfilter.h"
#include "libavutil/avutil.h"
#include "libavutil/dict.h"
#include "libavutil/fifo.h"
#include "libavutil/pixfmt.h"
#include "libavutil/rational.h"
#include "libavutil/bprint.h"
#include "libavutil/channel_layout.h"
#include "libavutil/downmix_info.h"
typedef struct FilterGraphPriv {
FilterGraph fg;
// name used for logging
char log_name[32];
int is_simple;
// true when the filtergraph contains only meta filters
// that do not modify the frame data
int is_meta;
// source filters are present in the graph
int have_sources;
int disable_conversions;
unsigned nb_outputs_done;
const char *graph_desc;
int nb_threads;
// frame for temporarily holding output from the filtergraph
AVFrame *frame;
// frame for sending output to the encoder
AVFrame *frame_enc;
Scheduler *sch;
unsigned sch_idx;
AVBPrint graph_print_buf;
} FilterGraphPriv;
static inline FilterGraphPriv *fgp_from_fg(FilterGraph *fg)
{
return (FilterGraphPriv*)fg;
}
static inline const FilterGraphPriv *cfgp_from_cfg(const FilterGraph *fg)
{
return (const FilterGraphPriv*)fg;
}
typedef struct InputFilterPriv {
InputFilter ifilter;
InputFilterOptions opts;
int index;
AVFilterContext *filter;
// used to hold submitted input
AVFrame *frame;
/* for filters that are not yet bound to an input stream,
* this stores the input linklabel, if any */
uint8_t *linklabel;
// filter data type
enum AVMediaType type;
// source data type: AVMEDIA_TYPE_SUBTITLE for sub2video,
// same as type otherwise
enum AVMediaType type_src;
int eof;
int bound;
int drop_warned;
uint64_t nb_dropped;
// parameters configured for this input
int format;
int width, height;
AVRational sample_aspect_ratio;
enum AVColorSpace color_space;
enum AVColorRange color_range;
int sample_rate;
AVChannelLayout ch_layout;
AVRational time_base;
AVFrameSideData **side_data;
int nb_side_data;
AVFifo *frame_queue;
AVBufferRef *hw_frames_ctx;
int displaymatrix_present;
int displaymatrix_applied;
int32_t displaymatrix[9];
int downmixinfo_present;
AVDownmixInfo downmixinfo;
struct {
AVFrame *frame;
int64_t last_pts;
int64_t end_pts;
/// marks if sub2video_update should force an initialization
unsigned int initialize;
} sub2video;
} InputFilterPriv;
static inline InputFilterPriv *ifp_from_ifilter(InputFilter *ifilter)
{
return (InputFilterPriv*)ifilter;
}
typedef struct FPSConvContext {
AVFrame *last_frame;
/* number of frames emitted by the video-encoding sync code */
int64_t frame_number;
/* history of nb_frames_prev, i.e. the number of times the
* previous frame was duplicated by vsync code in recent
* do_video_out() calls */
int64_t frames_prev_hist[3];
uint64_t dup_warning;
int last_dropped;
int dropped_keyframe;
enum VideoSyncMethod vsync_method;
AVRational framerate;
AVRational framerate_max;
const AVRational *framerate_supported;
int framerate_clip;
} FPSConvContext;
typedef struct OutputFilterPriv {
OutputFilter ofilter;
int index;
void *log_parent;
char log_name[32];
char *name;
AVFilterContext *filter;
/* desired output stream properties */
int format;
int width, height;
int sample_rate;
AVChannelLayout ch_layout;
enum AVColorSpace color_space;
enum AVColorRange color_range;
AVFrameSideData **side_data;
int nb_side_data;
// time base in which the output is sent to our downstream
// does not need to match the filtersink's timebase
AVRational tb_out;
// at least one frame with the above timebase was sent
// to our downstream, so it cannot change anymore
int tb_out_locked;
AVRational sample_aspect_ratio;
AVDictionary *sws_opts;
AVDictionary *swr_opts;
// those are only set if no format is specified and the encoder gives us multiple options
// They point directly to the relevant lists of the encoder.
const int *formats;
const AVChannelLayout *ch_layouts;
const int *sample_rates;
const enum AVColorSpace *color_spaces;
const enum AVColorRange *color_ranges;
AVRational enc_timebase;
int64_t trim_start_us;
int64_t trim_duration_us;
// offset for output timestamps, in AV_TIME_BASE_Q
int64_t ts_offset;
int64_t next_pts;
FPSConvContext fps;
unsigned flags;
} OutputFilterPriv;
static inline OutputFilterPriv *ofp_from_ofilter(OutputFilter *ofilter)
{
return (OutputFilterPriv*)ofilter;
}
#endif /* FFTOOLS_FFMPEG_FILTER_H */