annotate libpostproc/postprocess.c @ 1080:a150aba978de libavcodec

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