Commit 855ea723 authored by Zdenek Kabelac's avatar Zdenek Kabelac

* 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
parent 17308326
......@@ -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;
}
......@@ -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 */
......@@ -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++) {
......
......@@ -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)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment