Mercurial > libavcodec.hg
changeset 3528:79ad5cd43686 libavcodec
Use bicubic MC (should also remove those ringing artifacts) when needed
author | kostya |
---|---|
date | Sun, 30 Jul 2006 03:50:31 +0000 |
parents | 3187e7ffe52d |
children | b8656dfe6b1a |
files | vc1.c |
diffstat | 1 files changed, 31 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/vc1.c Sun Jul 30 03:47:26 2006 +0000 +++ b/vc1.c Sun Jul 30 03:50:31 2006 +0000 @@ -798,12 +798,13 @@ } if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) - || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16 - || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){ - uint8_t *uvbuf= s->edge_emu_buffer + 18 * s->linesize; + || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3 + || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 16 - s->mspel*3){ + uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize; - ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 16+1, 16+1, - src_x, src_y, s->h_edge_pos, s->v_edge_pos); + srcY -= s->mspel * (1 + s->linesize); + ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2, + src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos); srcY = s->edge_emu_buffer; ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1, uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); @@ -817,8 +818,8 @@ uint8_t *src, *src2; src = srcY; - for(j = 0; j < 17; j++) { - for(i = 0; i < 17; i++) src[i] = ((src[i] - 128) >> 1) + 128; + for(j = 0; j < 17 + s->mspel*2; j++) { + for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128; src += s->linesize; } src = srcU; src2 = srcV; @@ -837,8 +838,8 @@ uint8_t *src, *src2; src = srcY; - for(j = 0; j < 17; j++) { - for(i = 0; i < 17; i++) src[i] = v->luty[src[i]]; + for(j = 0; j < 17 + s->mspel*2; j++) { + for(i = 0; i < 17 + s->mspel*2; i++) src[i] = v->luty[src[i]]; src += s->linesize; } src = srcU; src2 = srcV; @@ -851,6 +852,7 @@ src2 += s->uvlinesize; } } + srcY += s->mspel * (1 + s->linesize); } if(v->fastuvmc) { @@ -858,7 +860,14 @@ uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1)); } - if(!s->quarter_sample) { // hpel mc + if(s->mspel) { + dxy = ((my & 3) << 2) | (mx & 3); + dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd); + dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd); + srcY += s->linesize * 8; + dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd); + dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd); + } else if(!s->quarter_sample) { // hpel mc mx >>= 1; my >>= 1; dxy = ((my & 1) << 1) | (mx & 1); @@ -913,10 +922,11 @@ srcY += src_y * s->linesize + src_x; - if(v->rangeredfrm || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16 - || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){ - ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 16+1, 16+1, - src_x, src_y, s->h_edge_pos, s->v_edge_pos); + if(v->rangeredfrm || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel + || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 8 - s->mspel){ + srcY -= s->mspel * (1 + s->linesize); + ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 9+s->mspel*2, 9+s->mspel*2, + src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos); srcY = s->edge_emu_buffer; /* if we deal with range reduction we need to scale source blocks */ if(v->rangeredfrm) { @@ -924,14 +934,18 @@ uint8_t *src; src = srcY; - for(j = 0; j < 17; j++) { - for(i = 0; i < 17; i++) src[i] = ((src[i] - 128) >> 1) + 128; + for(j = 0; j < 9 + s->mspel*2; j++) { + for(i = 0; i < 9 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128; src += s->linesize; } } + srcY += s->mspel * (1 + s->linesize); } - if(!s->quarter_sample) { // hpel mc + if(s->mspel) { + dxy = ((my & 3) << 2) | (mx & 3); + dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, v->rnd); + } else if(!s->quarter_sample) { // hpel mc mx >>= 1; my >>= 1; dxy = ((my & 1) << 1) | (mx & 1);