FFmpeg  4.4.5
postprocess_internal.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2001-2002 Michael Niedermayer (michaelni@gmx.at)
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * internal API header.
24  */
25 
26 #ifndef POSTPROC_POSTPROCESS_INTERNAL_H
27 #define POSTPROC_POSTPROCESS_INTERNAL_H
28 
29 #include <string.h>
30 #include "libavutil/avutil.h"
31 #include "libavutil/intmath.h"
32 #include "libavutil/log.h"
33 #include "libavutil/mem_internal.h"
34 #include "postprocess.h"
35 
36 #define V_DEBLOCK 0x01
37 #define H_DEBLOCK 0x02
38 #define DERING 0x04
39 #define LEVEL_FIX 0x08 ///< Brightness & Contrast
40 
41 #define LUM_V_DEBLOCK V_DEBLOCK // 1
42 #define LUM_H_DEBLOCK H_DEBLOCK // 2
43 #define CHROM_V_DEBLOCK (V_DEBLOCK<<4) // 16
44 #define CHROM_H_DEBLOCK (H_DEBLOCK<<4) // 32
45 #define LUM_DERING DERING // 4
46 #define CHROM_DERING (DERING<<4) // 64
47 #define LUM_LEVEL_FIX LEVEL_FIX // 8
48 #define CHROM_LEVEL_FIX (LEVEL_FIX<<4) // 128 (not implemented yet)
49 
50 // Experimental vertical filters
51 #define V_X1_FILTER 0x0200 // 512
52 #define V_A_DEBLOCK 0x0400
53 
54 // Experimental horizontal filters
55 #define H_X1_FILTER 0x2000 // 8192
56 #define H_A_DEBLOCK 0x4000
57 
58 /// select between full y range (255-0) or standard one (234-16)
59 #define FULL_Y_RANGE 0x8000 // 32768
60 
61 //Deinterlacing Filters
62 #define LINEAR_IPOL_DEINT_FILTER 0x10000 // 65536
63 #define LINEAR_BLEND_DEINT_FILTER 0x20000 // 131072
64 #define CUBIC_BLEND_DEINT_FILTER 0x8000 // (not implemented yet)
65 #define CUBIC_IPOL_DEINT_FILTER 0x40000 // 262144
66 #define MEDIAN_DEINT_FILTER 0x80000 // 524288
67 #define FFMPEG_DEINT_FILTER 0x400000
68 #define LOWPASS5_DEINT_FILTER 0x800000
69 
70 #define TEMP_NOISE_FILTER 0x100000
71 #define FORCE_QUANT 0x200000
72 #define BITEXACT 0x1000000
73 #define VISUALIZE 0x2000000
74 
75 //use if you want a faster postprocessing code
76 //cannot differentiate between chroma & luma filters (both on or both off)
77 //obviously the -pp option on the command line has no effect except turning the here selected
78 //filters on
79 //#define COMPILE_TIME_MODE 0x77
80 
81 /**
82  * Postprocessing filter.
83  */
84 struct PPFilter{
85  const char *shortName;
86  const char *longName;
87  int chromDefault; ///< is chrominance filtering on by default if this filter is manually activated
88  int minLumQuality; ///< minimum quality to turn luminance filtering on
89  int minChromQuality; ///< minimum quality to turn chrominance filtering on
90  int mask; ///< Bitmask to turn this filter on
91 };
92 
93 /**
94  * Postprocessing mode.
95  */
96 typedef struct PPMode{
97  int lumMode; ///< activates filters for luminance
98  int chromMode; ///< activates filters for chrominance
99  int error; ///< non zero on error
100 
101  int minAllowedY; ///< for brightness correction
102  int maxAllowedY; ///< for brightness correction
103  AVRational maxClippedThreshold; ///< amount of "black" you are willing to lose to get a brightness-corrected picture
104 
105  int maxTmpNoise[3]; ///< for Temporal Noise Reducing filter (Maximal sum of abs differences)
106 
109 
110  int forcedQuant; ///< quantizer if FORCE_QUANT is used
111 } PPMode;
112 
113 /**
114  * postprocess context.
115  */
116 typedef struct PPContext{
117  /**
118  * info on struct for av_log
119  */
121 
122  uint8_t *tempBlocks; ///<used for the horizontal code
123 
124  /**
125  * luma histogram.
126  * we need 64bit here otherwise we'll going to have a problem
127  * after watching a black picture for 5 hours
128  */
129  uint64_t *yHistogram;
130 
133 
134  /** Temporal noise reducing buffers */
137 
138  /** Temporary buffers for handling the last row(s) */
141 
143 
144  DECLARE_ALIGNED(8, uint64_t, pQPb);
145  DECLARE_ALIGNED(8, uint64_t, pQPb2);
146 
147  DECLARE_ALIGNED(32, uint64_t, pQPb_block)[4];
148  DECLARE_ALIGNED(32, uint64_t, pQPb2_block)[4];
149 
150  DECLARE_ALIGNED(32, uint64_t, mmxDcOffset)[64];
151  DECLARE_ALIGNED(32, uint64_t, mmxDcThreshold)[64];
152 
153  int8_t *stdQPTable; ///< used to fix MPEG2 style qscale
154  int8_t *nonBQPTable;
155  int8_t *forcedQPTable;
156 
157  int QP;
158  int nonBQP;
159 
160  DECLARE_ALIGNED(32, int, QP_block)[4];
162 
163  int frameNum;
164 
165  int cpuCaps;
166 
167  int qpStride; ///<size of qp buffers (needed to realloc them if needed)
168  int stride; ///<size of some buffers (needed to realloc them if needed)
169 
172 
174 } PPContext;
175 
176 
177 static inline void linecpy(void *dest, const void *src, int lines, int stride) {
178  if (stride > 0) {
179  memcpy(dest, src, lines*stride);
180  } else {
181  memcpy((uint8_t*)dest+(lines-1)*stride, (const uint8_t*)src+(lines-1)*stride, -lines*stride);
182  }
183 }
184 
185 #endif /* POSTPROC_POSTPROCESS_INTERNAL_H */
uint8_t
int32_t
Convenience header that includes libavutil's core.
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
Definition: mem.h:117
int stride
Definition: mace.c:144
external API header
static void linecpy(void *dest, const void *src, int lines, int stride)
Describe the class of an AVClass context structure.
Definition: log.h:67
Rational number (pair of numerator and denominator).
Definition: rational.h:58
postprocess context.
uint8_t * tempBlocks
used for the horizontal code
int32_t * tempBlurredPast[3]
int qpStride
size of qp buffers (needed to realloc them if needed)
uint64_t packedYScale
int8_t * stdQPTable
used to fix MPEG2 style qscale
int stride
size of some buffers (needed to realloc them if needed)
int8_t * nonBQPTable
uint8_t * tempDst
Temporary buffers for handling the last row(s)
uint64_t mmxDcThreshold[64]
uint64_t pQPb2_block[4]
uint64_t packedYOffset
uint64_t pQPb_block[4]
const AVClass * av_class
info on struct for av_log
uint8_t * tempBlurred[3]
Temporal noise reducing buffers.
int8_t * forcedQPTable
uint8_t * deintTemp
uint64_t * yHistogram
luma histogram.
uint64_t mmxDcOffset[64]
Postprocessing filter.
int chromDefault
is chrominance filtering on by default if this filter is manually activated
int minLumQuality
minimum quality to turn luminance filtering on
int minChromQuality
minimum quality to turn chrominance filtering on
const char * longName
const char * shortName
int mask
Bitmask to turn this filter on.
Postprocessing mode.
int maxTmpNoise[3]
for Temporal Noise Reducing filter (Maximal sum of abs differences)
int chromMode
activates filters for chrominance
int maxAllowedY
for brightness correction
AVRational maxClippedThreshold
amount of "black" you are willing to lose to get a brightness-corrected picture
int error
non zero on error
int forcedQuant
quantizer if FORCE_QUANT is used
int lumMode
activates filters for luminance
int minAllowedY
for brightness correction
#define src
Definition: vp8dsp.c:255