Commit 20de893b authored by Jerome Borsboom's avatar Jerome Borsboom Committed by Paul B Mahol

avcodec/vc1: change to using v->block instead of s->block for P frames

The new overlap smooting filter smoothes image pixels stored in v->block.
Switch to v->block instead of s->block for storing decoded image pixels for P
frames. Additionally, we must take incrementing *_blk_idx out of the
vc1_put_signed_blocks_clamped function.
Signed-off-by: 's avatarJerome Borsboom <jerome.borsboom@carpalis.nl>
parent 5e5c9f18
...@@ -136,6 +136,7 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) ...@@ -136,6 +136,7 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v)
} }
} }
} }
}
#define inc_blk_idx(idx) do { \ #define inc_blk_idx(idx) do { \
idx++; \ idx++; \
...@@ -143,12 +144,6 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) ...@@ -143,12 +144,6 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v)
idx = 0; \ idx = 0; \
} while (0) } while (0)
inc_blk_idx(v->topleft_blk_idx);
inc_blk_idx(v->top_blk_idx);
inc_blk_idx(v->left_blk_idx);
inc_blk_idx(v->cur_blk_idx);
}
/***********************************************************************/ /***********************************************************************/
/** /**
* @name VC-1 Block-level functions * @name VC-1 Block-level functions
...@@ -1325,15 +1320,15 @@ static int vc1_decode_p_mb(VC1Context *v) ...@@ -1325,15 +1320,15 @@ static int vc1_decode_p_mb(VC1Context *v)
if (i == 1 || i == 3 || s->mb_x) if (i == 1 || i == 3 || s->mb_x)
v->c_avail = v->mb_type[0][s->block_index[i] - 1]; v->c_avail = v->mb_type[0][s->block_index[i] - 1];
vc1_decode_intra_block(v, s->block[i], i, val, mquant, vc1_decode_intra_block(v, v->block[v->cur_blk_idx][i], i, val, mquant,
(i & 4) ? v->codingset2 : v->codingset); (i & 4) ? v->codingset2 : v->codingset);
if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
continue; continue;
v->vc1dsp.vc1_inv_trans_8x8(s->block[i]); v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]);
if (v->rangeredfrm) if (v->rangeredfrm)
for (j = 0; j < 64; j++) for (j = 0; j < 64; j++)
s->block[i][j] <<= 1; v->block[v->cur_blk_idx][i][j] <<= 1;
s->idsp.put_signed_pixels_clamped(s->block[i], s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i],
s->dest[dst_idx] + off, s->dest[dst_idx] + off,
i & 4 ? s->uvlinesize i & 4 ? s->uvlinesize
: s->linesize); : s->linesize);
...@@ -1346,7 +1341,7 @@ static int vc1_decode_p_mb(VC1Context *v) ...@@ -1346,7 +1341,7 @@ static int vc1_decode_p_mb(VC1Context *v)
block_cbp |= 0xF << (i << 2); block_cbp |= 0xF << (i << 2);
block_intra |= 1 << i; block_intra |= 1 << i;
} else if (val) { } else if (val) {
pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][i], i, mquant, ttmb, first_block,
s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize, s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize,
CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt); CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt);
block_cbp |= pat << (i << 2); block_cbp |= pat << (i << 2);
...@@ -1436,15 +1431,15 @@ static int vc1_decode_p_mb(VC1Context *v) ...@@ -1436,15 +1431,15 @@ static int vc1_decode_p_mb(VC1Context *v)
if (i == 1 || i == 3 || s->mb_x) if (i == 1 || i == 3 || s->mb_x)
v->c_avail = v->mb_type[0][s->block_index[i] - 1]; v->c_avail = v->mb_type[0][s->block_index[i] - 1];
vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, vc1_decode_intra_block(v, v->block[v->cur_blk_idx][i], i, is_coded[i], mquant,
(i & 4) ? v->codingset2 : v->codingset); (i & 4) ? v->codingset2 : v->codingset);
if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
continue; continue;
v->vc1dsp.vc1_inv_trans_8x8(s->block[i]); v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]);
if (v->rangeredfrm) if (v->rangeredfrm)
for (j = 0; j < 64; j++) for (j = 0; j < 64; j++)
s->block[i][j] <<= 1; v->block[v->cur_blk_idx][i][j] <<= 1;
s->idsp.put_signed_pixels_clamped(s->block[i], s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i],
s->dest[dst_idx] + off, s->dest[dst_idx] + off,
(i & 4) ? s->uvlinesize (i & 4) ? s->uvlinesize
: s->linesize); : s->linesize);
...@@ -1457,7 +1452,7 @@ static int vc1_decode_p_mb(VC1Context *v) ...@@ -1457,7 +1452,7 @@ static int vc1_decode_p_mb(VC1Context *v)
block_cbp |= 0xF << (i << 2); block_cbp |= 0xF << (i << 2);
block_intra |= 1 << i; block_intra |= 1 << i;
} else if (is_coded[i]) { } else if (is_coded[i]) {
pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][i], i, mquant, ttmb,
first_block, s->dest[dst_idx] + off, first_block, s->dest[dst_idx] + off,
(i & 4) ? s->uvlinesize : s->linesize, (i & 4) ? s->uvlinesize : s->linesize,
CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY),
...@@ -1584,11 +1579,11 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) ...@@ -1584,11 +1579,11 @@ static int vc1_decode_p_mb_intfr(VC1Context *v)
if (i == 1 || i == 3 || s->mb_x) if (i == 1 || i == 3 || s->mb_x)
v->c_avail = v->mb_type[0][s->block_index[i] - 1]; v->c_avail = v->mb_type[0][s->block_index[i] - 1];
vc1_decode_intra_block(v, s->block[i], i, val, mquant, vc1_decode_intra_block(v, v->block[v->cur_blk_idx][i], i, val, mquant,
(i & 4) ? v->codingset2 : v->codingset); (i & 4) ? v->codingset2 : v->codingset);
if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
continue; continue;
v->vc1dsp.vc1_inv_trans_8x8(s->block[i]); v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]);
if (i < 4) { if (i < 4) {
stride_y = s->linesize << fieldtx; stride_y = s->linesize << fieldtx;
off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize; off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize;
...@@ -1596,7 +1591,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) ...@@ -1596,7 +1591,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v)
stride_y = s->uvlinesize; stride_y = s->uvlinesize;
off = 0; off = 0;
} }
s->idsp.put_signed_pixels_clamped(s->block[i], s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i],
s->dest[dst_idx] + off, s->dest[dst_idx] + off,
stride_y); stride_y);
//TODO: loop filter //TODO: loop filter
...@@ -1670,7 +1665,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) ...@@ -1670,7 +1665,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v)
else else
off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize)); off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize));
if (val) { if (val) {
pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][i], i, mquant, ttmb,
first_block, s->dest[dst_idx] + off, first_block, s->dest[dst_idx] + off,
(i & 4) ? s->uvlinesize : (s->linesize << fieldtx), (i & 4) ? s->uvlinesize : (s->linesize << fieldtx),
CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt); CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt);
...@@ -1750,13 +1745,13 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) ...@@ -1750,13 +1745,13 @@ static int vc1_decode_p_mb_intfi(VC1Context *v)
if (i == 1 || i == 3 || s->mb_x) if (i == 1 || i == 3 || s->mb_x)
v->c_avail = v->mb_type[0][s->block_index[i] - 1]; v->c_avail = v->mb_type[0][s->block_index[i] - 1];
vc1_decode_intra_block(v, s->block[i], i, val, mquant, vc1_decode_intra_block(v, v->block[v->cur_blk_idx][i], i, val, mquant,
(i & 4) ? v->codingset2 : v->codingset); (i & 4) ? v->codingset2 : v->codingset);
if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
continue; continue;
v->vc1dsp.vc1_inv_trans_8x8(s->block[i]); v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]);
off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
s->idsp.put_signed_pixels_clamped(s->block[i], s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i],
s->dest[dst_idx] + off, s->dest[dst_idx] + off,
(i & 4) ? s->uvlinesize (i & 4) ? s->uvlinesize
: s->linesize); : s->linesize);
...@@ -1803,7 +1798,7 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) ...@@ -1803,7 +1798,7 @@ static int vc1_decode_p_mb_intfi(VC1Context *v)
val = ((cbp >> (5 - i)) & 1); val = ((cbp >> (5 - i)) & 1);
off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize; off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
if (val) { if (val) {
pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][i], i, mquant, ttmb,
first_block, s->dest[dst_idx] + off, first_block, s->dest[dst_idx] + off,
(i & 4) ? s->uvlinesize : s->linesize, (i & 4) ? s->uvlinesize : s->linesize,
CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY),
...@@ -2740,6 +2735,10 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) ...@@ -2740,6 +2735,10 @@ static void vc1_decode_i_blocks_adv(VC1Context *v)
get_bits_count(&s->gb), v->bits); get_bits_count(&s->gb), v->bits);
return; return;
} }
inc_blk_idx(v->topleft_blk_idx);
inc_blk_idx(v->top_blk_idx);
inc_blk_idx(v->left_blk_idx);
inc_blk_idx(v->cur_blk_idx);
} }
if (!v->s.loop_filter) if (!v->s.loop_filter)
ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16); ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
...@@ -2756,6 +2755,10 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) ...@@ -2756,6 +2755,10 @@ static void vc1_decode_i_blocks_adv(VC1Context *v)
vc1_put_signed_blocks_clamped(v); vc1_put_signed_blocks_clamped(v);
if (v->s.loop_filter) if (v->s.loop_filter)
ff_vc1_loop_filter_iblk_delayed(v, v->pq); ff_vc1_loop_filter_iblk_delayed(v, v->pq);
inc_blk_idx(v->topleft_blk_idx);
inc_blk_idx(v->top_blk_idx);
inc_blk_idx(v->left_blk_idx);
inc_blk_idx(v->cur_blk_idx);
} }
if (v->s.loop_filter) if (v->s.loop_filter)
ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16); ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
...@@ -2817,6 +2820,10 @@ static void vc1_decode_p_blocks(VC1Context *v) ...@@ -2817,6 +2820,10 @@ static void vc1_decode_p_blocks(VC1Context *v)
get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y); get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
return; return;
} }
inc_blk_idx(v->topleft_blk_idx);
inc_blk_idx(v->top_blk_idx);
inc_blk_idx(v->left_blk_idx);
inc_blk_idx(v->cur_blk_idx);
} }
memmove(v->cbp_base, v->cbp, sizeof(v->cbp_base[0]) * s->mb_stride); memmove(v->cbp_base, v->cbp, sizeof(v->cbp_base[0]) * s->mb_stride);
memmove(v->ttblk_base, v->ttblk, sizeof(v->ttblk_base[0]) * s->mb_stride); memmove(v->ttblk_base, v->ttblk, sizeof(v->ttblk_base[0]) * s->mb_stride);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment