diff options
Diffstat (limited to 'libavcodec/bitstream.c')
-rw-r--r-- | libavcodec/bitstream.c | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/libavcodec/bitstream.c b/libavcodec/bitstream.c index 823bf97f4f..7c8cca2abe 100644 --- a/libavcodec/bitstream.c +++ b/libavcodec/bitstream.c @@ -40,7 +40,61 @@ * and should correctly use static arrays */ attribute_deprecated av_alloc_size(2) -void *ff_realloc_static(void *ptr, unsigned int size); +static void *ff_realloc_static(void *ptr, unsigned int size); + +static unsigned int last_static = 0; +static unsigned int allocated_static = 0; +static void** array_static = NULL; + +static void *av_mallocz_static(unsigned int size) +{ + void *ptr = av_mallocz(size); + + if(ptr){ + array_static =av_fast_realloc(array_static, &allocated_static, sizeof(void*)*(last_static+1)); + if(!array_static) + return NULL; + array_static[last_static++] = ptr; + } + + return ptr; +} + +static void *ff_realloc_static(void *ptr, unsigned int size) +{ + int i; + if(!ptr) + return av_mallocz_static(size); + /* Look for the old ptr */ + for(i = 0; i < last_static; i++) { + if(array_static[i] == ptr) { + array_static[i] = av_realloc(array_static[i], size); + return array_static[i]; + } + } + return NULL; + +} + +static void av_free_static(void) +{ + while(last_static){ + av_freep(&array_static[--last_static]); + } + av_freep(&array_static); +} + +/** + * Call av_free_static automatically before it's too late + */ + +static void do_free(void) __attribute__ ((destructor)); + +static void do_free(void) +{ + av_free_static(); +} + void align_put_bits(PutBitContext *s) { |