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

📄 h263.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 5 页
字号:
        else            qp_lc= s->current_picture.qscale_table[xy-1];        if(qp_lc){            s->dsp.h263_h_loop_filter(dest_y,   linesize, qp_lc);            if(s->mb_y + 1 == s->mb_height){                const int chroma_qp= s->chroma_qscale_table[qp_lc];                s->dsp.h263_h_loop_filter(dest_y +8*  linesize,   linesize, qp_lc);                s->dsp.h263_h_loop_filter(dest_cb             , uvlinesize, chroma_qp);                s->dsp.h263_h_loop_filter(dest_cr             , uvlinesize, chroma_qp);            }        }    }}#ifdef CONFIG_ENCODERSstatic int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr){    int x, y, wrap, a, c, pred_dc, scale;    int16_t *dc_val;    /* find prediction */    if (n < 4) {        x = 2 * s->mb_x + (n & 1);        y = 2 * s->mb_y + ((n & 2) >> 1);        wrap = s->b8_stride;        dc_val = s->dc_val[0];        scale = s->y_dc_scale;    } else {        x = s->mb_x;        y = s->mb_y;        wrap = s->mb_stride;        dc_val = s->dc_val[n - 4 + 1];        scale = s->c_dc_scale;    }    /* B C     * A X     */    a = dc_val[(x - 1) + (y) * wrap];    c = dc_val[(x) + (y - 1) * wrap];    /* No prediction outside GOB boundary */    if(s->first_slice_line && n!=3){        if(n!=2) c= 1024;        if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;    }    pred_dc = 1024;    /* 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 */    //pred_dc = (pred_dc + (scale >> 1)) / scale;    *dc_val_ptr = &dc_val[x + y * wrap];    return pred_dc;}#endif /* CONFIG_ENCODERS */static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n){    int x, y, wrap, a, c, pred_dc, scale, i;    int16_t *dc_val, *ac_val, *ac_val1;    /* find prediction */    if (n < 4) {        x = 2 * s->mb_x + (n & 1);        y = 2 * s->mb_y + (n>> 1);        wrap = s->b8_stride;        dc_val = s->dc_val[0];        ac_val = s->ac_val[0][0];        scale = s->y_dc_scale;    } else {        x = s->mb_x;        y = s->mb_y;        wrap = s->mb_stride;        dc_val = s->dc_val[n - 4 + 1];        ac_val = s->ac_val[n - 4 + 1][0];        scale = s->c_dc_scale;    }    ac_val += ((y) * wrap + (x)) * 16;    ac_val1 = ac_val;    /* B C     * A X     */    a = dc_val[(x - 1) + (y) * wrap];    c = dc_val[(x) + (y - 1) * wrap];    /* No prediction outside GOB boundary */    if(s->first_slice_line && n!=3){        if(n!=2) c= 1024;        if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;    }    if (s->ac_pred) {        pred_dc = 1024;        if (s->h263_aic_dir) {            /* 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 can't 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_ENCODERSvoid ff_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= INT_BIT - 6 - bit_size;        val = (val<<l)>>l;        sign = val>>31;        val= (val^sign)-sign;        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);        }    }}/* 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;    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] + av_log2(code>>5) + 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;    }}static 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;    }}static 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_

⌨️ 快捷键说明

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