annotate libpostproc/postprocess.c @ 229:f418b5c5ff67 libavcodec

PATCH by Rik Snel <rsnel@cube.dyndns.org> this patch enhances the jpeg header writer. It can be asked to omit quantisation and huffman tables and it can write different horizontal and vertical sampling factors. (the last thing is useless for libavcodec itself (because libavcodec only handles YUV420P at ecoder level), but the values are initialized so that operation of libavcodec is not impaired)
author arpi_esp
date Sat, 09 Feb 2002 01:23:41 +0000
parents 80edc2aaff86
children b71190bacce8
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 /*
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
2 Copyright (C) 2001-2002 Michael Niedermayer (michaelni@gmx.at)
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
3
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
6 the Free Software Foundation; either version 2 of the License, or
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
7 (at your option) any later version.
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
8
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
12 GNU General Public License for more details.
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
13
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
15 along with this program; if not, write to the Free Software
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
17 */
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
18
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
19 /*
106
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
20 C MMX MMX2 3DNow
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
21 isVertDC Ec Ec
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
22 isVertMinMaxOk Ec Ec
106
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
23 doVertLowPass E e e
163
32e7f17a04a7 faster mmx2 / 3dnow deblocking filter
michael
parents: 158
diff changeset
24 doVertDefFilter Ec Ec e e
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
25 isHorizDC Ec Ec
128
e5266b8e79be much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 126
diff changeset
26 isHorizMinMaxOk a E
e5266b8e79be much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 126
diff changeset
27 doHorizLowPass E e e
163
32e7f17a04a7 faster mmx2 / 3dnow deblocking filter
michael
parents: 158
diff changeset
28 doHorizDefFilter Ec Ec e e
134
2c469e390117 dering in c
michael
parents: 133
diff changeset
29 deRing E e e*
106
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
30 Vertical RKAlgo1 E a a
129
be35346e27c1 fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 128
diff changeset
31 Horizontal RKAlgo1 a a
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
32 Vertical X1# a E E
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
33 Horizontal X1# a E E
111
8e4c5a16c9fc fixed the height%8!=0 bug
michael
parents: 109
diff changeset
34 LinIpolDeinterlace e E E*
8e4c5a16c9fc fixed the height%8!=0 bug
michael
parents: 109
diff changeset
35 CubicIpolDeinterlace a e e*
8e4c5a16c9fc fixed the height%8!=0 bug
michael
parents: 109
diff changeset
36 LinBlendDeinterlace e E E*
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
37 MedianDeinterlace# Ec Ec
157
bc12fd7e6153 temp denoiser changes: (a-b)^2 instead of |a-b| and MMX2/3DNOW version
michael
parents: 156
diff changeset
38 TempDeNoiser# E e e
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
39
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
40 * i dont have a 3dnow CPU -> its untested, but noone said it doesnt work so it seems to work
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
41 # more or less selfinvented filters so the exactness isnt too meaningfull
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
42 E = Exact implementation
111
8e4c5a16c9fc fixed the height%8!=0 bug
michael
parents: 109
diff changeset
43 e = allmost exact implementation (slightly different rounding,...)
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
44 a = alternative / approximate impl
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
45 c = checked against the other implementations (-vo md5)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
46 */
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
47
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
48 /*
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
49 TODO:
182
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
50 remove global/static vars
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
51 reduce the time wasted on the mem transfer
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
52 implement everything in C at least (done at the moment but ...)
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
53 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
54 we use 8x8 blocks for the horizontal filters, opendivx seems to use 8x4?
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
55 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
56 write a faster and higher quality deblocking filter :)
97
e57b1d38d71f bugfixes: last 3 lines not brightness/contrast corrected
michael
parents: 96
diff changeset
57 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
58 (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
59 compare the quality & speed of all filters
4f072fa99ccf fixed a rounding bug thing in the X1 Filter
michael
parents: 98
diff changeset
60 split this huge file
129
be35346e27c1 fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 128
diff changeset
61 border remover
140
52ed0baddd56 minor speedup
michael
parents: 135
diff changeset
62 optimize c versions
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
63 try to unroll inner for(x=0 ... loop to avoid these damn if(x ... checks
157
bc12fd7e6153 temp denoiser changes: (a-b)^2 instead of |a-b| and MMX2/3DNOW version
michael
parents: 156
diff changeset
64 smart blur
167
2d97f0157a79 faster dering
michael
parents: 166
diff changeset
65 commandline option for the deblock / dering thresholds
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
66 put fastmemcpy back
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
67 dont use #ifdef ARCH_X86 for the asm stuff ... cross compilers? (note cpudetect uses ARCH_X86)
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
68 ...
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
69 */
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
70
107
bd163e13a0fb minor cleanups
michael
parents: 106
diff changeset
71 //Changelog: use the CVS log
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
72
150
668dda5ef46d added missing #include <malloc.h>
pl
parents: 149
diff changeset
73 #include "../config.h"
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
74 #include <inttypes.h>
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
75 #include <stdio.h>
97
e57b1d38d71f bugfixes: last 3 lines not brightness/contrast corrected
michael
parents: 96
diff changeset
76 #include <stdlib.h>
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
77 #include <string.h>
212
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
78 #include <errno.h>
133
e0bf2e9ce24c a few warning fixes (missing #include's)
pl
parents: 132
diff changeset
79 #ifdef HAVE_MALLOC_H
e0bf2e9ce24c a few warning fixes (missing #include's)
pl
parents: 132
diff changeset
80 #include <malloc.h>
e0bf2e9ce24c a few warning fixes (missing #include's)
pl
parents: 132
diff changeset
81 #endif
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
82 //#undef HAVE_MMX2
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
83 //#define HAVE_3DNOW
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
84 //#undef HAVE_MMX
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
85 //#undef ARCH_X86
163
32e7f17a04a7 faster mmx2 / 3dnow deblocking filter
michael
parents: 158
diff changeset
86 //#define DEBUG_BRIGHTNESS
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
87 //#include "../libvo/fastmemcpy.h"
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
88 #include "postprocess.h"
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
89 #include "../cpudetect.h"
210
c2b6d68a0671 mangle for win32 in postproc
atmos4
parents: 202
diff changeset
90 #include "../mangle.h"
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
91
104
9607b48e2c2d Cleanup:
arpi
parents: 102
diff changeset
92 #define MIN(a,b) ((a) > (b) ? (b) : (a))
9607b48e2c2d Cleanup:
arpi
parents: 102
diff changeset
93 #define MAX(a,b) ((a) < (b) ? (b) : (a))
9607b48e2c2d Cleanup:
arpi
parents: 102
diff changeset
94 #define ABS(a) ((a) > 0 ? (a) : (-(a)))
9607b48e2c2d Cleanup:
arpi
parents: 102
diff changeset
95 #define SIGN(a) ((a) > 0 ? 1 : -1)
9607b48e2c2d Cleanup:
arpi
parents: 102
diff changeset
96
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
97 #define GET_MODE_BUFFER_SIZE 500
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
98 #define OPTIONS_ARRAY_SIZE 10
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
99
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
100 #ifdef ARCH_X86
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
101 #define CAN_COMPILE_X86_ASM
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
102 #endif
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
103
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
104 #ifdef CAN_COMPILE_X86_ASM
149
3fc494e92f0d gcc does optimize writes to non volatile variables away if it didnt know that they were read in between
michael
parents: 148
diff changeset
105 static volatile uint64_t __attribute__((aligned(8))) packedYOffset= 0x0000000000000000LL;
3fc494e92f0d gcc does optimize writes to non volatile variables away if it didnt know that they were read in between
michael
parents: 148
diff changeset
106 static volatile uint64_t __attribute__((aligned(8))) packedYScale= 0x0100010001000100LL;
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))) w1400= 0x1400140014001400LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
110 static uint64_t __attribute__((aligned(8))) bm00000001= 0x00000000000000FFLL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
111 static uint64_t __attribute__((aligned(8))) bm00010000= 0x000000FF00000000LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
112 static uint64_t __attribute__((aligned(8))) bm00001000= 0x00000000FF000000LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
113 static uint64_t __attribute__((aligned(8))) bm10000000= 0xFF00000000000000LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
114 static uint64_t __attribute__((aligned(8))) bm10000001= 0xFF000000000000FFLL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
115 static uint64_t __attribute__((aligned(8))) bm11000011= 0xFFFF00000000FFFFLL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
116 static uint64_t __attribute__((aligned(8))) bm00000011= 0x000000000000FFFFLL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
117 static uint64_t __attribute__((aligned(8))) bm11111110= 0xFFFFFFFFFFFFFF00LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
118 static uint64_t __attribute__((aligned(8))) bm11000000= 0xFFFF000000000000LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
119 static uint64_t __attribute__((aligned(8))) bm00011000= 0x000000FFFF000000LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
120 static uint64_t __attribute__((aligned(8))) bm00110011= 0x0000FFFF0000FFFFLL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
121 static uint64_t __attribute__((aligned(8))) bm11001100= 0xFFFF0000FFFF0000LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
122 static uint64_t __attribute__((aligned(8))) b00= 0x0000000000000000LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
123 static uint64_t __attribute__((aligned(8))) b01= 0x0101010101010101LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
124 static uint64_t __attribute__((aligned(8))) b02= 0x0202020202020202LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
125 static uint64_t __attribute__((aligned(8))) b0F= 0x0F0F0F0F0F0F0F0FLL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
126 static uint64_t __attribute__((aligned(8))) b04= 0x0404040404040404LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
127 static uint64_t __attribute__((aligned(8))) b08= 0x0808080808080808LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
128 static uint64_t __attribute__((aligned(8))) bFF= 0xFFFFFFFFFFFFFFFFLL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
129 static uint64_t __attribute__((aligned(8))) b20= 0x2020202020202020LL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
130 static uint64_t __attribute__((aligned(8))) b80= 0x8080808080808080LL;
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
131 static uint64_t __attribute__((aligned(8))) mmxDCOffset= 0x7E7E7E7E7E7E7E7ELL;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
132 static uint64_t __attribute__((aligned(8))) mmxDCThreshold= 0x7C7C7C7C7C7C7C7CLL;
148
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
133 static uint64_t __attribute__((aligned(8))) b3F= 0x3F3F3F3F3F3F3F3FLL;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
134 static uint64_t __attribute__((aligned(8))) temp0=0;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
135 static uint64_t __attribute__((aligned(8))) temp1=0;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
136 static uint64_t __attribute__((aligned(8))) temp2=0;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
137 static uint64_t __attribute__((aligned(8))) temp3=0;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
138 static uint64_t __attribute__((aligned(8))) temp4=0;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
139 static uint64_t __attribute__((aligned(8))) temp5=0;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
140 static uint64_t __attribute__((aligned(8))) pQPb=0;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
141 static uint64_t __attribute__((aligned(8))) pQPb2=0;
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
142 static uint8_t __attribute__((aligned(8))) tempBlocks[8*16*2]; //used for the horizontal code
158
d1a4f4ca7178 temp denoiser:
michael
parents: 157
diff changeset
143 static uint32_t __attribute__((aligned(4))) maxTmpNoise[4];
148
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
144 #else
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
145 static uint64_t packedYOffset= 0x0000000000000000LL;
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
146 static uint64_t packedYScale= 0x0100010001000100LL;
148
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
147 #endif
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
148
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
149 extern int divx_quality;
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
150 int newPPFlag=0; //is set if -npp is used
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
151 struct PPMode gPPMode[GET_PP_QUALITY_MAX+1];
212
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
152 static int firstTime = 0, firstTime2 = 0;
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
153
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
154 extern int verbose;
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
155
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
156 int hFlatnessThreshold= 56 - 16;
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
157 int vFlatnessThreshold= 56 - 16;
167
2d97f0157a79 faster dering
michael
parents: 166
diff changeset
158 int deringThreshold= 20;
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
159
182
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
160 static int dcOffset;
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
161 static int dcThreshold;
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
162
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
163 //amount of "black" u r willing to loose to get a brightness corrected picture
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
164 double maxClippedThreshold= 0.01;
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
165
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
166 static struct PPFilter filters[]=
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
167 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
168 {"hb", "hdeblock", 1, 1, 3, H_DEBLOCK},
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
169 {"vb", "vdeblock", 1, 2, 4, V_DEBLOCK},
180
michael
parents: 179
diff changeset
170 {"hr", "rkhdeblock", 1, 1, 3, H_RK1_FILTER},
michael
parents: 179
diff changeset
171 {"vr", "rkvdeblock", 1, 2, 4, V_RK1_FILTER},
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
172 {"h1", "x1hdeblock", 1, 1, 3, H_X1_FILTER},
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
173 {"v1", "x1vdeblock", 1, 2, 4, V_X1_FILTER},
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
174 {"dr", "dering", 1, 5, 6, DERING},
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
175 {"al", "autolevels", 0, 1, 2, LEVEL_FIX},
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
176 {"lb", "linblenddeint", 1, 1, 4, LINEAR_BLEND_DEINT_FILTER},
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
177 {"li", "linipoldeint", 1, 1, 4, LINEAR_IPOL_DEINT_FILTER},
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
178 {"ci", "cubicipoldeint", 1, 1, 4, CUBIC_IPOL_DEINT_FILTER},
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
179 {"md", "mediandeint", 1, 1, 4, MEDIAN_DEINT_FILTER},
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
180 {"tn", "tmpnoise", 1, 7, 8, TEMP_NOISE_FILTER},
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
181 {"fq", "forcequant", 1, 0, 0, FORCE_QUANT},
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
182 {NULL, NULL,0,0,0,0} //End Marker
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
183 };
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
184
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
185 static char *replaceTable[]=
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
186 {
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
187 "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
188 "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
189 "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
190 "fa", "x1hdeblock:a,x1vdeblock:a,dering:a,autolevels,tmpnoise:a:150:200:400",
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
191 NULL //End Marker
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
192 };
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
193
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
194 #ifdef CAN_COMPILE_X86_ASM
129
be35346e27c1 fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 128
diff changeset
195 static inline void unusedVariableWarningFixer()
be35346e27c1 fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 128
diff changeset
196 {
be35346e27c1 fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 128
diff changeset
197 if(
be35346e27c1 fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 128
diff changeset
198 packedYOffset + packedYScale + w05 + w20 + w1400 + bm00000001 + bm00010000
be35346e27c1 fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 128
diff changeset
199 + bm00001000 + bm10000000 + bm10000001 + bm11000011 + bm00000011 + bm11111110
be35346e27c1 fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 128
diff changeset
200 + bm11000000 + bm00011000 + bm00110011 + bm11001100 + b00 + b01 + b02 + b0F
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
201 + bFF + b20 + b04+ b08 + pQPb2 + b80 + mmxDCOffset + mmxDCThreshold + b3F + temp0 + temp1 + temp2 + temp3 + temp4
129
be35346e27c1 fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 128
diff changeset
202 + temp5 + pQPb== 0) b00=0;
be35346e27c1 fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 128
diff changeset
203 }
148
1cfc4d567c0a minor changes (fixed some warnings, added attribute aligned(8) stuff)
michael
parents: 142
diff changeset
204 #endif
129
be35346e27c1 fixed difference with -vo md5 between doVertDefFilter() C and MMX / MMX2 versions
michael
parents: 128
diff changeset
205
107
bd163e13a0fb minor cleanups
michael
parents: 106
diff changeset
206 #ifdef TIMING
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
207 static inline long long rdtsc()
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
208 {
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
209 long long l;
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
210 asm volatile( "rdtsc\n\t"
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
211 : "=A" (l)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
212 );
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
213 // printf("%d\n", int(l/1000));
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
214 return l;
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
215 }
102
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
216 #endif
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
217
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
218 #ifdef CAN_COMPILE_X86_ASM
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
219 static inline void prefetchnta(void *p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
220 {
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
221 asm volatile( "prefetchnta (%0)\n\t"
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
222 : : "r" (p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
223 );
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
224 }
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
225
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
226 static inline void prefetcht0(void *p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
227 {
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
228 asm volatile( "prefetcht0 (%0)\n\t"
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
229 : : "r" (p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
230 );
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
231 }
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
232
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
233 static inline void prefetcht1(void *p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
234 {
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
235 asm volatile( "prefetcht1 (%0)\n\t"
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
236 : : "r" (p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
237 );
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
238 }
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
239
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
240 static inline void prefetcht2(void *p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
241 {
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
242 asm volatile( "prefetcht2 (%0)\n\t"
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
243 : : "r" (p)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
244 );
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
245 }
102
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
246 #endif
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
247
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
248 // 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
249
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
250 /**
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
251 * Check if the given 8x8 Block is mostly "flat"
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
252 */
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
253 static inline int isHorizDC(uint8_t src[], int stride)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
254 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
255 int numEq= 0;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
256 int y;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
257 for(y=0; y<BLOCK_SIZE; y++)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
258 {
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
259 if(((src[0] - src[1] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
260 if(((src[1] - src[2] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
261 if(((src[2] - src[3] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
262 if(((src[3] - src[4] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
263 if(((src[4] - src[5] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
264 if(((src[5] - src[6] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
265 if(((src[6] - src[7] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
165
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
266 src+= stride;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
267 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
268 return numEq > hFlatnessThreshold;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
269 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
270
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
271 static inline int isHorizMinMaxOk(uint8_t src[], int stride, int QP)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
272 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
273 if(abs(src[0] - src[7]) > 2*QP) return 0;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
274
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
275 return 1;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
276 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
277
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
278 static inline void doHorizDefFilter(uint8_t dst[], int stride, int QP)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
279 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
280 int y;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
281 for(y=0; y<BLOCK_SIZE; y++)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
282 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
283 const int middleEnergy= 5*(dst[4] - dst[5]) + 2*(dst[2] - dst[5]);
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
284
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
285 if(ABS(middleEnergy) < 8*QP)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
286 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
287 const int q=(dst[3] - dst[4])/2;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
288 const int leftEnergy= 5*(dst[2] - dst[1]) + 2*(dst[0] - dst[3]);
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
289 const int rightEnergy= 5*(dst[6] - dst[5]) + 2*(dst[4] - dst[7]);
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
290
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
291 int d= ABS(middleEnergy) - MIN( ABS(leftEnergy), ABS(rightEnergy) );
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
292 d= MAX(d, 0);
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
293
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
294 d= (5*d + 32) >> 6;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
295 d*= SIGN(-middleEnergy);
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
296
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
297 if(q>0)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
298 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
299 d= d<0 ? 0 : d;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
300 d= d>q ? q : d;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
301 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
302 else
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
303 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
304 d= d>0 ? 0 : d;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
305 d= d<q ? q : d;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
306 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
307
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
308 dst[3]-= d;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
309 dst[4]+= d;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
310 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
311 dst+= stride;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
312 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
313 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
314
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
315 /**
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
316 * 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
317 * 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
318 */
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
319 static inline void doHorizLowPass(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
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
322 int y;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
323 for(y=0; y<BLOCK_SIZE; y++)
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
324 {
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
325 const int first= ABS(dst[-1] - dst[0]) < QP ? dst[-1] : dst[0];
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
326 const int last= ABS(dst[8] - dst[7]) < QP ? dst[8] : dst[7];
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
327
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
328 int sums[9];
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
329 sums[0] = first + dst[0];
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
330 sums[1] = dst[0] + dst[1];
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
331 sums[2] = dst[1] + dst[2];
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
332 sums[3] = dst[2] + dst[3];
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
333 sums[4] = dst[3] + dst[4];
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
334 sums[5] = dst[4] + dst[5];
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
335 sums[6] = dst[5] + dst[6];
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
336 sums[7] = dst[6] + dst[7];
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
337 sums[8] = dst[7] + last;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
338
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
339 dst[0]= ((sums[0]<<2) + ((first + sums[2])<<1) + sums[4] + 8)>>4;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
340 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
341 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
342 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
343 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
344 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
345 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
346 dst[7]= ((sums[8]<<2) + ((last + sums[6])<<1) + sums[4] + 8)>>4;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
347
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
348 dst+= stride;
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
349 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
350 }
ea3b49451497 oops, too much cleanup ;)
michael
parents: 164
diff changeset
351
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
352 /**
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
353 * Experimental Filter 1 (Horizontal)
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
354 * will not damage linear gradients
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
355 * 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
356 * 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
357 * MMX2 version does correct clipping C version doesnt
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
358 * not identical with the vertical one
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
359 */
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
360 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
361 {
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
362 int y;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
363 static uint64_t *lut= NULL;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
364 if(lut==NULL)
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
365 {
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
366 int i;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
367 lut= (uint64_t*)memalign(8, 256*8);
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
368 for(i=0; i<256; i++)
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
369 {
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
370 int v= i < 128 ? 2*i : 2*(i-256);
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
371 /*
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
372 //Simulate 112242211 9-Tap filter
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
373 uint64_t a= (v/16) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
374 uint64_t b= (v/8) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
375 uint64_t c= (v/4) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
376 uint64_t d= (3*v/8) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
377 */
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
378 //Simulate piecewise linear interpolation
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
379 uint64_t a= (v/16) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
380 uint64_t b= (v*3/16) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
381 uint64_t c= (v*5/16) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
382 uint64_t d= (7*v/16) & 0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
383 uint64_t A= (0x100 - a)&0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
384 uint64_t B= (0x100 - b)&0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
385 uint64_t C= (0x100 - c)&0xFF;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
386 uint64_t D= (0x100 - c)&0xFF;
130
0cce5d30d1d8 dering in mmx2
michael
parents: 129
diff changeset
387
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
388 lut[i] = (a<<56) | (b<<48) | (c<<40) | (d<<32) |
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
389 (D<<24) | (C<<16) | (B<<8) | (A);
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
390 //lut[i] = (v<<32) | (v<<24);
134
2c469e390117 dering in c
michael
parents: 133
diff changeset
391 }
2c469e390117 dering in c
michael
parents: 133
diff changeset
392 }
2c469e390117 dering in c
michael
parents: 133
diff changeset
393
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
394 for(y=0; y<BLOCK_SIZE; y++)
134
2c469e390117 dering in c
michael
parents: 133
diff changeset
395 {
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
396 int a= src[1] - src[2];
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
397 int b= src[3] - src[4];
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
398 int c= src[5] - src[6];
134
2c469e390117 dering in c
michael
parents: 133
diff changeset
399
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
400 int d= MAX(ABS(b) - (ABS(a) + ABS(c))/2, 0);
167
2d97f0157a79 faster dering
michael
parents: 166
diff changeset
401
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
402 if(d < QP)
167
2d97f0157a79 faster dering
michael
parents: 166
diff changeset
403 {
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
404 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
405
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
406 src[1] +=v/8;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
407 src[2] +=v/4;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
408 src[3] +=3*v/8;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
409 src[4] -=3*v/8;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
410 src[5] -=v/4;
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
411 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
412
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
413 }
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
414 src+=stride;
106
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
415 }
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
416 }
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
417
389391a6d0bf rewrote the horizontal lowpass filter to fix a bug which caused a blocky look
michael
parents: 105
diff changeset
418
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
419 //Note: we have C, MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
420 //Plain C versions
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
421 #if !defined (HAVE_MMX) || defined (RUNTIME_CPUDETECT)
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
422 #define COMPILE_C
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
423 #endif
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
424
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
425 #ifdef CAN_COMPILE_X86_ASM
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
426
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
427 #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
428 #define COMPILE_MMX
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
429 #endif
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
430
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
431 #if defined (HAVE_MMX2) || defined (RUNTIME_CPUDETECT)
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
432 #define COMPILE_MMX2
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
433 #endif
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
434
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
435 #if (defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
436 #define COMPILE_3DNOW
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
437 #endif
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
438 #endif //CAN_COMPILE_X86_ASM
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
439
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
440 #undef HAVE_MMX
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
441 #undef HAVE_MMX2
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
442 #undef HAVE_3DNOW
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
443 #undef ARCH_X86
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
444
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
445 #ifdef COMPILE_C
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
446 #undef HAVE_MMX
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
447 #undef HAVE_MMX2
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
448 #undef HAVE_3DNOW
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
449 #undef ARCH_X86
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
450 #define RENAME(a) a ## _C
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
451 #include "postprocess_template.c"
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
452 #endif
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 //MMX versions
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
455 #ifdef COMPILE_MMX
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
456 #undef RENAME
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
457 #define HAVE_MMX
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
458 #undef HAVE_MMX2
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
459 #undef HAVE_3DNOW
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
460 #define ARCH_X86
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
461 #define RENAME(a) a ## _MMX
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
462 #include "postprocess_template.c"
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
463 #endif
128
e5266b8e79be much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 126
diff changeset
464
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
465 //MMX2 versions
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
466 #ifdef COMPILE_MMX2
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
467 #undef RENAME
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
468 #define HAVE_MMX
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
469 #define HAVE_MMX2
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
470 #undef HAVE_3DNOW
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
471 #define ARCH_X86
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
472 #define RENAME(a) a ## _MMX2
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
473 #include "postprocess_template.c"
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
474 #endif
128
e5266b8e79be much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 126
diff changeset
475
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
476 //3DNOW versions
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
477 #ifdef COMPILE_3DNOW
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
478 #undef RENAME
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
479 #define HAVE_MMX
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
480 #undef HAVE_MMX2
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
481 #define HAVE_3DNOW
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
482 #define ARCH_X86
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
483 #define RENAME(a) a ## _3DNow
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
484 #include "postprocess_template.c"
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
485 #endif
128
e5266b8e79be much better horizontal filters (transpose & use the vertical ones) :)
michael
parents: 126
diff changeset
486
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
487 // 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
488
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
489 static inline 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
490 QP_STORE_T QPs[], int QPStride, int isColor, struct PPMode *ppMode)
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
491 {
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
492 // useing ifs here as they are faster than function pointers allthough the
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
493 // difference wouldnt be messureable here but its much better because
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
494 // someone might exchange the cpu whithout restarting mplayer ;)
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
495 #ifdef RUNTIME_CPUDETECT
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
496 #ifdef CAN_COMPILE_X86_ASM
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
497 // ordered per speed fasterst first
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
498 if(gCpuCaps.hasMMX2)
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
499 postProcess_MMX2(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, ppMode);
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
500 else if(gCpuCaps.has3DNow)
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
501 postProcess_3DNow(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, ppMode);
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
502 else if(gCpuCaps.hasMMX)
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
503 postProcess_MMX(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, ppMode);
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
504 else
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
505 postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, ppMode);
157
bc12fd7e6153 temp denoiser changes: (a-b)^2 instead of |a-b| and MMX2/3DNOW version
michael
parents: 156
diff changeset
506 #else
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
507 postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, ppMode);
157
bc12fd7e6153 temp denoiser changes: (a-b)^2 instead of |a-b| and MMX2/3DNOW version
michael
parents: 156
diff changeset
508 #endif
171
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
509 #else //RUNTIME_CPUDETECT
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
510 #ifdef HAVE_MMX2
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
511 postProcess_MMX2(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, ppMode);
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
512 #elif defined (HAVE_3DNOW)
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
513 postProcess_3DNow(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, ppMode);
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
514 #elif defined (HAVE_MMX)
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
515 postProcess_MMX(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, ppMode);
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
516 #else
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
517 postProcess_C(src, srcStride, dst, dstStride, width, height, QPs, QPStride, isColor, ppMode);
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
518 #endif
fa9734559c98 runtime cpu detect optional (compiles faster)
michael
parents: 169
diff changeset
519 #endif //!RUNTIME_CPUDETECT
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
520 }
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
521
102
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
522 #ifdef HAVE_ODIVX_POSTPROCESS
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
523 #include "../opendivx/postprocess.h"
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
524 int use_old_pp=0;
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
525 #endif
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
526
169
20bcd5b70886 runtime cpu detection
michael
parents: 168
diff changeset
527 //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
528 // 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
529
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
530 /* -pp Command line Help
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
531 NOTE/FIXME: put this at an appropriate place (--help, html docs, man mplayer)?
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
532 */
184
69d105cc6158 -npp help
michael
parents: 183
diff changeset
533 char *help=
69d105cc6158 -npp help
michael
parents: 183
diff changeset
534 "-npp <filterName>[:<option>[:<option>...]][,[-]<filterName>[:<option>...]]...\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
535 "long form example:\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
536 "-npp vdeblock:autoq,hdeblock:autoq,linblenddeint -npp default,-vdeblock\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
537 "short form example:\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
538 "-npp vb:a,hb:a,lb -npp de,-vb\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
539 "more examples:\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
540 "-npp tn:64:128:256\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
541 "Filters Options\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
542 "short long name short long option Description\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
543 "* * a autoq cpu power dependant enabler\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
544 " c chrom chrominance filtring enabled\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
545 " y nochrom chrominance filtring disabled\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
546 "hb hdeblock (2 Threshold) horizontal deblocking filter\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
547 " 1. Threshold: default=1, higher -> more deblocking\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
548 " 2. Threshold: default=40, lower -> more deblocking\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
549 " the h & v deblocking filters share these\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
550 " so u cant set different thresholds for h / v\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
551 "vb vdeblock (2 Threshold) vertical deblocking filter\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
552 "hr rkhdeblock\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
553 "vr rkvdeblock\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
554 "h1 x1hdeblock Experimental h deblock filter 1\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
555 "v1 x1vdeblock Experimental v deblock filter 1\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
556 "dr dering Deringing filter\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
557 "al autolevels automatic brightness / contrast\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
558 " f fullyrange stretch luminance to (0..255)\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
559 "lb linblenddeint linear blend deinterlacer\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
560 "li linipoldeint linear interpolating deinterlace\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
561 "ci cubicipoldeint cubic interpolating deinterlacer\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
562 "md mediandeint median deinterlacer\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
563 "de default hb:a,vb:a,dr:a,al\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
564 "fa fast h1:a,v1:a,dr:a,al\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
565 "tn tmpnoise (3 Thresholds) Temporal Noise Reducer\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
566 " 1. <= 2. <= 3. larger -> stronger filtering\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
567 "fq forceQuant <quantizer> Force quantizer\n"
69d105cc6158 -npp help
michael
parents: 183
diff changeset
568 ;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
569
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
570 /**
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
571 * returns a PPMode struct which will have a non 0 error variable if an error occured
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
572 * name is the string after "-pp" on the command line
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
573 * quality is a number from 0 to GET_PP_QUALITY_MAX
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
574 */
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
575 struct PPMode getPPModeByNameAndQuality(char *name, int quality)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
576 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
577 char temp[GET_MODE_BUFFER_SIZE];
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
578 char *p= temp;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
579 char *filterDelimiters= ",";
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
580 char *optionDelimiters= ":";
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
581 struct PPMode ppMode= {0,0,0,0,0,0,{150,200,400}};
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
582 char *filterToken;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
583
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
584 strncpy(temp, name, GET_MODE_BUFFER_SIZE);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
585
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
586 if(verbose>1) printf("pp: %s\n", name);
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
587
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
588 for(;;){
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
589 char *filterName;
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
590 int q= 1000000; //GET_PP_QUALITY_MAX;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
591 int chrom=-1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
592 char *option;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
593 char *options[OPTIONS_ARRAY_SIZE];
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
594 int i;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
595 int filterNameOk=0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
596 int numOfUnknownOptions=0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
597 int enable=1; //does the user want us to enabled or disabled the filter
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
598
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
599 filterToken= strtok(p, filterDelimiters);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
600 if(filterToken == NULL) break;
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
601 p+= strlen(filterToken) + 1; // p points to next filterToken
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
602 filterName= strtok(filterToken, optionDelimiters);
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
603 if(verbose>1) printf("pp: %s::%s\n", filterToken, filterName);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
604
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
605 if(*filterName == '-')
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
606 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
607 enable=0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
608 filterName++;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
609 }
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
610
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
611 for(;;){ //for all options
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
612 option= strtok(NULL, optionDelimiters);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
613 if(option == NULL) break;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
614
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
615 if(verbose>1) printf("pp: option: %s\n", option);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
616 if(!strcmp("autoq", option) || !strcmp("a", option)) q= quality;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
617 else if(!strcmp("nochrom", option) || !strcmp("y", option)) chrom=0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
618 else if(!strcmp("chrom", option) || !strcmp("c", option)) chrom=1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
619 else
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
620 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
621 options[numOfUnknownOptions] = option;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
622 numOfUnknownOptions++;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
623 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
624 if(numOfUnknownOptions >= OPTIONS_ARRAY_SIZE-1) break;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
625 }
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
626 options[numOfUnknownOptions] = NULL;
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
627
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
628 /* replace stuff from the replace Table */
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
629 for(i=0; replaceTable[2*i]!=NULL; i++)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
630 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
631 if(!strcmp(replaceTable[2*i], filterName))
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
632 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
633 int newlen= strlen(replaceTable[2*i + 1]);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
634 int plen;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
635 int spaceLeft;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
636
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
637 if(p==NULL) p= temp, *p=0; //last filter
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
638 else p--, *p=','; //not last filter
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
639
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
640 plen= strlen(p);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
641 spaceLeft= (int)p - (int)temp + plen;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
642 if(spaceLeft + newlen >= GET_MODE_BUFFER_SIZE)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
643 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
644 ppMode.error++;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
645 break;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
646 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
647 memmove(p + newlen, p, plen+1);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
648 memcpy(p, replaceTable[2*i + 1], newlen);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
649 filterNameOk=1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
650 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
651 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
652
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
653 for(i=0; filters[i].shortName!=NULL; i++)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
654 {
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
655 // printf("Compareing %s, %s, %s\n", filters[i].shortName,filters[i].longName, filterName);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
656 if( !strcmp(filters[i].longName, filterName)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
657 || !strcmp(filters[i].shortName, filterName))
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
658 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
659 ppMode.lumMode &= ~filters[i].mask;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
660 ppMode.chromMode &= ~filters[i].mask;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
661
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
662 filterNameOk=1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
663 if(!enable) break; // user wants to disable it
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
664
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
665 if(q >= filters[i].minLumQuality)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
666 ppMode.lumMode|= filters[i].mask;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
667 if(chrom==1 || (chrom==-1 && filters[i].chromDefault))
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
668 if(q >= filters[i].minChromQuality)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
669 ppMode.chromMode|= filters[i].mask;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
670
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
671 if(filters[i].mask == LEVEL_FIX)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
672 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
673 int o;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
674 ppMode.minAllowedY= 16;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
675 ppMode.maxAllowedY= 234;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
676 for(o=0; options[o]!=NULL; o++)
182
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
677 {
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
678 if( !strcmp(options[o],"fullyrange")
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
679 ||!strcmp(options[o],"f"))
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
680 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
681 ppMode.minAllowedY= 0;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
682 ppMode.maxAllowedY= 255;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
683 numOfUnknownOptions--;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
684 }
182
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
685 }
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
686 }
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
687 else if(filters[i].mask == TEMP_NOISE_FILTER)
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
688 {
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
689 int o;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
690 int numOfNoises=0;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
691 ppMode.maxTmpNoise[0]= 150;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
692 ppMode.maxTmpNoise[1]= 200;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
693 ppMode.maxTmpNoise[2]= 400;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
694
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
695 for(o=0; options[o]!=NULL; o++)
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
696 {
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
697 char *tail;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
698 ppMode.maxTmpNoise[numOfNoises]=
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
699 strtol(options[o], &tail, 0);
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
700 if(tail!=options[o])
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
701 {
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
702 numOfNoises++;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
703 numOfUnknownOptions--;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
704 if(numOfNoises >= 3) break;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
705 }
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
706 }
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
707 }
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
708 else if(filters[i].mask == V_DEBLOCK || filters[i].mask == H_DEBLOCK)
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
709 {
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
710 int o;
182
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
711 ppMode.maxDcDiff=1;
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
712 // hFlatnessThreshold= 40;
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
713 // vFlatnessThreshold= 40;
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
714
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
715 for(o=0; options[o]!=NULL && o<2; o++)
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
716 {
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
717 char *tail;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
718 int val= strtol(options[o], &tail, 0);
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
719 if(tail==options[o]) break;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
720
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
721 numOfUnknownOptions--;
182
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
722 if(o==0) ppMode.maxDcDiff= val;
181
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
723 else hFlatnessThreshold=
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
724 vFlatnessThreshold= val;
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
725 }
edc5f6cf1855 customizeable deblocking (2 thresholds)
michael
parents: 180
diff changeset
726 }
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
727 else if(filters[i].mask == FORCE_QUANT)
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
728 {
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
729 int o;
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
730 ppMode.forcedQuant= 15;
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
731
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
732 for(o=0; options[o]!=NULL && o<1; o++)
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
733 {
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
734 char *tail;
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
735 int val= strtol(options[o], &tail, 0);
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
736 if(tail==options[o]) break;
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
737
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
738 numOfUnknownOptions--;
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
739 ppMode.forcedQuant= val;
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
740 }
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
741 }
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
742 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
743 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
744 if(!filterNameOk) ppMode.error++;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
745 ppMode.error += numOfUnknownOptions;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
746 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
747
152
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
748 #ifdef HAVE_ODIVX_POSTPROCESS
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
749 if(ppMode.lumMode & H_DEBLOCK) ppMode.oldMode |= PP_DEBLOCK_Y_H;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
750 if(ppMode.lumMode & V_DEBLOCK) ppMode.oldMode |= PP_DEBLOCK_Y_V;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
751 if(ppMode.chromMode & H_DEBLOCK) ppMode.oldMode |= PP_DEBLOCK_C_H;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
752 if(ppMode.chromMode & V_DEBLOCK) ppMode.oldMode |= PP_DEBLOCK_C_V;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
753 if(ppMode.lumMode & DERING) ppMode.oldMode |= PP_DERING_Y;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
754 if(ppMode.chromMode & DERING) ppMode.oldMode |= PP_DERING_C;
152
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
755 #endif
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
756
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
757 if(verbose>1) printf("pp: lumMode=%X, chromMode=%X\n", ppMode.lumMode, ppMode.chromMode);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
758 return ppMode;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
759 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
760
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
761 /**
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
762 * Check and load the -npp part of the cmd line
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
763 */
212
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
764 int readNPPOpt(void *conf, char *arg)
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
765 {
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
766 int quality;
185
8fceccef5804 fixed -npp help ... i think i need more sleep ;)
michael
parents: 184
diff changeset
767
8fceccef5804 fixed -npp help ... i think i need more sleep ;)
michael
parents: 184
diff changeset
768 if(!strcmp("help", arg))
8fceccef5804 fixed -npp help ... i think i need more sleep ;)
michael
parents: 184
diff changeset
769 {
8fceccef5804 fixed -npp help ... i think i need more sleep ;)
michael
parents: 184
diff changeset
770 printf("%s", help);
8fceccef5804 fixed -npp help ... i think i need more sleep ;)
michael
parents: 184
diff changeset
771 exit(1);
8fceccef5804 fixed -npp help ... i think i need more sleep ;)
michael
parents: 184
diff changeset
772 }
8fceccef5804 fixed -npp help ... i think i need more sleep ;)
michael
parents: 184
diff changeset
773
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
774 for(quality=0; quality<GET_PP_QUALITY_MAX+1; quality++)
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
775 {
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
776 gPPMode[quality]= getPPModeByNameAndQuality(arg, quality);
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
777
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
778 if(gPPMode[quality].error) return -1;
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
779 }
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
780 newPPFlag=1;
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
781
180
michael
parents: 179
diff changeset
782 //divx_quality is passed to postprocess if autoq if off
212
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
783 divx_quality= GET_PP_QUALITY_MAX;
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
784 firstTime = firstTime2 = 1;
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
785 return 1;
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
786 }
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
787
212
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
788 int readPPOpt(void *conf, char *arg)
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
789 {
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
790 int val;
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
791
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
792 if(arg == NULL)
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
793 return -2; // ERR_MISSING_PARAM
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
794 errno = 0;
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
795 val = (int)strtol(arg,NULL,0);
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
796 if(errno != 0)
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
797 return -4; // What about include cfgparser.h and use ERR_* defines */
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
798 if(val < 0)
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
799 return -3; // ERR_OUT_OF_RANGE
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
800
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
801 divx_quality = val;
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
802 firstTime = firstTime2 = 1;
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
803
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
804 return 1;
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
805 }
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
806
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
807 void revertPPOpt(void *conf, char* opt)
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
808 {
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
809 newPPFlag=0;
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
810 divx_quality=0;
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
811 }
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
812
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
813
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
814 /**
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
815 * Obsolete, dont use it, use postprocess2() instead
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
816 * this will check newPPFlag automatically and use postprocess2 if it is set
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
817 * mode = quality if newPPFlag
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
818 */
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
819 void postprocess(unsigned char * src[], int src_stride,
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
820 unsigned char * dst[], int dst_stride,
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
821 int horizontal_size, int vertical_size,
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
822 QP_STORE_T *QP_store, int QP_stride,
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
823 int mode)
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
824 {
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
825 struct PPMode ppMode;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
826 static QP_STORE_T zeroArray[2048/8];
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
827
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
828 if(newPPFlag)
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
829 {
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
830 ppMode= gPPMode[mode];
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
831 // printf("%d \n",QP_store[5]);
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
832 postprocess2(src, src_stride, dst, dst_stride,
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
833 horizontal_size, vertical_size, QP_store, QP_stride, &ppMode);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
834
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
835 return;
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
836 }
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
837
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
838 if(firstTime && verbose)
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
839 {
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
840 printf("using pp filters 0x%X\n", mode);
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
841 firstTime=0;
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
842 }
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
843
152
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
844 if(QP_store==NULL)
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
845 {
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
846 QP_store= zeroArray;
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
847 QP_stride= 0;
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
848 }
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
849
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
850 ppMode.lumMode= mode;
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
851 mode= ((mode&0xFF)>>4) | (mode&0xFFFFFF00);
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
852 ppMode.chromMode= mode;
157
bc12fd7e6153 temp denoiser changes: (a-b)^2 instead of |a-b| and MMX2/3DNOW version
michael
parents: 156
diff changeset
853 ppMode.maxTmpNoise[0]= 700;
bc12fd7e6153 temp denoiser changes: (a-b)^2 instead of |a-b| and MMX2/3DNOW version
michael
parents: 156
diff changeset
854 ppMode.maxTmpNoise[1]= 1500;
bc12fd7e6153 temp denoiser changes: (a-b)^2 instead of |a-b| and MMX2/3DNOW version
michael
parents: 156
diff changeset
855 ppMode.maxTmpNoise[2]= 3000;
182
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
856 ppMode.maxAllowedY= 234;
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
857 ppMode.minAllowedY= 16;
3ccd74a91074 minor brightness/contrast bugfix / moved some global vars into ppMode
michael
parents: 181
diff changeset
858 ppMode.maxDcDiff= 1;
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
859
102
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
860 #ifdef HAVE_ODIVX_POSTPROCESS
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
861 // Note: I could make this shit outside of this file, but it would mean one
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
862 // more function call...
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
863 if(use_old_pp){
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
864 odivx_postprocess(src,src_stride,dst,dst_stride,horizontal_size,vertical_size,QP_store,QP_stride,mode);
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
865 return;
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
866 }
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
867 #endif
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
868
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
869 postProcess(src[0], src_stride, dst[0], dst_stride,
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
870 horizontal_size, vertical_size, QP_store, QP_stride, 0, &ppMode);
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
871
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
872 horizontal_size >>= 1;
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
873 vertical_size >>= 1;
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
874 src_stride >>= 1;
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
875 dst_stride >>= 1;
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
876
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
877 if(ppMode.chromMode)
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
878 {
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
879 postProcess(src[1], src_stride, dst[1], dst_stride,
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
880 horizontal_size, vertical_size, QP_store, QP_stride, 1, &ppMode);
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
881 postProcess(src[2], src_stride, dst[2], dst_stride,
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
882 horizontal_size, vertical_size, QP_store, QP_stride, 2, &ppMode);
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
883 }
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
884 else if(src_stride == dst_stride)
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
885 {
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
886 memcpy(dst[1], src[1], src_stride*vertical_size);
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
887 memcpy(dst[2], src[2], src_stride*vertical_size);
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
888 }
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
889 else
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
890 {
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
891 int y;
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
892 for(y=0; y<vertical_size; y++)
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
893 {
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
894 memcpy(&(dst[1][y*dst_stride]), &(src[1][y*src_stride]), horizontal_size);
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
895 memcpy(&(dst[2][y*dst_stride]), &(src[2][y*src_stride]), horizontal_size);
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
896 }
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
897 }
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
898
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
899 #if 0
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
900 memset(dst[1], 128, dst_stride*vertical_size);
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
901 memset(dst[2], 128, dst_stride*vertical_size);
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
902 #endif
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
903 }
102
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
904
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
905 void postprocess2(unsigned char * src[], int src_stride,
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
906 unsigned char * dst[], int dst_stride,
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
907 int horizontal_size, int vertical_size,
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
908 QP_STORE_T *QP_store, int QP_stride,
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
909 struct PPMode *mode)
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
910 {
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
911
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
912 QP_STORE_T quantArray[2048/8];
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
913
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
914 if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
152
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
915 {
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
916 int i;
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
917 QP_store= quantArray;
152
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
918 QP_stride= 0;
183
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
919 if(mode->lumMode & FORCE_QUANT)
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
920 for(i=0; i<2048/8; i++) quantArray[i]= mode->forcedQuant;
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
921 else
d310beb2d848 -npp fq:<quantizer>
michael
parents: 182
diff changeset
922 for(i=0; i<2048/8; i++) quantArray[i]= 1;
152
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
923 }
561ec01a1a78 QP_store==null bugfix and no opendivx bugfix
michael
parents: 150
diff changeset
924
212
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
925 if(firstTime2 && verbose)
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
926 {
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
927 printf("using npp filters 0x%X/0x%X\n", mode->lumMode, mode->chromMode);
212
80edc2aaff86 Added reverting support for -pp and -npp options
albeu
parents: 210
diff changeset
928 firstTime2=0;
202
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
929 }
fbe0398a7a4d dont print -npp parser debug info if only -v
michael
parents: 185
diff changeset
930
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
931 #ifdef HAVE_ODIVX_POSTPROCESS
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
932 // Note: I could make this shit outside of this file, but it would mean one
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
933 // more function call...
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
934 if(use_old_pp){
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
935 odivx_postprocess(src,src_stride,dst,dst_stride,horizontal_size,vertical_size,QP_store,QP_stride,
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
936 mode->oldMode);
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
937 return;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
938 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
939 #endif
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
940
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
941 postProcess(src[0], src_stride, dst[0], dst_stride,
156
c09459686be3 temporal noise reducer in C (-pp 0x100000)
michael
parents: 152
diff changeset
942 horizontal_size, vertical_size, QP_store, QP_stride, 0, mode);
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
943
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
944 horizontal_size >>= 1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
945 vertical_size >>= 1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
946 src_stride >>= 1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
947 dst_stride >>= 1;
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
948
168
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
949 if(mode->chromMode)
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
950 {
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
951 postProcess(src[1], src_stride, dst[1], dst_stride,
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
952 horizontal_size, vertical_size, QP_store, QP_stride, 1, mode);
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
953 postProcess(src[2], src_stride, dst[2], dst_stride,
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
954 horizontal_size, vertical_size, QP_store, QP_stride, 2, mode);
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
955 }
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
956 else if(src_stride == dst_stride)
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
957 {
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
958 memcpy(dst[1], src[1], src_stride*vertical_size);
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
959 memcpy(dst[2], src[2], src_stride*vertical_size);
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
960 }
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
961 else
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
962 {
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
963 int y;
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
964 for(y=0; y<vertical_size; y++)
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
965 {
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
966 memcpy(&(dst[1][y*dst_stride]), &(src[1][y*src_stride]), horizontal_size);
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
967 memcpy(&(dst[2][y*dst_stride]), &(src[2][y*src_stride]), horizontal_size);
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
968 }
712c7a115164 use fastmemcpy for chrominance if no chrominance filtering is done
michael
parents: 167
diff changeset
969 }
116
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
970 }
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
971
1895a8fa81ea auto brightness/ contrast bugfix
michael
parents: 115
diff changeset
972
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
973 /**
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
974 * gets the mode flags for a given quality (larger values mean slower but better postprocessing)
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
975 * with -npp it simply returns quality
102
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
976 * 0 <= quality <= 6
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
977 */
102
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
978 int getPpModeForQuality(int quality){
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
979 int modes[1+GET_PP_QUALITY_MAX]= {
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
980 0,
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
981 #if 1
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
982 // horizontal filters first
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
983 LUM_H_DEBLOCK,
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
984 LUM_H_DEBLOCK | LUM_V_DEBLOCK,
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
985 LUM_H_DEBLOCK | LUM_V_DEBLOCK | CHROM_H_DEBLOCK,
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
986 LUM_H_DEBLOCK | LUM_V_DEBLOCK | CHROM_H_DEBLOCK | CHROM_V_DEBLOCK,
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
987 LUM_H_DEBLOCK | LUM_V_DEBLOCK | CHROM_H_DEBLOCK | CHROM_V_DEBLOCK | LUM_DERING,
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
988 LUM_H_DEBLOCK | LUM_V_DEBLOCK | CHROM_H_DEBLOCK | CHROM_V_DEBLOCK | LUM_DERING | CHROM_DERING
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
989 #else
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
990 // vertical filters first
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
991 LUM_V_DEBLOCK,
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
992 LUM_V_DEBLOCK | LUM_H_DEBLOCK,
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
993 LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK,
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
994 LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK,
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
995 LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK | LUM_DERING,
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
996 LUM_V_DEBLOCK | LUM_H_DEBLOCK | CHROM_V_DEBLOCK | CHROM_H_DEBLOCK | LUM_DERING | CHROM_DERING
102
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
997 #endif
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
998 };
96
29ac11dc53d3 fixed a bug in the horizontal default filter
arpi
parents: 95
diff changeset
999
102
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
1000 #ifdef HAVE_ODIVX_POSTPROCESS
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
1001 int odivx_modes[1+GET_PP_QUALITY_MAX]= {
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
1002 0,
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
1003 PP_DEBLOCK_Y_H,
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
1004 PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V,
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
1005 PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V|PP_DEBLOCK_C_H,
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
1006 PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V|PP_DEBLOCK_C_H|PP_DEBLOCK_C_V,
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
1007 PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V|PP_DEBLOCK_C_H|PP_DEBLOCK_C_V|PP_DERING_Y,
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
1008 PP_DEBLOCK_Y_H|PP_DEBLOCK_Y_V|PP_DEBLOCK_C_H|PP_DEBLOCK_C_V|PP_DERING_Y|PP_DERING_C
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
1009 };
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
1010 if(use_old_pp) return odivx_modes[quality];
2cb2660cbd7e small changes for mplayer integration:
arpi
parents: 101
diff changeset
1011 #endif
179
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
1012 if(newPPFlag) return quality;
02b2b7ffe324 new -pp options stuff (-npp ...)
michael
parents: 171
diff changeset
1013 else return modes[quality];
95
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
1014 }
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
1015
8bce253b537c new postprocess code by Michael Niedermayer (michaelni@gmx.at)
arpi
parents:
diff changeset
1016