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