Mercurial > libavcodec.hg
changeset 3520:a48c957d0377 libavcodec
Add rounding for overlap filters
author | kostya |
---|---|
date | Fri, 28 Jul 2006 03:27:37 +0000 |
parents | 5ef29058581e |
children | ae749c2da968 |
files | vc1.c |
diffstat | 1 files changed, 28 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/vc1.c Thu Jul 27 20:37:21 2006 +0000 +++ b/vc1.c Fri Jul 28 03:27:37 2006 +0000 @@ -831,7 +831,7 @@ * @todo optimize * @todo move to DSPContext */ -static void vc1_v_overlap(uint8_t* src, int stride) +static void vc1_v_overlap(uint8_t* src, int stride, int rnd) { int i; int a, b, c, d; @@ -841,10 +841,10 @@ c = src[0]; d = src[stride]; - src[-2*stride] = clip_uint8((7*a + d + 3) >> 3); - src[-stride] = clip_uint8((-a + 7*b + c + d + 3) >> 3); - src[0] = clip_uint8((a + b + 7*c - d + 3) >> 3); - src[stride] = clip_uint8((a + 7*d + 3) >> 3); + src[-2*stride] = clip_uint8((7*a + d + 4 - rnd) >> 3); + src[-stride] = clip_uint8((-a + 7*b + c + d + 3 + rnd) >> 3); + src[0] = clip_uint8((a + b + 7*c - d + 4 - rnd) >> 3); + src[stride] = clip_uint8((a + 7*d + 3 + rnd) >> 3); src++; } } @@ -853,7 +853,7 @@ * @todo optimize * @todo move to DSPContext */ -static void vc1_h_overlap(uint8_t* src, int stride) +static void vc1_h_overlap(uint8_t* src, int stride, int rnd) { int i; int a, b, c, d; @@ -863,10 +863,10 @@ c = src[0]; d = src[1]; - src[-2] = clip_uint8((7*a + d + 3) >> 3); - src[-1] = clip_uint8((-a + 7*b + c + d + 3) >> 3); - src[0] = clip_uint8((a + b + 7*c - d + 3) >> 3); - src[1] = clip_uint8((a + 7*d + 3) >> 3); + src[-2] = clip_uint8((7*a + d + 4 - rnd) >> 3); + src[-1] = clip_uint8((-a + 7*b + c + d + 3 + rnd) >> 3); + src[0] = clip_uint8((a + b + 7*c - d + 4 - rnd) >> 3); + src[1] = clip_uint8((a + 7*d + 3 + rnd) >> 3); src += stride; } } @@ -2571,9 +2571,9 @@ /* TODO: proper loop filtering */ if(v->pq >= 9 && v->overlap) { if(v->a_avail) - vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); + vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? ((i&1)>>1) : (s->mb_y&1)); if(v->c_avail) - vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); + vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? (i&1) : (s->mb_x&1)); } } else if(val) { vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); @@ -2672,9 +2672,9 @@ /* TODO: proper loop filtering */ if(v->pq >= 9 && v->overlap) { if(v->a_avail) - vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); + vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? ((i&1)>>1) : (s->mb_y&1)); if(v->c_avail) - vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); + vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? (i&1) : (s->mb_x&1)); } } else if(is_coded[i]) { status = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); @@ -2835,9 +2835,9 @@ /* TODO: proper loop filtering */ if(v->pq >= 9 && v->overlap) { if(v->a_avail) - vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); + vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? ((i&1)>>1) : (s->mb_y&1)); if(v->c_avail) - vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); + vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? (i&1) : (s->mb_x&1)); } } else if(val) { vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); @@ -2926,21 +2926,21 @@ vc1_put_block(v, s->block); if(v->pq >= 9 && v->overlap) { /* XXX: do proper overlapping insted of loop filter */ if(!s->first_slice_line) { - vc1_v_overlap(s->dest[0], s->linesize); - vc1_v_overlap(s->dest[0] + 8, s->linesize); - vc1_v_overlap(s->dest[1], s->uvlinesize); - vc1_v_overlap(s->dest[2], s->uvlinesize); + vc1_v_overlap(s->dest[0], s->linesize, 0); + vc1_v_overlap(s->dest[0] + 8, s->linesize, 0); + vc1_v_overlap(s->dest[1], s->uvlinesize, s->mb_y&1); + vc1_v_overlap(s->dest[2], s->uvlinesize, s->mb_y&1); } - vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize); - vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize); + vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 1); + vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1); if(s->mb_x) { - vc1_h_overlap(s->dest[0], s->linesize); - vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize); - vc1_h_overlap(s->dest[1], s->uvlinesize); - vc1_h_overlap(s->dest[2], s->uvlinesize); + vc1_h_overlap(s->dest[0], s->linesize, 0); + vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 0); + vc1_h_overlap(s->dest[1], s->uvlinesize, s->mb_x&1); + vc1_h_overlap(s->dest[2], s->uvlinesize, s->mb_x&1); } - vc1_h_overlap(s->dest[0] + 8, s->linesize); - vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize); + vc1_h_overlap(s->dest[0] + 8, s->linesize, 1); + vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1); } if(get_bits_count(&s->gb) > v->bits) {