Skip to content
Snippets Groups Projects
ffprobe.c 71.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
        writer_print_chapter_header(w, "program_version");
        print_section_header("program_version");
        print_str("version", FFMPEG_VERSION);
        print_fmt("copyright", "Copyright (c) %d-%d the FFmpeg developers",
                  program_birth_year, this_year);
        print_str("build_date", __DATE__);
        print_str("build_time", __TIME__);
    
        print_str("compiler_ident", CC_IDENT);
    
        print_str("configuration", FFMPEG_CONFIGURATION);
        print_section_footer("program_version");
        writer_print_chapter_footer(w, "program_version");
    
    
        av_bprint_finalize(&pbuf, NULL);
    
    }
    
    #define SHOW_LIB_VERSION(libname, LIBNAME)                              \
        do {                                                                \
            if (CONFIG_##LIBNAME) {                                         \
                unsigned int version = libname##_version();                 \
                print_section_header("library_version");                    \
                print_str("name",    "lib" #libname);                       \
                print_int("major",   LIB##LIBNAME##_VERSION_MAJOR);         \
                print_int("minor",   LIB##LIBNAME##_VERSION_MINOR);         \
                print_int("micro",   LIB##LIBNAME##_VERSION_MICRO);         \
                print_int("version", version);                              \
                print_section_footer("library_version");                    \
            }                                                               \
        } while (0)
    
    static void ffprobe_show_library_versions(WriterContext *w)
    {
        writer_print_chapter_header(w, "library_versions");
        SHOW_LIB_VERSION(avutil,     AVUTIL);
        SHOW_LIB_VERSION(avcodec,    AVCODEC);
        SHOW_LIB_VERSION(avformat,   AVFORMAT);
        SHOW_LIB_VERSION(avdevice,   AVDEVICE);
        SHOW_LIB_VERSION(avfilter,   AVFILTER);
        SHOW_LIB_VERSION(swscale,    SWSCALE);
        SHOW_LIB_VERSION(swresample, SWRESAMPLE);
        SHOW_LIB_VERSION(postproc,   POSTPROC);
        writer_print_chapter_footer(w, "library_versions");
    }
    
    
    static int opt_format(const char *opt, const char *arg)
    
    {
        iformat = av_find_input_format(arg);
        if (!iformat) {
    
            av_log(NULL, AV_LOG_ERROR, "Unknown input format: %s\n", arg);
    
            return AVERROR(EINVAL);
    
        return 0;
    
    static int opt_show_format_entry(const char *opt, const char *arg)
    {
        do_show_format = 1;
        av_dict_set(&fmt_entries_to_show, arg, "", 0);
        return 0;
    }
    
    
    static void opt_input_file(void *optctx, const char *arg)
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
    {
    
        if (input_filename) {
    
            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;
    
    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(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, {(void*)opt_format}, "force format", "format" },
    
        { "unit", OPT_BOOL, {(void*)&show_value_unit}, "show unit of the displayed values" },
        { "prefix", OPT_BOOL, {(void*)&use_value_prefix}, "use SI prefixes for the displayed values" },
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
        { "byte_binary_prefix", OPT_BOOL, {(void*)&use_byte_value_binary_prefix},
          "use binary prefixes for byte units" },
        { "sexagesimal", OPT_BOOL,  {(void*)&use_value_sexagesimal_format},
          "use sexagesimal format HOURS:MM:SS.MICROSECONDS for time units" },
        { "pretty", 0, {(void*)&opt_pretty},
          "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" },
    
    Stefano Sabatini's avatar
    Stefano Sabatini committed
        { "show_format",  OPT_BOOL, {(void*)&do_show_format} , "show format/container info" },
    
        { "show_frames",  OPT_BOOL, {(void*)&do_show_frames} , "show frames info" },
    
        { "show_format_entry", HAS_ARG, {(void*)opt_show_format_entry},
          "show a particular entry from the format/container info", "entry" },
    
        { "show_packets", OPT_BOOL, {(void*)&do_show_packets}, "show packets info" },
    
        { "show_streams", OPT_BOOL, {(void*)&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" },
    
        { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
    
        { "i", HAS_ARG, {(void *)opt_input_file}, "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);
    
        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
    }