2 |
* |
* |
3 |
* Modifications: |
* Modifications: |
4 |
* |
* |
5 |
|
* 01.05.2002 updated MotionEstimationBVOP |
6 |
* 25.04.2002 partial prevMB conversion |
* 25.04.2002 partial prevMB conversion |
7 |
* 22.04.2002 remove some compile warning by chenm001 <chenm001@163.com> |
* 22.04.2002 remove some compile warning by chenm001 <chenm001@163.com> |
8 |
* 14.04.2002 added MotionEstimationBVOP() |
* 14.04.2002 added MotionEstimationBVOP() |
290 |
if (sadInit) |
if (sadInit) |
291 |
(*sadInit)(); |
(*sadInit)(); |
292 |
|
|
|
|
|
|
/* eventhough we have a seperate prevMBs, |
|
|
pmvfast/epsz does something "funny" with the previous frames data */ |
|
|
|
|
|
/* for (i = 0; i < iHcount; i++) |
|
|
for (j = 0; j < iWcount; j++) |
|
|
{ |
|
|
pMBs[j + i * iWcount].mvs[0] = prevMBs[j + i * iWcount].mvs[0]; |
|
|
pMBs[j + i * iWcount].mvs[1] = prevMBs[j + i * iWcount].mvs[1]; |
|
|
pMBs[j + i * iWcount].mvs[2] = prevMBs[j + i * iWcount].mvs[2]; |
|
|
pMBs[j + i * iWcount].mvs[3] = prevMBs[j + i * iWcount].mvs[3]; |
|
|
} |
|
|
*/ |
|
|
/*dprintf("*** BEFORE ***"); |
|
|
for (i = 0; i < iHcount; i++) |
|
|
for (j = 0; j < iWcount; j++) |
|
|
{ |
|
|
dprintf(" [%i,%i] mode=%i dquant=%i mvs=(%i %i %i %i) sad8=(%i %i %i %i) sad16=(%i)", j,i, |
|
|
pMBs[j + i * iWcount].mode, |
|
|
pMBs[j + i * iWcount].dquant, |
|
|
pMBs[j + i * iWcount].mvs[0], |
|
|
pMBs[j + i * iWcount].mvs[1], |
|
|
pMBs[j + i * iWcount].mvs[2], |
|
|
pMBs[j + i * iWcount].mvs[3], |
|
|
prevMBs[j + i * iWcount].sad8[0], |
|
|
prevMBs[j + i * iWcount].sad8[1], |
|
|
prevMBs[j + i * iWcount].sad8[2], |
|
|
prevMBs[j + i * iWcount].sad8[3], |
|
|
prevMBs[j + i * iWcount].sad16); |
|
|
} |
|
|
*/ |
|
|
|
|
293 |
// note: i==horizontal, j==vertical |
// note: i==horizontal, j==vertical |
294 |
for (i = 0; i < iHcount; i++) |
for (i = 0; i < iHcount; i++) |
295 |
for (j = 0; j < iWcount; j++) |
for (j = 0; j < iWcount; j++) |
364 |
pMB->mode = MODE_INTER; |
pMB->mode = MODE_INTER; |
365 |
pMB->mvs[0].x = pMB->mvs[1].x = pMB->mvs[2].x = pMB->mvs[3].x = mv16.x; |
pMB->mvs[0].x = pMB->mvs[1].x = pMB->mvs[2].x = pMB->mvs[3].x = mv16.x; |
366 |
pMB->mvs[0].y = pMB->mvs[1].y = pMB->mvs[2].y = pMB->mvs[3].y = mv16.y; |
pMB->mvs[0].y = pMB->mvs[1].y = pMB->mvs[2].y = pMB->mvs[3].y = mv16.y; |
367 |
|
pMB->sad8[0] = pMB->sad8[1] = pMB->sad8[2] = pMB->sad8[3] = sad16; |
368 |
pMB->pmvs[0].x = pmv16.x; |
pMB->pmvs[0].x = pmv16.x; |
369 |
pMB->pmvs[0].y = pmv16.y; |
pMB->pmvs[0].y = pmv16.y; |
370 |
} |
} |
371 |
else |
else |
372 |
|
{ |
373 |
pMB->mode = MODE_INTER4V; |
pMB->mode = MODE_INTER4V; |
374 |
|
pMB->sad8[0] *= 4; |
375 |
|
pMB->sad8[1] *= 4; |
376 |
|
pMB->sad8[2] *= 4; |
377 |
|
pMB->sad8[3] *= 4; |
378 |
|
} |
379 |
} |
} |
380 |
else |
else |
381 |
{ |
{ |
383 |
pMB->mode = MODE_INTER; |
pMB->mode = MODE_INTER; |
384 |
pMB->mvs[0].x = pMB->mvs[1].x = pMB->mvs[2].x = pMB->mvs[3].x = mv16.x; |
pMB->mvs[0].x = pMB->mvs[1].x = pMB->mvs[2].x = pMB->mvs[3].x = mv16.x; |
385 |
pMB->mvs[0].y = pMB->mvs[1].y = pMB->mvs[2].y = pMB->mvs[3].y = mv16.y; |
pMB->mvs[0].y = pMB->mvs[1].y = pMB->mvs[2].y = pMB->mvs[3].y = mv16.y; |
386 |
|
pMB->sad8[0] = pMB->sad8[1] = pMB->sad8[2] = pMB->sad8[3] = sad16; |
387 |
|
|
388 |
pMB->pmvs[0].x = pmv16.x; |
pMB->pmvs[0].x = pmv16.x; |
389 |
pMB->pmvs[0].y = pmv16.y; |
pMB->pmvs[0].y = pmv16.y; |
390 |
} |
} |
391 |
} |
} |
392 |
|
|
|
/* dprintf("*** AFTER ***", pMBs[0].b_mvs[0].x); |
|
|
for (i = 0; i < iHcount; i++) |
|
|
for (j = 0; j < iWcount; j++) |
|
|
{ |
|
|
dprintf(" [%i,%i] mode=%i dquant=%i mvs=(%i %i %i %i) sad8=(%i %i %i %i) sad16=(%i)", j,i, |
|
|
pMBs[j + i * iWcount].mode, |
|
|
pMBs[j + i * iWcount].dquant, |
|
|
pMBs[j + i * iWcount].mvs[0], |
|
|
pMBs[j + i * iWcount].mvs[1], |
|
|
pMBs[j + i * iWcount].mvs[2], |
|
|
pMBs[j + i * iWcount].mvs[3], |
|
|
pMBs[j + i * iWcount].sad8[0], |
|
|
pMBs[j + i * iWcount].sad8[1], |
|
|
pMBs[j + i * iWcount].sad8[2], |
|
|
pMBs[j + i * iWcount].sad8[3], |
|
|
pMBs[j + i * iWcount].sad16); |
|
|
} |
|
|
*/ |
|
|
|
|
393 |
return 0; |
return 0; |
394 |
} |
} |
395 |
|
|
1997 |
// TODO: need to incorporate prediction here (eg. sad += calc_delta_16) |
// TODO: need to incorporate prediction here (eg. sad += calc_delta_16) |
1998 |
***************************************************************/ |
***************************************************************/ |
1999 |
|
|
2000 |
/* |
|
2001 |
void MotionEstimationBVOP( |
void MotionEstimationBVOP( |
2002 |
MBParam * const pParam, |
MBParam * const pParam, |
2003 |
FRAMEINFO * const frame, |
FRAMEINFO * const frame, |
2019 |
const uint32_t mb_height = pParam->mb_height; |
const uint32_t mb_height = pParam->mb_height; |
2020 |
const int32_t edged_width = pParam->edged_width; |
const int32_t edged_width = pParam->edged_width; |
2021 |
|
|
2022 |
int32_t i,j; |
uint32_t i,j; |
2023 |
|
|
2024 |
int32_t f_sad16; |
int32_t f_sad16; |
2025 |
int32_t b_sad16; |
int32_t b_sad16; |
2043 |
&& b_mb->mvs[0].x == 0 |
&& b_mb->mvs[0].x == 0 |
2044 |
&& b_mb->mvs[0].y == 0) |
&& b_mb->mvs[0].y == 0) |
2045 |
{ |
{ |
2046 |
mb->mode = MB_IGNORE; |
mb->mode = MODE_NOT_CODED; |
2047 |
mb->mvs[0].x = 0; |
mb->mvs[0].x = 0; |
2048 |
mb->mvs[0].y = 0; |
mb->mvs[0].y = 0; |
2049 |
mb->b_mvs[0].x = 0; |
mb->b_mvs[0].x = 0; |
2058 |
i, j, |
i, j, |
2059 |
frame->motion_flags, frame->quant, frame->fcode, |
frame->motion_flags, frame->quant, frame->fcode, |
2060 |
pParam, |
pParam, |
2061 |
f_mbs, |
f_mbs, f_mbs /* todo */, |
2062 |
&mb->mvs[0], &pmv_dontcare); // ignore pmv |
&mb->mvs[0], &pmv_dontcare); // ignore pmv |
2063 |
|
|
2064 |
// backward search |
// backward search |
2067 |
i, j, |
i, j, |
2068 |
frame->motion_flags, frame->quant, frame->bcode, |
frame->motion_flags, frame->quant, frame->bcode, |
2069 |
pParam, |
pParam, |
2070 |
b_mbs, |
b_mbs, b_mbs, /* todo */ |
2071 |
&mb->b_mvs[0], &pmv_dontcare); // ignore pmv |
&mb->b_mvs[0], &pmv_dontcare); // ignore pmv |
2072 |
|
|
2073 |
// interpolate search (simple, but effective) |
// interpolate search (simple, but effective) |
2087 |
if (f_sad16 < b_sad16) |
if (f_sad16 < b_sad16) |
2088 |
{ |
{ |
2089 |
best_sad = f_sad16; |
best_sad = f_sad16; |
2090 |
mb->mode = MB_FORWARD; |
mb->mode = MODE_FORWARD; |
2091 |
} |
} |
2092 |
else |
else |
2093 |
{ |
{ |
2094 |
best_sad = b_sad16; |
best_sad = b_sad16; |
2095 |
mb->mode = MB_BACKWARD; |
mb->mode = MODE_BACKWARD; |
2096 |
} |
} |
2097 |
|
|
2098 |
if (i_sad16 < best_sad) |
if (i_sad16 < best_sad) |
2099 |
{ |
{ |
2100 |
best_sad = i_sad16; |
best_sad = i_sad16; |
2101 |
mb->mode = MB_INTERPOLATE; |
mb->mode = MODE_INTERPOLATE; |
2102 |
} |
} |
2103 |
|
|
2104 |
if (d_sad16 < best_sad) |
if (d_sad16 < best_sad) |
2105 |
{ |
{ |
2106 |
best_sad = d_sad16; |
best_sad = d_sad16; |
2107 |
mb->mode = MB_DIRECT; |
mb->mode = MODE_DIRECT; |
2108 |
} |
} |
2109 |
|
|
2110 |
} |
} |
2111 |
} |
} |
2112 |
} |
} |
|
|
|
|
*/ |
|