diff options
author | zhaoxiu.zeng <zhaoxiu.zeng@gmail.com> | 2015-02-14 22:45:49 +0800 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-02-15 17:28:02 +0100 |
commit | 38c619c1ed223e0b8b61e8b77f134051d57e7aba (patch) | |
tree | 13890f95e4a57eea24fecf10b11c28126d926069 | |
parent | e4a6486c17dd90b338450ac7e151ffbf5370948a (diff) | |
download | ffmpeg-streaming-38c619c1ed223e0b8b61e8b77f134051d57e7aba.zip ffmpeg-streaming-38c619c1ed223e0b8b61e8b77f134051d57e7aba.tar.gz |
avcodec/vc1: cleanup and simplification
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/vc1.c | 209 |
1 files changed, 97 insertions, 112 deletions
diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index 19657ed..22eb358 100644 --- a/libavcodec/vc1.c +++ b/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; } |