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