mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-08 13:22:53 +02:00
* 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
This commit is contained in:
parent
1730832639
commit
855ea723b0
1
ffmpeg.c
1
ffmpeg.c
@ -2667,5 +2667,6 @@ int main(int argc, char **argv)
|
|||||||
for(i=0;i<nb_input_files;i++)
|
for(i=0;i<nb_input_files;i++)
|
||||||
av_close_input_file(input_files[i]);
|
av_close_input_file(input_files[i]);
|
||||||
|
|
||||||
|
av_free_static();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1061,5 +1061,10 @@ void *av_mallocz(unsigned int size);
|
|||||||
void av_free(void *ptr);
|
void av_free(void *ptr);
|
||||||
void __av_freep(void **ptr);
|
void __av_freep(void **ptr);
|
||||||
#define av_freep(p) __av_freep((void **)(p))
|
#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 */
|
#endif /* AVCODEC_H */
|
||||||
|
@ -379,17 +379,13 @@ static int decode_init(AVCodecContext * avctx)
|
|||||||
band_index_long[i][22] = k;
|
band_index_long[i][22] = k;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* compute n ^ (4/3) and store it in mantissa/exp format */
|
/* compute n ^ (4/3) and store it in mantissa/exp format */
|
||||||
table_4_3_exp = av_mallocz(TABLE_4_3_SIZE *
|
if (!av_mallocz_static(&table_4_3_exp,
|
||||||
sizeof(table_4_3_exp[0]));
|
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])))
|
||||||
return -1;
|
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();
|
int_pow_init();
|
||||||
for(i=1;i<TABLE_4_3_SIZE;i++) {
|
for(i=1;i<TABLE_4_3_SIZE;i++) {
|
||||||
|
@ -30,6 +30,43 @@ void *av_mallocz(unsigned int size)
|
|||||||
return ptr;
|
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 */
|
/* cannot call it directly because of 'void **' casting is not automatic */
|
||||||
void __av_freep(void **ptr)
|
void __av_freep(void **ptr)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user