annotate i386/mpegvideo_mmx_template.c @ 6107:99e470e62bad libavcodec

Enable proper output from the LFE channel, based on patch from Mathias Rauen dear dot madshi at net
author banan
date Fri, 04 Jan 2008 20:02:10 +0000
parents 0244bba24b43
children 52925923273f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
1 /*
429
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
2 * MPEG video MMX templates
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
3 *
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
4 * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
5 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3576
diff changeset
6 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3576
diff changeset
7 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3576
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
429
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
10 * 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: 3576
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
429
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
12 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3576
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
429
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
16 * Lesser General Public License for more details.
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
17 *
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
18 * 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: 3576
diff changeset
19 * 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
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
429
718a22dc121f license/copyright change
glantau
parents: 350
diff changeset
21 */
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
22
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
23 #undef MMREG_WIDTH
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
24 #undef MM
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
25 #undef MOVQ
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
26 #undef SPREADW
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
27 #undef PMAXW
3393
fb4baeb88d0b kill warning
mru
parents: 3089
diff changeset
28 #undef PMAX
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
29 #undef SAVE_SIGN
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
30 #undef RESTORE_SIGN
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
31
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
32 #if defined(HAVE_SSE2)
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
33 #define MMREG_WIDTH "16"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
34 #define MM "%%xmm"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
35 #define MOVQ "movdqa"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
36 #define SPREADW(a) \
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
37 "pshuflw $0, "a", "a" \n\t"\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
38 "punpcklwd "a", "a" \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
39 #define PMAXW(a,b) "pmaxsw "a", "b" \n\t"
2892
41315d0120b3 replace a few mov + psrlq with pshufw, there are more cases which could benefit from this but they would require us to duplicate some functions ...
michael
parents: 2327
diff changeset
40 #define PMAX(a,b) \
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
41 "movhlps "a", "b" \n\t"\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
42 PMAXW(b, a)\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
43 "pshuflw $0x0E, "a", "b" \n\t"\
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
44 PMAXW(b, a)\
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
45 "pshuflw $0x01, "a", "b" \n\t"\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
46 PMAXW(b, a)
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
47 #else
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
48 #define MMREG_WIDTH "8"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
49 #define MM "%%mm"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
50 #define MOVQ "movq"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
51 #if defined(HAVE_MMX2)
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
52 #define SPREADW(a) "pshufw $0, "a", "a" \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
53 #define PMAXW(a,b) "pmaxsw "a", "b" \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
54 #define PMAX(a,b) \
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
55 "pshufw $0x0E, "a", "b" \n\t"\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
56 PMAXW(b, a)\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
57 "pshufw $0x01, "a", "b" \n\t"\
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
58 PMAXW(b, a)
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
59 #else
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
60 #define SPREADW(a) \
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
61 "punpcklwd "a", "a" \n\t"\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
62 "punpcklwd "a", "a" \n\t"
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
63 #define PMAXW(a,b) \
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
64 "psubusw "a", "b" \n\t"\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
65 "paddw "a", "b" \n\t"
2892
41315d0120b3 replace a few mov + psrlq with pshufw, there are more cases which could benefit from this but they would require us to duplicate some functions ...
michael
parents: 2327
diff changeset
66 #define PMAX(a,b) \
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
67 "movq "a", "b" \n\t"\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
68 "psrlq $32, "a" \n\t"\
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
69 PMAXW(b, a)\
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
70 "movq "a", "b" \n\t"\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
71 "psrlq $16, "a" \n\t"\
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
72 PMAXW(b, a)
2892
41315d0120b3 replace a few mov + psrlq with pshufw, there are more cases which could benefit from this but they would require us to duplicate some functions ...
michael
parents: 2327
diff changeset
73
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
74 #endif
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
75 #endif
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
76
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
77 #ifdef HAVE_SSSE3
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
78 #define SAVE_SIGN(a,b) \
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
79 "movdqa "b", "a" \n\t"\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
80 "pabsw "b", "b" \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
81 #define RESTORE_SIGN(a,b) \
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
82 "psignw "a", "b" \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
83 #else
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
84 #define SAVE_SIGN(a,b) \
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
85 "pxor "a", "a" \n\t"\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
86 "pcmpgtw "b", "a" \n\t" /* block[i] <= 0 ? 0xFF : 0x00 */\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
87 "pxor "a", "b" \n\t"\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
88 "psubw "a", "b" \n\t" /* ABS(block[i]) */
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
89 #define RESTORE_SIGN(a,b) \
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
90 "pxor "a", "b" \n\t"\
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
91 "psubw "a", "b" \n\t" // out=((ABS(block[i])*qmat[0] - bias[0]*qmat[0])>>16)*sign(block[i])
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
92 #endif
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
93
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
94 static int RENAME(dct_quantize)(MpegEncContext *s,
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
95 DCTELEM *block, int n,
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 230
diff changeset
96 int qscale, int *overflow)
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
97 {
2293
15cfba1b97b5 adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64 patch by (Aurelien Jacobs <aurel at gnuage dot org>)
michael
parents: 2115
diff changeset
98 long last_non_zero_p1;
5129
0244bba24b43 misc typo fixes
diego
parents: 5127
diff changeset
99 int level=0, q; //=0 is cuz gcc says uninitialized ...
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1013
diff changeset
100 const uint16_t *qmat, *bias;
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
101 DECLARE_ALIGNED_16(int16_t, temp_block[64]);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
102
1403
bd42cc06ceb7 fixing thread safety, this may cause alignment problms (if it does than the stuff should be moved to MpegEncContext)
michaelni
parents: 1251
diff changeset
103 assert((7&(int)(&temp_block[0])) == 0); //did gcc align it correctly?
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
104
625
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 599
diff changeset
105 //s->fdct (block);
5127
4dbe6578f811 misc spelling fixes
diego
parents: 4989
diff changeset
106 RENAMEl(ff_fdct) (block); //cannot be anything else ...
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 230
diff changeset
107
1597
4c9165372ab3 noise reduction of dct coefficients
michael
parents: 1565
diff changeset
108 if(s->dct_error_sum)
1719
4e72fb256b25 denoise_dct_mmx()
michael
parents: 1597
diff changeset
109 s->denoise_dct(s, block);
1597
4c9165372ab3 noise reduction of dct coefficients
michael
parents: 1565
diff changeset
110
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
111 if (s->mb_intra) {
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
112 int dummy;
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
113 if (n < 4)
641
eaa9ef2e2557 fixing encoding at high QPs (was broken after the dct accuracy increase due to too small inverse table)
michaelni
parents: 635
diff changeset
114 q = s->y_dc_scale;
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
115 else
641
eaa9ef2e2557 fixing encoding at high QPs (was broken after the dct accuracy increase due to too small inverse table)
michaelni
parents: 635
diff changeset
116 q = s->c_dc_scale;
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
117 /* note: block[0] is assumed to be positive */
350
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 344
diff changeset
118 if (!s->h263_aic) {
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
119 #if 1
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 230
diff changeset
120 asm volatile (
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
121 "mul %%ecx \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
122 : "=d" (level), "=a"(dummy)
4174
8535fcac43c1 rename inverse -> ff_inverse
mru
parents: 3947
diff changeset
123 : "a" ((block[0]>>2) + q), "c" (ff_inverse[q<<1])
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 230
diff changeset
124 );
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
125 #else
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 230
diff changeset
126 asm volatile (
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
127 "xorl %%edx, %%edx \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
128 "divw %%cx \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
129 "movzwl %%ax, %%eax \n\t"
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
130 : "=a" (level)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
131 : "a" ((block[0]>>2) + q), "c" (q<<1)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
132 : "%edx"
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 230
diff changeset
133 );
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
134 #endif
350
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 344
diff changeset
135 } else
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 344
diff changeset
136 /* For AIC we skip quant/dequant of INTRADC */
641
eaa9ef2e2557 fixing encoding at high QPs (was broken after the dct accuracy increase due to too small inverse table)
michaelni
parents: 635
diff changeset
137 level = (block[0] + 4)>>3;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
138
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 230
diff changeset
139 block[0]=0; //avoid fake overflow
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
140 // temp_block[0] = (block[0] + (q >> 1)) / q;
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
141 last_non_zero_p1 = 1;
1554
d736e24bf303 move mmx quantizer matrixes out of MpegEncContext (23k -> 7k) (no meassureable slowdown)
michael
parents: 1403
diff changeset
142 bias = s->q_intra_matrix16[qscale][1];
d736e24bf303 move mmx quantizer matrixes out of MpegEncContext (23k -> 7k) (no meassureable slowdown)
michael
parents: 1403
diff changeset
143 qmat = s->q_intra_matrix16[qscale][0];
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
144 } else {
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
145 last_non_zero_p1 = 0;
1554
d736e24bf303 move mmx quantizer matrixes out of MpegEncContext (23k -> 7k) (no meassureable slowdown)
michael
parents: 1403
diff changeset
146 bias = s->q_inter_matrix16[qscale][1];
d736e24bf303 move mmx quantizer matrixes out of MpegEncContext (23k -> 7k) (no meassureable slowdown)
michael
parents: 1403
diff changeset
147 qmat = s->q_inter_matrix16[qscale][0];
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
148 }
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
149
2327
5e5cf598a48b H.261 encoder by (Maarten Daniels <maarten dot daniels at luc dot ac dot be>)
michael
parents: 2293
diff changeset
150 if((s->out_format == FMT_H263 || s->out_format == FMT_H261) && s->mpeg_quant==0){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
151
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 230
diff changeset
152 asm volatile(
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
153 "movd %%"REG_a", "MM"3 \n\t" // last_non_zero_p1
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
154 SPREADW(MM"3")
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
155 "pxor "MM"7, "MM"7 \n\t" // 0
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
156 "pxor "MM"4, "MM"4 \n\t" // 0
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
157 MOVQ" (%2), "MM"5 \n\t" // qmat[0]
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
158 "pxor "MM"6, "MM"6 \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
159 "psubw (%3), "MM"6 \n\t" // -bias[0]
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
160 "mov $-128, %%"REG_a" \n\t"
3576
f7125bf10892 Support for MacIntel, last part: balign directives
gpoirier
parents: 3393
diff changeset
161 ASMALIGN(4)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
162 "1: \n\t"
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
163 MOVQ" (%1, %%"REG_a"), "MM"0 \n\t" // block[i]
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
164 SAVE_SIGN(MM"1", MM"0") // ABS(block[i])
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
165 "psubusw "MM"6, "MM"0 \n\t" // ABS(block[i]) + bias[0]
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
166 "pmulhw "MM"5, "MM"0 \n\t" // (ABS(block[i])*qmat[0] - bias[0]*qmat[0])>>16
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
167 "por "MM"0, "MM"4 \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
168 RESTORE_SIGN(MM"1", MM"0") // out=((ABS(block[i])*qmat[0] - bias[0]*qmat[0])>>16)*sign(block[i])
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
169 MOVQ" "MM"0, (%5, %%"REG_a") \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
170 "pcmpeqw "MM"7, "MM"0 \n\t" // out==0 ? 0xFF : 0x00
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
171 MOVQ" (%4, %%"REG_a"), "MM"1 \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
172 MOVQ" "MM"7, (%1, %%"REG_a") \n\t" // 0
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
173 "pandn "MM"1, "MM"0 \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
174 PMAXW(MM"0", MM"3")
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
175 "add $"MMREG_WIDTH", %%"REG_a" \n\t"
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
176 " js 1b \n\t"
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
177 PMAX(MM"3", MM"0")
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
178 "movd "MM"3, %%"REG_a" \n\t"
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
179 "movzb %%al, %%"REG_a" \n\t" // last_non_zero_p1
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
180 : "+a" (last_non_zero_p1)
1251
afdd177080c9 * oops - reversed last commit
kabi
parents: 1248
diff changeset
181 : "r" (block+64), "r" (qmat), "r" (bias),
4197
bbe0bc387a19 revert bad checkin
mru
parents: 4196
diff changeset
182 "r" (inv_zigzag_direct16+64), "r" (temp_block+64)
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 230
diff changeset
183 );
1251
afdd177080c9 * oops - reversed last commit
kabi
parents: 1248
diff changeset
184 }else{ // FMT_H263
afdd177080c9 * oops - reversed last commit
kabi
parents: 1248
diff changeset
185 asm volatile(
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
186 "movd %%"REG_a", "MM"3 \n\t" // last_non_zero_p1
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
187 SPREADW(MM"3")
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
188 "pxor "MM"7, "MM"7 \n\t" // 0
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
189 "pxor "MM"4, "MM"4 \n\t" // 0
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
190 "mov $-128, %%"REG_a" \n\t"
3576
f7125bf10892 Support for MacIntel, last part: balign directives
gpoirier
parents: 3393
diff changeset
191 ASMALIGN(4)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
192 "1: \n\t"
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
193 MOVQ" (%1, %%"REG_a"), "MM"0 \n\t" // block[i]
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
194 SAVE_SIGN(MM"1", MM"0") // ABS(block[i])
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
195 MOVQ" (%3, %%"REG_a"), "MM"6 \n\t" // bias[0]
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
196 "paddusw "MM"6, "MM"0 \n\t" // ABS(block[i]) + bias[0]
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
197 MOVQ" (%2, %%"REG_a"), "MM"5 \n\t" // qmat[i]
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
198 "pmulhw "MM"5, "MM"0 \n\t" // (ABS(block[i])*qmat[0] + bias[0]*qmat[0])>>16
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
199 "por "MM"0, "MM"4 \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
200 RESTORE_SIGN(MM"1", MM"0") // out=((ABS(block[i])*qmat[0] - bias[0]*qmat[0])>>16)*sign(block[i])
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
201 MOVQ" "MM"0, (%5, %%"REG_a") \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
202 "pcmpeqw "MM"7, "MM"0 \n\t" // out==0 ? 0xFF : 0x00
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
203 MOVQ" (%4, %%"REG_a"), "MM"1 \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
204 MOVQ" "MM"7, (%1, %%"REG_a") \n\t" // 0
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
205 "pandn "MM"1, "MM"0 \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
206 PMAXW(MM"0", MM"3")
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
207 "add $"MMREG_WIDTH", %%"REG_a" \n\t"
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
208 " js 1b \n\t"
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
209 PMAX(MM"3", MM"0")
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
210 "movd "MM"3, %%"REG_a" \n\t"
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
211 "movzb %%al, %%"REG_a" \n\t" // last_non_zero_p1
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
212 : "+a" (last_non_zero_p1)
1251
afdd177080c9 * oops - reversed last commit
kabi
parents: 1248
diff changeset
213 : "r" (block+64), "r" (qmat+64), "r" (bias+64),
4197
bbe0bc387a19 revert bad checkin
mru
parents: 4196
diff changeset
214 "r" (inv_zigzag_direct16+64), "r" (temp_block+64)
1251
afdd177080c9 * oops - reversed last commit
kabi
parents: 1248
diff changeset
215 );
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
216 }
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
217 asm volatile(
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
218 "movd %1, "MM"1 \n\t" // max_qcoeff
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
219 SPREADW(MM"1")
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
220 "psubusw "MM"1, "MM"4 \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
221 "packuswb "MM"4, "MM"4 \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
222 #ifdef HAVE_SSE2
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
223 "packuswb "MM"4, "MM"4 \n\t"
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
224 #endif
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
225 "movd "MM"4, %0 \n\t" // *overflow
1251
afdd177080c9 * oops - reversed last commit
kabi
parents: 1248
diff changeset
226 : "=g" (*overflow)
afdd177080c9 * oops - reversed last commit
kabi
parents: 1248
diff changeset
227 : "g" (s->max_qcoeff)
4989
0b1e761135cd sse2 & ssse3 versions of dct_quantize.
lorenm
parents: 4197
diff changeset
228 );
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 230
diff changeset
229
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
230 if(s->mb_intra) block[0]= level;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
231 else block[0]= temp_block[0];
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
232
1092
f59c3f66363b MpegEncContext.(i)dct_* -> DspContext.(i)dct_*
michaelni
parents: 1064
diff changeset
233 if(s->dsp.idct_permutation_type == FF_SIMPLE_IDCT_PERM){
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
234 if(last_non_zero_p1 <= 1) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
235 block[0x08] = temp_block[0x01]; block[0x10] = temp_block[0x08];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
236 block[0x20] = temp_block[0x10];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
237 if(last_non_zero_p1 <= 4) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
238 block[0x18] = temp_block[0x09]; block[0x04] = temp_block[0x02];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
239 block[0x09] = temp_block[0x03];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
240 if(last_non_zero_p1 <= 7) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
241 block[0x14] = temp_block[0x0A]; block[0x28] = temp_block[0x11];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
242 block[0x12] = temp_block[0x18]; block[0x02] = temp_block[0x20];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
243 if(last_non_zero_p1 <= 11) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
244 block[0x1A] = temp_block[0x19]; block[0x24] = temp_block[0x12];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
245 block[0x19] = temp_block[0x0B]; block[0x01] = temp_block[0x04];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
246 block[0x0C] = temp_block[0x05];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
247 if(last_non_zero_p1 <= 16) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
248 block[0x11] = temp_block[0x0C]; block[0x29] = temp_block[0x13];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
249 block[0x16] = temp_block[0x1A]; block[0x0A] = temp_block[0x21];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
250 block[0x30] = temp_block[0x28]; block[0x22] = temp_block[0x30];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
251 block[0x38] = temp_block[0x29]; block[0x06] = temp_block[0x22];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
252 if(last_non_zero_p1 <= 24) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
253 block[0x1B] = temp_block[0x1B]; block[0x21] = temp_block[0x14];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
254 block[0x1C] = temp_block[0x0D]; block[0x05] = temp_block[0x06];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
255 block[0x0D] = temp_block[0x07]; block[0x15] = temp_block[0x0E];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
256 block[0x2C] = temp_block[0x15]; block[0x13] = temp_block[0x1C];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
257 if(last_non_zero_p1 <= 32) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
258 block[0x0B] = temp_block[0x23]; block[0x34] = temp_block[0x2A];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
259 block[0x2A] = temp_block[0x31]; block[0x32] = temp_block[0x38];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
260 block[0x3A] = temp_block[0x39]; block[0x26] = temp_block[0x32];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
261 block[0x39] = temp_block[0x2B]; block[0x03] = temp_block[0x24];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
262 if(last_non_zero_p1 <= 40) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
263 block[0x1E] = temp_block[0x1D]; block[0x25] = temp_block[0x16];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
264 block[0x1D] = temp_block[0x0F]; block[0x2D] = temp_block[0x17];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
265 block[0x17] = temp_block[0x1E]; block[0x0E] = temp_block[0x25];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
266 block[0x31] = temp_block[0x2C]; block[0x2B] = temp_block[0x33];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
267 if(last_non_zero_p1 <= 48) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
268 block[0x36] = temp_block[0x3A]; block[0x3B] = temp_block[0x3B];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
269 block[0x23] = temp_block[0x34]; block[0x3C] = temp_block[0x2D];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
270 block[0x07] = temp_block[0x26]; block[0x1F] = temp_block[0x1F];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
271 block[0x0F] = temp_block[0x27]; block[0x35] = temp_block[0x2E];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
272 if(last_non_zero_p1 <= 56) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
273 block[0x2E] = temp_block[0x35]; block[0x33] = temp_block[0x3C];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
274 block[0x3E] = temp_block[0x3D]; block[0x27] = temp_block[0x36];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
275 block[0x3D] = temp_block[0x2F]; block[0x2F] = temp_block[0x37];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
276 block[0x37] = temp_block[0x3E]; block[0x3F] = temp_block[0x3F];
1092
f59c3f66363b MpegEncContext.(i)dct_* -> DspContext.(i)dct_*
michaelni
parents: 1064
diff changeset
277 }else if(s->dsp.idct_permutation_type == FF_LIBMPEG2_IDCT_PERM){
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
278 if(last_non_zero_p1 <= 1) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
279 block[0x04] = temp_block[0x01];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
280 block[0x08] = temp_block[0x08]; block[0x10] = temp_block[0x10];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
281 if(last_non_zero_p1 <= 4) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
282 block[0x0C] = temp_block[0x09]; block[0x01] = temp_block[0x02];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
283 block[0x05] = temp_block[0x03];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
284 if(last_non_zero_p1 <= 7) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
285 block[0x09] = temp_block[0x0A]; block[0x14] = temp_block[0x11];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
286 block[0x18] = temp_block[0x18]; block[0x20] = temp_block[0x20];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
287 if(last_non_zero_p1 <= 11) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
288 block[0x1C] = temp_block[0x19];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
289 block[0x11] = temp_block[0x12]; block[0x0D] = temp_block[0x0B];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
290 block[0x02] = temp_block[0x04]; block[0x06] = temp_block[0x05];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
291 if(last_non_zero_p1 <= 16) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
292 block[0x0A] = temp_block[0x0C]; block[0x15] = temp_block[0x13];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
293 block[0x19] = temp_block[0x1A]; block[0x24] = temp_block[0x21];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
294 block[0x28] = temp_block[0x28]; block[0x30] = temp_block[0x30];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
295 block[0x2C] = temp_block[0x29]; block[0x21] = temp_block[0x22];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
296 if(last_non_zero_p1 <= 24) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
297 block[0x1D] = temp_block[0x1B]; block[0x12] = temp_block[0x14];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
298 block[0x0E] = temp_block[0x0D]; block[0x03] = temp_block[0x06];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
299 block[0x07] = temp_block[0x07]; block[0x0B] = temp_block[0x0E];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
300 block[0x16] = temp_block[0x15]; block[0x1A] = temp_block[0x1C];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
301 if(last_non_zero_p1 <= 32) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
302 block[0x25] = temp_block[0x23]; block[0x29] = temp_block[0x2A];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
303 block[0x34] = temp_block[0x31]; block[0x38] = temp_block[0x38];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
304 block[0x3C] = temp_block[0x39]; block[0x31] = temp_block[0x32];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
305 block[0x2D] = temp_block[0x2B]; block[0x22] = temp_block[0x24];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
306 if(last_non_zero_p1 <= 40) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
307 block[0x1E] = temp_block[0x1D]; block[0x13] = temp_block[0x16];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
308 block[0x0F] = temp_block[0x0F]; block[0x17] = temp_block[0x17];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
309 block[0x1B] = temp_block[0x1E]; block[0x26] = temp_block[0x25];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
310 block[0x2A] = temp_block[0x2C]; block[0x35] = temp_block[0x33];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
311 if(last_non_zero_p1 <= 48) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
312 block[0x39] = temp_block[0x3A]; block[0x3D] = temp_block[0x3B];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
313 block[0x32] = temp_block[0x34]; block[0x2E] = temp_block[0x2D];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
314 block[0x23] = temp_block[0x26]; block[0x1F] = temp_block[0x1F];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
315 block[0x27] = temp_block[0x27]; block[0x2B] = temp_block[0x2E];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
316 if(last_non_zero_p1 <= 56) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
317 block[0x36] = temp_block[0x35]; block[0x3A] = temp_block[0x3C];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
318 block[0x3E] = temp_block[0x3D]; block[0x33] = temp_block[0x36];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
319 block[0x2F] = temp_block[0x2F]; block[0x37] = temp_block[0x37];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
320 block[0x3B] = temp_block[0x3E]; block[0x3F] = temp_block[0x3F];
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
321 }else{
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
322 if(last_non_zero_p1 <= 1) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
323 block[0x01] = temp_block[0x01];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
324 block[0x08] = temp_block[0x08]; block[0x10] = temp_block[0x10];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
325 if(last_non_zero_p1 <= 4) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
326 block[0x09] = temp_block[0x09]; block[0x02] = temp_block[0x02];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
327 block[0x03] = temp_block[0x03];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
328 if(last_non_zero_p1 <= 7) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
329 block[0x0A] = temp_block[0x0A]; block[0x11] = temp_block[0x11];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
330 block[0x18] = temp_block[0x18]; block[0x20] = temp_block[0x20];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
331 if(last_non_zero_p1 <= 11) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
332 block[0x19] = temp_block[0x19];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
333 block[0x12] = temp_block[0x12]; block[0x0B] = temp_block[0x0B];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
334 block[0x04] = temp_block[0x04]; block[0x05] = temp_block[0x05];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
335 if(last_non_zero_p1 <= 16) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
336 block[0x0C] = temp_block[0x0C]; block[0x13] = temp_block[0x13];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
337 block[0x1A] = temp_block[0x1A]; block[0x21] = temp_block[0x21];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
338 block[0x28] = temp_block[0x28]; block[0x30] = temp_block[0x30];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
339 block[0x29] = temp_block[0x29]; block[0x22] = temp_block[0x22];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
340 if(last_non_zero_p1 <= 24) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
341 block[0x1B] = temp_block[0x1B]; block[0x14] = temp_block[0x14];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
342 block[0x0D] = temp_block[0x0D]; block[0x06] = temp_block[0x06];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
343 block[0x07] = temp_block[0x07]; block[0x0E] = temp_block[0x0E];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
344 block[0x15] = temp_block[0x15]; block[0x1C] = temp_block[0x1C];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
345 if(last_non_zero_p1 <= 32) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
346 block[0x23] = temp_block[0x23]; block[0x2A] = temp_block[0x2A];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
347 block[0x31] = temp_block[0x31]; block[0x38] = temp_block[0x38];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
348 block[0x39] = temp_block[0x39]; block[0x32] = temp_block[0x32];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
349 block[0x2B] = temp_block[0x2B]; block[0x24] = temp_block[0x24];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
350 if(last_non_zero_p1 <= 40) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
351 block[0x1D] = temp_block[0x1D]; block[0x16] = temp_block[0x16];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
352 block[0x0F] = temp_block[0x0F]; block[0x17] = temp_block[0x17];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
353 block[0x1E] = temp_block[0x1E]; block[0x25] = temp_block[0x25];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
354 block[0x2C] = temp_block[0x2C]; block[0x33] = temp_block[0x33];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
355 if(last_non_zero_p1 <= 48) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
356 block[0x3A] = temp_block[0x3A]; block[0x3B] = temp_block[0x3B];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
357 block[0x34] = temp_block[0x34]; block[0x2D] = temp_block[0x2D];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
358 block[0x26] = temp_block[0x26]; block[0x1F] = temp_block[0x1F];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
359 block[0x27] = temp_block[0x27]; block[0x2E] = temp_block[0x2E];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
360 if(last_non_zero_p1 <= 56) goto end;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
361 block[0x35] = temp_block[0x35]; block[0x3C] = temp_block[0x3C];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
362 block[0x3D] = temp_block[0x3D]; block[0x36] = temp_block[0x36];
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2892
diff changeset
363 block[0x2F] = temp_block[0x2F]; block[0x37] = temp_block[0x37];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
364 block[0x3E] = temp_block[0x3E]; block[0x3F] = temp_block[0x3F];
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
365 }
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 687
diff changeset
366 end:
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
367 /*
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
368 for(i=0; i<last_non_zero_p1; i++)
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
369 {
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
370 int j= zigzag_direct_noperm[i];
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
371 block[block_permute_op(j)]= temp_block[j];
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
372 }
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
373 */
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 230
diff changeset
374
220
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
375 return last_non_zero_p1 - 1;
0b234715e205 (commit by michael)
arpi_esp
parents:
diff changeset
376 }