X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffmpeg.c;h=62d3be73d66ee0d216aa52f6310388bd69d89cc9;hb=94d9633a329ef411466b7637ab25725dcb6dc7b8;hp=6c8751a8f7c49837498547f3b3fadba6bb3df2f9;hpb=60a9966e4d96ca26ceabdaf99eacfb0872c4e931;p=ffmpeg diff --git a/ffmpeg.c b/ffmpeg.c index 6c8751a8f7c..62d3be73d66 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -63,6 +63,9 @@ #undef exit +static 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; @@ -183,7 +186,7 @@ static int copy_ts= 0; static int opt_shortest = 0; // static int video_global_header = 0; static char *vstats_filename; -static FILE *fvstats; +static FILE *vstats_file; static int rate_emu = 0; @@ -855,9 +858,9 @@ static void do_video_stats(AVFormatContext *os, AVOutputStream *ost, double ti1, bitrate, avg_bitrate; /* this is executed just the first time do_video_stats is called */ - if (!fvstats) { - fvstats = fopen(vstats_filename, "w"); - if (!fvstats) { + if (!vstats_file) { + vstats_file = fopen(vstats_filename, "w"); + if (!vstats_file) { perror("fopen"); exit(1); } @@ -866,11 +869,11 @@ static void do_video_stats(AVFormatContext *os, AVOutputStream *ost, enc = ost->st->codec; if (enc->codec_type == CODEC_TYPE_VIDEO) { frame_number = ost->frame_number; - fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA); + fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA); if (enc->flags&CODEC_FLAG_PSNR) - fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0))); + fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0))); - fprintf(fvstats,"f_size= %6d ", frame_size); + fprintf(vstats_file,"f_size= %6d ", frame_size); /* compute pts value */ ti1 = ost->sync_opts * av_q2d(enc->time_base); if (ti1 < 0.01) @@ -878,9 +881,9 @@ static void do_video_stats(AVFormatContext *os, AVOutputStream *ost, bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0; avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0; - fprintf(fvstats, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ", + fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ", (double)video_size / 1024, ti1, bitrate, avg_bitrate); - fprintf(fvstats,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type)); + fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type)); } } @@ -1339,6 +1342,13 @@ static int output_packet(AVInputStream *ist, int ist_index, return -1; } +static void print_sdp(AVFormatContext **avc, int n) +{ + char sdp[2048]; + + avf_sdp_create(avc, n, sdp, sizeof(sdp)); + printf("SDP:\n%s\n", sdp); +} /* * The following code is the main loop of the file converter @@ -1356,6 +1366,7 @@ static int av_encode(AVFormatContext **output_files, AVInputStream *ist, **ist_table = NULL; AVInputFile *file_table; int key; + int want_sdp = 1; file_table= (AVInputFile*) av_mallocz(nb_input_files * sizeof(AVInputFile)); if (!file_table) @@ -1823,6 +1834,12 @@ static int av_encode(AVFormatContext **output_files, ret = AVERROR(EINVAL); goto fail; } + if (strcmp(output_files[i]->oformat->name, "rtp")) { + want_sdp = 0; + } + } + if (want_sdp) { + print_sdp(output_files, nb_output_files); } if ( !using_stdin && verbose >= 0) { @@ -2477,28 +2494,40 @@ static void opt_map_meta_data(const char *arg) m->in_file = strtol(p, (char **)&p, 0); } +static int64_t parse_time_or_die(const char *timestr, int is_duration) +{ + int64_t us = parse_date(timestr, is_duration); + if (us == INT64_MIN) { + fprintf(stderr, "Invalid %s specification: %s\n", + is_duration ? "duration" : "date", timestr); + exit(1); + } + return us; +} + static void opt_recording_time(const char *arg) { - recording_time = parse_date(arg, 1); + recording_time = parse_time_or_die(arg, 1); } static void opt_start_time(const char *arg) { - start_time = parse_date(arg, 1); + start_time = parse_time_or_die(arg, 1); } static void opt_rec_timestamp(const char *arg) { - rec_timestamp = parse_date(arg, 0) / 1000000; + rec_timestamp = parse_time_or_die(arg, 0) / 1000000; } static void opt_input_ts_offset(const char *arg) { - input_ts_offset = parse_date(arg, 1); + input_ts_offset = parse_time_or_die(arg, 1); } static enum CodecID find_codec_or_die(const char *name, int type, int encoder) { + char *codec_string = encoder ? "encoder" : "decoder"; AVCodec *codec; if(!name) @@ -2507,11 +2536,11 @@ static enum CodecID find_codec_or_die(const char *name, int type, int encoder) avcodec_find_encoder_by_name(name) : avcodec_find_decoder_by_name(name); if(!codec) { - av_log(NULL, AV_LOG_ERROR, "Unknown codec '%s'\n", name); + av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name); exit(1); } if(codec->type != type) { - av_log(NULL, AV_LOG_ERROR, "Invalid codec type '%s'\n", name); + av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name); exit(1); } return codec->id; @@ -2552,7 +2581,7 @@ static void opt_input_file(const char *filename) for(i=0; iflags&AV_OPT_FLAG_DECODING_PARAM)) + if(!isnan(d) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM)) av_set_double(ic, opt_names[i], d); } /* open the input file with generic libav function */ @@ -2600,7 +2629,7 @@ static void opt_input_file(const char *filename) for(j=0; jflags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM)) + if(!isnan(d) && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM)) av_set_double(enc, opt_names[j], d); } //fprintf(stderr, "\nInput Audio channels: %d", enc->channels); @@ -2613,7 +2642,7 @@ static void opt_input_file(const char *filename) for(j=0; jflags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM)) + if(!isnan(d) && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_DECODING_PARAM)) av_set_double(enc, opt_names[j], d); } frame_height = enc->height; @@ -2759,7 +2788,7 @@ static void new_video_stream(AVFormatContext *oc) for(i=0; iflags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM)) + if(!isnan(d) && (opt->flags&AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM)) av_set_double(video_enc, opt_names[i], d); } @@ -2902,7 +2931,7 @@ static void new_audio_stream(AVFormatContext *oc) for(i=0; iflags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM)) + if(!isnan(d) && (opt->flags&AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM)) av_set_double(audio_enc, opt_names[i], d); } @@ -2952,7 +2981,7 @@ static void new_subtitle_stream(AVFormatContext *oc) for(i=0; iflags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM)) + if(!isnan(d) && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM)) av_set_double(subtitle_enc, opt_names[i], d); } subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1); @@ -3144,7 +3173,7 @@ static void opt_output_file(const char *filename) for(i=0; iflags&AV_OPT_FLAG_ENCODING_PARAM)) + if(!isnan(d) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM)) av_set_double(oc, opt_names[i], d); } @@ -3538,12 +3567,7 @@ static void opt_audio_bsf(const char *arg) static void opt_show_version(void) { - /* TODO: add function interface to avutil and avformat */ - fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n" - "libavutil %d\n" - "libavcodec %d\n" - "libavformat %d\n", - LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD); + show_version(program_name); exit(0); } @@ -3600,7 +3624,7 @@ const OptionDef options[] = { { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" }, { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" }, { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" }, - { "t", HAS_ARG, {(void*)opt_recording_time}, "set the recording time", "duration" }, + { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" }, { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, // { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" }, { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" }, @@ -3710,56 +3734,9 @@ const OptionDef options[] = { { NULL, }, }; -static void show_banner(void) -{ - fprintf(stderr, "FFmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2007 Fabrice Bellard, et al.\n"); - fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n"); - fprintf(stderr, " libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n"); - fprintf(stderr, " libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n"); - fprintf(stderr, " libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n"); - fprintf(stderr, " built on " __DATE__ " " __TIME__); -#ifdef __GNUC__ - fprintf(stderr, ", gcc: " __VERSION__ "\n"); -#else - fprintf(stderr, ", using a non-gcc compiler\n"); -#endif -} - static void opt_show_license(void) { -#ifdef CONFIG_GPL - printf( - "FFmpeg is free software; you can redistribute it and/or modify\n" - "it under the terms of the GNU General Public License as published by\n" - "the Free Software Foundation; either version 2 of the License, or\n" - "(at your option) any later version.\n" - "\n" - "FFmpeg is distributed in the hope that it will be useful,\n" - "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" - "GNU General Public License for more details.\n" - "\n" - "You should have received a copy of the GNU General Public License\n" - "along with FFmpeg; if not, write to the Free Software\n" - "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" - ); -#else - printf( - "FFmpeg is free software; you can redistribute it and/or\n" - "modify it under the terms of the GNU Lesser General Public\n" - "License as published by the Free Software Foundation; either\n" - "version 2.1 of the License, or (at your option) any later version.\n" - "\n" - "FFmpeg is distributed in the hope that it will be useful,\n" - "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" - "Lesser General Public License for more details.\n" - "\n" - "You should have received a copy of the GNU Lesser General Public\n" - "License along with FFmpeg; if not, write to the Free Software\n" - "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" - ); -#endif + show_license(); exit(0); } @@ -3806,46 +3783,9 @@ static void show_help(void) av_opt_show(sws_opts, NULL); } -int main(int argc, char **argv) +static int av_exit() { int i; - int64_t ti; - - av_register_all(); - - for(i=0; i