summaryrefslogtreecommitdiff
path: root/libavcodec/bitstream.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2008-05-30 21:12:33 +0000
committerMichael Niedermayer <michaelni@gmx.at>2008-05-30 21:12:33 +0000
commit09dafaeba101f0a52ce0f4c501ca885ede1105e6 (patch)
treeebd919a83d203b5a1e4eed99ee1094dad67cb65c /libavcodec/bitstream.c
parentceaaf78bb758396657a77811a3c38478843afad0 (diff)
Move *_static to bitstream.c which is the only file left which needs
them. Originally committed as revision 13568 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/bitstream.c')
-rw-r--r--libavcodec/bitstream.c56
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)
{