X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=avprobe.c;h=c7b3d39cb2d86a1d7ed8db249d38f0095cc980a6;hb=1a89025793ca73d9685a8ce8e3194efa64dd6844;hp=3a3ae0fa7dce1acdbbd63e2e3e34959189e0d1c6;hpb=b7f1010c8fce09096057528f7cd29589ea1ae7df;p=ffmpeg diff --git a/avprobe.c b/avprobe.c index 3a3ae0fa7dc..c7b3d39cb2d 100644 --- a/avprobe.c +++ b/avprobe.c @@ -23,6 +23,7 @@ #include "libavformat/avformat.h" #include "libavcodec/avcodec.h" +#include "libavutil/avstring.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "libavutil/dict.h" @@ -59,7 +60,7 @@ static const char unit_hertz_str[] = "Hz" ; static const char unit_byte_str[] = "byte" ; static const char unit_bit_per_second_str[] = "bit/s"; -static void exit_program(void) +static void avprobe_cleanup(int ret) { av_dict_free(&fmt_entries_to_show); } @@ -81,17 +82,17 @@ static void exit_program(void) typedef enum { ARRAY, OBJECT -} ProbeElementType; +} PrintElementType; typedef struct { const char *name; - ProbeElementType type; + PrintElementType type; int64_t index; int64_t nb_elems; -} ProbeElement; +} PrintElement; typedef struct { - ProbeElement *prefix; + PrintElement *prefix; int level; void (*print_header)(void); void (*print_footer)(void); @@ -103,10 +104,10 @@ typedef struct { void (*print_integer) (const char *key, int64_t value); void (*print_string) (const char *key, const char *value); -} OutputContext; +} PrintContext; static AVIOContext *probe_out = NULL; -static OutputContext octx; +static PrintContext octx; #define AVP_INDENT() avio_printf(probe_out, "%*c", octx.level * 2, ' ') /* @@ -165,7 +166,7 @@ static void ini_print_array_header(const char *name) static void ini_print_object_header(const char *name) { int i; - ProbeElement *el = octx.prefix + octx.level -1; + PrintElement *el = octx.prefix + octx.level -1; if (el->nb_elems) avio_printf(probe_out, "\n"); @@ -302,7 +303,7 @@ static void old_print_object_header(const char *name) str = p = av_strdup(name); while (*p) { - *p = toupper(*p); + *p = av_toupper(*p); p++; } @@ -319,7 +320,7 @@ static void old_print_object_footer(const char *name) str = p = av_strdup(name); while (*p) { - *p = toupper(*p); + *p = av_toupper(*p); p++; } @@ -361,21 +362,21 @@ static void probe_group_enter(const char *name, int type) int64_t count = -1; octx.prefix = - av_realloc(octx.prefix, sizeof(ProbeElement) * (octx.level + 1)); + av_realloc(octx.prefix, sizeof(PrintElement) * (octx.level + 1)); if (!octx.prefix || !name) { fprintf(stderr, "Out of memory\n"); - exit(1); + exit_program(1); } if (octx.level) { - ProbeElement *parent = octx.prefix + octx.level -1; + PrintElement *parent = octx.prefix + octx.level -1; if (parent->type == ARRAY) count = parent->nb_elems; parent->nb_elems++; } - octx.prefix[octx.level++] = (ProbeElement){name, type, count, 0}; + octx.prefix[octx.level++] = (PrintElement){name, type, count, 0}; } static void probe_group_leave(void) @@ -525,20 +526,6 @@ static char *tag_string(char *buf, int buf_size, int tag) return buf; } - - -static const char *media_type_string(enum AVMediaType media_type) -{ - switch (media_type) { - case AVMEDIA_TYPE_VIDEO: return "video"; - case AVMEDIA_TYPE_AUDIO: return "audio"; - case AVMEDIA_TYPE_DATA: return "data"; - case AVMEDIA_TYPE_SUBTITLE: return "subtitle"; - case AVMEDIA_TYPE_ATTACHMENT: return "attachment"; - default: return "unknown"; - } -} - static void show_packet(AVFormatContext *fmt_ctx, AVPacket *pkt) { char val_str[128]; @@ -583,7 +570,7 @@ static void show_stream(AVFormatContext *fmt_ctx, int stream_idx) const AVCodec *dec; const char *profile; char val_str[128]; - AVRational display_aspect_ratio; + AVRational display_aspect_ratio, *sar = NULL; const AVPixFmtDescriptor *desc; probe_object_header("stream"); @@ -618,13 +605,16 @@ static void show_stream(AVFormatContext *fmt_ctx, int stream_idx) probe_int("width", dec_ctx->width); probe_int("height", dec_ctx->height); probe_int("has_b_frames", dec_ctx->has_b_frames); - if (dec_ctx->sample_aspect_ratio.num) { + if (dec_ctx->sample_aspect_ratio.num) + sar = &dec_ctx->sample_aspect_ratio; + else if (stream->sample_aspect_ratio.num) + sar = &stream->sample_aspect_ratio; + + if (sar) { probe_str("sample_aspect_ratio", - rational_string(val_str, sizeof(val_str), ":", - &dec_ctx->sample_aspect_ratio)); + rational_string(val_str, sizeof(val_str), ":", sar)); av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den, - dec_ctx->width * dec_ctx->sample_aspect_ratio.num, - dec_ctx->height * dec_ctx->sample_aspect_ratio.den, + dec_ctx->width * sar->num, dec_ctx->height * sar->den, 1024*1024); probe_str("display_aspect_ratio", rational_string(val_str, sizeof(val_str), ":", @@ -654,6 +644,10 @@ static void show_stream(AVFormatContext *fmt_ctx, int stream_idx) probe_str("avg_frame_rate", rational_string(val_str, sizeof(val_str), "/", &stream->avg_frame_rate)); + if (dec_ctx->bit_rate) + probe_str("bit_rate", + value_string(val_str, sizeof(val_str), + dec_ctx->bit_rate, unit_bit_per_second_str)); probe_str("time_base", rational_string(val_str, sizeof(val_str), "/", &stream->time_base)); @@ -860,7 +854,7 @@ static void opt_input_file(void *optctx, const char *arg) fprintf(stderr, "Argument '%s' provided as input filename, but '%s' was already specified.\n", arg, input_filename); - exit(1); + exit_program(1); } if (!strcmp(arg, "-")) arg = "pipe:"; @@ -925,7 +919,7 @@ int main(int argc, char **argv) if (!buffer) exit(1); - atexit(exit_program); + register_exit(avprobe_cleanup); options = real_options; parse_loglevel(argc, argv, options); @@ -955,13 +949,13 @@ int main(int argc, char **argv) fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'.\n", program_name); - exit(1); + exit_program(1); } probe_out = avio_alloc_context(buffer, AVP_BUFFSIZE, 1, NULL, NULL, probe_buf_write, NULL); if (!probe_out) - exit(1); + exit_program(1); probe_header(); ret = probe_file(input_filename);