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

📄 mpeg12.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 5 页
字号:
static void common_init(MpegEncContext *s){    s->y_dc_scale_table=    s->c_dc_scale_table= ff_mpeg1_dc_scale_table;}void ff_mpeg1_clean_buffers(MpegEncContext *s){    s->last_dc[0] = 1 << (7 + s->intra_dc_precision);    s->last_dc[1] = s->last_dc[0];    s->last_dc[2] = s->last_dc[0];    memset(s->last_mv, 0, sizeof(s->last_mv));}#ifdef CONFIG_ENCODERSvoid ff_mpeg1_encode_slice_header(MpegEncContext *s){    put_header(s, SLICE_MIN_START_CODE + s->mb_y);    put_bits(&s->pb, 5, s->qscale); /* quantizer scale */    put_bits(&s->pb, 1, 0); /* slice extra information */}void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number){    mpeg1_encode_sequence_header(s);    /* mpeg1 picture header */    put_header(s, PICTURE_START_CODE);    /* temporal reference */    // RAL: s->picture_number instead of s->fake_picture_number    put_bits(&s->pb, 10, (s->picture_number -                           s->gop_picture_number) & 0x3ff);     s->fake_picture_number++;        put_bits(&s->pb, 3, s->pict_type);    put_bits(&s->pb, 16, 0xffff); /* non constant bit rate */        // RAL: Forward f_code also needed for B frames    if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) {        put_bits(&s->pb, 1, 0); /* half pel coordinates */        if(s->codec_id == CODEC_ID_MPEG1VIDEO)            put_bits(&s->pb, 3, s->f_code); /* forward_f_code */        else            put_bits(&s->pb, 3, 7); /* forward_f_code */    }        // RAL: Backward f_code necessary for B frames    if (s->pict_type == B_TYPE) {        put_bits(&s->pb, 1, 0); /* half pel coordinates */        if(s->codec_id == CODEC_ID_MPEG1VIDEO)            put_bits(&s->pb, 3, s->b_code); /* backward_f_code */        else            put_bits(&s->pb, 3, 7); /* backward_f_code */    }    put_bits(&s->pb, 1, 0); /* extra bit picture */        if(s->codec_id == CODEC_ID_MPEG2VIDEO){        put_header(s, EXT_START_CODE);        put_bits(&s->pb, 4, 8); //pic ext        if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) {            put_bits(&s->pb, 4, s->f_code);            put_bits(&s->pb, 4, s->f_code);        }else{            put_bits(&s->pb, 8, 255);        }        if (s->pict_type == B_TYPE) {            put_bits(&s->pb, 4, s->b_code);            put_bits(&s->pb, 4, s->b_code);        }else{            put_bits(&s->pb, 8, 255);        }        put_bits(&s->pb, 2, s->intra_dc_precision);        put_bits(&s->pb, 2, s->picture_structure= PICT_FRAME);        put_bits(&s->pb, 1, s->top_field_first);        put_bits(&s->pb, 1, s->frame_pred_frame_dct= 1);        put_bits(&s->pb, 1, s->concealment_motion_vectors);        put_bits(&s->pb, 1, s->q_scale_type);        put_bits(&s->pb, 1, s->intra_vlc_format);        put_bits(&s->pb, 1, s->alternate_scan);        put_bits(&s->pb, 1, s->repeat_first_field);        put_bits(&s->pb, 1, s->chroma_420_type=1);        put_bits(&s->pb, 1, s->progressive_frame=1);        put_bits(&s->pb, 1, 0); //composite_display_flag    }        s->mb_y=0;    ff_mpeg1_encode_slice_header(s);}void mpeg1_encode_mb(MpegEncContext *s,                     DCTELEM block[6][64],                     int motion_x, int motion_y){    int i, cbp;    const int mb_x = s->mb_x;    const int mb_y = s->mb_y;    const int first_mb= mb_x == s->resync_mb_x && mb_y == s->resync_mb_y;    /* compute cbp */    cbp = 0;    for(i=0;i<6;i++) {        if (s->block_last_index[i] >= 0)            cbp |= 1 << (5 - i);    }    if (cbp == 0 && !first_mb && (mb_x != s->mb_width - 1 || (mb_y != s->mb_height - 1 && s->codec_id == CODEC_ID_MPEG1VIDEO)) &&         ((s->pict_type == P_TYPE && (motion_x | motion_y) == 0) ||        (s->pict_type == B_TYPE && s->mv_dir == s->last_mv_dir && (((s->mv_dir & MV_DIR_FORWARD) ? ((s->mv[0][0][0] - s->last_mv[0][0][0])|(s->mv[0][0][1] - s->last_mv[0][0][1])) : 0) |        ((s->mv_dir & MV_DIR_BACKWARD) ? ((s->mv[1][0][0] - s->last_mv[1][0][0])|(s->mv[1][0][1] - s->last_mv[1][0][1])) : 0)) == 0))) {        s->mb_skip_run++;        s->qscale -= s->dquant;        s->skip_count++;        s->misc_bits++;        s->last_bits++;    } else {        if(first_mb){            assert(s->mb_skip_run == 0);            encode_mb_skip_run(s, s->mb_x);        }else{            encode_mb_skip_run(s, s->mb_skip_run);        }                if (s->pict_type == I_TYPE) {            if(s->dquant && cbp){                put_bits(&s->pb, 2, 1); /* macroblock_type : macroblock_quant = 1 */                put_bits(&s->pb, 5, s->qscale);            }else{                put_bits(&s->pb, 1, 1); /* macroblock_type : macroblock_quant = 0 */                s->qscale -= s->dquant;            }            s->misc_bits+= get_bits_diff(s);            s->i_count++;        } else if (s->mb_intra) {            if(s->dquant && cbp){                put_bits(&s->pb, 6, 0x01);                put_bits(&s->pb, 5, s->qscale);            }else{                put_bits(&s->pb, 5, 0x03);                s->qscale -= s->dquant;            }            s->misc_bits+= get_bits_diff(s);            s->i_count++;            s->last_mv[0][0][0] =             s->last_mv[0][0][1] = 0;        } else if (s->pict_type == P_TYPE) {                 if (cbp != 0) {                    if (motion_x == 0 && motion_y == 0) {                        if(s->dquant){                            put_bits(&s->pb, 5, 1); /* macroblock_pattern & quant */                            put_bits(&s->pb, 5, s->qscale);                        }else{                            put_bits(&s->pb, 2, 1); /* macroblock_pattern only */                        }                        s->misc_bits+= get_bits_diff(s);                        put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]);                    } else {                        if(s->dquant){                            put_bits(&s->pb, 5, 2); /* motion + cbp */                            put_bits(&s->pb, 5, s->qscale);                        }else{                            put_bits(&s->pb, 1, 1); /* motion + cbp */                        }                        s->misc_bits+= get_bits_diff(s);                        mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);    // RAL: f_code parameter added                        mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);    // RAL: f_code parameter added                        s->mv_bits+= get_bits_diff(s);                        put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]);                    }                } else {                    put_bits(&s->pb, 3, 1); /* motion only */                    mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);    // RAL: f_code parameter added                    mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);    // RAL: f_code parameter added                    s->qscale -= s->dquant;                    s->mv_bits+= get_bits_diff(s);                }                s->f_count++;        } else            {    // RAL: All the following bloc added for B frames:                if (cbp != 0)                    {    // With coded bloc pattern                    if (s->mv_dir == (MV_DIR_FORWARD | MV_DIR_BACKWARD))                        {    // Bi-directional motion                        if (s->dquant)                            {    // With QScale                            put_bits(&s->pb, 5, 2);                            put_bits(&s->pb, 5, s->qscale);                            }                        else    // Without QScale                            put_bits(&s->pb, 2, 3);                        s->misc_bits += get_bits_diff(s);                        mpeg1_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);                        mpeg1_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);                        mpeg1_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);                        mpeg1_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);                        s->b_count++;                        s->f_count++;                        s->mv_bits += get_bits_diff(s);                        put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]);                        }                    else if (s->mv_dir == MV_DIR_BACKWARD)                        {    // Backward motion                        if (s->dquant)                            {    // With QScale                            put_bits(&s->pb, 6, 2);                            put_bits(&s->pb, 5, s->qscale);                            }                        else    // Without QScale                            put_bits(&s->pb, 3, 3);                        s->misc_bits += get_bits_diff(s);                        mpeg1_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);                         mpeg1_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);                         s->b_count++;                        s->mv_bits += get_bits_diff(s);                        put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]);                        }                    else if (s->mv_dir == MV_DIR_FORWARD)                        {    // Forward motion                        if (s->dquant)                            {    // With QScale                            put_bits(&s->pb, 6, 3);                            put_bits(&s->pb, 5, s->qscale);                            }                        else    // Without QScale                            put_bits(&s->pb, 4, 3);                        s->misc_bits += get_bits_diff(s);                        mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);                         mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);                         s->f_count++;                        s->mv_bits += get_bits_diff(s);                        put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]);                        }                    }                else                    {    // No coded bloc pattern                    if (s->mv_dir == (MV_DIR_FORWARD | MV_DIR_BACKWARD))                        {    // Bi-directional motion                         put_bits(&s->pb, 2, 2); /* backward & forward motion */                        mpeg1_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);                        mpeg1_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);                        mpeg1_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);                        mpeg1_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);                        s->b_count++;                        s->f_count++;                        }                    else if (s->mv_dir == MV_DIR_BACKWARD)                        {    // Backward motion                        put_bits(&s->pb, 3, 2); /* backward motion only */                        mpeg1_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);                         mpeg1_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);                         s->b_count++;                        }                    else if (s->mv_dir == MV_DIR_FORWARD)                        {    // Forward motion                        put_bits(&s->pb, 4, 2); /* forward motion only */                        mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);                         mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);                         s->f_count++;                        }                    s->qscale -= s->dquant;                    s->mv_bits += get_bits_diff(s);                    }            // End of bloc from RAL            }        for(i=0;i<6;i++) {            if (cbp & (1 << (5 - i))) {                mpeg1_encode_block(s, block[i], i);            }        }        s->mb_skip_run = 0;        if(s->mb_intra)            s->i_tex_bits+= get_bits_diff(s);        else            s->p_tex_bits+= get_bits_diff(s);    }    // RAL: By this:    if (s->mv_dir & MV_DIR_FORWARD)        {        s->last_mv[0][0][0]= s->mv[0][0][0];        s->last_mv[0][0][1]= s->mv[0][0][1];        }    if (s->mv_dir & MV_DIR_BACKWARD)        {        s->last_mv[1][0][0]= s->mv[1][0][0];        s->last_mv[1][0][1]= s->mv[1][0][1];        }}// RAL: Parameter added: f_or_b_codestatic void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code){    int code, bit_size, l, m, bits, range, sign;    if (val == 0) {        /* zero vector */        code = 0;        put_bits(&s->pb,                 mbMotionVectorTable[0][1],                  mbMotionVectorTable[0][0]);     } else {        bit_size = f_or_b_code - 1;        range = 1 << bit_size;        /* modulo encoding */        l = 16 * range;        m = 2 * l;        if (val < -l) {            val += m;        } else if (val >= l) {            val -= m;        }        if (val >= 0) {            val--;            code = (val >> bit_size) + 1;            bits = val & (range - 1);            sign = 0;        } else {            val = -val;            val--;            code = (val >> bit_size) + 1;            bits = val & (range - 1);            sign = 1;        }        assert(code > 0 && code <= 16);        put_bits(&s->pb,                 mbMotionVectorTable[code][1],                  mbMotionVectorTable[code][0]);         put_bits(&s->pb, 1, sign);        if (bit_size > 0) {            put_bits(&s->pb, bit_size, bits);        }    }}void ff_mpeg1_encode_init(MpegEncContext *s){    static int done=0;    common_init(s);    if(!done){        int f_code;        int mv;	int i;        done=1;        init_rl(&rl_mpeg1);	for(i=0; i<64; i++)	{		mpeg1_max_level[0][i]= rl_mpeg1.max_level[0][i];		mpeg1_index_run[0][i]= rl_mpeg1.index_run[0][i];	}                init_uni_ac_vlc(&rl_mpeg1, uni_mpeg1_ac_vlc_bits, uni_mpeg1_ac_vlc_len);	/* build unified dc encoding tables */	for(i=-255; i<256; i++)	{		int adiff, index;		int bits, code;		int diff=i;		adiff = ABS(diff);		if(diff<0) diff--;		index = vlc_dc_table[adiff];		bits= vlc_dc_lum_bits[index] + index;

⌨️ 快捷键说明

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