mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
avcodec/vc1: cleanup and simplification
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
e4a6486c17
commit
38c619c1ed
209
libavcodec/vc1.c
209
libavcodec/vc1.c
@ -234,37 +234,34 @@ static int vop_dquant_decoding(VC1Context *v)
|
||||
int pqdiff;
|
||||
|
||||
//variable size
|
||||
if (v->dquant == 2) {
|
||||
pqdiff = get_bits(gb, 3);
|
||||
if (pqdiff == 7)
|
||||
v->altpq = get_bits(gb, 5);
|
||||
else
|
||||
v->altpq = v->pq + pqdiff + 1;
|
||||
} else {
|
||||
if (v->dquant != 2) {
|
||||
v->dquantfrm = get_bits1(gb);
|
||||
if (v->dquantfrm) {
|
||||
v->dqprofile = get_bits(gb, 2);
|
||||
switch (v->dqprofile) {
|
||||
case DQPROFILE_SINGLE_EDGE:
|
||||
case DQPROFILE_DOUBLE_EDGES:
|
||||
v->dqsbedge = get_bits(gb, 2);
|
||||
break;
|
||||
case DQPROFILE_ALL_MBS:
|
||||
v->dqbilevel = get_bits1(gb);
|
||||
if (!v->dqbilevel)
|
||||
v->halfpq = 0;
|
||||
default:
|
||||
break; //Forbidden ?
|
||||
}
|
||||
if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS) {
|
||||
pqdiff = get_bits(gb, 3);
|
||||
if (pqdiff == 7)
|
||||
v->altpq = get_bits(gb, 5);
|
||||
else
|
||||
v->altpq = v->pq + pqdiff + 1;
|
||||
if (!v->dquantfrm)
|
||||
return 0;
|
||||
|
||||
v->dqprofile = get_bits(gb, 2);
|
||||
switch (v->dqprofile) {
|
||||
case DQPROFILE_SINGLE_EDGE:
|
||||
case DQPROFILE_DOUBLE_EDGES:
|
||||
v->dqsbedge = get_bits(gb, 2);
|
||||
break;
|
||||
case DQPROFILE_ALL_MBS:
|
||||
v->dqbilevel = get_bits1(gb);
|
||||
if (!v->dqbilevel) {
|
||||
v->halfpq = 0;
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
break; //Forbidden ?
|
||||
}
|
||||
}
|
||||
|
||||
pqdiff = get_bits(gb, 3);
|
||||
if (pqdiff == 7)
|
||||
v->altpq = get_bits(gb, 5);
|
||||
else
|
||||
v->altpq = v->pq + pqdiff + 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -335,8 +332,7 @@ int ff_vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitCo
|
||||
return -1;
|
||||
}
|
||||
v->extended_mv = get_bits1(gb); //common
|
||||
if (!v->profile && v->extended_mv)
|
||||
{
|
||||
if (!v->profile && v->extended_mv) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"Extended MVs unavailable in Simple Profile\n");
|
||||
return -1;
|
||||
@ -345,8 +341,7 @@ int ff_vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitCo
|
||||
v->vstransform = get_bits1(gb); //common
|
||||
|
||||
v->res_transtab = get_bits1(gb);
|
||||
if (v->res_transtab)
|
||||
{
|
||||
if (v->res_transtab) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"1 for reserved RES_TRANSTAB is forbidden\n");
|
||||
return -1;
|
||||
@ -649,17 +644,14 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
|
||||
v->rangeredfrm = 0;
|
||||
if (v->rangered)
|
||||
v->rangeredfrm = get_bits1(gb);
|
||||
v->s.pict_type = get_bits1(gb);
|
||||
if (v->s.avctx->max_b_frames) {
|
||||
if (!v->s.pict_type) {
|
||||
if (get_bits1(gb))
|
||||
v->s.pict_type = AV_PICTURE_TYPE_I;
|
||||
else
|
||||
v->s.pict_type = AV_PICTURE_TYPE_B;
|
||||
if (get_bits1(gb)) {
|
||||
v->s.pict_type = AV_PICTURE_TYPE_P;
|
||||
} else {
|
||||
if (v->s.avctx->max_b_frames && !get_bits1(gb)) {
|
||||
v->s.pict_type = AV_PICTURE_TYPE_B;
|
||||
} else
|
||||
v->s.pict_type = AV_PICTURE_TYPE_P;
|
||||
} else
|
||||
v->s.pict_type = v->s.pict_type ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
|
||||
v->s.pict_type = AV_PICTURE_TYPE_I;
|
||||
}
|
||||
|
||||
v->bi_type = 0;
|
||||
if (v->s.pict_type == AV_PICTURE_TYPE_B) {
|
||||
@ -689,19 +681,25 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
|
||||
v->pq = ff_vc1_pquant_table[0][pqindex];
|
||||
else
|
||||
v->pq = ff_vc1_pquant_table[1][pqindex];
|
||||
|
||||
v->pquantizer = 1;
|
||||
if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
|
||||
v->pquantizer = pqindex < 9;
|
||||
if (v->quantizer_mode == QUANT_NON_UNIFORM)
|
||||
v->pquantizer = 0;
|
||||
v->pqindex = pqindex;
|
||||
if (pqindex < 9)
|
||||
v->halfpq = get_bits1(gb);
|
||||
else
|
||||
v->halfpq = 0;
|
||||
if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
|
||||
switch (v->quantizer_mode) {
|
||||
case QUANT_FRAME_IMPLICIT:
|
||||
v->pquantizer = pqindex < 9;
|
||||
break;
|
||||
case QUANT_NON_UNIFORM:
|
||||
v->pquantizer = 0;
|
||||
break;
|
||||
case QUANT_FRAME_EXPLICIT:
|
||||
v->pquantizer = get_bits1(gb);
|
||||
break;
|
||||
default:
|
||||
v->pquantizer = 1;
|
||||
break;
|
||||
}
|
||||
v->dquantfrm = 0;
|
||||
if (v->extended_mv == 1)
|
||||
v->mvrange = get_unary(gb, 0, 3);
|
||||
@ -725,9 +723,7 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
|
||||
|
||||
switch (v->s.pict_type) {
|
||||
case AV_PICTURE_TYPE_P:
|
||||
if (v->pq < 5) v->tt_index = 0;
|
||||
else if (v->pq < 13) v->tt_index = 1;
|
||||
else v->tt_index = 2;
|
||||
v->tt_index = (v->pq > 4) + (v->pq > 12);
|
||||
|
||||
lowquant = (v->pq > 12) ? 0 : 1;
|
||||
v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)];
|
||||
@ -741,16 +737,15 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
|
||||
INIT_LUT(v->lumscale, v->lumshift, v->last_luty[1], v->last_lutuv[1], 1);
|
||||
}
|
||||
v->qs_last = v->s.quarter_sample;
|
||||
if (v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
|
||||
v->s.quarter_sample = 0;
|
||||
else if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
|
||||
if (v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
|
||||
v->s.quarter_sample = 0;
|
||||
else
|
||||
v->s.quarter_sample = 1;
|
||||
} else
|
||||
v->s.quarter_sample = 1;
|
||||
v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || (v->mv_mode == MV_PMODE_INTENSITY_COMP && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
|
||||
if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
|
||||
v->s.quarter_sample = (v->mv_mode2 != MV_PMODE_1MV_HPEL &&
|
||||
v->mv_mode2 != MV_PMODE_1MV_HPEL_BILIN);
|
||||
v->s.mspel = (v->mv_mode2 != MV_PMODE_1MV_HPEL_BILIN);
|
||||
} else {
|
||||
v->s.quarter_sample = (v->mv_mode != MV_PMODE_1MV_HPEL &&
|
||||
v->mv_mode != MV_PMODE_1MV_HPEL_BILIN);
|
||||
v->s.mspel = (v->mv_mode != MV_PMODE_1MV_HPEL_BILIN);
|
||||
}
|
||||
|
||||
if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
|
||||
v->mv_mode2 == MV_PMODE_MIXED_MV) ||
|
||||
@ -779,21 +774,19 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
|
||||
vop_dquant_decoding(v);
|
||||
}
|
||||
|
||||
v->ttfrm = 0; //FIXME Is that so ?
|
||||
if (v->vstransform) {
|
||||
v->ttmbf = get_bits1(gb);
|
||||
if (v->ttmbf) {
|
||||
v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
|
||||
}
|
||||
} else
|
||||
v->ttfrm = 0; //FIXME Is that so ?
|
||||
} else {
|
||||
v->ttmbf = 1;
|
||||
v->ttfrm = TT_8X8;
|
||||
}
|
||||
break;
|
||||
case AV_PICTURE_TYPE_B:
|
||||
if (v->pq < 5) v->tt_index = 0;
|
||||
else if (v->pq < 13) v->tt_index = 1;
|
||||
else v->tt_index = 2;
|
||||
v->tt_index = (v->pq > 4) + (v->pq > 12);
|
||||
|
||||
v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
|
||||
v->qs_last = v->s.quarter_sample;
|
||||
@ -819,12 +812,12 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
|
||||
vop_dquant_decoding(v);
|
||||
}
|
||||
|
||||
v->ttfrm = 0;
|
||||
if (v->vstransform) {
|
||||
v->ttmbf = get_bits1(gb);
|
||||
if (v->ttmbf) {
|
||||
v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
|
||||
}
|
||||
} else
|
||||
v->ttfrm = 0;
|
||||
} else {
|
||||
v->ttmbf = 1;
|
||||
v->ttfrm = TT_8X8;
|
||||
@ -859,11 +852,12 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
||||
v->numref = 0;
|
||||
v->p_frame_skipped = 0;
|
||||
if (v->second_field) {
|
||||
if(v->fcm!=2 || v->field_mode!=1)
|
||||
if (v->fcm != ILACE_FIELD || v->field_mode!=1)
|
||||
return -1;
|
||||
v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
|
||||
if (v->fptype & 4)
|
||||
v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
|
||||
else
|
||||
v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
|
||||
v->s.current_picture_ptr->f->pict_type = v->s.pict_type;
|
||||
if (!v->pic_header_flag)
|
||||
goto parse_common_info;
|
||||
@ -889,10 +883,10 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
||||
if (v->field_mode) {
|
||||
v->s.mb_height = FFALIGN(v->s.height + 15 >> 4, 2);
|
||||
v->fptype = get_bits(gb, 3);
|
||||
v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
|
||||
if (v->fptype & 4) // B-picture
|
||||
v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
|
||||
|
||||
else
|
||||
v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
|
||||
} else {
|
||||
v->s.mb_height = v->s.height + 15 >> 4;
|
||||
switch (get_unary(gb, 0, 4)) {
|
||||
@ -974,24 +968,29 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
||||
pqindex = get_bits(gb, 5);
|
||||
if (!pqindex)
|
||||
return -1;
|
||||
v->pqindex = pqindex;
|
||||
if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
|
||||
v->pq = ff_vc1_pquant_table[0][pqindex];
|
||||
else
|
||||
v->pq = ff_vc1_pquant_table[1][pqindex];
|
||||
|
||||
v->pquantizer = 1;
|
||||
if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
|
||||
v->pquantizer = pqindex < 9;
|
||||
if (v->quantizer_mode == QUANT_NON_UNIFORM)
|
||||
v->pquantizer = 0;
|
||||
v->pqindex = pqindex;
|
||||
if (pqindex < 9)
|
||||
v->halfpq = get_bits1(gb);
|
||||
else
|
||||
v->halfpq = 0;
|
||||
if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
|
||||
switch (v->quantizer_mode) {
|
||||
case QUANT_FRAME_IMPLICIT:
|
||||
v->pquantizer = pqindex < 9;
|
||||
break;
|
||||
case QUANT_NON_UNIFORM:
|
||||
v->pquantizer = 0;
|
||||
break;
|
||||
case QUANT_FRAME_EXPLICIT:
|
||||
v->pquantizer = get_bits1(gb);
|
||||
break;
|
||||
default:
|
||||
v->pquantizer = 1;
|
||||
break;
|
||||
}
|
||||
if (v->postprocflag)
|
||||
v->postproc = get_bits(gb, 2);
|
||||
|
||||
@ -1081,12 +1080,7 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
||||
v->range_x = 1 << (v->k_x - 1);
|
||||
v->range_y = 1 << (v->k_y - 1);
|
||||
|
||||
if (v->pq < 5)
|
||||
v->tt_index = 0;
|
||||
else if (v->pq < 13)
|
||||
v->tt_index = 1;
|
||||
else
|
||||
v->tt_index = 2;
|
||||
v->tt_index = (v->pq > 4) + (v->pq > 12);
|
||||
if (v->fcm != ILACE_FRAME) {
|
||||
int mvmode;
|
||||
mvmode = get_unary(gb, 1, 4);
|
||||
@ -1130,18 +1124,15 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
||||
v->last_use_ic = 1;
|
||||
}
|
||||
v->qs_last = v->s.quarter_sample;
|
||||
if (v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
|
||||
v->s.quarter_sample = 0;
|
||||
else if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
|
||||
if (v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
|
||||
v->s.quarter_sample = 0;
|
||||
else
|
||||
v->s.quarter_sample = 1;
|
||||
} else
|
||||
v->s.quarter_sample = 1;
|
||||
v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN
|
||||
|| (v->mv_mode == MV_PMODE_INTENSITY_COMP
|
||||
&& v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
|
||||
if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
|
||||
v->s.quarter_sample = (v->mv_mode2 != MV_PMODE_1MV_HPEL &&
|
||||
v->mv_mode2 != MV_PMODE_1MV_HPEL_BILIN);
|
||||
v->s.mspel = (v->mv_mode2 != MV_PMODE_1MV_HPEL_BILIN);
|
||||
} else {
|
||||
v->s.quarter_sample = (v->mv_mode != MV_PMODE_1MV_HPEL &&
|
||||
v->mv_mode != MV_PMODE_1MV_HPEL_BILIN);
|
||||
v->s.mspel = (v->mv_mode != MV_PMODE_1MV_HPEL_BILIN);
|
||||
}
|
||||
}
|
||||
if (v->fcm == PROGRESSIVE) { // progressive
|
||||
if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
|
||||
@ -1192,12 +1183,12 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
||||
vop_dquant_decoding(v);
|
||||
}
|
||||
|
||||
v->ttfrm = 0; //FIXME Is that so ?
|
||||
if (v->vstransform) {
|
||||
v->ttmbf = get_bits1(gb);
|
||||
if (v->ttmbf) {
|
||||
v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
|
||||
}
|
||||
} else
|
||||
v->ttfrm = 0; //FIXME Is that so ?
|
||||
} else {
|
||||
v->ttmbf = 1;
|
||||
v->ttfrm = TT_8X8;
|
||||
@ -1220,12 +1211,7 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
||||
v->range_x = 1 << (v->k_x - 1);
|
||||
v->range_y = 1 << (v->k_y - 1);
|
||||
|
||||
if (v->pq < 5)
|
||||
v->tt_index = 0;
|
||||
else if (v->pq < 13)
|
||||
v->tt_index = 1;
|
||||
else
|
||||
v->tt_index = 2;
|
||||
v->tt_index = (v->pq > 4) + (v->pq > 12);
|
||||
|
||||
if (v->field_mode) {
|
||||
int mvmode;
|
||||
@ -1313,12 +1299,12 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
||||
vop_dquant_decoding(v);
|
||||
}
|
||||
|
||||
v->ttfrm = 0;
|
||||
if (v->vstransform) {
|
||||
v->ttmbf = get_bits1(gb);
|
||||
if (v->ttmbf) {
|
||||
v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
|
||||
}
|
||||
} else
|
||||
v->ttfrm = 0;
|
||||
} else {
|
||||
v->ttmbf = 1;
|
||||
v->ttfrm = TT_8X8;
|
||||
@ -1344,11 +1330,10 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
||||
vop_dquant_decoding(v);
|
||||
}
|
||||
|
||||
v->bi_type = 0;
|
||||
if (v->s.pict_type == AV_PICTURE_TYPE_BI) {
|
||||
v->bi_type = (v->s.pict_type == AV_PICTURE_TYPE_BI);
|
||||
if (v->bi_type)
|
||||
v->s.pict_type = AV_PICTURE_TYPE_B;
|
||||
v->bi_type = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user