⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ffmpeg.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * FFmpeg main * Copyright (c) 2000-2003 Fabrice Bellard * * 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 */#include "config.h"#include <ctype.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <errno.h>#include <signal.h>#include <limits.h>#include "avformat.h"#include "avdevice.h"#include "swscale.h"#include "framehook.h"#include "opt.h"#include "fifo.h"#include "avstring.h"#include "os_support.h"#if !defined(HAVE_GETRUSAGE) && defined(HAVE_GETPROCESSTIMES)#include <windows.h>#endif#if defined(HAVE_TERMIOS_H)#include <unistd.h>#include <fcntl.h>#include <sys/ioctl.h>#include <sys/time.h>#include <termios.h>#include <sys/resource.h>#elif defined(HAVE_CONIO_H)#include <conio.h>#endif#undef time //needed because HAVE_AV_CONFIG_H is defined on top#include <time.h>#include "version.h"#include "cmdutils.h"#undef NDEBUG#include <assert.h>#if !defined(INFINITY) && defined(HUGE_VAL)#define INFINITY HUGE_VAL#endif#undef exitstatic const char program_name[] = "FFmpeg";static const int program_birth_year = 2000;/* select an input stream for an output stream */typedef struct AVStreamMap {    int file_index;    int stream_index;    int sync_file_index;    int sync_stream_index;} AVStreamMap;/** select an input file for an output file */typedef struct AVMetaDataMap {    int out_file;    int in_file;} AVMetaDataMap;extern const OptionDef options[];#define MAX_FILES 20static AVFormatContext *input_files[MAX_FILES];static int64_t input_files_ts_offset[MAX_FILES];static int nb_input_files = 0;static AVFormatContext *output_files[MAX_FILES];static int nb_output_files = 0;static AVStreamMap stream_maps[MAX_FILES];static int nb_stream_maps;static AVMetaDataMap meta_data_maps[MAX_FILES];static int nb_meta_data_maps;static AVInputFormat *file_iformat;static AVOutputFormat *file_oformat;static int frame_width  = 0;static int frame_height = 0;static float frame_aspect_ratio = 0;static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;static int frame_padtop  = 0;static int frame_padbottom = 0;static int frame_padleft  = 0;static int frame_padright = 0;static int padcolor[3] = {16,128,128}; /* default to black */static int frame_topBand  = 0;static int frame_bottomBand = 0;static int frame_leftBand  = 0;static int frame_rightBand = 0;static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};static AVRational frame_rate = (AVRational) {0,0};static float video_qscale = 0;static int video_qdiff = 3;static uint16_t *intra_matrix = NULL;static uint16_t *inter_matrix = NULL;#if 0 //experimental, (can be removed)static float video_rc_qsquish=1.0;static float video_rc_qmod_amp=0;static int video_rc_qmod_freq=0;#endifstatic const char *video_rc_override_string=NULL;static int video_disable = 0;static int video_discard = 0;static char *video_codec_name = NULL;static int video_codec_tag = 0;static int same_quality = 0;static int do_deinterlace = 0;static int strict = 0;static int top_field_first = -1;static int me_threshold = 0;static int intra_dc_precision = 8;static int loop_input = 0;static int loop_output = AVFMT_NOOUTPUTLOOP;static int qp_hist = 0;static int intra_only = 0;static int audio_sample_rate = 44100;#define QSCALE_NONE -99999static float audio_qscale = QSCALE_NONE;static int audio_disable = 0;static int audio_channels = 1;static char  *audio_codec_name = NULL;static int audio_codec_tag = 0;static char *audio_language = NULL;static int subtitle_disable = 0;static char *subtitle_codec_name = NULL;static char *subtitle_language = NULL;static float mux_preload= 0.5;static float mux_max_delay= 0.7;static int64_t recording_time = 0;static int64_t start_time = 0;static int64_t rec_timestamp = 0;static int64_t input_ts_offset = 0;static int file_overwrite = 0;static char *str_title = NULL;static char *str_author = NULL;static char *str_copyright = NULL;static char *str_comment = NULL;static char *str_genre = NULL;static char *str_album = NULL;static int do_benchmark = 0;static int do_hex_dump = 0;static int do_pkt_dump = 0;static int do_psnr = 0;static int do_pass = 0;static char *pass_logfilename = NULL;static int audio_stream_copy = 0;static int video_stream_copy = 0;static int subtitle_stream_copy = 0;static int video_sync_method= 1;static int audio_sync_method= 0;static float audio_drift_threshold= 0.1;static int copy_ts= 0;static int opt_shortest = 0; //static int video_global_header = 0;static char *vstats_filename;static FILE *vstats_file;static int opt_programid = 0;static int rate_emu = 0;static int  video_channel = 0;static char *video_standard;static int audio_volume = 256;static int using_stdin = 0;static int using_vhook = 0;static int verbose = 1;static int thread_count= 1;static int q_pressed = 0;static int64_t video_size = 0;static int64_t audio_size = 0;static int64_t extra_size = 0;static int nb_frames_dup = 0;static int nb_frames_drop = 0;static int input_sync;static uint64_t limit_filesize = 0; //static int pgmyuv_compatibility_hack=0;static float dts_delta_threshold = 10;static int sws_flags = SWS_BICUBIC;static const char **opt_names;static int opt_name_count;static AVCodecContext *avctx_opts[CODEC_TYPE_NB];static AVFormatContext *avformat_opts;static struct SwsContext *sws_opts;static int64_t timer_start;static AVBitStreamFilterContext *video_bitstream_filters=NULL;static AVBitStreamFilterContext *audio_bitstream_filters=NULL;static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];#define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"struct AVInputStream;typedef struct AVOutputStream {    int file_index;          /* file index */    int index;               /* stream index in the output file */    int source_index;        /* AVInputStream index */    AVStream *st;            /* stream in the output file */    int encoding_needed;     /* true if encoding needed for this stream */    int frame_number;    /* input pts and corresponding output pts       for A/V sync */    //double sync_ipts;        /* dts from the AVPacket of the demuxer in second units */    struct AVInputStream *sync_ist; /* input stream to sync against */    int64_t sync_opts;       /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number    /* video only */    int video_resample;    AVFrame pict_tmp;      /* temporary image for resampling */    struct SwsContext *img_resample_ctx; /* for image resampling */    int resample_height;    int video_crop;    int topBand;             /* cropping area sizes */    int leftBand;    int video_pad;    int padtop;              /* padding area sizes */    int padbottom;    int padleft;    int padright;    /* audio only */    int audio_resample;    ReSampleContext *resample; /* for audio resampling */    AVFifoBuffer fifo;     /* for compression: one audio fifo per codec */    FILE *logfile;} AVOutputStream;typedef struct AVInputStream {    int file_index;    int index;    AVStream *st;    int discard;             /* true if stream data should be discarded */    int decoding_needed;     /* true if the packets must be decoded in 'raw_fifo' */    int64_t sample_index;      /* current sample */    int64_t       start;     /* time when read started */    unsigned long frame;     /* current frame */    int64_t       next_pts;  /* synthetic pts for cases where pkt.pts                                is not defined */    int64_t       pts;       /* current pts */    int is_start;            /* is 1 at the start and after a discontinuity */} AVInputStream;typedef struct AVInputFile {    int eof_reached;      /* true if eof reached */    int ist_index;        /* index of first stream in ist_table */    int buffer_size;      /* current total buffer size */    int nb_streams;       /* nb streams we are aware of */} AVInputFile;#ifdef HAVE_TERMIOS_H/* init terminal so that we can grab keys */static struct termios oldtty;#endifstatic void term_exit(void){#ifdef HAVE_TERMIOS_H    tcsetattr (0, TCSANOW, &oldtty);#endif}static volatile sig_atomic_t received_sigterm = 0;static voidsigterm_handler(int sig){    received_sigterm = sig;    term_exit();}static void term_init(void){#ifdef HAVE_TERMIOS_H    struct termios tty;    tcgetattr (0, &tty);    oldtty = tty;    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP                          |INLCR|IGNCR|ICRNL|IXON);    tty.c_oflag |= OPOST;    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);    tty.c_cflag &= ~(CSIZE|PARENB);    tty.c_cflag |= CS8;    tty.c_cc[VMIN] = 1;    tty.c_cc[VTIME] = 0;    tcsetattr (0, TCSANOW, &tty);    signal(SIGQUIT, sigterm_handler); /* Quit (POSIX).  */#endif    signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).  */    signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */    /*    register a function to be called at normal program termination    */    atexit(term_exit);#ifdef CONFIG_BEOS_NETSERVER    fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);#endif}/* read a key without blocking */static int read_key(void){#if defined(HAVE_TERMIOS_H)    int n = 1;    unsigned char ch;#ifndef CONFIG_BEOS_NETSERVER    struct timeval tv;    fd_set rfds;    FD_ZERO(&rfds);    FD_SET(0, &rfds);    tv.tv_sec = 0;    tv.tv_usec = 0;    n = select(1, &rfds, NULL, NULL, &tv);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -