annotate mem.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents d0bcc85d3856
children e25782262d7d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
490
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
1 /*
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
2 * default memory allocator for libavcodec
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
3 * Copyright (c) 2002 Fabrice Bellard.
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
4 *
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
9 *
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
13 * Lesser General Public License for more details.
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
14 *
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
18 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1031
diff changeset
19
1e39f273ecd6 per file doxy
michaelni
parents: 1031
diff changeset
20 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1031
diff changeset
21 * @file mem.c
1e39f273ecd6 per file doxy
michaelni
parents: 1031
diff changeset
22 * default memory allocator for libavcodec.
1e39f273ecd6 per file doxy
michaelni
parents: 1031
diff changeset
23 */
1e39f273ecd6 per file doxy
michaelni
parents: 1031
diff changeset
24
490
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
25 #include "avcodec.h"
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
26
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
27 /* here we can use OS dependant allocation functions */
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
28 #undef malloc
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
29 #undef free
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
30 #undef realloc
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
31
490
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
32 #ifdef HAVE_MALLOC_H
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
33 #include <malloc.h>
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
34 #endif
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
35
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
36 /* you can redefine av_malloc and av_free in your project to use your
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
37 memory allocator. You do not need to suppress this file because the
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
38 linker will do it automatically */
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
39
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
40 /**
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
41 * Memory allocation of size byte with alignment suitable for all
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
42 * memory accesses (including vectors if available on the
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
43 * CPU). av_malloc(0) must return a non NULL pointer.
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
44 */
862
058194d7ade6 * fixing some minor const warnings
kabi
parents: 677
diff changeset
45 void *av_malloc(unsigned int size)
490
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
46 {
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
47 void *ptr;
2425
d0bcc85d3856 10l (gcc 2.95 fix)
michael
parents: 2422
diff changeset
48 int diff;
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
49
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
50 /* lets disallow possible ambiguous cases */
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
51 if(size > INT_MAX)
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
52 return NULL;
1013
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 862
diff changeset
53
2060
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
54 #ifdef MEMALIGN_HACK
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
55 ptr = malloc(size+16+1);
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
56 diff= ((-(int)ptr - 1)&15) + 1;
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
57 ptr += diff;
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
58 ((char*)ptr)[-1]= diff;
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
59 #elif defined (HAVE_MEMALIGN)
677
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
60 ptr = memalign(16,size);
490
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
61 /* Why 64?
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
62 Indeed, we should align it:
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
63 on 4 for 386
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
64 on 16 for 486
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
65 on 32 for 586, PPro - k6-III
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
66 on 64 for K7 (maybe for P3 too).
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
67 Because L1 and L2 caches are aligned on those values.
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
68 But I don't want to code such logic here!
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
69 */
677
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
70 /* Why 16?
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
71 because some cpus need alignment, for example SSE2 on P4, & most RISC cpus
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
72 it will just trigger an exception and the unaligned load will be done in the
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
73 exception handler or it will just segfault (SSE2 on P4)
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
74 Why not larger? because i didnt see a difference in benchmarks ...
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
75 */
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
76 /* benchmarks with p3
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
77 memalign(64)+1 3071,3051,3032
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
78 memalign(64)+2 3051,3032,3041
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
79 memalign(64)+4 2911,2896,2915
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
80 memalign(64)+8 2545,2554,2550
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
81 memalign(64)+16 2543,2572,2563
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
82 memalign(64)+32 2546,2545,2571
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
83 memalign(64)+64 2570,2533,2558
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
84
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
85 btw, malloc seems to do 8 byte alignment by default here
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
86 */
490
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
87 #else
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
88 ptr = malloc(size);
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
89 #endif
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
90 return ptr;
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
91 }
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
92
1026
d6ba0641cc36 cleanup
michaelni
parents: 1013
diff changeset
93 /**
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
94 * av_realloc semantics (same as glibc): if ptr is NULL and size > 0,
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
95 * identical to malloc(size). If size is zero, it is identical to
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
96 * free(ptr) and NULL is returned.
1026
d6ba0641cc36 cleanup
michaelni
parents: 1013
diff changeset
97 */
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
98 void *av_realloc(void *ptr, unsigned int size)
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
99 {
2425
d0bcc85d3856 10l (gcc 2.95 fix)
michael
parents: 2422
diff changeset
100 int diff;
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
101 /* lets disallow possible ambiguous cases */
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
102 if(size > INT_MAX)
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
103 return NULL;
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
104
2060
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
105 #ifdef MEMALIGN_HACK
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
106 //FIXME this isnt aligned correctly though it probably isnt needed
2147
f980082baeaa realloc(NULL) fix
michael
parents: 2060
diff changeset
107 if(!ptr) return av_malloc(size);
f980082baeaa realloc(NULL) fix
michael
parents: 2060
diff changeset
108 diff= ((char*)ptr)[-1];
2060
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
109 return realloc(ptr - diff, size + diff) + diff;
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
110 #else
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
111 return realloc(ptr, size);
2060
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
112 #endif
1026
d6ba0641cc36 cleanup
michaelni
parents: 1013
diff changeset
113 }
d6ba0641cc36 cleanup
michaelni
parents: 1013
diff changeset
114
490
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
115 /* NOTE: ptr = NULL is explicetly allowed */
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
116 void av_free(void *ptr)
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
117 {
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
118 /* XXX: this test should not be needed on most libcs */
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
119 if (ptr)
2060
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
120 #ifdef MEMALIGN_HACK
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
121 free(ptr - ((char*)ptr)[-1]);
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
122 #else
490
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
123 free(ptr);
2060
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
124 #endif
490
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
125 }
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
126