173 |
} |
} |
174 |
} |
} |
175 |
|
|
|
|
|
|
static __inline void |
|
|
compensate16x16_interpolate_ro(int16_t * const dct_codes, |
|
|
const uint8_t * const cur, |
|
|
const uint8_t * const ref, |
|
|
const uint8_t * const refh, |
|
|
const uint8_t * const refv, |
|
|
const uint8_t * const refhv, |
|
|
uint8_t * const tmp, |
|
|
const uint32_t x, const uint32_t y, |
|
|
const int32_t dx, const int32_t dy, |
|
|
const int32_t stride, |
|
|
const int quarterpel) |
|
|
{ |
|
|
const uint8_t * ptr; |
|
|
|
|
|
if(quarterpel) { |
|
|
if ((dx&3) | (dy&3)) { |
|
|
interpolate16x16_quarterpel(tmp - y * stride - x, |
|
|
(uint8_t *) ref, tmp + 32, |
|
|
tmp + 64, tmp + 96, x, y, dx, dy, stride, 0); |
|
|
ptr = tmp; |
|
|
} else ptr = ref + (y + dy/4)*stride + x + dx/4; // fullpixel position |
|
|
|
|
|
} else ptr = get_ref(ref, refh, refv, refhv, x, y, 1, dx, dy, stride); |
|
|
|
|
|
transfer_8to16subro(dct_codes, cur + y * stride + x, |
|
|
ptr, stride); |
|
|
transfer_8to16subro(dct_codes+64, cur + y * stride + x + 8, |
|
|
ptr + 8, stride); |
|
|
transfer_8to16subro(dct_codes+128, cur + y * stride + x + 8*stride, |
|
|
ptr + 8*stride, stride); |
|
|
transfer_8to16subro(dct_codes+192, cur + y * stride + x + 8*stride+8, |
|
|
ptr + 8*stride + 8, stride); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
176 |
/* XXX: slow, inelegant... */ |
/* XXX: slow, inelegant... */ |
177 |
static void |
static void |
178 |
interpolate18x18_switch(uint8_t * const cur, |
interpolate18x18_switch(uint8_t * const cur, |
257 |
int32_t dx; |
int32_t dx; |
258 |
int32_t dy; |
int32_t dy; |
259 |
|
|
|
|
|
260 |
uint8_t * const tmp = refv->u; |
uint8_t * const tmp = refv->u; |
261 |
|
|
262 |
if ( (!reduced_resolution) && (mb->mode == MODE_NOT_CODED) ) { /* quick copy for early SKIP */ |
if ( (!reduced_resolution) && (mb->mode == MODE_NOT_CODED) ) { /* quick copy for early SKIP */ |
318 |
refv->y, refhv->y, tmp, 16 * i, 16 * j, dx, dy, |
refv->y, refhv->y, tmp, 16 * i, 16 * j, dx, dy, |
319 |
edged_width, quarterpel, reduced_resolution, rounding); |
edged_width, quarterpel, reduced_resolution, rounding); |
320 |
|
|
321 |
dx /= (int)(1 + quarterpel); |
if (quarterpel) { dx /= 2; dy /= 2; } |
|
dy /= (int)(1 + quarterpel); |
|
322 |
|
|
323 |
dx = (dx >> 1) + roundtab_79[dx & 0x3]; |
dx = (dx >> 1) + roundtab_79[dx & 0x3]; |
324 |
dy = (dy >> 1) + roundtab_79[dy & 0x3]; |
dy = (dy >> 1) + roundtab_79[dy & 0x3]; |
330 |
for (k = 0; k < 4; k++) { |
for (k = 0; k < 4; k++) { |
331 |
dx = mvs[k].x; |
dx = mvs[k].x; |
332 |
dy = mvs[k].y; |
dy = mvs[k].y; |
333 |
sumx += dx / (1 + quarterpel); |
sumx += quarterpel ? dx/2 : dx; |
334 |
sumy += dy / (1 + quarterpel); |
sumy += quarterpel ? dy/2 : dy; |
335 |
|
|
336 |
if (reduced_resolution){ |
if (reduced_resolution){ |
337 |
dx = RRV_MV_SCALEUP(dx); |
dx = RRV_MV_SCALEUP(dx); |
396 |
case MODE_BACKWARD: |
case MODE_BACKWARD: |
397 |
b_dx = bmvs->x; b_dy = bmvs->y; |
b_dx = bmvs->x; b_dy = bmvs->y; |
398 |
|
|
399 |
compensate16x16_interpolate_ro(&dct_codes[0 * 64], cur->y, b_ref->y, b_refh->y, |
compensate16x16_interpolate(&dct_codes[0 * 64], cur->y, b_ref->y, b_refh->y, |
400 |
b_refv->y, b_refhv->y, tmp, 16 * i, 16 * j, b_dx, |
b_refv->y, b_refhv->y, tmp, 16 * i, 16 * j, b_dx, |
401 |
b_dy, edged_width, quarterpel); |
b_dy, edged_width, quarterpel, 0, 0); |
402 |
|
|
403 |
if (quarterpel) { b_dx /= 2; b_dy /= 2; } |
if (quarterpel) { b_dx /= 2; b_dy /= 2; } |
404 |
|
|
457 |
|
|
458 |
break; |
break; |
459 |
|
|
460 |
default: // MODE_DIRECT |
default: // MODE_DIRECT (or MODE_DIRECT_NONE_MV in case of bframes decoding) |
461 |
sumx = sumy = b_sumx = b_sumy = 0; |
sumx = sumy = b_sumx = b_sumy = 0; |
462 |
|
|
463 |
for (k = 0; k < 4; k++) { |
for (k = 0; k < 4; k++) { |
555 |
if (num_wp==2) { |
if (num_wp==2) { |
556 |
gmc->dyF = -gmc->dxG; |
gmc->dyF = -gmc->dxG; |
557 |
gmc->dyG = gmc->dxF; |
gmc->dyG = gmc->dxF; |
558 |
} |
} else if (num_wp==3) { |
|
else if (num_wp==3) { |
|
559 |
gmc->beta = log2bin(gmc->H-1); |
gmc->beta = log2bin(gmc->H-1); |
560 |
gmc->Hs = (1 << gmc->beta); |
gmc->Hs = (1 << gmc->beta); |
561 |
gmc->dyF = RDIV( 8*gmc->Hs*du2, gmc->H ); |
gmc->dyF = RDIV( 8*gmc->Hs*du2, gmc->H ); |
565 |
gmc->dxG <<= (gmc->beta - gmc->alpha); |
gmc->dxG <<= (gmc->beta - gmc->alpha); |
566 |
gmc->alpha = gmc->beta; |
gmc->alpha = gmc->beta; |
567 |
gmc->Ws = 1<< gmc->beta; |
gmc->Ws = 1<< gmc->beta; |
568 |
} |
} else { |
|
else { |
|
569 |
gmc->dyF <<= gmc->alpha - gmc->beta; |
gmc->dyF <<= gmc->alpha - gmc->beta; |
570 |
gmc->dyG <<= gmc->alpha - gmc->beta; |
gmc->dyG <<= gmc->alpha - gmc->beta; |
571 |
} |
} |
596 |
unsigned int mj,mi; |
unsigned int mj,mi; |
597 |
VECTOR avgMV; |
VECTOR avgMV; |
598 |
|
|
599 |
for (mj=0;mj<mb_height;mj++) |
for (mj = 0; mj < (unsigned int)mb_height; mj++) |
600 |
for (mi=0;mi<mb_width; mi++) |
for (mi = 0; mi < (unsigned int)mb_width; mi++) { |
601 |
{ |
|
602 |
avgMV = generate_GMCimageMB(gmc_data, pRef, mi, mj, |
avgMV = generate_GMCimageMB(gmc_data, pRef, mi, mj, |
603 |
stride, stride2, quarterpel, rounding, pGMC); |
stride, stride2, quarterpel, rounding, pGMC); |
604 |
|
|
650 |
|
|
651 |
Fj = gmc_data->Fo + dyF*mj*16 + dxF*mi*16; |
Fj = gmc_data->Fo + dyF*mj*16 + dxF*mi*16; |
652 |
Gj = gmc_data->Go + dyG*mj*16 + dxG*mi*16; |
Gj = gmc_data->Go + dyG*mj*16 + dxG*mi*16; |
653 |
for (J=16; J>0; --J) |
|
654 |
{ |
for (J = 16; J > 0; --J) { |
655 |
int32_t Fi, Gi; |
int32_t Fi, Gi; |
656 |
|
|
657 |
Fi = Fj; Fj += dyF; |
Fi = Fj; Fj += dyF; |
658 |
Gi = Gj; Gj += dyG; |
Gi = Gj; Gj += dyG; |
659 |
for (I=-16; I<0; ++I) |
for (I = -16; I < 0; ++I) { |
|
{ |
|
660 |
int32_t F, G; |
int32_t F, G; |
661 |
uint32_t ri, rj; |
uint32_t ri, rj; |
662 |
|
|
692 |
dstY[I] = (uint8_t)f0; |
dstY[I] = (uint8_t)f0; |
693 |
} |
} |
694 |
} |
} |
695 |
|
|
696 |
dstY += stride; |
dstY += stride; |
697 |
} |
} |
698 |
|
|
701 |
|
|
702 |
Fj = gmc_data->cFo + dyF*4 *mj*8 + dxF*4 *mi*8; |
Fj = gmc_data->cFo + dyF*4 *mj*8 + dxF*4 *mi*8; |
703 |
Gj = gmc_data->cGo + dyG*4 *mj*8 + dxG*4 *mi*8; |
Gj = gmc_data->cGo + dyG*4 *mj*8 + dxG*4 *mi*8; |
704 |
for (J=8; J>0; --J) |
|
705 |
{ |
for (J = 8; J > 0; --J) { |
706 |
int32_t Fi, Gi; |
int32_t Fi, Gi; |
707 |
Fi = Fj; Fj += 4*dyF; |
Fi = Fj; Fj += 4*dyF; |
708 |
Gi = Gj; Gj += 4*dyG; |
Gi = Gj; Gj += 4*dyG; |
709 |
|
|
710 |
for (I=-8; I<0; ++I) |
for (I = -8; I < 0; ++I) { |
|
{ |
|
711 |
int32_t F, G; |
int32_t F, G; |
712 |
uint32_t ri, rj; |
uint32_t ri, rj; |
713 |
|
|
877 |
return; |
return; |
878 |
} |
} |
879 |
|
|
|
|
|
|
|
|
880 |
void |
void |
881 |
generate_GMCimage( const GMC_DATA *const gmc_data, // [input] precalculated data |
generate_GMCimage( const GMC_DATA *const gmc_data, // [input] precalculated data |
882 |
const IMAGE *const pRef, // [input] |
const IMAGE *const pRef, // [input] |
896 |
VECTOR avgMV; |
VECTOR avgMV; |
897 |
|
|
898 |
for (mj=0;mj<mb_height;mj++) |
for (mj=0;mj<mb_height;mj++) |
899 |
for (mi=0;mi<mb_width; mi++) |
for (mi = 0;mi < mb_width; mi++) { |
900 |
{ |
|
901 |
avgMV = generate_GMCimageMB(gmc_data, pRef, mi, mj, |
avgMV = generate_GMCimageMB(gmc_data, pRef, mi, mj, |
902 |
stride, stride2, quarterpel, rounding, pGMC); |
stride, stride2, quarterpel, rounding, pGMC); |
903 |
|
|