110 |
VECTOR predMV; |
VECTOR predMV; |
111 |
VECTOR * currentMV; |
VECTOR * currentMV; |
112 |
VECTOR * currentQMV; |
VECTOR * currentQMV; |
113 |
|
VECTOR * currentMV2; |
114 |
|
VECTOR * currentQMV2; |
115 |
int32_t * iMinSAD; |
int32_t * iMinSAD; |
116 |
|
int32_t * iMinSAD2; |
117 |
const uint8_t * RefP[6]; /* N, V, H, HV, cU, cV */ |
const uint8_t * RefP[6]; /* N, V, H, HV, cU, cV */ |
118 |
const uint8_t * CurU; |
const uint8_t * CurU; |
119 |
const uint8_t * CurV; |
const uint8_t * CurV; |
124 |
uint32_t iEdgedWidth; |
uint32_t iEdgedWidth; |
125 |
uint32_t iFcode; |
uint32_t iFcode; |
126 |
int * temp; |
int * temp; |
127 |
|
int * dir; |
128 |
int qpel, qpel_precision; |
int qpel, qpel_precision; |
129 |
int chroma; |
int chroma; |
130 |
int rrv; |
int rrv; |
149 |
|
|
150 |
|
|
151 |
typedef void(CheckFunc)(const int x, const int y, |
typedef void(CheckFunc)(const int x, const int y, |
152 |
const int Direction, int * const dir, |
const SearchData * const Data, |
153 |
const SearchData * const Data); |
const int Direction); |
|
CheckFunc *CheckCandidate; |
|
154 |
|
|
155 |
/* |
/* |
156 |
* Calculate the min/max range |
* Calculate the min/max range |
163 |
int32_t * const max_dy, |
int32_t * const max_dy, |
164 |
const uint32_t x, |
const uint32_t x, |
165 |
const uint32_t y, |
const uint32_t y, |
166 |
uint32_t block_sz, /* block dimension, 8 or 16 */ |
uint32_t block_sz, /* block dimension, 3(8) or 4(16) */ |
167 |
const uint32_t width, |
const uint32_t width, |
168 |
const uint32_t height, |
const uint32_t height, |
169 |
const uint32_t fcode, |
const uint32_t fcode, |
170 |
const int qpel, /* 1 if the resulting range should be in qpel precision; otherwise 0 */ |
const int precision, /* 2 for qpel, 1 for halfpel */ |
171 |
const int rrv) |
const int rrv) |
172 |
{ |
{ |
173 |
int k, m = qpel ? 4 : 2; |
int k; |
174 |
const int search_range = 32 << (fcode - 1); |
const int search_range = 16 << fcode; |
175 |
int high = search_range - 1; |
int high = search_range - 1; |
176 |
int low = -search_range; |
int low = -search_range; |
177 |
|
|
178 |
if (rrv) { |
if (rrv) { |
179 |
high = RRV_MV_SCALEUP(high); |
high = RRV_MV_SCALEUP(high); |
180 |
low = RRV_MV_SCALEUP(low); |
low = RRV_MV_SCALEUP(low); |
181 |
block_sz *= 2; |
block_sz++; |
182 |
} |
} |
183 |
|
|
184 |
k = m * (int)(width - x * block_sz); |
k = (int)(width - (x<<block_sz))<<precision; |
185 |
*max_dx = MIN(high, k); |
*max_dx = MIN(high, k); |
186 |
k = m * (int)(height - y * block_sz); |
k = (int)(height - (y<<block_sz))<<precision; |
187 |
*max_dy = MIN(high, k); |
*max_dy = MIN(high, k); |
188 |
|
|
189 |
k = -m * (int)((x+1) * block_sz); |
k = (-(int)((x+1)<<block_sz))<<precision; |
190 |
*min_dx = MAX(low, k); |
*min_dx = MAX(low, k); |
191 |
k = -m * (int)((y+1) * block_sz); |
k = (-(int)((y+1)<<block_sz))<<precision; |
192 |
*min_dy = MAX(low, k); |
*min_dy = MAX(low, k); |
193 |
} |
} |
194 |
|
|
195 |
typedef void MainSearchFunc(int x, int y, const SearchData * const Data, int bDirection); |
typedef void |
196 |
|
MainSearchFunc(int x, int y, const SearchData * const Data, |
197 |
|
int bDirection, CheckFunc * const CheckCandidate); |
198 |
|
|
199 |
static MainSearchFunc DiamondSearch, AdvDiamondSearch, SquareSearch; |
static MainSearchFunc DiamondSearch, AdvDiamondSearch, SquareSearch; |
200 |
|
|
338 |
#include "../dct/fdct.h" |
#include "../dct/fdct.h" |
339 |
|
|
340 |
static int |
static int |
341 |
CountMBBitsInter(SearchData * const Data, |
findRDinter(SearchData * const Data, |
342 |
const MACROBLOCK * const pMBs, const int x, const int y, |
const MACROBLOCK * const pMBs, const int x, const int y, |
343 |
const MBParam * const pParam, |
const MBParam * const pParam, |
344 |
const uint32_t MotionFlags); |
const uint32_t MotionFlags); |
345 |
|
|
346 |
static int |
static int |
347 |
CountMBBitsInter4v(const SearchData * const Data, |
findRDinter4v(const SearchData * const Data, |
348 |
MACROBLOCK * const pMB, const MACROBLOCK * const pMBs, |
MACROBLOCK * const pMB, const MACROBLOCK * const pMBs, |
349 |
const int x, const int y, |
const int x, const int y, |
350 |
const MBParam * const pParam, const uint32_t MotionFlags, |
const MBParam * const pParam, const uint32_t MotionFlags, |
351 |
const VECTOR * const backup); |
const VECTOR * const backup); |
352 |
|
|
353 |
static int |
static int |
354 |
CountMBBitsIntra(const SearchData * const Data); |
findRDintra(const SearchData * const Data); |
355 |
|
|
356 |
static int |
static int |
357 |
CountMBBitsGMC(const SearchData * const Data, const IMAGE * const vGMC, const int x, const int y); |
findRDgmc(const SearchData * const Data, const IMAGE * const vGMC, const int x, const int y); |
358 |
|
|
359 |
int CodeCoeffIntra_CalcBits(const int16_t qcoeff[64], const uint16_t * zigzag); |
int CodeCoeffIntra_CalcBits(const int16_t qcoeff[64], const uint16_t * zigzag); |
360 |
int CodeCoeffInter_CalcBits(const int16_t qcoeff[64], const uint16_t * zigzag); |
int CodeCoeffInter_CalcBits(const int16_t qcoeff[64], const uint16_t * zigzag); |
396 |
distortion += data[i]*data[i]; |
distortion += data[i]*data[i]; |
397 |
} |
} |
398 |
|
|
399 |
|
return bits + (LAMBDA*distortion)/(quant*quant); |
|
bits += (LAMBDA*distortion)/(quant*quant); |
|
|
|
|
|
return bits; |
|
400 |
} |
} |
401 |
|
|
402 |
static __inline unsigned int |
static __inline unsigned int |
435 |
if (quant_type) dequant_intra(dqcoeff, coeff, quant, iDcScaler); |
if (quant_type) dequant_intra(dqcoeff, coeff, quant, iDcScaler); |
436 |
else dequant4_intra(dqcoeff, coeff, quant, iDcScaler); |
else dequant4_intra(dqcoeff, coeff, quant, iDcScaler); |
437 |
|
|
438 |
for (i = 0; i < 64; i++) { |
for (i = 0; i < 64; i++) |
439 |
distortion += (data[i] - dqcoeff[i])*(data[i] - dqcoeff[i]); |
distortion += (data[i] - dqcoeff[i])*(data[i] - dqcoeff[i]); |
|
} |
|
|
|
|
|
bits += (LAMBDA*distortion)/(quant*quant); |
|
440 |
|
|
441 |
return bits; |
return bits + (LAMBDA*distortion)/(quant*quant); |
442 |
} |
} |
443 |
|
|
444 |
#endif /* _MOTION_EST_H_ */ |
#endif /* _MOTION_EST_H_ */ |