@ -81,36 +81,64 @@ static const struct {
{ " 5.0 " , 5 , AV_CH_LAYOUT_5POINT0_BACK } ,
{ " 5.1 " , 6 , AV_CH_LAYOUT_5POINT1 } ,
{ " 5.1 " , 6 , AV_CH_LAYOUT_5POINT1_BACK } ,
{ " 5.1+downmix " , 8 , AV_CH_LAYOUT_5POINT1 | AV_CH_LAYOUT_STEREO_DOWNMIX , } ,
{ " 6.0 " , 6 , AV_CH_LAYOUT_6POINT0 } ,
{ " 6.0(front) " , 6 , AV_CH_LAYOUT_6POINT0_FRONT } ,
{ " hexagonal " , 6 , AV_CH_LAYOUT_HEXAGONAL } ,
{ " 6.1 " , 7 , AV_CH_LAYOUT_6POINT1 } ,
{ " 6.1 " , 7 , AV_CH_LAYOUT_6POINT1_BACK } ,
{ " 6.1(front) " , 7 , AV_CH_LAYOUT_6POINT1_FRONT } ,
{ " 6.1+downmix " , 9 , AV_CH_LAYOUT_6POINT1 | AV_CH_LAYOUT_STEREO_DOWNMIX , } ,
{ " 7.0 " , 7 , AV_CH_LAYOUT_7POINT0 } ,
{ " 7.0(front) " , 7 , AV_CH_LAYOUT_7POINT0_FRONT } ,
{ " 7.1 " , 8 , AV_CH_LAYOUT_7POINT1 } ,
{ " 7.1(wide) " , 8 , AV_CH_LAYOUT_7POINT1_WIDE } ,
{ " 7.1(wide) " , 8 , AV_CH_LAYOUT_7POINT1_WIDE_BACK } ,
{ " 7.1+downmix " , 10 , AV_CH_LAYOUT_7POINT1 | AV_CH_LAYOUT_STEREO_DOWNMIX , } ,
{ " octagonal " , 8 , AV_CH_LAYOUT_OCTAGONAL } ,
{ " downmix " , 2 , AV_CH_LAYOUT_STEREO_DOWNMIX , } ,
{ 0 }
} ;
uint64_t av_ get_channel_layout( const char * name )
static uint64_t get_channel_layout_single ( const char * name , int name_len )
{
int i = 0 ;
do {
if ( ! strcmp ( channel_layout_map [ i ] . name , name ) )
return channel_layout_map [ i ] . layout ;
i + + ;
} while ( channel_layout_map [ i ] . name ) ;
int i ;
char * end ;
int64_t layout ;
for ( i = 0 ; i < FF_ARRAY_ELEMS ( channel_layout_map ) - 1 ; i + + ) {
if ( strlen ( channel_layout_map [ i ] . name ) = = name_len & &
! memcmp ( channel_layout_map [ i ] . name , name , name_len ) )
return channel_layout_map [ i ] . layout ;
}
for ( i = 0 ; i < FF_ARRAY_ELEMS ( channel_names ) ; i + + )
if ( channel_names [ i ] & &
strlen ( channel_names [ i ] ) = = name_len & &
! memcmp ( channel_names [ i ] , name , name_len ) )
return ( int64_t ) 1 < < i ;
i = strtol ( name , & end , 10 ) ;
if ( end - name = = name_len | |
( end + 1 - name = = name_len & & * end = = ' c ' ) )
return av_get_default_channel_layout ( i ) ;
layout = strtoll ( name , & end , 0 ) ;
if ( end - name = = name_len )
return FFMAX ( layout , 0 ) ;
return 0 ;
}
uint64_t av_get_channel_layout ( const char * name )
{
const char * n , * e ;
const char * name_end = name + strlen ( name ) ;
int64_t layout = 0 , layout_single ;
for ( n = name ; n < name_end ; n = e + 1 ) {
for ( e = n ; e < name_end & & * e ! = ' + ' & & * e ! = ' | ' ; e + + ) ;
layout_single = get_channel_layout_single ( n , e - n ) ;
if ( ! layout_single )
return 0 ;
layout | = layout_single ;
}
return layout ;
}
void av_get_channel_layout_string ( char * buf , int buf_size ,
int nb_channels , uint64_t channel_layout )
{