@ -55,16 +55,10 @@ TABLE_DEF(53, 12);
TABLE_DEF ( 7 , 6 ) ;
TABLE_DEF ( 9 , 8 ) ;
typedef struct FFSRTabsInitOnce {
typedef struct FFTabInitData {
void ( * func ) ( void ) ;
AVOnce control ;
} FFSRTabsInitOnce ;
typedef struct FFSRTabsInitOnceExt {
void ( * func ) ( void ) ;
AVOnce control ;
int factors [ TX_MAX_SUB ] ; /* Must be sorted high -> low */
} FFSRTabsInitOnceExt ;
} FFTabInitData ;
# define SR_TABLE(len) \
static av_cold void TX_TAB ( ff_tx_init_tab_ # # len ) ( void ) \
@ -80,9 +74,14 @@ static av_cold void TX_TAB(ff_tx_init_tab_ ##len)(void) \
SR_POW2_TABLES
# undef SR_TABLE
static FFSRTabsInitOnce sr_tabs_init_once [ ] = {
# define SR_TABLE(len) \
{ TX_TAB ( ff_tx_init_tab_ # # len ) , AV_ONCE_INIT } ,
static void ( * const sr_tabs_init_funcs [ ] ) ( void ) = {
# define SR_TABLE(len) TX_TAB(ff_tx_init_tab_ ##len),
SR_POW2_TABLES
# undef SR_TABLE
} ;
static AVOnce sr_tabs_init_once [ ] = {
# define SR_TABLE(len) AV_ONCE_INIT,
SR_POW2_TABLES
# undef SR_TABLE
} ;
@ -128,10 +127,16 @@ static av_cold void TX_TAB(ff_tx_init_tab_9)(void)
TX_TAB ( ff_tx_tab_9 ) [ 7 ] = TX_TAB ( ff_tx_tab_9 ) [ 3 ] - TX_TAB ( ff_tx_tab_9 ) [ 4 ] ;
}
static FFSRTabsInitOnceExt nptwo_tabs_init_once [ ] = {
{ TX_TAB ( ff_tx_init_tab_53 ) , AV_ONCE_INIT , { 15 , 5 , 3 } } ,
{ TX_TAB ( ff_tx_init_tab_9 ) , AV_ONCE_INIT , { 9 } } ,
{ TX_TAB ( ff_tx_init_tab_7 ) , AV_ONCE_INIT , { 7 } } ,
static const FFTabInitData nptwo_tabs_init_data [ ] = {
{ TX_TAB ( ff_tx_init_tab_53 ) , { 15 , 5 , 3 } } ,
{ TX_TAB ( ff_tx_init_tab_9 ) , { 9 } } ,
{ TX_TAB ( ff_tx_init_tab_7 ) , { 7 } } ,
} ;
static AVOnce nptwo_tabs_init_once [ ] = {
AV_ONCE_INIT ,
AV_ONCE_INIT ,
AV_ONCE_INIT ,
} ;
av_cold void TX_TAB ( ff_tx_init_tabs ) ( int len )
@ -140,23 +145,23 @@ av_cold void TX_TAB(ff_tx_init_tabs)(int len)
if ( factor_2 ) {
int idx = factor_2 - 3 ;
for ( int i = 0 ; i < = idx ; i + + )
ff_thread_once ( & sr_tabs_init_once [ i ] . control ,
sr_tabs_init_once [ i ] . func ) ;
ff_thread_once ( & sr_tabs_init_once [ i ] ,
sr_tabs_init_funcs [ i ] ) ;
len > > = factor_2 ;
}
for ( int i = 0 ; i < FF_ARRAY_ELEMS ( nptwo_tabs_init_once ) ; i + + ) {
for ( int i = 0 ; i < FF_ARRAY_ELEMS ( nptwo_tabs_init_data ) ; i + + ) {
int f , f_idx = 0 ;
if ( len < = 1 )
return ;
while ( ( f = nptwo_tabs_init_once [ i ] . factors [ f_idx + + ] ) ) {
while ( ( f = nptwo_tabs_init_data [ i ] . factors [ f_idx + + ] ) ) {
if ( f % len )
continue ;
ff_thread_once ( & nptwo_tabs_init_once [ i ] . control ,
nptwo_tabs_init_once [ i ] . func ) ;
ff_thread_once ( & nptwo_tabs_init_once [ i ] ,
nptwo_tabs_init_data [ i ] . func ) ;
len / = f ;
break ;
}