提交 8d1f2ba5 编写于 作者: M Michael Niedermayer

static allocation rewrite (old code was plain a broken mess)

 doesnt call realloc every time
 doesnt randomly overwrite memory after after 8-16 calls
 doesnt use ugly macro wraper
 fewer lines of code

Originally committed as revision 2912 to svn://svn.ffmpeg.org/ffmpeg/trunk
上级 2a42b5c3
...@@ -2096,8 +2096,7 @@ void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size); ...@@ -2096,8 +2096,7 @@ void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size);
/* for static data only */ /* for static data only */
/* call av_free_static to release all staticaly allocated tables */ /* call av_free_static to release all staticaly allocated tables */
void av_free_static(void); void av_free_static(void);
void *__av_mallocz_static(void** location, unsigned int size); void *av_mallocz_static(unsigned int size);
#define av_mallocz_static(p, s) __av_mallocz_static((void **)(p), s)
/* add by bero : in adx.c */ /* add by bero : in adx.c */
int is_adx(const unsigned char *buf,size_t bufsize); int is_adx(const unsigned char *buf,size_t bufsize);
......
...@@ -400,11 +400,11 @@ static int decode_init(AVCodecContext * avctx) ...@@ -400,11 +400,11 @@ static int decode_init(AVCodecContext * avctx)
} }
/* compute n ^ (4/3) and store it in mantissa/exp format */ /* compute n ^ (4/3) and store it in mantissa/exp format */
if (!av_mallocz_static(&table_4_3_exp, table_4_3_exp= av_mallocz_static(TABLE_4_3_SIZE * sizeof(table_4_3_exp[0]));
TABLE_4_3_SIZE * sizeof(table_4_3_exp[0]))) if(!table_4_3_exp)
return -1; return -1;
if (!av_mallocz_static(&table_4_3_value, table_4_3_value= av_mallocz_static(TABLE_4_3_SIZE * sizeof(table_4_3_value[0]));
TABLE_4_3_SIZE * sizeof(table_4_3_value[0]))) if(!table_4_3_value)
return -1; return -1;
int_pow_init(); int_pow_init();
......
...@@ -66,41 +66,35 @@ void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size) ...@@ -66,41 +66,35 @@ void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size)
} }
/* allocation of static arrays - do not use for normal allocation */
static unsigned int last_static = 0; static unsigned int last_static = 0;
static char*** array_static = NULL; static unsigned int allocated_static = 0;
static void** array_static = NULL;
static const unsigned int grow_static = 64; // ^2 static const unsigned int grow_static = 64; // ^2
void *__av_mallocz_static(void** location, unsigned int size)
/**
* allocation of static arrays - do not use for normal allocation.
*/
void *av_mallocz_static(unsigned int size)
{ {
unsigned int l = (last_static + grow_static) & ~(grow_static - 1);
void *ptr = av_mallocz(size); void *ptr = av_mallocz(size);
if (!ptr)
return NULL; if(ptr){
array_static =av_fast_realloc(array_static, &allocated_static, last_static+1);
if (location) array_static[last_static++] = ptr;
{
if (l > last_static)
array_static = av_realloc(array_static, l);
array_static[last_static++] = (char**) location;
*location = ptr;
} }
return ptr; return ptr;
} }
/* free all static arrays and reset pointers to 0 */
/**
* free all static arrays and reset pointers to 0.
*/
void av_free_static(void) void av_free_static(void)
{ {
if (array_static) while(last_static){
{ av_freep(&array_static[--last_static]);
unsigned i;
for (i = 0; i < last_static; i++)
{
av_free(*array_static[i]);
*array_static[i] = NULL;
}
av_free(array_static);
array_static = 0;
} }
last_static = 0; av_freep(&array_static);
} }
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册