X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fvc1.c;h=41dc047a9e25cbb71e23659aee5791573455eeea;hb=f0a838e52505fb48d15fb23554107cbd282f8132;hp=40becae80039c925bf0a078cecb79e0c7f5cfc4d;hpb=a5c14fcaefe7ef83660e8c326b7bc815d1420b01;p=ffmpeg diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index 40becae8003..41dc047a9e2 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -18,7 +18,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * */ /** @@ -26,78 +25,27 @@ * VC-1 and WMV3 decoder * */ -#include "common.h" #include "dsputil.h" #include "avcodec.h" #include "mpegvideo.h" #include "vc1.h" #include "vc1data.h" #include "vc1acdata.h" +#include "msmpeg4data.h" +#include "unary.h" +#include "simple_idct.h" #undef NDEBUG #include -extern const uint32_t ff_table0_dc_lum[120][2], ff_table1_dc_lum[120][2]; -extern const uint32_t ff_table0_dc_chroma[120][2], ff_table1_dc_chroma[120][2]; -extern VLC ff_msmp4_dc_luma_vlc[2], ff_msmp4_dc_chroma_vlc[2]; #define MB_INTRA_VLC_BITS 9 -extern VLC ff_msmp4_mb_i_vlc; -extern const uint16_t ff_msmp4_mb_i_table[64][2]; #define DC_VLC_BITS 9 #define AC_VLC_BITS 9 static const uint16_t table_mb_intra[64][2]; -/** - * Get unary code of limited length - * @fixme FIXME Slow and ugly - * @param gb GetBitContext - * @param[in] stop The bitstop value (unary code of 1's or 0's) - * @param[in] len Maximum length - * @return Unary length/index - */ -static int get_prefix(GetBitContext *gb, int stop, int len) -{ -#if 1 - int i; - - for(i = 0; i < len && get_bits1(gb) != stop; i++); - return i; -/* int i = 0, tmp = !stop; - - while (i != len && tmp != stop) - { - tmp = get_bits(gb, 1); - i++; - } - if (i == len && tmp != stop) return len+1; - return i;*/ -#else - unsigned int buf; - int log; - - OPEN_READER(re, gb); - UPDATE_CACHE(re, gb); - buf=GET_CACHE(re, gb); //Still not sure - if (stop) buf = ~buf; - - log= av_log2(-buf); //FIXME: -? - if (log < limit){ - LAST_SKIP_BITS(re, gb, log+1); - CLOSE_READER(re, gb); - return log; - } - - LAST_SKIP_BITS(re, gb, limit); - CLOSE_READER(re, gb); - return limit; -#endif -} - static inline int decode210(GetBitContext *gb){ - int n; - n = get_bits1(gb); - if (n == 1) + if (get_bits1(gb)) return 0; else return 2 - get_bits1(gb); @@ -203,11 +151,11 @@ static void decode_rowskip(uint8_t* plane, int width, int height, int stride, Ge int x, y; for (y=0; ys.mb_width; height = v->s.mb_height; stride = v->s.mb_stride; - invert = get_bits(gb, 1); + invert = get_bits1(gb); imode = get_vlc2(gb, ff_vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1); *raw_flag = 0; @@ -264,7 +212,7 @@ static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v) case IMODE_NORM2: if ((height * width) & 1) { - *planep++ = get_bits(gb, 1); + *planep++ = get_bits1(gb); offset = 1; } else offset = 0; @@ -383,7 +331,7 @@ static int vop_dquant_decoding(VC1Context *v) } else { - v->dquantfrm = get_bits(gb, 1); + v->dquantfrm = get_bits1(gb); if ( v->dquantfrm ) { v->dqprofile = get_bits(gb, 2); @@ -394,7 +342,9 @@ static int vop_dquant_decoding(VC1Context *v) v->dqsbedge = get_bits(gb, 2); break; case DQPROFILE_ALL_MBS: - v->dqbilevel = get_bits(gb, 1); + v->dqbilevel = get_bits1(gb); + if(!v->dqbilevel) + v->halfpq = 0; default: break; //Forbidden ? } if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS) @@ -851,37 +801,29 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb) v->frmrtq_postproc = get_bits(gb, 3); //common // (bitrate-32kbps)/64kbps v->bitrtq_postproc = get_bits(gb, 5); //common - v->s.loop_filter = get_bits(gb, 1); //common + v->s.loop_filter = get_bits1(gb); //common if(v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE) { av_log(avctx, AV_LOG_ERROR, "LOOPFILTER shell not be enabled in simple profile\n"); } - v->res_x8 = get_bits(gb, 1); //reserved - if (v->res_x8) - { - av_log(avctx, AV_LOG_ERROR, - "1 for reserved RES_X8 is forbidden\n"); - //return -1; - } - v->multires = get_bits(gb, 1); - v->res_fasttx = get_bits(gb, 1); + v->res_x8 = get_bits1(gb); //reserved + v->multires = get_bits1(gb); + v->res_fasttx = get_bits1(gb); if (!v->res_fasttx) { - av_log(avctx, AV_LOG_ERROR, - "0 for reserved RES_FASTTX is forbidden\n"); - //return -1; + v->s.dsp.vc1_inv_trans_8x8 = simple_idct; } - v->fastuvmc = get_bits(gb, 1); //common + v->fastuvmc = get_bits1(gb); //common if (!v->profile && !v->fastuvmc) { av_log(avctx, AV_LOG_ERROR, "FASTUVMC unavailable in Simple Profile\n"); return -1; } - v->extended_mv = get_bits(gb, 1); //common + v->extended_mv = get_bits1(gb); //common if (!v->profile && v->extended_mv) { av_log(avctx, AV_LOG_ERROR, @@ -889,9 +831,9 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb) return -1; } v->dquant = get_bits(gb, 2); //common - v->vstransform = get_bits(gb, 1); //common + v->vstransform = get_bits1(gb); //common - v->res_transtab = get_bits(gb, 1); + v->res_transtab = get_bits1(gb); if (v->res_transtab) { av_log(avctx, AV_LOG_ERROR, @@ -899,10 +841,10 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb) return -1; } - v->overlap = get_bits(gb, 1); //common + v->overlap = get_bits1(gb); //common - v->s.resync_marker = get_bits(gb, 1); - v->rangered = get_bits(gb, 1); + v->s.resync_marker = get_bits1(gb); + v->rangered = get_bits1(gb); if (v->rangered && v->profile == PROFILE_SIMPLE) { av_log(avctx, AV_LOG_INFO, @@ -912,8 +854,8 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb) v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common v->quantizer_mode = get_bits(gb, 2); //common - v->finterpflag = get_bits(gb, 1); //common - v->res_rtm_flag = get_bits(gb, 1); //reserved + v->finterpflag = get_bits1(gb); //common + v->res_rtm_flag = get_bits1(gb); //reserved if (!v->res_rtm_flag) { // av_log(avctx, AV_LOG_ERROR, @@ -957,7 +899,7 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb) v->frmrtq_postproc = get_bits(gb, 3); //common // (bitrate-32kbps)/64kbps v->bitrtq_postproc = get_bits(gb, 5); //common - v->postprocflag = get_bits(gb, 1); //common + v->postprocflag = get_bits1(gb); //common v->s.avctx->coded_width = (get_bits(gb, 12) + 1) << 1; v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1; @@ -967,7 +909,7 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb) v->interlace = get_bits1(gb); v->tfcntrflag = get_bits1(gb); v->finterpflag = get_bits1(gb); - get_bits1(gb); // reserved + skip_bits1(gb); // reserved v->s.h_edge_pos = v->s.avctx->coded_width; v->s.v_edge_pos = v->s.avctx->coded_height; @@ -1029,11 +971,11 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb) if(v->hrd_param_flag) { int i; v->hrd_num_leaky_buckets = get_bits(gb, 5); - get_bits(gb, 4); //bitrate exponent - get_bits(gb, 4); //buffer size exponent + skip_bits(gb, 4); //bitrate exponent + skip_bits(gb, 4); //buffer size exponent for(i = 0; i < v->hrd_num_leaky_buckets; i++) { - get_bits(gb, 16); //hrd_rate[n] - get_bits(gb, 16); //hrd_buffer[n] + skip_bits(gb, 16); //hrd_rate[n] + skip_bits(gb, 16); //hrd_buffer[n] } } return 0; @@ -1059,7 +1001,7 @@ static int decode_entry_point(AVCodecContext *avctx, GetBitContext *gb) if(v->hrd_param_flag){ for(i = 0; i < v->hrd_num_leaky_buckets; i++) { - get_bits(gb, 8); //hrd_full[n] + skip_bits(gb, 8); //hrd_full[n] } } @@ -1092,14 +1034,14 @@ static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) { int pqindex, lowquant, status; - if(v->finterpflag) v->interpfrm = get_bits(gb, 1); + if(v->finterpflag) v->interpfrm = get_bits1(gb); skip_bits(gb, 2); //framecnt unused v->rangeredfrm = 0; - if (v->rangered) v->rangeredfrm = get_bits(gb, 1); - v->s.pict_type = get_bits(gb, 1); + 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_bits(gb, 1)) v->s.pict_type = I_TYPE; + if (get_bits1(gb)) v->s.pict_type = I_TYPE; else v->s.pict_type = B_TYPE; } else v->s.pict_type = P_TYPE; } else v->s.pict_type = v->s.pict_type ? P_TYPE : I_TYPE; @@ -1113,7 +1055,7 @@ static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) } } if(v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) - get_bits(gb, 7); // skip buffer fullness + skip_bits(gb, 7); // skip buffer fullness /* calculate RND */ if(v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) @@ -1134,26 +1076,26 @@ static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) if (v->quantizer_mode == QUANT_NON_UNIFORM) v->pquantizer = 0; v->pqindex = pqindex; - if (pqindex < 9) v->halfpq = get_bits(gb, 1); + if (pqindex < 9) v->halfpq = get_bits1(gb); else v->halfpq = 0; if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) - v->pquantizer = get_bits(gb, 1); + v->pquantizer = get_bits1(gb); v->dquantfrm = 0; - if (v->extended_mv == 1) v->mvrange = get_prefix(gb, 0, 3); + if (v->extended_mv == 1) v->mvrange = get_unary(gb, 0, 3); v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 v->range_x = 1 << (v->k_x - 1); v->range_y = 1 << (v->k_y - 1); if (v->profile == PROFILE_ADVANCED) { - if (v->postprocflag) v->postproc = get_bits(gb, 1); + if (v->postprocflag) v->postproc = get_bits1(gb); } else if (v->multires && v->s.pict_type != B_TYPE) v->respic = get_bits(gb, 2); if(v->res_x8 && (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)){ - if(get_bits1(gb))return -1; - } + v->x8_type = get_bits1(gb); + }else v->x8_type = 0; //av_log(v->s.avctx, AV_LOG_INFO, "%c Frame: QP=[%i]%i (+%i/2) %i\n", // (v->s.pict_type == P_TYPE) ? 'P' : ((v->s.pict_type == I_TYPE) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm); @@ -1166,11 +1108,11 @@ static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) else v->tt_index = 2; lowquant = (v->pq > 12) ? 0 : 1; - v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_prefix(gb, 1, 4)]; + v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)]; if (v->mv_mode == MV_PMODE_INTENSITY_COMP) { int scale, shift, i; - v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_prefix(gb, 1, 3)]; + v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)]; v->lumscale = get_bits(gb, 6); v->lumshift = get_bits(gb, 6); v->use_ic = 1; @@ -1233,7 +1175,7 @@ static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) v->ttfrm = 0; //FIXME Is that so ? if (v->vstransform) { - v->ttmbf = get_bits(gb, 1); + v->ttmbf = get_bits1(gb); if (v->ttmbf) { v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)]; @@ -1274,7 +1216,7 @@ static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) v->ttfrm = 0; if (v->vstransform) { - v->ttmbf = get_bits(gb, 1); + v->ttmbf = get_bits1(gb); if (v->ttmbf) { v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)]; @@ -1286,14 +1228,17 @@ static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) break; } - /* AC Syntax */ - v->c_ac_table_index = decode012(gb); - if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) + if(!v->x8_type) { - v->y_ac_table_index = decode012(gb); + /* AC Syntax */ + v->c_ac_table_index = decode012(gb); + if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) + { + v->y_ac_table_index = decode012(gb); + } + /* DC Syntax */ + v->s.dc_table_index = get_bits1(gb); } - /* DC Syntax */ - v->s.dc_table_index = get_bits(gb, 1); if(v->s.pict_type == BI_TYPE) { v->s.pict_type = B_TYPE; @@ -1313,7 +1258,7 @@ static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) v->fcm = decode012(gb); if(v->fcm) return -1; // interlaced frames/fields are not implemented } - switch(get_prefix(gb, 0, 4)) { + switch(get_unary(gb, 0, 4)) { case 0: v->s.pict_type = P_TYPE; break; @@ -1332,7 +1277,7 @@ static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) return 0; } if(v->tfcntrflag) - get_bits(gb, 8); + skip_bits(gb, 8); if(v->broadcast) { if(!v->interlace || v->psf) { v->rptfrm = get_bits(gb, 2); @@ -1347,7 +1292,7 @@ static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) v->rnd = get_bits1(gb); if(v->interlace) v->uvsamp = get_bits1(gb); - if(v->finterpflag) v->interpfrm = get_bits(gb, 1); + if(v->finterpflag) v->interpfrm = get_bits1(gb); if(v->s.pict_type == B_TYPE) { v->bfraction = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1); v->bfraction = ff_vc1_bfraction_lut[v->bfraction]; @@ -1368,10 +1313,10 @@ static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) if (v->quantizer_mode == QUANT_NON_UNIFORM) v->pquantizer = 0; v->pqindex = pqindex; - if (pqindex < 9) v->halfpq = get_bits(gb, 1); + if (pqindex < 9) v->halfpq = get_bits1(gb); else v->halfpq = 0; if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) - v->pquantizer = get_bits(gb, 1); + v->pquantizer = get_bits1(gb); if(v->s.pict_type == I_TYPE || v->s.pict_type == P_TYPE) v->use_ic = 0; @@ -1396,7 +1341,7 @@ static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) case P_TYPE: if(v->postprocflag) v->postproc = get_bits1(gb); - if (v->extended_mv) v->mvrange = get_prefix(gb, 0, 3); + if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3); else v->mvrange = 0; v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 @@ -1408,11 +1353,11 @@ static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) else v->tt_index = 2; lowquant = (v->pq > 12) ? 0 : 1; - v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_prefix(gb, 1, 4)]; + v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)]; if (v->mv_mode == MV_PMODE_INTENSITY_COMP) { int scale, shift, i; - v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_prefix(gb, 1, 3)]; + v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)]; v->lumscale = get_bits(gb, 6); v->lumshift = get_bits(gb, 6); /* fill lookup tables for intensity compensation */ @@ -1474,7 +1419,7 @@ static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) v->ttfrm = 0; //FIXME Is that so ? if (v->vstransform) { - v->ttmbf = get_bits(gb, 1); + v->ttmbf = get_bits1(gb); if (v->ttmbf) { v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)]; @@ -1487,7 +1432,7 @@ static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) case B_TYPE: if(v->postprocflag) v->postproc = get_bits1(gb); - if (v->extended_mv) v->mvrange = get_prefix(gb, 0, 3); + if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3); else v->mvrange = 0; v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 @@ -1524,7 +1469,7 @@ static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) v->ttfrm = 0; if (v->vstransform) { - v->ttmbf = get_bits(gb, 1); + v->ttmbf = get_bits1(gb); if (v->ttmbf) { v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)]; @@ -1543,7 +1488,7 @@ static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) v->y_ac_table_index = decode012(gb); } /* DC Syntax */ - v->s.dc_table_index = get_bits(gb, 1); + v->s.dc_table_index = get_bits1(gb); if ((v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) && v->dquant) { av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); vop_dquant_decoding(v); @@ -1576,7 +1521,7 @@ static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) { \ if (v->dqbilevel) \ { \ - mquant = (get_bits(gb, 1)) ? v->altpq : v->pq; \ + mquant = (get_bits1(gb)) ? v->altpq : v->pq; \ } \ else \ { \ @@ -2327,7 +2272,7 @@ static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, int *value, run = vc1_index_decode_table[codingset][index][0]; level = vc1_index_decode_table[codingset][index][1]; lst = index >= vc1_last_decode_table[codingset]; - if(get_bits(gb, 1)) + if(get_bits1(gb)) level = -level; } else { escape = decode210(gb); @@ -2347,23 +2292,23 @@ static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, int *value, else run += vc1_delta_run_table[codingset][level] + 1; } - if(get_bits(gb, 1)) + if(get_bits1(gb)) level = -level; } else { int sign; - lst = get_bits(gb, 1); + lst = get_bits1(gb); if(v->s.esc3_level_length == 0) { if(v->pq < 8 || v->dquantfrm) { // table 59 v->s.esc3_level_length = get_bits(gb, 3); if(!v->s.esc3_level_length) v->s.esc3_level_length = get_bits(gb, 2) + 8; } else { //table 60 - v->s.esc3_level_length = get_prefix(gb, 1, 6) + 2; + v->s.esc3_level_length = get_unary(gb, 1, 6) + 2; } v->s.esc3_run_length = 3 + get_bits(gb, 2); } run = get_bits(gb, v->s.esc3_run_length); - sign = get_bits(gb, 1); + sign = get_bits1(gb); level = get_bits(gb, v->s.esc3_level_length); if(sign) level = -level; @@ -2415,9 +2360,9 @@ static int vc1_decode_i_block(VC1Context *v, DCTELEM block[64], int n, int coded if (v->pq == 1) dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3; else if (v->pq == 2) - dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1; + dcdiff = (dcdiff<<1) + get_bits1(gb) - 1; } - if (get_bits(gb, 1)) + if (get_bits1(gb)) dcdiff = -dcdiff; } @@ -2585,9 +2530,9 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n, int c if (mquant == 1) dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3; else if (mquant == 2) - dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1; + dcdiff = (dcdiff<<1) + get_bits1(gb) - 1; } - if (get_bits(gb, 1)) + if (get_bits1(gb)) dcdiff = -dcdiff; } @@ -2608,14 +2553,12 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n, int c //AC Decoding i = 1; - /* check if AC is needed at all and adjust direction if needed */ - if(!a_avail) dc_pred_dir = 1; - if(!c_avail) dc_pred_dir = 0; + /* check if AC is needed at all */ if(!a_avail && !c_avail) use_pred = 0; ac_val = s->ac_val[0][0] + s->block_index[n] * 16; ac_val2 = ac_val; - scale = mquant * 2 + v->halfpq; + scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0); if(dc_pred_dir) //left ac_val -= 16; @@ -2791,9 +2734,9 @@ static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n, int c if (mquant == 1) dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3; else if (mquant == 2) - dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1; + dcdiff = (dcdiff<<1) + get_bits1(gb) - 1; } - if (get_bits(gb, 1)) + if (get_bits1(gb)) dcdiff = -dcdiff; } @@ -3110,12 +3053,12 @@ static int vc1_decode_p_mb(VC1Context *v) if (s->mb_intra && !mb_has_coeffs) { GET_MQUANT(); - s->ac_pred = get_bits(gb, 1); + s->ac_pred = get_bits1(gb); cbp = 0; } else if (mb_has_coeffs) { - if (s->mb_intra) s->ac_pred = get_bits(gb, 1); + if (s->mb_intra) s->ac_pred = get_bits1(gb); cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); GET_MQUANT(); } @@ -3150,9 +3093,7 @@ static int vc1_decode_p_mb(VC1Context *v) if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue; s->dsp.vc1_inv_trans_8x8(s->block[i]); if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1; - for(j = 0; j < 64; j++) s->block[i][j] += 128; - if(!v->res_fasttx && v->res_x8) for(j = 0; j < 64; j++) s->block[i][j] += 16; - s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); + s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); if(v->pq >= 9 && v->overlap) { if(v->c_avail) s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); @@ -3232,7 +3173,7 @@ static int vc1_decode_p_mb(VC1Context *v) break; } } - if(intrapred)s->ac_pred = get_bits(gb, 1); + if(intrapred)s->ac_pred = get_bits1(gb); else s->ac_pred = 0; } if (!v->ttmbf && coded_inter) @@ -3254,9 +3195,7 @@ static int vc1_decode_p_mb(VC1Context *v) if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue; s->dsp.vc1_inv_trans_8x8(s->block[i]); if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1; - for(j = 0; j < 64; j++) s->block[i][j] += 128; - if(!v->res_fasttx && v->res_x8) for(j = 0; j < 64; j++) s->block[i][j] += 16; - s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); + s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); if(v->pq >= 9 && v->overlap) { if(v->c_avail) s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); @@ -3436,8 +3375,7 @@ static void vc1_decode_b_mb(VC1Context *v) if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue; s->dsp.vc1_inv_trans_8x8(s->block[i]); if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1; - for(j = 0; j < 64; j++) s->block[i][j] += 128; - s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); + s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); } else if(val) { vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); if(!v->ttmbf && ttmb < 8) ttmb = -1; @@ -3491,7 +3429,6 @@ static void vc1_decode_i_blocks(VC1Context *v) s->mb_x = s->mb_y = 0; s->mb_intra = 1; s->first_slice_line = 1; - ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { ff_init_block_index(s); @@ -3505,7 +3442,7 @@ static void vc1_decode_i_blocks(VC1Context *v) // do actual MB decoding and displaying cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2); - v->s.ac_pred = get_bits(&v->s.gb, 1); + v->s.ac_pred = get_bits1(&v->s.gb); for(k = 0; k < 6; k++) { val = ((cbp >> (5 - k)) & 1); @@ -3520,7 +3457,6 @@ static void vc1_decode_i_blocks(VC1Context *v) vc1_decode_i_block(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2); s->dsp.vc1_inv_trans_8x8(s->block[k]); - if(!v->res_fasttx && !v->res_x8) for(j = 0; j < 64; j++) s->block[k][j] -= 16; if(v->pq >= 9 && v->overlap) { for(j = 0; j < 64; j++) s->block[k][j] += 128; } @@ -3551,6 +3487,7 @@ static void vc1_decode_i_blocks(VC1Context *v) } if(get_bits_count(&s->gb) > v->bits) { + ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)); av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits); return; } @@ -3558,6 +3495,7 @@ static void vc1_decode_i_blocks(VC1Context *v) ff_draw_horiz_band(s, s->mb_y * 16, 16); s->first_slice_line = 0; } + ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); } /** Decode blocks of I-frame for advanced profile @@ -3603,7 +3541,6 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) s->mb_x = s->mb_y = 0; s->mb_intra = 1; s->first_slice_line = 1; - ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { ff_init_block_index(s); @@ -3617,13 +3554,13 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) // do actual MB decoding and displaying cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2); if(v->acpred_is_raw) - v->s.ac_pred = get_bits(&v->s.gb, 1); + v->s.ac_pred = get_bits1(&v->s.gb); else v->s.ac_pred = v->acpred_plane[mb_pos]; if(v->condover == CONDOVER_SELECT) { if(v->overflg_is_raw) - overlap = get_bits(&v->s.gb, 1); + overlap = get_bits1(&v->s.gb); else overlap = v->over_flags_plane[mb_pos]; } else @@ -3680,6 +3617,7 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) } if(get_bits_count(&s->gb) > v->bits) { + ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)); av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits); return; } @@ -3687,6 +3625,7 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) ff_draw_horiz_band(s, s->mb_y * 16, 16); s->first_slice_line = 0; } + ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); } static void vc1_decode_p_blocks(VC1Context *v) @@ -3718,7 +3657,6 @@ static void vc1_decode_p_blocks(VC1Context *v) break; } - ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); s->first_slice_line = 1; for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { @@ -3728,6 +3666,7 @@ static void vc1_decode_p_blocks(VC1Context *v) vc1_decode_p_mb(v); if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) { + ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)); av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y); return; } @@ -3735,6 +3674,7 @@ static void vc1_decode_p_blocks(VC1Context *v) ff_draw_horiz_band(s, s->mb_y * 16, 16); s->first_slice_line = 0; } + ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); } static void vc1_decode_b_blocks(VC1Context *v) @@ -3766,7 +3706,6 @@ static void vc1_decode_b_blocks(VC1Context *v) break; } - ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); s->first_slice_line = 1; for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { @@ -3776,6 +3715,7 @@ static void vc1_decode_b_blocks(VC1Context *v) vc1_decode_b_mb(v); if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) { + ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)); av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y); return; } @@ -3783,6 +3723,7 @@ static void vc1_decode_b_blocks(VC1Context *v) ff_draw_horiz_band(s, s->mb_y * 16, 16); s->first_slice_line = 0; } + ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); } static void vc1_decode_skip_blocks(VC1Context *v) @@ -3808,29 +3749,33 @@ static void vc1_decode_blocks(VC1Context *v) { v->s.esc3_level_length = 0; + if(v->x8_type){ + ff_intrax8_decode_picture(&v->x8, 2*v->pq+v->halfpq, v->pq*(!v->pquantizer) ); + }else{ - switch(v->s.pict_type) { - case I_TYPE: - if(v->profile == PROFILE_ADVANCED) - vc1_decode_i_blocks_adv(v); - else - vc1_decode_i_blocks(v); - break; - case P_TYPE: - if(v->p_frame_skipped) - vc1_decode_skip_blocks(v); - else - vc1_decode_p_blocks(v); - break; - case B_TYPE: - if(v->bi_type){ + switch(v->s.pict_type) { + case I_TYPE: if(v->profile == PROFILE_ADVANCED) vc1_decode_i_blocks_adv(v); else vc1_decode_i_blocks(v); - }else - vc1_decode_b_blocks(v); - break; + break; + case P_TYPE: + if(v->p_frame_skipped) + vc1_decode_skip_blocks(v); + else + vc1_decode_p_blocks(v); + break; + case B_TYPE: + if(v->bi_type){ + if(v->profile == PROFILE_ADVANCED) + vc1_decode_i_blocks_adv(v); + else + vc1_decode_i_blocks(v); + }else + vc1_decode_b_blocks(v); + break; + } } } @@ -3888,6 +3833,10 @@ static int vc1_decode_init(AVCodecContext *avctx) avctx->flags |= CODEC_FLAG_EMU_EDGE; v->s.flags |= CODEC_FLAG_EMU_EDGE; + if(avctx->idct_algo==FF_IDCT_AUTO){ + avctx->idct_algo=FF_IDCT_WMV2; + } + if(ff_h263_decode_init(avctx) < 0) return -1; if (vc1_init_common(v) < 0) return -1; @@ -3988,6 +3937,7 @@ static int vc1_decode_init(AVCodecContext *avctx) // return -1; } + ff_intrax8_common_init(&v->x8,s); return 0; } @@ -4017,7 +3967,8 @@ static int vc1_decode_frame(AVCodecContext *avctx, return 0; } - //we need to set current_picture_ptr before reading the header, otherwise we cant store anyting im there + /* We need to set current_picture_ptr before reading the header, + * otherwise we cannot store anything in there. */ if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){ int i= ff_find_unused_picture(s, 0); s->current_picture_ptr= &s->picture[i]; @@ -4123,6 +4074,9 @@ static int vc1_decode_frame(AVCodecContext *avctx, return -1; } + s->me.qpel_put= s->dsp.put_qpel_pixels_tab; + s->me.qpel_avg= s->dsp.avg_qpel_pixels_tab; + ff_er_frame_start(s); v->bits = buf_size * 8;