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 Libav.
5  *
6  * Libav 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  * Libav 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 Libav; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
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/log.h"
32 #include "postprocess.h"
33 
34 #define V_DEBLOCK 0x01
35 #define H_DEBLOCK 0x02
36 #define DERING 0x04
37 #define LEVEL_FIX 0x08
38 
39 #define LUM_V_DEBLOCK V_DEBLOCK // 1
40 #define LUM_H_DEBLOCK H_DEBLOCK // 2
41 #define CHROM_V_DEBLOCK (V_DEBLOCK<<4) // 16
42 #define CHROM_H_DEBLOCK (H_DEBLOCK<<4) // 32
43 #define LUM_DERING DERING // 4
44 #define CHROM_DERING (DERING<<4) // 64
45 #define LUM_LEVEL_FIX LEVEL_FIX // 8
46 #define CHROM_LEVEL_FIX (LEVEL_FIX<<4) // 128 (not implemented yet)
47 
48 // Experimental vertical filters
49 #define V_X1_FILTER 0x0200 // 512
50 #define V_A_DEBLOCK 0x0400
51 
52 // Experimental horizontal filters
53 #define H_X1_FILTER 0x2000 // 8192
54 #define H_A_DEBLOCK 0x4000
55 
57 #define FULL_Y_RANGE 0x8000 // 32768
58 
59 //Deinterlacing Filters
60 #define LINEAR_IPOL_DEINT_FILTER 0x10000 // 65536
61 #define LINEAR_BLEND_DEINT_FILTER 0x20000 // 131072
62 #define CUBIC_BLEND_DEINT_FILTER 0x8000 // (not implemented yet)
63 #define CUBIC_IPOL_DEINT_FILTER 0x40000 // 262144
64 #define MEDIAN_DEINT_FILTER 0x80000 // 524288
65 #define FFMPEG_DEINT_FILTER 0x400000
66 #define LOWPASS5_DEINT_FILTER 0x800000
67 
68 #define TEMP_NOISE_FILTER 0x100000
69 #define FORCE_QUANT 0x200000
70 
71 //use if you want a faster postprocessing code
72 //cannot differentiate between chroma & luma filters (both on or both off)
73 //obviously the -pp option on the command line has no effect except turning the here selected
74 //filters on
75 //#define COMPILE_TIME_MODE 0x77
76 
77 static inline int CLIP(int a){
78  if(a&256) return ((a)>>31)^(-1);
79  else return a;
80 }
84 struct PPFilter{
85  const char *shortName;
86  const char *longName;
90  int mask;
91 };
92 
96 typedef struct PPMode{
97  int lumMode;
98  int chromMode;
99  int error;
100 
104 
105  int maxTmpNoise[3];
106 
109 
111 } PPMode;
112 
116 typedef struct PPContext{
121 
122  uint8_t *tempBlocks;
123 
129  uint64_t *yHistogram;
130 
133 
135  uint8_t *tempBlurred[3];
136  int32_t *tempBlurredPast[3];
137 
139  uint8_t *tempDst;
140  uint8_t *tempSrc;
141 
142  uint8_t *deintTemp;
143 
144  DECLARE_ALIGNED(8, uint64_t, pQPb);
145  DECLARE_ALIGNED(8, uint64_t, pQPb2);
146 
147  DECLARE_ALIGNED(8, uint64_t, mmxDcOffset)[64];
148  DECLARE_ALIGNED(8, uint64_t, mmxDcThreshold)[64];
149 
153 
154  int QP;
155  int nonBQP;
156 
157  int frameNum;
158 
159  int cpuCaps;
160 
161  int qpStride;
162  int stride;
163 
166 
168 } PPContext;
169 
170 
171 static inline void linecpy(void *dest, const void *src, int lines, int stride) {
172  if (stride > 0) {
173  memcpy(dest, src, lines*stride);
174  } else {
175  memcpy((uint8_t*)dest+(lines-1)*stride, (const uint8_t*)src+(lines-1)*stride, -lines*stride);
176  }
177 }
178 
179 #endif /* POSTPROC_POSTPROCESS_INTERNAL_H */