@ -137,8 +137,8 @@ struct writer {
const char * header , * footer ;
void ( * print_header ) ( const char * ) ;
void ( * print_footer ) ( const char * ) ;
void ( * print_fmt_f ) ( const char * , const char * , . . . ) ;
void ( * print_int_f ) ( const char * , int ) ;
void ( * print_str_f ) ( const char * , const char * ) ;
void ( * show_tags ) ( struct writer * w , AVDictionary * dict ) ;
} ;
@ -150,13 +150,9 @@ static void default_print_header(const char *section)
printf ( " [%s] \n " , section ) ;
}
static void default_print_fmt ( const char * key , const char * fmt , . . . )
static void default_print_str ( const char * key , const char * value )
{
va_list ap ;
va_start ( ap , fmt ) ;
printf ( " %s= " , key ) ;
vprintf ( fmt , ap ) ;
va_end ( ap ) ;
printf ( " %s=%s " , key , value ) ;
}
static void default_print_int ( const char * key , int value )
@ -172,11 +168,51 @@ static void default_print_footer(const char *section)
/* Print helpers */
# define print_fmt0(k, f, ...) w->print_fmt_f(k, f, __VA_ARGS__)
struct print_buf {
char * s ;
int len ;
} ;
static char * fast_asprintf ( struct print_buf * pbuf , const char * fmt , . . . )
{
va_list va ;
int len ;
va_start ( va , fmt ) ;
len = vsnprintf ( NULL , 0 , fmt , va ) ;
va_end ( va ) ;
if ( len < 0 )
goto fail ;
if ( pbuf - > len < len ) {
char * p = av_realloc ( pbuf - > s , len + 1 ) ;
if ( ! p )
goto fail ;
pbuf - > s = p ;
pbuf - > len = len ;
}
va_start ( va , fmt ) ;
len = vsnprintf ( pbuf - > s , len + 1 , fmt , va ) ;
va_end ( va ) ;
if ( len < 0 )
goto fail ;
return pbuf - > s ;
fail :
av_freep ( & pbuf - > s ) ;
pbuf - > len = 0 ;
return NULL ;
}
# define print_fmt0(k, f, ...) do { \
if ( fast_asprintf ( & pbuf , f , __VA_ARGS__ ) ) \
w - > print_str_f ( k , pbuf . s ) ; \
} while ( 0 )
# define print_fmt( k, f, ...) do { \
if ( w - > item_sep ) \
printf ( " %s " , w - > item_sep ) ; \
w - > print_fmt_f ( k , f , __VA_ARGS__ ) ; \
print_fmt0 ( k , f , __VA_ARGS__ ) ; \
} while ( 0 )
# define print_int0(k, v) w->print_int_f(k, v)
@ -194,6 +230,7 @@ static void show_packet(struct writer *w, AVFormatContext *fmt_ctx, AVPacket *pk
{
char val_str [ 128 ] ;
AVStream * st = fmt_ctx - > streams [ pkt - > stream_index ] ;
struct print_buf pbuf = { . s = NULL } ;
if ( packet_idx )
printf ( " %s " , w - > items_sep ) ;
@ -210,6 +247,7 @@ static void show_packet(struct writer *w, AVFormatContext *fmt_ctx, AVPacket *pk
print_fmt ( " pos " , " % " PRId64 , pkt - > pos ) ;
print_fmt ( " flags " , " %c " , pkt - > flags & AV_PKT_FLAG_KEY ? ' K ' : ' _ ' ) ;
w - > print_footer ( " PACKET " ) ;
av_free ( pbuf . s ) ;
fflush ( stdout ) ;
}
@ -227,10 +265,12 @@ static void show_packets(struct writer *w, AVFormatContext *fmt_ctx)
static void default_show_tags ( struct writer * w , AVDictionary * dict )
{
AVDictionaryEntry * tag = NULL ;
struct print_buf pbuf = { . s = NULL } ;
while ( ( tag = av_dict_get ( dict , " " , tag , AV_DICT_IGNORE_SUFFIX ) ) ) {
printf ( " \n TAG: " ) ;
print_str0 ( tag - > key , tag - > value ) ;
}
av_free ( pbuf . s ) ;
}
static void show_stream ( struct writer * w , AVFormatContext * fmt_ctx , int stream_idx )
@ -240,6 +280,7 @@ static void show_stream(struct writer *w, AVFormatContext *fmt_ctx, int stream_i
AVCodec * dec ;
char val_str [ 128 ] ;
AVRational display_aspect_ratio ;
struct print_buf pbuf = { . s = NULL } ;
if ( stream_idx )
printf ( " %s " , w - > items_sep ) ;
@ -307,6 +348,7 @@ static void show_stream(struct writer *w, AVFormatContext *fmt_ctx, int stream_i
w - > show_tags ( w , stream - > metadata ) ;
w - > print_footer ( " STREAM " ) ;
av_free ( pbuf . s ) ;
fflush ( stdout ) ;
}
@ -320,6 +362,7 @@ static void show_streams(struct writer *w, AVFormatContext *fmt_ctx)
static void show_format ( struct writer * w , AVFormatContext * fmt_ctx )
{
char val_str [ 128 ] ;
struct print_buf pbuf = { . s = NULL } ;
w - > print_header ( " FORMAT " ) ;
print_str0 ( " filename " , fmt_ctx - > filename ) ;
@ -332,6 +375,7 @@ static void show_format(struct writer *w, AVFormatContext *fmt_ctx)
print_str ( " bit_rate " , value_string ( val_str , sizeof ( val_str ) , fmt_ctx - > bit_rate , unit_bit_per_second_str ) ) ;
w - > show_tags ( w , fmt_ctx - > metadata ) ;
w - > print_footer ( " FORMAT " ) ;
av_free ( pbuf . s ) ;
fflush ( stdout ) ;
}
@ -380,8 +424,8 @@ static int open_input_file(AVFormatContext **fmt_ctx_ptr, const char *filename)
# define WRITER_FUNC(func) \
. print_header = func # # _print_header , \
. print_footer = func # # _print_footer , \
. print_fmt_f = func # # _print_fmt , \
. print_int_f = func # # _print_int , \
. print_str_f = func # # _print_str , \
. show_tags = func # # _show_tags
static struct writer writers [ ] = { {