annotate libpostproc/postprocess.c @ 1757:3906ddbaffec libavcodec

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