diff --git a/libavutil/tx_template.c b/libavutil/tx_template.c index c15dc2ea27..666af5e496 100644 --- a/libavutil/tx_template.c +++ b/libavutil/tx_template.c @@ -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; }