Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-10-22 16:22:07 +0300
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-10-28 10:30:10 +0300
commitf8efd890bf2ea424b263a02772e4107f80608b59 (patch)
tree03908352c0a228f4d25022739469c50b93dd2e3b /libavutil/tx_template.c
parent188216581bc73572bebacab571d7c0468680b8d1 (diff)
avutil/tx_template: Move function pointers to const memory
This can be achieved by moving the AVOnce out of the structure containing the function pointers; the latter can then be made const. This also has the advantage of eliminating padding in the structure (sizeof(AVOnce) is four here) and allowing the AVOnces to be put into .bss (dependening upon the implementation). Reviewed-by: Lynne <dev@lynne.ee> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavutil/tx_template.c')
-rw-r--r--libavutil/tx_template.c47
1 files changed, 26 insertions, 21 deletions
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;
}