vc1dec: Fix destination pointers in context for fields

This replaces a large number of checks for the second field by
fixing the pointers when they are setup

This should also fix I/BI field pictures

Changes checksums for vc1_sa10143, the file becomes slightly closer
to what the reference decoder outputs

Based on "vc1dec: the second field is written wrong to the picture"
         by Sebastian Sandberg <sebastiand.sandberg@gmail.com>

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2013-02-01 19:58:26 +01:00
parent a8e748eee5
commit 0d194ee51e
2 changed files with 35 additions and 41 deletions

View File

@ -74,6 +74,17 @@ enum Imode {
};
/** @} */ //imode defines
static void init_block_index(VC1Context *v)
{
MpegEncContext *s = &v->s;
ff_init_block_index(s);
if (v->field_mode && v->second_field) {
s->dest[0] += s->current_picture_ptr->f.linesize[0];
s->dest[1] += s->current_picture_ptr->f.linesize[1];
s->dest[2] += s->current_picture_ptr->f.linesize[2];
}
}
/** @} */ //Bitplane group
@ -500,13 +511,8 @@ static void vc1_mc_1mv(VC1Context *v, int dir)
srcY += s->mspel * (1 + s->linesize);
}
if (v->field_mode && v->second_field) {
off = s->current_picture_ptr->f.linesize[0];
off_uv = s->current_picture_ptr->f.linesize[1];
} else {
off = 0;
off_uv = 0;
}
if (s->mspel) {
dxy = ((my & 3) << 2) | (mx & 3);
v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off , srcY , s->linesize, v->rnd);
@ -642,8 +648,6 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8;
else
off = s->linesize * 4 * (n & 2) + (n & 1) * 8;
if (v->field_mode && v->second_field)
off += s->current_picture_ptr->f.linesize[0];
src_x = s->mb_x * 16 + (n & 1) * 8 + (mx >> 2);
if (!fieldmv)
@ -880,7 +884,7 @@ static void vc1_mc_4mv_chroma(VC1Context *v, int dir)
srcU += s->current_picture_ptr->f.linesize[1];
srcV += s->current_picture_ptr->f.linesize[2];
}
off = v->second_field ? s->current_picture_ptr->f.linesize[1] : 0;
off = 0;
}
if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
@ -1951,13 +1955,8 @@ static void vc1_interp_mc(VC1Context *v)
srcY += s->mspel * (1 + s->linesize);
}
if (v->field_mode && v->second_field) {
off = s->current_picture_ptr->f.linesize[0];
off_uv = s->current_picture_ptr->f.linesize[1];
} else {
off = 0;
off_uv = 0;
}
if (s->mspel) {
dxy = ((my & 3) << 2) | (mx & 3);
@ -3961,7 +3960,6 @@ static int vc1_decode_p_mb_intfi(VC1Context *v)
continue;
v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
off += v->second_field ? ((i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0]) : 0;
s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
// TODO: loop filter
}
@ -4008,8 +4006,6 @@ static int vc1_decode_p_mb_intfi(VC1Context *v)
dst_idx += i >> 2;
val = ((cbp >> (5 - i)) & 1);
off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
if (v->second_field)
off += (i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0];
if (val) {
pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
first_block, s->dest[dst_idx] + off,
@ -4238,7 +4234,6 @@ static void vc1_decode_b_mb_intfi(VC1Context *v)
for (j = 0; j < 64; j++)
s->block[i][j] <<= 1;
off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
off += v->second_field ? ((i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0]) : 0;
s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
// TODO: yet to perform loop filter
}
@ -4320,8 +4315,6 @@ static void vc1_decode_b_mb_intfi(VC1Context *v)
dst_idx += i >> 2;
val = ((cbp >> (5 - i)) & 1);
off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
if (v->second_field)
off += (i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0];
if (val) {
vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
first_block, s->dest[dst_idx] + off,
@ -4380,7 +4373,7 @@ static void vc1_decode_i_blocks(VC1Context *v)
s->first_slice_line = 1;
for (s->mb_y = 0; s->mb_y < s->end_mb_y; s->mb_y++) {
s->mb_x = 0;
ff_init_block_index(s);
init_block_index(v);
for (; s->mb_x < v->end_mb_x; s->mb_x++) {
uint8_t *dst[6];
ff_update_block_index(s);
@ -4520,13 +4513,13 @@ static void vc1_decode_i_blocks_adv(VC1Context *v)
s->mb_y = s->start_mb_y;
if (s->start_mb_y) {
s->mb_x = 0;
ff_init_block_index(s);
init_block_index(v);
memset(&s->coded_block[s->block_index[0] - s->b8_stride], 0,
(1 + s->b8_stride) * sizeof(*s->coded_block));
}
for (; s->mb_y < s->end_mb_y; s->mb_y++) {
s->mb_x = 0;
ff_init_block_index(s);
init_block_index(v);
for (;s->mb_x < s->mb_width; s->mb_x++) {
int16_t (*block)[64] = v->block[v->cur_blk_idx];
ff_update_block_index(s);
@ -4597,7 +4590,8 @@ static void vc1_decode_i_blocks_adv(VC1Context *v)
/* raw bottom MB row */
s->mb_x = 0;
ff_init_block_index(s);
init_block_index(v);
for (;s->mb_x < s->mb_width; s->mb_x++) {
ff_update_block_index(s);
vc1_put_signed_blocks_clamped(v);
@ -4645,7 +4639,7 @@ static void vc1_decode_p_blocks(VC1Context *v)
memset(v->cbp_base, 0, sizeof(v->cbp_base[0])*2*s->mb_stride);
for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
s->mb_x = 0;
ff_init_block_index(s);
init_block_index(v);
for (; s->mb_x < s->mb_width; s->mb_x++) {
ff_update_block_index(s);
@ -4673,7 +4667,7 @@ static void vc1_decode_p_blocks(VC1Context *v)
}
if (apply_loop_filter && v->fcm == PROGRESSIVE) {
s->mb_x = 0;
ff_init_block_index(s);
init_block_index(v);
for (; s->mb_x < s->mb_width; s->mb_x++) {
ff_update_block_index(s);
vc1_apply_p_loop_filter(v);
@ -4717,7 +4711,7 @@ static void vc1_decode_b_blocks(VC1Context *v)
s->first_slice_line = 1;
for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
s->mb_x = 0;
ff_init_block_index(s);
init_block_index(v);
for (; s->mb_x < s->mb_width; s->mb_x++) {
ff_update_block_index(s);
@ -4754,7 +4748,7 @@ static void vc1_decode_skip_blocks(VC1Context *v)
s->first_slice_line = 1;
for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
s->mb_x = 0;
ff_init_block_index(s);
init_block_index(v);
ff_update_block_index(s);
if (s->last_picture.f.data[0]) {
memcpy(s->dest[0], s->last_picture.f.data[0] + s->mb_y * 16 * s->linesize, s->linesize * 16);

View File

@ -1,31 +1,31 @@
#tb 0: 1/25
0, 0, 0, 1, 518400, 0x89407f55
0, 2, 2, 1, 518400, 0x1480849d
0, 2, 2, 1, 518400, 0x8611849c
0, 3, 3, 1, 518400, 0x0e69ff59
0, 4, 4, 1, 518400, 0x00d6db06
0, 4, 4, 1, 518400, 0xf31adb03
0, 5, 5, 1, 518400, 0x1a5b6a69
0, 6, 6, 1, 518400, 0xc1a1232e
0, 6, 6, 1, 518400, 0x6ae6232e
0, 7, 7, 1, 518400, 0x9a4e3c54
0, 8, 8, 1, 518400, 0x04122b44
0, 8, 8, 1, 518400, 0xe5852b45
0, 9, 9, 1, 518400, 0x0fcfeebc
0, 10, 10, 1, 518400, 0xc7882dc1
0, 10, 10, 1, 518400, 0x06e22dc3
0, 11, 11, 1, 518400, 0x9d79df09
0, 12, 12, 1, 518400, 0xff6b716f
0, 12, 12, 1, 518400, 0xcb2c716f
0, 13, 13, 1, 518400, 0x638a8746
0, 14, 14, 1, 518400, 0x07572efb
0, 14, 14, 1, 518400, 0xf7032efd
0, 15, 15, 1, 518400, 0x306f6cef
0, 16, 16, 1, 518400, 0xd7602518
0, 16, 16, 1, 518400, 0xe83d2518
0, 17, 17, 1, 518400, 0x49ab5bf5
0, 18, 18, 1, 518400, 0x3c736b6c
0, 18, 18, 1, 518400, 0x6b336b6f
0, 19, 19, 1, 518400, 0x95ae00c9
0, 20, 20, 1, 518400, 0x7b9ab64e
0, 20, 20, 1, 518400, 0x68ddb64f
0, 21, 21, 1, 518400, 0x5205ea68
0, 22, 22, 1, 518400, 0xb486e618
0, 22, 22, 1, 518400, 0xb088e617
0, 23, 23, 1, 518400, 0xa3217616
0, 24, 24, 1, 518400, 0xc66bbc56
0, 24, 24, 1, 518400, 0x1723bc53
0, 25, 25, 1, 518400, 0xf024872a
0, 26, 26, 1, 518400, 0x97d2a8ba
0, 26, 26, 1, 518400, 0x2e81a8bb
0, 27, 27, 1, 518400, 0xa3a2418e
0, 28, 28, 1, 518400, 0x08460005
0, 28, 28, 1, 518400, 0xb7beffed
0, 29, 29, 1, 518400, 0x50fb6c94
0, 30, 30, 1, 518400, 0x5584bb40