21 |
* along with this program ; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
22 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
23 |
* |
* |
24 |
* $Id: motion_est.h,v 1.3.2.12 2003-06-28 15:51:54 chl Exp $ |
* $Id: motion_est.h,v 1.3.2.15 2003-08-03 10:10:54 syskin Exp $ |
25 |
* |
* |
26 |
****************************************************************************/ |
****************************************************************************/ |
27 |
|
|
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 |
|
|
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_ */ |