annotate libpostproc/postprocess.c @ 1985:b2bc62fdecc0 libavcodec

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