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

📄 h263.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 5 页
字号:
                ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x,                                                s->mv[0][0][1] - pred_y, s->f_code);                ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x,                                                s->mv[0][1][1] - pred_y, s->f_code);            }else{                assert(s->mv_type==MV_TYPE_8X8);                put_bits(&s->pb,                        inter_MCBPC_bits[cbpc+16],                        inter_MCBPC_code[cbpc+16]);                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);                if(!s->progressive_sequence){                    if(cbp)                        put_bits(pb2, 1, s->interlaced_dct);                }                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);                    ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x,                                                    s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);                }            }            if(interleaved_stats){                s->mv_bits+= get_bits_diff(s);            }            mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);            if(interleaved_stats){                s->p_tex_bits+= get_bits_diff(s);            }            s->f_count++;        }    } else {        int cbp;        int dc_diff[6];   //dc values with the dc prediction subtracted        int dir[6];  //prediction direction        int zigzag_last_index[6];        uint8_t *scan_table[6];        int i;        for(i=0; i<6; i++){            dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);        }        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];    int16_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;

⌨️ 快捷键说明

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