mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-05-17 06:58:45 +08:00

to allow filtergraph printing to access the information. Signed-off-by: softworkz <softworkz@hotmail.com>
235 lines
6.5 KiB
C
235 lines
6.5 KiB
C
/*
|
|
* 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 */
|