annotate libpostproc/postprocess_internal.h @ 3198:6b9f0c4fbdbe libavcodec

First part of a series of speed-enchancing patches. This one sets up a snow.h and makes snow use the dsputil function pointer framework to access the three functions that will be implemented in asm in the other parts of the patchset. Patch by Robert Edele < yartrebo AH earthlink POIS net> Original thread: Subject: [Ffmpeg-devel] [PATCH] Snow mmx+sse2 asm optimizations Date: Sun, 05 Feb 2006 12:47:14 -0500
author gpoirier
date Thu, 16 Mar 2006 19:18:18 +0000
parents 0b546eab515d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
1 /*
c39e14fc2392 cleanup
michael
parents:
diff changeset
2 Copyright (C) 2001-2002 Michael Niedermayer (michaelni@gmx.at)
c39e14fc2392 cleanup
michael
parents:
diff changeset
3
c39e14fc2392 cleanup
michael
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
c39e14fc2392 cleanup
michael
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
c39e14fc2392 cleanup
michael
parents:
diff changeset
6 the Free Software Foundation; either version 2 of the License, or
c39e14fc2392 cleanup
michael
parents:
diff changeset
7 (at your option) any later version.
c39e14fc2392 cleanup
michael
parents:
diff changeset
8
c39e14fc2392 cleanup
michael
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
c39e14fc2392 cleanup
michael
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
c39e14fc2392 cleanup
michael
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c39e14fc2392 cleanup
michael
parents:
diff changeset
12 GNU General Public License for more details.
c39e14fc2392 cleanup
michael
parents:
diff changeset
13
c39e14fc2392 cleanup
michael
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
c39e14fc2392 cleanup
michael
parents:
diff changeset
15 along with this program; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
17 */
c39e14fc2392 cleanup
michael
parents:
diff changeset
18
1109
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
19 /**
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
20 * @file postprocess_internal.h
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
21 * internal api header.
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
22 */
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
23
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
24 #define V_DEBLOCK 0x01
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
25 #define H_DEBLOCK 0x02
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
26 #define DERING 0x04
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
27 #define LEVEL_FIX 0x08 ///< Brightness & Contrast
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
28
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
29 #define LUM_V_DEBLOCK V_DEBLOCK // 1
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
30 #define LUM_H_DEBLOCK H_DEBLOCK // 2
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
31 #define CHROM_V_DEBLOCK (V_DEBLOCK<<4) // 16
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
32 #define CHROM_H_DEBLOCK (H_DEBLOCK<<4) // 32
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
33 #define LUM_DERING DERING // 4
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
34 #define CHROM_DERING (DERING<<4) // 64
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
35 #define LUM_LEVEL_FIX LEVEL_FIX // 8
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
36 #define CHROM_LEVEL_FIX (LEVEL_FIX<<4) // 128 (not implemented yet)
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
37
c39e14fc2392 cleanup
michael
parents:
diff changeset
38 // Experimental vertical filters
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
39 #define V_X1_FILTER 0x0200 // 512
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
40 #define V_A_DEBLOCK 0x0400
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
41
c39e14fc2392 cleanup
michael
parents:
diff changeset
42 // Experimental horizontal filters
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
43 #define H_X1_FILTER 0x2000 // 8192
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
44 #define H_A_DEBLOCK 0x4000
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
45
1109
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
46 /// select between full y range (255-0) or standart one (234-16)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
47 #define FULL_Y_RANGE 0x8000 // 32768
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
48
c39e14fc2392 cleanup
michael
parents:
diff changeset
49 //Deinterlacing Filters
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
50 #define LINEAR_IPOL_DEINT_FILTER 0x10000 // 65536
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
51 #define LINEAR_BLEND_DEINT_FILTER 0x20000 // 131072
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
52 #define CUBIC_BLEND_DEINT_FILTER 0x8000 // (not implemented yet)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
53 #define CUBIC_IPOL_DEINT_FILTER 0x40000 // 262144
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
54 #define MEDIAN_DEINT_FILTER 0x80000 // 524288
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
55 #define FFMPEG_DEINT_FILTER 0x400000
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
56 #define LOWPASS5_DEINT_FILTER 0x800000
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
57
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
58 #define TEMP_NOISE_FILTER 0x100000
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
59 #define FORCE_QUANT 0x200000
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
60
c39e14fc2392 cleanup
michael
parents:
diff changeset
61 //use if u want a faster postprocessing code
c39e14fc2392 cleanup
michael
parents:
diff changeset
62 //cant differentiate between chroma & luma filters (both on or both off)
c39e14fc2392 cleanup
michael
parents:
diff changeset
63 //obviosly the -pp option at the commandline has no effect except turning the here selected
c39e14fc2392 cleanup
michael
parents:
diff changeset
64 //filters on
c39e14fc2392 cleanup
michael
parents:
diff changeset
65 //#define COMPILE_TIME_MODE 0x77
c39e14fc2392 cleanup
michael
parents:
diff changeset
66
1157
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
67 #if 1
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
68 static inline int CLIP(int a){
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
69 if(a&256) return ((a)>>31)^(-1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
70 else return a;
1157
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
71 }
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
72 //#define CLIP(a) (((a)&256) ? ((a)>>31)^(-1) : (a))
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
73 #elif 0
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
74 #define CLIP(a) clip_tab[a]
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
75 #else
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
76 #define CLIP(a) (a)
57fe9c4e0c6e fixing cliping of c deinterlacers
michaelni
parents: 1109
diff changeset
77 #endif
1109
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
78 /**
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
79 * Postprocessng filter.
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
80 */
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
81 struct PPFilter{
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
82 char *shortName;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
83 char *longName;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
84 int chromDefault; ///< is chrominance filtering on by default if this filter is manually activated
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
85 int minLumQuality; ///< minimum quality to turn luminance filtering on
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
86 int minChromQuality; ///< minimum quality to turn chrominance filtering on
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
87 int mask; ///< Bitmask to turn this filter on
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
88 };
c39e14fc2392 cleanup
michael
parents:
diff changeset
89
1109
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
90 /**
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
91 * Postprocessng mode.
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
92 */
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
93 typedef struct PPMode{
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
94 int lumMode; ///< acivates filters for luminance
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
95 int chromMode; ///< acivates filters for chrominance
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
96 int error; ///< non zero on error
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
97
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
98 int minAllowedY; ///< for brigtness correction
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
99 int maxAllowedY; ///< for brihtness correction
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
100 float maxClippedThreshold; ///< amount of "black" u r willing to loose to get a brightness corrected picture
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
101
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
102 int maxTmpNoise[3]; ///< for Temporal Noise Reducing filter (Maximal sum of abs differences)
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
103
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
104 int baseDcDiff;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
105 int flatnessThreshold;
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
106
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
107 int forcedQuant; ///< quantizer if FORCE_QUANT is used
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
108 } PPMode;
c39e14fc2392 cleanup
michael
parents:
diff changeset
109
1109
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
110 /**
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
111 * postprocess context.
3644e555a20a doxy / cosmetics
michaelni
parents: 957
diff changeset
112 */
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
113 typedef struct PPContext{
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
114 uint8_t *tempBlocks; ///<used for the horizontal code
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
115
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
116 /**
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
117 * luma histogram.
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
118 * we need 64bit here otherwise we'll going to have a problem
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
119 * after watching a black picture for 5 hours
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
120 */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
121 uint64_t *yHistogram;
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
122
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
123 uint64_t __attribute__((aligned(8))) packedYOffset;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
124 uint64_t __attribute__((aligned(8))) packedYScale;
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
125
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
126 /** Temporal noise reducing buffers */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
127 uint8_t *tempBlured[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
128 int32_t *tempBluredPast[3];
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
129
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
130 /** Temporary buffers for handling the last row(s) */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
131 uint8_t *tempDst;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
132 uint8_t *tempSrc;
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
133
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
134 uint8_t *deintTemp;
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
135
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
136 uint64_t __attribute__((aligned(8))) pQPb;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
137 uint64_t __attribute__((aligned(8))) pQPb2;
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
138
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
139 uint64_t __attribute__((aligned(8))) mmxDcOffset[64];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
140 uint64_t __attribute__((aligned(8))) mmxDcThreshold[64];
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 829
diff changeset
141
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
142 QP_STORE_T *stdQPTable; ///< used to fix MPEG2 style qscale
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
143 QP_STORE_T *nonBQPTable;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
144 QP_STORE_T *forcedQPTable;
937
04fd733c5e4b buffer alloc cleanup / 10l
michael
parents: 829
diff changeset
145
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
146 int QP;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
147 int nonBQP;
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
148
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
149 int frameNum;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2527
diff changeset
150
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
151 int cpuCaps;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2527
diff changeset
152
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
153 int qpStride; ///<size of qp buffers (needed to realloc them if needed)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
154 int stride; ///<size of some buffers (needed to realloc them if needed)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2527
diff changeset
155
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
156 int hChromaSubSample;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
157 int vChromaSubSample;
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
158
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
159 PPMode ppMode;
829
c39e14fc2392 cleanup
michael
parents:
diff changeset
160 } PPContext;
c39e14fc2392 cleanup
michael
parents:
diff changeset
161
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1157
diff changeset
162
2527
ace6e273f318 support for negative strides
henry
parents: 2037
diff changeset
163 static inline void linecpy(void *dest, void *src, int lines, int stride)
ace6e273f318 support for negative strides
henry
parents: 2037
diff changeset
164 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
165 if (stride > 0) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
166 memcpy(dest, src, lines*stride);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
167 } else {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
168 memcpy(dest+(lines-1)*stride, src+(lines-1)*stride, -lines*stride);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
169 }
2527
ace6e273f318 support for negative strides
henry
parents: 2037
diff changeset
170 }