Mercurial > libavcodec.hg
annotate faandct.c @ 1795:920e6381e1fe libavcodec
2 byte shorter userdata for mpeg4
in the past it was startcode,string,00,7F,startcode
now it is startcode,string,stratcode
both are mpeg4 compliant, as according to the standard the userdata lasts until the next 00 00 01 (startcode prefix) but some very primitive decoders which simply skip until the first 00 byte and then expect the next valid startcode might fail with the old variant, just a theory though (didnt test if quicktime can decode it now)
author | michael |
---|---|
date | Sun, 08 Feb 2004 22:52:35 +0000 |
parents | eb26d190cf5a |
children | f65d87bfdd5a |
rev | line source |
---|---|
1557 | 1 /* |
2 * Floating point AAN DCT | |
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> | |
4 * | |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Lesser General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Lesser General Public | |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 * | |
1558 | 19 * this implementation is based upon the IJG integer AAN DCT (see jfdctfst.c) |
1557 | 20 */ |
21 | |
22 /** | |
23 * @file faandct.c | |
24 * @brief | |
25 * Floating point AAN DCT | |
26 * @author Michael Niedermayer <michaelni@gmx.at> | |
27 */ | |
28 | |
29 #include <math.h> | |
30 | |
31 #include "dsputil.h" | |
32 #include "faandct.h" | |
33 | |
34 #define FLOAT float | |
1562
bf452704100f
optionally merge postscale into quantization table for the float aan dct
michael
parents:
1561
diff
changeset
|
35 #ifdef FAAN_POSTSCALE |
bf452704100f
optionally merge postscale into quantization table for the float aan dct
michael
parents:
1561
diff
changeset
|
36 # define SCALE(x) postscale[x] |
bf452704100f
optionally merge postscale into quantization table for the float aan dct
michael
parents:
1561
diff
changeset
|
37 #else |
bf452704100f
optionally merge postscale into quantization table for the float aan dct
michael
parents:
1561
diff
changeset
|
38 # define SCALE(x) 1 |
bf452704100f
optionally merge postscale into quantization table for the float aan dct
michael
parents:
1561
diff
changeset
|
39 #endif |
1557 | 40 |
41 //numbers generated by simple c code (not as accurate as they could be) | |
42 /* | |
43 for(i=0; i<8; i++){ | |
44 printf("#define B%d %1.20llf\n", i, (long double)1.0/(cosl(i*acosl(-1.0)/(long double)16.0)*sqrtl(2))); | |
45 } | |
46 */ | |
47 #define B0 1.00000000000000000000 | |
48 #define B1 0.72095982200694791383 // (cos(pi*1/16)sqrt(2))^-1 | |
49 #define B2 0.76536686473017954350 // (cos(pi*2/16)sqrt(2))^-1 | |
50 #define B3 0.85043009476725644878 // (cos(pi*3/16)sqrt(2))^-1 | |
51 #define B4 1.00000000000000000000 // (cos(pi*4/16)sqrt(2))^-1 | |
52 #define B5 1.27275858057283393842 // (cos(pi*5/16)sqrt(2))^-1 | |
53 #define B6 1.84775906502257351242 // (cos(pi*6/16)sqrt(2))^-1 | |
54 #define B7 3.62450978541155137218 // (cos(pi*7/16)sqrt(2))^-1 | |
55 | |
56 | |
57 #define A1 0.70710678118654752438 // cos(pi*4/16) | |
58 #define A2 0.54119610014619698435 // cos(pi*6/16)sqrt(2) | |
59 #define A5 0.38268343236508977170 // cos(pi*6/16) | |
60 #define A4 1.30656296487637652774 // cos(pi*2/16)sqrt(2) | |
61 | |
62 static FLOAT postscale[64]={ | |
63 B0*B0, B0*B1, B0*B2, B0*B3, B0*B4, B0*B5, B0*B6, B0*B7, | |
64 B1*B0, B1*B1, B1*B2, B1*B3, B1*B4, B1*B5, B1*B6, B1*B7, | |
65 B2*B0, B2*B1, B2*B2, B2*B3, B2*B4, B2*B5, B2*B6, B2*B7, | |
66 B3*B0, B3*B1, B3*B2, B3*B3, B3*B4, B3*B5, B3*B6, B3*B7, | |
67 B4*B0, B4*B1, B4*B2, B4*B3, B4*B4, B4*B5, B4*B6, B4*B7, | |
68 B5*B0, B5*B1, B5*B2, B5*B3, B5*B4, B5*B5, B5*B6, B5*B7, | |
69 B6*B0, B6*B1, B6*B2, B6*B3, B6*B4, B6*B5, B6*B6, B6*B7, | |
70 B7*B0, B7*B1, B7*B2, B7*B3, B7*B4, B7*B5, B7*B6, B7*B7, | |
71 }; | |
72 | |
1589 | 73 static always_inline void row_fdct(FLOAT temp[64], DCTELEM * data) |
1557 | 74 { |
75 FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; | |
76 FLOAT tmp10, tmp11, tmp12, tmp13; | |
77 FLOAT z1, z2, z3, z4, z5, z11, z13; | |
78 int i; | |
79 | |
80 for (i=0; i<8*8; i+=8) { | |
81 tmp0= data[0 + i] + data[7 + i]; | |
82 tmp7= data[0 + i] - data[7 + i]; | |
83 tmp1= data[1 + i] + data[6 + i]; | |
84 tmp6= data[1 + i] - data[6 + i]; | |
85 tmp2= data[2 + i] + data[5 + i]; | |
86 tmp5= data[2 + i] - data[5 + i]; | |
87 tmp3= data[3 + i] + data[4 + i]; | |
88 tmp4= data[3 + i] - data[4 + i]; | |
89 | |
90 tmp10= tmp0 + tmp3; | |
91 tmp13= tmp0 - tmp3; | |
92 tmp11= tmp1 + tmp2; | |
93 tmp12= tmp1 - tmp2; | |
94 | |
95 temp[0 + i]= tmp10 + tmp11; | |
96 temp[4 + i]= tmp10 - tmp11; | |
97 | |
98 z1= (tmp12 + tmp13)*A1; | |
99 temp[2 + i]= tmp13 + z1; | |
100 temp[6 + i]= tmp13 - z1; | |
101 | |
102 tmp10= tmp4 + tmp5; | |
103 tmp11= tmp5 + tmp6; | |
104 tmp12= tmp6 + tmp7; | |
105 | |
106 z5= (tmp10 - tmp12) * A5; | |
107 z2= tmp10*A2 + z5; | |
108 z4= tmp12*A4 + z5; | |
109 z3= tmp11*A1; | |
110 | |
111 z11= tmp7 + z3; | |
112 z13= tmp7 - z3; | |
113 | |
114 temp[5 + i]= z13 + z2; | |
115 temp[3 + i]= z13 - z2; | |
116 temp[1 + i]= z11 + z4; | |
117 temp[7 + i]= z11 - z4; | |
1589 | 118 } |
119 } | |
120 | |
121 void ff_faandct(DCTELEM * data) | |
122 { | |
123 FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; | |
124 FLOAT tmp10, tmp11, tmp12, tmp13; | |
125 FLOAT z1, z2, z3, z4, z5, z11, z13; | |
126 FLOAT temp[64]; | |
127 int i; | |
128 | |
129 emms_c(); | |
130 | |
131 row_fdct(temp, data); | |
1557 | 132 |
133 for (i=0; i<8; i++) { | |
134 tmp0= temp[8*0 + i] + temp[8*7 + i]; | |
135 tmp7= temp[8*0 + i] - temp[8*7 + i]; | |
136 tmp1= temp[8*1 + i] + temp[8*6 + i]; | |
137 tmp6= temp[8*1 + i] - temp[8*6 + i]; | |
138 tmp2= temp[8*2 + i] + temp[8*5 + i]; | |
139 tmp5= temp[8*2 + i] - temp[8*5 + i]; | |
140 tmp3= temp[8*3 + i] + temp[8*4 + i]; | |
141 tmp4= temp[8*3 + i] - temp[8*4 + i]; | |
142 | |
143 tmp10= tmp0 + tmp3; | |
144 tmp13= tmp0 - tmp3; | |
145 tmp11= tmp1 + tmp2; | |
146 tmp12= tmp1 - tmp2; | |
147 | |
1563
820e06c6ca9b
4.9-RC FreeBSD doesnt like lrint() so change to lrintf(), not that bsd supports that but we emulate it ...
michael
parents:
1562
diff
changeset
|
148 data[8*0 + i]= lrintf(SCALE(8*0 + i) * (tmp10 + tmp11)); |
820e06c6ca9b
4.9-RC FreeBSD doesnt like lrint() so change to lrintf(), not that bsd supports that but we emulate it ...
michael
parents:
1562
diff
changeset
|
149 data[8*4 + i]= lrintf(SCALE(8*4 + i) * (tmp10 - tmp11)); |
1557 | 150 |
151 z1= (tmp12 + tmp13)* A1; | |
1563
820e06c6ca9b
4.9-RC FreeBSD doesnt like lrint() so change to lrintf(), not that bsd supports that but we emulate it ...
michael
parents:
1562
diff
changeset
|
152 data[8*2 + i]= lrintf(SCALE(8*2 + i) * (tmp13 + z1)); |
820e06c6ca9b
4.9-RC FreeBSD doesnt like lrint() so change to lrintf(), not that bsd supports that but we emulate it ...
michael
parents:
1562
diff
changeset
|
153 data[8*6 + i]= lrintf(SCALE(8*6 + i) * (tmp13 - z1)); |
1557 | 154 |
155 tmp10= tmp4 + tmp5; | |
156 tmp11= tmp5 + tmp6; | |
157 tmp12= tmp6 + tmp7; | |
158 | |
159 z5= (tmp10 - tmp12) * A5; | |
160 z2= tmp10*A2 + z5; | |
161 z4= tmp12*A4 + z5; | |
162 z3= tmp11*A1; | |
163 | |
164 z11= tmp7 + z3; | |
165 z13= tmp7 - z3; | |
166 | |
1563
820e06c6ca9b
4.9-RC FreeBSD doesnt like lrint() so change to lrintf(), not that bsd supports that but we emulate it ...
michael
parents:
1562
diff
changeset
|
167 data[8*5 + i]= lrintf(SCALE(8*5 + i) * (z13 + z2)); |
820e06c6ca9b
4.9-RC FreeBSD doesnt like lrint() so change to lrintf(), not that bsd supports that but we emulate it ...
michael
parents:
1562
diff
changeset
|
168 data[8*3 + i]= lrintf(SCALE(8*3 + i) * (z13 - z2)); |
820e06c6ca9b
4.9-RC FreeBSD doesnt like lrint() so change to lrintf(), not that bsd supports that but we emulate it ...
michael
parents:
1562
diff
changeset
|
169 data[8*1 + i]= lrintf(SCALE(8*1 + i) * (z11 + z4)); |
820e06c6ca9b
4.9-RC FreeBSD doesnt like lrint() so change to lrintf(), not that bsd supports that but we emulate it ...
michael
parents:
1562
diff
changeset
|
170 data[8*7 + i]= lrintf(SCALE(8*7 + i) * (z11 - z4)); |
1557 | 171 } |
172 } | |
1571
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
173 |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
174 void ff_faandct248(DCTELEM * data) |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
175 { |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
176 FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
177 FLOAT tmp10, tmp11, tmp12, tmp13; |
1589 | 178 FLOAT z1; |
1571
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
179 FLOAT temp[64]; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
180 int i; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
181 |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
182 emms_c(); |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
183 |
1589 | 184 row_fdct(temp, data); |
1571
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
185 |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
186 for (i=0; i<8; i++) { |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
187 tmp0 = temp[8*0 + i] + temp[8*1 + i]; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
188 tmp1 = temp[8*2 + i] + temp[8*3 + i]; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
189 tmp2 = temp[8*4 + i] + temp[8*5 + i]; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
190 tmp3 = temp[8*6 + i] + temp[8*7 + i]; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
191 tmp4 = temp[8*0 + i] - temp[8*1 + i]; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
192 tmp5 = temp[8*2 + i] - temp[8*3 + i]; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
193 tmp6 = temp[8*4 + i] - temp[8*5 + i]; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
194 tmp7 = temp[8*6 + i] - temp[8*7 + i]; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
195 |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
196 tmp10 = tmp0 + tmp3; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
197 tmp11 = tmp1 + tmp2; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
198 tmp12 = tmp1 - tmp2; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
199 tmp13 = tmp0 - tmp3; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
200 |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
201 data[8*0 + i] = lrintf(SCALE(8*0 + i) * (tmp10 + tmp11)); |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
202 data[8*4 + i] = lrintf(SCALE(8*4 + i) * (tmp10 - tmp11)); |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
203 |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
204 z1 = (tmp12 + tmp13)* A1; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
205 data[8*2 + i] = lrintf(SCALE(8*2 + i) * (tmp13 + z1)); |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
206 data[8*6 + i] = lrintf(SCALE(8*6 + i) * (tmp13 - z1)); |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
207 |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
208 tmp10 = tmp4 + tmp7; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
209 tmp11 = tmp5 + tmp6; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
210 tmp12 = tmp5 - tmp6; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
211 tmp13 = tmp4 - tmp7; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
212 |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
213 data[8*1 + i] = lrintf(SCALE(8*0 + i) * (tmp10 + tmp11)); |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
214 data[8*5 + i] = lrintf(SCALE(8*4 + i) * (tmp10 - tmp11)); |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
215 |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
216 z1 = (tmp12 + tmp13)* A1; |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
217 data[8*3 + i] = lrintf(SCALE(8*2 + i) * (tmp13 + z1)); |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
218 data[8*7 + i] = lrintf(SCALE(8*6 + i) * (tmp13 - z1)); |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
219 } |
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
220 } |