annotate mem.c @ 2601:c31a28f27d9a libavcodec

increasing precission of the quantization parameter this is needed as the quantization stepsize for each subband is also in this precission and insignificant changes to the wavelet like scaling its coefficients slightly differently would lead to wildly variing PSNR and bitrate note, a encoder could also simply choose to leave the least significant bits of the quantization parameters zero which would give the exact previous behaviour except a y very tiny number of bits in the header
author michael
date Sat, 09 Apr 2005 22:15:48 +0000
parents e25782262d7d
children ef2149182f1c
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;
2522
e25782262d7d kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 2425
diff changeset
48 #ifdef MEMALIGN_HACK
2425
d0bcc85d3856 10l (gcc 2.95 fix)
michael
parents: 2422
diff changeset
49 int diff;
2522
e25782262d7d kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 2425
diff changeset
50 #endif
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
51
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
52 /* lets disallow possible ambiguous cases */
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
53 if(size > INT_MAX)
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
54 return NULL;
1013
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 862
diff changeset
55
2060
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
56 #ifdef MEMALIGN_HACK
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
57 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
58 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
59 ptr += diff;
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
60 ((char*)ptr)[-1]= diff;
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
61 #elif defined (HAVE_MEMALIGN)
677
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
62 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
63 /* 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
64 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
65 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
66 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
67 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
68 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
69 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
70 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
71 */
677
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
72 /* Why 16?
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
73 because some cpus need alignment, for example SSE2 on P4, & most RISC cpus
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
74 it will just trigger an exception and the unaligned load will be done in the
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
75 exception handler or it will just segfault (SSE2 on P4)
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
76 Why not larger? because i didnt see a difference in benchmarks ...
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
77 */
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
78 /* benchmarks with p3
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
79 memalign(64)+1 3071,3051,3032
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
80 memalign(64)+2 3051,3032,3041
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
81 memalign(64)+4 2911,2896,2915
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
82 memalign(64)+8 2545,2554,2550
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
83 memalign(64)+16 2543,2572,2563
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
84 memalign(64)+32 2546,2545,2571
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
85 memalign(64)+64 2570,2533,2558
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
86
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
87 btw, malloc seems to do 8 byte alignment by default here
0ed44dd02bbf fixing memalign
michaelni
parents: 490
diff changeset
88 */
490
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
89 #else
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
90 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
91 #endif
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
92 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
93 }
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
94
1026
d6ba0641cc36 cleanup
michaelni
parents: 1013
diff changeset
95 /**
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
96 * 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
97 * 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
98 * free(ptr) and NULL is returned.
1026
d6ba0641cc36 cleanup
michaelni
parents: 1013
diff changeset
99 */
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
100 void *av_realloc(void *ptr, unsigned int size)
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
101 {
2522
e25782262d7d kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 2425
diff changeset
102 #ifdef MEMALIGN_HACK
2425
d0bcc85d3856 10l (gcc 2.95 fix)
michael
parents: 2422
diff changeset
103 int diff;
2522
e25782262d7d kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 2425
diff changeset
104 #endif
e25782262d7d kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 2425
diff changeset
105
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
106 /* lets disallow possible ambiguous cases */
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
107 if(size > INT_MAX)
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
108 return NULL;
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2147
diff changeset
109
2060
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
110 #ifdef MEMALIGN_HACK
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
111 //FIXME this isnt aligned correctly though it probably isnt needed
2147
f980082baeaa realloc(NULL) fix
michael
parents: 2060
diff changeset
112 if(!ptr) return av_malloc(size);
f980082baeaa realloc(NULL) fix
michael
parents: 2060
diff changeset
113 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
114 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
115 #else
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1026
diff changeset
116 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
117 #endif
1026
d6ba0641cc36 cleanup
michaelni
parents: 1013
diff changeset
118 }
d6ba0641cc36 cleanup
michaelni
parents: 1013
diff changeset
119
490
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
120 /* 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
121 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
122 {
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
123 /* 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
124 if (ptr)
2060
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
125 #ifdef MEMALIGN_HACK
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
126 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
127 #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
128 free(ptr);
2060
d07784fbdad1 optional and disabled by default memalign hack for SSE/SSE2 on that alternative OS
michael
parents: 1106
diff changeset
129 #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
130 }
e28763300864 put memory functions in a separate file so that the user can redefinite them without modifying the library
bellard
parents:
diff changeset
131