⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msmpeg4.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 4 页
字号:
                    }                } 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;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);        init_vlc(&mb_non_intra_vlc, MB_NON_INTRA_VLC_BITS, 128,                  &table_mb_non_intra[0][1], 8, 4,                 &table_mb_non_intra[0][0], 8, 4);        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;    }        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);    if (n == 0)        return 0;    else        return get_bits1(gb) + 1;}int msmpeg4_decode_picture_header(MpegEncContext * s){    int code;#if 0{int i;for(i=0; i<s->gb.size*8; i++)    printf("%d", get_bits1(&s->gb));//    get_bits1(&s->gb);printf("END\n");return -1;}#endif    if(s->msmpeg4_version==1){        int start_code, num;        start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);        if(start_code!=0x00000100){            fprintf(stderr, "invalid startcode\n");            return -1;        }        num= get_bits(&s->gb, 5); // frame number */    }    s->pict_type = get_bits(&s->gb, 2) + 1;    if (s->pict_type != I_TYPE &&        s->pict_type != P_TYPE){        fprintf(stderr, "invalid picture type\n");        return -1;    }#if 0{    static int had_i=0;    if(s->pict_type == I_TYPE) had_i=1;    if(!had_i) return -1;}#endif    s->qscale = get_bits(&s->gb, 5);    if (s->pict_type == I_TYPE) {        code = get_bits(&s->gb, 5);         if(s->msmpeg4_version==1){            if(code==0 || code>s->mb_height){                fprintf(stderr, "invalid slice height %d\n", code);                return -1;            }            s->slice_height = code;        }else{            /* 0x17: one slice, 0x18: two slices, ... */            if (code < 0x17){                fprintf(stderr, "error, slice code was %X\n", code);                return -1;            }            s->slice_height = s->mb_height / (code - 0x16);        }        switch(s->msmpeg4_version){        case 1:        case 2:            s->rl_chroma_table_index = 2;            s->rl_table_index = 2;            s->dc_table_index = 0; //not used            break;        case 3:            s->rl_chroma_table_index = decode012(&s->gb);            s->rl_table_index = decode012(&s->gb);            s->dc_table_index = get_bits1(&s->gb);            break;        case 4:            msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);            if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);            else                           s->per_mb_rl_table= 0;                        if(!s->per_mb_rl_table){                s->rl_chroma_table_index = decode012(&s->gb);                s->rl_table_index = decode012(&s->gb);            }            s->dc_table_index = get_bits1(&s->gb);            s->inter_intra_pred= 0;            break;        }        s->no_rounding = 1;/*	printf("qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d   \n", 		s->qscale,		s->rl_chroma_table_index,		s->rl_table_index, 		s->dc_table_index,                s->per_mb_rl_table,                s->slice_height);*/    } else {        switch(s->msmpeg4_version){        case 1:        case 2:            if(s->msmpeg4_version==1)                s->use_skip_mb_code = 1;            else                s->use_skip_mb_code = get_bits1(&s->gb);            s->rl_table_index = 2;            s->rl_chroma_table_index = s->rl_table_index;            s->dc_table_index = 0; //not used            s->mv_table_index = 0;            break;        case 3:            s->use_skip_mb_code = get_bits1(&s->gb);            s->rl_table_index = decode012(&s->gb);            s->rl_chroma_table_index = s->rl_table_index;            s->dc_table_index = get_bits1(&s->gb);            s->mv_table_index = get_bits1(&s->gb);            break;        case 4:            s->use_skip_mb_code = get_bits1(&s->gb);            if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);            else                           s->per_mb_rl_table= 0;            if(!s->per_mb_rl_table){                s->rl_table_index = decode012(&s->gb);                s->rl_chroma_table_index = s->rl_table_index;            }            s->dc_table_index = get_bits1(&s->gb);            s->mv_table_index = get_bits1(&s->gb);            s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);            break;        }/*	printf("skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d   \n", 		s->use_skip_mb_code, 		s->rl_table_index, 		s->rl_chroma_table_index, 		s->dc_table_index,		s->mv_table_index,                s->per_mb_rl_table,                s->qscale);*/	if(s->flipflop_rounding){	    s->no_rounding ^= 1;	}else{	    s->no_rounding = 0;	}    }    s->esc3_level_length= 0;    s->esc3_run_length= 0;#ifdef DEBUG    printf("*****frame %d:\n", frame_count++);#endif    return 0;}int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size){    int left= buf_size*8 - get_bits_count(&s->gb);    int length= s->msmpeg4_version>=3 ? 17 : 16;    /* the alt_bitstream reader could read over the end so we need to check it */    if(left>=length && left<length+8)    {        int fps;        fps= get_bits(&s->gb, 5);        s->bit_rate= get_bits(&s->gb, 11)*1024;        if(s->msmpeg4_version>=3)            s->flipflop_rounding= get_bits1(&s->gb);        else            s->flipflop_rounding= 0;//        printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);    }    else if(left<length+8)    {        s->flipflop_rounding= 0;        printf("ext header missing, %d left\n", left);    }    else    {        fprintf(stderr, "I frame too long, ignoring ext header\n");    }    return 0;}static inline void msmpeg4_memsetw(short *tab, int val, int n){    int i;    for(i=0;i<n;i++)        tab[i] = val;}static void msmpeg4v2_encode_motion(MpegEncContext * s, int val){    int range, bit_size, sign, code, bits;    if (val == 0) {        /* zero vector */        code = 0;        put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);    } else {        bit_size = s->f_code - 1;        range = 1 << bit_size;        if (val <= -64)            val += 64;        else if (val >= 64)            val -= 64;        if (val >= 0) {            sign = 0;        } else {            val = -val;            sign = 1;        }        val--;        code = (val >> bit_size) + 1;        bits = val & (range - 1);        put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);         if (bit_size > 0) {            put_bits(&s->pb, bit_size, bits);        }    }}/* this is identical to h263 except that its range is multiplied by 2 */static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code){    int code, val, sign, shift;    code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);//     printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);    if (code < 0)        return 0xffff;    if (code == 0)        return pred;    sign = get_bits1(&s->gb);    shift = f_code - 1;    val = (code - 1) << shift;    if (shift > 0)        val |= get_bits(&s->gb, shift);    val++;    if (sign)        val = -val;    val += pred;    if (val <= -64)        val += 64;    else if (val >= 64)        val -= 64;    return val;}static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]){    int cbp, code, i;        s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0;        if (s->pict_type == P_TYPE) {        if (s->use_skip_mb_code) {            if (get_bits1(&s->gb)) {                /* skip mb */                s->mb_intra = 0;                for(i=0;i<6;i++)                    s->block_last_index[i] = -1;                s->mv_dir = MV_DIR_FORWARD;                s->mv_type = MV_TYPE_16X16;                s->mv[0][0][0] = 0;                s->mv[0][0][1] = 0;                s->mb_skiped = 1;                return 0;            }        }        if(s->msmpeg4_version==2)            code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);        else            code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3);        if(code<0 || code>7){            fprintf(stderr, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);            return -1;        }        s->mb_intra = code >>2;            cbp = code & 0x3;    } else {        s->mb_intra = 1;        if(s->msmpeg4_version==2)            cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);        else            cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1);        if(cbp<0 || cbp>3){            fprintf(stderr, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);            return -1;        }    }    if (!s->mb_intra) {        int mx, my, cbpy;                cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -