Mercurial > libavcodec.hg
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 |
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 | 19 |
20 /** | |
21 * @file mem.c | |
22 * default memory allocator for libavcodec. | |
23 */ | |
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 | 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 | 49 int diff; |
2522
e25782262d7d
kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents:
2425
diff
changeset
|
50 #endif |
2422 | 51 |
52 /* lets disallow possible ambiguous cases */ | |
53 if(size > INT_MAX) | |
54 return NULL; | |
1013 | 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 | 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 | 72 /* Why 16? |
73 because some cpus need alignment, for example SSE2 on P4, & most RISC cpus | |
74 it will just trigger an exception and the unaligned load will be done in the | |
75 exception handler or it will just segfault (SSE2 on P4) | |
76 Why not larger? because i didnt see a difference in benchmarks ... | |
77 */ | |
78 /* benchmarks with p3 | |
79 memalign(64)+1 3071,3051,3032 | |
80 memalign(64)+2 3051,3032,3041 | |
81 memalign(64)+4 2911,2896,2915 | |
82 memalign(64)+8 2545,2554,2550 | |
83 memalign(64)+16 2543,2572,2563 | |
84 memalign(64)+32 2546,2545,2571 | |
85 memalign(64)+64 2570,2533,2558 | |
86 | |
87 btw, malloc seems to do 8 byte alignment by default here | |
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 | 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 | 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 | 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 | 106 /* lets disallow possible ambiguous cases */ |
107 if(size > INT_MAX) | |
108 return NULL; | |
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 | 112 if(!ptr) return av_malloc(size); |
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 | 118 } |
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 |