139 |
int16_t * dctSpace; |
int16_t * dctSpace; |
140 |
uint32_t iQuant; |
uint32_t iQuant; |
141 |
uint32_t quant_type; |
uint32_t quant_type; |
142 |
|
int * cbp; |
143 |
|
|
144 |
} SearchData; |
} SearchData; |
145 |
|
|
160 |
int32_t * const max_dy, |
int32_t * const max_dy, |
161 |
const uint32_t x, |
const uint32_t x, |
162 |
const uint32_t y, |
const uint32_t y, |
163 |
uint32_t block_sz, /* block dimension, 8 or 16 */ |
uint32_t block_sz, /* block dimension, 3(8) or 4(16) */ |
164 |
const uint32_t width, |
const uint32_t width, |
165 |
const uint32_t height, |
const uint32_t height, |
166 |
const uint32_t fcode, |
const uint32_t fcode, |
167 |
const int qpel, /* 1 if the resulting range should be in qpel precision; otherwise 0 */ |
const int precision, /* 2 for qpel, 1 for halfpel */ |
168 |
const int rrv) |
const int rrv) |
169 |
{ |
{ |
170 |
int k, m = qpel ? 4 : 2; |
int k; |
171 |
const int search_range = 32 << (fcode - 1); |
const int search_range = 16 << fcode; |
172 |
int high = search_range - 1; |
int high = search_range - 1; |
173 |
int low = -search_range; |
int low = -search_range; |
174 |
|
|
175 |
if (rrv) { |
if (rrv) { |
176 |
high = RRV_MV_SCALEUP(high); |
high = RRV_MV_SCALEUP(high); |
177 |
low = RRV_MV_SCALEUP(low); |
low = RRV_MV_SCALEUP(low); |
178 |
block_sz *= 2; |
block_sz++; |
179 |
} |
} |
180 |
|
|
181 |
k = m * (int)(width - x * block_sz); |
k = (int)(width - (x<<block_sz))<<precision; |
182 |
*max_dx = MIN(high, k); |
*max_dx = MIN(high, k); |
183 |
k = m * (int)(height - y * block_sz); |
k = (int)(height - (y<<block_sz))<<precision; |
184 |
*max_dy = MIN(high, k); |
*max_dy = MIN(high, k); |
185 |
|
|
186 |
k = -m * (int)((x+1) * block_sz); |
k = (-(int)((x+1)<<block_sz))<<precision; |
187 |
*min_dx = MAX(low, k); |
*min_dx = MAX(low, k); |
188 |
k = -m * (int)((y+1) * block_sz); |
k = (-(int)((y+1)<<block_sz))<<precision; |
189 |
*min_dy = MAX(low, k); |
*min_dy = MAX(low, k); |
190 |
} |
} |
191 |
|
|
292 |
{ |
{ |
293 |
uint32_t Flags = MotionFlags; |
uint32_t Flags = MotionFlags; |
294 |
|
|
295 |
if (!(VopFlags & XVID_VOP_MODEDECISION_BITS)) |
if (!(VopFlags & XVID_VOP_MODEDECISION_RD)) |
296 |
Flags &= ~(XVID_ME_QUARTERPELREFINE16_BITS+XVID_ME_QUARTERPELREFINE8_BITS+XVID_ME_HALFPELREFINE16_BITS+XVID_ME_HALFPELREFINE8_BITS+XVID_ME_EXTSEARCH_BITS); |
Flags &= ~(XVID_ME_QUARTERPELREFINE16_RD+XVID_ME_QUARTERPELREFINE8_RD+XVID_ME_HALFPELREFINE16_RD+XVID_ME_HALFPELREFINE8_RD+XVID_ME_EXTSEARCH_RD); |
297 |
|
|
298 |
if (Flags & XVID_ME_EXTSEARCH_BITS) |
if (Flags & XVID_ME_EXTSEARCH_RD) |
299 |
Flags |= XVID_ME_HALFPELREFINE16_BITS; |
Flags |= XVID_ME_HALFPELREFINE16_RD; |
300 |
|
|
301 |
if (Flags & XVID_ME_EXTSEARCH_BITS && MotionFlags & XVID_ME_EXTSEARCH8) |
if (Flags & XVID_ME_EXTSEARCH_RD && MotionFlags & XVID_ME_EXTSEARCH8) |
302 |
Flags |= XVID_ME_HALFPELREFINE8_BITS; |
Flags |= XVID_ME_HALFPELREFINE8_RD; |
303 |
|
|
304 |
if (Flags & XVID_ME_HALFPELREFINE16_BITS) |
if (Flags & XVID_ME_HALFPELREFINE16_RD) |
305 |
Flags |= XVID_ME_QUARTERPELREFINE16_BITS; |
Flags |= XVID_ME_QUARTERPELREFINE16_RD; |
306 |
|
|
307 |
if (Flags & XVID_ME_HALFPELREFINE8_BITS) { |
if (Flags & XVID_ME_HALFPELREFINE8_RD) { |
308 |
Flags |= XVID_ME_QUARTERPELREFINE8_BITS; |
Flags |= XVID_ME_QUARTERPELREFINE8_RD; |
309 |
Flags &= ~XVID_ME_HALFPELREFINE8; |
Flags &= ~XVID_ME_HALFPELREFINE8; |
310 |
} |
} |
311 |
|
|
312 |
if (Flags & XVID_ME_QUARTERPELREFINE8_BITS) |
if (Flags & XVID_ME_QUARTERPELREFINE8_RD) |
313 |
Flags &= ~XVID_ME_QUARTERPELREFINE8; |
Flags &= ~XVID_ME_QUARTERPELREFINE8; |
314 |
|
|
315 |
if (!(VolFlags & XVID_VOL_QUARTERPEL)) |
if (!(VolFlags & XVID_VOL_QUARTERPEL)) |
316 |
Flags &= ~(XVID_ME_QUARTERPELREFINE16+XVID_ME_QUARTERPELREFINE8+XVID_ME_QUARTERPELREFINE16_BITS+XVID_ME_QUARTERPELREFINE8_BITS); |
Flags &= ~(XVID_ME_QUARTERPELREFINE16+XVID_ME_QUARTERPELREFINE8+XVID_ME_QUARTERPELREFINE16_RD+XVID_ME_QUARTERPELREFINE8_RD); |
317 |
|
|
318 |
if (!(VopFlags & XVID_VOP_HALFPEL)) |
if (!(VopFlags & XVID_VOP_HALFPEL)) |
319 |
Flags &= ~(XVID_ME_EXTSEARCH16+XVID_ME_HALFPELREFINE16+XVID_ME_HALFPELREFINE8+XVID_ME_HALFPELREFINE16_BITS+XVID_ME_HALFPELREFINE8_BITS); |
Flags &= ~(XVID_ME_EXTSEARCH16+XVID_ME_HALFPELREFINE16+XVID_ME_HALFPELREFINE8+XVID_ME_HALFPELREFINE16_RD+XVID_ME_HALFPELREFINE8_RD); |
320 |
|
|
321 |
if ((VopFlags & XVID_VOP_GREYSCALE) || (VopFlags & XVID_VOP_REDUCED)) |
if ((VopFlags & XVID_VOP_GREYSCALE) || (VopFlags & XVID_VOP_REDUCED)) |
322 |
Flags &= ~(XVID_ME_CHROMA16 + XVID_ME_CHROMA8); |
Flags &= ~(XVID_ME_CHROMA_PVOP + XVID_ME_CHROMA_BVOP); |
323 |
|
|
324 |
return Flags; |
return Flags; |
325 |
} |
} |
326 |
|
|
327 |
/* BITS mode decision and search */ |
/* RD mode decision and search */ |
328 |
|
|
329 |
#include "../bitstream/zigzag.h" |
#include "../bitstream/zigzag.h" |
330 |
#include "../quant/quant_mpeg4.h" |
#include "../quant/quant_mpeg4.h" |
333 |
#include "../dct/fdct.h" |
#include "../dct/fdct.h" |
334 |
|
|
335 |
static int |
static int |
336 |
CountMBBitsInter(SearchData * const Data, |
findRDinter(SearchData * const Data, |
337 |
const MACROBLOCK * const pMBs, const int x, const int y, |
const MACROBLOCK * const pMBs, const int x, const int y, |
338 |
const MBParam * const pParam, |
const MBParam * const pParam, |
339 |
const uint32_t MotionFlags); |
const uint32_t MotionFlags); |
340 |
|
|
341 |
static int |
static int |
342 |
CountMBBitsInter4v(const SearchData * const Data, |
findRDinter4v(const SearchData * const Data, |
343 |
MACROBLOCK * const pMB, const MACROBLOCK * const pMBs, |
MACROBLOCK * const pMB, const MACROBLOCK * const pMBs, |
344 |
const int x, const int y, |
const int x, const int y, |
345 |
const MBParam * const pParam, const uint32_t MotionFlags, |
const MBParam * const pParam, const uint32_t MotionFlags, |
346 |
const VECTOR * const backup); |
const VECTOR * const backup); |
347 |
|
|
348 |
static int |
static int |
349 |
CountMBBitsIntra(const SearchData * const Data); |
findRDintra(const SearchData * const Data); |
350 |
|
|
351 |
|
static int |
352 |
|
findRDgmc(const SearchData * const Data, const IMAGE * const vGMC, const int x, const int y); |
353 |
|
|
354 |
int CodeCoeffIntra_CalcBits(const int16_t qcoeff[64], const uint16_t * zigzag); |
int CodeCoeffIntra_CalcBits(const int16_t qcoeff[64], const uint16_t * zigzag); |
355 |
int CodeCoeffInter_CalcBits(const int16_t qcoeff[64], const uint16_t * zigzag); |
int CodeCoeffInter_CalcBits(const int16_t qcoeff[64], const uint16_t * zigzag); |
372 |
|
|
373 |
fdct(data); |
fdct(data); |
374 |
|
|
375 |
if (quant_type == 0) sum = quant_inter(coeff, data, quant); |
if (quant_type) sum = quant_inter(coeff, data, quant); |
376 |
else sum = quant4_inter(coeff, data, quant); |
else sum = quant4_inter(coeff, data, quant); |
377 |
|
|
378 |
if (sum > 0) { |
if (sum > 0) { |
379 |
*cbp |= 1 << (5 - block); |
*cbp |= 1 << (5 - block); |
380 |
bits = BITS_MULT * CodeCoeffInter_CalcBits(coeff, scan_tables[0]); |
bits = BITS_MULT * CodeCoeffInter_CalcBits(coeff, scan_tables[0]); |
|
} else bits = 0; |
|
381 |
|
|
382 |
if (quant_type == 0) dequant_inter(dqcoeff, coeff, quant); |
if (quant_type) dequant_inter(dqcoeff, coeff, quant); |
383 |
else dequant4_inter(dqcoeff, coeff, quant); |
else dequant4_inter(dqcoeff, coeff, quant); |
384 |
|
|
385 |
for (i = 0; i < 64; i++) { |
for (i = 0; i < 64; i++) |
386 |
distortion += (data[i] - dqcoeff[i])*(data[i] - dqcoeff[i]); |
distortion += (data[i] - dqcoeff[i])*(data[i] - dqcoeff[i]); |
|
} |
|
387 |
|
|
388 |
bits += (LAMBDA*distortion)/(quant*quant); |
} else { |
389 |
|
bits = 0; |
390 |
|
for (i = 0; i < 64; i++) |
391 |
|
distortion += data[i]*data[i]; |
392 |
|
} |
393 |
|
|
394 |
return bits; |
return bits + (LAMBDA*distortion)/(quant*quant); |
395 |
} |
} |
396 |
|
|
397 |
static __inline unsigned int |
static __inline unsigned int |
411 |
fdct(data); |
fdct(data); |
412 |
data[0] -= 1024; |
data[0] -= 1024; |
413 |
|
|
414 |
if (quant_type == 0) quant_intra(coeff, data, quant, iDcScaler); |
if (quant_type) quant_intra(coeff, data, quant, iDcScaler); |
415 |
else quant4_intra(coeff, data, quant, iDcScaler); |
else quant4_intra(coeff, data, quant, iDcScaler); |
416 |
|
|
417 |
b_dc = coeff[0]; |
b_dc = coeff[0]; |
427 |
else bits += BITS_MULT*dcc_tab[coeff[0] + 255].len; |
else bits += BITS_MULT*dcc_tab[coeff[0] + 255].len; |
428 |
|
|
429 |
coeff[0] = b_dc; |
coeff[0] = b_dc; |
430 |
if (quant_type == 0) dequant_intra(dqcoeff, coeff, quant, iDcScaler); |
if (quant_type) dequant_intra(dqcoeff, coeff, quant, iDcScaler); |
431 |
else dequant4_intra(dqcoeff, coeff, quant, iDcScaler); |
else dequant4_intra(dqcoeff, coeff, quant, iDcScaler); |
432 |
|
|
433 |
for (i = 0; i < 64; i++) { |
for (i = 0; i < 64; i++) |
434 |
distortion += (data[i] - dqcoeff[i])*(data[i] - dqcoeff[i]); |
distortion += (data[i] - dqcoeff[i])*(data[i] - dqcoeff[i]); |
|
} |
|
|
|
|
|
bits += (LAMBDA*distortion)/(quant*quant); |
|
435 |
|
|
436 |
return bits; |
return bits + (LAMBDA*distortion)/(quant*quant); |
437 |
} |
} |
438 |
|
|
439 |
#endif /* _MOTION_EST_H_ */ |
#endif /* _MOTION_EST_H_ */ |