@ -79,6 +79,7 @@ struct section {
# define SECTION_FLAG_IS_WRAPPER 1 ///< the section only contains other sections, but has no data at its own level
# define SECTION_FLAG_IS_WRAPPER 1 ///< the section only contains other sections, but has no data at its own level
# define SECTION_FLAG_IS_ARRAY 2 ///< the section contains an array of elements of the same type
# define SECTION_FLAG_IS_ARRAY 2 ///< the section contains an array of elements of the same type
int flags ;
int flags ;
const char * element_name ; ///< name of the contained element, if provided
} ;
} ;
typedef enum {
typedef enum {
@ -104,10 +105,10 @@ typedef enum {
static const struct section sections [ ] = {
static const struct section sections [ ] = {
[ SECTION_ID_ERROR ] = { SECTION_ID_ERROR , " error " } ,
[ SECTION_ID_ERROR ] = { SECTION_ID_ERROR , " error " } ,
[ SECTION_ID_FORMAT ] = { SECTION_ID_FORMAT , " format " } ,
[ SECTION_ID_FORMAT ] = { SECTION_ID_FORMAT , " format " } ,
[ SECTION_ID_FORMAT_TAGS ] = { SECTION_ID_FORMAT_TAGS , " tags " } ,
[ SECTION_ID_FORMAT_TAGS ] = { SECTION_ID_FORMAT_TAGS , " tags " , . element_name = " tag " } ,
[ SECTION_ID_FRAME ] = { SECTION_ID_FRAME , " frame " } ,
[ SECTION_ID_FRAME ] = { SECTION_ID_FRAME , " frame " } ,
[ SECTION_ID_FRAMES ] = { SECTION_ID_FRAMES , " frames " , SECTION_FLAG_IS_ARRAY } ,
[ SECTION_ID_FRAMES ] = { SECTION_ID_FRAMES , " frames " , SECTION_FLAG_IS_ARRAY } ,
[ SECTION_ID_FRAME_TAGS ] = { SECTION_ID_FRAME_TAGS , " tags " } ,
[ SECTION_ID_FRAME_TAGS ] = { SECTION_ID_FRAME_TAGS , " tags " , . element_name = " tag " } ,
[ SECTION_ID_LIBRARY_VERSION ] = { SECTION_ID_LIBRARY_VERSION , " library_version " } ,
[ SECTION_ID_LIBRARY_VERSION ] = { SECTION_ID_LIBRARY_VERSION , " library_version " } ,
[ SECTION_ID_LIBRARY_VERSIONS ] = { SECTION_ID_LIBRARY_VERSIONS , " library_versions " , SECTION_FLAG_IS_ARRAY } ,
[ SECTION_ID_LIBRARY_VERSIONS ] = { SECTION_ID_LIBRARY_VERSIONS , " library_versions " , SECTION_FLAG_IS_ARRAY } ,
[ SECTION_ID_PACKET ] = { SECTION_ID_PACKET , " packet " } ,
[ SECTION_ID_PACKET ] = { SECTION_ID_PACKET , " packet " } ,
@ -117,7 +118,7 @@ static const struct section sections[] = {
[ SECTION_ID_ROOT ] = { SECTION_ID_ROOT , " root " , SECTION_FLAG_IS_WRAPPER } ,
[ SECTION_ID_ROOT ] = { SECTION_ID_ROOT , " root " , SECTION_FLAG_IS_WRAPPER } ,
[ SECTION_ID_STREAM ] = { SECTION_ID_STREAM , " stream " } ,
[ SECTION_ID_STREAM ] = { SECTION_ID_STREAM , " stream " } ,
[ SECTION_ID_STREAMS ] = { SECTION_ID_STREAMS , " streams " , SECTION_FLAG_IS_ARRAY } ,
[ SECTION_ID_STREAMS ] = { SECTION_ID_STREAMS , " streams " , SECTION_FLAG_IS_ARRAY } ,
[ SECTION_ID_STREAM_TAGS ] = { SECTION_ID_STREAM_TAGS , " tags " } ,
[ SECTION_ID_STREAM_TAGS ] = { SECTION_ID_STREAM_TAGS , " tags " , . element_name = " tag " } ,
} ;
} ;
static const OptionDef * options ;
static const OptionDef * options ;
@ -488,6 +489,8 @@ typedef struct DefaultContext {
const AVClass * class ;
const AVClass * class ;
int nokey ;
int nokey ;
int noprint_wrappers ;
int noprint_wrappers ;
int nested_section [ SECTION_MAX_NB_LEVELS ] ;
AVBPrint prefix [ SECTION_MAX_NB_LEVELS ] ;
} DefaultContext ;
} DefaultContext ;
# define OFFSET(x) offsetof(DefaultContext, x)
# define OFFSET(x) offsetof(DefaultContext, x)
@ -512,6 +515,25 @@ static inline char *upcase_string(char *dst, size_t dst_size, const char *src)
return dst ;
return dst ;
}
}
static int default_init ( WriterContext * wctx )
{
DefaultContext * def = wctx - > priv ;
int i ;
for ( i = 0 ; i < SECTION_MAX_NB_LEVELS ; i + + )
av_bprint_init ( & def - > prefix [ i ] , 1 , AV_BPRINT_SIZE_UNLIMITED ) ;
return 0 ;
}
static void default_uninit ( WriterContext * wctx )
{
DefaultContext * def = wctx - > priv ;
int i ;
for ( i = 0 ; i < SECTION_MAX_NB_LEVELS ; i + + )
av_bprint_finalize ( & def - > prefix [ i ] , NULL ) ;
}
static void default_print_section_header ( WriterContext * wctx )
static void default_print_section_header ( WriterContext * wctx )
{
{
DefaultContext * def = wctx - > priv ;
DefaultContext * def = wctx - > priv ;
@ -520,9 +542,16 @@ static void default_print_section_header(WriterContext *wctx)
const struct section * parent_section = wctx - > level ?
const struct section * parent_section = wctx - > level ?
wctx - > section [ wctx - > level - 1 ] : NULL ;
wctx - > section [ wctx - > level - 1 ] : NULL ;
if ( def - > noprint_wrappers | |
av_bprint_clear ( & def - > prefix [ wctx - > level ] ) ;
( parent_section & &
if ( parent_section & &
! ( parent_section - > flags & ( SECTION_FLAG_IS_WRAPPER | SECTION_FLAG_IS_ARRAY ) ) ) )
! ( parent_section - > flags & ( SECTION_FLAG_IS_WRAPPER | SECTION_FLAG_IS_ARRAY ) ) ) {
def - > nested_section [ wctx - > level ] = 1 ;
av_bprintf ( & def - > prefix [ wctx - > level ] , " %s%s: " , def - > prefix [ wctx - > level - 1 ] . str ,
upcase_string ( buf , sizeof ( buf ) ,
av_x_if_null ( section - > element_name , section - > name ) ) ) ;
}
if ( def - > noprint_wrappers | | def - > nested_section [ wctx - > level ] )
return ;
return ;
if ( ! ( section - > flags & ( SECTION_FLAG_IS_WRAPPER | SECTION_FLAG_IS_ARRAY ) ) )
if ( ! ( section - > flags & ( SECTION_FLAG_IS_WRAPPER | SECTION_FLAG_IS_ARRAY ) ) )
@ -533,13 +562,9 @@ static void default_print_section_footer(WriterContext *wctx)
{
{
DefaultContext * def = wctx - > priv ;
DefaultContext * def = wctx - > priv ;
const struct section * section = wctx - > section [ wctx - > level ] ;
const struct section * section = wctx - > section [ wctx - > level ] ;
const struct section * parent_section = wctx - > level ?
wctx - > section [ wctx - > level - 1 ] : NULL ;
char buf [ 32 ] ;
char buf [ 32 ] ;
if ( def - > noprint_wrappers | |
if ( def - > noprint_wrappers | | def - > nested_section [ wctx - > level ] )
( parent_section & &
! ( parent_section - > flags & ( SECTION_FLAG_IS_WRAPPER | SECTION_FLAG_IS_ARRAY ) ) ) )
return ;
return ;
if ( ! ( section - > flags & ( SECTION_FLAG_IS_WRAPPER | SECTION_FLAG_IS_ARRAY ) ) )
if ( ! ( section - > flags & ( SECTION_FLAG_IS_WRAPPER | SECTION_FLAG_IS_ARRAY ) ) )
@ -549,11 +574,9 @@ static void default_print_section_footer(WriterContext *wctx)
static void default_print_str ( WriterContext * wctx , const char * key , const char * value )
static void default_print_str ( WriterContext * wctx , const char * key , const char * value )
{
{
DefaultContext * def = wctx - > priv ;
DefaultContext * def = wctx - > priv ;
const struct section * section = wctx - > section [ wctx - > level ] ;
const char * key_prefix = ! strcmp ( section - > name , " tags " ) ? " TAG: " : " " ;
if ( ! def - > nokey )
if ( ! def - > nokey )
printf ( " %s%s= " , key_prefix , key ) ;
printf ( " %s%s= " , def - > prefix [ wctx - > level ] . str , key ) ;
printf ( " %s \n " , value ) ;
printf ( " %s \n " , value ) ;
}
}
@ -562,13 +585,15 @@ static void default_print_int(WriterContext *wctx, const char *key, long long in
DefaultContext * def = wctx - > priv ;
DefaultContext * def = wctx - > priv ;
if ( ! def - > nokey )
if ( ! def - > nokey )
printf ( " %s= " , key ) ;
printf ( " %s%s = " , def - > prefix [ wctx - > level ] . str , key ) ;
printf ( " %lld \n " , value ) ;
printf ( " %lld \n " , value ) ;
}
}
static const Writer default_writer = {
static const Writer default_writer = {
. name = " default " ,
. name = " default " ,
. priv_size = sizeof ( DefaultContext ) ,
. priv_size = sizeof ( DefaultContext ) ,
. init = default_init ,
. uninit = default_uninit ,
. print_section_header = default_print_section_header ,
. print_section_header = default_print_section_header ,
. print_section_footer = default_print_section_footer ,
. print_section_footer = default_print_section_footer ,
. print_integer = default_print_int ,
. print_integer = default_print_int ,