Mercurial > libavcodec.hg
annotate faandct.c @ 5876:731ee5ad6bde libavcodec
Correct assignment of interlaced_frame; was being set on output frames,
in display order, based on decoding information in decoding order. Now
set properly, immediately upon completion of decode.
Based on original patch from Reinhard Nissl, rnisssl % gmx , de
Original Thread: [FFmpeg-devel] H.264 + PAFF: BBC HD recording shows
extreme interlacing artefacts, Thu, 01 Nov 2007 22:43:09
author | heydowns |
---|---|
date | Mon, 05 Nov 2007 18:16:42 +0000 |
parents | 470601203f44 |
children | 094f507b952b |
rev | line source |
---|---|
1557 | 1 /* |
2 * Floating point AAN DCT | |
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> | |
4 * | |
5214 | 5 * this implementation is based upon the IJG integer AAN DCT (see jfdctfst.c) |
6 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
7 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
8 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
9 * FFmpeg is free software; you can redistribute it and/or |
1557 | 10 * modify it under the terms of the GNU Lesser General Public |
11 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
12 * version 2.1 of the License, or (at your option) any later version. |
1557 | 13 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
14 * FFmpeg is distributed in the hope that it will be useful, |
1557 | 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 * Lesser General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU Lesser General Public | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
20 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2979
diff
changeset
|
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
1557 | 22 */ |
23 | |
24 /** | |
25 * @file faandct.c | |
2967 | 26 * @brief |
1557 | 27 * Floating point AAN DCT |
28 * @author Michael Niedermayer <michaelni@gmx.at> | |
29 */ | |
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 | |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
3947
diff
changeset
|
73 static av_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]; | |
2967 | 89 |
1557 | 90 tmp10= tmp0 + tmp3; |
91 tmp13= tmp0 - tmp3; | |
92 tmp11= tmp1 + tmp2; | |
93 tmp12= tmp1 - tmp2; | |
2967 | 94 |
1557 | 95 temp[0 + i]= tmp10 + tmp11; |
96 temp[4 + i]= tmp10 - tmp11; | |
2967 | 97 |
1557 | 98 z1= (tmp12 + tmp13)*A1; |
99 temp[2 + i]= tmp13 + z1; | |
100 temp[6 + i]= tmp13 - z1; | |
2967 | 101 |
1557 | 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; | |
2967 | 118 } |
1589 | 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]; | |
2967 | 142 |
1557 | 143 tmp10= tmp0 + tmp3; |
144 tmp13= tmp0 - tmp3; | |
145 tmp11= tmp1 + tmp2; | |
146 tmp12= tmp1 - tmp2; | |
2967 | 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)); |
2967 | 150 |
1557 | 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)); |
2967 | 154 |
1557 | 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]; |
2967 | 195 |
1571
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; |
2967 | 200 |
1571
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)); |
2967 | 203 |
1571
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)); |
2967 | 207 |
1571
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
208 tmp10 = tmp4 + tmp7; |
2979 | 209 tmp11 = tmp5 + tmp6; |
210 tmp12 = tmp5 - tmp6; | |
211 tmp13 = tmp4 - tmp7; | |
1571
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
212 |
2979 | 213 data[8*1 + i] = lrintf(SCALE(8*0 + i) * (tmp10 + tmp11)); |
214 data[8*5 + i] = lrintf(SCALE(8*4 + i) * (tmp10 - tmp11)); | |
1571
aa4dc16c0f18
* adding integer/floating point AAN implementations for DCT 2-4-8
romansh
parents:
1563
diff
changeset
|
215 |
2979 | 216 z1 = (tmp12 + tmp13)* A1; |
217 data[8*3 + i] = lrintf(SCALE(8*2 + i) * (tmp13 + z1)); | |
218 data[8*7 + i] = lrintf(SCALE(8*6 + i) * (tmp13 - z1)); | |
1571
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 } |