Include libavformat/avformat.h before all the other libav* headers.
[libav.git] / libavutil / mem.c
CommitLineData
d01fe86d 1/*
cea8f6f3 2 * default memory allocator for libavutil
d01fe86d
FB
3 * Copyright (c) 2002 Fabrice Bellard.
4 *
b78e7197
DB
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
d01fe86d
FB
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
b78e7197 10 * version 2.1 of the License, or (at your option) any later version.
d01fe86d 11 *
b78e7197 12 * FFmpeg is distributed in the hope that it will be useful,
d01fe86d
FB
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
b78e7197 18 * License along with FFmpeg; if not, write to the Free Software
5509bffa 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
d01fe86d 20 */
115329f1 21
983e3246
MN
22/**
23 * @file mem.c
cea8f6f3 24 * default memory allocator for libavutil.
983e3246 25 */
115329f1 26
cea8f6f3 27#include "common.h"
8e1e6f31 28
eafcac6a 29/* here we can use OS dependent allocation functions */
8e1e6f31
FB
30#undef malloc
31#undef free
32#undef realloc
33
1f91cdce 34#include <stdlib.h>
d01fe86d
FB
35#ifdef HAVE_MALLOC_H
36#include <malloc.h>
37#endif
38
39/* you can redefine av_malloc and av_free in your project to use your
40 memory allocator. You do not need to suppress this file because the
41 linker will do it automatically */
42
18f77016 43void *av_malloc(unsigned int size)
d01fe86d 44{
1f91cdce 45 void *ptr = NULL;
9ddbcae6 46#ifdef CONFIG_MEMALIGN_HACK
ed96aeea 47 long diff;
88730be6 48#endif
0ecca7a4 49
7d77d5f6 50 /* let's disallow possible ambiguous cases */
0a7c36af 51 if(size > (INT_MAX-16) )
0ecca7a4 52 return NULL;
115329f1 53
9ddbcae6 54#ifdef CONFIG_MEMALIGN_HACK
a9493601
H
55 ptr = malloc(size+16);
56 if(!ptr)
57 return ptr;
ed96aeea 58 diff= ((-(long)ptr - 1)&15) + 1;
90d30570 59 ptr = (char*)ptr + diff;
da9b170c 60 ((char*)ptr)[-1]= diff;
1f91cdce
RP
61#elif defined (HAVE_POSIX_MEMALIGN)
62 posix_memalign(&ptr,16,size);
115329f1 63#elif defined (HAVE_MEMALIGN)
8f2b21a8 64 ptr = memalign(16,size);
115329f1 65 /* Why 64?
d01fe86d
FB
66 Indeed, we should align it:
67 on 4 for 386
68 on 16 for 486
bb270c08
DB
69 on 32 for 586, PPro - k6-III
70 on 64 for K7 (maybe for P3 too).
d01fe86d
FB
71 Because L1 and L2 caches are aligned on those values.
72 But I don't want to code such logic here!
73 */
8f2b21a8 74 /* Why 16?
7ce68923 75 Because some CPUs need alignment, for example SSE2 on P4, & most RISC CPUs
8f2b21a8
MN
76 it will just trigger an exception and the unaligned load will be done in the
77 exception handler or it will just segfault (SSE2 on P4)
2cab6401 78 Why not larger? Because I did not see a difference in benchmarks ...
8f2b21a8
MN
79 */
80 /* benchmarks with p3
bb270c08
DB
81 memalign(64)+1 3071,3051,3032
82 memalign(64)+2 3051,3032,3041
83 memalign(64)+4 2911,2896,2915
84 memalign(64)+8 2545,2554,2550
85 memalign(64)+16 2543,2572,2563
86 memalign(64)+32 2546,2545,2571
87 memalign(64)+64 2570,2533,2558
115329f1 88
8f2b21a8
MN
89 btw, malloc seems to do 8 byte alignment by default here
90 */
d01fe86d
FB
91#else
92 ptr = malloc(size);
93#endif
d01fe86d
FB
94 return ptr;
95}
96
8e1e6f31
FB
97void *av_realloc(void *ptr, unsigned int size)
98{
9ddbcae6 99#ifdef CONFIG_MEMALIGN_HACK
0a7c36af
MN
100 int diff;
101#endif
88730be6 102
7d77d5f6 103 /* let's disallow possible ambiguous cases */
a9493601 104 if(size > (INT_MAX-16) )
0ecca7a4
MN
105 return NULL;
106
9ddbcae6 107#ifdef CONFIG_MEMALIGN_HACK
0a7c36af
MN
108 //FIXME this isn't aligned correctly, though it probably isn't needed
109 if(!ptr) return av_malloc(size);
110 diff= ((char*)ptr)[-1];
90d30570 111 return (char*)realloc((char*)ptr - diff, size + diff) + diff;
0a7c36af
MN
112#else
113 return realloc(ptr, size);
da9b170c 114#endif
b7a22d84
MN
115}
116
d01fe86d
FB
117void av_free(void *ptr)
118{
119 /* XXX: this test should not be needed on most libcs */
120 if (ptr)
9ddbcae6 121#ifdef CONFIG_MEMALIGN_HACK
90d30570 122 free((char*)ptr - ((char*)ptr)[-1]);
da9b170c 123#else
d01fe86d 124 free(ptr);
da9b170c 125#endif
d01fe86d
FB
126}
127
79e47000
LB
128void av_freep(void *arg)
129{
130 void **ptr= (void**)arg;
131 av_free(*ptr);
132 *ptr = NULL;
133}
134
135void *av_mallocz(unsigned int size)
136{
11362767 137 void *ptr = av_malloc(size);
79e47000
LB
138 if (ptr)
139 memset(ptr, 0, size);
140 return ptr;
141}
142
143char *av_strdup(const char *s)
144{
fdf35f26
MN
145 char *ptr= NULL;
146 if(s){
19757f61
MN
147 int len = strlen(s) + 1;
148 ptr = av_malloc(len);
149 if (ptr)
150 memcpy(ptr, s, len);
fdf35f26 151 }
79e47000
LB
152 return ptr;
153}
154