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

📄 h263.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 5 页
字号:
            if (size > 8){                uni_code<<=1; uni_code|=1;                uni_len++;            }        }        uni_DCtab_chrom_bits[level+256]= uni_code;        uni_DCtab_chrom_len [level+256]= uni_len;    }}#endif //CONFIG_ENCODERS#ifdef CONFIG_ENCODERSstatic void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *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->me.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;        s->intra_ac_vlc_length     = uni_mpeg4_intra_rl_len;        s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;        s->inter_ac_vlc_length     = uni_mpeg4_inter_rl_len;        s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;        s->luma_dc_vlc_length= uni_DCtab_lum_len;        s->chroma_dc_vlc_length= uni_DCtab_chrom_len;        s->ac_esc_length= 7+2+1+6+1+12+1;                if(s->flags & CODEC_FLAG_GLOBAL_HEADER){            s->avctx->extradata= av_malloc(1024);            init_put_bits(&s->pb, s->avctx->extradata, 1024);                        mpeg4_encode_visual_object_header(s);            mpeg4_encode_vol_header(s, 0, 0);//            ff_mpeg4_stuffing(&s->pb); ?            flush_put_bits(&s->pb);            s->avctx->extradata_size= (get_bit_count(&s->pb)+7)>>3;        }                break;    case CODEC_ID_H263P:        s->fcode_tab= umv_fcode_tab;        s->min_qcoeff= -127;        s->max_qcoeff=  127;        break;        //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later     case CODEC_ID_FLV1:        if (s->h263_flv > 1) {            s->min_qcoeff= -1023;            s->max_qcoeff=  1023;        } else {            s->min_qcoeff= -127;            s->max_qcoeff=  127;        }        s->y_dc_scale_table=        s->c_dc_scale_table= ff_mpeg1_dc_scale_table;        break;    default: //nothing needed default table allready set in mpegvideo.c        s->min_qcoeff= -127;        s->max_qcoeff=  127;        s->y_dc_scale_table=        s->c_dc_scale_table= ff_mpeg1_dc_scale_table;    }}/** * encodes a 8x8 block. * @param block the 8x8 block * @param n block index (0-3 are luma, 4-5 are chroma) */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 < 1) {            level = 1;            block[0] = 1;        }        if (level == 128) //FIXME check rv10            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) {              if(s->h263_flv <= 1){                put_bits(&s->pb, 1, last);                put_bits(&s->pb, 6, run);                                assert(slevel != 0);                if(slevel < 128 && slevel > -128)                     put_bits(&s->pb, 8, slevel & 0xff);                else{                    put_bits(&s->pb, 8, 128);                    put_bits(&s->pb, 5, slevel & 0x1f);                    put_bits(&s->pb, 6, (slevel>>5)&0x3f);                }              }else{                    if(slevel < 64 && slevel > -64) {                        /* 7-bit level */                        put_bits(&s->pb, 1, 0);                        put_bits(&s->pb, 1, last);                        put_bits(&s->pb, 6, run);                        put_bits(&s->pb, 7, slevel & 0x7f);                    } else {                        /* 11-bit level */                        put_bits(&s->pb, 1, 1);                        put_bits(&s->pb, 1, last);                        put_bits(&s->pb, 6, run);                        put_bits(&s->pb, 11, slevel & 0x7ff);                    }              }            } else {                put_bits(&s->pb, 1, sign);            }            last_non_zero = i;        }    }}#endif#ifdef CONFIG_ENCODERS/***************************************************//** * 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->current_picture_ptr->pts)        s->time= (s->current_picture_ptr->pts*s->time_increment_resolution + 500*1000)/(1000*1000);    else        s->time= av_rescale(picture_number*(int64_t)s->avctx->frame_rate_base, s->time_increment_resolution, s->avctx->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_gop_header(MpegEncContext * s){    int hours, minutes, seconds;        put_bits(&s->pb, 16, 0);    put_bits(&s->pb, 16, GOP_STARTCODE);        seconds= s->time/s->time_increment_resolution;    minutes= seconds/60; seconds %= 60;    hours= minutes/60; minutes %= 60;    hours%=24;    put_bits(&s->pb, 5, hours);    put_bits(&s->pb, 6, minutes);    put_bits(&s->pb, 1, 1);    put_bits(&s->pb, 6, seconds);        put_bits(&s->pb, 1, 0); //closed gov == NO    put_bits(&s->pb, 1, 0); //broken link == NO    ff_mpeg4_stuffing(&s->pb);}static void mpeg4_encode_visual_object_header(MpegEncContext * s){    int profile_and_level_indication;    int vo_ver_id;        if(s->max_b_frames || s->quarter_sample){        profile_and_level_indication= 0xF1; // adv simple level 1        vo_ver_id= 5;    }else{        profile_and_level_indication= 0x01; // simple level 1        vo_ver_id= 1;    }    //FIXME levels    put_bits(&s->pb, 16, 0);    put_bits(&s->pb, 16, VOS_STARTCODE);    put_bits(&s->pb, 8, profile_and_level_indication);    put_bits(&s->pb, 16, 0);    put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);        put_bits(&s->pb, 1, 1);        put_bits(&s->pb, 4, vo_ver_id);        put_bits(&s->pb, 3, 1); //priority     put_bits(&s->pb, 4, 1); //visual obj type== video obj        put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME    ff_mpeg4_stuffing(&s->pb);}static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number){    int vo_ver_id;    if(s->max_b_frames || s->quarter_sample){        vo_ver_id= 5;        s->vo_type= ADV_SIMPLE_VO_TYPE;    }else{        vo_ver_id= 1;        s->vo_type= SIMPLE_VO_TYPE;    }    put_bits(&s->pb, 16, 0);    put_bits(&s->pb, 16, 0x100 + vo_number);        /* video obj */    put_bits(&s->pb, 16, 0);    put_bits(&s->pb, 16, 0x120 + vol_number);       /* 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 */        aspect_to_info(s, s->avctx->sample_aspect_ratio);    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->avctx->sample_aspect_ratio.num);        put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);    }    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 cont

⌨️ 快捷键说明

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