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

📄 h263.c

📁 mpeg4 video codec mpeg4 video codec
💻 C
📖 第 1 页 / 共 5 页
字号:
        if(s->flags & CODEC_FLAG_AC_PRED){            s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);            if(!s->ac_pred)                restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);        }else{            for(i=0; i<6; i++)                scan_table[i]= s->intra_scantable.permutated;        }        /* compute cbp */        cbp = 0;        for (i = 0; i < 6; i++) {            if (s->block_last_index[i] >= 1)                cbp |= 1 << (5 - i);        }        cbpc = cbp & 3;        if (s->pict_type == I_TYPE) {            if(s->dquant) cbpc+=4;            put_bits(&s->pb,                intra_MCBPC_bits[cbpc],                intra_MCBPC_code[cbpc]);        } else {            if(s->dquant) cbpc+=8;            put_bits(&s->pb, 1, 0);	/* mb coded */            put_bits(&s->pb,                inter_MCBPC_bits[cbpc + 4],                inter_MCBPC_code[cbpc + 4]);        }        put_bits(pb2, 1, s->ac_pred);        cbpy = cbp >> 2;        put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);        if(s->dquant)            put_bits(dc_pb, 2, dquant_code[s->dquant+2]);        if(!s->progressive_sequence){            put_bits(dc_pb, 1, s->interlaced_dct);        }        if(interleaved_stats){            s->misc_bits+= get_bits_diff(s);        }        mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);        if(interleaved_stats){            s->i_tex_bits+= get_bits_diff(s);        }        s->i_count++;        /* restore ac coeffs & last_index stuff if we messed them up with the prediction */        if(s->ac_pred)            restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);    }}void h263_encode_mb(MpegEncContext * s,		    DCTELEM block[6][64],		    int motion_x, int motion_y){    int cbpc, cbpy, i, cbp, pred_x, pred_y;    int16_t pred_dc;    int16_t rec_intradc[6];    uint16_t *dc_ptr[6];    const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);    const int dquant_code[5]= {1,0,9,2,3};               //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);    if (!s->mb_intra) {        /* compute cbp */        cbp= get_p_cbp(s, block, motion_x, motion_y);        if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {            /* skip macroblock */            put_bits(&s->pb, 1, 1);            if(interleaved_stats){                s->misc_bits++;                s->last_bits++;            }            s->skip_count++;            return;        }        put_bits(&s->pb, 1, 0);	/* mb coded */                cbpc = cbp & 3;        cbpy = cbp >> 2;        if(s->alt_inter_vlc==0 || cbpc!=3)            cbpy ^= 0xF;        if(s->dquant) cbpc+= 8;        if(s->mv_type==MV_TYPE_16X16){        put_bits(&s->pb,		    inter_MCBPC_bits[cbpc],		    inter_MCBPC_code[cbpc]);        put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);        if(s->dquant)            put_bits(&s->pb, 2, dquant_code[s->dquant+2]);        if(interleaved_stats){            s->misc_bits+= get_bits_diff(s);        }            /* motion vectors: 16x16 mode */            h263_pred_motion(s, 0, 0, &pred_x, &pred_y);              if (!s->umvplus) {                  ff_h263_encode_motion_vector(s, motion_x - pred_x,                                                motion_y - pred_y, 1);        }        else {            h263p_encode_umotion(s, motion_x - pred_x);            h263p_encode_umotion(s, motion_y - pred_y);            if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))                /* To prevent Start Code emulation */                put_bits(&s->pb,1,1);        }        }else{            put_bits(&s->pb,                    inter_MCBPC_bits[cbpc+16],                    inter_MCBPC_code[cbpc+16]);            put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);            if(s->dquant)                put_bits(&s->pb, 2, dquant_code[s->dquant+2]);            if(interleaved_stats){                s->misc_bits+= get_bits_diff(s);            }            for(i=0; i<4; i++){                /* motion vectors: 8x8 mode*/                h263_pred_motion(s, i, 0, &pred_x, &pred_y);                motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0];                motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1];                if (!s->umvplus) {                      ff_h263_encode_motion_vector(s, motion_x - pred_x,                                                    motion_y - pred_y, 1);                }                else {                    h263p_encode_umotion(s, motion_x - pred_x);                    h263p_encode_umotion(s, motion_y - pred_y);                    if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))                        /* To prevent Start Code emulation */                        put_bits(&s->pb,1,1);                }            }        }        if(interleaved_stats){            s->mv_bits+= get_bits_diff(s);        }    } else {        assert(s->mb_intra);                cbp = 0;        if (s->h263_aic) {            /* Predict DC */        for(i=0; i<6; i++) {                int16_t level = block[i][0];                int scale;                                if(i<4) scale= s->y_dc_scale;                else    scale= s->c_dc_scale;                            pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);                level -= pred_dc;                /* Quant */                if (level >= 0)                    level = (level + (scale>>1))/scale;                else                    level = (level - (scale>>1))/scale;                                    /* AIC can change CBP */                if (level == 0 && s->block_last_index[i] == 0)                    s->block_last_index[i] = -1;                if(!s->modified_quant){                    if (level < -127)                    level = -127;                else if (level > 127)                    level = 127;                }                                block[i][0] = level;                /* Reconstruction */                 rec_intradc[i] = scale*level + pred_dc;                /* Oddify */                rec_intradc[i] |= 1;                //if ((rec_intradc[i] % 2) == 0)                //    rec_intradc[i]++;                /* Clipping */                if (rec_intradc[i] < 0)                    rec_intradc[i] = 0;                else if (rec_intradc[i] > 2047)                    rec_intradc[i] = 2047;                                                /* Update AC/DC tables */                *dc_ptr[i] = rec_intradc[i];                if (s->block_last_index[i] >= 0)                    cbp |= 1 << (5 - i);            }        }else{            for(i=0; i<6; i++) {            /* compute cbp */                if (s->block_last_index[i] >= 1)                cbp |= 1 << (5 - i);        }        }        cbpc = cbp & 3;        if (s->pict_type == I_TYPE) {            if(s->dquant) cbpc+=4;            put_bits(&s->pb,                intra_MCBPC_bits[cbpc],                intra_MCBPC_code[cbpc]);        } else {            if(s->dquant) cbpc+=8;            put_bits(&s->pb, 1, 0);	/* mb coded */            put_bits(&s->pb,                inter_MCBPC_bits[cbpc + 4],                inter_MCBPC_code[cbpc + 4]);        }        if (s->h263_aic) {            /* XXX: currently, we do not try to use ac prediction */            put_bits(&s->pb, 1, 0);	/* no AC prediction */        }        cbpy = cbp >> 2;        put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);        if(s->dquant)            put_bits(&s->pb, 2, dquant_code[s->dquant+2]);        if(interleaved_stats){            s->misc_bits+= get_bits_diff(s);        }    }    for(i=0; i<6; i++) {        /* encode each block */        h263_encode_block(s, block[i], i);            /* Update INTRADC for decoding */        if (s->h263_aic && s->mb_intra) {            block[i][0] = rec_intradc[i];                    }    }    if(interleaved_stats){        if (!s->mb_intra) {            s->p_tex_bits+= get_bits_diff(s);            s->f_count++;        }else{            s->i_tex_bits+= get_bits_diff(s);            s->i_count++;        }    }}#endifvoid ff_h263_loop_filter(MpegEncContext * s){    int qp_c;    const int linesize  = s->linesize;    const int uvlinesize= s->uvlinesize;    const int xy = s->mb_y * s->mb_stride + s->mb_x;    uint8_t *dest_y = s->dest[0];    uint8_t *dest_cb= s->dest[1];    uint8_t *dest_cr= s->dest[2];    //    if(s->pict_type==B_TYPE && !s->readable) return;    /*       Diag Top       Left Center    */    if(!IS_SKIP(s->current_picture.mb_type[xy])){        qp_c= s->qscale;        s->dsp.h263_v_loop_filter(dest_y+8*linesize  , linesize, qp_c);        s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);    }else        qp_c= 0;    if(s->mb_y){        int qp_dt, qp_t, qp_tc;        if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride]))            qp_t=0;        else             qp_t= s->current_picture.qscale_table[xy-s->mb_stride];        if(qp_c)             qp_tc= qp_c;        else            qp_tc= qp_t;                    if(qp_tc){            const int chroma_qp= s->chroma_qscale_table[qp_tc];            s->dsp.h263_v_loop_filter(dest_y  ,   linesize, qp_tc);            s->dsp.h263_v_loop_filter(dest_y+8,   linesize, qp_tc);                    s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);            s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);        }                if(qp_t)            s->dsp.h263_h_loop_filter(dest_y-8*linesize+8  ,   linesize, qp_t);                if(s->mb_x){            if(qp_t || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride]))                qp_dt= qp_t;            else                qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride];                        if(qp_dt){                const int chroma_qp= s->chroma_qscale_table[qp_dt];                s->dsp.h263_h_loop_filter(dest_y -8*linesize  ,   linesize, qp_dt);                s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);                s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp);            }        }    }    if(qp_c){        s->dsp.h263_h_loop_filter(dest_y +8,   linesize, qp_c);        if(s->mb_y + 1 == s->mb_height)            s->dsp.h263_h_loop_filter(dest_y+8*linesize+8,   linesize, qp_c);    }        if(s->mb_x){        int qp_lc;        if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1]))            qp_lc= qp_c;        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);            }        }    }}static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr){    int x, y, wrap, a, c, pred_dc, scale;    int16_t *dc_val, *ac_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];        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;    }    /* 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;

⌨️ 快捷键说明

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