@ -57,6 +57,7 @@ static int do_show_error = 0;
static int do_show_format = 0 ;
static int do_show_frames = 0 ;
static int do_show_packets = 0 ;
static int do_show_programs = 0 ;
static int do_show_streams = 0 ;
static int do_show_stream_disposition = 0 ;
static int do_show_data = 0 ;
@ -108,7 +109,14 @@ typedef enum {
SECTION_ID_PACKET ,
SECTION_ID_PACKETS ,
SECTION_ID_PACKETS_AND_FRAMES ,
SECTION_ID_PROGRAM_STREAM_DISPOSITION ,
SECTION_ID_PROGRAM_STREAM_TAGS ,
SECTION_ID_PROGRAM ,
SECTION_ID_PROGRAM_STREAMS ,
SECTION_ID_PROGRAM_STREAM ,
SECTION_ID_PROGRAM_TAGS ,
SECTION_ID_PROGRAM_VERSION ,
SECTION_ID_PROGRAMS ,
SECTION_ID_ROOT ,
SECTION_ID_STREAM ,
SECTION_ID_STREAM_DISPOSITION ,
@ -131,10 +139,17 @@ static struct section sections[] = {
[ SECTION_ID_PACKETS ] = { SECTION_ID_PACKETS , " packets " , SECTION_FLAG_IS_ARRAY , { SECTION_ID_PACKET , - 1 } } ,
[ SECTION_ID_PACKETS_AND_FRAMES ] = { SECTION_ID_PACKETS_AND_FRAMES , " packets_and_frames " , SECTION_FLAG_IS_ARRAY , { SECTION_ID_PACKET , - 1 } } ,
[ SECTION_ID_PACKET ] = { SECTION_ID_PACKET , " packet " , 0 , { - 1 } } ,
[ SECTION_ID_PROGRAM_STREAM_DISPOSITION ] = { SECTION_ID_PROGRAM_STREAM_DISPOSITION , " disposition " , 0 , { - 1 } , . unique_name = " program_stream_disposition " } ,
[ SECTION_ID_PROGRAM_STREAM_TAGS ] = { SECTION_ID_PROGRAM_STREAM_TAGS , " tags " , SECTION_FLAG_HAS_VARIABLE_FIELDS , { - 1 } , . element_name = " tag " , . unique_name = " program_stream_tags " } ,
[ SECTION_ID_PROGRAM ] = { SECTION_ID_PROGRAM , " program " , 0 , { SECTION_ID_PROGRAM_TAGS , SECTION_ID_PROGRAM_STREAMS , - 1 } } ,
[ SECTION_ID_PROGRAM_STREAMS ] = { SECTION_ID_PROGRAM_STREAMS , " streams " , SECTION_FLAG_IS_ARRAY , { SECTION_ID_PROGRAM_STREAM , - 1 } , . unique_name = " program_streams " } ,
[ SECTION_ID_PROGRAM_STREAM ] = { SECTION_ID_PROGRAM_STREAM , " stream " , 0 , { SECTION_ID_PROGRAM_STREAM_DISPOSITION , SECTION_ID_PROGRAM_STREAM_TAGS , - 1 } , . unique_name = " program_stream " } ,
[ SECTION_ID_PROGRAM_TAGS ] = { SECTION_ID_PROGRAM_TAGS , " tags " , SECTION_FLAG_HAS_VARIABLE_FIELDS , { - 1 } , . element_name = " tag " , . unique_name = " program_tags " } ,
[ SECTION_ID_PROGRAM_VERSION ] = { SECTION_ID_PROGRAM_VERSION , " program_version " , 0 , { - 1 } } ,
[ SECTION_ID_PROGRAMS ] = { SECTION_ID_PROGRAMS , " programs " , SECTION_FLAG_IS_ARRAY , { SECTION_ID_PROGRAM , - 1 } } ,
[ SECTION_ID_ROOT ] = { SECTION_ID_ROOT , " root " , SECTION_FLAG_IS_WRAPPER ,
{ SECTION_ID_CHAPTERS , SECTION_ID_FORMAT , SECTION_ID_FRAMES , SECTION_ID_STREAMS , SECTION_ID_PACKETS ,
SECTION_ID_ERROR , SECTION_ID_PROGRAM_VERSION , SECTION_ID_LIBRARY_VERSIONS , - 1 } } ,
{ SECTION_ID_CHAPTERS , SECTION_ID_FORMAT , SECTION_ID_FRAMES , SECTION_ID_PROGRAMS , SECTION_ID_STREAM S ,
SECTION_ID_PACKETS , SECTION_ID_ ERROR , SECTION_ID_PROGRAM_VERSION , SECTION_ID_LIBRARY_VERSIONS , - 1 } } ,
[ SECTION_ID_STREAMS ] = { SECTION_ID_STREAMS , " streams " , SECTION_FLAG_IS_ARRAY , { SECTION_ID_STREAM , - 1 } } ,
[ SECTION_ID_STREAM ] = { SECTION_ID_STREAM , " stream " , 0 , { SECTION_ID_STREAM_DISPOSITION , SECTION_ID_STREAM_TAGS , - 1 } } ,
[ SECTION_ID_STREAM_DISPOSITION ] = { SECTION_ID_STREAM_DISPOSITION , " disposition " , 0 , { - 1 } , . unique_name = " stream_disposition " } ,
@ -1611,7 +1626,7 @@ static void read_packets(WriterContext *w, AVFormatContext *fmt_ctx)
}
}
static void show_stream ( WriterContext * w , AVFormatContext * fmt_ctx , int stream_idx )
static void show_stream ( WriterContext * w , AVFormatContext * fmt_ctx , int stream_idx , int in_program )
{
AVStream * stream = fmt_ctx - > streams [ stream_idx ] ;
AVCodecContext * dec_ctx ;
@ -1623,7 +1638,7 @@ static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_i
av_bprint_init ( & pbuf , 1 , AV_BPRINT_SIZE_UNLIMITED ) ;
writer_print_section_header ( w , SECTION_ID_STREAM ) ;
writer_print_section_header ( w , in_program ? SECTION_ID_PROGRAM_STREAM : SECTION_ID_STREAM ) ;
print_int ( " index " , stream - > index ) ;
@ -1739,7 +1754,7 @@ static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_i
} while ( 0 )
if ( do_show_stream_disposition ) {
writer_print_section_header ( w , SECTION_ID_STREAM_DISPOSITION ) ;
writer_print_section_header ( w , in_program ? SECTION_ID_PROGRAM_STREAM_DISPOSITION : SECTION_ID_STREAM_DISPOSITION ) ;
PRINT_DISPOSITION ( DEFAULT , " default " ) ;
PRINT_DISPOSITION ( DUB , " dub " ) ;
PRINT_DISPOSITION ( ORIGINAL , " original " ) ;
@ -1754,7 +1769,7 @@ static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_i
writer_print_section_footer ( w ) ;
}
show_tags ( w , stream - > metadata , SECTION_ID_STREAM_TAGS ) ;
show_tags ( w , stream - > metadata , in_program ? SECTION_ID_PROGRAM_STREAM_TAGS : SECTION_ID_STREAM_TAGS ) ;
writer_print_section_footer ( w ) ;
av_bprint_finalize ( & pbuf , NULL ) ;
@ -1767,7 +1782,47 @@ static void show_streams(WriterContext *w, AVFormatContext *fmt_ctx)
writer_print_section_header ( w , SECTION_ID_STREAMS ) ;
for ( i = 0 ; i < fmt_ctx - > nb_streams ; i + + )
if ( selected_streams [ i ] )
show_stream ( w , fmt_ctx , i ) ;
show_stream ( w , fmt_ctx , i , 0 ) ;
writer_print_section_footer ( w ) ;
}
static void show_program ( WriterContext * w , AVFormatContext * fmt_ctx , AVProgram * program )
{
int i ;
writer_print_section_header ( w , SECTION_ID_PROGRAM ) ;
print_int ( " program_id " , program - > id ) ;
print_int ( " program_num " , program - > program_num ) ;
print_int ( " nb_streams " , program - > nb_stream_indexes ) ;
print_int ( " pmt_pid " , program - > pmt_pid ) ;
print_int ( " pcr_pid " , program - > pcr_pid ) ;
print_ts ( " start_pts " , program - > start_time ) ;
print_time ( " start_time " , program - > start_time , & AV_TIME_BASE_Q ) ;
print_ts ( " end_pts " , program - > end_time ) ;
print_time ( " end_time " , program - > end_time , & AV_TIME_BASE_Q ) ;
show_tags ( w , program - > metadata , SECTION_ID_PROGRAM_TAGS ) ;
writer_print_section_header ( w , SECTION_ID_PROGRAM_STREAMS ) ;
for ( i = 0 ; i < program - > nb_stream_indexes ; i + + ) {
if ( selected_streams [ program - > stream_index [ i ] ] )
show_stream ( w , fmt_ctx , program - > stream_index [ i ] , 1 ) ;
}
writer_print_section_footer ( w ) ;
writer_print_section_footer ( w ) ;
}
static void show_programs ( WriterContext * w , AVFormatContext * fmt_ctx )
{
int i ;
writer_print_section_header ( w , SECTION_ID_PROGRAMS ) ;
for ( i = 0 ; i < fmt_ctx - > nb_programs ; i + + ) {
AVProgram * program = fmt_ctx - > programs [ i ] ;
if ( ! program )
continue ;
show_program ( w , fmt_ctx , program ) ;
}
writer_print_section_footer ( w ) ;
}
@ -1800,6 +1855,7 @@ static void show_format(WriterContext *w, AVFormatContext *fmt_ctx)
writer_print_section_header ( w , SECTION_ID_FORMAT ) ;
print_str ( " filename " , fmt_ctx - > filename ) ;
print_int ( " nb_streams " , fmt_ctx - > nb_streams ) ;
print_int ( " nb_programs " , fmt_ctx - > nb_programs ) ;
print_str ( " format_name " , fmt_ctx - > iformat - > name ) ;
if ( ! do_bitexact ) {
if ( fmt_ctx - > iformat - > long_name ) print_str ( " format_long_name " , fmt_ctx - > iformat - > long_name ) ;
@ -1953,6 +2009,8 @@ static int probe_file(WriterContext *wctx, const char *filename)
if ( do_show_frames | | do_show_packets )
writer_print_section_footer ( wctx ) ;
}
if ( do_show_programs )
show_programs ( wctx , fmt_ctx ) ;
if ( do_show_streams )
show_streams ( wctx , fmt_ctx ) ;
if ( do_show_chapters )
@ -2219,6 +2277,7 @@ DEFINE_OPT_SHOW_SECTION(library_versions, LIBRARY_VERSIONS);
DEFINE_OPT_SHOW_SECTION ( packets , PACKETS ) ;
DEFINE_OPT_SHOW_SECTION ( program_version , PROGRAM_VERSION ) ;
DEFINE_OPT_SHOW_SECTION ( streams , STREAMS ) ;
DEFINE_OPT_SHOW_SECTION ( programs , PROGRAMS ) ;
static const OptionDef real_options [ ] = {
# include "cmdutils_common_opts.h"
@ -2245,6 +2304,7 @@ static const OptionDef real_options[] = {
{ " show_entries " , HAS_ARG , { . func_arg = opt_show_entries } ,
" show a set of specified entries " , " entry_list " } ,
{ " show_packets " , 0 , { ( void * ) & opt_show_packets } , " show packets info " } ,
{ " show_programs " , 0 , { ( void * ) & opt_show_programs } , " show programs info " } ,
{ " show_streams " , 0 , { ( void * ) & opt_show_streams } , " show streams info " } ,
{ " show_chapters " , 0 , { ( void * ) & opt_show_chapters } , " show chapters info " } ,
{ " count_frames " , OPT_BOOL , { ( void * ) & do_count_frames } , " count the number of frames per stream " } ,
@ -2308,8 +2368,10 @@ int main(int argc, char **argv)
SET_DO_SHOW ( LIBRARY_VERSIONS , library_versions ) ;
SET_DO_SHOW ( PACKETS , packets ) ;
SET_DO_SHOW ( PROGRAM_VERSION , program_version ) ;
SET_DO_SHOW ( PROGRAMS , programs ) ;
SET_DO_SHOW ( STREAMS , streams ) ;
SET_DO_SHOW ( STREAM_DISPOSITION , stream_disposition ) ;
SET_DO_SHOW ( PROGRAM_STREAM_DISPOSITION , stream_disposition ) ;
if ( do_bitexact & & ( do_show_program_version | | do_show_library_versions ) ) {
av_log ( NULL , AV_LOG_ERROR ,
@ -2347,7 +2409,7 @@ int main(int argc, char **argv)
ffprobe_show_library_versions ( wctx ) ;
if ( ! input_filename & &
( ( do_show_format | | do_show_streams | | do_show_chapters | | do_show_packets | | do_show_error ) | |
( ( do_show_format | | do_show_programs | | do_show_ streams | | do_show_chapters | | 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 " ) ;