📄 msmpeg4.c
字号:
} }else if (s->h263_aic_dir==2) { if(n==0){ pred= a; *dir_ptr = 0; }else{ pred= c; *dir_ptr = 1; } } else { pred= c; *dir_ptr = 1; } } }else{ if (abs(a - b) < abs(b - c)) { pred = c; *dir_ptr = 1; } else { pred = a; *dir_ptr = 0; } } }else{ if (abs(a - b) <= abs(b - c)) { pred = c; *dir_ptr = 1; } else { pred = a; *dir_ptr = 0; } } /* update predictor */ *dc_val_ptr = &dc_val[0]; return pred;}#define DC_MAX 119static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr){ int sign, code; int pred; if(s->msmpeg4_version==1){ int32_t *dc_val; pred = msmpeg4v1_pred_dc(s, n, &dc_val); /* update predictor */ *dc_val= level; }else{ uint16_t *dc_val; pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr); /* update predictor */ if (n < 4) { *dc_val = level * s->y_dc_scale; } else { *dc_val = level * s->c_dc_scale; } } /* do the prediction */ level -= pred; if(s->msmpeg4_version<=2){ if (n < 4) { put_bits(&s->pb, v2_dc_lum_table[level+256][1], v2_dc_lum_table[level+256][0]); }else{ put_bits(&s->pb, v2_dc_chroma_table[level+256][1], v2_dc_chroma_table[level+256][0]); } }else{ sign = 0; if (level < 0) { level = -level; sign = 1; } code = level; if (code > DC_MAX) code = DC_MAX; if (s->dc_table_index == 0) { if (n < 4) { put_bits(&s->pb, table0_dc_lum[code][1], table0_dc_lum[code][0]); } else { put_bits(&s->pb, table0_dc_chroma[code][1], table0_dc_chroma[code][0]); } } else { if (n < 4) { put_bits(&s->pb, table1_dc_lum[code][1], table1_dc_lum[code][0]); } else { put_bits(&s->pb, table1_dc_chroma[code][1], table1_dc_chroma[code][0]); } } if (code == DC_MAX) put_bits(&s->pb, 8, level); if (level != 0) { put_bits(&s->pb, 1, sign); } }}/* Encoding of a block. Very similar to MPEG4 except for a different escape coding (same as H263) and more vlc tables. */static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n){ int level, run, last, i, j, last_index; int last_non_zero, sign, slevel; int code, run_diff, dc_pred_dir; const RLTable *rl; const uint8_t *scantable; if (s->mb_intra) { set_stat(ST_DC); msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir); i = 1; if (n < 4) { rl = &rl_table[s->rl_table_index]; } else { rl = &rl_table[3 + s->rl_chroma_table_index]; } run_diff = 0; scantable= s->intra_scantable.permutated; set_stat(ST_INTRA_AC); } else { i = 0; rl = &rl_table[3 + s->rl_table_index]; if(s->msmpeg4_version<=2) run_diff = 0; else run_diff = 1; scantable= s->inter_scantable.permutated; set_stat(ST_INTER_AC); } /* recalculate block_last_index for M$ wmv1 */ if(s->msmpeg4_version>=4 && s->block_last_index[n]>0){ for(last_index=63; last_index>=0; last_index--){ if(block[scantable[last_index]]) break; } s->block_last_index[n]= last_index; }else last_index = s->block_last_index[n]; /* AC coefs */ last_non_zero = i - 1; for (; i <= last_index; i++) { j = scantable[i]; level = block[j]; if (level) { run = i - last_non_zero - 1; last = (i == last_index); sign = 0; slevel = level; if (level < 0) { sign = 1; level = -level; } if(level<=MAX_LEVEL && run<=MAX_RUN){ s->ac_stats[s->mb_intra][n>3][level][run][last]++; }#if 0else s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like#endif code = get_rl_index(rl, last, run, level); put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); if (code == rl->n) { int level1, run1; level1 = level - rl->max_level[last][run]; if (level1 < 1) goto esc2; code = get_rl_index(rl, last, run, level1); if (code == rl->n) { esc2: put_bits(&s->pb, 1, 0); if (level > MAX_LEVEL) goto esc3; run1 = run - rl->max_run[last][level] - run_diff; if (run1 < 0) goto esc3; code = get_rl_index(rl, last, run1, level); if (code == rl->n) { esc3: /* third escape */ put_bits(&s->pb, 1, 0); put_bits(&s->pb, 1, last); if(s->msmpeg4_version>=4){ if(s->esc3_level_length==0){ s->esc3_level_length=8; s->esc3_run_length= 6; if(s->qscale<8) put_bits(&s->pb, 6, 3); else put_bits(&s->pb, 8, 3); } put_bits(&s->pb, s->esc3_run_length, run); put_bits(&s->pb, 1, sign); put_bits(&s->pb, s->esc3_level_length, level); }else{ put_bits(&s->pb, 6, run); put_bits(&s->pb, 8, slevel & 0xff); } } else { /* second escape */ put_bits(&s->pb, 1, 1); put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); put_bits(&s->pb, 1, sign); } } else { /* first escape */ put_bits(&s->pb, 1, 1); put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); put_bits(&s->pb, 1, sign); } } else { put_bits(&s->pb, 1, sign); } last_non_zero = i; } }}/****************************************//* decoding stuff */static VLC mb_non_intra_vlc[4];static VLC mb_intra_vlc;static VLC dc_lum_vlc[2];static VLC dc_chroma_vlc[2];static VLC v2_dc_lum_vlc;static VLC v2_dc_chroma_vlc;static VLC cbpy_vlc;static VLC v2_intra_cbpc_vlc;static VLC v2_mb_type_vlc;static VLC v2_mv_vlc;static VLC v1_intra_cbpc_vlc;static VLC v1_inter_cbpc_vlc;static VLC inter_intra_vlc;/* this table is practically identical to the one from h263 except that its inverted */static void init_h263_dc_for_msmpeg4(void){ int level, uni_code, uni_len; for(level=-256; level<256; level++){ int size, v, l; /* find number of bits */ size = 0; v = abs(level); while (v) { v >>= 1; size++; } if (level < 0) l= (-level) ^ ((1 << size) - 1); else l= level; /* luminance h263 */ uni_code= DCtab_lum[size][0]; uni_len = DCtab_lum[size][1]; uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility if (size > 0) { uni_code<<=size; uni_code|=l; uni_len+=size; if (size > 8){ uni_code<<=1; uni_code|=1; uni_len++; } } v2_dc_lum_table[level+256][0]= uni_code; v2_dc_lum_table[level+256][1]= uni_len; /* chrominance h263 */ uni_code= DCtab_chrom[size][0]; uni_len = DCtab_chrom[size][1]; uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility if (size > 0) { uni_code<<=size; uni_code|=l; uni_len+=size; if (size > 8){ uni_code<<=1; uni_code|=1; uni_len++; } } v2_dc_chroma_table[level+256][0]= uni_code; v2_dc_chroma_table[level+256][1]= uni_len; }}/* init all vlc decoding tables */int ff_msmpeg4_decode_init(MpegEncContext *s){ static int done = 0; int i; MVTable *mv; common_init(s); if (!done) { done = 1; for(i=0;i<NB_RL_TABLES;i++) { init_rl(&rl_table[i]); init_vlc_rl(&rl_table[i]); } for(i=0;i<2;i++) { mv = &mv_tables[i]; init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1, mv->table_mv_bits, 1, 1, mv->table_mv_code, 2, 2); } init_vlc(&dc_lum_vlc[0], DC_VLC_BITS, 120, &table0_dc_lum[0][1], 8, 4, &table0_dc_lum[0][0], 8, 4); init_vlc(&dc_chroma_vlc[0], DC_VLC_BITS, 120, &table0_dc_chroma[0][1], 8, 4, &table0_dc_chroma[0][0], 8, 4); init_vlc(&dc_lum_vlc[1], DC_VLC_BITS, 120, &table1_dc_lum[0][1], 8, 4, &table1_dc_lum[0][0], 8, 4); init_vlc(&dc_chroma_vlc[1], DC_VLC_BITS, 120, &table1_dc_chroma[0][1], 8, 4, &table1_dc_chroma[0][0], 8, 4); init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512, &v2_dc_lum_table[0][1], 8, 4, &v2_dc_lum_table[0][0], 8, 4); init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512, &v2_dc_chroma_table[0][1], 8, 4, &v2_dc_chroma_table[0][0], 8, 4); init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16, &cbpy_tab[0][1], 2, 1, &cbpy_tab[0][0], 2, 1); init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4, &v2_intra_cbpc[0][1], 2, 1, &v2_intra_cbpc[0][0], 2, 1); init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8, &v2_mb_type[0][1], 2, 1, &v2_mb_type[0][0], 2, 1); init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33, &mvtab[0][1], 2, 1, &mvtab[0][0], 2, 1); for(i=0; i<4; i++){ init_vlc(&mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128, &wmv2_inter_table[i][0][1], 8, 4, &wmv2_inter_table[i][0][0], 8, 4); //FIXME name? } init_vlc(&mb_intra_vlc, MB_INTRA_VLC_BITS, 64, &table_mb_intra[0][1], 4, 2, &table_mb_intra[0][0], 4, 2); init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8, intra_MCBPC_bits, 1, 1, intra_MCBPC_code, 1, 1); init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25, inter_MCBPC_bits, 1, 1, inter_MCBPC_code, 1, 1); init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4, &table_inter_intra[0][1], 2, 1, &table_inter_intra[0][0], 2, 1); } switch(s->msmpeg4_version){ case 1: case 2: s->decode_mb= msmpeg4v12_decode_mb; break; case 3: case 4: s->decode_mb= msmpeg4v34_decode_mb; break; case 5: s->decode_mb= wmv2_decode_mb; break; } s->slice_height= s->mb_height; //to avoid 1/0 if the first frame isnt a keyframe return 0;}static int decode012(GetBitContext *gb){ int n; n = get_bits1(gb);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -