1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * This file is part of FFmpeg.
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
8cabdff1aSopenharmony_ci *
9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12cabdff1aSopenharmony_ci * Lesser General Public License for more details.
13cabdff1aSopenharmony_ci *
14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17cabdff1aSopenharmony_ci */
18cabdff1aSopenharmony_ci
19cabdff1aSopenharmony_ci#ifndef FFTOOLS_FFMPEG_H
20cabdff1aSopenharmony_ci#define FFTOOLS_FFMPEG_H
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci#include "config.h"
23cabdff1aSopenharmony_ci
24cabdff1aSopenharmony_ci#include <stdint.h>
25cabdff1aSopenharmony_ci#include <stdio.h>
26cabdff1aSopenharmony_ci#include <signal.h>
27cabdff1aSopenharmony_ci
28cabdff1aSopenharmony_ci#include "cmdutils.h"
29cabdff1aSopenharmony_ci
30cabdff1aSopenharmony_ci#include "libavformat/avformat.h"
31cabdff1aSopenharmony_ci#include "libavformat/avio.h"
32cabdff1aSopenharmony_ci
33cabdff1aSopenharmony_ci#include "libavcodec/avcodec.h"
34cabdff1aSopenharmony_ci#include "libavcodec/bsf.h"
35cabdff1aSopenharmony_ci
36cabdff1aSopenharmony_ci#include "libavfilter/avfilter.h"
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci#include "libavutil/avutil.h"
39cabdff1aSopenharmony_ci#include "libavutil/dict.h"
40cabdff1aSopenharmony_ci#include "libavutil/eval.h"
41cabdff1aSopenharmony_ci#include "libavutil/fifo.h"
42cabdff1aSopenharmony_ci#include "libavutil/hwcontext.h"
43cabdff1aSopenharmony_ci#include "libavutil/pixfmt.h"
44cabdff1aSopenharmony_ci#include "libavutil/rational.h"
45cabdff1aSopenharmony_ci#include "libavutil/thread.h"
46cabdff1aSopenharmony_ci#include "libavutil/threadmessage.h"
47cabdff1aSopenharmony_ci
48cabdff1aSopenharmony_ci#include "libswresample/swresample.h"
49cabdff1aSopenharmony_ci
50cabdff1aSopenharmony_cienum VideoSyncMethod {
51cabdff1aSopenharmony_ci    VSYNC_AUTO = -1,
52cabdff1aSopenharmony_ci    VSYNC_PASSTHROUGH,
53cabdff1aSopenharmony_ci    VSYNC_CFR,
54cabdff1aSopenharmony_ci    VSYNC_VFR,
55cabdff1aSopenharmony_ci    VSYNC_VSCFR,
56cabdff1aSopenharmony_ci    VSYNC_DROP,
57cabdff1aSopenharmony_ci};
58cabdff1aSopenharmony_ci
59cabdff1aSopenharmony_ci#define MAX_STREAMS 1024    /* arbitrary sanity check value */
60cabdff1aSopenharmony_ci
61cabdff1aSopenharmony_cienum HWAccelID {
62cabdff1aSopenharmony_ci    HWACCEL_NONE = 0,
63cabdff1aSopenharmony_ci    HWACCEL_AUTO,
64cabdff1aSopenharmony_ci    HWACCEL_GENERIC,
65cabdff1aSopenharmony_ci};
66cabdff1aSopenharmony_ci
67cabdff1aSopenharmony_citypedef struct HWDevice {
68cabdff1aSopenharmony_ci    const char *name;
69cabdff1aSopenharmony_ci    enum AVHWDeviceType type;
70cabdff1aSopenharmony_ci    AVBufferRef *device_ref;
71cabdff1aSopenharmony_ci} HWDevice;
72cabdff1aSopenharmony_ci
73cabdff1aSopenharmony_ci/* select an input stream for an output stream */
74cabdff1aSopenharmony_citypedef struct StreamMap {
75cabdff1aSopenharmony_ci    int disabled;           /* 1 is this mapping is disabled by a negative map */
76cabdff1aSopenharmony_ci    int file_index;
77cabdff1aSopenharmony_ci    int stream_index;
78cabdff1aSopenharmony_ci    int sync_file_index;
79cabdff1aSopenharmony_ci    int sync_stream_index;
80cabdff1aSopenharmony_ci    char *linklabel;       /* name of an output link, for mapping lavfi outputs */
81cabdff1aSopenharmony_ci} StreamMap;
82cabdff1aSopenharmony_ci
83cabdff1aSopenharmony_citypedef struct {
84cabdff1aSopenharmony_ci    int  file_idx,  stream_idx,  channel_idx; // input
85cabdff1aSopenharmony_ci    int ofile_idx, ostream_idx;               // output
86cabdff1aSopenharmony_ci} AudioChannelMap;
87cabdff1aSopenharmony_ci
88cabdff1aSopenharmony_citypedef struct OptionsContext {
89cabdff1aSopenharmony_ci    OptionGroup *g;
90cabdff1aSopenharmony_ci
91cabdff1aSopenharmony_ci    /* input/output options */
92cabdff1aSopenharmony_ci    int64_t start_time;
93cabdff1aSopenharmony_ci    int64_t start_time_eof;
94cabdff1aSopenharmony_ci    int seek_timestamp;
95cabdff1aSopenharmony_ci    const char *format;
96cabdff1aSopenharmony_ci
97cabdff1aSopenharmony_ci    SpecifierOpt *codec_names;
98cabdff1aSopenharmony_ci    int        nb_codec_names;
99cabdff1aSopenharmony_ci    SpecifierOpt *audio_ch_layouts;
100cabdff1aSopenharmony_ci    int        nb_audio_ch_layouts;
101cabdff1aSopenharmony_ci    SpecifierOpt *audio_channels;
102cabdff1aSopenharmony_ci    int        nb_audio_channels;
103cabdff1aSopenharmony_ci    SpecifierOpt *audio_sample_rate;
104cabdff1aSopenharmony_ci    int        nb_audio_sample_rate;
105cabdff1aSopenharmony_ci    SpecifierOpt *frame_rates;
106cabdff1aSopenharmony_ci    int        nb_frame_rates;
107cabdff1aSopenharmony_ci    SpecifierOpt *max_frame_rates;
108cabdff1aSopenharmony_ci    int        nb_max_frame_rates;
109cabdff1aSopenharmony_ci    SpecifierOpt *frame_sizes;
110cabdff1aSopenharmony_ci    int        nb_frame_sizes;
111cabdff1aSopenharmony_ci    SpecifierOpt *frame_pix_fmts;
112cabdff1aSopenharmony_ci    int        nb_frame_pix_fmts;
113cabdff1aSopenharmony_ci
114cabdff1aSopenharmony_ci    /* input options */
115cabdff1aSopenharmony_ci    int64_t input_ts_offset;
116cabdff1aSopenharmony_ci    int loop;
117cabdff1aSopenharmony_ci    int rate_emu;
118cabdff1aSopenharmony_ci    float readrate;
119cabdff1aSopenharmony_ci    int accurate_seek;
120cabdff1aSopenharmony_ci    int thread_queue_size;
121cabdff1aSopenharmony_ci    int input_sync_ref;
122cabdff1aSopenharmony_ci
123cabdff1aSopenharmony_ci    SpecifierOpt *ts_scale;
124cabdff1aSopenharmony_ci    int        nb_ts_scale;
125cabdff1aSopenharmony_ci    SpecifierOpt *dump_attachment;
126cabdff1aSopenharmony_ci    int        nb_dump_attachment;
127cabdff1aSopenharmony_ci    SpecifierOpt *hwaccels;
128cabdff1aSopenharmony_ci    int        nb_hwaccels;
129cabdff1aSopenharmony_ci    SpecifierOpt *hwaccel_devices;
130cabdff1aSopenharmony_ci    int        nb_hwaccel_devices;
131cabdff1aSopenharmony_ci    SpecifierOpt *hwaccel_output_formats;
132cabdff1aSopenharmony_ci    int        nb_hwaccel_output_formats;
133cabdff1aSopenharmony_ci    SpecifierOpt *autorotate;
134cabdff1aSopenharmony_ci    int        nb_autorotate;
135cabdff1aSopenharmony_ci
136cabdff1aSopenharmony_ci    /* output options */
137cabdff1aSopenharmony_ci    StreamMap *stream_maps;
138cabdff1aSopenharmony_ci    int     nb_stream_maps;
139cabdff1aSopenharmony_ci    AudioChannelMap *audio_channel_maps; /* one info entry per -map_channel */
140cabdff1aSopenharmony_ci    int           nb_audio_channel_maps; /* number of (valid) -map_channel settings */
141cabdff1aSopenharmony_ci    int metadata_global_manual;
142cabdff1aSopenharmony_ci    int metadata_streams_manual;
143cabdff1aSopenharmony_ci    int metadata_chapters_manual;
144cabdff1aSopenharmony_ci    const char **attachments;
145cabdff1aSopenharmony_ci    int       nb_attachments;
146cabdff1aSopenharmony_ci
147cabdff1aSopenharmony_ci    int chapters_input_file;
148cabdff1aSopenharmony_ci
149cabdff1aSopenharmony_ci    int64_t recording_time;
150cabdff1aSopenharmony_ci    int64_t stop_time;
151cabdff1aSopenharmony_ci    uint64_t limit_filesize;
152cabdff1aSopenharmony_ci    float mux_preload;
153cabdff1aSopenharmony_ci    float mux_max_delay;
154cabdff1aSopenharmony_ci    int shortest;
155cabdff1aSopenharmony_ci    int bitexact;
156cabdff1aSopenharmony_ci
157cabdff1aSopenharmony_ci    int video_disable;
158cabdff1aSopenharmony_ci    int audio_disable;
159cabdff1aSopenharmony_ci    int subtitle_disable;
160cabdff1aSopenharmony_ci    int data_disable;
161cabdff1aSopenharmony_ci
162cabdff1aSopenharmony_ci    /* indexed by output file stream index */
163cabdff1aSopenharmony_ci    int   *streamid_map;
164cabdff1aSopenharmony_ci    int nb_streamid_map;
165cabdff1aSopenharmony_ci
166cabdff1aSopenharmony_ci    SpecifierOpt *metadata;
167cabdff1aSopenharmony_ci    int        nb_metadata;
168cabdff1aSopenharmony_ci    SpecifierOpt *max_frames;
169cabdff1aSopenharmony_ci    int        nb_max_frames;
170cabdff1aSopenharmony_ci    SpecifierOpt *bitstream_filters;
171cabdff1aSopenharmony_ci    int        nb_bitstream_filters;
172cabdff1aSopenharmony_ci    SpecifierOpt *codec_tags;
173cabdff1aSopenharmony_ci    int        nb_codec_tags;
174cabdff1aSopenharmony_ci    SpecifierOpt *sample_fmts;
175cabdff1aSopenharmony_ci    int        nb_sample_fmts;
176cabdff1aSopenharmony_ci    SpecifierOpt *qscale;
177cabdff1aSopenharmony_ci    int        nb_qscale;
178cabdff1aSopenharmony_ci    SpecifierOpt *forced_key_frames;
179cabdff1aSopenharmony_ci    int        nb_forced_key_frames;
180cabdff1aSopenharmony_ci    SpecifierOpt *fps_mode;
181cabdff1aSopenharmony_ci    int        nb_fps_mode;
182cabdff1aSopenharmony_ci    SpecifierOpt *force_fps;
183cabdff1aSopenharmony_ci    int        nb_force_fps;
184cabdff1aSopenharmony_ci    SpecifierOpt *frame_aspect_ratios;
185cabdff1aSopenharmony_ci    int        nb_frame_aspect_ratios;
186cabdff1aSopenharmony_ci    SpecifierOpt *rc_overrides;
187cabdff1aSopenharmony_ci    int        nb_rc_overrides;
188cabdff1aSopenharmony_ci    SpecifierOpt *intra_matrices;
189cabdff1aSopenharmony_ci    int        nb_intra_matrices;
190cabdff1aSopenharmony_ci    SpecifierOpt *inter_matrices;
191cabdff1aSopenharmony_ci    int        nb_inter_matrices;
192cabdff1aSopenharmony_ci    SpecifierOpt *chroma_intra_matrices;
193cabdff1aSopenharmony_ci    int        nb_chroma_intra_matrices;
194cabdff1aSopenharmony_ci    SpecifierOpt *top_field_first;
195cabdff1aSopenharmony_ci    int        nb_top_field_first;
196cabdff1aSopenharmony_ci    SpecifierOpt *metadata_map;
197cabdff1aSopenharmony_ci    int        nb_metadata_map;
198cabdff1aSopenharmony_ci    SpecifierOpt *presets;
199cabdff1aSopenharmony_ci    int        nb_presets;
200cabdff1aSopenharmony_ci    SpecifierOpt *copy_initial_nonkeyframes;
201cabdff1aSopenharmony_ci    int        nb_copy_initial_nonkeyframes;
202cabdff1aSopenharmony_ci    SpecifierOpt *copy_prior_start;
203cabdff1aSopenharmony_ci    int        nb_copy_prior_start;
204cabdff1aSopenharmony_ci    SpecifierOpt *filters;
205cabdff1aSopenharmony_ci    int        nb_filters;
206cabdff1aSopenharmony_ci    SpecifierOpt *filter_scripts;
207cabdff1aSopenharmony_ci    int        nb_filter_scripts;
208cabdff1aSopenharmony_ci    SpecifierOpt *reinit_filters;
209cabdff1aSopenharmony_ci    int        nb_reinit_filters;
210cabdff1aSopenharmony_ci    SpecifierOpt *fix_sub_duration;
211cabdff1aSopenharmony_ci    int        nb_fix_sub_duration;
212cabdff1aSopenharmony_ci    SpecifierOpt *canvas_sizes;
213cabdff1aSopenharmony_ci    int        nb_canvas_sizes;
214cabdff1aSopenharmony_ci    SpecifierOpt *pass;
215cabdff1aSopenharmony_ci    int        nb_pass;
216cabdff1aSopenharmony_ci    SpecifierOpt *passlogfiles;
217cabdff1aSopenharmony_ci    int        nb_passlogfiles;
218cabdff1aSopenharmony_ci    SpecifierOpt *max_muxing_queue_size;
219cabdff1aSopenharmony_ci    int        nb_max_muxing_queue_size;
220cabdff1aSopenharmony_ci    SpecifierOpt *muxing_queue_data_threshold;
221cabdff1aSopenharmony_ci    int        nb_muxing_queue_data_threshold;
222cabdff1aSopenharmony_ci    SpecifierOpt *guess_layout_max;
223cabdff1aSopenharmony_ci    int        nb_guess_layout_max;
224cabdff1aSopenharmony_ci    SpecifierOpt *apad;
225cabdff1aSopenharmony_ci    int        nb_apad;
226cabdff1aSopenharmony_ci    SpecifierOpt *discard;
227cabdff1aSopenharmony_ci    int        nb_discard;
228cabdff1aSopenharmony_ci    SpecifierOpt *disposition;
229cabdff1aSopenharmony_ci    int        nb_disposition;
230cabdff1aSopenharmony_ci    SpecifierOpt *program;
231cabdff1aSopenharmony_ci    int        nb_program;
232cabdff1aSopenharmony_ci    SpecifierOpt *time_bases;
233cabdff1aSopenharmony_ci    int        nb_time_bases;
234cabdff1aSopenharmony_ci    SpecifierOpt *enc_time_bases;
235cabdff1aSopenharmony_ci    int        nb_enc_time_bases;
236cabdff1aSopenharmony_ci    SpecifierOpt *autoscale;
237cabdff1aSopenharmony_ci    int        nb_autoscale;
238cabdff1aSopenharmony_ci    SpecifierOpt *bits_per_raw_sample;
239cabdff1aSopenharmony_ci    int        nb_bits_per_raw_sample;
240cabdff1aSopenharmony_ci} OptionsContext;
241cabdff1aSopenharmony_ci
242cabdff1aSopenharmony_citypedef struct InputFilter {
243cabdff1aSopenharmony_ci    AVFilterContext    *filter;
244cabdff1aSopenharmony_ci    struct InputStream *ist;
245cabdff1aSopenharmony_ci    struct FilterGraph *graph;
246cabdff1aSopenharmony_ci    uint8_t            *name;
247cabdff1aSopenharmony_ci    enum AVMediaType    type;   // AVMEDIA_TYPE_SUBTITLE for sub2video
248cabdff1aSopenharmony_ci
249cabdff1aSopenharmony_ci    AVFifo *frame_queue;
250cabdff1aSopenharmony_ci
251cabdff1aSopenharmony_ci    // parameters configured for this input
252cabdff1aSopenharmony_ci    int format;
253cabdff1aSopenharmony_ci
254cabdff1aSopenharmony_ci    int width, height;
255cabdff1aSopenharmony_ci    AVRational sample_aspect_ratio;
256cabdff1aSopenharmony_ci
257cabdff1aSopenharmony_ci    int sample_rate;
258cabdff1aSopenharmony_ci    AVChannelLayout ch_layout;
259cabdff1aSopenharmony_ci
260cabdff1aSopenharmony_ci    AVBufferRef *hw_frames_ctx;
261cabdff1aSopenharmony_ci    int32_t *displaymatrix;
262cabdff1aSopenharmony_ci
263cabdff1aSopenharmony_ci    int eof;
264cabdff1aSopenharmony_ci} InputFilter;
265cabdff1aSopenharmony_ci
266cabdff1aSopenharmony_citypedef struct OutputFilter {
267cabdff1aSopenharmony_ci    AVFilterContext     *filter;
268cabdff1aSopenharmony_ci    struct OutputStream *ost;
269cabdff1aSopenharmony_ci    struct FilterGraph  *graph;
270cabdff1aSopenharmony_ci    uint8_t             *name;
271cabdff1aSopenharmony_ci
272cabdff1aSopenharmony_ci    /* temporary storage until stream maps are processed */
273cabdff1aSopenharmony_ci    AVFilterInOut       *out_tmp;
274cabdff1aSopenharmony_ci    enum AVMediaType     type;
275cabdff1aSopenharmony_ci
276cabdff1aSopenharmony_ci    /* desired output stream properties */
277cabdff1aSopenharmony_ci    int width, height;
278cabdff1aSopenharmony_ci    AVRational frame_rate;
279cabdff1aSopenharmony_ci    int format;
280cabdff1aSopenharmony_ci    int sample_rate;
281cabdff1aSopenharmony_ci    AVChannelLayout ch_layout;
282cabdff1aSopenharmony_ci
283cabdff1aSopenharmony_ci    // those are only set if no format is specified and the encoder gives us multiple options
284cabdff1aSopenharmony_ci    // They point directly to the relevant lists of the encoder.
285cabdff1aSopenharmony_ci    const int *formats;
286cabdff1aSopenharmony_ci    const AVChannelLayout *ch_layouts;
287cabdff1aSopenharmony_ci    const int *sample_rates;
288cabdff1aSopenharmony_ci} OutputFilter;
289cabdff1aSopenharmony_ci
290cabdff1aSopenharmony_citypedef struct FilterGraph {
291cabdff1aSopenharmony_ci    int            index;
292cabdff1aSopenharmony_ci    const char    *graph_desc;
293cabdff1aSopenharmony_ci
294cabdff1aSopenharmony_ci    AVFilterGraph *graph;
295cabdff1aSopenharmony_ci    int reconfiguration;
296cabdff1aSopenharmony_ci    // true when the filtergraph contains only meta filters
297cabdff1aSopenharmony_ci    // that do not modify the frame data
298cabdff1aSopenharmony_ci    int is_meta;
299cabdff1aSopenharmony_ci
300cabdff1aSopenharmony_ci    InputFilter   **inputs;
301cabdff1aSopenharmony_ci    int          nb_inputs;
302cabdff1aSopenharmony_ci    OutputFilter **outputs;
303cabdff1aSopenharmony_ci    int         nb_outputs;
304cabdff1aSopenharmony_ci} FilterGraph;
305cabdff1aSopenharmony_ci
306cabdff1aSopenharmony_citypedef struct InputStream {
307cabdff1aSopenharmony_ci    int file_index;
308cabdff1aSopenharmony_ci    AVStream *st;
309cabdff1aSopenharmony_ci    int discard;             /* true if stream data should be discarded */
310cabdff1aSopenharmony_ci    int user_set_discard;
311cabdff1aSopenharmony_ci    int decoding_needed;     /* non zero if the packets must be decoded in 'raw_fifo', see DECODING_FOR_* */
312cabdff1aSopenharmony_ci#define DECODING_FOR_OST    1
313cabdff1aSopenharmony_ci#define DECODING_FOR_FILTER 2
314cabdff1aSopenharmony_ci    int processing_needed;   /* non zero if the packets must be processed */
315cabdff1aSopenharmony_ci
316cabdff1aSopenharmony_ci    AVCodecContext *dec_ctx;
317cabdff1aSopenharmony_ci    const AVCodec *dec;
318cabdff1aSopenharmony_ci    AVFrame *decoded_frame;
319cabdff1aSopenharmony_ci    AVPacket *pkt;
320cabdff1aSopenharmony_ci
321cabdff1aSopenharmony_ci    int64_t       prev_pkt_pts;
322cabdff1aSopenharmony_ci    int64_t       start;     /* time when read started */
323cabdff1aSopenharmony_ci    /* predicted dts of the next packet read for this stream or (when there are
324cabdff1aSopenharmony_ci     * several frames in a packet) of the next frame in current packet (in AV_TIME_BASE units) */
325cabdff1aSopenharmony_ci    int64_t       next_dts;
326cabdff1aSopenharmony_ci    int64_t first_dts;       ///< dts of the first packet read for this stream (in AV_TIME_BASE units)
327cabdff1aSopenharmony_ci    int64_t       dts;       ///< dts of the last packet read for this stream (in AV_TIME_BASE units)
328cabdff1aSopenharmony_ci
329cabdff1aSopenharmony_ci    int64_t       next_pts;  ///< synthetic pts for the next decode frame (in AV_TIME_BASE units)
330cabdff1aSopenharmony_ci    int64_t       pts;       ///< current pts of the decoded frame  (in AV_TIME_BASE units)
331cabdff1aSopenharmony_ci    int           wrap_correction_done;
332cabdff1aSopenharmony_ci
333cabdff1aSopenharmony_ci    int64_t filter_in_rescale_delta_last;
334cabdff1aSopenharmony_ci
335cabdff1aSopenharmony_ci    int64_t min_pts; /* pts with the smallest value in a current stream */
336cabdff1aSopenharmony_ci    int64_t max_pts; /* pts with the higher value in a current stream */
337cabdff1aSopenharmony_ci
338cabdff1aSopenharmony_ci    // when forcing constant input framerate through -r,
339cabdff1aSopenharmony_ci    // this contains the pts that will be given to the next decoded frame
340cabdff1aSopenharmony_ci    int64_t cfr_next_pts;
341cabdff1aSopenharmony_ci
342cabdff1aSopenharmony_ci    int64_t nb_samples; /* number of samples in the last decoded audio frame before looping */
343cabdff1aSopenharmony_ci
344cabdff1aSopenharmony_ci    double ts_scale;
345cabdff1aSopenharmony_ci    int saw_first_ts;
346cabdff1aSopenharmony_ci    AVDictionary *decoder_opts;
347cabdff1aSopenharmony_ci    AVRational framerate;               /* framerate forced with -r */
348cabdff1aSopenharmony_ci    int top_field_first;
349cabdff1aSopenharmony_ci    int guess_layout_max;
350cabdff1aSopenharmony_ci
351cabdff1aSopenharmony_ci    int autorotate;
352cabdff1aSopenharmony_ci
353cabdff1aSopenharmony_ci    int fix_sub_duration;
354cabdff1aSopenharmony_ci    struct { /* previous decoded subtitle and related variables */
355cabdff1aSopenharmony_ci        int got_output;
356cabdff1aSopenharmony_ci        int ret;
357cabdff1aSopenharmony_ci        AVSubtitle subtitle;
358cabdff1aSopenharmony_ci    } prev_sub;
359cabdff1aSopenharmony_ci
360cabdff1aSopenharmony_ci    struct sub2video {
361cabdff1aSopenharmony_ci        int64_t last_pts;
362cabdff1aSopenharmony_ci        int64_t end_pts;
363cabdff1aSopenharmony_ci        AVFifo *sub_queue;    ///< queue of AVSubtitle* before filter init
364cabdff1aSopenharmony_ci        AVFrame *frame;
365cabdff1aSopenharmony_ci        int w, h;
366cabdff1aSopenharmony_ci        unsigned int initialize; ///< marks if sub2video_update should force an initialization
367cabdff1aSopenharmony_ci    } sub2video;
368cabdff1aSopenharmony_ci
369cabdff1aSopenharmony_ci    /* decoded data from this stream goes into all those filters
370cabdff1aSopenharmony_ci     * currently video and audio only */
371cabdff1aSopenharmony_ci    InputFilter **filters;
372cabdff1aSopenharmony_ci    int        nb_filters;
373cabdff1aSopenharmony_ci
374cabdff1aSopenharmony_ci    int reinit_filters;
375cabdff1aSopenharmony_ci
376cabdff1aSopenharmony_ci    /* hwaccel options */
377cabdff1aSopenharmony_ci    enum HWAccelID hwaccel_id;
378cabdff1aSopenharmony_ci    enum AVHWDeviceType hwaccel_device_type;
379cabdff1aSopenharmony_ci    char  *hwaccel_device;
380cabdff1aSopenharmony_ci    enum AVPixelFormat hwaccel_output_format;
381cabdff1aSopenharmony_ci
382cabdff1aSopenharmony_ci    /* hwaccel context */
383cabdff1aSopenharmony_ci    void  *hwaccel_ctx;
384cabdff1aSopenharmony_ci    void (*hwaccel_uninit)(AVCodecContext *s);
385cabdff1aSopenharmony_ci    int  (*hwaccel_retrieve_data)(AVCodecContext *s, AVFrame *frame);
386cabdff1aSopenharmony_ci    enum AVPixelFormat hwaccel_pix_fmt;
387cabdff1aSopenharmony_ci    enum AVPixelFormat hwaccel_retrieved_pix_fmt;
388cabdff1aSopenharmony_ci
389cabdff1aSopenharmony_ci    /* stats */
390cabdff1aSopenharmony_ci    // combined size of all the packets read
391cabdff1aSopenharmony_ci    uint64_t data_size;
392cabdff1aSopenharmony_ci    /* number of packets successfully read for this stream */
393cabdff1aSopenharmony_ci    uint64_t nb_packets;
394cabdff1aSopenharmony_ci    // number of frames/samples retrieved from the decoder
395cabdff1aSopenharmony_ci    uint64_t frames_decoded;
396cabdff1aSopenharmony_ci    uint64_t samples_decoded;
397cabdff1aSopenharmony_ci
398cabdff1aSopenharmony_ci    int64_t *dts_buffer;
399cabdff1aSopenharmony_ci    int nb_dts_buffer;
400cabdff1aSopenharmony_ci
401cabdff1aSopenharmony_ci    int got_output;
402cabdff1aSopenharmony_ci} InputStream;
403cabdff1aSopenharmony_ci
404cabdff1aSopenharmony_citypedef struct InputFile {
405cabdff1aSopenharmony_ci    AVFormatContext *ctx;
406cabdff1aSopenharmony_ci    int eof_reached;      /* true if eof reached */
407cabdff1aSopenharmony_ci    int eagain;           /* true if last read attempt returned EAGAIN */
408cabdff1aSopenharmony_ci    int ist_index;        /* index of first stream in input_streams */
409cabdff1aSopenharmony_ci    int loop;             /* set number of times input stream should be looped */
410cabdff1aSopenharmony_ci    int64_t duration;     /* actual duration of the longest stream in a file
411cabdff1aSopenharmony_ci                             at the moment when looping happens */
412cabdff1aSopenharmony_ci    AVRational time_base; /* time base of the duration */
413cabdff1aSopenharmony_ci    int64_t input_ts_offset;
414cabdff1aSopenharmony_ci    int input_sync_ref;
415cabdff1aSopenharmony_ci
416cabdff1aSopenharmony_ci    int64_t ts_offset;
417cabdff1aSopenharmony_ci    int64_t last_ts;
418cabdff1aSopenharmony_ci    int64_t start_time;   /* user-specified start time in AV_TIME_BASE or AV_NOPTS_VALUE */
419cabdff1aSopenharmony_ci    int64_t recording_time;
420cabdff1aSopenharmony_ci    int nb_streams;       /* number of stream that ffmpeg is aware of; may be different
421cabdff1aSopenharmony_ci                             from ctx.nb_streams if new streams appear during av_read_frame() */
422cabdff1aSopenharmony_ci    int nb_streams_warn;  /* number of streams that the user was warned of */
423cabdff1aSopenharmony_ci    int rate_emu;
424cabdff1aSopenharmony_ci    float readrate;
425cabdff1aSopenharmony_ci    int accurate_seek;
426cabdff1aSopenharmony_ci
427cabdff1aSopenharmony_ci    AVPacket *pkt;
428cabdff1aSopenharmony_ci
429cabdff1aSopenharmony_ci#if HAVE_THREADS
430cabdff1aSopenharmony_ci    AVThreadMessageQueue *in_thread_queue;
431cabdff1aSopenharmony_ci    pthread_t thread;           /* thread reading from this file */
432cabdff1aSopenharmony_ci    int non_blocking;           /* reading packets from the thread should not block */
433cabdff1aSopenharmony_ci    int joined;                 /* the thread has been joined */
434cabdff1aSopenharmony_ci    int thread_queue_size;      /* maximum number of queued packets */
435cabdff1aSopenharmony_ci#endif
436cabdff1aSopenharmony_ci} InputFile;
437cabdff1aSopenharmony_ci
438cabdff1aSopenharmony_cienum forced_keyframes_const {
439cabdff1aSopenharmony_ci    FKF_N,
440cabdff1aSopenharmony_ci    FKF_N_FORCED,
441cabdff1aSopenharmony_ci    FKF_PREV_FORCED_N,
442cabdff1aSopenharmony_ci    FKF_PREV_FORCED_T,
443cabdff1aSopenharmony_ci    FKF_T,
444cabdff1aSopenharmony_ci    FKF_NB
445cabdff1aSopenharmony_ci};
446cabdff1aSopenharmony_ci
447cabdff1aSopenharmony_ci#define ABORT_ON_FLAG_EMPTY_OUTPUT        (1 <<  0)
448cabdff1aSopenharmony_ci#define ABORT_ON_FLAG_EMPTY_OUTPUT_STREAM (1 <<  1)
449cabdff1aSopenharmony_ci
450cabdff1aSopenharmony_ciextern const char *const forced_keyframes_const_names[];
451cabdff1aSopenharmony_ci
452cabdff1aSopenharmony_citypedef enum {
453cabdff1aSopenharmony_ci    ENCODER_FINISHED = 1,
454cabdff1aSopenharmony_ci    MUXER_FINISHED = 2,
455cabdff1aSopenharmony_ci} OSTFinished ;
456cabdff1aSopenharmony_ci
457cabdff1aSopenharmony_citypedef struct OutputStream {
458cabdff1aSopenharmony_ci    int file_index;          /* file index */
459cabdff1aSopenharmony_ci    int index;               /* stream index in the output file */
460cabdff1aSopenharmony_ci    int source_index;        /* InputStream index */
461cabdff1aSopenharmony_ci    AVStream *st;            /* stream in the output file */
462cabdff1aSopenharmony_ci    int encoding_needed;     /* true if encoding needed for this stream */
463cabdff1aSopenharmony_ci    int64_t frame_number;
464cabdff1aSopenharmony_ci    /* input pts and corresponding output pts
465cabdff1aSopenharmony_ci       for A/V sync */
466cabdff1aSopenharmony_ci    struct InputStream *sync_ist; /* input stream to sync against */
467cabdff1aSopenharmony_ci    int64_t sync_opts;       /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
468cabdff1aSopenharmony_ci    /* pts of the first frame encoded for this stream, used for limiting
469cabdff1aSopenharmony_ci     * recording time */
470cabdff1aSopenharmony_ci    int64_t first_pts;
471cabdff1aSopenharmony_ci    /* dts of the last packet sent to the muxer */
472cabdff1aSopenharmony_ci    int64_t last_mux_dts;
473cabdff1aSopenharmony_ci    // the timebase of the packets sent to the muxer
474cabdff1aSopenharmony_ci    AVRational mux_timebase;
475cabdff1aSopenharmony_ci    AVRational enc_timebase;
476cabdff1aSopenharmony_ci
477cabdff1aSopenharmony_ci    AVBSFContext            *bsf_ctx;
478cabdff1aSopenharmony_ci
479cabdff1aSopenharmony_ci    AVCodecContext *enc_ctx;
480cabdff1aSopenharmony_ci    AVCodecParameters *ref_par; /* associated input codec parameters with encoders options applied */
481cabdff1aSopenharmony_ci    const AVCodec *enc;
482cabdff1aSopenharmony_ci    int64_t max_frames;
483cabdff1aSopenharmony_ci    AVFrame *filtered_frame;
484cabdff1aSopenharmony_ci    AVFrame *last_frame;
485cabdff1aSopenharmony_ci    AVPacket *pkt;
486cabdff1aSopenharmony_ci    int64_t last_dropped;
487cabdff1aSopenharmony_ci    int64_t last_nb0_frames[3];
488cabdff1aSopenharmony_ci
489cabdff1aSopenharmony_ci    void  *hwaccel_ctx;
490cabdff1aSopenharmony_ci
491cabdff1aSopenharmony_ci    /* video only */
492cabdff1aSopenharmony_ci    AVRational frame_rate;
493cabdff1aSopenharmony_ci    AVRational max_frame_rate;
494cabdff1aSopenharmony_ci    enum VideoSyncMethod vsync_method;
495cabdff1aSopenharmony_ci    int is_cfr;
496cabdff1aSopenharmony_ci    const char *fps_mode;
497cabdff1aSopenharmony_ci    int force_fps;
498cabdff1aSopenharmony_ci    int top_field_first;
499cabdff1aSopenharmony_ci    int rotate_overridden;
500cabdff1aSopenharmony_ci    int autoscale;
501cabdff1aSopenharmony_ci    int bits_per_raw_sample;
502cabdff1aSopenharmony_ci    double rotate_override_value;
503cabdff1aSopenharmony_ci
504cabdff1aSopenharmony_ci    AVRational frame_aspect_ratio;
505cabdff1aSopenharmony_ci
506cabdff1aSopenharmony_ci    /* forced key frames */
507cabdff1aSopenharmony_ci    int64_t forced_kf_ref_pts;
508cabdff1aSopenharmony_ci    int64_t *forced_kf_pts;
509cabdff1aSopenharmony_ci    int forced_kf_count;
510cabdff1aSopenharmony_ci    int forced_kf_index;
511cabdff1aSopenharmony_ci    char *forced_keyframes;
512cabdff1aSopenharmony_ci    AVExpr *forced_keyframes_pexpr;
513cabdff1aSopenharmony_ci    double forced_keyframes_expr_const_values[FKF_NB];
514cabdff1aSopenharmony_ci    int dropped_keyframe;
515cabdff1aSopenharmony_ci
516cabdff1aSopenharmony_ci    /* audio only */
517cabdff1aSopenharmony_ci    int *audio_channels_map;             /* list of the channels id to pick from the source stream */
518cabdff1aSopenharmony_ci    int audio_channels_mapped;           /* number of channels in audio_channels_map */
519cabdff1aSopenharmony_ci
520cabdff1aSopenharmony_ci    char *logfile_prefix;
521cabdff1aSopenharmony_ci    FILE *logfile;
522cabdff1aSopenharmony_ci
523cabdff1aSopenharmony_ci    OutputFilter *filter;
524cabdff1aSopenharmony_ci    char *avfilter;
525cabdff1aSopenharmony_ci    char *filters;         ///< filtergraph associated to the -filter option
526cabdff1aSopenharmony_ci    char *filters_script;  ///< filtergraph script associated to the -filter_script option
527cabdff1aSopenharmony_ci
528cabdff1aSopenharmony_ci    AVDictionary *encoder_opts;
529cabdff1aSopenharmony_ci    AVDictionary *sws_dict;
530cabdff1aSopenharmony_ci    AVDictionary *swr_opts;
531cabdff1aSopenharmony_ci    char *apad;
532cabdff1aSopenharmony_ci    OSTFinished finished;        /* no more packets should be written for this stream */
533cabdff1aSopenharmony_ci    int unavailable;                     /* true if the steram is unavailable (possibly temporarily) */
534cabdff1aSopenharmony_ci    int stream_copy;
535cabdff1aSopenharmony_ci
536cabdff1aSopenharmony_ci    // init_output_stream() has been called for this stream
537cabdff1aSopenharmony_ci    // The encoder and the bitstream filters have been initialized and the stream
538cabdff1aSopenharmony_ci    // parameters are set in the AVStream.
539cabdff1aSopenharmony_ci    int initialized;
540cabdff1aSopenharmony_ci
541cabdff1aSopenharmony_ci    int inputs_done;
542cabdff1aSopenharmony_ci
543cabdff1aSopenharmony_ci    const char *attachment_filename;
544cabdff1aSopenharmony_ci    int streamcopy_started;
545cabdff1aSopenharmony_ci    int copy_initial_nonkeyframes;
546cabdff1aSopenharmony_ci    int copy_prior_start;
547cabdff1aSopenharmony_ci    char *disposition;
548cabdff1aSopenharmony_ci
549cabdff1aSopenharmony_ci    int keep_pix_fmt;
550cabdff1aSopenharmony_ci
551cabdff1aSopenharmony_ci    /* stats */
552cabdff1aSopenharmony_ci    // combined size of all the packets written
553cabdff1aSopenharmony_ci    uint64_t data_size;
554cabdff1aSopenharmony_ci    // number of packets send to the muxer
555cabdff1aSopenharmony_ci    uint64_t packets_written;
556cabdff1aSopenharmony_ci    // number of frames/samples sent to the encoder
557cabdff1aSopenharmony_ci    uint64_t frames_encoded;
558cabdff1aSopenharmony_ci    uint64_t samples_encoded;
559cabdff1aSopenharmony_ci    // number of packets received from the encoder
560cabdff1aSopenharmony_ci    uint64_t packets_encoded;
561cabdff1aSopenharmony_ci
562cabdff1aSopenharmony_ci    /* packet quality factor */
563cabdff1aSopenharmony_ci    int quality;
564cabdff1aSopenharmony_ci
565cabdff1aSopenharmony_ci    int max_muxing_queue_size;
566cabdff1aSopenharmony_ci
567cabdff1aSopenharmony_ci    /* the packets are buffered here until the muxer is ready to be initialized */
568cabdff1aSopenharmony_ci    AVFifo *muxing_queue;
569cabdff1aSopenharmony_ci
570cabdff1aSopenharmony_ci    /*
571cabdff1aSopenharmony_ci     * The size of the AVPackets' buffers in queue.
572cabdff1aSopenharmony_ci     * Updated when a packet is either pushed or pulled from the queue.
573cabdff1aSopenharmony_ci     */
574cabdff1aSopenharmony_ci    size_t muxing_queue_data_size;
575cabdff1aSopenharmony_ci
576cabdff1aSopenharmony_ci    /* Threshold after which max_muxing_queue_size will be in effect */
577cabdff1aSopenharmony_ci    size_t muxing_queue_data_threshold;
578cabdff1aSopenharmony_ci
579cabdff1aSopenharmony_ci    /* packet picture type */
580cabdff1aSopenharmony_ci    int pict_type;
581cabdff1aSopenharmony_ci
582cabdff1aSopenharmony_ci    /* frame encode sum of squared error values */
583cabdff1aSopenharmony_ci    int64_t error[4];
584cabdff1aSopenharmony_ci} OutputStream;
585cabdff1aSopenharmony_ci
586cabdff1aSopenharmony_citypedef struct OutputFile {
587cabdff1aSopenharmony_ci    int index;
588cabdff1aSopenharmony_ci
589cabdff1aSopenharmony_ci    const AVOutputFormat *format;
590cabdff1aSopenharmony_ci
591cabdff1aSopenharmony_ci    AVFormatContext *ctx;
592cabdff1aSopenharmony_ci    AVDictionary *opts;
593cabdff1aSopenharmony_ci    int ost_index;       /* index of the first stream in output_streams */
594cabdff1aSopenharmony_ci    int64_t recording_time;  ///< desired length of the resulting file in microseconds == AV_TIME_BASE units
595cabdff1aSopenharmony_ci    int64_t start_time;      ///< start time in microseconds == AV_TIME_BASE units
596cabdff1aSopenharmony_ci    uint64_t limit_filesize; /* filesize limit expressed in bytes */
597cabdff1aSopenharmony_ci
598cabdff1aSopenharmony_ci    int shortest;
599cabdff1aSopenharmony_ci
600cabdff1aSopenharmony_ci    int header_written;
601cabdff1aSopenharmony_ci} OutputFile;
602cabdff1aSopenharmony_ci
603cabdff1aSopenharmony_ciextern InputStream **input_streams;
604cabdff1aSopenharmony_ciextern int        nb_input_streams;
605cabdff1aSopenharmony_ciextern InputFile   **input_files;
606cabdff1aSopenharmony_ciextern int        nb_input_files;
607cabdff1aSopenharmony_ci
608cabdff1aSopenharmony_ciextern OutputStream **output_streams;
609cabdff1aSopenharmony_ciextern int         nb_output_streams;
610cabdff1aSopenharmony_ciextern OutputFile   **output_files;
611cabdff1aSopenharmony_ciextern int         nb_output_files;
612cabdff1aSopenharmony_ci
613cabdff1aSopenharmony_ciextern FilterGraph **filtergraphs;
614cabdff1aSopenharmony_ciextern int        nb_filtergraphs;
615cabdff1aSopenharmony_ci
616cabdff1aSopenharmony_ciextern char *vstats_filename;
617cabdff1aSopenharmony_ciextern char *sdp_filename;
618cabdff1aSopenharmony_ci
619cabdff1aSopenharmony_ciextern float audio_drift_threshold;
620cabdff1aSopenharmony_ciextern float dts_delta_threshold;
621cabdff1aSopenharmony_ciextern float dts_error_threshold;
622cabdff1aSopenharmony_ci
623cabdff1aSopenharmony_ciextern int audio_volume;
624cabdff1aSopenharmony_ciextern int audio_sync_method;
625cabdff1aSopenharmony_ciextern enum VideoSyncMethod video_sync_method;
626cabdff1aSopenharmony_ciextern float frame_drop_threshold;
627cabdff1aSopenharmony_ciextern int do_benchmark;
628cabdff1aSopenharmony_ciextern int do_benchmark_all;
629cabdff1aSopenharmony_ciextern int do_deinterlace;
630cabdff1aSopenharmony_ciextern int do_hex_dump;
631cabdff1aSopenharmony_ciextern int do_pkt_dump;
632cabdff1aSopenharmony_ciextern int copy_ts;
633cabdff1aSopenharmony_ciextern int start_at_zero;
634cabdff1aSopenharmony_ciextern int copy_tb;
635cabdff1aSopenharmony_ciextern int debug_ts;
636cabdff1aSopenharmony_ciextern int exit_on_error;
637cabdff1aSopenharmony_ciextern int abort_on_flags;
638cabdff1aSopenharmony_ciextern int print_stats;
639cabdff1aSopenharmony_ciextern int64_t stats_period;
640cabdff1aSopenharmony_ciextern int qp_hist;
641cabdff1aSopenharmony_ciextern int stdin_interaction;
642cabdff1aSopenharmony_ciextern int frame_bits_per_raw_sample;
643cabdff1aSopenharmony_ciextern AVIOContext *progress_avio;
644cabdff1aSopenharmony_ciextern float max_error_rate;
645cabdff1aSopenharmony_ci
646cabdff1aSopenharmony_ciextern char *filter_nbthreads;
647cabdff1aSopenharmony_ciextern int filter_complex_nbthreads;
648cabdff1aSopenharmony_ciextern int vstats_version;
649cabdff1aSopenharmony_ciextern int auto_conversion_filters;
650cabdff1aSopenharmony_ci
651cabdff1aSopenharmony_ciextern const AVIOInterruptCB int_cb;
652cabdff1aSopenharmony_ci
653cabdff1aSopenharmony_ciextern const OptionDef options[];
654cabdff1aSopenharmony_ci#if CONFIG_QSV
655cabdff1aSopenharmony_ciextern char *qsv_device;
656cabdff1aSopenharmony_ci#endif
657cabdff1aSopenharmony_ciextern HWDevice *filter_hw_device;
658cabdff1aSopenharmony_ci
659cabdff1aSopenharmony_ciextern int want_sdp;
660cabdff1aSopenharmony_ciextern unsigned nb_output_dumped;
661cabdff1aSopenharmony_ciextern int main_return_code;
662cabdff1aSopenharmony_ci
663cabdff1aSopenharmony_ci
664cabdff1aSopenharmony_civoid term_init(void);
665cabdff1aSopenharmony_civoid term_exit(void);
666cabdff1aSopenharmony_ci
667cabdff1aSopenharmony_civoid show_usage(void);
668cabdff1aSopenharmony_ci
669cabdff1aSopenharmony_civoid remove_avoptions(AVDictionary **a, AVDictionary *b);
670cabdff1aSopenharmony_civoid assert_avoptions(AVDictionary *m);
671cabdff1aSopenharmony_ci
672cabdff1aSopenharmony_ciint guess_input_channel_layout(InputStream *ist);
673cabdff1aSopenharmony_ci
674cabdff1aSopenharmony_ciint configure_filtergraph(FilterGraph *fg);
675cabdff1aSopenharmony_civoid check_filter_outputs(void);
676cabdff1aSopenharmony_ciint filtergraph_is_simple(FilterGraph *fg);
677cabdff1aSopenharmony_ciint init_simple_filtergraph(InputStream *ist, OutputStream *ost);
678cabdff1aSopenharmony_ciint init_complex_filtergraph(FilterGraph *fg);
679cabdff1aSopenharmony_ci
680cabdff1aSopenharmony_civoid sub2video_update(InputStream *ist, int64_t heartbeat_pts, AVSubtitle *sub);
681cabdff1aSopenharmony_ci
682cabdff1aSopenharmony_ciint ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame);
683cabdff1aSopenharmony_ci
684cabdff1aSopenharmony_ciint ffmpeg_parse_options(int argc, char **argv);
685cabdff1aSopenharmony_ci
686cabdff1aSopenharmony_ciint videotoolbox_init(AVCodecContext *s);
687cabdff1aSopenharmony_ciint qsv_init(AVCodecContext *s);
688cabdff1aSopenharmony_ci
689cabdff1aSopenharmony_ciHWDevice *hw_device_get_by_name(const char *name);
690cabdff1aSopenharmony_ciint hw_device_init_from_string(const char *arg, HWDevice **dev);
691cabdff1aSopenharmony_civoid hw_device_free_all(void);
692cabdff1aSopenharmony_ci
693cabdff1aSopenharmony_ciint hw_device_setup_for_decode(InputStream *ist);
694cabdff1aSopenharmony_ciint hw_device_setup_for_encode(OutputStream *ost);
695cabdff1aSopenharmony_ciint hw_device_setup_for_filter(FilterGraph *fg);
696cabdff1aSopenharmony_ci
697cabdff1aSopenharmony_ciint hwaccel_decode_init(AVCodecContext *avctx);
698cabdff1aSopenharmony_ci
699cabdff1aSopenharmony_ci/* open the muxer when all the streams are initialized */
700cabdff1aSopenharmony_ciint of_check_init(OutputFile *of);
701cabdff1aSopenharmony_ciint of_write_trailer(OutputFile *of);
702cabdff1aSopenharmony_civoid of_close(OutputFile **pof);
703cabdff1aSopenharmony_ci
704cabdff1aSopenharmony_civoid of_write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost,
705cabdff1aSopenharmony_ci                     int unqueue);
706cabdff1aSopenharmony_ci
707cabdff1aSopenharmony_ci#endif /* FFTOOLS_FFMPEG_H */
708