[xiph-commits] r16270 - trunk/ffmpeg2theora/src
j at svn.xiph.org
j at svn.xiph.org
Mon Jul 13 08:56:30 PDT 2009
Author: j
Date: 2009-07-13 08:56:30 -0700 (Mon, 13 Jul 2009)
New Revision: 16270
Modified:
trunk/ffmpeg2theora/src/avinfo.c
Log:
change json output to deal with files that have more than one audio or video track
Modified: trunk/ffmpeg2theora/src/avinfo.c
===================================================================
--- trunk/ffmpeg2theora/src/avinfo.c 2009-07-13 10:28:19 UTC (rev 16269)
+++ trunk/ffmpeg2theora/src/avinfo.c 2009-07-13 15:56:30 UTC (rev 16270)
@@ -124,23 +124,32 @@
JSON_FLOAT,
} JSON_TYPES;
-void json_add_key_value(FILE *output, char *key, void *value, int type, int last) {
+static void do_indent(FILE *output, int indent) {
+ int i;
+ for (i = 0; i < indent; i++)
+ fprintf(output, " ");
+}
+
+void json_add_key_value(FILE *output, char *key, void *value, int type, int last, int indent) {
char *p;
+ int i;
+
+ do_indent(output, indent);
switch(type) {
case JSON_STRING:
p = (char *)value;
p = replace_str_all(p, "\\", "\\\\");
p = replace_str_all(p, "\"", "\\\"");
- fprintf(output, " \"%s\": \"%s\"", key, p);
+ fprintf(output, "\"%s\": \"%s\"", key, p);
break;
case JSON_INT:
- fprintf(output, " \"%s\": %d", key, *(int *)value);
+ fprintf(output, "\"%s\": %d", key, *(int *)value);
break;
case JSON_LONGLONG:
- fprintf(output, " \"%s\": %lld", key, *(unsigned long long *)value);
+ fprintf(output, "\"%s\": %lld", key, *(unsigned long long *)value);
break;
case JSON_FLOAT:
- fprintf(output, " \"%s\": %f", key, *(float *)value);
+ fprintf(output, "\"%s\": %f", key, *(float *)value);
break;
}
if (last) {
@@ -150,7 +159,7 @@
}
}
-void json_codec_info(FILE *output, AVCodecContext *enc) {
+void json_codec_info(FILE *output, AVCodecContext *enc, int indent) {
const char *codec_name;
AVCodec *p;
char buf1[32];
@@ -186,13 +195,13 @@
switch(enc->codec_type) {
case CODEC_TYPE_VIDEO:
codec_name = fix_codec_name(codec_name);
- json_add_key_value(output, "video_codec", (void *)codec_name, JSON_STRING, 0);
+ json_add_key_value(output, "codec", (void *)codec_name, JSON_STRING, 0, indent);
if (enc->pix_fmt != PIX_FMT_NONE) {
- json_add_key_value(output, "pixel_format", (void *)avcodec_get_pix_fmt_name(enc->pix_fmt), JSON_STRING, 0);
+ json_add_key_value(output, "pixel_format", (void *)avcodec_get_pix_fmt_name(enc->pix_fmt), JSON_STRING, 0, indent);
}
if (enc->width) {
- json_add_key_value(output, "width", &enc->width, JSON_INT, 0);
- json_add_key_value(output, "height", &enc->height, JSON_INT, 0);
+ json_add_key_value(output, "width", &enc->width, JSON_INT, 0, indent);
+ json_add_key_value(output, "height", &enc->height, JSON_INT, 0, indent);
if (enc->sample_aspect_ratio.num) {
av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
enc->width*enc->sample_aspect_ratio.num,
@@ -200,25 +209,25 @@
1024*1024);
snprintf(buf1, sizeof(buf1), "%d:%d",
enc->sample_aspect_ratio.num, enc->sample_aspect_ratio.den);
- json_add_key_value(output, "pixel_aspect_ratio", buf1, JSON_STRING, 0);
+ json_add_key_value(output, "pixel_aspect_ratio", buf1, JSON_STRING, 0, indent);
snprintf(buf1, sizeof(buf1), "%d:%d",
display_aspect_ratio.num, display_aspect_ratio.den);
- json_add_key_value(output, "display_aspect_ratio", buf1, JSON_STRING, 0);
+ json_add_key_value(output, "display_aspect_ratio", buf1, JSON_STRING, 0, indent);
}
}
bitrate = enc->bit_rate;
if (bitrate != 0) {
float t = (float)bitrate / 1000;
- json_add_key_value(output, "video_bitrate", &t, JSON_FLOAT, 0);
+ json_add_key_value(output, "bitrate", &t, JSON_FLOAT, 0, indent);
}
break;
case CODEC_TYPE_AUDIO:
codec_name = fix_codec_name(codec_name);
- json_add_key_value(output, "audio_codec", (void *)codec_name, JSON_STRING, 0);
+ json_add_key_value(output, "codec", (void *)codec_name, JSON_STRING, 0, indent);
if (enc->sample_rate) {
- json_add_key_value(output, "samplerate", &enc->sample_rate, JSON_INT, 0);
+ json_add_key_value(output, "samplerate", &enc->sample_rate, JSON_INT, 0, indent);
}
- json_add_key_value(output, "channels", &enc->channels, JSON_INT, 0);
+ json_add_key_value(output, "channels", &enc->channels, JSON_INT, 0, indent);
/* for PCM codecs, compute bitrate directly */
switch(enc->codec_id) {
@@ -261,7 +270,7 @@
}
if (bitrate != 0) {
float t = (float)bitrate / 1000;
- json_add_key_value(output, "audio_bitrate", &t, JSON_FLOAT, 0);
+ json_add_key_value(output, "bitrate", &t, JSON_FLOAT, 0, indent);
}
break;
/*
@@ -288,38 +297,54 @@
}
-static void json_stream_format(FILE *output, AVFormatContext *ic, int i) {
+static void json_stream_format(FILE *output, AVFormatContext *ic, int i, int indent, int first, int type_filter) {
+ static int _first = 1;
char buf[1024];
char buf1[32];
int flags = ic->iformat->flags;
+
AVStream *st = ic->streams[i];
int g = av_gcd(st->time_base.num, st->time_base.den);
AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0);
- json_codec_info(output, st->codec);
- if (st->sample_aspect_ratio.num && // default
- av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
- AVRational display_aspect_ratio;
- av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
- st->codec->width*st->sample_aspect_ratio.num,
- st->codec->height*st->sample_aspect_ratio.den,
- 1024*1024);
- snprintf(buf1, sizeof(buf1), "%d:%d",
- st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
- json_add_key_value(output, "pixel_aspect_ratio", buf1, JSON_STRING, 0);
- snprintf(buf1, sizeof(buf1), "%d:%d",
- display_aspect_ratio.num, display_aspect_ratio.den);
- json_add_key_value(output, "display_aspect_ratio", buf1, JSON_STRING, 0);
- }
- if(st->codec->codec_type == CODEC_TYPE_VIDEO){
- if (st->time_base.den && st->time_base.num && av_q2d(st->time_base) > 0.001) {
+
+ if (first)
+ _first = 1;
+
+ if(st->codec->codec_type == type_filter){
+ if (!_first)
+ fprintf(output, ", ");
+ _first = 0;
+ fprintf(output, "{\n");
+
+ json_codec_info(output, st->codec, indent + 1);
+ if (st->sample_aspect_ratio.num && // default
+ av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
+ AVRational display_aspect_ratio;
+ av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
+ st->codec->width*st->sample_aspect_ratio.num,
+ st->codec->height*st->sample_aspect_ratio.den,
+ 1024*1024);
snprintf(buf1, sizeof(buf1), "%d:%d",
- st->time_base.den, st->time_base.num);
- json_add_key_value(output, "framerate", buf1, JSON_STRING, 0);
- } else {
+ st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
+ json_add_key_value(output, "pixel_aspect_ratio", buf1, JSON_STRING, 0, indent + 1);
snprintf(buf1, sizeof(buf1), "%d:%d",
- st->r_frame_rate.num, st->r_frame_rate.den);
- json_add_key_value(output, "framerate", buf1, JSON_STRING, 0);
+ display_aspect_ratio.num, display_aspect_ratio.den);
+ json_add_key_value(output, "display_aspect_ratio", buf1, JSON_STRING, 0, indent + 1);
}
+ if(st->codec->codec_type == CODEC_TYPE_VIDEO){
+ if (st->time_base.den && st->time_base.num && av_q2d(st->time_base) > 0.001) {
+ snprintf(buf1, sizeof(buf1), "%d:%d",
+ st->time_base.den, st->time_base.num);
+ json_add_key_value(output, "framerate", buf1, JSON_STRING, 0, indent + 1);
+ } else {
+ snprintf(buf1, sizeof(buf1), "%d:%d",
+ st->r_frame_rate.num, st->r_frame_rate.den);
+ json_add_key_value(output, "framerate", buf1, JSON_STRING, 0, indent + 1);
+ }
+ }
+ json_add_key_value(output, "id", &i, JSON_INT, 1, indent + 1);
+ do_indent(output, indent-1);
+ fprintf(output, "}");
}
}
@@ -359,14 +384,14 @@
return t1;
}
-void json_oshash(FILE *output, char const *filename) {
+void json_oshash(FILE *output, char const *filename, int indent) {
char hash[32];
#ifdef WIN32
sprintf(hash,"%016I64x", gen_oshash(filename));
#else
sprintf(hash,"%016qx", gen_oshash(filename));
#endif
- json_add_key_value(output, "oshash", (void *)hash, JSON_STRING, 0);
+ json_add_key_value(output, "oshash", (void *)hash, JSON_STRING, 0, indent);
}
@@ -379,32 +404,51 @@
if (ic->duration != AV_NOPTS_VALUE) {
float secs;
secs = (float)ic->duration / AV_TIME_BASE;
- json_add_key_value(output, "duration", &secs, JSON_FLOAT, 0);
+ json_add_key_value(output, "duration", &secs, JSON_FLOAT, 0, 1);
} else {
float t = -1;
- json_add_key_value(output, "duration", &t, JSON_FLOAT, 0);
+ json_add_key_value(output, "duration", &t, JSON_FLOAT, 0, 1);
}
if (ic->bit_rate) {
float t = (float)ic->bit_rate / 1000;
- json_add_key_value(output, "bitrate", &t, JSON_FLOAT, 0);
+ json_add_key_value(output, "bitrate", &t, JSON_FLOAT, 0, 1);
}
+ do_indent(output, 1);
+ fprintf(output, "\"video\": [");
if(ic->nb_programs) {
int j, k;
for(j=0; j<ic->nb_programs; j++) {
for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
- json_stream_format(output, ic, ic->programs[j]->stream_index[k]);
+ json_stream_format(output, ic, ic->programs[j]->stream_index[k], 2, !k && !j, CODEC_TYPE_VIDEO);
}
} else {
for(i=0;i<ic->nb_streams;i++) {
- json_stream_format(output, ic, i);
+ json_stream_format(output, ic, i, 2, !i, CODEC_TYPE_VIDEO);
}
}
- json_oshash(output, url);
- json_add_key_value(output, "path", (void *)url, JSON_STRING, 0);
+ fprintf(output, "],\n");
+ do_indent(output, 1);
+ fprintf(output, "\"audio\": [");
+ if(ic->nb_programs) {
+ int j, k;
+ for(j=0; j<ic->nb_programs; j++) {
+ for(k=0; k<ic->programs[j]->nb_stream_indexes; k++)
+ json_stream_format(output, ic, ic->programs[j]->stream_index[k], 2, !k && !j, CODEC_TYPE_AUDIO);
+ }
+ } else {
+ for(i=0;i<ic->nb_streams;i++) {
+ json_stream_format(output, ic, i, 2, !i, CODEC_TYPE_AUDIO);
+ }
+ }
+ fprintf(output, "],\n");
+
+ json_oshash(output, url, 1);
+ json_add_key_value(output, "path", (void *)url, JSON_STRING, 0, 1);
+
filesize = get_filesize(url);
- json_add_key_value(output, "size", &filesize, JSON_LONGLONG, 1);
+ json_add_key_value(output, "size", &filesize, JSON_LONGLONG, 1, 1);
fprintf(output, "}\n");
}
More information about the commits
mailing list