mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
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
This commit is contained in:
parent
2a42b5c37f
commit
8d1f2ba5e1
@ -2096,8 +2096,7 @@ void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size);
|
||||
/* for static data only */
|
||||
/* call av_free_static to release all staticaly allocated tables */
|
||||
void av_free_static(void);
|
||||
void *__av_mallocz_static(void** location, unsigned int size);
|
||||
#define av_mallocz_static(p, s) __av_mallocz_static((void **)(p), s)
|
||||
void *av_mallocz_static(unsigned int size);
|
||||
|
||||
/* add by bero : in adx.c */
|
||||
int is_adx(const unsigned char *buf,size_t bufsize);
|
||||
|
@ -400,11 +400,11 @@ static int decode_init(AVCodecContext * avctx)
|
||||
}
|
||||
|
||||
/* 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])))
|
||||
table_4_3_exp= av_mallocz_static(TABLE_4_3_SIZE * sizeof(table_4_3_exp[0]));
|
||||
if(!table_4_3_exp)
|
||||
return -1;
|
||||
if (!av_mallocz_static(&table_4_3_value,
|
||||
TABLE_4_3_SIZE * sizeof(table_4_3_value[0])))
|
||||
table_4_3_value= av_mallocz_static(TABLE_4_3_SIZE * sizeof(table_4_3_value[0]));
|
||||
if(!table_4_3_value)
|
||||
return -1;
|
||||
|
||||
int_pow_init();
|
||||
|
@ -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 char*** array_static = NULL;
|
||||
static unsigned int allocated_static = 0;
|
||||
static void** array_static = NULL;
|
||||
static const unsigned int grow_static = 64; // ^2
|
||||
void *__av_mallocz_static(void** location, unsigned int size)
|
||||
{
|
||||
unsigned 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 = av_realloc(array_static, l);
|
||||
array_static[last_static++] = (char**) location;
|
||||
*location = ptr;
|
||||
/**
|
||||
* allocation of static arrays - do not use for normal allocation.
|
||||
*/
|
||||
void *av_mallocz_static(unsigned int size)
|
||||
{
|
||||
void *ptr = av_mallocz(size);
|
||||
|
||||
if(ptr){
|
||||
array_static =av_fast_realloc(array_static, &allocated_static, last_static+1);
|
||||
array_static[last_static++] = 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)
|
||||
{
|
||||
if (array_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;
|
||||
while(last_static){
|
||||
av_freep(&array_static[--last_static]);
|
||||
}
|
||||
last_static = 0;
|
||||
av_freep(&array_static);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user