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

📄 h263.c

📁 arm平台下的H264编码和解码源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
            /* left prediction */            if (a != 1024) {                ac_val -= 16;                for(i=1;i<8;i++) {                    block[s->dsp.idct_permutation[i<<3]] += ac_val[i];                }                pred_dc = a;            }        } else {            /* top prediction */            if (c != 1024) {                ac_val -= 16 * wrap;                for(i=1;i<8;i++) {                    block[s->dsp.idct_permutation[i   ]] += ac_val[i + 8];                }                pred_dc = c;            }        }    } else {        /* just DC prediction */        if (a != 1024 && c != 1024)            pred_dc = (a + c) >> 1;        else if (a != 1024)            pred_dc = a;        else            pred_dc = c;    }        /* we assume pred is positive */    block[0]=block[0]*scale + pred_dc;        if (block[0] < 0)        block[0] = 0;    else         block[0] |= 1;        /* Update AC/DC tables */    dc_val[(x) + (y) * wrap] = block[0];        /* left copy */    for(i=1;i<8;i++)        ac_val1[i    ] = block[s->dsp.idct_permutation[i<<3]];    /* top copy */    for(i=1;i<8;i++)        ac_val1[8 + i] = block[s->dsp.idct_permutation[i   ]];}int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,                        int *px, int *py){    int wrap;    int16_t *A, *B, *C, (*mot_val)[2];    static const int off[4]= {2, 1, 1, -1};    wrap = s->b8_stride;    mot_val = s->current_picture.motion_val[dir] + s->block_index[block];    A = mot_val[ - 1];    /* special case for first (slice) line */    if (s->first_slice_line && block<3) {        // we cant just change some MVs to simulate that as we need them for the B frames (and ME)        // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(        if(block==0){ //most common case            if(s->mb_x  == s->resync_mb_x){ //rare                *px= *py = 0;            }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare                C = mot_val[off[block] - wrap];                if(s->mb_x==0){                    *px = C[0];                    *py = C[1];                }else{                    *px = mid_pred(A[0], 0, C[0]);                    *py = mid_pred(A[1], 0, C[1]);                }            }else{                *px = A[0];                *py = A[1];            }        }else if(block==1){            if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare                C = mot_val[off[block] - wrap];                *px = mid_pred(A[0], 0, C[0]);                *py = mid_pred(A[1], 0, C[1]);            }else{                *px = A[0];                *py = A[1];            }        }else{ /* block==2*/            B = mot_val[ - wrap];            C = mot_val[off[block] - wrap];            if(s->mb_x == s->resync_mb_x) //rare                A[0]=A[1]=0;                *px = mid_pred(A[0], B[0], C[0]);            *py = mid_pred(A[1], B[1], C[1]);        }    } else {        B = mot_val[ - wrap];        C = mot_val[off[block] - wrap];        *px = mid_pred(A[0], B[0], C[0]);        *py = mid_pred(A[1], B[1], C[1]);    }    return *mot_val;}#ifdef CONFIG_ENCODERSstatic void h263_encode_motion(MpegEncContext * s, int val, int f_code){    int range, l, 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 = f_code - 1;        range = 1 << bit_size;        /* modulo encoding */        l = range * 32;#if 1        val+= l;        val&= 2*l-1;        val-= l;        sign = val>>31;        val= (val^sign)-sign;        sign&=1;#else        if (val < -l) {            val += 2*l;        } else if (val >= l) {            val -= 2*l;        }        assert(val>=-l && val<l);        if (val >= 0) {            sign = 0;        } else {            val = -val;            sign = 1;        }#endif        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);        }    }}/* Encode MV differences on H.263+ with Unrestricted MV mode */static void h263p_encode_umotion(MpegEncContext * s, int val){    short sval = 0;     short i = 0;    short n_bits = 0;    short temp_val;    int code = 0;    int tcode;        if ( val == 0)        put_bits(&s->pb, 1, 1);    else if (val == 1)        put_bits(&s->pb, 3, 0);    else if (val == -1)        put_bits(&s->pb, 3, 2);    else {                sval = ((val < 0) ? (short)(-val):(short)val);        temp_val = sval;                while (temp_val != 0) {            temp_val = temp_val >> 1;            n_bits++;        }                i = n_bits - 1;        while (i > 0) {            tcode = (sval & (1 << (i-1))) >> (i-1);            tcode = (tcode << 1) | 1;            code = (code << 2) | tcode;            i--;        }        code = ((code << 1) | (val < 0)) << 1;        put_bits(&s->pb, (2*n_bits)+1, code);        //printf("\nVal = %d\tCode = %d", sval, code);    }}static void init_mv_penalty_and_fcode(MpegEncContext *s){    int f_code;    int mv;        if(mv_penalty==NULL)        mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );        for(f_code=1; f_code<=MAX_FCODE; f_code++){        for(mv=-MAX_MV; mv<=MAX_MV; mv++){            int len;            if(mv==0) len= mvtab[0][1];            else{                int val, bit_size, range, code;                bit_size = f_code - 1;                range = 1 << bit_size;                val=mv;                if (val < 0)                     val = -val;                val--;                code = (val >> bit_size) + 1;                if(code<33){                    len= mvtab[code][1] + 1 + bit_size;                }else{                    len= mvtab[32][1] + 2 + bit_size;                }            }            mv_penalty[f_code][mv+MAX_MV]= len;        }    }    for(f_code=MAX_FCODE; f_code>0; f_code--){        for(mv=-(16<<f_code); mv<(16<<f_code); mv++){            fcode_tab[mv+MAX_MV]= f_code;        }    }    for(mv=0; mv<MAX_MV*2+1; mv++){        umv_fcode_tab[mv]= 1;    }}#endif#ifdef CONFIG_ENCODERSstatic 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_bits[level+256]= uni_code;        uni_DCtab_lum_len [level+256]= 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_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;                }            }        

⌨️ 快捷键说明

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