Skip to content
Snippets Groups Projects
ffprobe.c 73.1 KiB
Newer Older
  • Learn to ignore specific revisions
  •         av_log(NULL, AV_LOG_ERROR,
                    "Argument '%s' provided as input filename, but '%s' was already specified.\n",
                    arg, input_filename);
    
        if (!strcmp(arg, "-"))
            arg = "pipe:";
        input_filename = arg;
    
    static int opt_input_file_i(void *optctx, const char *opt, const char *arg)
    {
        opt_input_file(optctx, arg);
        return 0;
    }
    
    
    void show_help_default(const char *opt, const char *arg)
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
    {
    
        av_log_set_callback(log_callback_help);
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
        show_usage();
    
        show_help_options(options, "Main options:", 0, 0, 0);
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
        printf("\n");
    
    
        show_help_children(avformat_get_class(), AV_OPT_FLAG_DECODING_PARAM);
    
    static int opt_pretty(void *optctx, const char *opt, const char *arg)
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
    {
        show_value_unit              = 1;
        use_value_prefix             = 1;
        use_byte_value_binary_prefix = 1;
        use_value_sexagesimal_format = 1;
    
    static int opt_show_versions(const char *opt, const char *arg)
    {
        do_show_program_version  = 1;
        do_show_library_versions = 1;
        return 0;
    }
    
    
    static const OptionDef real_options[] = {
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
    #include "cmdutils_common_opts.h"
    
        { "f", HAS_ARG, {.func_arg = opt_format}, "force format", "format" },
        { "unit", OPT_BOOL, {&show_value_unit}, "show unit of the displayed values" },
        { "prefix", OPT_BOOL, {&use_value_prefix}, "use SI prefixes for the displayed values" },
        { "byte_binary_prefix", OPT_BOOL, {&use_byte_value_binary_prefix},
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
          "use binary prefixes for byte units" },
    
        { "sexagesimal", OPT_BOOL,  {&use_value_sexagesimal_format},
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
          "use sexagesimal format HOURS:MM:SS.MICROSECONDS for time units" },
    
        { "pretty", 0, {.func_arg = opt_pretty},
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
          "prettify the format of displayed values, make it more human readable" },
    
        { "print_format", OPT_STRING | HAS_ARG, {(void*)&print_format},
    
          "set the output printing format (available formats are: default, compact, csv, flat, ini, json, xml)", "format" },
    
        { "of", OPT_STRING | HAS_ARG, {(void*)&print_format}, "alias for -print_format", "format" },
    
        { "show_data",    OPT_BOOL, {(void*)&do_show_data}, "show packets data" },
    
        { "show_error",   OPT_BOOL, {(void*)&do_show_error} ,  "show probing error" },
    
        { "show_format",  OPT_BOOL, {&do_show_format} , "show format/container info" },
    
        { "show_frames",  OPT_BOOL, {(void*)&do_show_frames} , "show frames info" },
    
        { "show_format_entry", HAS_ARG, {.func_arg = opt_show_format_entry},
    
          "show a particular entry from the format/container info", "entry" },
    
        { "show_packets", OPT_BOOL, {&do_show_packets}, "show packets info" },
        { "show_streams", OPT_BOOL, {&do_show_streams}, "show streams info" },
    
        { "count_frames", OPT_BOOL, {(void*)&do_count_frames}, "count the number of frames per stream" },
        { "count_packets", OPT_BOOL, {(void*)&do_count_packets}, "count the number of packets per stream" },
    
        { "show_program_version",  OPT_BOOL, {(void*)&do_show_program_version},  "show ffprobe version" },
        { "show_library_versions", OPT_BOOL, {(void*)&do_show_library_versions}, "show library versions" },
        { "show_versions",         0, {(void*)&opt_show_versions}, "show program and library versions" },
    
        { "show_private_data", OPT_BOOL, {(void*)&show_private_data}, "show private data" },
        { "private",           OPT_BOOL, {(void*)&show_private_data}, "same as show_private_data" },
    
        { "bitexact", OPT_BOOL, {&do_bitexact}, "force bitexact output" },
    
        { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {.func_arg = opt_default}, "generic catch all option", "" },
    
        { "i", HAS_ARG, {.func_arg = opt_input_file_i}, "read specified file", "input_file"},
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
        { NULL, },
    };
    
    int main(int argc, char **argv)
    {
    
        const Writer *w;
        WriterContext *wctx;
        char *buf;
        char *w_name = NULL, *w_args = NULL;
    
        av_log_set_flags(AV_LOG_SKIP_REPEATED);
    
        parse_loglevel(argc, argv, options);
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
        av_register_all();
    
        avformat_network_init();
    
        init_opts();
    
    #if CONFIG_AVDEVICE
        avdevice_register_all();
    #endif
    
        show_banner(argc, argv, options);
    
        parse_options(NULL, argc, argv, options, opt_input_file);
    
        if (do_bitexact && (do_show_program_version || do_show_library_versions)) {
            av_log(NULL, AV_LOG_ERROR,
                   "-bitexact and -show_program_version or -show_library_versions "
                   "options are incompatible\n");
            ret = AVERROR(EINVAL);
            goto end;
        }
    
    
        writer_register_all();
    
        if (!print_format)
            print_format = av_strdup("default");
        w_name = av_strtok(print_format, "=", &buf);
        w_args = buf;
    
        w = writer_get_by_name(w_name);
        if (!w) {
            av_log(NULL, AV_LOG_ERROR, "Unknown output format with name '%s'\n", w_name);
            ret = AVERROR(EINVAL);
            goto end;
    
        if ((ret = writer_open(&wctx, w, w_args, NULL)) >= 0) {
    
            if (do_show_program_version)
                ffprobe_show_program_version(wctx);
            if (do_show_library_versions)
                ffprobe_show_library_versions(wctx);
    
            if (!input_filename &&
                ((do_show_format || do_show_streams || do_show_packets || do_show_error) ||
                 (!do_show_program_version && !do_show_library_versions))) {
    
                show_usage();
                av_log(NULL, AV_LOG_ERROR, "You have to specify one input file.\n");
                av_log(NULL, AV_LOG_ERROR, "Use -h to get full help or, even better, run 'man %s'.\n", program_name);
                ret = AVERROR(EINVAL);
    
                ret = probe_file(wctx, input_filename);
    
                if (ret < 0 && do_show_error)
                    show_error(wctx, ret);
            }
    
    
        uninit_opts();
        av_dict_free(&fmt_entries_to_show);
    
    
        avformat_network_deinit();
    
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
    }