annotate libpostproc/postprocess.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents 805cbcf4dc8a
children ace6e273f318
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
1 /*
1067
54aa0bb40e97 avoid #include "../
michael
parents: 1029
diff changeset
2 Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at)
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
3
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
4 AltiVec optimizations (C) 2004 Romain Dolbeau <romain@dolbeau.org>
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
5
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
6 This program is free software; you can redistribute it and/or modify
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
8 the Free Software Foundation; either version 2 of the License, or
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
9 (at your option) any later version.
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
10
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
11 This program is distributed in the hope that it will be useful,
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
14 GNU General Public License for more details.
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
15
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
17 along with this program; if not, write to the Free Software
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
19 */
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
20
1109
3644e555a20a doxy / cosmetics
michaelni
parents: 1076
diff changeset
21 /**
3644e555a20a doxy / cosmetics
michaelni
parents: 1076
diff changeset
22 * @file postprocess.c
3644e555a20a doxy / cosmetics
michaelni
parents: 1076
diff changeset
23 * postprocessing.
3644e555a20a doxy / cosmetics
michaelni
parents: 1076
diff changeset
24 */
3644e555a20a doxy / cosmetics
michaelni
parents: 1076
diff changeset
25
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
26 /*
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
27 C MMX MMX2 3DNow AltiVec
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
28 isVertDC Ec Ec Ec
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
29 isVertMinMaxOk Ec Ec Ec
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
30 doVertLowPass E e e Ec
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
31 doVertDefFilter Ec Ec e e Ec
2043
703b80c99891 Another (final?) patch for libpostproc.
michael
parents: 2041
diff changeset
32 isHorizDC Ec Ec Ec
703b80c99891 Another (final?) patch for libpostproc.
michael
parents: 2041
diff changeset
33 isHorizMinMaxOk a E Ec
703b80c99891 Another (final?) patch for libpostproc.
michael
parents: 2041
diff changeset
34 doHorizLowPass E e e Ec
703b80c99891 Another (final?) patch for libpostproc.
michael
parents: 2041
diff changeset
35 doHorizDefFilter Ec Ec e e Ec
2039
f25e485a7850 mmx optimized version of the per line/accurate deblock filter
michael
parents: 2038
diff changeset
36 do_a_deblock Ec E Ec E
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
37 deRing E e e* Ecp
106
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
38 Vertical RKAlgo1 E a a
129
be35346e27c1 fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 128
diff changeset
39 Horizontal RKAlgo1 a a
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
40 Vertical X1# a E E
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
41 Horizontal X1# a E E
111
8e4c5a16c9fc fixed the height%8!=0 bug
michael
parents: 109
diff changeset
42 LinIpolDeinterlace e E E*
8e4c5a16c9fc fixed the height%8!=0 bug
michael
parents: 109
diff changeset
43 CubicIpolDeinterlace a e e*
8e4c5a16c9fc fixed the height%8!=0 bug
michael
parents: 109
diff changeset
44 LinBlendDeinterlace e E E*
1029
804cc05a3f61 C implementation of the median deinterlacer (seems to be the only one
rfelker
parents: 957
diff changeset
45 MedianDeinterlace# E Ec Ec
2043
703b80c99891 Another (final?) patch for libpostproc.
michael
parents: 2041
diff changeset
46 TempDeNoiser# E e e Ec
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
47
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
48 * i dont have a 3dnow CPU -> its untested, but noone said it doesnt work so it seems to work
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
49 # more or less selfinvented filters so the exactness isnt too meaningfull
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
50 E = Exact implementation
111
8e4c5a16c9fc fixed the height%8!=0 bug
michael
parents: 109
diff changeset
51 e = allmost exact implementation (slightly different rounding,...)
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
52 a = alternative / approximate impl
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
53 c = checked against the other implementations (-vo md5)
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
54 p = partially optimized, still some work to do
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
55 */
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
56
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
57 /*
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
58 TODO:
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
59 reduce the time wasted on the mem transfer
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
60 unroll stuff if instructions depend too much on the prior one
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
61 move YScale thing to the end instead of fixing QP
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
62 write a faster and higher quality deblocking filter :)
97
e57b1d38d71f bugfixes: last 3 lines not brightness/contrast corrected
michael
parents: 96
diff changeset
63 make the mainloop more flexible (variable number of blocks at once
e57b1d38d71f bugfixes: last 3 lines not brightness/contrast corrected
michael
parents: 96
diff changeset
64 (the if/else stuff per block is slowing things down)
99
4f072fa99ccf fixed a rounding bug thing in the X1 Filter
michael
parents: 98
diff changeset
65 compare the quality & speed of all filters
4f072fa99ccf fixed a rounding bug thing in the X1 Filter
michael
parents: 98
diff changeset
66 split this huge file
140
52ed0baddd56 minor speedup
michael
parents: 135
diff changeset
67 optimize c versions
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
68 try to unroll inner for(x=0 ... loop to avoid these damn if(x ... checks
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
69 ...
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
70 */
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
71
107
bd163e13a0fb minor cleanups
michael
parents: 106
diff changeset
72 //Changelog: use the CVS log
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
73
1067
54aa0bb40e97 avoid #include "../
michael
parents: 1029
diff changeset
74 #include "config.h"
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
75 #include <inttypes.h>
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
76 #include <stdio.h>
97
e57b1d38d71f bugfixes: last 3 lines not brightness/contrast corrected
michael
parents: 96
diff changeset
77 #include <stdlib.h>
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
78 #include <string.h>
133
e0bf2e9ce24c a few warning fixes (missing #include's)
pl
parents: 132
diff changeset
79 #ifdef HAVE_MALLOC_H
e0bf2e9ce24c a few warning fixes (missing #include's)
pl
parents: 132
diff changeset
80 #include <malloc.h>
e0bf2e9ce24c a few warning fixes (missing #include's)
pl
parents: 132
diff changeset
81 #endif
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
82 //#undef HAVE_MMX2
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
83 //#define HAVE_3DNOW
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
84 //#undef HAVE_MMX
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
85 //#undef ARCH_X86
163
32e7f17a04a7 faster mmx2 / 3dnow deblocking filter
michael
parents: 158
diff changeset
86 //#define DEBUG_BRIGHTNESS
1069
8528d0b9e508 moving postprocess to ffmpeg/libavcodec
michaelni
parents: 1067
diff changeset
87 #ifdef USE_FASTMEMCPY
1775
3875b8b30399 changed includes
alex
parents: 1724
diff changeset
88 #include "fastmemcpy.h"
837
ee8bb36d2e60 dont use fastmemcpy for PIC
michael
parents: 833
diff changeset
89 #endif
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
90 #include "postprocess.h"
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
91 #include "postprocess_internal.h"
1069
8528d0b9e508 moving postprocess to ffmpeg/libavcodec
michaelni
parents: 1067
diff changeset
92
8528d0b9e508 moving postprocess to ffmpeg/libavcodec
michaelni
parents: 1067
diff changeset
93 #include "mangle.h" //FIXME should be supressed
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
94
2041
b996fbe0a7e7 Newer version, using a vectorized version of the
michael
parents: 2040
diff changeset
95 #ifdef HAVE_ALTIVEC_H
b996fbe0a7e7 Newer version, using a vectorized version of the
michael
parents: 2040
diff changeset
96 #include <altivec.h>
b996fbe0a7e7 Newer version, using a vectorized version of the
michael
parents: 2040
diff changeset
97 #endif
b996fbe0a7e7 Newer version, using a vectorized version of the
michael
parents: 2040
diff changeset
98
1071
0a48dd404167 * update cleanup rules (Steven M. Schultz)
kabi
parents: 1069
diff changeset
99 #ifndef HAVE_MEMALIGN
0a48dd404167 * update cleanup rules (Steven M. Schultz)
kabi
parents: 1069
diff changeset
100 #define memalign(a,b) malloc(b)
0a48dd404167 * update cleanup rules (Steven M. Schultz)
kabi
parents: 1069
diff changeset
101 #endif
0a48dd404167 * update cleanup rules (Steven M. Schultz)
kabi
parents: 1069
diff changeset
102
104
9607b48e2c2d Cleanup:
arpi
parents: 102
diff changeset
103 #define MIN(a,b) ((a) > (b) ? (b) : (a))
9607b48e2c2d Cleanup:
arpi
parents: 102
diff changeset
104 #define MAX(a,b) ((a) < (b) ? (b) : (a))
9607b48e2c2d Cleanup:
arpi
parents: 102
diff changeset
105 #define ABS(a) ((a) > 0 ? (a) : (-(a)))
9607b48e2c2d Cleanup:
arpi
parents: 102
diff changeset
106 #define SIGN(a) ((a) > 0 ? 1 : -1)
9607b48e2c2d Cleanup:
arpi
parents: 102
diff changeset
107
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
108 #define GET_MODE_BUFFER_SIZE 500
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
109 #define OPTIONS_ARRAY_SIZE 10
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
110 #define BLOCK_SIZE 8
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
111 #define TEMP_STRIDE 8
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
112 //#define NUM_BLOCKS_AT_ONCE 16 //not used yet
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
113
1847
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
114 #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
115 # define attribute_used __attribute__((used))
2037
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
116 # define always_inline __attribute__((always_inline)) inline
1847
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
117 #else
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
118 # define attribute_used
2037
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
119 # define always_inline inline
1847
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
120 #endif
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
121
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: 2188
diff changeset
122 #if defined(ARCH_X86) || defined(ARCH_X86_64)
1847
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
123 static uint64_t __attribute__((aligned(8))) attribute_used w05= 0x0005000500050005LL;
2040
5de466b3360e per line lowpass filter in mmx
michael
parents: 2039
diff changeset
124 static uint64_t __attribute__((aligned(8))) attribute_used w04= 0x0004000400040004LL;
1847
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
125 static uint64_t __attribute__((aligned(8))) attribute_used w20= 0x0020002000200020LL;
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
126 static uint64_t __attribute__((aligned(8))) attribute_used b00= 0x0000000000000000LL;
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
127 static uint64_t __attribute__((aligned(8))) attribute_used b01= 0x0101010101010101LL;
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
128 static uint64_t __attribute__((aligned(8))) attribute_used b02= 0x0202020202020202LL;
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
129 static uint64_t __attribute__((aligned(8))) attribute_used b08= 0x0808080808080808LL;
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
130 static uint64_t __attribute__((aligned(8))) attribute_used b80= 0x8080808080808080LL;
148
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
131 #endif
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
132
1157
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
133 static uint8_t clip_table[3*256];
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
134 static uint8_t * const clip_tab= clip_table + 256;
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
135
2031
4225c131a2eb warning fixes by (Michael Roitzsch <mroi at users dot sourceforge dot net>)
michael
parents: 2024
diff changeset
136 static const int verbose= 0;
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
137
1847
ef661c4dc5a6 attribute_used patch by (mitya at school dot ioffe dot ru (Dmitry Baryshkov))
michael
parents: 1775
diff changeset
138 static const int attribute_used deringThreshold= 20;
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
139
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
140
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
141 static struct PPFilter filters[]=
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
142 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
143 {"hb", "hdeblock", 1, 1, 3, H_DEBLOCK},
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
144 {"vb", "vdeblock", 1, 2, 4, V_DEBLOCK},
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
145 /* {"hr", "rkhdeblock", 1, 1, 3, H_RK1_FILTER},
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
146 {"vr", "rkvdeblock", 1, 2, 4, V_RK1_FILTER},*/
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
147 {"h1", "x1hdeblock", 1, 1, 3, H_X1_FILTER},
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
148 {"v1", "x1vdeblock", 1, 2, 4, V_X1_FILTER},
2037
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
149 {"ha", "ahdeblock", 1, 1, 3, H_A_DEBLOCK},
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
150 {"va", "avdeblock", 1, 2, 4, V_A_DEBLOCK},
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
151 {"dr", "dering", 1, 5, 6, DERING},
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
152 {"al", "autolevels", 0, 1, 2, LEVEL_FIX},
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
153 {"lb", "linblenddeint", 1, 1, 4, LINEAR_BLEND_DEINT_FILTER},
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
154 {"li", "linipoldeint", 1, 1, 4, LINEAR_IPOL_DEINT_FILTER},
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
155 {"ci", "cubicipoldeint", 1, 1, 4, CUBIC_IPOL_DEINT_FILTER},
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
156 {"md", "mediandeint", 1, 1, 4, MEDIAN_DEINT_FILTER},
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
157 {"fd", "ffmpegdeint", 1, 1, 4, FFMPEG_DEINT_FILTER},
1157
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
158 {"l5", "lowpass5", 1, 1, 4, LOWPASS5_DEINT_FILTER},
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
159 {"tn", "tmpnoise", 1, 7, 8, TEMP_NOISE_FILTER},
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
160 {"fq", "forcequant", 1, 0, 0, FORCE_QUANT},
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
161 {NULL, NULL,0,0,0,0} //End Marker
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
162 };
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
163
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
164 static char *replaceTable[]=
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
165 {
2037
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
166 "default", "hdeblock:a,vdeblock:a,dering:a",
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
167 "de", "hdeblock:a,vdeblock:a,dering:a",
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
168 "fast", "x1hdeblock:a,x1vdeblock:a,dering:a",
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
169 "fa", "x1hdeblock:a,x1vdeblock:a,dering:a",
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
170 "ac", "ha:a:128:7,va:a,dering:a",
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
171 NULL //End Marker
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
172 };
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
173
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
174
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: 2188
diff changeset
175 #if defined(ARCH_X86) || defined(ARCH_X86_64)
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
176 static inline void prefetchnta(void *p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
177 {
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
178 asm volatile( "prefetchnta (%0)\n\t"
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
179 : : "r" (p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
180 );
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
181 }
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
182
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
183 static inline void prefetcht0(void *p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
184 {
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
185 asm volatile( "prefetcht0 (%0)\n\t"
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
186 : : "r" (p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
187 );
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
188 }
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
189
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
190 static inline void prefetcht1(void *p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
191 {
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
192 asm volatile( "prefetcht1 (%0)\n\t"
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
193 : : "r" (p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
194 );
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
195 }
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
196
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
197 static inline void prefetcht2(void *p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
198 {
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
199 asm volatile( "prefetcht2 (%0)\n\t"
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
200 : : "r" (p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
201 );
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
202 }
102
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
203 #endif
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
204
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
205 // The horizontal Functions exist only in C cuz the MMX code is faster with vertical filters and transposing
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
206
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
207 /**
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
208 * Check if the given 8x8 Block is mostly "flat"
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
209 */
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
210 static inline int isHorizDC_C(uint8_t src[], int stride, PPContext *c)
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
211 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
212 int numEq= 0;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
213 int y;
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
214 const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
215 const int dcThreshold= dcOffset*2 + 1;
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
216
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
217 for(y=0; y<BLOCK_SIZE; y++)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
218 {
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
219 if(((unsigned)(src[0] - src[1] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
220 if(((unsigned)(src[1] - src[2] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
221 if(((unsigned)(src[2] - src[3] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
222 if(((unsigned)(src[3] - src[4] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
223 if(((unsigned)(src[4] - src[5] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
224 if(((unsigned)(src[5] - src[6] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
225 if(((unsigned)(src[6] - src[7] + dcOffset)) < dcThreshold) numEq++;
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
226 src+= stride;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
227 }
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
228 return numEq > c->ppMode.flatnessThreshold;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
229 }
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
230
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
231 /**
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
232 * Check if the middle 8x8 Block in the given 8x16 block is flat
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
233 */
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
234 static inline int isVertDC_C(uint8_t src[], int stride, PPContext *c){
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
235 int numEq= 0;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
236 int y;
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
237 const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
238 const int dcThreshold= dcOffset*2 + 1;
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
239
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
240 src+= stride*4; // src points to begin of the 8x8 Block
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
241 for(y=0; y<BLOCK_SIZE-1; y++)
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
242 {
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
243 if(((unsigned)(src[0] - src[0+stride] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
244 if(((unsigned)(src[1] - src[1+stride] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
245 if(((unsigned)(src[2] - src[2+stride] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
246 if(((unsigned)(src[3] - src[3+stride] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
247 if(((unsigned)(src[4] - src[4+stride] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
248 if(((unsigned)(src[5] - src[5+stride] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
249 if(((unsigned)(src[6] - src[6+stride] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
250 if(((unsigned)(src[7] - src[7+stride] + dcOffset)) < dcThreshold) numEq++;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
251 src+= stride;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
252 }
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
253 return numEq > c->ppMode.flatnessThreshold;
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
254 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
255
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
256 static inline int isHorizMinMaxOk_C(uint8_t src[], int stride, int QP)
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
257 {
1327
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
258 int i;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
259 #if 1
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
260 for(i=0; i<2; i++){
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
261 if((unsigned)(src[0] - src[5] + 2*QP) > 4*QP) return 0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
262 src += stride;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
263 if((unsigned)(src[2] - src[7] + 2*QP) > 4*QP) return 0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
264 src += stride;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
265 if((unsigned)(src[4] - src[1] + 2*QP) > 4*QP) return 0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
266 src += stride;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
267 if((unsigned)(src[6] - src[3] + 2*QP) > 4*QP) return 0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
268 src += stride;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
269 }
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
270 #else
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
271 for(i=0; i<8; i++){
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
272 if((unsigned)(src[0] - src[7] + 2*QP) > 4*QP) return 0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
273 src += stride;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
274 }
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
275 #endif
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
276 return 1;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
277 }
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
278
1327
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
279 static inline int isVertMinMaxOk_C(uint8_t src[], int stride, int QP)
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
280 {
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
281 #if 1
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
282 #if 1
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
283 int x;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
284 src+= stride*4;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
285 for(x=0; x<BLOCK_SIZE; x+=4)
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
286 {
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
287 if((unsigned)(src[ x + 0*stride] - src[ x + 5*stride] + 2*QP) > 4*QP) return 0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
288 if((unsigned)(src[1+x + 2*stride] - src[1+x + 7*stride] + 2*QP) > 4*QP) return 0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
289 if((unsigned)(src[2+x + 4*stride] - src[2+x + 1*stride] + 2*QP) > 4*QP) return 0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
290 if((unsigned)(src[3+x + 6*stride] - src[3+x + 3*stride] + 2*QP) > 4*QP) return 0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
291 }
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
292 #else
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
293 int x;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
294 src+= stride*3;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
295 for(x=0; x<BLOCK_SIZE; x++)
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
296 {
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
297 if((unsigned)(src[x + stride] - src[x + (stride<<3)] + 2*QP) > 4*QP) return 0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
298 }
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
299 #endif
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
300 return 1;
1327
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
301 #else
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
302 int x;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
303 src+= stride*4;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
304 for(x=0; x<BLOCK_SIZE; x++)
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
305 {
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
306 int min=255;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
307 int max=0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
308 int y;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
309 for(y=0; y<8; y++){
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
310 int v= src[x + y*stride];
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
311 if(v>max) max=v;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
312 if(v<min) min=v;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
313 }
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
314 if(max-min > 2*QP) return 0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
315 }
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
316 return 1;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
317 #endif
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
318 }
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
319
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
320 static inline int horizClassify_C(uint8_t src[], int stride, PPContext *c){
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
321 if( isHorizDC_C(src, stride, c) ){
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
322 if( isHorizMinMaxOk_C(src, stride, c->QP) )
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
323 return 1;
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
324 else
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
325 return 0;
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
326 }else{
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
327 return 2;
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
328 }
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
329 }
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
330
1327
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
331 static inline int vertClassify_C(uint8_t src[], int stride, PPContext *c){
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
332 if( isVertDC_C(src, stride, c) ){
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
333 if( isVertMinMaxOk_C(src, stride, c->QP) )
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
334 return 1;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
335 else
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
336 return 0;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
337 }else{
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
338 return 2;
854571532c89 blinking blocks around thin vertical lines and dots bugfix
michaelni
parents: 1282
diff changeset
339 }
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
340 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
341
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
342 static inline void doHorizDefFilter_C(uint8_t dst[], int stride, PPContext *c)
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
343 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
344 int y;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
345 for(y=0; y<BLOCK_SIZE; y++)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
346 {
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
347 const int middleEnergy= 5*(dst[4] - dst[3]) + 2*(dst[2] - dst[5]);
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
348
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
349 if(ABS(middleEnergy) < 8*c->QP)
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
350 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
351 const int q=(dst[3] - dst[4])/2;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
352 const int leftEnergy= 5*(dst[2] - dst[1]) + 2*(dst[0] - dst[3]);
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
353 const int rightEnergy= 5*(dst[6] - dst[5]) + 2*(dst[4] - dst[7]);
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
354
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
355 int d= ABS(middleEnergy) - MIN( ABS(leftEnergy), ABS(rightEnergy) );
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
356 d= MAX(d, 0);
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
357
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
358 d= (5*d + 32) >> 6;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
359 d*= SIGN(-middleEnergy);
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
360
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
361 if(q>0)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
362 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
363 d= d<0 ? 0 : d;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
364 d= d>q ? q : d;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
365 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
366 else
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
367 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
368 d= d>0 ? 0 : d;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
369 d= d<q ? q : d;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
370 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
371
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
372 dst[3]-= d;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
373 dst[4]+= d;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
374 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
375 dst+= stride;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
376 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
377 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
378
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
379 /**
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
380 * Do a horizontal low pass filter on the 10x8 block (dst points to middle 8x8 Block)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
381 * using the 9-Tap Filter (1,1,2,2,4,2,2,1,1)/16 (C version)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
382 */
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
383 static inline void doHorizLowPass_C(uint8_t dst[], int stride, PPContext *c)
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
384 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
385 int y;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
386 for(y=0; y<BLOCK_SIZE; y++)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
387 {
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
388 const int first= ABS(dst[-1] - dst[0]) < c->QP ? dst[-1] : dst[0];
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
389 const int last= ABS(dst[8] - dst[7]) < c->QP ? dst[8] : dst[7];
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
390
2038
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
391 int sums[10];
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
392 sums[0] = 4*first + dst[0] + dst[1] + dst[2] + 4;
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
393 sums[1] = sums[0] - first + dst[3];
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
394 sums[2] = sums[1] - first + dst[4];
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
395 sums[3] = sums[2] - first + dst[5];
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
396 sums[4] = sums[3] - first + dst[6];
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
397 sums[5] = sums[4] - dst[0] + dst[7];
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
398 sums[6] = sums[5] - dst[1] + last;
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
399 sums[7] = sums[6] - dst[2] + last;
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
400 sums[8] = sums[7] - dst[3] + last;
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
401 sums[9] = sums[8] - dst[4] + last;
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
402
2038
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
403 dst[0]= (sums[0] + sums[2] + 2*dst[0])>>4;
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
404 dst[1]= (sums[1] + sums[3] + 2*dst[1])>>4;
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
405 dst[2]= (sums[2] + sums[4] + 2*dst[2])>>4;
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
406 dst[3]= (sums[3] + sums[5] + 2*dst[3])>>4;
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
407 dst[4]= (sums[4] + sums[6] + 2*dst[4])>>4;
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
408 dst[5]= (sums[5] + sums[7] + 2*dst[5])>>4;
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
409 dst[6]= (sums[6] + sums[8] + 2*dst[6])>>4;
02b59a3c62cd faster c lowpass filter
michael
parents: 2037
diff changeset
410 dst[7]= (sums[7] + sums[9] + 2*dst[7])>>4;
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
411
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
412 dst+= stride;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
413 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
414 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
415
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
416 /**
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
417 * Experimental Filter 1 (Horizontal)
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
418 * will not damage linear gradients
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
419 * Flat blocks should look like they where passed through the (1,1,2,2,4,2,2,1,1) 9-Tap filter
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
420 * can only smooth blocks at the expected locations (it cant smooth them if they did move)
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
421 * MMX2 version does correct clipping C version doesnt
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
422 * not identical with the vertical one
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
423 */
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
424 static inline void horizX1Filter(uint8_t *src, int stride, int QP)
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
425 {
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
426 int y;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
427 static uint64_t *lut= NULL;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
428 if(lut==NULL)
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
429 {
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
430 int i;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
431 lut= (uint64_t*)memalign(8, 256*8);
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
432 for(i=0; i<256; i++)
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
433 {
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
434 int v= i < 128 ? 2*i : 2*(i-256);
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
435 /*
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
436 //Simulate 112242211 9-Tap filter
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
437 uint64_t a= (v/16) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
438 uint64_t b= (v/8) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
439 uint64_t c= (v/4) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
440 uint64_t d= (3*v/8) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
441 */
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
442 //Simulate piecewise linear interpolation
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
443 uint64_t a= (v/16) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
444 uint64_t b= (v*3/16) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
445 uint64_t c= (v*5/16) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
446 uint64_t d= (7*v/16) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
447 uint64_t A= (0x100 - a)&0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
448 uint64_t B= (0x100 - b)&0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
449 uint64_t C= (0x100 - c)&0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
450 uint64_t D= (0x100 - c)&0xFF;
130
0cce5d30d1d8 dering in mmx2
michael
parents: 129
diff changeset
451
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
452 lut[i] = (a<<56) | (b<<48) | (c<<40) | (d<<32) |
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
453 (D<<24) | (C<<16) | (B<<8) | (A);
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
454 //lut[i] = (v<<32) | (v<<24);
134
2c469e390117 dering in c
michael
parents: 133
diff changeset
455 }
2c469e390117 dering in c
michael
parents: 133
diff changeset
456 }
2c469e390117 dering in c
michael
parents: 133
diff changeset
457
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
458 for(y=0; y<BLOCK_SIZE; y++)
134
2c469e390117 dering in c
michael
parents: 133
diff changeset
459 {
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
460 int a= src[1] - src[2];
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
461 int b= src[3] - src[4];
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
462 int c= src[5] - src[6];
134
2c469e390117 dering in c
michael
parents: 133
diff changeset
463
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
464 int d= MAX(ABS(b) - (ABS(a) + ABS(c))/2, 0);
167
2d97f0157a79 faster dering
michael
parents: 166
diff changeset
465
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
466 if(d < QP)
167
2d97f0157a79 faster dering
michael
parents: 166
diff changeset
467 {
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
468 int v = d * SIGN(-b);
106
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
469
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
470 src[1] +=v/8;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
471 src[2] +=v/4;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
472 src[3] +=3*v/8;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
473 src[4] -=3*v/8;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
474 src[5] -=v/4;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
475 src[6] -=v/8;
106
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
476
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
477 }
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
478 src+=stride;
106
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
479 }
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
480 }
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
481
2037
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
482 /**
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
483 * accurate deblock filter
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
484 */
2039
f25e485a7850 mmx optimized version of the per line/accurate deblock filter
michael
parents: 2038
diff changeset
485 static always_inline void do_a_deblock_C(uint8_t *src, int step, int stride, PPContext *c){
2037
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
486 int y;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
487 const int QP= c->QP;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
488 const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
489 const int dcThreshold= dcOffset*2 + 1;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
490 //START_TIMER
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
491 src+= step*4; // src points to begin of the 8x8 Block
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
492 for(y=0; y<8; y++){
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
493 int numEq= 0;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
494
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
495 if(((unsigned)(src[-1*step] - src[0*step] + dcOffset)) < dcThreshold) numEq++;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
496 if(((unsigned)(src[ 0*step] - src[1*step] + dcOffset)) < dcThreshold) numEq++;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
497 if(((unsigned)(src[ 1*step] - src[2*step] + dcOffset)) < dcThreshold) numEq++;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
498 if(((unsigned)(src[ 2*step] - src[3*step] + dcOffset)) < dcThreshold) numEq++;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
499 if(((unsigned)(src[ 3*step] - src[4*step] + dcOffset)) < dcThreshold) numEq++;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
500 if(((unsigned)(src[ 4*step] - src[5*step] + dcOffset)) < dcThreshold) numEq++;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
501 if(((unsigned)(src[ 5*step] - src[6*step] + dcOffset)) < dcThreshold) numEq++;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
502 if(((unsigned)(src[ 6*step] - src[7*step] + dcOffset)) < dcThreshold) numEq++;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
503 if(((unsigned)(src[ 7*step] - src[8*step] + dcOffset)) < dcThreshold) numEq++;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
504 if(numEq > c->ppMode.flatnessThreshold){
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
505 int min, max, x;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
506
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
507 if(src[0] > src[step]){
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
508 max= src[0];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
509 min= src[step];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
510 }else{
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
511 max= src[step];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
512 min= src[0];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
513 }
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
514 for(x=2; x<8; x+=2){
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
515 if(src[x*step] > src[(x+1)*step]){
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
516 if(src[x *step] > max) max= src[ x *step];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
517 if(src[(x+1)*step] < min) min= src[(x+1)*step];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
518 }else{
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
519 if(src[(x+1)*step] > max) max= src[(x+1)*step];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
520 if(src[ x *step] < min) min= src[ x *step];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
521 }
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
522 }
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
523 if(max-min < 2*QP){
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
524 const int first= ABS(src[-1*step] - src[0]) < QP ? src[-1*step] : src[0];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
525 const int last= ABS(src[8*step] - src[7*step]) < QP ? src[8*step] : src[7*step];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
526
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
527 int sums[10];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
528 sums[0] = 4*first + src[0*step] + src[1*step] + src[2*step] + 4;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
529 sums[1] = sums[0] - first + src[3*step];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
530 sums[2] = sums[1] - first + src[4*step];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
531 sums[3] = sums[2] - first + src[5*step];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
532 sums[4] = sums[3] - first + src[6*step];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
533 sums[5] = sums[4] - src[0*step] + src[7*step];
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
534 sums[6] = sums[5] - src[1*step] + last;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
535 sums[7] = sums[6] - src[2*step] + last;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
536 sums[8] = sums[7] - src[3*step] + last;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
537 sums[9] = sums[8] - src[4*step] + last;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
538
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
539 src[0*step]= (sums[0] + sums[2] + 2*src[0*step])>>4;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
540 src[1*step]= (sums[1] + sums[3] + 2*src[1*step])>>4;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
541 src[2*step]= (sums[2] + sums[4] + 2*src[2*step])>>4;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
542 src[3*step]= (sums[3] + sums[5] + 2*src[3*step])>>4;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
543 src[4*step]= (sums[4] + sums[6] + 2*src[4*step])>>4;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
544 src[5*step]= (sums[5] + sums[7] + 2*src[5*step])>>4;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
545 src[6*step]= (sums[6] + sums[8] + 2*src[6*step])>>4;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
546 src[7*step]= (sums[7] + sums[9] + 2*src[7*step])>>4;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
547 }
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
548 }else{
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
549 const int middleEnergy= 5*(src[4*step] - src[3*step]) + 2*(src[2*step] - src[5*step]);
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
550
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
551 if(ABS(middleEnergy) < 8*QP)
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
552 {
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
553 const int q=(src[3*step] - src[4*step])/2;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
554 const int leftEnergy= 5*(src[2*step] - src[1*step]) + 2*(src[0*step] - src[3*step]);
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
555 const int rightEnergy= 5*(src[6*step] - src[5*step]) + 2*(src[4*step] - src[7*step]);
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
556
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
557 int d= ABS(middleEnergy) - MIN( ABS(leftEnergy), ABS(rightEnergy) );
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
558 d= MAX(d, 0);
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
559
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
560 d= (5*d + 32) >> 6;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
561 d*= SIGN(-middleEnergy);
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
562
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
563 if(q>0)
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
564 {
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
565 d= d<0 ? 0 : d;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
566 d= d>q ? q : d;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
567 }
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
568 else
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
569 {
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
570 d= d>0 ? 0 : d;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
571 d= d<q ? q : d;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
572 }
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
573
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
574 src[3*step]-= d;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
575 src[4*step]+= d;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
576 }
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
577 }
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
578
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
579 src += stride;
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
580 }
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
581 /*if(step==16){
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
582 STOP_TIMER("step16")
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
583 }else{
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
584 STOP_TIMER("stepX")
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
585 }*/
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
586 }
106
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
587
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
588 //Note: we have C, MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
589 //Plain C versions
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
590 #if !defined (HAVE_MMX) || defined (RUNTIME_CPUDETECT)
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
591 #define COMPILE_C
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
592 #endif
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
593
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
594 #ifdef ARCH_POWERPC
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
595 #ifdef HAVE_ALTIVEC
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
596 #define COMPILE_ALTIVEC
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
597 #endif //HAVE_ALTIVEC
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
598 #endif //ARCH_POWERPC
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
599
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: 2188
diff changeset
600 #if defined(ARCH_X86) || defined(ARCH_X86_64)
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
601
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
602 #if (defined (HAVE_MMX) && !defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
603 #define COMPILE_MMX
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
604 #endif
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
605
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
606 #if defined (HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
607 #define COMPILE_MMX2
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
608 #endif
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
609
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
610 #if (defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
611 #define COMPILE_3DNOW
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
612 #endif
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
613 #endif //ARCH_X86
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
614
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
615 #undef HAVE_MMX
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
616 #undef HAVE_MMX2
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
617 #undef HAVE_3DNOW
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
618 #undef HAVE_ALTIVEC
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
619
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
620 #ifdef COMPILE_C
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
621 #undef HAVE_MMX
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
622 #undef HAVE_MMX2
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
623 #undef HAVE_3DNOW
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
624 #define RENAME(a) a ## _C
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
625 #include "postprocess_template.c"
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
626 #endif
106
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
627
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
628 #ifdef ARCH_POWERPC
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
629 #ifdef COMPILE_ALTIVEC
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
630 #undef RENAME
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
631 #define HAVE_ALTIVEC
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
632 #define RENAME(a) a ## _altivec
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
633 #include "postprocess_altivec_template.c"
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
634 #include "postprocess_template.c"
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
635 #endif
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
636 #endif //ARCH_POWERPC
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
637
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
638 //MMX versions
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
639 #ifdef COMPILE_MMX
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
640 #undef RENAME
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
641 #define HAVE_MMX
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
642 #undef HAVE_MMX2
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
643 #undef HAVE_3DNOW
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
644 #define RENAME(a) a ## _MMX
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
645 #include "postprocess_template.c"
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
646 #endif
128
e5266b8e79be much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 126
diff changeset
647
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
648 //MMX2 versions
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
649 #ifdef COMPILE_MMX2
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
650 #undef RENAME
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
651 #define HAVE_MMX
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
652 #define HAVE_MMX2
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
653 #undef HAVE_3DNOW
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
654 #define RENAME(a) a ## _MMX2
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
655 #include "postprocess_template.c"
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
656 #endif
128
e5266b8e79be much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 126
diff changeset
657
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
658 //3DNOW versions
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
659 #ifdef COMPILE_3DNOW
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
660 #undef RENAME
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
661 #define HAVE_MMX
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
662 #undef HAVE_MMX2
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
663 #define HAVE_3DNOW
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
664 #define RENAME(a) a ## _3DNow
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
665 #include "postprocess_template.c"
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
666 #endif
128
e5266b8e79be much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 126
diff changeset
667
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
668 // minor note: the HAVE_xyz is messed up after that line so dont use it
128
e5266b8e79be much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 126
diff changeset
669
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
670 static inline void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height,
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
671 QP_STORE_T QPs[], int QPStride, int isColor, pp_mode_t *vm, pp_context_t *vc)
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
672 {
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
673 PPContext *c= (PPContext *)vc;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
674 PPMode *ppMode= (PPMode *)vm;
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
675 c->ppMode= *ppMode; //FIXME
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
676
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
677 // useing ifs here as they are faster than function pointers allthough the
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
678 // difference wouldnt be messureable here but its much better because
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
679 // someone might exchange the cpu whithout restarting mplayer ;)
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
680 #ifdef RUNTIME_CPUDETECT
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: 2188
diff changeset
681 #if defined(ARCH_X86) || defined(ARCH_X86_64)
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
682 // ordered per speed fasterst first
805
de7636688003 per context cpuCaps (idea by kabi)
michael
parents: 804
diff changeset
683 if(c->cpuCaps & PP_CPU_CAPS_MMX2)
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
684 postProcess_MMX2(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
805
de7636688003 per context cpuCaps (idea by kabi)
michael
parents: 804
diff changeset
685 else if(c->cpuCaps & PP_CPU_CAPS_3DNOW)
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
686 postProcess_3DNow(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
805
de7636688003 per context cpuCaps (idea by kabi)
michael
parents: 804
diff changeset
687 else if(c->cpuCaps & PP_CPU_CAPS_MMX)
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
688 postProcess_MMX(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
689 else
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
690 postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
157
bc12fd7e6153 temp denoiser changes: (a-b)^2 instead of |a-b| and MMX2/3DNOW version
michael
parents: 156
diff changeset
691 #else
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
692 #ifdef ARCH_POWERPC
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
693 #ifdef HAVE_ALTIVEC
2188
226d0a39347d typo fix by (Marcin 'Morgoth' Kurek <morgoth6 at box43 dot pl>)
michael
parents: 2055
diff changeset
694 if(c->cpuCaps & PP_CPU_CAPS_ALTIVEC)
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
695 postProcess_altivec(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
696 else
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
697 #endif
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
698 #endif
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
699 postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
157
bc12fd7e6153 temp denoiser changes: (a-b)^2 instead of |a-b| and MMX2/3DNOW version
michael
parents: 156
diff changeset
700 #endif
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
701 #else //RUNTIME_CPUDETECT
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
702 #ifdef HAVE_MMX2
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
703 postProcess_MMX2(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
704 #elif defined (HAVE_3DNOW)
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
705 postProcess_3DNow(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
706 #elif defined (HAVE_MMX)
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
707 postProcess_MMX(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
2036
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
708 #elif defined (HAVE_ALTIVEC)
6a6c678517b3 altivec optimizations and horizontal filter fix by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents: 2031
diff changeset
709 postProcess_altivec(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
710 #else
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
711 postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
712 #endif
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
713 #endif //!RUNTIME_CPUDETECT
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
714 }
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
715
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
716 //static void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height,
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
717 // QP_STORE_T QPs[], int QPStride, int isColor, struct PPMode *ppMode);
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
718
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
719 /* -pp Command line Help
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
720 */
804
f3a1bc99d4a0 change qscale type to int8 and fix qscale ordering
michael
parents: 799
diff changeset
721 char *pp_help=
2407
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
722 "Available postprocessing filters:\n"
184
69d105cc6158 -npp help
michael
parents: 183
diff changeset
723 "Filters Options\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
724 "short long name short long option Description\n"
1467
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
725 "* * a autoq CPU power dependent enabler\n"
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
726 " c chrom chrominance filtering enabled\n"
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
727 " y nochrom chrominance filtering disabled\n"
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
728 "hb hdeblock (2 threshold) horizontal deblocking filter\n"
1197
d9cbc8ef5a33 better? default thresholds, if this is worse for any files, then tell us ASAP
michaelni
parents: 1196
diff changeset
729 " 1. difference factor: default=32, higher -> more deblocking\n"
d9cbc8ef5a33 better? default thresholds, if this is worse for any files, then tell us ASAP
michaelni
parents: 1196
diff changeset
730 " 2. flatness threshold: default=39, lower -> more deblocking\n"
184
69d105cc6158 -npp help
michael
parents: 183
diff changeset
731 " the h & v deblocking filters share these\n"
1467
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
732 " so you can't set different thresholds for h / v\n"
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
733 "vb vdeblock (2 threshold) vertical deblocking filter\n"
2037
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
734 "ha hadeblock (2 threshold) horizontal deblocking filter\n"
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
735 "va vadeblock (2 threshold) vertical deblocking filter\n"
1467
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
736 "h1 x1hdeblock experimental h deblock filter 1\n"
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
737 "v1 x1vdeblock experimental v deblock filter 1\n"
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
738 "dr dering deringing filter\n"
184
69d105cc6158 -npp help
michael
parents: 183
diff changeset
739 "al autolevels automatic brightness / contrast\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
740 " f fullyrange stretch luminance to (0..255)\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
741 "lb linblenddeint linear blend deinterlacer\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
742 "li linipoldeint linear interpolating deinterlace\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
743 "ci cubicipoldeint cubic interpolating deinterlacer\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
744 "md mediandeint median deinterlacer\n"
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
745 "fd ffmpegdeint ffmpeg deinterlacer\n"
2430
805cbcf4dc8a Mention the l5 pp filter in 'mplayer -pphelp' output.
diego
parents: 2407
diff changeset
746 "l5 lowpass5 FIR lowpass deinterlacer\n"
2037
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
747 "de default hb:a,vb:a,dr:a\n"
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
748 "fa fast h1:a,v1:a,dr:a\n"
1467
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
749 "tn tmpnoise (3 threshold) temporal noise reducer\n"
184
69d105cc6158 -npp help
michael
parents: 183
diff changeset
750 " 1. <= 2. <= 3. larger -> stronger filtering\n"
1467
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
751 "fq forceQuant <quantizer> force quantizer\n"
2407
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
752 "Usage:\n"
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
753 "<filterName>[:<option>[:<option>...]][[,|/][-]<filterName>[:<option>...]]...\n"
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
754 "long form example:\n"
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
755 "vdeblock:autoq/hdeblock:autoq/linblenddeint default,-vdeblock\n"
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
756 "short form example:\n"
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
757 "vb:a/hb:a/lb de,-vb\n"
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
758 "more examples:\n"
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
759 "tn:64:128:256\n"
184
69d105cc6158 -npp help
michael
parents: 183
diff changeset
760 ;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
761
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
762 pp_mode_t *pp_get_mode_by_name_and_quality(char *name, int quality)
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
763 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
764 char temp[GET_MODE_BUFFER_SIZE];
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
765 char *p= temp;
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
766 char *filterDelimiters= ",/";
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
767 char *optionDelimiters= ":";
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
768 struct PPMode *ppMode;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
769 char *filterToken;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
770
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
771 ppMode= memalign(8, sizeof(PPMode));
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
772
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
773 ppMode->lumMode= 0;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
774 ppMode->chromMode= 0;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
775 ppMode->maxTmpNoise[0]= 700;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
776 ppMode->maxTmpNoise[1]= 1500;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
777 ppMode->maxTmpNoise[2]= 3000;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
778 ppMode->maxAllowedY= 234;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
779 ppMode->minAllowedY= 16;
1197
d9cbc8ef5a33 better? default thresholds, if this is worse for any files, then tell us ASAP
michaelni
parents: 1196
diff changeset
780 ppMode->baseDcDiff= 256/8;
d9cbc8ef5a33 better? default thresholds, if this is worse for any files, then tell us ASAP
michaelni
parents: 1196
diff changeset
781 ppMode->flatnessThreshold= 56-16-1;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
782 ppMode->maxClippedThreshold= 0.01;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
783 ppMode->error=0;
793
8e9faf69110f cleanup
michael
parents: 792
diff changeset
784
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
785 strncpy(temp, name, GET_MODE_BUFFER_SIZE);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
786
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
787 if(verbose>1) printf("pp: %s\n", name);
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
788
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
789 for(;;){
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
790 char *filterName;
830
0a1fbae9f6e1 cleanup
michael
parents: 829
diff changeset
791 int q= 1000000; //PP_QUALITY_MAX;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
792 int chrom=-1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
793 char *option;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
794 char *options[OPTIONS_ARRAY_SIZE];
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
795 int i;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
796 int filterNameOk=0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
797 int numOfUnknownOptions=0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
798 int enable=1; //does the user want us to enabled or disabled the filter
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
799
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
800 filterToken= strtok(p, filterDelimiters);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
801 if(filterToken == NULL) break;
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
802 p+= strlen(filterToken) + 1; // p points to next filterToken
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
803 filterName= strtok(filterToken, optionDelimiters);
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
804 if(verbose>1) printf("pp: %s::%s\n", filterToken, filterName);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
805
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
806 if(*filterName == '-')
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
807 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
808 enable=0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
809 filterName++;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
810 }
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
811
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
812 for(;;){ //for all options
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
813 option= strtok(NULL, optionDelimiters);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
814 if(option == NULL) break;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
815
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
816 if(verbose>1) printf("pp: option: %s\n", option);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
817 if(!strcmp("autoq", option) || !strcmp("a", option)) q= quality;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
818 else if(!strcmp("nochrom", option) || !strcmp("y", option)) chrom=0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
819 else if(!strcmp("chrom", option) || !strcmp("c", option)) chrom=1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
820 else
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
821 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
822 options[numOfUnknownOptions] = option;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
823 numOfUnknownOptions++;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
824 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
825 if(numOfUnknownOptions >= OPTIONS_ARRAY_SIZE-1) break;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
826 }
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
827 options[numOfUnknownOptions] = NULL;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
828
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
829 /* replace stuff from the replace Table */
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
830 for(i=0; replaceTable[2*i]!=NULL; i++)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
831 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
832 if(!strcmp(replaceTable[2*i], filterName))
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
833 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
834 int newlen= strlen(replaceTable[2*i + 1]);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
835 int plen;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
836 int spaceLeft;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
837
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
838 if(p==NULL) p= temp, *p=0; //last filter
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
839 else p--, *p=','; //not last filter
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
840
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
841 plen= strlen(p);
419
b71190bacce8 applied 64bit patch from Ulrich Hecht <uli at suse dot de>
alex
parents: 212
diff changeset
842 spaceLeft= p - temp + plen;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
843 if(spaceLeft + newlen >= GET_MODE_BUFFER_SIZE)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
844 {
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
845 ppMode->error++;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
846 break;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
847 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
848 memmove(p + newlen, p, plen+1);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
849 memcpy(p, replaceTable[2*i + 1], newlen);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
850 filterNameOk=1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
851 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
852 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
853
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
854 for(i=0; filters[i].shortName!=NULL; i++)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
855 {
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
856 // printf("Compareing %s, %s, %s\n", filters[i].shortName,filters[i].longName, filterName);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
857 if( !strcmp(filters[i].longName, filterName)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
858 || !strcmp(filters[i].shortName, filterName))
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
859 {
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
860 ppMode->lumMode &= ~filters[i].mask;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
861 ppMode->chromMode &= ~filters[i].mask;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
862
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
863 filterNameOk=1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
864 if(!enable) break; // user wants to disable it
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
865
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
866 if(q >= filters[i].minLumQuality)
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
867 ppMode->lumMode|= filters[i].mask;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
868 if(chrom==1 || (chrom==-1 && filters[i].chromDefault))
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
869 if(q >= filters[i].minChromQuality)
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
870 ppMode->chromMode|= filters[i].mask;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
871
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
872 if(filters[i].mask == LEVEL_FIX)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
873 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
874 int o;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
875 ppMode->minAllowedY= 16;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
876 ppMode->maxAllowedY= 234;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
877 for(o=0; options[o]!=NULL; o++)
182
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
878 {
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
879 if( !strcmp(options[o],"fullyrange")
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
880 ||!strcmp(options[o],"f"))
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
881 {
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
882 ppMode->minAllowedY= 0;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
883 ppMode->maxAllowedY= 255;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
884 numOfUnknownOptions--;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
885 }
182
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
886 }
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
887 }
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
888 else if(filters[i].mask == TEMP_NOISE_FILTER)
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
889 {
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
890 int o;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
891 int numOfNoises=0;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
892
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
893 for(o=0; options[o]!=NULL; o++)
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
894 {
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
895 char *tail;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
896 ppMode->maxTmpNoise[numOfNoises]=
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
897 strtol(options[o], &tail, 0);
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
898 if(tail!=options[o])
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
899 {
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
900 numOfNoises++;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
901 numOfUnknownOptions--;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
902 if(numOfNoises >= 3) break;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
903 }
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
904 }
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
905 }
2037
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
906 else if(filters[i].mask == V_DEBLOCK || filters[i].mask == H_DEBLOCK
98d8283534bb accurate/slow (per line instead of per block) deblock filter spport which is identical to what is recommanded in the mpeg4 spec
michael
parents: 2036
diff changeset
907 || filters[i].mask == V_A_DEBLOCK || filters[i].mask == H_A_DEBLOCK)
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
908 {
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
909 int o;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
910
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
911 for(o=0; options[o]!=NULL && o<2; o++)
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
912 {
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
913 char *tail;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
914 int val= strtol(options[o], &tail, 0);
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
915 if(tail==options[o]) break;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
916
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
917 numOfUnknownOptions--;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
918 if(o==0) ppMode->baseDcDiff= val;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
919 else ppMode->flatnessThreshold= val;
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
920 }
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
921 }
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
922 else if(filters[i].mask == FORCE_QUANT)
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
923 {
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
924 int o;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
925 ppMode->forcedQuant= 15;
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
926
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
927 for(o=0; options[o]!=NULL && o<1; o++)
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
928 {
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
929 char *tail;
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
930 int val= strtol(options[o], &tail, 0);
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
931 if(tail==options[o]) break;
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
932
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
933 numOfUnknownOptions--;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
934 ppMode->forcedQuant= val;
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
935 }
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
936 }
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
937 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
938 }
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
939 if(!filterNameOk) ppMode->error++;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
940 ppMode->error += numOfUnknownOptions;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
941 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
942
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
943 if(verbose>1) printf("pp: lumMode=%X, chromMode=%X\n", ppMode->lumMode, ppMode->chromMode);
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
944 if(ppMode->error)
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
945 {
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
946 fprintf(stderr, "%d errors in postprocess string \"%s\"\n", ppMode->error, name);
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
947 free(ppMode);
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
948 return NULL;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
949 }
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
950 return ppMode;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
951 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
952
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
953 void pp_free_mode(pp_mode_t *mode){
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
954 if(mode) free(mode);
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
955 }
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
956
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
957 static void reallocAlign(void **p, int alignment, int size){
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
958 if(*p) free(*p);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
959 *p= memalign(alignment, size);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
960 memset(*p, 0, size);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
961 }
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
962
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
963 static void reallocBuffers(PPContext *c, int width, int height, int stride, int qpStride){
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
964 int mbWidth = (width+15)>>4;
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
965 int mbHeight= (height+15)>>4;
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
966 int i;
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
967
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
968 c->stride= stride;
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
969 c->qpStride= qpStride;
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
970
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
971 reallocAlign((void **)&c->tempDst, 8, stride*24);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
972 reallocAlign((void **)&c->tempSrc, 8, stride*24);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
973 reallocAlign((void **)&c->tempBlocks, 8, 2*16*8);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
974 reallocAlign((void **)&c->yHistogram, 8, 256*sizeof(uint64_t));
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
975 for(i=0; i<256; i++)
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
976 c->yHistogram[i]= width*height/64*15/256;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
977
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
978 for(i=0; i<3; i++)
185
8fceccef5804 fixed -npp help ... i think i need more sleep ;)
michael
parents: 184
diff changeset
979 {
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
980 //Note:the +17*1024 is just there so i dont have to worry about r/w over te end
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
981 reallocAlign((void **)&c->tempBlured[i], 8, stride*mbHeight*16 + 17*1024);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
982 reallocAlign((void **)&c->tempBluredPast[i], 8, 256*((height+7)&(~7))/2 + 17*1024);//FIXME size
185
8fceccef5804 fixed -npp help ... i think i need more sleep ;)
michael
parents: 184
diff changeset
983 }
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
984
1157
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
985 reallocAlign((void **)&c->deintTemp, 8, 2*width+32);
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
986 reallocAlign((void **)&c->nonBQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
987 reallocAlign((void **)&c->stdQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
988 reallocAlign((void **)&c->forcedQPTable, 8, mbWidth*sizeof(QP_STORE_T));
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
989 }
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
990
1282
8988af3ae1e8 Warning and compatibility fixes.
mellum
parents: 1223
diff changeset
991 static void global_init(void){
1157
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
992 int i;
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
993 memset(clip_table, 0, 256);
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
994 for(i=256; i<512; i++)
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
995 clip_table[i]= i;
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
996 memset(clip_table+512, 0, 256);
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
997 }
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
998
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
999 pp_context_t *pp_get_context(int width, int height, int cpuCaps){
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1000 PPContext *c= memalign(32, sizeof(PPContext));
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1001 int stride= (width+15)&(~15); //assumed / will realloc if needed
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1002 int qpStride= (width+15)/16 + 2; //assumed / will realloc if needed
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1003
1157
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
1004 global_init();
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
1005
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1006 memset(c, 0, sizeof(PPContext));
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1007 c->cpuCaps= cpuCaps;
957
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1008 if(cpuCaps&PP_FORMAT){
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1009 c->hChromaSubSample= cpuCaps&0x3;
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1010 c->vChromaSubSample= (cpuCaps>>4)&0x3;
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1011 }else{
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1012 c->hChromaSubSample= 1;
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1013 c->vChromaSubSample= 1;
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1014 }
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1015
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1016 reallocBuffers(c, width, height, stride, qpStride);
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1017
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1018 c->frameNum=-1;
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
1019
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1020 return c;
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
1021 }
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
1022
792
2d1283d511b7 cosmetics ;)
michael
parents: 791
diff changeset
1023 void pp_free_context(void *vc){
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1024 PPContext *c = (PPContext*)vc;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1025 int i;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1026
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1027 for(i=0; i<3; i++) free(c->tempBlured[i]);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1028 for(i=0; i<3; i++) free(c->tempBluredPast[i]);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1029
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1030 free(c->tempBlocks);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1031 free(c->yHistogram);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1032 free(c->tempDst);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1033 free(c->tempSrc);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1034 free(c->deintTemp);
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1035 free(c->stdQPTable);
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1036 free(c->nonBQPTable);
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1037 free(c->forcedQPTable);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1038
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1039 memset(c, 0, sizeof(PPContext));
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1040
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1041 free(c);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1042 }
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1043
792
2d1283d511b7 cosmetics ;)
michael
parents: 791
diff changeset
1044 void pp_postprocess(uint8_t * src[3], int srcStride[3],
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1045 uint8_t * dst[3], int dstStride[3],
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1046 int width, int height,
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1047 QP_STORE_T *QP_store, int QPStride,
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
1048 pp_mode_t *vm, void *vc, int pict_type)
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
1049 {
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1050 int mbWidth = (width+15)>>4;
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1051 int mbHeight= (height+15)>>4;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
1052 PPMode *mode = (PPMode*)vm;
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1053 PPContext *c = (PPContext*)vc;
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1054 int minStride= MAX(srcStride[0], dstStride[0]);
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1055
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1056 if(c->stride < minStride || c->qpStride < QPStride)
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1057 reallocBuffers(c, width, height,
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1058 MAX(minStride, c->stride),
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1059 MAX(c->qpStride, QPStride));
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1060
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
1061 if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
152
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
1062 {
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
1063 int i;
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1064 QP_store= c->forcedQPTable;
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1065 QPStride= 0;
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
1066 if(mode->lumMode & FORCE_QUANT)
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1067 for(i=0; i<mbWidth; i++) QP_store[i]= mode->forcedQuant;
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
1068 else
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1069 for(i=0; i<mbWidth; i++) QP_store[i]= 1;
152
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
1070 }
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1071 //printf("pict_type:%d\n", pict_type);
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1072
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1073 if(pict_type & PP_PICT_TYPE_QP2){
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1074 int i;
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1075 const int count= mbHeight * QPStride;
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1076 for(i=0; i<(count>>2); i++){
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1077 ((uint32_t*)c->stdQPTable)[i] = (((uint32_t*)QP_store)[i]>>1) & 0x7F7F7F7F;
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1078 }
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1079 for(i<<=2; i<count; i++){
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1080 c->stdQPTable[i] = QP_store[i]>>1;
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1081 }
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1082 QP_store= c->stdQPTable;
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1083 }
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1084
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1085 if(0){
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1086 int x,y;
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1087 for(y=0; y<mbHeight; y++){
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1088 for(x=0; x<mbWidth; x++){
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1089 printf("%2d ", QP_store[x + y*QPStride]);
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1090 }
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1091 printf("\n");
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1092 }
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1093 printf("\n");
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1094 }
798
michael
parents: 793
diff changeset
1095
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1096 if((pict_type&7)!=3)
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1097 {
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1098 int i;
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1099 const int count= mbHeight * QPStride;
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1100 for(i=0; i<(count>>2); i++){
1724
ea5200a9f730 mpeg2 QP clamping fix
michael
parents: 1467
diff changeset
1101 ((uint32_t*)c->nonBQPTable)[i] = ((uint32_t*)QP_store)[i] & 0x3F3F3F3F;
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1102 }
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1103 for(i<<=2; i<count; i++){
1724
ea5200a9f730 mpeg2 QP clamping fix
michael
parents: 1467
diff changeset
1104 c->nonBQPTable[i] = QP_store[i] & 0x3F;
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1105 }
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1106 }
152
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
1107
793
8e9faf69110f cleanup
michael
parents: 792
diff changeset
1108 if(verbose>2)
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
1109 {
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
1110 printf("using npp filters 0x%X/0x%X\n", mode->lumMode, mode->chromMode);
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
1111 }
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
1112
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1113 postProcess(src[0], srcStride[0], dst[0], dstStride[0],
1076
65908e4b81f8 reverse incorrect stride < (width+7)&~7 fix
michaelni
parents: 1075
diff changeset
1114 width, height, QP_store, QPStride, 0, mode, c);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
1115
957
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1116 width = (width )>>c->hChromaSubSample;
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1117 height = (height)>>c->vChromaSubSample;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
1118
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1119 if(mode->chromMode)
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1120 {
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1121 postProcess(src[1], srcStride[1], dst[1], dstStride[1],
1076
65908e4b81f8 reverse incorrect stride < (width+7)&~7 fix
michaelni
parents: 1075
diff changeset
1122 width, height, QP_store, QPStride, 1, mode, c);
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1123 postProcess(src[2], srcStride[2], dst[2], dstStride[2],
1076
65908e4b81f8 reverse incorrect stride < (width+7)&~7 fix
michaelni
parents: 1075
diff changeset
1124 width, height, QP_store, QPStride, 2, mode, c);
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1125 }
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1126 else if(srcStride[1] == dstStride[1] && srcStride[2] == dstStride[2])
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1127 {
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1128 memcpy(dst[1], src[1], srcStride[1]*height);
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1129 memcpy(dst[2], src[2], srcStride[2]*height);
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1130 }
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1131 else
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1132 {
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1133 int y;
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1134 for(y=0; y<height; y++)
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1135 {
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1136 memcpy(&(dst[1][y*dstStride[1]]), &(src[1][y*srcStride[1]]), width);
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1137 memcpy(&(dst[2][y*dstStride[2]]), &(src[2][y*srcStride[2]]), width);
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1138 }
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1139 }
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
1140 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
1141