annotate libpostproc/postprocess.c @ 2841:bceeca1bb30f libavcodec

vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net) with changes by me int->float as video uses float too remove silent cliping to some per codec range, this should result in an error instead remove change to utils.c as its inconsistant with video
author michael
date Sun, 21 Aug 2005 20:27:00 +0000
parents e99703305233
children ef2149182f1c
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"
2567
910cd8bd981f disable luma in postprocess filters patch by (Tuukka Toivonen |tuukkat ee.oulu fi)
michael
parents: 2527
diff changeset
728 " n noluma luma filtering disabled\n"
1467
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
729 "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
730 " 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
731 " 2. flatness threshold: default=39, lower -> more deblocking\n"
184
69d105cc6158 -npp help
michael
parents: 183
diff changeset
732 " the h & v deblocking filters share these\n"
1467
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
733 " 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
734 "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
735 "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
736 "va vadeblock (2 threshold) vertical deblocking filter\n"
1467
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
737 "h1 x1hdeblock experimental h deblock filter 1\n"
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
738 "v1 x1vdeblock experimental v deblock filter 1\n"
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
739 "dr dering deringing filter\n"
184
69d105cc6158 -npp help
michael
parents: 183
diff changeset
740 "al autolevels automatic brightness / contrast\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
741 " f fullyrange stretch luminance to (0..255)\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
742 "lb linblenddeint linear blend deinterlacer\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
743 "li linipoldeint linear interpolating deinterlace\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
744 "ci cubicipoldeint cubic interpolating deinterlacer\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
745 "md mediandeint median deinterlacer\n"
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
746 "fd ffmpegdeint ffmpeg deinterlacer\n"
2430
805cbcf4dc8a Mention the l5 pp filter in 'mplayer -pphelp' output.
diego
parents: 2407
diff changeset
747 "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
748 "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
749 "fa fast h1:a,v1:a,dr:a\n"
2667
e99703305233 Add missing pp=ac to pp_help.
diego
parents: 2567
diff changeset
750 "ac ha:a:128:7,va:a,dr:a\n"
1467
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
751 "tn tmpnoise (3 threshold) temporal noise reducer\n"
184
69d105cc6158 -npp help
michael
parents: 183
diff changeset
752 " 1. <= 2. <= 3. larger -> stronger filtering\n"
1467
a320fe172086 Ministry of English Composition fixes (courtesy of Diego Biurrun
tmmm
parents: 1327
diff changeset
753 "fq forceQuant <quantizer> force quantizer\n"
2407
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
754 "Usage:\n"
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
755 "<filterName>[:<option>[:<option>...]][[,|/][-]<filterName>[:<option>...]]...\n"
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
756 "long form example:\n"
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
757 "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
758 "short form example:\n"
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
759 "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
760 "more examples:\n"
cb521eadf9ae Make -pphelp output consistent with the other instances of -xxx help.
diego
parents: 2293
diff changeset
761 "tn:64:128:256\n"
184
69d105cc6158 -npp help
michael
parents: 183
diff changeset
762 ;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
763
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
764 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
765 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
766 char temp[GET_MODE_BUFFER_SIZE];
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
767 char *p= temp;
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
768 char *filterDelimiters= ",/";
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
769 char *optionDelimiters= ":";
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
770 struct PPMode *ppMode;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
771 char *filterToken;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
772
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
773 ppMode= memalign(8, sizeof(PPMode));
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
774
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
775 ppMode->lumMode= 0;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
776 ppMode->chromMode= 0;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
777 ppMode->maxTmpNoise[0]= 700;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
778 ppMode->maxTmpNoise[1]= 1500;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
779 ppMode->maxTmpNoise[2]= 3000;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
780 ppMode->maxAllowedY= 234;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
781 ppMode->minAllowedY= 16;
1197
d9cbc8ef5a33 better? default thresholds, if this is worse for any files, then tell us ASAP
michaelni
parents: 1196
diff changeset
782 ppMode->baseDcDiff= 256/8;
d9cbc8ef5a33 better? default thresholds, if this is worse for any files, then tell us ASAP
michaelni
parents: 1196
diff changeset
783 ppMode->flatnessThreshold= 56-16-1;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
784 ppMode->maxClippedThreshold= 0.01;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
785 ppMode->error=0;
793
8e9faf69110f cleanup
michael
parents: 792
diff changeset
786
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
787 strncpy(temp, name, GET_MODE_BUFFER_SIZE);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
788
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
789 if(verbose>1) printf("pp: %s\n", name);
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
790
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
791 for(;;){
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
792 char *filterName;
830
0a1fbae9f6e1 cleanup
michael
parents: 829
diff changeset
793 int q= 1000000; //PP_QUALITY_MAX;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
794 int chrom=-1;
2567
910cd8bd981f disable luma in postprocess filters patch by (Tuukka Toivonen |tuukkat ee.oulu fi)
michael
parents: 2527
diff changeset
795 int luma=-1;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
796 char *option;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
797 char *options[OPTIONS_ARRAY_SIZE];
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
798 int i;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
799 int filterNameOk=0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
800 int numOfUnknownOptions=0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
801 int enable=1; //does the user want us to enabled or disabled the filter
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
802
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
803 filterToken= strtok(p, filterDelimiters);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
804 if(filterToken == NULL) break;
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
805 p+= strlen(filterToken) + 1; // p points to next filterToken
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
806 filterName= strtok(filterToken, optionDelimiters);
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
807 if(verbose>1) printf("pp: %s::%s\n", filterToken, filterName);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
808
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
809 if(*filterName == '-')
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
810 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
811 enable=0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
812 filterName++;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
813 }
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
814
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
815 for(;;){ //for all options
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
816 option= strtok(NULL, optionDelimiters);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
817 if(option == NULL) break;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
818
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
819 if(verbose>1) printf("pp: option: %s\n", option);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
820 if(!strcmp("autoq", option) || !strcmp("a", option)) q= quality;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
821 else if(!strcmp("nochrom", option) || !strcmp("y", option)) chrom=0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
822 else if(!strcmp("chrom", option) || !strcmp("c", option)) chrom=1;
2567
910cd8bd981f disable luma in postprocess filters patch by (Tuukka Toivonen |tuukkat ee.oulu fi)
michael
parents: 2527
diff changeset
823 else if(!strcmp("noluma", option) || !strcmp("n", option)) luma=0;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
824 else
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
825 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
826 options[numOfUnknownOptions] = option;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
827 numOfUnknownOptions++;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
828 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
829 if(numOfUnknownOptions >= OPTIONS_ARRAY_SIZE-1) break;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
830 }
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
831 options[numOfUnknownOptions] = NULL;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
832
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
833 /* replace stuff from the replace Table */
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
834 for(i=0; replaceTable[2*i]!=NULL; i++)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
835 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
836 if(!strcmp(replaceTable[2*i], filterName))
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
837 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
838 int newlen= strlen(replaceTable[2*i + 1]);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
839 int plen;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
840 int spaceLeft;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
841
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
842 if(p==NULL) p= temp, *p=0; //last filter
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
843 else p--, *p=','; //not last filter
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
844
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
845 plen= strlen(p);
419
b71190bacce8 applied 64bit patch from Ulrich Hecht <uli at suse dot de>
alex
parents: 212
diff changeset
846 spaceLeft= p - temp + plen;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
847 if(spaceLeft + newlen >= GET_MODE_BUFFER_SIZE)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
848 {
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
849 ppMode->error++;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
850 break;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
851 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
852 memmove(p + newlen, p, plen+1);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
853 memcpy(p, replaceTable[2*i + 1], newlen);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
854 filterNameOk=1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
855 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
856 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
857
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
858 for(i=0; filters[i].shortName!=NULL; i++)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
859 {
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
860 // printf("Compareing %s, %s, %s\n", filters[i].shortName,filters[i].longName, filterName);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
861 if( !strcmp(filters[i].longName, filterName)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
862 || !strcmp(filters[i].shortName, filterName))
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
863 {
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
864 ppMode->lumMode &= ~filters[i].mask;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
865 ppMode->chromMode &= ~filters[i].mask;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
866
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
867 filterNameOk=1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
868 if(!enable) break; // user wants to disable it
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
869
2567
910cd8bd981f disable luma in postprocess filters patch by (Tuukka Toivonen |tuukkat ee.oulu fi)
michael
parents: 2527
diff changeset
870 if(q >= filters[i].minLumQuality && luma)
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
871 ppMode->lumMode|= filters[i].mask;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
872 if(chrom==1 || (chrom==-1 && filters[i].chromDefault))
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
873 if(q >= filters[i].minChromQuality)
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
874 ppMode->chromMode|= filters[i].mask;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
875
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
876 if(filters[i].mask == LEVEL_FIX)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
877 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
878 int o;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
879 ppMode->minAllowedY= 16;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
880 ppMode->maxAllowedY= 234;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
881 for(o=0; options[o]!=NULL; o++)
182
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
882 {
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
883 if( !strcmp(options[o],"fullyrange")
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
884 ||!strcmp(options[o],"f"))
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
885 {
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
886 ppMode->minAllowedY= 0;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
887 ppMode->maxAllowedY= 255;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
888 numOfUnknownOptions--;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
889 }
182
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
890 }
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
891 }
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
892 else if(filters[i].mask == TEMP_NOISE_FILTER)
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
893 {
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
894 int o;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
895 int numOfNoises=0;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
896
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
897 for(o=0; options[o]!=NULL; o++)
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
898 {
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
899 char *tail;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
900 ppMode->maxTmpNoise[numOfNoises]=
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
901 strtol(options[o], &tail, 0);
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
902 if(tail!=options[o])
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 numOfNoises++;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
905 numOfUnknownOptions--;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
906 if(numOfNoises >= 3) break;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
907 }
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
908 }
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
909 }
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
910 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
911 || filters[i].mask == V_A_DEBLOCK || filters[i].mask == H_A_DEBLOCK)
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
912 {
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
913 int o;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
914
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
915 for(o=0; options[o]!=NULL && o<2; o++)
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
916 {
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
917 char *tail;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
918 int val= strtol(options[o], &tail, 0);
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
919 if(tail==options[o]) break;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
920
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
921 numOfUnknownOptions--;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
922 if(o==0) ppMode->baseDcDiff= val;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
923 else ppMode->flatnessThreshold= val;
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
924 }
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
925 }
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
926 else if(filters[i].mask == FORCE_QUANT)
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
927 {
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
928 int o;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
929 ppMode->forcedQuant= 15;
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
930
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
931 for(o=0; options[o]!=NULL && o<1; o++)
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
932 {
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
933 char *tail;
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
934 int val= strtol(options[o], &tail, 0);
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
935 if(tail==options[o]) break;
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
936
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
937 numOfUnknownOptions--;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
938 ppMode->forcedQuant= val;
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
939 }
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
940 }
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(!filterNameOk) ppMode->error++;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
944 ppMode->error += numOfUnknownOptions;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
945 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
946
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
947 if(verbose>1) printf("pp: lumMode=%X, chromMode=%X\n", ppMode->lumMode, ppMode->chromMode);
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
948 if(ppMode->error)
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
949 {
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
950 fprintf(stderr, "%d errors in postprocess string \"%s\"\n", ppMode->error, name);
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
951 free(ppMode);
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
952 return NULL;
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
953 }
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
954 return ppMode;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
955 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
956
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
957 void pp_free_mode(pp_mode_t *mode){
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
958 if(mode) free(mode);
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
959 }
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
960
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
961 static void reallocAlign(void **p, int alignment, int size){
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
962 if(*p) free(*p);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
963 *p= memalign(alignment, size);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
964 memset(*p, 0, size);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
965 }
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
966
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
967 static void reallocBuffers(PPContext *c, int width, int height, int stride, int qpStride){
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
968 int mbWidth = (width+15)>>4;
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
969 int mbHeight= (height+15)>>4;
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
970 int i;
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
971
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
972 c->stride= stride;
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
973 c->qpStride= qpStride;
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
974
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
975 reallocAlign((void **)&c->tempDst, 8, stride*24);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
976 reallocAlign((void **)&c->tempSrc, 8, stride*24);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
977 reallocAlign((void **)&c->tempBlocks, 8, 2*16*8);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
978 reallocAlign((void **)&c->yHistogram, 8, 256*sizeof(uint64_t));
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
979 for(i=0; i<256; i++)
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
980 c->yHistogram[i]= width*height/64*15/256;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
981
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
982 for(i=0; i<3; i++)
185
8fceccef5804 fixed -npp help ... i think i need more sleep ;)
michael
parents: 184
diff changeset
983 {
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
984 //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
985 reallocAlign((void **)&c->tempBlured[i], 8, stride*mbHeight*16 + 17*1024);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
986 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
987 }
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
988
1157
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
989 reallocAlign((void **)&c->deintTemp, 8, 2*width+32);
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
990 reallocAlign((void **)&c->nonBQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
991 reallocAlign((void **)&c->stdQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
992 reallocAlign((void **)&c->forcedQPTable, 8, mbWidth*sizeof(QP_STORE_T));
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
993 }
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
994
1282
8988af3ae1e8 Warning and compatibility fixes.
mellum
parents: 1223
diff changeset
995 static void global_init(void){
1157
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
996 int i;
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
997 memset(clip_table, 0, 256);
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
998 for(i=256; i<512; i++)
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
999 clip_table[i]= i;
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
1000 memset(clip_table+512, 0, 256);
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
1001 }
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
1002
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1003 pp_context_t *pp_get_context(int width, int height, int cpuCaps){
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1004 PPContext *c= memalign(32, sizeof(PPContext));
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1005 int stride= (width+15)&(~15); //assumed / will realloc if needed
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1006 int qpStride= (width+15)/16 + 2; //assumed / will realloc if needed
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1007
1157
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
1008 global_init();
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
1009
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1010 memset(c, 0, sizeof(PPContext));
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1011 c->cpuCaps= cpuCaps;
957
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1012 if(cpuCaps&PP_FORMAT){
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1013 c->hChromaSubSample= cpuCaps&0x3;
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1014 c->vChromaSubSample= (cpuCaps>>4)&0x3;
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1015 }else{
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1016 c->hChromaSubSample= 1;
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1017 c->vChromaSubSample= 1;
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1018 }
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1019
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1020 reallocBuffers(c, width, height, stride, qpStride);
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1021
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1022 c->frameNum=-1;
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
1023
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1024 return c;
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
1025 }
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
1026
792
2d1283d511b7 cosmetics ;)
michael
parents: 791
diff changeset
1027 void pp_free_context(void *vc){
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1028 PPContext *c = (PPContext*)vc;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1029 int i;
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1030
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1031 for(i=0; i<3; i++) free(c->tempBlured[i]);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1032 for(i=0; i<3; i++) free(c->tempBluredPast[i]);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1033
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1034 free(c->tempBlocks);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1035 free(c->yHistogram);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1036 free(c->tempDst);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1037 free(c->tempSrc);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1038 free(c->deintTemp);
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1039 free(c->stdQPTable);
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1040 free(c->nonBQPTable);
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1041 free(c->forcedQPTable);
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1042
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1043 memset(c, 0, sizeof(PPContext));
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1044
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1045 free(c);
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1046 }
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1047
792
2d1283d511b7 cosmetics ;)
michael
parents: 791
diff changeset
1048 void pp_postprocess(uint8_t * src[3], int srcStride[3],
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1049 uint8_t * dst[3], int dstStride[3],
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1050 int width, int height,
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1051 QP_STORE_T *QP_store, int QPStride,
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
1052 pp_mode_t *vm, void *vc, int pict_type)
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
1053 {
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1054 int mbWidth = (width+15)>>4;
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1055 int mbHeight= (height+15)>>4;
829
c39e14fc2392 cleanup
michael
parents: 820
diff changeset
1056 PPMode *mode = (PPMode*)vm;
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1057 PPContext *c = (PPContext*)vc;
2527
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1058 int minStride= MAX(ABS(srcStride[0]), ABS(dstStride[0]));
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1059 int absQPStride = ABS(QPStride);
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1060
2527
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1061 // c->stride and c->QPStride are always positive
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1062 if(c->stride < minStride || c->qpStride < absQPStride)
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1063 reallocBuffers(c, width, height,
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1064 MAX(minStride, c->stride),
2527
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1065 MAX(c->qpStride, absQPStride));
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1066
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
1067 if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
152
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
1068 {
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
1069 int i;
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1070 QP_store= c->forcedQPTable;
2527
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1071 absQPStride = QPStride = 0;
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
1072 if(mode->lumMode & FORCE_QUANT)
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1073 for(i=0; i<mbWidth; i++) QP_store[i]= mode->forcedQuant;
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
1074 else
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 837
diff changeset
1075 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
1076 }
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1077 //printf("pict_type:%d\n", pict_type);
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1078
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1079 if(pict_type & PP_PICT_TYPE_QP2){
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1080 int i;
2527
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1081 const int count= mbHeight * absQPStride;
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1082 for(i=0; i<(count>>2); i++){
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1083 ((uint32_t*)c->stdQPTable)[i] = (((uint32_t*)QP_store)[i]>>1) & 0x7F7F7F7F;
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1084 }
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1085 for(i<<=2; i<count; i++){
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1086 c->stdQPTable[i] = QP_store[i]>>1;
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1087 }
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1088 QP_store= c->stdQPTable;
2527
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1089 QPStride= absQPStride;
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1090 }
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1091
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1092 if(0){
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1093 int x,y;
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1094 for(y=0; y<mbHeight; y++){
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1095 for(x=0; x<mbWidth; x++){
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1096 printf("%2d ", QP_store[x + y*QPStride]);
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1097 }
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1098 printf("\n");
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1099 }
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1100 printf("\n");
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1101 }
798
michael
parents: 793
diff changeset
1102
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
1103 if((pict_type&7)!=3)
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1104 {
2527
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1105 if (QPStride >= 0) {
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1106 int i;
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1107 const int count= mbHeight * QPStride;
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1108 for(i=0; i<(count>>2); i++){
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1109 ((uint32_t*)c->nonBQPTable)[i] = ((uint32_t*)QP_store)[i] & 0x3F3F3F3F;
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1110 }
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1111 for(i<<=2; i<count; i++){
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1112 c->nonBQPTable[i] = QP_store[i] & 0x3F;
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1113 }
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1114 } else {
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1115 int i,j;
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1116 for(i=0; i<mbHeight; i++) {
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1117 for(j=0; j<absQPStride; j++) {
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1118 c->nonBQPTable[i*absQPStride+j] = QP_store[i*QPStride+j] & 0x3F;
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1119 }
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1120 }
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1121 }
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1122 }
152
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
1123
793
8e9faf69110f cleanup
michael
parents: 792
diff changeset
1124 if(verbose>2)
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
1125 {
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
1126 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
1127 }
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
1128
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1129 postProcess(src[0], srcStride[0], dst[0], dstStride[0],
1076
65908e4b81f8 reverse incorrect stride < (width+7)&~7 fix
michaelni
parents: 1075
diff changeset
1130 width, height, QP_store, QPStride, 0, mode, c);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
1131
957
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1132 width = (width )>>c->hChromaSubSample;
8a95bda80fdc YUV 411/422/444 support for pp
michael
parents: 937
diff changeset
1133 height = (height)>>c->vChromaSubSample;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
1134
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1135 if(mode->chromMode)
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1136 {
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1137 postProcess(src[1], srcStride[1], dst[1], dstStride[1],
1076
65908e4b81f8 reverse incorrect stride < (width+7)&~7 fix
michaelni
parents: 1075
diff changeset
1138 width, height, QP_store, QPStride, 1, mode, c);
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1139 postProcess(src[2], srcStride[2], dst[2], dstStride[2],
1076
65908e4b81f8 reverse incorrect stride < (width+7)&~7 fix
michaelni
parents: 1075
diff changeset
1140 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
1141 }
787
4914252c963a postprocessing cleanup:
michael
parents: 419
diff changeset
1142 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
1143 {
2527
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1144 linecpy(dst[1], src[1], height, srcStride[1]);
ace6e273f318 support for negative strides
henry
parents: 2430
diff changeset
1145 linecpy(dst[2], src[2], height, srcStride[2]);
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1146 }
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1147 else
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1148 {
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1149 int y;
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1150 for(y=0; y<height; y++)
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1151 {
791
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1152 memcpy(&(dst[1][y*dstStride[1]]), &(src[1][y*srcStride[1]]), width);
4f61ca80b6c1 better deblocking filter
michael
parents: 787
diff changeset
1153 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
1154 }
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
1155 }
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
1156 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
1157