diff utils.c @ 902:6acc8394960d libavcodec

* two functions to handle allocation of static data more simple av_mallocz_static - called for every static data table av_free_static - called when ffmpeg is no longer needed and should free all static resources * simple usage shown in mpegaudiodec.c
author kabi
date Tue, 03 Dec 2002 19:40:35 +0000
parents 058194d7ade6
children 22ee74da2cd3
line wrap: on
line diff
--- a/utils.c	Tue Dec 03 15:42:17 2002 +0000
+++ b/utils.c	Tue Dec 03 19:40:35 2002 +0000
@@ -30,6 +30,43 @@
     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)
 {