for(i=0;i<nb_input_files;i++)
av_close_input_file(input_files[i]);
+ av_free_static();
return 0;
}
void av_free(void *ptr);
void __av_freep(void **ptr);
#define av_freep(p) __av_freep((void **)(p))
+/* for static data only */
+/* call av_free_static to release all staticaly allocated tables */
+void av_free_static();
+void *__av_mallocz_static(void** location, unsigned int size);
+#define av_mallocz_static(p, s) __av_mallocz_static((void **)(p), s)
#endif /* AVCODEC_H */
band_index_long[i][22] = k;
}
- /* compute n ^ (4/3) and store it in mantissa/exp format */
- table_4_3_exp = av_mallocz(TABLE_4_3_SIZE *
- sizeof(table_4_3_exp[0]));
- if (!table_4_3_exp)
+ /* compute n ^ (4/3) and store it in mantissa/exp format */
+ if (!av_mallocz_static(&table_4_3_exp,
+ TABLE_4_3_SIZE * sizeof(table_4_3_exp[0])))
+ return -1;
+ if (!av_mallocz_static(&table_4_3_value,
+ TABLE_4_3_SIZE * sizeof(table_4_3_value[0])))
return -1;
- table_4_3_value = av_mallocz(TABLE_4_3_SIZE *
- sizeof(table_4_3_value[0]));
- if (!table_4_3_value) {
- av_free(table_4_3_exp);
- return -1;
- }
int_pow_init();
for(i=1;i<TABLE_4_3_SIZE;i++) {
return ptr;
}
+/* allocation of static arrays - do not use for normal allocation */
+static unsigned int last_static = 0;
+static char*** array_static = NULL;
+static const unsigned int grow_static = 64; // ^2
+void *__av_mallocz_static(void** location, unsigned int size)
+{
+ int l = (last_static + grow_static) & ~(grow_static - 1);
+ void *ptr = av_mallocz(size);
+ if (!ptr)
+ return NULL;
+
+ if (location)
+ {
+ if (l > last_static)
+ array_static = realloc(array_static, l);
+ array_static[last_static++] = (char**) location;
+ *location = ptr;
+ }
+ return ptr;
+}
+/* free all static arrays and reset pointers to 0 */
+void av_free_static()
+{
+ if (array_static)
+ {
+ unsigned i;
+ for (i = 0; i < last_static; i++)
+ {
+ free(*array_static[i]);
+ *array_static[i] = NULL;
+ }
+ free(array_static);
+ array_static = 0;
+ }
+ last_static = 0;
+}
+
/* cannot call it directly because of 'void **' casting is not automatic */
void __av_freep(void **ptr)
{