1 /*****************************************************************************
2 *
3 * XVID MPEG-4 VIDEO CODEC
4 * - Global definitions -
5 *
6 * Copyright(C) 2002-2010 Michael Militzer <michael@xvid.org>
7 *
8 * This program is free software ; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation ; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY ; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program ; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 * $Id: global.h 2180 2019-11-12 14:48:35Z Isibaar $
23 *
24 ****************************************************************************/
25
26 #ifndef _GLOBAL_H_
27 #define _GLOBAL_H_
28
29 #include "xvid.h"
30 #include "portab.h"
31
32 /* --- macroblock modes --- */
33
34 #define MODE_INTER 0
35 #define MODE_INTER_Q 1
36 #define MODE_INTER4V 2
37 #define MODE_INTRA 3
38 #define MODE_INTRA_Q 4
39 #define MODE_NOT_CODED 16
40 #define MODE_NOT_CODED_GMC 17
41
42 /* --- bframe specific --- */
43
44 #define MODE_DIRECT 0
45 #define MODE_INTERPOLATE 1
46 #define MODE_BACKWARD 2
47 #define MODE_FORWARD 3
48 #define MODE_DIRECT_NONE_MV 4
49 #define MODE_DIRECT_NO4V 5
50
51 /*
52 * vop coding types
53 * intra, prediction, backward, sprite, not_coded
54 */
55 #define I_VOP 0
56 #define P_VOP 1
57 #define B_VOP 2
58 #define S_VOP 3
59 #define N_VOP 4
60
61 /* convert mpeg-4 coding type i/p/b/s_VOP to XVID_TYPE_xxx */
62 static __inline int
coding2type(int coding_type)63 coding2type(int coding_type)
64 {
65 return coding_type + 1;
66 }
67
68 /* convert XVID_TYPE_xxx to bitstream coding type i/p/b/s_VOP */
69 static __inline int
type2coding(int xvid_type)70 type2coding(int xvid_type)
71 {
72 return xvid_type - 1;
73 }
74
75 typedef struct
76 {
77 int x;
78 int y;
79 }
80 VECTOR;
81
82 typedef struct
83 {
84 VECTOR duv[4];
85 }
86 WARPPOINTS;
87
88 /* save all warping parameters for GMC once and for all, instead of
89 recalculating for every block. This is needed for encoding&decoding
90 When switching to incremental calculations, this will get much shorter
91 */
92
93 /* we don't include WARPPOINTS wp here, but in FRAMEINFO itself */
94
95 typedef struct
96 {
97 int num_wp; /* [input]: 0=none, 1=translation, 2,3 = warping */
98 /* a value of -1 means: "structure not initialized!" */
99 int s; /* [input]: calc is done with 1/s pel resolution */
100
101 int W;
102 int H;
103
104 int ss;
105 int smask;
106 int sigma;
107
108 int r;
109 int rho;
110
111 int i0s;
112 int j0s;
113 int i1s;
114 int j1s;
115 int i2s;
116 int j2s;
117
118 int i1ss;
119 int j1ss;
120 int i2ss;
121 int j2ss;
122
123 int alpha;
124 int beta;
125 int Ws;
126 int Hs;
127
128 int dxF, dyF, dxG, dyG;
129 int Fo, Go;
130 int cFo, cGo;
131 } GMC_DATA;
132
133 typedef struct _NEW_GMC_DATA
134 {
135 /* 0=none, 1=translation, 2,3 = warping
136 * a value of -1 means: "structure not initialized!" */
137 int num_wp;
138
139 /* {0,1,2,3} => {1/2,1/4,1/8,1/16} pel */
140 int accuracy;
141
142 /* sprite size * 16 */
143 int sW, sH;
144
145 /* gradient, calculated from warp points */
146 int dU[2], dV[2], Uo, Vo, Uco, Vco;
147
148 void (*predict_16x16)(const struct _NEW_GMC_DATA * const This,
149 uint8_t *dst, const uint8_t *src,
150 int dststride, int srcstride, int x, int y, int rounding);
151 void (*predict_8x8) (const struct _NEW_GMC_DATA * const This,
152 uint8_t *uDst, const uint8_t *uSrc,
153 uint8_t *vDst, const uint8_t *vSrc,
154 int dststride, int srcstride, int x, int y, int rounding);
155 void (*get_average_mv)(const struct _NEW_GMC_DATA * const Dsp, VECTOR * const mv,
156 int x, int y, int qpel);
157 } NEW_GMC_DATA;
158
159 typedef struct
160 {
161 uint8_t *y;
162 uint8_t *u;
163 uint8_t *v;
164 }
165 IMAGE;
166
167 typedef struct
168 {
169 uint32_t bufa;
170 uint32_t bufb;
171 uint32_t buf;
172 uint32_t pos;
173 uint32_t *tail;
174 uint32_t *start;
175 uint32_t length;
176 uint32_t initpos;
177 }
178 Bitstream;
179
180 #define MBPRED_SIZE 15
181
182 typedef struct
183 {
184 /* decoder/encoder */
185 VECTOR mvs[4];
186
187 short int pred_values[6][MBPRED_SIZE];
188 int acpred_directions[6];
189
190 int mode;
191 int quant; /* absolute quant */
192
193 int field_dct;
194 int field_pred;
195 int field_for_top;
196 int field_for_bot;
197
198 /* encoder specific */
199
200 VECTOR pmvs[4];
201 VECTOR qmvs[4]; /* mvs in quarter pixel resolution */
202
203 int32_t sad8[4]; /* SAD values for inter4v-VECTORs */
204 int32_t sad16; /* SAD value for inter-VECTOR */
205
206 int32_t var16; /* Variance of the 16x16 luma block */
207 int32_t rel_var8[6]; /* Relative variances of the 8x8 sub-blocks */
208
209 int dquant;
210 int cbp;
211
212 /* lambda for these blocks */
213 int lambda[6];
214
215 /* bframe stuff */
216
217 VECTOR b_mvs[4];
218 VECTOR b_qmvs[4];
219
220 VECTOR amv; /* average motion vectors from GMC */
221 int32_t mcsel;
222
223 VECTOR mvs_avg; //CK average of field motion vectors
224
225 /* This structure has become way to big! What to do? Split it up? */
226
227 }
228 MACROBLOCK;
229
230 static __inline uint32_t
get_dc_scaler(uint32_t quant,uint32_t lum)231 get_dc_scaler(uint32_t quant,
232 uint32_t lum)
233 {
234 if (quant < 5)
235 return 8;
236
237 if (quant < 25 && !lum)
238 return (quant + 13) / 2;
239
240 if (quant < 9)
241 return 2 * quant;
242
243 if (quant < 25)
244 return quant + 8;
245
246 if (lum)
247 return 2 * quant - 16;
248 else
249 return quant - 6;
250 }
251
252 /* useful macros */
253
254 #ifndef MIN
255 #define MIN(X, Y) ((X)<(Y)?(X):(Y))
256 #endif
257 #ifndef MAX
258 #define MAX(X, Y) ((X)>(Y)?(X):(Y))
259 #endif
260 /* #define ABS(X) (((X)>0)?(X):-(X)) */
261 #define SIGN(X) (((X)>0)?1:-1)
262 #define CLIP(X,AMIN,AMAX) (((X)<(AMIN)) ? (AMIN) : ((X)>(AMAX)) ? (AMAX) : (X))
263 #define DIV_DIV(a,b) (((a)>0) ? ((a)+((b)>>1))/(b) : ((a)-((b)>>1))/(b))
264 #define SWAP(_T_,A,B) { _T_ tmp = A; A = B; B = tmp; }
265
266 static __inline uint32_t
isqrt(unsigned long n)267 isqrt(unsigned long n)
268 {
269 uint32_t c = 0x8000;
270 uint32_t g = 0x8000;
271
272 for(;;) {
273 if(g*g > n)
274 g ^= c;
275 c >>= 1;
276 if(c == 0)
277 return g;
278 g |= c;
279 }
280 }
281
282 #endif /* _GLOBAL_H_ */
283