aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZdenek Kabelac <kabi@informatics.muni.cz>2002-12-03 19:40:35 +0000
committerZdenek Kabelac <kabi@informatics.muni.cz>2002-12-03 19:40:35 +0000
commit855ea723b0ea450137e54674179751c14e8fc6b5 (patch)
treee8c81d27ce40b9c8f4f064cf06b464e26fed4d09
parent17308326396778cd31451ef7a69c36c7ccb7cab7 (diff)
downloadffmpeg-855ea723b0ea450137e54674179751c14e8fc6b5.tar.gz
* 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 Originally committed as revision 1301 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--ffmpeg.c1
-rw-r--r--libavcodec/avcodec.h5
-rw-r--r--libavcodec/mpegaudiodec.c16
-rw-r--r--libavcodec/utils.c37
4 files changed, 49 insertions, 10 deletions
diff --git a/ffmpeg.c b/ffmpeg.c
index 9defc3cf3b..2e76f384ea 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -2667,5 +2667,6 @@ int main(int argc, char **argv)
for(i=0;i<nb_input_files;i++)
av_close_input_file(input_files[i]);
+ av_free_static();
return 0;
}
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 963e5f100a..7bfdc99a27 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1061,5 +1061,10 @@ void *av_mallocz(unsigned int size);
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 */
diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c
index a119b481d5..b2c0966aa0 100644
--- a/libavcodec/mpegaudiodec.c
+++ b/libavcodec/mpegaudiodec.c
@@ -379,17 +379,13 @@ static int decode_init(AVCodecContext * avctx)
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++) {
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 6797508e1b..969507e5ea 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -30,6 +30,43 @@ void *av_mallocz(unsigned int size)
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)
{