#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
+#include "libavutil/avstring.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavutil/dict.h"
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);
}
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);
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, ' ')
/*
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");
str = p = av_strdup(name);
while (*p) {
- *p = toupper(*p);
+ *p = av_toupper(*p);
p++;
}
str = p = av_strdup(name);
while (*p) {
- *p = toupper(*p);
+ *p = av_toupper(*p);
p++;
}
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)
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];
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");
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), ":",
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:";
if (!buffer)
exit(1);
- atexit(exit_program);
+ register_exit(avprobe_cleanup);
options = real_options;
parse_loglevel(argc, argv, options);
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);