annotate postproc/postprocess.c @ 8763:19e96e60a3d0

Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
author anders
date Sat, 04 Jan 2003 06:19:25 +0000
parents 11888c95481b
children e547ce712577
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
1 /*
3964
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
2 Copyright (C) 2001-2002 Michael Niedermayer (michaelni@gmx.at)
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
3
508468a75be0 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
508468a75be0 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
508468a75be0 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
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
7 (at your option) any later version.
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
8
508468a75be0 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,
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
12 GNU General Public License for more details.
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
13
508468a75be0 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
508468a75be0 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
508468a75be0 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
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
17 */
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
18
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
19 /*
2203
f90b6e259dc8 rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 2195
diff changeset
20 C MMX MMX2 3DNow
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
21 isVertDC Ec Ec
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
22 isVertMinMaxOk Ec Ec
2203
f90b6e259dc8 rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 2195
diff changeset
23 doVertLowPass E e e
3013
71384f064a3e faster mmx2 / 3dnow deblocking filter
michael
parents: 2899
diff changeset
24 doVertDefFilter Ec Ec e e
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
25 isHorizDC Ec Ec
2454
b74c2a08eac9 much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 2437
diff changeset
26 isHorizMinMaxOk a E
b74c2a08eac9 much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 2437
diff changeset
27 doHorizLowPass E e e
3013
71384f064a3e faster mmx2 / 3dnow deblocking filter
michael
parents: 2899
diff changeset
28 doHorizDefFilter Ec Ec e e
2477
830c0e171d7d dering in c
michael
parents: 2476
diff changeset
29 deRing E e e*
2203
f90b6e259dc8 rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 2195
diff changeset
30 Vertical RKAlgo1 E a a
2461
60f16575bece fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 2454
diff changeset
31 Horizontal RKAlgo1 a a
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
32 Vertical X1# a E E
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
33 Horizontal X1# a E E
2246
f7c1485b33be fixed the height%8!=0 bug
michael
parents: 2231
diff changeset
34 LinIpolDeinterlace e E E*
f7c1485b33be fixed the height%8!=0 bug
michael
parents: 2231
diff changeset
35 CubicIpolDeinterlace a e e*
f7c1485b33be fixed the height%8!=0 bug
michael
parents: 2231
diff changeset
36 LinBlendDeinterlace e E E*
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
37 MedianDeinterlace# Ec Ec
2895
dd3fabd01df0 temp denoiser changes: (a-b)^2 instead of |a-b| and MMX2/3DNOW version
michael
parents: 2860
diff changeset
38 TempDeNoiser# E e e
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
39
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
40 * i dont have a 3dnow CPU -> its untested, but noone said it doesnt work so it seems to work
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
41 # more or less selfinvented filters so the exactness isnt too meaningfull
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
42 E = Exact implementation
2246
f7c1485b33be fixed the height%8!=0 bug
michael
parents: 2231
diff changeset
43 e = allmost exact implementation (slightly different rounding,...)
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
44 a = alternative / approximate impl
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
45 c = checked against the other implementations (-vo md5)
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
46 */
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
47
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
48 /*
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
49 TODO:
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
50 reduce the time wasted on the mem transfer
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
51 unroll stuff if instructions depend too much on the prior one
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
52 move YScale thing to the end instead of fixing QP
2159
795f3d022657 fixed a bug in the horizontal default filter
arpi
parents: 2158
diff changeset
53 write a faster and higher quality deblocking filter :)
2168
21a8f158d19f bugfixes: last 3 lines not brightness/contrast corrected
michael
parents: 2159
diff changeset
54 make the mainloop more flexible (variable number of blocks at once
21a8f158d19f bugfixes: last 3 lines not brightness/contrast corrected
michael
parents: 2159
diff changeset
55 (the if/else stuff per block is slowing things down)
2179
2d8d14b882cc fixed a rounding bug thing in the X1 Filter
michael
parents: 2169
diff changeset
56 compare the quality & speed of all filters
2d8d14b882cc fixed a rounding bug thing in the X1 Filter
michael
parents: 2169
diff changeset
57 split this huge file
2570
af43a83122fc minor speedup
michael
parents: 2478
diff changeset
58 optimize c versions
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
59 try to unroll inner for(x=0 ... loop to avoid these damn if(x ... checks
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
60 ...
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
61 */
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
62
2221
9fd911c931cd minor cleanups
michael
parents: 2203
diff changeset
63 //Changelog: use the CVS log
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
64
2775
8e3875816f6d added missing #include <malloc.h>
pl
parents: 2750
diff changeset
65 #include "../config.h"
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
66 #include <inttypes.h>
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
67 #include <stdio.h>
2168
21a8f158d19f bugfixes: last 3 lines not brightness/contrast corrected
michael
parents: 2159
diff changeset
68 #include <stdlib.h>
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
69 #include <string.h>
2476
a6c5a537f30a a few warning fixes (missing #include's)
pl
parents: 2475
diff changeset
70 #ifdef HAVE_MALLOC_H
a6c5a537f30a a few warning fixes (missing #include's)
pl
parents: 2475
diff changeset
71 #include <malloc.h>
a6c5a537f30a a few warning fixes (missing #include's)
pl
parents: 2475
diff changeset
72 #endif
2159
795f3d022657 fixed a bug in the horizontal default filter
arpi
parents: 2158
diff changeset
73 //#undef HAVE_MMX2
795f3d022657 fixed a bug in the horizontal default filter
arpi
parents: 2158
diff changeset
74 //#define HAVE_3DNOW
795f3d022657 fixed a bug in the horizontal default filter
arpi
parents: 2158
diff changeset
75 //#undef HAVE_MMX
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
76 //#undef ARCH_X86
3013
71384f064a3e faster mmx2 / 3dnow deblocking filter
michael
parents: 2899
diff changeset
77 //#define DEBUG_BRIGHTNESS
8107
6fadfa315113 dont use fastmemcpy for PIC
michael
parents: 8076
diff changeset
78 #ifndef PIC
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
79 #include "../libvo/fastmemcpy.h"
8107
6fadfa315113 dont use fastmemcpy for PIC
michael
parents: 8076
diff changeset
80 #endif
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
81 #include "postprocess.h"
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
82 #include "postprocess_internal.h"
4248
3cdb86beebce mangle for win32 in postproc
atmos4
parents: 4143
diff changeset
83 #include "../mangle.h"
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
84
2189
82556b3a1228 Cleanup:
arpi
parents: 2185
diff changeset
85 #define MIN(a,b) ((a) > (b) ? (b) : (a))
82556b3a1228 Cleanup:
arpi
parents: 2185
diff changeset
86 #define MAX(a,b) ((a) < (b) ? (b) : (a))
82556b3a1228 Cleanup:
arpi
parents: 2185
diff changeset
87 #define ABS(a) ((a) > 0 ? (a) : (-(a)))
82556b3a1228 Cleanup:
arpi
parents: 2185
diff changeset
88 #define SIGN(a) ((a) > 0 ? 1 : -1)
82556b3a1228 Cleanup:
arpi
parents: 2185
diff changeset
89
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
90 #define GET_MODE_BUFFER_SIZE 500
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
91 #define OPTIONS_ARRAY_SIZE 10
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
92 #define BLOCK_SIZE 8
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
93 #define TEMP_STRIDE 8
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
94 //#define NUM_BLOCKS_AT_ONCE 16 //not used yet
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
95
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
96 #ifdef ARCH_X86
2742
d5636499cafd minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 2595
diff changeset
97 static uint64_t __attribute__((aligned(8))) w05= 0x0005000500050005LL;
d5636499cafd minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 2595
diff changeset
98 static uint64_t __attribute__((aligned(8))) w20= 0x0020002000200020LL;
d5636499cafd minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 2595
diff changeset
99 static uint64_t __attribute__((aligned(8))) b00= 0x0000000000000000LL;
d5636499cafd minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 2595
diff changeset
100 static uint64_t __attribute__((aligned(8))) b01= 0x0101010101010101LL;
d5636499cafd minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 2595
diff changeset
101 static uint64_t __attribute__((aligned(8))) b02= 0x0202020202020202LL;
d5636499cafd minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 2595
diff changeset
102 static uint64_t __attribute__((aligned(8))) b08= 0x0808080808080808LL;
d5636499cafd minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 2595
diff changeset
103 static uint64_t __attribute__((aligned(8))) b80= 0x8080808080808080LL;
d5636499cafd minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 2595
diff changeset
104 #endif
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
105
7963
0a5d69e6f2a2 cleanup
michael
parents: 7961
diff changeset
106 static int verbose= 0;
3771
a14b3a600b81 new -pp options stuff (-npp ...)
michael
parents: 3151
diff changeset
107
7963
0a5d69e6f2a2 cleanup
michael
parents: 7961
diff changeset
108 static const int deringThreshold= 20;
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
109
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
110
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
111 static struct PPFilter filters[]=
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
112 {
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
113 {"hb", "hdeblock", 1, 1, 3, H_DEBLOCK},
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
114 {"vb", "vdeblock", 1, 2, 4, V_DEBLOCK},
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
115 /* {"hr", "rkhdeblock", 1, 1, 3, H_RK1_FILTER},
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
116 {"vr", "rkvdeblock", 1, 2, 4, V_RK1_FILTER},*/
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
117 {"h1", "x1hdeblock", 1, 1, 3, H_X1_FILTER},
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
118 {"v1", "x1vdeblock", 1, 2, 4, V_X1_FILTER},
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
119 {"dr", "dering", 1, 5, 6, DERING},
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
120 {"al", "autolevels", 0, 1, 2, LEVEL_FIX},
3817
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
121 {"lb", "linblenddeint", 1, 1, 4, LINEAR_BLEND_DEINT_FILTER},
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
122 {"li", "linipoldeint", 1, 1, 4, LINEAR_IPOL_DEINT_FILTER},
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
123 {"ci", "cubicipoldeint", 1, 1, 4, CUBIC_IPOL_DEINT_FILTER},
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
124 {"md", "mediandeint", 1, 1, 4, MEDIAN_DEINT_FILTER},
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
125 {"fd", "ffmpegdeint", 1, 1, 4, FFMPEG_DEINT_FILTER},
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
126 {"tn", "tmpnoise", 1, 7, 8, TEMP_NOISE_FILTER},
3964
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
127 {"fq", "forcequant", 1, 0, 0, FORCE_QUANT},
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
128 {NULL, NULL,0,0,0,0} //End Marker
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
129 };
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
130
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
131 static char *replaceTable[]=
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
132 {
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
133 "default", "hdeblock:a,vdeblock:a,dering:a,autolevels,tmpnoise:a:150:200:400",
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
134 "de", "hdeblock:a,vdeblock:a,dering:a,autolevels,tmpnoise:a:150:200:400",
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
135 "fast", "x1hdeblock:a,x1vdeblock:a,dering:a,autolevels,tmpnoise:a:150:200:400",
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
136 "fa", "x1hdeblock:a,x1vdeblock:a,dering:a,autolevels,tmpnoise:a:150:200:400",
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
137 NULL //End Marker
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
138 };
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
139
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
140 #ifdef ARCH_X86
2461
60f16575bece fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 2454
diff changeset
141 static inline void unusedVariableWarningFixer()
60f16575bece fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 2454
diff changeset
142 {
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
143 if(w05 + w20 + b00 + b01 + b02 + b08 + b80 == 0) b00=0;
2461
60f16575bece fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 2454
diff changeset
144 }
2742
d5636499cafd minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 2595
diff changeset
145 #endif
2461
60f16575bece fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 2454
diff changeset
146
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
147
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
148 #ifdef ARCH_X86
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
149 static inline void prefetchnta(void *p)
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
150 {
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
151 asm volatile( "prefetchnta (%0)\n\t"
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
152 : : "r" (p)
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
153 );
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
154 }
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
155
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
156 static inline void prefetcht0(void *p)
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
157 {
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
158 asm volatile( "prefetcht0 (%0)\n\t"
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
159 : : "r" (p)
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
160 );
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
161 }
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
162
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
163 static inline void prefetcht1(void *p)
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
164 {
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
165 asm volatile( "prefetcht1 (%0)\n\t"
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
166 : : "r" (p)
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
167 );
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
168 }
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
169
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
170 static inline void prefetcht2(void *p)
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
171 {
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
172 asm volatile( "prefetcht2 (%0)\n\t"
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
173 : : "r" (p)
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
174 );
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
175 }
2185
c5162871cf2b small changes for mplayer integration:
arpi
parents: 2181
diff changeset
176 #endif
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
177
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
178 // The horizontal Functions exist only in C cuz the MMX code is faster with vertical filters and transposing
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
179
3032
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
180 /**
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
181 * Check if the given 8x8 Block is mostly "flat"
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
182 */
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
183 static inline int isHorizDC(uint8_t src[], int stride, PPContext *c)
3032
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
184 {
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
185 int numEq= 0;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
186 int y;
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
187 const int dcOffset= ((c->QP*c->ppMode.baseDcDiff)>>8) + 1;
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
188 const int dcThreshold= dcOffset*2 + 1;
3032
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
189 for(y=0; y<BLOCK_SIZE; y++)
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
190 {
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
191 if(((unsigned)(src[0] - src[1] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
192 if(((unsigned)(src[1] - src[2] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
193 if(((unsigned)(src[2] - src[3] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
194 if(((unsigned)(src[3] - src[4] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
195 if(((unsigned)(src[4] - src[5] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
196 if(((unsigned)(src[5] - src[6] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
197 if(((unsigned)(src[6] - src[7] + dcOffset)) < dcThreshold) numEq++;
3032
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
198 src+= stride;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
199 }
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
200 return numEq > c->ppMode.flatnessThreshold;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
201 }
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
202
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
203 /**
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
204 * Check if the middle 8x8 Block in the given 8x16 block is flat
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
205 */
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
206 static inline int isVertDC_C(uint8_t src[], int stride, PPContext *c){
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
207 int numEq= 0;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
208 int y;
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
209 const int dcOffset= ((c->QP*c->ppMode.baseDcDiff)>>8) + 1;
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
210 const int dcThreshold= dcOffset*2 + 1;
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
211 src+= stride*4; // src points to begin of the 8x8 Block
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
212 for(y=0; y<BLOCK_SIZE-1; y++)
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
213 {
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
214 if(((unsigned)(src[0] - src[0+stride] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
215 if(((unsigned)(src[1] - src[1+stride] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
216 if(((unsigned)(src[2] - src[2+stride] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
217 if(((unsigned)(src[3] - src[3+stride] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
218 if(((unsigned)(src[4] - src[4+stride] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
219 if(((unsigned)(src[5] - src[5+stride] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
220 if(((unsigned)(src[6] - src[6+stride] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
221 if(((unsigned)(src[7] - src[7+stride] + dcOffset)) < dcThreshold) numEq++;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
222 src+= stride;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
223 }
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
224 return numEq > c->ppMode.flatnessThreshold;
3032
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
225 }
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
226
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
227 static inline int isHorizMinMaxOk(uint8_t src[], int stride, int QP)
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
228 {
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
229 if(abs(src[0] - src[7]) > 2*QP) return 0;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
230
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
231 return 1;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
232 }
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
233
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
234 static inline void doHorizDefFilter(uint8_t dst[], int stride, int QP)
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
235 {
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
236 int y;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
237 for(y=0; y<BLOCK_SIZE; y++)
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
238 {
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
239 const int middleEnergy= 5*(dst[4] - dst[5]) + 2*(dst[2] - dst[5]);
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
240
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
241 if(ABS(middleEnergy) < 8*QP)
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
242 {
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
243 const int q=(dst[3] - dst[4])/2;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
244 const int leftEnergy= 5*(dst[2] - dst[1]) + 2*(dst[0] - dst[3]);
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
245 const int rightEnergy= 5*(dst[6] - dst[5]) + 2*(dst[4] - dst[7]);
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
246
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
247 int d= ABS(middleEnergy) - MIN( ABS(leftEnergy), ABS(rightEnergy) );
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
248 d= MAX(d, 0);
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
249
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
250 d= (5*d + 32) >> 6;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
251 d*= SIGN(-middleEnergy);
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
252
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
253 if(q>0)
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
254 {
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
255 d= d<0 ? 0 : d;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
256 d= d>q ? q : d;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
257 }
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
258 else
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
259 {
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
260 d= d>0 ? 0 : d;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
261 d= d<q ? q : d;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
262 }
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
263
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
264 dst[3]-= d;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
265 dst[4]+= d;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
266 }
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
267 dst+= stride;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
268 }
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
269 }
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
270
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
271 /**
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
272 * Do a horizontal low pass filter on the 10x8 block (dst points to middle 8x8 Block)
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
273 * using the 9-Tap Filter (1,1,2,2,4,2,2,1,1)/16 (C version)
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
274 */
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
275 static inline void doHorizLowPass(uint8_t dst[], int stride, int QP)
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
276 {
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
277
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
278 int y;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
279 for(y=0; y<BLOCK_SIZE; y++)
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
280 {
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
281 const int first= ABS(dst[-1] - dst[0]) < QP ? dst[-1] : dst[0];
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
282 const int last= ABS(dst[8] - dst[7]) < QP ? dst[8] : dst[7];
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
283
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
284 int sums[9];
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
285 sums[0] = first + dst[0];
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
286 sums[1] = dst[0] + dst[1];
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
287 sums[2] = dst[1] + dst[2];
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
288 sums[3] = dst[2] + dst[3];
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
289 sums[4] = dst[3] + dst[4];
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
290 sums[5] = dst[4] + dst[5];
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
291 sums[6] = dst[5] + dst[6];
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
292 sums[7] = dst[6] + dst[7];
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
293 sums[8] = dst[7] + last;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
294
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
295 dst[0]= ((sums[0]<<2) + ((first + sums[2])<<1) + sums[4] + 8)>>4;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
296 dst[1]= ((dst[1]<<2) + ((first + sums[0] + sums[3])<<1) + sums[5] + 8)>>4;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
297 dst[2]= ((dst[2]<<2) + ((first + sums[1] + sums[4])<<1) + sums[6] + 8)>>4;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
298 dst[3]= ((dst[3]<<2) + ((sums[2] + sums[5])<<1) + sums[0] + sums[7] + 8)>>4;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
299 dst[4]= ((dst[4]<<2) + ((sums[3] + sums[6])<<1) + sums[1] + sums[8] + 8)>>4;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
300 dst[5]= ((dst[5]<<2) + ((last + sums[7] + sums[4])<<1) + sums[2] + 8)>>4;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
301 dst[6]= (((last + dst[6])<<2) + ((dst[7] + sums[5])<<1) + sums[3] + 8)>>4;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
302 dst[7]= ((sums[8]<<2) + ((last + sums[6])<<1) + sums[4] + 8)>>4;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
303
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
304 dst+= stride;
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
305 }
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
306 }
6de073cf52b5 oops, too much cleanup ;)
michael
parents: 3031
diff changeset
307
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
308 /**
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
309 * Experimental Filter 1 (Horizontal)
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
310 * will not damage linear gradients
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
311 * Flat blocks should look like they where passed through the (1,1,2,2,4,2,2,1,1) 9-Tap filter
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
312 * can only smooth blocks at the expected locations (it cant smooth them if they did move)
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
313 * MMX2 version does correct clipping C version doesnt
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
314 * not identical with the vertical one
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
315 */
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
316 static inline void horizX1Filter(uint8_t *src, int stride, int QP)
2158
508468a75be0 new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
317 {
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
318 int y;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
319 static uint64_t *lut= NULL;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
320 if(lut==NULL)
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
321 {
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
322 int i;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
323 lut= (uint64_t*)memalign(8, 256*8);
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
324 for(i=0; i<256; i++)
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
325 {
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
326 int v= i < 128 ? 2*i : 2*(i-256);
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
327 /*
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
328 //Simulate 112242211 9-Tap filter
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
329 uint64_t a= (v/16) & 0xFF;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
330 uint64_t b= (v/8) & 0xFF;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
331 uint64_t c= (v/4) & 0xFF;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
332 uint64_t d= (3*v/8) & 0xFF;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
333 */
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
334 //Simulate piecewise linear interpolation
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
335 uint64_t a= (v/16) & 0xFF;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
336 uint64_t b= (v*3/16) & 0xFF;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
337 uint64_t c= (v*5/16) & 0xFF;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
338 uint64_t d= (7*v/16) & 0xFF;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
339 uint64_t A= (0x100 - a)&0xFF;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
340 uint64_t B= (0x100 - b)&0xFF;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
341 uint64_t C= (0x100 - c)&0xFF;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
342 uint64_t D= (0x100 - c)&0xFF;
2473
94a0265c408c dering in mmx2
michael
parents: 2461
diff changeset
343
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
344 lut[i] = (a<<56) | (b<<48) | (c<<40) | (d<<32) |
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
345 (D<<24) | (C<<16) | (B<<8) | (A);
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
346 //lut[i] = (v<<32) | (v<<24);
2477
830c0e171d7d dering in c
michael
parents: 2476
diff changeset
347 }
830c0e171d7d dering in c
michael
parents: 2476
diff changeset
348 }
830c0e171d7d dering in c
michael
parents: 2476
diff changeset
349
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
350 for(y=0; y<BLOCK_SIZE; y++)
2477
830c0e171d7d dering in c
michael
parents: 2476
diff changeset
351 {
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
352 int a= src[1] - src[2];
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
353 int b= src[3] - src[4];
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
354 int c= src[5] - src[6];
2477
830c0e171d7d dering in c
michael
parents: 2476
diff changeset
355
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
356 int d= MAX(ABS(b) - (ABS(a) + ABS(c))/2, 0);
3093
fb4cee33d3c6 faster dering
michael
parents: 3037
diff changeset
357
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
358 if(d < QP)
3093
fb4cee33d3c6 faster dering
michael
parents: 3037
diff changeset
359 {
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
360 int v = d * SIGN(-b);
2203
f90b6e259dc8 rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 2195
diff changeset
361
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
362 src[1] +=v/8;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
363 src[2] +=v/4;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
364 src[3] +=3*v/8;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
365 src[4] -=3*v/8;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
366 src[5] -=v/4;
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
367 src[6] -=v/8;
2203
f90b6e259dc8 rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 2195
diff changeset
368
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
369 }
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
370 src+=stride;
2203
f90b6e259dc8 rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 2195
diff changeset
371 }
f90b6e259dc8 rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 2195
diff changeset
372 }
f90b6e259dc8 rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 2195
diff changeset
373
f90b6e259dc8 rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 2195
diff changeset
374
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
375 //Note: we have C, MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
376 //Plain C versions
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
377 #if !defined (HAVE_MMX) || defined (RUNTIME_CPUDETECT)
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
378 #define COMPILE_C
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
379 #endif
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
380
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
381 #ifdef ARCH_X86
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
382
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
383 #if (defined (HAVE_MMX) && !defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
384 #define COMPILE_MMX
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
385 #endif
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
386
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
387 #if defined (HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
388 #define COMPILE_MMX2
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
389 #endif
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
390
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
391 #if (defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
392 #define COMPILE_3DNOW
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
393 #endif
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
394 #endif //ARCH_X86
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
395
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
396 #undef HAVE_MMX
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
397 #undef HAVE_MMX2
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
398 #undef HAVE_3DNOW
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
399 #undef ARCH_X86
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
400
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
401 #ifdef COMPILE_C
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
402 #undef HAVE_MMX
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
403 #undef HAVE_MMX2
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
404 #undef HAVE_3DNOW
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
405 #undef ARCH_X86
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
406 #define RENAME(a) a ## _C
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
407 #include "postprocess_template.c"
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
408 #endif
2203
f90b6e259dc8 rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 2195
diff changeset
409
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
410 //MMX versions
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
411 #ifdef COMPILE_MMX
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
412 #undef RENAME
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
413 #define HAVE_MMX
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
414 #undef HAVE_MMX2
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
415 #undef HAVE_3DNOW
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
416 #define ARCH_X86
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
417 #define RENAME(a) a ## _MMX
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
418 #include "postprocess_template.c"
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
419 #endif
2454
b74c2a08eac9 much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 2437
diff changeset
420
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
421 //MMX2 versions
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
422 #ifdef COMPILE_MMX2
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
423 #undef RENAME
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
424 #define HAVE_MMX
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
425 #define HAVE_MMX2
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
426 #undef HAVE_3DNOW
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
427 #define ARCH_X86
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
428 #define RENAME(a) a ## _MMX2
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
429 #include "postprocess_template.c"
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
430 #endif
2454
b74c2a08eac9 much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 2437
diff changeset
431
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
432 //3DNOW versions
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
433 #ifdef COMPILE_3DNOW
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
434 #undef RENAME
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
435 #define HAVE_MMX
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
436 #undef HAVE_MMX2
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
437 #define HAVE_3DNOW
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
438 #define ARCH_X86
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
439 #define RENAME(a) a ## _3DNow
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
440 #include "postprocess_template.c"
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
441 #endif
2454
b74c2a08eac9 much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 2437
diff changeset
442
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
443 // minor note: the HAVE_xyz is messed up after that line so dont use it
2454
b74c2a08eac9 much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 2437
diff changeset
444
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
445 static inline void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height,
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
446 QP_STORE_T QPs[], int QPStride, int isColor, pp_mode_t *vm, pp_context_t *vc)
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
447 {
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
448 PPContext *c= (PPContext *)vc;
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
449 PPMode *ppMode= (PPMode *)vm;
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
450 c->ppMode= *ppMode; //FIXME
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
451
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
452 // useing ifs here as they are faster than function pointers allthough the
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
453 // difference wouldnt be messureable here but its much better because
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
454 // someone might exchange the cpu whithout restarting mplayer ;)
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
455 #ifdef RUNTIME_CPUDETECT
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
456 #ifdef ARCH_X86
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
457 // ordered per speed fasterst first
7985
1ab37da5b1da per context cpuCaps (idea by kabi)
michael
parents: 7984
diff changeset
458 if(c->cpuCaps & PP_CPU_CAPS_MMX2)
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
459 postProcess_MMX2(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7985
1ab37da5b1da per context cpuCaps (idea by kabi)
michael
parents: 7984
diff changeset
460 else if(c->cpuCaps & PP_CPU_CAPS_3DNOW)
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
461 postProcess_3DNow(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
7985
1ab37da5b1da per context cpuCaps (idea by kabi)
michael
parents: 7984
diff changeset
462 else if(c->cpuCaps & PP_CPU_CAPS_MMX)
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
463 postProcess_MMX(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
464 else
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
465 postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
2895
dd3fabd01df0 temp denoiser changes: (a-b)^2 instead of |a-b| and MMX2/3DNOW version
michael
parents: 2860
diff changeset
466 #else
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
467 postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
2895
dd3fabd01df0 temp denoiser changes: (a-b)^2 instead of |a-b| and MMX2/3DNOW version
michael
parents: 2860
diff changeset
468 #endif
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
469 #else //RUNTIME_CPUDETECT
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
470 #ifdef HAVE_MMX2
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
471 postProcess_MMX2(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
472 #elif defined (HAVE_3DNOW)
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
473 postProcess_3DNow(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
474 #elif defined (HAVE_MMX)
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
475 postProcess_MMX(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
476 #else
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
477 postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, c);
3151
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
478 #endif
790a27fc64f1 runtime cpu detect optional (compiles faster)
michael
parents: 3099
diff changeset
479 #endif //!RUNTIME_CPUDETECT
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
480 }
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
481
3099
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
482 //static void postProcess(uint8_t src[], int srcStride, uint8_t dst[], int dstStride, int width, int height,
897d46457708 runtime cpu detection
michael
parents: 3094
diff changeset
483 // QP_STORE_T QPs[], int QPStride, int isColor, struct PPMode *ppMode);
2159
795f3d022657 fixed a bug in the horizontal default filter
arpi
parents: 2158
diff changeset
484
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
485 /* -pp Command line Help
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
486 */
7984
a57c1fc0c2fc change qscale type to int8 and fix qscale ordering
michael
parents: 7972
diff changeset
487 char *pp_help=
8076
3ac37c4beeaf pp docs
michael
parents: 8040
diff changeset
488 "<filterName>[:<option>[:<option>...]][[,|/][-]<filterName>[:<option>...]]...\n"
3976
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
489 "long form example:\n"
8076
3ac37c4beeaf pp docs
michael
parents: 8040
diff changeset
490 "vdeblock:autoq/hdeblock:autoq/linblenddeint default,-vdeblock\n"
3976
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
491 "short form example:\n"
8076
3ac37c4beeaf pp docs
michael
parents: 8040
diff changeset
492 "vb:a/hb:a/lb de,-vb\n"
3976
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
493 "more examples:\n"
7986
39b5d7082e1f removing "-npp" (found by arpi)
michael
parents: 7985
diff changeset
494 "tn:64:128:256\n"
3976
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
495 "Filters Options\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
496 "short long name short long option Description\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
497 "* * a autoq cpu power dependant enabler\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
498 " c chrom chrominance filtring enabled\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
499 " y nochrom chrominance filtring disabled\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
500 "hb hdeblock (2 Threshold) horizontal deblocking filter\n"
8076
3ac37c4beeaf pp docs
michael
parents: 8040
diff changeset
501 " 1. difference factor: default=64, higher -> more deblocking\n"
3ac37c4beeaf pp docs
michael
parents: 8040
diff changeset
502 " 2. flatness threshold: default=40, lower -> more deblocking\n"
3976
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
503 " the h & v deblocking filters share these\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
504 " so u cant set different thresholds for h / v\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
505 "vb vdeblock (2 Threshold) vertical deblocking filter\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
506 "h1 x1hdeblock Experimental h deblock filter 1\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
507 "v1 x1vdeblock Experimental v deblock filter 1\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
508 "dr dering Deringing filter\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
509 "al autolevels automatic brightness / contrast\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
510 " f fullyrange stretch luminance to (0..255)\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
511 "lb linblenddeint linear blend deinterlacer\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
512 "li linipoldeint linear interpolating deinterlace\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
513 "ci cubicipoldeint cubic interpolating deinterlacer\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
514 "md mediandeint median deinterlacer\n"
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
515 "fd ffmpegdeint ffmpeg deinterlacer\n"
3976
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
516 "de default hb:a,vb:a,dr:a,al\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
517 "fa fast h1:a,v1:a,dr:a,al\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
518 "tn tmpnoise (3 Thresholds) Temporal Noise Reducer\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
519 " 1. <= 2. <= 3. larger -> stronger filtering\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
520 "fq forceQuant <quantizer> Force quantizer\n"
3aa6a5c1ca32 -npp help
michael
parents: 3964
diff changeset
521 ;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
522
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
523 pp_mode_t *pp_get_mode_by_name_and_quality(char *name, int quality)
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
524 {
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
525 char temp[GET_MODE_BUFFER_SIZE];
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
526 char *p= temp;
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
527 char *filterDelimiters= ",/";
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
528 char *optionDelimiters= ":";
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
529 struct PPMode *ppMode;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
530 char *filterToken;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
531
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
532 ppMode= memalign(8, sizeof(PPMode));
fe30880576dc cleanup
michael
parents: 8019
diff changeset
533
fe30880576dc cleanup
michael
parents: 8019
diff changeset
534 ppMode->lumMode= 0;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
535 ppMode->chromMode= 0;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
536 ppMode->maxTmpNoise[0]= 700;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
537 ppMode->maxTmpNoise[1]= 1500;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
538 ppMode->maxTmpNoise[2]= 3000;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
539 ppMode->maxAllowedY= 234;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
540 ppMode->minAllowedY= 16;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
541 ppMode->baseDcDiff= 256/4;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
542 ppMode->flatnessThreshold= 56-16;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
543 ppMode->maxClippedThreshold= 0.01;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
544 ppMode->error=0;
7963
0a5d69e6f2a2 cleanup
michael
parents: 7961
diff changeset
545
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
546 strncpy(temp, name, GET_MODE_BUFFER_SIZE);
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
547
4143
d416ca893952 dont print -npp parser debug info if only -v
michael
parents: 3987
diff changeset
548 if(verbose>1) printf("pp: %s\n", name);
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
549
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
550 for(;;){
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
551 char *filterName;
8040
5241f95b5ec4 cleanup
michael
parents: 8038
diff changeset
552 int q= 1000000; //PP_QUALITY_MAX;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
553 int chrom=-1;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
554 char *option;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
555 char *options[OPTIONS_ARRAY_SIZE];
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
556 int i;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
557 int filterNameOk=0;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
558 int numOfUnknownOptions=0;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
559 int enable=1; //does the user want us to enabled or disabled the filter
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
560
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
561 filterToken= strtok(p, filterDelimiters);
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
562 if(filterToken == NULL) break;
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
563 p+= strlen(filterToken) + 1; // p points to next filterToken
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
564 filterName= strtok(filterToken, optionDelimiters);
4143
d416ca893952 dont print -npp parser debug info if only -v
michael
parents: 3987
diff changeset
565 if(verbose>1) printf("pp: %s::%s\n", filterToken, filterName);
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
566
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
567 if(*filterName == '-')
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
568 {
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
569 enable=0;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
570 filterName++;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
571 }
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
572
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
573 for(;;){ //for all options
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
574 option= strtok(NULL, optionDelimiters);
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
575 if(option == NULL) break;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
576
4143
d416ca893952 dont print -npp parser debug info if only -v
michael
parents: 3987
diff changeset
577 if(verbose>1) printf("pp: option: %s\n", option);
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
578 if(!strcmp("autoq", option) || !strcmp("a", option)) q= quality;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
579 else if(!strcmp("nochrom", option) || !strcmp("y", option)) chrom=0;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
580 else if(!strcmp("chrom", option) || !strcmp("c", option)) chrom=1;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
581 else
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
582 {
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
583 options[numOfUnknownOptions] = option;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
584 numOfUnknownOptions++;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
585 }
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
586 if(numOfUnknownOptions >= OPTIONS_ARRAY_SIZE-1) break;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
587 }
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
588 options[numOfUnknownOptions] = NULL;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
589
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
590 /* replace stuff from the replace Table */
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
591 for(i=0; replaceTable[2*i]!=NULL; i++)
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
592 {
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
593 if(!strcmp(replaceTable[2*i], filterName))
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
594 {
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
595 int newlen= strlen(replaceTable[2*i + 1]);
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
596 int plen;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
597 int spaceLeft;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
598
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
599 if(p==NULL) p= temp, *p=0; //last filter
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
600 else p--, *p=','; //not last filter
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
601
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
602 plen= strlen(p);
6164
aee9c32349a9 applied 64bit patch from Ulrich Hecht <uli at suse dot de>
alex
parents: 4257
diff changeset
603 spaceLeft= p - temp + plen;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
604 if(spaceLeft + newlen >= GET_MODE_BUFFER_SIZE)
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
605 {
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
606 ppMode->error++;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
607 break;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
608 }
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
609 memmove(p + newlen, p, plen+1);
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
610 memcpy(p, replaceTable[2*i + 1], newlen);
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
611 filterNameOk=1;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
612 }
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
613 }
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
614
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
615 for(i=0; filters[i].shortName!=NULL; i++)
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
616 {
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
617 // printf("Compareing %s, %s, %s\n", filters[i].shortName,filters[i].longName, filterName);
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
618 if( !strcmp(filters[i].longName, filterName)
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
619 || !strcmp(filters[i].shortName, filterName))
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
620 {
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
621 ppMode->lumMode &= ~filters[i].mask;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
622 ppMode->chromMode &= ~filters[i].mask;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
623
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
624 filterNameOk=1;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
625 if(!enable) break; // user wants to disable it
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
626
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
627 if(q >= filters[i].minLumQuality)
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
628 ppMode->lumMode|= filters[i].mask;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
629 if(chrom==1 || (chrom==-1 && filters[i].chromDefault))
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
630 if(q >= filters[i].minChromQuality)
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
631 ppMode->chromMode|= filters[i].mask;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
632
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
633 if(filters[i].mask == LEVEL_FIX)
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
634 {
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
635 int o;
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
636 ppMode->minAllowedY= 16;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
637 ppMode->maxAllowedY= 234;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
638 for(o=0; options[o]!=NULL; o++)
3832
d05cfaf5f0f2 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 3817
diff changeset
639 {
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
640 if( !strcmp(options[o],"fullyrange")
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
641 ||!strcmp(options[o],"f"))
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
642 {
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
643 ppMode->minAllowedY= 0;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
644 ppMode->maxAllowedY= 255;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
645 numOfUnknownOptions--;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
646 }
3832
d05cfaf5f0f2 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 3817
diff changeset
647 }
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
648 }
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
649 else if(filters[i].mask == TEMP_NOISE_FILTER)
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
650 {
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
651 int o;
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
652 int numOfNoises=0;
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
653
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
654 for(o=0; options[o]!=NULL; o++)
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
655 {
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
656 char *tail;
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
657 ppMode->maxTmpNoise[numOfNoises]=
2860
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
658 strtol(options[o], &tail, 0);
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
659 if(tail!=options[o])
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
660 {
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
661 numOfNoises++;
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
662 numOfUnknownOptions--;
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
663 if(numOfNoises >= 3) break;
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
664 }
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
665 }
08b833fb875a temporal noise reducer in C (-pp 0x100000)
michael
parents: 2808
diff changeset
666 }
3817
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
667 else if(filters[i].mask == V_DEBLOCK || filters[i].mask == H_DEBLOCK)
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
668 {
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
669 int o;
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
670
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
671 for(o=0; options[o]!=NULL && o<2; o++)
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
672 {
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
673 char *tail;
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
674 int val= strtol(options[o], &tail, 0);
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
675 if(tail==options[o]) break;
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
676
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
677 numOfUnknownOptions--;
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
678 if(o==0) ppMode->baseDcDiff= val;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
679 else ppMode->flatnessThreshold= val;
3817
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
680 }
365e9a92498d customizeable deblocking (2 thresholds)
michael
parents: 3779
diff changeset
681 }
3964
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
682 else if(filters[i].mask == FORCE_QUANT)
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
683 {
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
684 int o;
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
685 ppMode->forcedQuant= 15;
3964
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
686
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
687 for(o=0; options[o]!=NULL && o<1; o++)
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
688 {
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
689 char *tail;
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
690 int val= strtol(options[o], &tail, 0);
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
691 if(tail==options[o]) break;
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
692
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
693 numOfUnknownOptions--;
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
694 ppMode->forcedQuant= val;
3964
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
695 }
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
696 }
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
697 }
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
698 }
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
699 if(!filterNameOk) ppMode->error++;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
700 ppMode->error += numOfUnknownOptions;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
701 }
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
702
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
703 if(verbose>1) printf("pp: lumMode=%X, chromMode=%X\n", ppMode->lumMode, ppMode->chromMode);
fe30880576dc cleanup
michael
parents: 8019
diff changeset
704 if(ppMode->error)
fe30880576dc cleanup
michael
parents: 8019
diff changeset
705 {
fe30880576dc cleanup
michael
parents: 8019
diff changeset
706 fprintf(stderr, "%d errors in postprocess string \"%s\"\n", ppMode->error, name);
fe30880576dc cleanup
michael
parents: 8019
diff changeset
707 free(ppMode);
fe30880576dc cleanup
michael
parents: 8019
diff changeset
708 return NULL;
fe30880576dc cleanup
michael
parents: 8019
diff changeset
709 }
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
710 return ppMode;
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
711 }
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
712
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
713 void pp_free_mode(pp_mode_t *mode){
fe30880576dc cleanup
michael
parents: 8019
diff changeset
714 if(mode) free(mode);
fe30880576dc cleanup
michael
parents: 8019
diff changeset
715 }
fe30880576dc cleanup
michael
parents: 8019
diff changeset
716
8630
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
717 static void reallocAlign(void **p, int alignment, int size){
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
718 if(*p) free(*p);
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
719 *p= memalign(alignment, size);
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
720 memset(*p, 0, size);
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
721 }
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
722
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
723 static void reallocBuffers(PPContext *c, int width, int height, int stride){
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
724 int mbWidth = (width+15)>>4;
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
725 int mbHeight= (height+15)>>4;
8630
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
726 int i;
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
727
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
728 c->stride= stride;
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
729
8630
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
730 reallocAlign((void **)&c->tempDst, 8, stride*24);
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
731 reallocAlign((void **)&c->tempSrc, 8, stride*24);
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
732 reallocAlign((void **)&c->tempBlocks, 8, 2*16*8);
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
733 reallocAlign((void **)&c->yHistogram, 8, 256*sizeof(uint64_t));
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
734 for(i=0; i<256; i++)
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
735 c->yHistogram[i]= width*height/64*15/256;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
736
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
737 for(i=0; i<3; i++)
3987
a80d0b59ca0e fixed -npp help ... i think i need more sleep ;)
michael
parents: 3976
diff changeset
738 {
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
739 //Note:the +17*1024 is just there so i dont have to worry about r/w over te end
8630
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
740 reallocAlign((void **)&c->tempBlured[i], 8, stride*mbHeight*16 + 17*1024);
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
741 reallocAlign((void **)&c->tempBluredPast[i], 8, 256*((height+7)&(~7))/2 + 17*1024);//FIXME size
3987
a80d0b59ca0e fixed -npp help ... i think i need more sleep ;)
michael
parents: 3976
diff changeset
742 }
8630
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
743
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
744 reallocAlign((void **)&c->deintTemp, 8, width+16);
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
745 reallocAlign((void **)&c->nonBQPTable, 8, mbWidth*mbHeight*sizeof(QP_STORE_T));
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
746 reallocAlign((void **)&c->forcedQPTable, 8, mbWidth*sizeof(QP_STORE_T));
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
747 }
3771
a14b3a600b81 new -pp options stuff (-npp ...)
michael
parents: 3151
diff changeset
748
8630
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
749 pp_context_t *pp_get_context(int width, int height, int cpuCaps){
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
750 PPContext *c= memalign(32, sizeof(PPContext));
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
751 int i;
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
752 int stride= (width+15)&(~15); //assumed / will realloc if needed
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
753
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
754 memset(c, 0, sizeof(PPContext));
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
755 c->cpuCaps= cpuCaps;
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
756
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
757 reallocBuffers(c, width, height, stride);
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
758
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
759 c->frameNum=-1;
3771
a14b3a600b81 new -pp options stuff (-npp ...)
michael
parents: 3151
diff changeset
760
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
761 return c;
3771
a14b3a600b81 new -pp options stuff (-npp ...)
michael
parents: 3151
diff changeset
762 }
a14b3a600b81 new -pp options stuff (-npp ...)
michael
parents: 3151
diff changeset
763
7961
78e0f2776da7 cosmetics ;)
michael
parents: 7960
diff changeset
764 void pp_free_context(void *vc){
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
765 PPContext *c = (PPContext*)vc;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
766 int i;
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
767
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
768 for(i=0; i<3; i++) free(c->tempBlured[i]);
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
769 for(i=0; i<3; i++) free(c->tempBluredPast[i]);
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
770
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
771 free(c->tempBlocks);
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
772 free(c->yHistogram);
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
773 free(c->tempDst);
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
774 free(c->tempSrc);
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
775 free(c->deintTemp);
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
776 free(c->nonBQPTable);
8630
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
777 free(c->forcedQPTable);
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
778
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
779 memset(c, 0, sizeof(PPContext));
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
780
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
781 free(c);
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
782 }
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
783
7961
78e0f2776da7 cosmetics ;)
michael
parents: 7960
diff changeset
784 void pp_postprocess(uint8_t * src[3], int srcStride[3],
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
785 uint8_t * dst[3], int dstStride[3],
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
786 int width, int height,
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
787 QP_STORE_T *QP_store, int QPStride,
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
788 pp_mode_t *vm, void *vc, int pict_type)
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
789 {
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
790 int mbWidth = (width+15)>>4;
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
791 int mbHeight= (height+15)>>4;
8038
fe30880576dc cleanup
michael
parents: 8019
diff changeset
792 PPMode *mode = (PPMode*)vm;
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
793 PPContext *c = (PPContext*)vc;
8630
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
794 int minStride= MAX(srcStride[0], dstStride[0]);
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
795
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
796 if(c->stride < minStride)
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
797 reallocBuffers(c, width, height, minStride);
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
798
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
799
3964
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
800 if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
2808
a78ac799a300 QP_store==null bugfix and no opendivx bugfix
michael
parents: 2775
diff changeset
801 {
3964
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
802 int i;
8630
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
803 QP_store= c->forcedQPTable;
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
804 QPStride= 0;
3964
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
805 if(mode->lumMode & FORCE_QUANT)
8630
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
806 for(i=0; i<mbWidth; i++) QP_store[i]= mode->forcedQuant;
3964
4911e2fc554b -npp fq:<quantizer>
michael
parents: 3832
diff changeset
807 else
8630
11888c95481b buffer alloc cleanup / 10l
michael
parents: 8107
diff changeset
808 for(i=0; i<mbWidth; i++) QP_store[i]= 1;
2808
a78ac799a300 QP_store==null bugfix and no opendivx bugfix
michael
parents: 2775
diff changeset
809 }
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
810 if(0){
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
811 int x,y;
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
812 for(y=0; y<mbHeight; y++){
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
813 for(x=0; x<mbWidth; x++){
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
814 printf("%2d ", QP_store[x + y*QPStride]);
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
815 }
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
816 printf("\n");
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
817 }
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
818 printf("\n");
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
819 }
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
820 //printf("pict_type:%d\n", pict_type);
7968
michael
parents: 7963
diff changeset
821
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
822 if(pict_type!=3)
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
823 {
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
824 int x,y;
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
825 for(y=0; y<mbHeight; y++){
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
826 for(x=0; x<mbWidth; x++){
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
827 int qscale= QP_store[x + y*QPStride];
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
828 if(qscale&~31)
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
829 qscale=31;
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
830 c->nonBQPTable[y*mbWidth + x]= qscale;
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
831 }
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
832 }
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
833 }
2808
a78ac799a300 QP_store==null bugfix and no opendivx bugfix
michael
parents: 2775
diff changeset
834
7963
0a5d69e6f2a2 cleanup
michael
parents: 7961
diff changeset
835 if(verbose>2)
4143
d416ca893952 dont print -npp parser debug info if only -v
michael
parents: 3987
diff changeset
836 {
d416ca893952 dont print -npp parser debug info if only -v
michael
parents: 3987
diff changeset
837 printf("using npp filters 0x%X/0x%X\n", mode->lumMode, mode->chromMode);
d416ca893952 dont print -npp parser debug info if only -v
michael
parents: 3987
diff changeset
838 }
d416ca893952 dont print -npp parser debug info if only -v
michael
parents: 3987
diff changeset
839
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
840 postProcess(src[0], srcStride[0], dst[0], dstStride[0],
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
841 width, height, QP_store, QPStride, 0, mode, c);
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
842
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
843 width = (width +1)>>1;
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
844 height = (height+1)>>1;
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
845
3094
4150aff2ac17 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 3093
diff changeset
846 if(mode->chromMode)
4150aff2ac17 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 3093
diff changeset
847 {
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
848 postProcess(src[1], srcStride[1], dst[1], dstStride[1],
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
849 width, height, QP_store, QPStride, 1, mode, c);
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
850 postProcess(src[2], srcStride[2], dst[2], dstStride[2],
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
851 width, height, QP_store, QPStride, 2, mode, c);
3094
4150aff2ac17 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 3093
diff changeset
852 }
7946
f483ab704252 postprocessing cleanup:
michael
parents: 6164
diff changeset
853 else if(srcStride[1] == dstStride[1] && srcStride[2] == dstStride[2])
3094
4150aff2ac17 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 3093
diff changeset
854 {
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
855 memcpy(dst[1], src[1], srcStride[1]*height);
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
856 memcpy(dst[2], src[2], srcStride[2]*height);
3094
4150aff2ac17 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 3093
diff changeset
857 }
4150aff2ac17 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 3093
diff changeset
858 else
4150aff2ac17 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 3093
diff changeset
859 {
4150aff2ac17 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 3093
diff changeset
860 int y;
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
861 for(y=0; y<height; y++)
3094
4150aff2ac17 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 3093
diff changeset
862 {
7960
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
863 memcpy(&(dst[1][y*dstStride[1]]), &(src[1][y*srcStride[1]]), width);
0a4ab841ae29 better deblocking filter
michael
parents: 7946
diff changeset
864 memcpy(&(dst[2][y*dstStride[2]]), &(src[2][y*srcStride[2]]), width);
3094
4150aff2ac17 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 3093
diff changeset
865 }
4150aff2ac17 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 3093
diff changeset
866 }
2389
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
867 }
bd3f33e7dd26 auto brightness/ contrast bugfix
michael
parents: 2300
diff changeset
868