Statistics
| Branch: | Revision:

ffmpeg / libpostproc / postprocess_internal.h @ 6ab6c7c3

History | View | Annotate | Download (5.78 KB)

1
/*
2
    Copyright (C) 2001-2002 Michael Niedermayer (michaelni@gmx.at)
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
#include "avutil.h"
25

    
26
#define V_DEBLOCK       0x01
27
#define H_DEBLOCK       0x02
28
#define DERING          0x04
29
#define LEVEL_FIX       0x08 ///< Brightness & Contrast
30

    
31
#define LUM_V_DEBLOCK   V_DEBLOCK               //   1
32
#define LUM_H_DEBLOCK   H_DEBLOCK               //   2
33
#define CHROM_V_DEBLOCK (V_DEBLOCK<<4)          //  16
34
#define CHROM_H_DEBLOCK (H_DEBLOCK<<4)          //  32
35
#define LUM_DERING      DERING                  //   4
36
#define CHROM_DERING    (DERING<<4)             //  64
37
#define LUM_LEVEL_FIX   LEVEL_FIX               //   8
38
#define CHROM_LEVEL_FIX (LEVEL_FIX<<4)          // 128 (not implemented yet)
39

    
40
// Experimental vertical filters
41
#define V_X1_FILTER     0x0200                  // 512
42
#define V_A_DEBLOCK     0x0400
43

    
44
// Experimental horizontal filters
45
#define H_X1_FILTER     0x2000                  // 8192
46
#define H_A_DEBLOCK     0x4000
47

    
48
/// select between full y range (255-0) or standart one (234-16)
49
#define FULL_Y_RANGE    0x8000                  // 32768
50

    
51
//Deinterlacing Filters
52
#define        LINEAR_IPOL_DEINT_FILTER         0x10000 // 65536
53
#define        LINEAR_BLEND_DEINT_FILTER        0x20000 // 131072
54
#define        CUBIC_BLEND_DEINT_FILTER         0x8000  // (not implemented yet)
55
#define        CUBIC_IPOL_DEINT_FILTER          0x40000 // 262144
56
#define        MEDIAN_DEINT_FILTER              0x80000 // 524288
57
#define        FFMPEG_DEINT_FILTER              0x400000
58
#define        LOWPASS5_DEINT_FILTER            0x800000
59

    
60
#define TEMP_NOISE_FILTER               0x100000
61
#define FORCE_QUANT                     0x200000
62

    
63
#if ( defined(__PIC__) || defined(__pic__) ) && ! defined(PIC)
64
#    define PIC
65
#endif
66

    
67
//use if u want a faster postprocessing code
68
//cant differentiate between chroma & luma filters (both on or both off)
69
//obviosly the -pp option at the commandline has no effect except turning the here selected
70
//filters on
71
//#define COMPILE_TIME_MODE 0x77
72

    
73
#if 1
74
static inline int CLIP(int a){
75
        if(a&256) return ((a)>>31)^(-1);
76
        else      return a;
77
}
78
//#define CLIP(a) (((a)&256) ? ((a)>>31)^(-1) : (a))
79
#elif 0
80
#define CLIP(a) clip_tab[a]
81
#else
82
#define CLIP(a) (a)
83
#endif
84
/**
85
 * Postprocessng filter.
86
 */
87
struct PPFilter{
88
        const char *shortName;
89
        const char *longName;
90
        int chromDefault;       ///< is chrominance filtering on by default if this filter is manually activated
91
        int minLumQuality;      ///< minimum quality to turn luminance filtering on
92
        int minChromQuality;    ///< minimum quality to turn chrominance filtering on
93
        int mask;               ///< Bitmask to turn this filter on
94
};
95

    
96
/**
97
 * Postprocessng mode.
98
 */
99
typedef struct PPMode{
100
        int lumMode;                    ///< acivates filters for luminance
101
        int chromMode;                  ///< acivates filters for chrominance
102
        int error;                      ///< non zero on error
103

    
104
        int minAllowedY;                ///< for brigtness correction
105
        int maxAllowedY;                ///< for brihtness correction
106
        float maxClippedThreshold;      ///< amount of "black" u r willing to loose to get a brightness corrected picture
107

    
108
        int maxTmpNoise[3];             ///< for Temporal Noise Reducing filter (Maximal sum of abs differences)
109

    
110
        int baseDcDiff;
111
        int flatnessThreshold;
112

    
113
        int forcedQuant;                ///< quantizer if FORCE_QUANT is used
114
} PPMode;
115

    
116
/**
117
 * postprocess context.
118
 */
119
typedef struct PPContext{
120
        uint8_t *tempBlocks; ///<used for the horizontal code
121

    
122
        /**
123
         * luma histogram.
124
         * we need 64bit here otherwise we'll going to have a problem
125
         * after watching a black picture for 5 hours
126
         */
127
        uint64_t *yHistogram;
128

    
129
        DECLARE_ALIGNED(8, uint64_t, packedYOffset);
130
        DECLARE_ALIGNED(8, uint64_t, packedYScale);
131

    
132
        /** Temporal noise reducing buffers */
133
        uint8_t *tempBlured[3];
134
        int32_t *tempBluredPast[3];
135

    
136
        /** Temporary buffers for handling the last row(s) */
137
        uint8_t *tempDst;
138
        uint8_t *tempSrc;
139

    
140
        uint8_t *deintTemp;
141

    
142
        DECLARE_ALIGNED(8, uint64_t, pQPb);
143
        DECLARE_ALIGNED(8, uint64_t, pQPb2);
144

    
145
        DECLARE_ALIGNED(8, uint64_t, mmxDcOffset[64]);
146
        DECLARE_ALIGNED(8, uint64_t, mmxDcThreshold[64]);
147

    
148
        QP_STORE_T *stdQPTable;       ///< used to fix MPEG2 style qscale
149
        QP_STORE_T *nonBQPTable;
150
        QP_STORE_T *forcedQPTable;
151

    
152
        int QP;
153
        int nonBQP;
154

    
155
        int frameNum;
156

    
157
        int cpuCaps;
158

    
159
        int qpStride; ///<size of qp buffers (needed to realloc them if needed)
160
        int stride;   ///<size of some buffers (needed to realloc them if needed)
161

    
162
        int hChromaSubSample;
163
        int vChromaSubSample;
164

    
165
        PPMode ppMode;
166
} PPContext;
167

    
168

    
169
static inline void linecpy(void *dest, void *src, int lines, int stride)
170
{
171
        if (stride > 0) {
172
                memcpy(dest, src, lines*stride);
173
        } else {
174
                memcpy(dest+(lines-1)*stride, src+(lines-1)*stride, -lines*stride);
175
        }
176
}