Merge commit '1fb013a57c6d98d3f425506eb25f32b2cf7ddc6f'

* commit '1fb013a57c6d98d3f425506eb25f32b2cf7ddc6f':
  vc1dec: Add support for interlaced B-frames

Conflicts:
	libavcodec/vc1dec.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
pull/18/head
Michael Niedermayer 12 years ago
commit c453da33a3
  1. 27
      libavcodec/vc1dec.c

@ -4413,8 +4413,7 @@ static int vc1_decode_b_mb_intfr(VC1Context *v)
if (!skipped) { if (!skipped) {
idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2);
if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) {
{
twomv = 1; twomv = 1;
v->blk_mv_type[s->block_index[0]] = 1; v->blk_mv_type[s->block_index[0]] = 1;
v->blk_mv_type[s->block_index[1]] = 1; v->blk_mv_type[s->block_index[1]] = 1;
@ -4496,7 +4495,8 @@ static int vc1_decode_b_mb_intfr(VC1Context *v)
vc1_decode_intra_block(v, s->block[i], i, val, mquant, vc1_decode_intra_block(v, s->block[i], i, val, mquant,
(i & 4) ? v->codingset2 : v->codingset); (i & 4) ? v->codingset2 : v->codingset);
if ((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue; if (i > 3 && (s->flags & CODEC_FLAG_GRAY))
continue;
v->vc1dsp.vc1_inv_trans_8x8(s->block[i]); v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
if (i < 4) { if (i < 4) {
stride_y = s->linesize << fieldtx; stride_y = s->linesize << fieldtx;
@ -4535,8 +4535,7 @@ static int vc1_decode_b_mb_intfr(VC1Context *v)
if (!direct) { if (!direct) {
if (bmvtype == BMV_TYPE_INTERPOLATED & twomv) { if (bmvtype == BMV_TYPE_INTERPOLATED & twomv) {
v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
} } else if (bmvtype == BMV_TYPE_INTERPOLATED | twomv) {
else if (bmvtype == BMV_TYPE_INTERPOLATED | twomv) {
v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1); v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1);
} }
} }
@ -4564,9 +4563,8 @@ static int vc1_decode_b_mb_intfr(VC1Context *v)
dir = i==1 || i==3; dir = i==1 || i==3;
dmv_x = dmv_y = 0; dmv_x = dmv_y = 0;
val = ((mvbp >> (3 - i)) & 1); val = ((mvbp >> (3 - i)) & 1);
if (val) { if (val)
get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
}
j = i > 1 ? 2 : 0; j = i > 1 ? 2 : 0;
vc1_pred_mv_intfr(v, j, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], dir); vc1_pred_mv_intfr(v, j, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], dir);
vc1_mc_4mv_luma(v, j, dir, dir); vc1_mc_4mv_luma(v, j, dir, dir);
@ -4578,17 +4576,15 @@ static int vc1_decode_b_mb_intfr(VC1Context *v)
} else if (bmvtype == BMV_TYPE_INTERPOLATED) { } else if (bmvtype == BMV_TYPE_INTERPOLATED) {
mvbp = v->twomvbp; mvbp = v->twomvbp;
dmv_x = dmv_y = 0; dmv_x = dmv_y = 0;
if (mvbp & 2) { if (mvbp & 2)
get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
}
vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0); vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0);
vc1_mc_1mv(v, 0); vc1_mc_1mv(v, 0);
dmv_x = dmv_y = 0; dmv_x = dmv_y = 0;
if (mvbp & 1) { if (mvbp & 1)
get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
}
vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 1); vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 1);
vc1_interp_mc(v); vc1_interp_mc(v);
@ -4599,15 +4595,13 @@ static int vc1_decode_b_mb_intfr(VC1Context *v)
dir2 = !dir; dir2 = !dir;
mvbp = v->twomvbp; mvbp = v->twomvbp;
dmv_x = dmv_y = 0; dmv_x = dmv_y = 0;
if (mvbp & 2) { if (mvbp & 2)
get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
}
vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], dir); vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], dir);
dmv_x = dmv_y = 0; dmv_x = dmv_y = 0;
if (mvbp & 1) { if (mvbp & 1)
get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
}
vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], dir2); vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], dir2);
if (mvsw) { if (mvsw) {
@ -4632,9 +4626,8 @@ static int vc1_decode_b_mb_intfr(VC1Context *v)
mvbp = ff_vc1_mbmode_intfrp[0][idx_mbmode][2]; mvbp = ff_vc1_mbmode_intfrp[0][idx_mbmode][2];
dmv_x = dmv_y = 0; dmv_x = dmv_y = 0;
if (mvbp) { if (mvbp)
get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0); get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
}
vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], dir); vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], dir);
v->blk_mv_type[s->block_index[0]] = 1; v->blk_mv_type[s->block_index[0]] = 1;

Loading…
Cancel
Save