X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavutil%2Fmem.c;h=27bb30b8efa5aecfdea34e51286a283699628c93;hb=0962f23b35ec6aa497f8338a7ddc2d82fda0a400;hp=9268ab4dfc20c862b75b7a87fb9694f25c780917;hpb=89c9ff504b29d03cf266aa3598ccb8d2cf1ddd13;p=ffmpeg diff --git a/libavutil/mem.c b/libavutil/mem.c index 9268ab4dfc2..27bb30b8efa 100644 --- a/libavutil/mem.c +++ b/libavutil/mem.c @@ -2,25 +2,25 @@ * default memory allocator for libavutil * Copyright (c) 2002 Fabrice Bellard * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** - * @file mem.c + * @file * default memory allocator for libavutil */ @@ -33,6 +33,7 @@ #include #endif +#include "avutil.h" #include "mem.h" /* here we can use OS-dependent allocation functions */ @@ -40,11 +41,27 @@ #undef malloc #undef realloc +#ifdef MALLOC_PREFIX + +#define malloc AV_JOIN(MALLOC_PREFIX, malloc) +#define memalign AV_JOIN(MALLOC_PREFIX, memalign) +#define posix_memalign AV_JOIN(MALLOC_PREFIX, posix_memalign) +#define realloc AV_JOIN(MALLOC_PREFIX, realloc) +#define free AV_JOIN(MALLOC_PREFIX, free) + +void *malloc(size_t size); +void *memalign(size_t align, size_t size); +int posix_memalign(void **ptr, size_t align, size_t size); +void *realloc(void *ptr, size_t size); +void free(void *ptr); + +#endif /* MALLOC_PREFIX */ + /* You can redefine av_malloc and av_free in your project to use your memory allocator. You do not need to suppress this file because the linker will do it automatically. */ -void *av_malloc(unsigned int size) +void *av_malloc(size_t size) { void *ptr = NULL; #if CONFIG_MEMALIGN_HACK @@ -52,20 +69,21 @@ void *av_malloc(unsigned int size) #endif /* let's disallow possible ambiguous cases */ - if(size > (INT_MAX-16) ) + if(size > (INT_MAX-32) ) return NULL; #if CONFIG_MEMALIGN_HACK - ptr = malloc(size+16); + ptr = malloc(size+32); if(!ptr) return ptr; - diff= ((-(long)ptr - 1)&15) + 1; + diff= ((-(long)ptr - 1)&31) + 1; ptr = (char*)ptr + diff; ((char*)ptr)[-1]= diff; #elif HAVE_POSIX_MEMALIGN - posix_memalign(&ptr,16,size); + if (posix_memalign(&ptr,32,size)) + ptr = NULL; #elif HAVE_MEMALIGN - ptr = memalign(16,size); + ptr = memalign(32,size); /* Why 64? Indeed, we should align it: on 4 for 386 @@ -75,10 +93,8 @@ void *av_malloc(unsigned int size) Because L1 and L2 caches are aligned on those values. But I don't want to code such logic here! */ - /* Why 16? - Because some CPUs need alignment, for example SSE2 on P4, & most RISC CPUs - it will just trigger an exception and the unaligned load will be done in the - exception handler or it will just segfault (SSE2 on P4). + /* Why 32? + For AVX ASM. SSE / NEON needs only 16. Why not larger? Because I did not see a difference in benchmarks ... */ /* benchmarks with P3 @@ -98,7 +114,7 @@ void *av_malloc(unsigned int size) return ptr; } -void *av_realloc(void *ptr, unsigned int size) +void *av_realloc(void *ptr, size_t size) { #if CONFIG_MEMALIGN_HACK int diff; @@ -120,12 +136,11 @@ void *av_realloc(void *ptr, unsigned int size) void av_free(void *ptr) { - /* XXX: this test should not be needed on most libcs */ - if (ptr) #if CONFIG_MEMALIGN_HACK + if (ptr) free((char*)ptr - ((char*)ptr)[-1]); #else - free(ptr); + free(ptr); #endif } @@ -136,7 +151,7 @@ void av_freep(void *arg) *ptr = NULL; } -void *av_mallocz(unsigned int size) +void *av_mallocz(size_t size) { void *ptr = av_malloc(size); if (ptr)