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

📄 mpegvideo.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 5 页
字号:
static inline void MPV_motion(MpegEncContext *s,                               UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,                              int dir, UINT8 **ref_picture,                               op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16]){    int dxy, offset, mx, my, src_x, src_y, motion_x, motion_y;    int mb_x, mb_y, i;    UINT8 *ptr, *dest;    int emu=0;    mb_x = s->mb_x;    mb_y = s->mb_y;    switch(s->mv_type) {    case MV_TYPE_16X16:        if(s->mcsel){            if(s->real_sprite_warping_points==1){                gmc1_motion(s, dest_y, dest_cb, dest_cr, 0,                            ref_picture, 0);            }else{                gmc_motion(s, dest_y, dest_cb, dest_cr, 0,                            ref_picture, 0);            }        }else if(s->quarter_sample){            qpel_motion(s, dest_y, dest_cb, dest_cr, 0,                        ref_picture, 0,                        0, pix_op, qpix_op,                        s->mv[dir][0][0], s->mv[dir][0][1], 16);        }else{            mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,                        ref_picture, 0,                        0, pix_op,                        s->mv[dir][0][0], s->mv[dir][0][1], 16);        }                   break;    case MV_TYPE_8X8:        mx = 0;        my = 0;        if(s->quarter_sample){            for(i=0;i<4;i++) {                motion_x = s->mv[dir][i][0];                motion_y = s->mv[dir][i][1];                dxy = ((motion_y & 3) << 2) | (motion_x & 3);                src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;                src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;                                    /* WARNING: do no forget half pels */                src_x = clip(src_x, -16, s->width);                if (src_x == s->width)                    dxy &= ~3;                src_y = clip(src_y, -16, s->height);                if (src_y == s->height)                    dxy &= ~12;                                    ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);                if(s->flags&CODEC_FLAG_EMU_EDGE){                    if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 8 > s->h_edge_pos                                          || src_y + (motion_y&3) + 8 > s->v_edge_pos){                        emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);                        ptr= s->edge_emu_buffer;                    }                }                dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;                qpix_op[1][dxy](dest, ptr, s->linesize);                mx += s->mv[dir][i][0]/2;                my += s->mv[dir][i][1]/2;            }        }else{            for(i=0;i<4;i++) {                motion_x = s->mv[dir][i][0];                motion_y = s->mv[dir][i][1];                dxy = ((motion_y & 1) << 1) | (motion_x & 1);                src_x = mb_x * 16 + (motion_x >> 1) + (i & 1) * 8;                src_y = mb_y * 16 + (motion_y >> 1) + (i >>1) * 8;                                    /* WARNING: do no forget half pels */                src_x = clip(src_x, -16, s->width);                if (src_x == s->width)                    dxy &= ~1;                src_y = clip(src_y, -16, s->height);                if (src_y == s->height)                    dxy &= ~2;                                    ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);                if(s->flags&CODEC_FLAG_EMU_EDGE){                    if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 8 > s->h_edge_pos                                          || src_y + (motion_y&1) + 8 > s->v_edge_pos){                        emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);                        ptr= s->edge_emu_buffer;                    }                }                dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;                pix_op[1][dxy](dest, ptr, s->linesize, 8);                mx += s->mv[dir][i][0];                my += s->mv[dir][i][1];            }        }        if(s->flags&CODEC_FLAG_GRAY) break;        /* In case of 8X8, we construct a single chroma motion vector           with a special rounding */        for(i=0;i<4;i++) {        }        if (mx >= 0)            mx = (h263_chroma_roundtab[mx & 0xf] + ((mx >> 3) & ~1));        else {            mx = -mx;            mx = -(h263_chroma_roundtab[mx & 0xf] + ((mx >> 3) & ~1));        }        if (my >= 0)            my = (h263_chroma_roundtab[my & 0xf] + ((my >> 3) & ~1));        else {            my = -my;            my = -(h263_chroma_roundtab[my & 0xf] + ((my >> 3) & ~1));        }        dxy = ((my & 1) << 1) | (mx & 1);        mx >>= 1;        my >>= 1;        src_x = mb_x * 8 + mx;        src_y = mb_y * 8 + my;        src_x = clip(src_x, -8, s->width/2);        if (src_x == s->width/2)            dxy &= ~1;        src_y = clip(src_y, -8, s->height/2);        if (src_y == s->height/2)            dxy &= ~2;                offset = (src_y * (s->uvlinesize)) + src_x;        ptr = ref_picture[1] + offset;        if(s->flags&CODEC_FLAG_EMU_EDGE){                if(src_x<0 || src_y<0 || src_x + (dxy &1) + 8 > s->h_edge_pos>>1                                      || src_y + (dxy>>1) + 8 > s->v_edge_pos>>1){                    emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);                    ptr= s->edge_emu_buffer;                    emu=1;                }            }        pix_op[1][dxy](dest_cb, ptr, s->uvlinesize, 8);        ptr = ref_picture[2] + offset;        if(emu){            emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);            ptr= s->edge_emu_buffer;        }        pix_op[1][dxy](dest_cr, ptr, s->uvlinesize, 8);        break;    case MV_TYPE_FIELD:        if (s->picture_structure == PICT_FRAME) {            if(s->quarter_sample){                /* top field */                qpel_motion(s, dest_y, dest_cb, dest_cr, 0,                            ref_picture, s->field_select[dir][0] ? s->linesize : 0,                            1, pix_op, qpix_op,                            s->mv[dir][0][0], s->mv[dir][0][1], 8);                /* bottom field */                qpel_motion(s, dest_y, dest_cb, dest_cr, s->linesize,                            ref_picture, s->field_select[dir][1] ? s->linesize : 0,                            1, pix_op, qpix_op,                            s->mv[dir][1][0], s->mv[dir][1][1], 8);            }else{                /* top field */                       mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,                            ref_picture, s->field_select[dir][0] ? s->linesize : 0,                            1, pix_op,                            s->mv[dir][0][0], s->mv[dir][0][1], 8);                /* bottom field */                mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,                            ref_picture, s->field_select[dir][1] ? s->linesize : 0,                            1, pix_op,                            s->mv[dir][1][0], s->mv[dir][1][1], 8);            }        } else {                    }        break;    }}/* put block[] to dest[] */static inline void put_dct(MpegEncContext *s,                            DCTELEM *block, int i, UINT8 *dest, int line_size){    s->dct_unquantize(s, block, i, s->qscale);    s->idct_put (dest, line_size, block);}/* add block[] to dest[] */static inline void add_dct(MpegEncContext *s,                            DCTELEM *block, int i, UINT8 *dest, int line_size){    if (s->block_last_index[i] >= 0) {        s->idct_add (dest, line_size, block);    }}static inline void add_dequant_dct(MpegEncContext *s,                            DCTELEM *block, int i, UINT8 *dest, int line_size){    if (s->block_last_index[i] >= 0) {        s->dct_unquantize(s, block, i, s->qscale);        s->idct_add (dest, line_size, block);    }}/** * cleans dc, ac, coded_block for the current non intra MB */void ff_clean_intra_table_entries(MpegEncContext *s){    int wrap = s->block_wrap[0];    int xy = s->block_index[0];        s->dc_val[0][xy           ] =     s->dc_val[0][xy + 1       ] =     s->dc_val[0][xy     + wrap] =    s->dc_val[0][xy + 1 + wrap] = 1024;    /* ac pred */    memset(s->ac_val[0][xy       ], 0, 32 * sizeof(INT16));    memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(INT16));    if (s->msmpeg4_version>=3) {        s->coded_block[xy           ] =        s->coded_block[xy + 1       ] =        s->coded_block[xy     + wrap] =        s->coded_block[xy + 1 + wrap] = 0;    }    /* chroma */    wrap = s->block_wrap[4];    xy = s->mb_x + 1 + (s->mb_y + 1) * wrap;    s->dc_val[1][xy] =    s->dc_val[2][xy] = 1024;    /* ac pred */    memset(s->ac_val[1][xy], 0, 16 * sizeof(INT16));    memset(s->ac_val[2][xy], 0, 16 * sizeof(INT16));        s->mbintra_table[s->mb_x + s->mb_y*s->mb_width]= 0;}/* generic function called after a macroblock has been parsed by the   decoder or after it has been encoded by the encoder.   Important variables used:   s->mb_intra : true if intra macroblock   s->mv_dir   : motion vector direction   s->mv_type  : motion vector type   s->mv       : motion vector   s->interlaced_dct : true if interlaced dct used (mpeg2) */void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]){    int mb_x, mb_y;    const int mb_xy = s->mb_y * s->mb_width + s->mb_x;    mb_x = s->mb_x;    mb_y = s->mb_y;    s->qscale_table[mb_xy]= s->qscale;    /* update DC predictors for P macroblocks */    if (!s->mb_intra) {        if (s->h263_pred || s->h263_aic) {            if(s->mbintra_table[mb_xy])                ff_clean_intra_table_entries(s);        } else {            s->last_dc[0] =            s->last_dc[1] =            s->last_dc[2] = 128 << s->intra_dc_precision;        }    }    else if (s->h263_pred || s->h263_aic)        s->mbintra_table[mb_xy]=1;    /* update motion predictor, not for B-frames as they need the motion_val from the last P/S-Frame */    if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE) { //FIXME move into h263.c if possible, format specific stuff shouldnt be here                const int wrap = s->block_wrap[0];        const int xy = s->block_index[0];        const int mb_index= s->mb_x + s->mb_y*s->mb_width;        if(s->mv_type == MV_TYPE_8X8){            s->co_located_type_table[mb_index]= CO_LOCATED_TYPE_4MV;        } else {            int motion_x, motion_y;            if (s->mb_intra) {                motion_x = 0;                motion_y = 0;                if(s->co_located_type_table)                    s->co_located_type_table[mb_index]= 0;            } else if (s->mv_type == MV_TYPE_16X16) {                motion_x = s->mv[0][0][0];                motion_y = s->mv[0][0][1];                if(s->co_located_type_table)                    s->co_located_type_table[mb_index]= 0;            } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {                int i;                motion_x = s->mv[0][0][0] + s->mv[0][1][0];                motion_y = s->mv[0][0][1] + s->mv[0][1][1];                motion_x = (motion_x>>1) | (motion_x&1);                for(i=0; i<2; i++){                    s->field_mv_table[mb_index][i][0]= s->mv[0][i][0];                    s->field_mv_table[mb_index][i][1]= s->mv[0][i][1];                    s->field_select_table[mb_index][i]= s->field_select[0][i];                }                s->co_located_type_table[mb_index]= CO_LOCATED_TYPE_FIELDMV;            }            /* no update if 8X8 because it has been done during parsing */            s->motion_val[xy][0] = motion_x;            s->motion_val[xy][1] = motion_y;            s->motion_val[xy + 1][0] = motion_x;            s->motion_val[xy + 1][1] = motion_y;            s->motion_val[xy + wrap][0] = motion_x;            s->motion_val[xy + wrap][1] = motion_y;            s->motion_val[xy + 1 + wrap][0] = motion_x;            s->motion_val[xy + 1 + wrap][1] = motion_y;        }    }        if (!(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) {        UINT8 *dest_y, *dest_cb, *dest_cr;        int dct_linesize, dct_offset;        op_pixels_func (*op_pix)[4];        qpel_mc_func (*op_qpix)[16];        /* avoid copy if macroblock skipped in last frame too            dont touch it for B-frames as they need the skip info from the next p-frame */        if (s->pict_type != B_TYPE) {            UINT8 *mbskip_ptr = &s->mbskip_table[mb_xy];            if (s->mb_skiped) {                s->mb_skiped = 0;                (*mbskip_ptr) ++; /* indicate that this time we skiped it */                if(*mbskip_ptr >99) *mbskip_ptr= 99;                /* if previous was skipped too, then nothing to do !                    skip only during decoding as we might trash the buffers during encoding a bit */                if (*mbskip_ptr >= s->ip_buffer_count  && !s->encoding)                     return;            } else {                *mbskip_ptr = 0; /* not skipped */            }        }        if(s->pict_type==B_TYPE && s->avctx->draw_horiz_band){            dest_y = s->current_picture [0] + mb_x * 16;            dest_cb = s->current_picture[1] + mb_x * 8;            dest_cr = s->current_picture[2] + mb_x * 8;        }else{            dest_y = s->current_picture [0] + (mb_y * 16* s->linesize  ) + mb_x * 16;            dest_cb = s->current_picture[1] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;            dest_cr = s->current_picture[2] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;        }        if (s->interlaced_dct) {            dct_linesize = s->linesize * 2;            dct_offset = s->linesize;        } else {            dct_linesize = s->linesize;            dct_offset = s->linesize * 8;        }        if (!s->mb_intra) {            /* motion handling */            /* decoding or more than one mb_type (MC was allready done otherwise) */            if((!s->

⌨️ 快捷键说明

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