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

📄 h263.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 5 页
字号:
    for(mv=0; mv<MAX_MV*2+1; mv++){        umv_fcode_tab[mv]= 1;    }}#endifstatic void init_uni_dc_tab(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 */        uni_code= DCtab_lum[size][0];        uni_len = DCtab_lum[size][1];        if (size > 0) {            uni_code<<=size; uni_code|=l;            uni_len+=size;            if (size > 8){                uni_code<<=1; uni_code|=1;                uni_len++;            }        }        uni_DCtab_lum[level+256][0]= uni_code;        uni_DCtab_lum[level+256][1]= uni_len;        /* chrominance */        uni_code= DCtab_chrom[size][0];        uni_len = DCtab_chrom[size][1];                if (size > 0) {            uni_code<<=size; uni_code|=l;            uni_len+=size;            if (size > 8){                uni_code<<=1; uni_code|=1;                uni_len++;            }        }        uni_DCtab_chrom[level+256][0]= uni_code;        uni_DCtab_chrom[level+256][1]= uni_len;    }}#ifdef CONFIG_ENCODERSstatic void init_uni_mpeg4_rl_tab(RLTable *rl, UINT32 *bits_tab, UINT8 *len_tab){    int slevel, run, last;        assert(MAX_LEVEL >= 64);    assert(MAX_RUN   >= 63);    for(slevel=-64; slevel<64; slevel++){        if(slevel==0) continue;        for(run=0; run<64; run++){            for(last=0; last<=1; last++){                const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);                int level= slevel < 0 ? -slevel : slevel;                int sign= slevel < 0 ? 1 : 0;                int bits, len, code;                int level1, run1;                                len_tab[index]= 100;                                     /* ESC0 */                code= get_rl_index(rl, last, run, level);                bits= rl->table_vlc[code][0];                len=  rl->table_vlc[code][1];                bits=bits*2+sign; len++;                                if(code!=rl->n && len < len_tab[index]){                    bits_tab[index]= bits;                    len_tab [index]= len;                }#if 1                /* ESC1 */                bits= rl->table_vlc[rl->n][0];                len=  rl->table_vlc[rl->n][1];                bits=bits*2;    len++; //esc1                level1= level - rl->max_level[last][run];                if(level1>0){                    code= get_rl_index(rl, last, run, level1);                    bits<<= rl->table_vlc[code][1];                    len  += rl->table_vlc[code][1];                    bits += rl->table_vlc[code][0];                    bits=bits*2+sign; len++;                                    if(code!=rl->n && len < len_tab[index]){                        bits_tab[index]= bits;                        len_tab [index]= len;                    }                }#endif #if 1                /* ESC2 */                bits= rl->table_vlc[rl->n][0];                len=  rl->table_vlc[rl->n][1];                bits=bits*4+2;    len+=2; //esc2                run1 = run - rl->max_run[last][level] - 1;                if(run1>=0){                    code= get_rl_index(rl, last, run1, level);                    bits<<= rl->table_vlc[code][1];                    len  += rl->table_vlc[code][1];                    bits += rl->table_vlc[code][0];                    bits=bits*2+sign; len++;                                    if(code!=rl->n && len < len_tab[index]){                        bits_tab[index]= bits;                        len_tab [index]= len;                    }                }#endif                           /* ESC3 */                        bits= rl->table_vlc[rl->n][0];                len = rl->table_vlc[rl->n][1];                bits=bits*4+3;    len+=2; //esc3                bits=bits*2+last; len++;                bits=bits*64+run; len+=6;                bits=bits*2+1;    len++;  //marker                bits=bits*4096+(slevel&0xfff); len+=12;                bits=bits*2+1;    len++;  //marker                                if(len < len_tab[index]){                    bits_tab[index]= bits;                    len_tab [index]= len;                }            }        }    }}void h263_encode_init(MpegEncContext *s){    static int done = 0;    if (!done) {        done = 1;        init_uni_dc_tab();        init_rl(&rl_inter);        init_rl(&rl_intra);        init_rl(&rl_intra_aic);                init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);        init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);        init_mv_penalty_and_fcode(s);    }    s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p        // use fcodes >1 only for mpeg4 & h263 & h263p FIXME    switch(s->codec_id){    case CODEC_ID_MPEG4:        s->fcode_tab= fcode_tab;        s->min_qcoeff= -2048;        s->max_qcoeff=  2047;        break;    case CODEC_ID_H263P:        s->fcode_tab= umv_fcode_tab;        s->min_qcoeff= -128;        s->max_qcoeff=  127;        break;        //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later     default: //nothing needed default table allready set in mpegvideo.c        s->min_qcoeff= -128;        s->max_qcoeff=  127;        s->y_dc_scale_table=        s->c_dc_scale_table= ff_mpeg1_dc_scale_table;    }    if(s->mpeg_quant){        s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x        s->inter_quant_bias= 0;    }else{        s->intra_quant_bias=0;        s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x    }}static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n){    int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;    RLTable *rl;    rl = &rl_inter;    if (s->mb_intra && !s->h263_aic) {        /* DC coef */	    level = block[0];        /* 255 cannot be represented, so we clamp */        if (level > 254) {            level = 254;            block[0] = 254;        }        /* 0 cannot be represented also */        else if (!level) {            level = 1;            block[0] = 1;        }	    if (level == 128)	        put_bits(&s->pb, 8, 0xff);	    else	        put_bits(&s->pb, 8, level & 0xff);	    i = 1;    } else {	    i = 0;	    if (s->h263_aic && s->mb_intra)	        rl = &rl_intra_aic;    }       /* AC coefs */    last_index = s->block_last_index[n];    last_non_zero = i - 1;    for (; i <= last_index; i++) {        j = s->intra_scantable.permutated[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;            }            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) {                put_bits(&s->pb, 1, last);                put_bits(&s->pb, 6, run);                put_bits(&s->pb, 8, slevel & 0xff);            } else {                put_bits(&s->pb, 1, sign);            }	        last_non_zero = i;	    }    }}#endif/***************************************************//** * add mpeg4 stuffing bits (01...1) */void ff_mpeg4_stuffing(PutBitContext * pbc){    int length;    put_bits(pbc, 1, 0);    length= (-get_bit_count(pbc))&7;    if(length) put_bits(pbc, length, (1<<length)-1);}/* must be called before writing the header */void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){    int time_div, time_mod;    if(s->pict_type==I_TYPE){ //we will encode a vol header        s->time_increment_resolution= s->frame_rate/ff_gcd(s->frame_rate, FRAME_RATE_BASE);        if(s->time_increment_resolution>=256*256) s->time_increment_resolution= 256*128;        s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;    }        if(s->avctx->pts)        s->time= (s->avctx->pts*s->time_increment_resolution + 500*1000)/(1000*1000);    else        s->time= picture_number*(INT64)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate;    time_div= s->time/s->time_increment_resolution;    time_mod= s->time%s->time_increment_resolution;    if(s->pict_type==B_TYPE){        s->pb_time= s->pp_time - (s->last_non_b_time - s->time);    }else{        s->last_time_base= s->time_base;        s->time_base= time_div;        s->pp_time= s->time - s->last_non_b_time;        s->last_non_b_time= s->time;    }}static void mpeg4_encode_vol_header(MpegEncContext * s){    int vo_ver_id=1; //must be 2 if we want GMC or q-pel    char buf[255];    s->vo_type= s->has_b_frames ? CORE_VO_TYPE : SIMPLE_VO_TYPE;    put_bits(&s->pb, 16, 0);    put_bits(&s->pb, 16, 0x100);        /* video obj */    put_bits(&s->pb, 16, 0);    put_bits(&s->pb, 16, 0x120);        /* video obj layer */    put_bits(&s->pb, 1, 0);		/* random access vol */    put_bits(&s->pb, 8, s->vo_type);	/* video obj type indication */    put_bits(&s->pb, 1, 1);		/* is obj layer id= yes */      put_bits(&s->pb, 4, vo_ver_id);	/* is obj layer ver id */      put_bits(&s->pb, 3, 1);		/* is obj layer priority */        init_aspect_info(s);    put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */    if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)    {	put_bits(&s->pb, 8, s->aspected_width);	put_bits(&s->pb, 8, s->aspected_height);    }    if(s->low_delay){        put_bits(&s->pb, 1, 1);		/* vol control parameters= yes */        put_bits(&s->pb, 2, 1);		/* chroma format YUV 420/YV12 */        put_bits(&s->pb, 1, s->low_delay);        put_bits(&s->pb, 1, 0);		/* vbv parameters= no */    }else{        put_bits(&s->pb, 1, 0);		/* vol control parameters= no */    }    put_bits(&s->pb, 2, RECT_SHAPE);	/* vol shape= rectangle */    put_bits(&s->pb, 1, 1);		/* marker bit */        put_bits(&s->pb, 16, s->time_increment_resolution);    if (s->time_increment_bits < 1)        s->time_increment_bits = 1;    put_bits(&s->pb, 1, 1);		/* marker bit */    put_bits(&s->pb, 1, 0);		/* fixed vop rate=no */    put_bits(&s->pb, 1, 1);		/* marker bit */    put_bits(&s->pb, 13, s->width);	/* vol width */    put_bits(&s->pb, 1, 1);		/* marker bit */    put_bits(&s->pb, 13, s->height);	/* vol height */    put_bits(&s->pb, 1, 1);		/* marker bit */    put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);    put_bits(&s->pb, 1, 1);		/* obmc disable */    if (vo_ver_id == 1) {        put_bits(&s->pb, 1, s->vol_sprite_usage=0);		/* sprite enable */    }else{ /* vo_ver_id == 2 */        put_bits(&s->pb, 2, s->vol_sprite_usage=0);		/* sprite enable */    }        s->quant_precision=5;    put_bits(&s->pb, 1, 0);		/* not 8 bit == false */    put_bits(&s->pb, 1, s->mpeg_quant);	/* quant type= (0=h263 style)*/    if(s->mpeg_quant) put_bits(&s->pb, 2, 0); /* no custom matrixes */    if (vo_ver_id != 1)        put_bits(&s->pb, 1, s->quarter_sample=0);    put_bits(&s->pb, 1, 1);		/* complexity estimation disable */    s->resync_marker= s->rtp_mode;    put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */    put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);    if(s->data_partitioning){        put_bits(&s->pb, 1, 0);		/* no rvlc */    }    if (vo_ver_id != 1){        put_bits(&s->pb, 1, 0);		/* newpred */        put_bits(&s->pb, 1, 0);		/* reduced res vop */    }    put_bits(&s->pb, 1, 0);		/* scalability */        ff_mpeg4_stuffing(&s->pb);    /* user data */    if(!ff_bit_exact){        put_bits(&s->pb, 16, 0);        put_bits(&s->pb, 16, 0x1B2);	/* user_data */        sprintf(buf, "FFmpeg%sb%s", FFMPEG_VERSION, LIBAVCODEC_BUILD_STR);        put_string(&s->pb, buf);        ff_mpeg4_stuffing(&s->pb);    }}/* write mpeg4 VOP header */void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number){    int time_incr;    int time_div, time_mod;        if(s->pict_type==I_TYPE){        s->no_rounding=0;        if(picture_number==0 || !s->strict_std_compliance)            mpeg4_encode_vol_header(s);    }        s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;//printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);        put_bits(&s->pb, 16, 0);	        /* vop header */    put_bits(&s->pb, 16, 0x1B6);	/* vop header */    put_bits(&s->pb, 2, s->pict_type - 1);	/* pict type: I = 0 , P = 1 */    time_div= s->time/s->time_increment_resolution;    time_mod= s->time%s->time_increment_resolution;    time_incr= time_div - s->last_time_base;

⌨️ 快捷键说明

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