Let IDCTs do precalculation outside the inner loops. Speeds up (as expected)
[fjl] / idct.h
diff --git a/idct.h b/idct.h
index 97a6a5cc1f0ea7c9430748783754ef4f36e6bc42..4a16ea004fd8b440965de598cea2493126dcecaf 100644 (file)
--- a/idct.h
+++ b/idct.h
@@ -6,13 +6,26 @@
 #define DCTSIZE 8
 #define DCTSIZE2 64
 
 #define DCTSIZE 8
 #define DCTSIZE2 64
 
-typedef void (idct_func_t)(const int16_t*, const uint32_t*, uint8_t*);
+// void* idct_example_alloc(const uint32_t* quant_table);
+typedef void* (idct_alloc_t)(const uint32_t*);
+
+// void idct_example_free(const void* userdata);
+// userdata is the same as returned by the alloc function.
+typedef void (idct_free_t)(void*);
+
+// void idct_example(const int16_t* input, const void* userdata, uint8_t* output);
+// userdata is the same as returned by the alloc function.
+typedef void (idct_func_t)(const int16_t*, const void*, uint8_t*);
 
 // Non-factorized reference version (section A.3.3 of the JPEG standard).
 
 // Non-factorized reference version (section A.3.3 of the JPEG standard).
-void idct_reference(const int16_t* input, const uint32_t* quant_table, uint8_t* output);
+void* idct_reference_alloc(const uint32_t* quant_table);
+void idct_reference_free(void* userdata);
+void idct_reference(const int16_t* input, const void* userdata, uint8_t* output);
 
 // Floating-point IDCT due to Arai, Agui and Nakajima (also known as AA&N).
 // See idct.c for more details.
 
 // Floating-point IDCT due to Arai, Agui and Nakajima (also known as AA&N).
 // See idct.c for more details.
-void idct_float(const int16_t* input, const uint32_t* quant_table, uint8_t* output);
+void* idct_float_alloc(const uint32_t* quant_table);
+void idct_float_free(void* userdata);
+void idct_float(const int16_t* input, const void* userdata, uint8_t* output);
 
 #endif /* !defined(_IDCT_H) */
 
 #endif /* !defined(_IDCT_H) */