55 |
* 22.12.2001 lock based interpolation |
* 22.12.2001 lock based interpolation |
56 |
* 01.12.2001 inital version; (c)2001 peter ross <pross@cs.rmit.edu.au> |
* 01.12.2001 inital version; (c)2001 peter ross <pross@cs.rmit.edu.au> |
57 |
* |
* |
58 |
* $Id: decoder.c,v 1.37.2.17 2002-12-09 10:47:05 suxen_drol Exp $ |
* $Id: decoder.c,v 1.37.2.18 2002-12-10 11:13:50 suxen_drol Exp $ |
59 |
* |
* |
60 |
*************************************************************************/ |
*************************************************************************/ |
61 |
|
|
389 |
|
|
390 |
// decode an inter macroblock |
// decode an inter macroblock |
391 |
|
|
|
static void |
|
|
rrv_mv_scaleup(VECTOR * mv) |
|
|
{ |
|
|
if (mv->x > 0) { |
|
|
mv->x = 2*mv->x - 1; |
|
|
} else if (mv->x < 0) { |
|
|
mv->x = 2*mv->x + 1; |
|
|
} |
|
|
|
|
|
if (mv->y > 0) { |
|
|
mv->y = 2*mv->y - 1; |
|
|
} else if (mv->y < 0) { |
|
|
mv->y = 2*mv->y + 1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
392 |
void |
void |
393 |
decoder_mbinter(DECODER * dec, |
decoder_mbinter(DECODER * dec, |
394 |
const MACROBLOCK * pMB, |
const MACROBLOCK * pMB, |
413 |
uint8_t *pY_Cur, *pU_Cur, *pV_Cur; |
uint8_t *pY_Cur, *pU_Cur, *pV_Cur; |
414 |
|
|
415 |
int uv_dx, uv_dy; |
int uv_dx, uv_dy; |
416 |
VECTOR mv[4]; |
VECTOR mv[4]; /* local copy of mvs */ |
|
|
|
|
for (i = 0; i < 4; i++) |
|
|
{ |
|
|
mv[i] = pMB->mvs[i]; |
|
|
//DPRINTF(DPRINTF_MB, "mv[%i] orig=%i,%i local=%i", i, pMB->mvs[i].x, pMB->mvs[i].y, mv[i].x, mv[i].y); |
|
|
} |
|
417 |
|
|
418 |
if (reduced_resolution) { |
if (reduced_resolution) { |
419 |
pY_Cur = dec->cur.y + (y_pos << 5) * stride + (x_pos << 5); |
pY_Cur = dec->cur.y + (y_pos << 5) * stride + (x_pos << 5); |
420 |
pU_Cur = dec->cur.u + (y_pos << 4) * stride2 + (x_pos << 4); |
pU_Cur = dec->cur.u + (y_pos << 4) * stride2 + (x_pos << 4); |
421 |
pV_Cur = dec->cur.v + (y_pos << 4) * stride2 + (x_pos << 4); |
pV_Cur = dec->cur.v + (y_pos << 4) * stride2 + (x_pos << 4); |
422 |
rrv_mv_scaleup(&mv[0]); |
for (i = 0; i < 4; i++) { |
423 |
rrv_mv_scaleup(&mv[1]); |
mv[i].x = RRV_MV_SCALEUP(pMB->mvs[i].x); |
424 |
rrv_mv_scaleup(&mv[2]); |
mv[i].y = RRV_MV_SCALEUP(pMB->mvs[i].y); |
425 |
rrv_mv_scaleup(&mv[3]); |
} |
426 |
}else{ |
}else{ |
427 |
pY_Cur = dec->cur.y + (y_pos << 4) * stride + (x_pos << 4); |
pY_Cur = dec->cur.y + (y_pos << 4) * stride + (x_pos << 4); |
428 |
pU_Cur = dec->cur.u + (y_pos << 3) * stride2 + (x_pos << 3); |
pU_Cur = dec->cur.u + (y_pos << 3) * stride2 + (x_pos << 3); |
429 |
pV_Cur = dec->cur.v + (y_pos << 3) * stride2 + (x_pos << 3); |
pV_Cur = dec->cur.v + (y_pos << 3) * stride2 + (x_pos << 3); |
430 |
|
for (i = 0; i < 4; i++) |
431 |
|
mv[i] = pMB->mvs[i]; |
432 |
} |
} |
433 |
|
|
434 |
if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) { |
if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) { |
1729 |
} |
} |
1730 |
|
|
1731 |
|
|
|
/* reduced resolution deblocking filter */ |
|
|
|
|
1732 |
if (reduced_resolution) |
if (reduced_resolution) |
1733 |
{ |
{ |
1734 |
const int rmb_width = (dec->width + 31) / 32; |
image_deblock_rrv(&dec->cur, dec->edged_width, dec->mbs, |
1735 |
const int rmb_height = (dec->height + 31) / 32; |
(dec->width + 31) / 32, (dec->height + 31) / 32, dec->mb_width); |
|
const int edged_width2 = dec->edged_width /2; |
|
|
int i,j; |
|
|
|
|
|
/* horizontal deblocking */ |
|
|
|
|
|
for (j = 1; j < rmb_height*2; j++) // luma: j,i in block units |
|
|
for (i = 0; i < rmb_width*2; i++) |
|
|
{ |
|
|
if (dec->mbs[(j-1)/2*dec->mb_width + (i/2)].mode != MODE_NOT_CODED || |
|
|
dec->mbs[(j+0)/2*dec->mb_width + (i/2)].mode != MODE_NOT_CODED) |
|
|
{ |
|
|
xvid_HFilter_31_C(dec->cur.y + (j*16 - 1)*dec->edged_width + i*16, |
|
|
dec->cur.y + (j*16 + 0)*dec->edged_width + i*16, 2); |
|
|
} |
|
|
} |
|
|
|
|
|
for (j = 1; j < rmb_height; j++) // chroma |
|
|
for (i = 0; i < rmb_width; i++) |
|
|
{ |
|
|
if (dec->mbs[(j-1)*dec->mb_width + i].mode != MODE_NOT_CODED || |
|
|
dec->mbs[(j+0)*dec->mb_width + i].mode != MODE_NOT_CODED) |
|
|
{ |
|
|
hfilter_31(dec->cur.u + (j*16 - 1)*edged_width2 + i*16, |
|
|
dec->cur.u + (j*16 + 0)*edged_width2 + i*16, 2); |
|
|
hfilter_31(dec->cur.v + (j*16 - 1)*edged_width2 + i*16, |
|
|
dec->cur.v + (j*16 + 0)*edged_width2 + i*16, 2); |
|
|
} |
|
|
} |
|
|
|
|
|
/* vertical deblocking */ |
|
|
|
|
|
for (j = 0; j < rmb_height*2; j++) // luma: i,j in block units |
|
|
for (i = 1; i < rmb_width*2; i++) |
|
|
{ |
|
|
if (dec->mbs[(j/2)*dec->mb_width + (i-1)/2].mode != MODE_NOT_CODED || |
|
|
dec->mbs[(j/2)*dec->mb_width + (i+0)/2].mode != MODE_NOT_CODED) |
|
|
{ |
|
|
vfilter_31(dec->cur.y + (j*16)*dec->edged_width + i*16 - 1, |
|
|
dec->cur.y + (j*16)*dec->edged_width + i*16 + 0, |
|
|
dec->edged_width, 2); |
|
|
} |
|
|
} |
|
|
|
|
|
for (j = 0; j < rmb_height; j++) // chroma |
|
|
for (i = 1; i < rmb_width; i++) |
|
|
{ |
|
|
if (dec->mbs[j*dec->mb_width + i - 1].mode != MODE_NOT_CODED || |
|
|
dec->mbs[j*dec->mb_width + i + 0].mode != MODE_NOT_CODED) |
|
|
{ |
|
|
vfilter_31(dec->cur.u + (j*16)*edged_width2 + i*16 - 1, |
|
|
dec->cur.u + (j*16)*edged_width2 + i*16 + 0, |
|
|
edged_width2, 2); |
|
|
vfilter_31(dec->cur.v + (j*16)*edged_width2 + i*16 - 1, |
|
|
dec->cur.v + (j*16)*edged_width2 + i*16 + 0, |
|
|
edged_width2, 2); |
|
|
} |
|
|
} |
|
1736 |
} |
} |
1737 |
|
|
1738 |
BitstreamByteAlign(&bs); |
BitstreamByteAlign(&bs); |