summaryrefslogtreecommitdiff
path: root/src/libffmpeg/libavcodec/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libffmpeg/libavcodec/mem.c')
-rw-r--r--src/libffmpeg/libavcodec/mem.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/libffmpeg/libavcodec/mem.c b/src/libffmpeg/libavcodec/mem.c
index c5ca166d3..462d674e4 100644
--- a/src/libffmpeg/libavcodec/mem.c
+++ b/src/libffmpeg/libavcodec/mem.c
@@ -45,8 +45,20 @@
void *av_malloc(unsigned int size)
{
void *ptr;
+#ifdef MEMALIGN_HACK
+ int diff;
+#endif
+
+ /* lets disallow possible ambiguous cases */
+ if(size > INT_MAX)
+ return NULL;
-#if defined (HAVE_MEMALIGN)
+#ifdef MEMALIGN_HACK
+ ptr = malloc(size+16+1);
+ diff= ((-(int)ptr - 1)&15) + 1;
+ ptr += diff;
+ ((char*)ptr)[-1]= diff;
+#elif defined (HAVE_MEMALIGN)
ptr = memalign(16,size);
/* Why 64?
Indeed, we should align it:
@@ -87,7 +99,22 @@ void *av_malloc(unsigned int size)
*/
void *av_realloc(void *ptr, unsigned int size)
{
+#ifdef MEMALIGN_HACK
+ int diff;
+#endif
+
+ /* lets disallow possible ambiguous cases */
+ if(size > INT_MAX)
+ return NULL;
+
+#ifdef MEMALIGN_HACK
+ //FIXME this isnt aligned correctly though it probably isnt needed
+ if(!ptr) return av_malloc(size);
+ diff= ((char*)ptr)[-1];
+ return realloc(ptr - diff, size + diff) + diff;
+#else
return realloc(ptr, size);
+#endif
}
/* NOTE: ptr = NULL is explicetly allowed */
@@ -95,6 +122,10 @@ void av_free(void *ptr)
{
/* XXX: this test should not be needed on most libcs */
if (ptr)
+#ifdef MEMALIGN_HACK
+ free(ptr - ((char*)ptr)[-1]);
+#else
free(ptr);
+#endif
}