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

📄 h263.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 5 页
字号:
            if(!s->progressive_sequence){                if(cbp)                    put_bits(&s->pb, 1, s->interlaced_dct);                if(mb_type) // not diect mode                    put_bits(&s->pb, 1, 0); // no interlaced ME yet            }            if(interleaved_stats){                s->misc_bits+= get_bits_diff(s);            }            switch(mb_type)            {            case 0: /* direct */                h263_encode_motion(s, motion_x, 1);                h263_encode_motion(s, motion_y, 1);                                s->b_count++;                s->f_count++;                break;            case 1: /* bidir */                h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);                h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);                h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);                h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);                s->last_mv[0][0][0]= s->mv[0][0][0];                s->last_mv[0][0][1]= s->mv[0][0][1];                s->last_mv[1][0][0]= s->mv[1][0][0];                s->last_mv[1][0][1]= s->mv[1][0][1];                s->b_count++;                s->f_count++;                break;            case 2: /* backward */                h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);                h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);                s->last_mv[1][0][0]= motion_x;                s->last_mv[1][0][1]= motion_y;                s->b_count++;                break;            case 3: /* forward */                h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);                h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);                s->last_mv[0][0][0]= motion_x;                s->last_mv[0][0][1]= motion_y;                s->f_count++;                break;            default:                av_log(s->avctx, AV_LOG_ERROR, "unknown mb type\n");                return;            }            if(interleaved_stats){                s->mv_bits+= get_bits_diff(s);            }            /* encode each block */            for (i = 0; i < 6; i++) {                mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, &s->pb);            }            if(interleaved_stats){                s->p_tex_bits+= get_bits_diff(s);            }        }else{ /* s->pict_type==B_TYPE */            cbp= get_p_cbp(s, block, motion_x, motion_y);                    if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {                /* check if the B frames can skip it too, as we must skip it if we skip here                    why didnt they just compress the skip-mb bits instead of reusing them ?! */                if(s->max_b_frames>0){                    int i;                    int x,y, offset;                    uint8_t *p_pic;                    x= s->mb_x*16;                    y= s->mb_y*16;                    if(x+16 > s->width)  x= s->width-16;                    if(y+16 > s->height) y= s->height-16;                    offset= x + y*s->linesize;                    p_pic= s->new_picture.data[0] + offset;                                        s->mb_skiped=1;                    for(i=0; i<s->max_b_frames; i++){                        uint8_t *b_pic;                        int diff;                        Picture *pic= s->reordered_input_picture[i+1];                        if(pic==NULL || pic->pict_type!=B_TYPE) break;                        b_pic= pic->data[0] + offset + 16; //FIXME +16			diff= s->dsp.pix_abs16x16(p_pic, b_pic, s->linesize);                        if(diff>s->qscale*70){ //FIXME check that 70 is optimal                            s->mb_skiped=0;                            break;                        }                    }                }else                    s->mb_skiped=1;                 if(s->mb_skiped==1){                    /* 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 */            if(s->mv_type==MV_TYPE_16X16){                cbpc = cbp & 3;                if(s->dquant) cbpc+= 8;                put_bits(&s->pb,                        inter_MCBPC_bits[cbpc],                        inter_MCBPC_code[cbpc]);                cbpy = cbp >> 2;                cbpy ^= 0xf;                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);                if(s->dquant)                    put_bits(pb2, 2, dquant_code[s->dquant+2]);                if(!s->progressive_sequence){                    if(cbp)                        put_bits(pb2, 1, s->interlaced_dct);                    put_bits(pb2, 1, 0); // no interlaced ME yet                }                                    if(interleaved_stats){                    s->misc_bits+= get_bits_diff(s);                }                /* motion vectors: 16x16 mode */                h263_pred_motion(s, 0, &pred_x, &pred_y);                            h263_encode_motion(s, motion_x - pred_x, s->f_code);                h263_encode_motion(s, motion_y - pred_y, s->f_code);            }else{                cbpc = (cbp & 3)+16;                put_bits(&s->pb,                        inter_MCBPC_bits[cbpc],                        inter_MCBPC_code[cbpc]);                cbpy = cbp >> 2;                cbpy ^= 0xf;                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, &pred_x, &pred_y);                    h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code);                    h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code);                }            }            if(interleaved_stats){                 s->mv_bits+= get_bits_diff(s);            }            /* encode each block */            for (i = 0; i < 6; i++) {                mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, 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++){            const int level= block[i][0];            uint16_t *dc_ptr;            dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);            if (i < 4) {                *dc_ptr = level * s->y_dc_scale;            } else {                *dc_ptr = level * s->c_dc_scale;            }        }        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);        }        /* encode each block */        for (i = 0; i < 6; i++) {            mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], 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) == 0) {            /* skip macroblock */            put_bits(&s->pb, 1, 1);            if(interleaved_stats){                s->misc_bits++;                s->last_bits++;            }            return;        }        put_bits(&s->pb, 1, 0);	/* mb coded */        cbpc = cbp & 3;        if(s->dquant) cbpc+= 8;        put_bits(&s->pb,		    inter_MCBPC_bits[cbpc],		    inter_MCBPC_code[cbpc]);        cbpy = cbp >> 2;        cbpy ^= 0xf;        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 only now */        h263_pred_motion(s, 0, &pred_x, &pred_y);              if (!s->umvplus) {              h263_encode_motion(s, motion_x - pred_x, s->f_code);            h263_encode_motion(s, motion_y - pred_y, s->f_code);        }        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 {        int li = s->h263_aic ? 0 : 1;                cbp = 0;        for(i=0; i<6; i++) {            /* Predict DC */            if (s->h263_aic && s->mb_intra) {                int16_t level = block[i][0];                            pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);                level -= pred_dc;                /* Quant */                if (level < 0)                    level = (level + (s->qscale >> 1))/(s->y_dc_scale);                else                    level = (level - (s->qscale >> 1))/(s->y_dc_scale);                                    /* AIC can change CBP */                if (level == 0 && s->block_last_index[i] == 0)                    s->block_last_index[i] = -1;                else if (level < -127)                    level = -127;                else if (level > 127)                    level = 127;                                block[i][0] = level;                /* Reconstruction */                 rec_intradc[i] = (s->y_dc_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];            }            /* compute cbp */            if (s->block_last_index[i] >= li)                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);        }

⌨️ 快捷键说明

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