X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=gst-plugins-base-subtitles0.10%2Fgst%2Fffmpegcolorspace%2Fmem.c;fp=gst-plugins-base-subtitles0.10%2Fgst%2Fffmpegcolorspace%2Fmem.c;h=5c3a8a38eac6b62e21589a964347d487a5dc7935;hb=57ba96e291a055f69dbfd4ae9f1ae2390e36986e;hp=0000000000000000000000000000000000000000;hpb=be2c98fb83895d10ac44af7b9a9c3e00ca54bf49;p=mafwsubrenderer diff --git a/gst-plugins-base-subtitles0.10/gst/ffmpegcolorspace/mem.c b/gst-plugins-base-subtitles0.10/gst/ffmpegcolorspace/mem.c new file mode 100644 index 0000000..5c3a8a3 --- /dev/null +++ b/gst-plugins-base-subtitles0.10/gst/ffmpegcolorspace/mem.c @@ -0,0 +1,125 @@ +/* + * default memory allocator for libavcodec + * Copyright (c) 2002 Fabrice Bellard. + * + * This library 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 of the License, or (at your option) any later version. + * + * This library 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 this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/** + * @file mem.c + * default memory allocator for libavcodec. + */ + +#include "avcodec.h" + +/* here we can use OS dependant allocation functions */ +#undef malloc +#undef free +#undef realloc + +#include + +#ifdef HAVE_MALLOC_H +#include +#endif + +/* 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 */ + +/** + * Memory allocation of size byte with alignment suitable for all + * memory accesses (including vectors if available on the + * CPU). av_malloc(0) must return a non NULL pointer. + */ +void * +av_malloc (unsigned int size) +{ + void *ptr; + +#ifdef MEMALIGN_HACK + int diff; + + 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: + on 4 for 386 + on 16 for 486 + on 32 for 586, PPro - k6-III + on 64 for K7 (maybe for P3 too). + 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 not larger? because i didnt see a difference in benchmarks ... + */ + /* benchmarks with p3 + memalign(64)+1 3071,3051,3032 + memalign(64)+2 3051,3032,3041 + memalign(64)+4 2911,2896,2915 + memalign(64)+8 2545,2554,2550 + memalign(64)+16 2543,2572,2563 + memalign(64)+32 2546,2545,2571 + memalign(64)+64 2570,2533,2558 + + btw, malloc seems to do 8 byte alignment by default here + */ +#else + ptr = malloc (size); +#endif + return ptr; +} + +/** + * av_realloc semantics (same as glibc): if ptr is NULL and size > 0, + * identical to malloc(size). If size is zero, it is identical to + * free(ptr) and NULL is returned. + */ +void * +av_realloc (void *ptr, unsigned int size) +{ +#ifdef MEMALIGN_HACK + //FIXME this isnt aligned correctly though it probably isnt needed + int diff; + + 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 */ +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 +}