1 | /*
|
---|
2 | Copyright (C) 2001-2002 Michael Niedermayer ([email protected])
|
---|
3 |
|
---|
4 | This program is free software; you can redistribute it and/or modify
|
---|
5 | it under the terms of the GNU General Public License as published by
|
---|
6 | the Free Software Foundation; either version 2 of the License, or
|
---|
7 | (at your option) any later version.
|
---|
8 |
|
---|
9 | This program is distributed in the hope that it will be useful,
|
---|
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
12 | GNU General Public License for more details.
|
---|
13 |
|
---|
14 | You should have received a copy of the GNU General Public License
|
---|
15 | along with this program; if not, write to the Free Software
|
---|
16 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
---|
17 | */
|
---|
18 |
|
---|
19 | /**
|
---|
20 | * @file postprocess_internal.h
|
---|
21 | * internal api header.
|
---|
22 | */
|
---|
23 |
|
---|
24 | #define V_DEBLOCK 0x01
|
---|
25 | #define H_DEBLOCK 0x02
|
---|
26 | #define DERING 0x04
|
---|
27 | #define LEVEL_FIX 0x08 ///< Brightness & Contrast
|
---|
28 |
|
---|
29 | #define LUM_V_DEBLOCK V_DEBLOCK // 1
|
---|
30 | #define LUM_H_DEBLOCK H_DEBLOCK // 2
|
---|
31 | #define CHROM_V_DEBLOCK (V_DEBLOCK<<4) // 16
|
---|
32 | #define CHROM_H_DEBLOCK (H_DEBLOCK<<4) // 32
|
---|
33 | #define LUM_DERING DERING // 4
|
---|
34 | #define CHROM_DERING (DERING<<4) // 64
|
---|
35 | #define LUM_LEVEL_FIX LEVEL_FIX // 8
|
---|
36 | #define CHROM_LEVEL_FIX (LEVEL_FIX<<4) // 128 (not implemented yet)
|
---|
37 |
|
---|
38 | // Experimental vertical filters
|
---|
39 | #define V_X1_FILTER 0x0200 // 512
|
---|
40 | #define V_A_DEBLOCK 0x0400
|
---|
41 |
|
---|
42 | // Experimental horizontal filters
|
---|
43 | #define H_X1_FILTER 0x2000 // 8192
|
---|
44 | #define H_A_DEBLOCK 0x4000
|
---|
45 |
|
---|
46 | /// select between full y range (255-0) or standart one (234-16)
|
---|
47 | #define FULL_Y_RANGE 0x8000 // 32768
|
---|
48 |
|
---|
49 | //Deinterlacing Filters
|
---|
50 | #define LINEAR_IPOL_DEINT_FILTER 0x10000 // 65536
|
---|
51 | #define LINEAR_BLEND_DEINT_FILTER 0x20000 // 131072
|
---|
52 | #define CUBIC_BLEND_DEINT_FILTER 0x8000 // (not implemented yet)
|
---|
53 | #define CUBIC_IPOL_DEINT_FILTER 0x40000 // 262144
|
---|
54 | #define MEDIAN_DEINT_FILTER 0x80000 // 524288
|
---|
55 | #define FFMPEG_DEINT_FILTER 0x400000
|
---|
56 | #define LOWPASS5_DEINT_FILTER 0x800000
|
---|
57 |
|
---|
58 | #define TEMP_NOISE_FILTER 0x100000
|
---|
59 | #define FORCE_QUANT 0x200000
|
---|
60 |
|
---|
61 | #if ( defined(__PIC__) || defined(__pic__) ) && ! defined(PIC)
|
---|
62 | # define PIC
|
---|
63 | #endif
|
---|
64 |
|
---|
65 | //use if u want a faster postprocessing code
|
---|
66 | //cant differentiate between chroma & luma filters (both on or both off)
|
---|
67 | //obviosly the -pp option at the commandline has no effect except turning the here selected
|
---|
68 | //filters on
|
---|
69 | //#define COMPILE_TIME_MODE 0x77
|
---|
70 |
|
---|
71 | #if 1
|
---|
72 | static inline int CLIP(int a){
|
---|
73 | if(a&256) return ((a)>>31)^(-1);
|
---|
74 | else return a;
|
---|
75 | }
|
---|
76 | //#define CLIP(a) (((a)&256) ? ((a)>>31)^(-1) : (a))
|
---|
77 | #elif 0
|
---|
78 | #define CLIP(a) clip_tab[a]
|
---|
79 | #else
|
---|
80 | #define CLIP(a) (a)
|
---|
81 | #endif
|
---|
82 | /**
|
---|
83 | * Postprocessng filter.
|
---|
84 | */
|
---|
85 | struct PPFilter{
|
---|
86 | const char *shortName;
|
---|
87 | const char *longName;
|
---|
88 | int chromDefault; ///< is chrominance filtering on by default if this filter is manually activated
|
---|
89 | int minLumQuality; ///< minimum quality to turn luminance filtering on
|
---|
90 | int minChromQuality; ///< minimum quality to turn chrominance filtering on
|
---|
91 | int mask; ///< Bitmask to turn this filter on
|
---|
92 | };
|
---|
93 |
|
---|
94 | /**
|
---|
95 | * Postprocessng mode.
|
---|
96 | */
|
---|
97 | typedef struct PPMode{
|
---|
98 | int lumMode; ///< acivates filters for luminance
|
---|
99 | int chromMode; ///< acivates filters for chrominance
|
---|
100 | int error; ///< non zero on error
|
---|
101 |
|
---|
102 | int minAllowedY; ///< for brigtness correction
|
---|
103 | int maxAllowedY; ///< for brihtness correction
|
---|
104 | float maxClippedThreshold; ///< amount of "black" u r willing to loose to get a brightness corrected picture
|
---|
105 |
|
---|
106 | int maxTmpNoise[3]; ///< for Temporal Noise Reducing filter (Maximal sum of abs differences)
|
---|
107 |
|
---|
108 | int baseDcDiff;
|
---|
109 | int flatnessThreshold;
|
---|
110 |
|
---|
111 | int forcedQuant; ///< quantizer if FORCE_QUANT is used
|
---|
112 | } PPMode;
|
---|
113 |
|
---|
114 | /**
|
---|
115 | * postprocess context.
|
---|
116 | */
|
---|
117 | typedef struct PPContext{
|
---|
118 | uint8_t *tempBlocks; ///<used for the horizontal code
|
---|
119 |
|
---|
120 | /**
|
---|
121 | * luma histogram.
|
---|
122 | * we need 64bit here otherwise we'll going to have a problem
|
---|
123 | * after watching a black picture for 5 hours
|
---|
124 | */
|
---|
125 | uint64_t *yHistogram;
|
---|
126 |
|
---|
127 | uint64_t __attribute__((aligned(8))) packedYOffset;
|
---|
128 | uint64_t __attribute__((aligned(8))) packedYScale;
|
---|
129 |
|
---|
130 | /** Temporal noise reducing buffers */
|
---|
131 | uint8_t *tempBlured[3];
|
---|
132 | int32_t *tempBluredPast[3];
|
---|
133 |
|
---|
134 | /** Temporary buffers for handling the last row(s) */
|
---|
135 | uint8_t *tempDst;
|
---|
136 | uint8_t *tempSrc;
|
---|
137 |
|
---|
138 | uint8_t *deintTemp;
|
---|
139 |
|
---|
140 | uint64_t __attribute__((aligned(8))) pQPb;
|
---|
141 | uint64_t __attribute__((aligned(8))) pQPb2;
|
---|
142 |
|
---|
143 | uint64_t __attribute__((aligned(8))) mmxDcOffset[64];
|
---|
144 | uint64_t __attribute__((aligned(8))) mmxDcThreshold[64];
|
---|
145 |
|
---|
146 | QP_STORE_T *stdQPTable; ///< used to fix MPEG2 style qscale
|
---|
147 | QP_STORE_T *nonBQPTable;
|
---|
148 | QP_STORE_T *forcedQPTable;
|
---|
149 |
|
---|
150 | int QP;
|
---|
151 | int nonBQP;
|
---|
152 |
|
---|
153 | int frameNum;
|
---|
154 |
|
---|
155 | int cpuCaps;
|
---|
156 |
|
---|
157 | int qpStride; ///<size of qp buffers (needed to realloc them if needed)
|
---|
158 | int stride; ///<size of some buffers (needed to realloc them if needed)
|
---|
159 |
|
---|
160 | int hChromaSubSample;
|
---|
161 | int vChromaSubSample;
|
---|
162 |
|
---|
163 | PPMode ppMode;
|
---|
164 | } PPContext;
|
---|
165 |
|
---|
166 |
|
---|
167 | static inline void linecpy(void *dest, void *src, int lines, int stride)
|
---|
168 | {
|
---|
169 | if (stride > 0) {
|
---|
170 | memcpy(dest, src, lines*stride);
|
---|
171 | } else {
|
---|
172 | memcpy(dest+(lines-1)*stride, src+(lines-1)*stride, -lines*stride);
|
---|
173 | }
|
---|
174 | }
|
---|