summaryrefslogtreecommitdiff
path: root/libavcodec/vc1.c
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2006-07-28 03:27:37 +0000
committerKostya Shishkov <kostya.shishkov@gmail.com>2006-07-28 03:27:37 +0000
commit0154bae137c6433c82d6bd9fd0e9d4c6633e886a (patch)
treeb7da193d2aa0be50b76e938f9ef7bca88d1f3b24 /libavcodec/vc1.c
parentb2828252a9e31324f7ca79fccbf5a31d29c9369e (diff)
Add rounding for overlap filters
Originally committed as revision 5834 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/vc1.c')
-rw-r--r--libavcodec/vc1.c56
1 files changed, 28 insertions, 28 deletions
diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c
index 0e6ee3d177..d82acc73ea 100644
--- a/libavcodec/vc1.c
+++ b/libavcodec/vc1.c
@@ -831,7 +831,7 @@ static void vc1_inv_trans(DCTELEM block[64], int M, int N)
* @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 @@ static void vc1_v_overlap(uint8_t* src, int stride)
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 @@ static void vc1_v_overlap(uint8_t* src, int stride)
* @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 @@ static void vc1_h_overlap(uint8_t* src, int stride)
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 @@ static int vc1_decode_p_mb(VC1Context *v)
/* 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 @@ static int vc1_decode_p_mb(VC1Context *v)
/* 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 @@ static void vc1_decode_b_mb(VC1Context *v)
/* 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 @@ static void vc1_decode_i_blocks(VC1Context *v)
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) {