Skip to content
Snippets Groups Projects
ffmpeg.c 163 KiB
Newer Older
  • Learn to ignore specific revisions
  •            been written before.
               So the real data starts at SCR 36000+3*1200. */
    
            o->mux_preload = (36000+3*1200) / 90000.0; //0.44
    
            opt_video_codec(o, "c:v", "mpeg2video");
            opt_audio_codec(o, "c:a", "mp2");
    
            parse_option(o, "f", "svcd", options);
    
            parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
            parse_option(o, "r", frame_rates[norm], options);
            parse_option(o, "pix_fmt", "yuv420p", options);
    
            opt_default("g", norm == PAL ? "15" : "18");
    
            opt_default("maxrate", "2516000");
            opt_default("minrate", "0"); //1145000;
    
            opt_default("bufsize", "1835008"); //224*1024*8;
    
            opt_default("flags", "+scan_offset");
    
            opt_default("b:a", "224000");
    
            parse_option(o, "ar", "44100", options);
    
            opt_default("packetsize", "2324");
    
            opt_video_codec(o, "c:v", "mpeg2video");
            opt_audio_codec(o, "c:a", "ac3");
    
            parse_option(o, "f", "dvd", options);
    
            parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
            parse_option(o, "r", frame_rates[norm], options);
            parse_option(o, "pix_fmt", "yuv420p", options);
    
            opt_default("g", norm == PAL ? "15" : "18");
    
            opt_default("maxrate", "9000000");
            opt_default("minrate", "0"); //1500000;
    
            opt_default("bufsize", "1835008"); //224*1024*8;
    
            opt_default("packetsize", "2048");  // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
    
            opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
    
            opt_default("b:a", "448000");
    
            parse_option(o, "ar", "48000", options);
    
            parse_option(o, "f", "dv", options);
    
            parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
            parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
                              norm == PAL ? "yuv420p" : "yuv411p", options);
            parse_option(o, "r", frame_rates[norm], options);
    
            parse_option(o, "ar", "48000", options);
    
            parse_option(o, "ac", "2", options);
    
        } else {
            fprintf(stderr, "Unknown target: %s\n", arg);
    
            return AVERROR(EINVAL);
    
        return 0;
    
    static int opt_vstats_file(const char *opt, const char *arg)
    
    {
        av_free (vstats_filename);
        vstats_filename=av_strdup (arg);
    
        return 0;
    
    static int opt_vstats(const char *opt, const char *arg)
    
    {
        char filename[40];
        time_t today2 = time(NULL);
        struct tm *today = localtime(&today2);
    
        snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
                 today->tm_sec);
    
        return opt_vstats_file(opt, filename);
    
    static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
    
        return parse_option(o, "frames:v", arg, options);
    }
    
    static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
    {
        return parse_option(o, "frames:a", arg, options);
    }
    
    static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
    {
        return parse_option(o, "frames:d", arg, options);
    
    static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
    
    {
        FILE *f=NULL;
        char filename[1000], tmp[1000], tmp2[1000], line[1000];
    
        const char *codec_name = *opt == 'v' ? video_codec_name :
                                 *opt == 'a' ? audio_codec_name :
                                               subtitle_codec_name;
    
    
        if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
            fprintf(stderr, "File for preset '%s' not found\n", arg);
            exit_program(1);
        }
    
        while(!feof(f)){
            int e= fscanf(f, "%999[^\n]\n", line) - 1;
            if(line[0] == '#' && !e)
                continue;
            e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
            if(e){
                fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
                exit_program(1);
            }
            if(!strcmp(tmp, "acodec")){
    
                opt_audio_codec(o, tmp, tmp2);
    
                opt_video_codec(o, tmp, tmp2);
    
                opt_subtitle_codec(o, tmp, tmp2);
    
                opt_data_codec(o, tmp, tmp2);
    
            }else if(opt_default(tmp, tmp2) < 0){
                fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
                exit_program(1);
            }
        }
    
        fclose(f);
    
        return 0;
    }
    
    
    static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
    
    static int opt_passlogfile(const char *opt, const char *arg)
    
    #if CONFIG_LIBX264_ENCODER
    
        return opt_default("passlogfile", arg);
    
    #else
        return 0;
    #endif
    
    static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
    {
    
        char *s= av_malloc(strlen(opt)+2);
        snprintf(s, strlen(opt)+2, "%s:%c", opt+1, *opt);
        return parse_option(o, s, arg, options);
    }
    
    
    static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
    {
        if(!strcmp(opt, "b")){
            av_log(0,AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambigous\n");
            return parse_option(o, av_strdup("b:v"), arg, options);
        }
        return opt_default(opt, arg);
    }
    
    
    static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
    {
        return parse_option(o, "filter:v", arg, options);
    }
    
    #define OFFSET(x) offsetof(OptionsContext, x)
    
        /* main options */
    
    #include "cmdutils_common_opts.h"
    
        { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
        { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
    
        { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
        { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
    
        { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
    
        { "map_meta_data", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
    
          "outfile[,metadata]:infile[,metadata]" },
    
        { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
    
          "outfile[,metadata]:infile[,metadata]" },
    
        { "map_chapters",  OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)},  "set chapters mapping", "input_file_index" },
    
        { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
        { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
        { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
        { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
    
        { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
        { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
        { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
        { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
    
        { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
          "add timings for benchmarking" },
    
        { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
    
        { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
    
          "dump each input packet" },
    
        { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
    
          "when dumping packets, also dump the payload" },
    
        { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
    
        { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
        { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
    
        { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
    
        { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
    
        { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
        { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
    
        { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
    
        { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
    
        { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)&copy_tb}, "copy input stream time base when stream copying" },
    
        { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
    
        { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
    
        { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
    
        { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)&copy_initial_nonkeyframes}, "copy initial non-keyframes" },
    
        { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
    
        { "tag",   OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
    
        { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
        { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
    #if CONFIG_AVFILTER
        { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
    #endif
    
        { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
    
        { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
        { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
        { "aspect", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_aspect_ratios)}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
        { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
    
        { "bits_per_raw_sample", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&frame_bits_per_raw_sample}, "set the number of bits per raw sample", "number" },
    
        { "croptop",  HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
        { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
        { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
        { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
        { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
        { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
        { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
        { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
        { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
    
        { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
    
        { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
    
    Måns Rullgård's avatar
    Måns Rullgård committed
        { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
    
        { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
    
        { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
    
        { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
    
        { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
    
    Lou Logan's avatar
    Lou Logan committed
          "use same quantizer as source (implies VBR)" },
    
        { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
    
        { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
    
        { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
    
          "deinterlace pictures" },
    
        { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
        { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
    
    #if CONFIG_AVFILTER
    
        { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
    
        { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
        { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
        { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
    
        { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
    
        { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
    
        { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
    
        { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
        { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
        { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(forced_key_frames)}, "force key frames at specified timestamps", "timestamps" },
    
        { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
    
        { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
    
        { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
        { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
    
        { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
        { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
    
        { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
    
        { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
    
        { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
    
        { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
    
        { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
    
        { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
    
        { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
    
        /* grab options */
    
        { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
        { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
    
        { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
    
        { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT   | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
        { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)},   "set the initial demux-decode delay", "seconds" },
    
        { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
    
        { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
        { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
    
        { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
        { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
        { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
        { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
    
        /* data codec support */
    
        { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
    
        { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        { NULL, },
    };
    
    
    int main(int argc, char **argv)
    {
    
        OptionsContext o = { 0 };
    
        av_log_set_flags(AV_LOG_SKIP_REPEATED);
    
    
        if(argc>1 && !strcmp(argv[1], "-d")){
    
            verbose=-1;
            av_log_set_callback(log_callback_null);
            argc--;
            argv++;
        }
    
    
    Luca Abeni's avatar
    Luca Abeni committed
        avcodec_register_all();
    
    Luca Abeni's avatar
    Luca Abeni committed
        avdevice_register_all();
    
    #endif
    #if CONFIG_AVFILTER
        avfilter_register_all();
    
        av_register_all();
    
    
    Martin Storsjö's avatar
    Martin Storsjö committed
    #if HAVE_ISATTY
    
            avio_set_interrupt_cb(decode_interrupt_cb);
    
    Martin Storsjö's avatar
    Martin Storsjö committed
    #endif
    
        if(verbose>=0)
            show_banner();
    
    
        /* parse options */
    
        parse_options(&o, argc, argv, options, opt_output_file);
    
        if(nb_output_files <= 0 && nb_input_files == 0) {
            show_usage();
    
            fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
            exit_program(1);
    
        /* file converter / grab */
        if (nb_output_files <= 0) {
    
            fprintf(stderr, "At least one output file must be specified\n");
    
            exit_program(1);
    
        }
    
        if (nb_input_files == 0) {
    
            fprintf(stderr, "At least one input file must be specified\n");
    
            exit_program(1);
    
        }
    
        ti = getutime();
    
        if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
    
            exit_program(1);
    
        ti = getutime() - ti;
        if (do_benchmark) {
    
            int maxrss = getmaxrss() / 1024;
            printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);