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

📄 mpeg12.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 5 页
字号:
        else            quant_matrix = s->chroma_inter_matrix;        /* special case for the first coef. no need to add a second vlc table */        UPDATE_CACHE(re, &s->gb);        v= SHOW_UBITS(re, &s->gb, 2);        if (v & 2) {            LAST_SKIP_BITS(re, &s->gb, 2);            level= (3*qscale*quant_matrix[0])>>5;            if(v&1)                level= -level;            block[0] = level;            mismatch ^= level;            i++;        }        /* now quantify & encode AC coefs */        for(;;) {            UPDATE_CACHE(re, &s->gb);            GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2);                        if(level == 127){                break;            } else if(level != 0) {                i += run;                j = scantable[i];                level= ((level*2+1)*qscale*quant_matrix[j])>>5;                level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);                LAST_SKIP_BITS(re, &s->gb, 1);            } else {                /* escape */                run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);                UPDATE_CACHE(re, &s->gb);                level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12);                i += run;                j = scantable[i];                if(level<0){                    level= ((-level*2+1)*qscale*quant_matrix[j])>>5;                    level= -level;                }else{                    level= ((level*2+1)*qscale*quant_matrix[j])>>5;                }            }            if (i > 63){                fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);                return -1;            }                        mismatch ^= level;            block[j] = level;        }        CLOSE_READER(re, &s->gb);    }    block[63] ^= (mismatch & 1);        s->block_last_index[n] = i;    return 0;}static inline int mpeg2_decode_block_intra(MpegEncContext *s,                                DCTELEM *block,                                int n){    int level, dc, diff, i, j, run;    int component;    RLTable *rl;    UINT8 * const scantable= s->intra_scantable.permutated;    const UINT16 *quant_matrix;    const int qscale= s->qscale;    int mismatch;    /* DC coef */    if (n < 4){        quant_matrix = s->intra_matrix;        component = 0;     }else{        quant_matrix = s->chroma_intra_matrix;        component = n - 3;    }    diff = decode_dc(s, component);    if (diff >= 0xffff)        return -1;    dc = s->last_dc[component];    dc += diff;    s->last_dc[component] = dc;    block[0] = dc << (3 - s->intra_dc_precision);    dprintf("dc=%d\n", block[0]);    mismatch = block[0] ^ 1;    i = 0;    if (s->intra_vlc_format)        rl = &rl_mpeg2;    else        rl = &rl_mpeg1;    {        OPEN_READER(re, &s->gb);            /* now quantify & encode AC coefs */        for(;;) {            UPDATE_CACHE(re, &s->gb);            GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2);                        if(level == 127){                break;            } else if(level != 0) {                i += run;                j = scantable[i];                level= (level*qscale*quant_matrix[j])>>4;                level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);                LAST_SKIP_BITS(re, &s->gb, 1);            } else {                /* escape */                run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);                UPDATE_CACHE(re, &s->gb);                level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12);                i += run;                j = scantable[i];                if(level<0){                    level= (-level*qscale*quant_matrix[j])>>4;                    level= -level;                }else{                    level= (level*qscale*quant_matrix[j])>>4;                }            }            if (i > 63){                fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);                return -1;            }                        mismatch^= level;            block[j] = level;        }        CLOSE_READER(re, &s->gb);    }    block[63]^= mismatch&1;        s->block_last_index[n] = i;    return 0;}/* compressed picture size */#define PICTURE_BUFFER_SIZE 100000typedef struct Mpeg1Context {    MpegEncContext mpeg_enc_ctx;    UINT32 header_state;    int start_code; /* current start code */    UINT8 buffer[PICTURE_BUFFER_SIZE];     UINT8 *buf_ptr;    int buffer_size;    int mpeg_enc_ctx_allocated; /* true if decoding context allocated */    int repeat_field; /* true if we must repeat the field */} Mpeg1Context;static int mpeg_decode_init(AVCodecContext *avctx){    Mpeg1Context *s = avctx->priv_data;        s->mpeg_enc_ctx.flags= avctx->flags;    common_init(&s->mpeg_enc_ctx);    init_vlcs(&s->mpeg_enc_ctx);    s->header_state = 0xff;    s->mpeg_enc_ctx_allocated = 0;    s->buffer_size = PICTURE_BUFFER_SIZE;    s->start_code = -1;    s->buf_ptr = s->buffer;    s->mpeg_enc_ctx.picture_number = 0;    s->repeat_field = 0;    s->mpeg_enc_ctx.codec_id= avctx->codec->id;    avctx->mbskip_table= s->mpeg_enc_ctx.mbskip_table;    return 0;}/* return the 8 bit start code value and update the search   state. Return -1 if no start code found */static int find_start_code(UINT8 **pbuf_ptr, UINT8 *buf_end,                            UINT32 *header_state){    UINT8 *buf_ptr;    unsigned int state, v;    int val;    state = *header_state;    buf_ptr = *pbuf_ptr;    while (buf_ptr < buf_end) {        v = *buf_ptr++;        if (state == 0x000001) {            state = ((state << 8) | v) & 0xffffff;            val = state;            goto found;        }        state = ((state << 8) | v) & 0xffffff;    }    val = -1; found:    *pbuf_ptr = buf_ptr;    *header_state = state;    return val;}static int mpeg1_decode_picture(AVCodecContext *avctx,                                 UINT8 *buf, int buf_size){    Mpeg1Context *s1 = avctx->priv_data;    MpegEncContext *s = &s1->mpeg_enc_ctx;    int ref, f_code;    init_get_bits(&s->gb, buf, buf_size);    ref = get_bits(&s->gb, 10); /* temporal ref */    s->pict_type = get_bits(&s->gb, 3);    dprintf("pict_type=%d number=%d\n", s->pict_type, s->picture_number);    avctx->pict_type= s->pict_type;    avctx->key_frame= s->pict_type == I_TYPE;    skip_bits(&s->gb, 16);    if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) {        s->full_pel[0] = get_bits1(&s->gb);        f_code = get_bits(&s->gb, 3);        if (f_code == 0)            return -1;        s->mpeg_f_code[0][0] = f_code;        s->mpeg_f_code[0][1] = f_code;    }    if (s->pict_type == B_TYPE) {        s->full_pel[1] = get_bits1(&s->gb);        f_code = get_bits(&s->gb, 3);        if (f_code == 0)            return -1;        s->mpeg_f_code[1][0] = f_code;        s->mpeg_f_code[1][1] = f_code;    }    s->y_dc_scale = 8;    s->c_dc_scale = 8;    s->first_slice = 1;    return 0;}static void mpeg_decode_sequence_extension(MpegEncContext *s){    int horiz_size_ext, vert_size_ext;    int bit_rate_ext, vbv_buf_ext, low_delay;    int frame_rate_ext_n, frame_rate_ext_d;    skip_bits(&s->gb, 8); /* profil and level */    s->progressive_sequence = get_bits1(&s->gb); /* progressive_sequence */    skip_bits(&s->gb, 2); /* chroma_format */    horiz_size_ext = get_bits(&s->gb, 2);    vert_size_ext = get_bits(&s->gb, 2);    s->width |= (horiz_size_ext << 12);    s->height |= (vert_size_ext << 12);    bit_rate_ext = get_bits(&s->gb, 12);  /* XXX: handle it */    s->bit_rate = ((s->bit_rate / 400) | (bit_rate_ext << 12)) * 400;    skip_bits1(&s->gb); /* marker */    vbv_buf_ext = get_bits(&s->gb, 8);    low_delay = get_bits1(&s->gb);    frame_rate_ext_n = get_bits(&s->gb, 2);    frame_rate_ext_d = get_bits(&s->gb, 5);    if (frame_rate_ext_d >= 1)        s->frame_rate = (s->frame_rate * frame_rate_ext_n) / frame_rate_ext_d;    dprintf("sequence extension\n");    s->mpeg2 = 1;    s->avctx->sub_id = 2; /* indicates mpeg2 found */}static void mpeg_decode_quant_matrix_extension(MpegEncContext *s){    int i, v, j;    dprintf("matrix extension\n");    if (get_bits1(&s->gb)) {        for(i=0;i<64;i++) {            v = get_bits(&s->gb, 8);            j= s->idct_permutation[ ff_zigzag_direct[i] ];            s->intra_matrix[j] = v;            s->chroma_intra_matrix[j] = v;        }    }    if (get_bits1(&s->gb)) {        for(i=0;i<64;i++) {            v = get_bits(&s->gb, 8);            j= s->idct_permutation[ ff_zigzag_direct[i] ];            s->inter_matrix[j] = v;            s->chroma_inter_matrix[j] = v;        }    }    if (get_bits1(&s->gb)) {        for(i=0;i<64;i++) {            v = get_bits(&s->gb, 8);            j= s->idct_permutation[ ff_zigzag_direct[i] ];            s->chroma_intra_matrix[j] = v;        }    }    if (get_bits1(&s->gb)) {        for(i=0;i<64;i++) {            v = get_bits(&s->gb, 8);            j= s->idct_permutation[ ff_zigzag_direct[i] ];            s->chroma_inter_matrix[j] = v;        }    }}static void mpeg_decode_picture_coding_extension(MpegEncContext *s){    s->full_pel[0] = s->full_pel[1] = 0;    s->mpeg_f_code[0][0] = get_bits(&s->gb, 4);    s->mpeg_f_code[0][1] = get_bits(&s->gb, 4);    s->mpeg_f_code[1][0] = get_bits(&s->gb, 4);    s->mpeg_f_code[1][1] = get_bits(&s->gb, 4);    s->intra_dc_precision = get_bits(&s->gb, 2);    s->picture_structure = get_bits(&s->gb, 2);    s->top_field_first = get_bits1(&s->gb);    s->frame_pred_frame_dct = get_bits1(&s->gb);    s->concealment_motion_vectors = get_bits1(&s->gb);    s->q_scale_type = get_bits1(&s->gb);    s->intra_vlc_format = get_bits1(&s->gb);    s->alternate_scan = get_bits1(&s->gb);    s->repeat_first_field = get_bits1(&s->gb);    s->chroma_420_type = get_bits1(&s->gb);    s->progressive_frame = get_bits1(&s->gb);        if(s->alternate_scan){        ff_init_scantable(s, &s->inter_scantable  , ff_alternate_vertical_scan);        ff_init_scantable(s, &s->intra_scantable  , ff_alternate_vertical_scan);        ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_vertical_scan);        ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan);    }else{        ff_init_scantable(s, &s->inter_scantable  , ff_zigzag_direct);        ff_init_scantable(s, &s->intra_scantable  , ff_zigzag_direct);        ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_horizontal_scan);        ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan);    }        /* composite display not parsed */    dprintf("intra_dc_precision=%d\n", s->intra_dc_precision);    dprintf("picture_structure=%d\n", s->picture_structure);    dprintf("top field first=%d\n", s->top_field_first);    dprintf("repeat first field=%d\n", s->repeat_first_field);    dprintf("conceal=%d\n", s->concealment_motion_vectors);    dprintf("intra_vlc_format=%d\n", s->intra_vlc_format);    dprintf("alternate_scan=%d\n", s->alternate_scan);    dprintf("frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct);    dprintf("progressive_frame=%d\n", s->progressive_frame);}static void mpeg_decode_extension(AVCodecContext *avctx,                                   UINT8 *buf, int buf_size){    Mpeg1Context *s1 = avctx->priv_data;    MpegEncContext *s = &s1->mpeg_enc_ctx;    int ext_type;    init_get_bits(&s->gb, buf, buf_size);        ext_type = get_bits(&s->gb, 4);    switch(ext_type) {    case 0x1:        /* sequence ext */        mpeg_decode_sequence_extension(s);        break;    case 0x3:        /* quant matrix extension */        mpeg_decode_quant_matrix_extension(s);        break;    case 0x8:        /* picture extension */        mpeg_decode_picture_coding_extension(s);        break;    }}#define DECODE_SLICE_FATAL_ERROR -2#define DECODE_SLICE_ERROR -1#define DECODE_SLICE_OK 0#define DECODE_SLICE_EOP 1/** * decodes a slice. * @return DECODE_SLICE_FATAL_ERROR if a non recoverable error occured<br> *         DECODE_SLICE_ERROR if the slice is damaged<br> *         DECODE_SLICE_OK if this slice is ok<br> *         DECODE_SLICE_EOP if the end of the picture is reached */static int mpeg_decode_slice(AVCodecContext *avctx,                               AVPicture *pict,                              int start_code,                              UINT8 *buf, int buf_size){    Mpeg1Context *s1 = avctx->priv_data;    MpegEncContext *s = &s1->mpeg_enc_ctx;    int ret;    start_code = (start_code - 1) & 0xff;    if (start_code >= s->mb_height){

⌨️ 快捷键说明

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