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

📄 cavs.c

📁 linux下的MPEG1
💻 C
📖 第 1 页 / 共 4 页
字号:
static inline void check_for_slice(AVSContext *h);/** * save predictors for later macroblocks and increase * macroblock address * @returns 0 if end of frame is reached, 1 otherwise */static inline int next_mb(AVSContext *h) {    int i;    h->flags |= A_AVAIL;    h->cy += 16;    h->cu += 8;    h->cv += 8;    /* copy mvs as predictors to the left */    for(i=0;i<=20;i+=4)        h->mv[i] = h->mv[i+2];    /* copy bottom mvs from cache to top line */    h->top_mv[0][h->mbx*2+0] = h->mv[MV_FWD_X2];    h->top_mv[0][h->mbx*2+1] = h->mv[MV_FWD_X3];    h->top_mv[1][h->mbx*2+0] = h->mv[MV_BWD_X2];    h->top_mv[1][h->mbx*2+1] = h->mv[MV_BWD_X3];    /* next MB address */    h->mbx++;    if(h->mbx == h->mb_width) { //new mb line        h->flags = B_AVAIL|C_AVAIL;        /* clear left pred_modes */        h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL;        /* clear left mv predictors */        for(i=0;i<=20;i+=4)            h->mv[i] = un_mv;        h->mbx = 0;        h->mby++;        /* re-calculate sample pointers */        h->cy = h->picture.data[0] + h->mby*16*h->l_stride;        h->cu = h->picture.data[1] + h->mby*8*h->c_stride;        h->cv = h->picture.data[2] + h->mby*8*h->c_stride;        if(h->mby == h->mb_height) { //frame end            return 0;        } else {            //check_for_slice(h);        }    }    return 1;}static int decode_mb_i(AVSContext *h, int cbp_code) {    GetBitContext *gb = &h->s.gb;    int block, pred_mode_uv;    uint8_t top[18];    uint8_t *left = NULL;    uint8_t *d;    init_mb(h);    /* get intra prediction modes from stream */    for(block=0;block<4;block++) {        int nA,nB,predpred;        int pos = scan3x3[block];        nA = h->pred_mode_Y[pos-1];        nB = h->pred_mode_Y[pos-3];        predpred = FFMIN(nA,nB);        if(predpred == NOT_AVAIL) // if either is not available            predpred = INTRA_L_LP;        if(!get_bits1(gb)){            int rem_mode= get_bits(gb, 2);            predpred = rem_mode + (rem_mode >= predpred);        }        h->pred_mode_Y[pos] = predpred;    }    pred_mode_uv = get_ue_golomb(gb);    if(pred_mode_uv > 6) {        av_log(h->s.avctx, AV_LOG_ERROR, "illegal intra chroma pred mode\n");        return -1;    }    /* save pred modes before they get modified */    h->pred_mode_Y[3] =  h->pred_mode_Y[5];    h->pred_mode_Y[6] =  h->pred_mode_Y[8];    h->top_pred_Y[h->mbx*2+0] = h->pred_mode_Y[7];    h->top_pred_Y[h->mbx*2+1] = h->pred_mode_Y[8];    /* modify pred modes according to availability of neighbour samples */    if(!(h->flags & A_AVAIL)) {        modify_pred(left_modifier_l, &h->pred_mode_Y[4] );        modify_pred(left_modifier_l, &h->pred_mode_Y[7] );        modify_pred(left_modifier_c, &pred_mode_uv );    }    if(!(h->flags & B_AVAIL)) {        modify_pred(top_modifier_l, &h->pred_mode_Y[4] );        modify_pred(top_modifier_l, &h->pred_mode_Y[5] );        modify_pred(top_modifier_c, &pred_mode_uv );    }    /* get coded block pattern */    if(h->pic_type == FF_I_TYPE)        cbp_code = get_ue_golomb(gb);    if(cbp_code > 63){        av_log(h->s.avctx, AV_LOG_ERROR, "illegal intra cbp\n");        return -1;    }    h->cbp = cbp_tab[cbp_code][0];    if(h->cbp && !h->qp_fixed)        h->qp = (h->qp + get_se_golomb(gb)) & 63; //qp_delta    /* luma intra prediction interleaved with residual decode/transform/add */    for(block=0;block<4;block++) {        d = h->cy + h->luma_scan[block];        load_intra_pred_luma(h, top, &left, block);        h->intra_pred_l[h->pred_mode_Y[scan3x3[block]]]            (d, top, left, h->l_stride);        if(h->cbp & (1<<block))            decode_residual_block(h,gb,intra_2dvlc,1,h->qp,d,h->l_stride);    }    /* chroma intra prediction */    /* extend borders by one pixel */    h->left_border_u[9] = h->left_border_u[8];    h->left_border_v[9] = h->left_border_v[8];    h->top_border_u[h->mbx*10+9] = h->top_border_u[h->mbx*10+8];    h->top_border_v[h->mbx*10+9] = h->top_border_v[h->mbx*10+8];    if(h->mbx && h->mby) {        h->top_border_u[h->mbx*10] = h->left_border_u[0] = h->topleft_border_u;        h->top_border_v[h->mbx*10] = h->left_border_v[0] = h->topleft_border_v;    } else {        h->left_border_u[0] = h->left_border_u[1];        h->left_border_v[0] = h->left_border_v[1];        h->top_border_u[h->mbx*10] = h->top_border_u[h->mbx*10+1];        h->top_border_v[h->mbx*10] = h->top_border_v[h->mbx*10+1];    }    h->intra_pred_c[pred_mode_uv](h->cu, &h->top_border_u[h->mbx*10],                                  h->left_border_u, h->c_stride);    h->intra_pred_c[pred_mode_uv](h->cv, &h->top_border_v[h->mbx*10],                                  h->left_border_v, h->c_stride);    decode_residual_chroma(h);    filter_mb(h,I_8X8);    /* mark motion vectors as intra */    h->mv[MV_FWD_X0] = intra_mv;    set_mvs(&h->mv[MV_FWD_X0], BLK_16X16);    h->mv[MV_BWD_X0] = intra_mv;    set_mvs(&h->mv[MV_BWD_X0], BLK_16X16);    if(h->pic_type != FF_B_TYPE)        *h->col_type = I_8X8;    return 0;}static void decode_mb_p(AVSContext *h, enum mb_t mb_type) {    GetBitContext *gb = &h->s.gb;    int ref[4];    init_mb(h);    switch(mb_type) {    case P_SKIP:        mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_PSKIP, BLK_16X16, 0);        break;    case P_16X16:        ref[0] = h->ref_flag ? 0 : get_bits1(gb);        mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN,   BLK_16X16,ref[0]);        break;    case P_16X8:        ref[0] = h->ref_flag ? 0 : get_bits1(gb);        ref[2] = h->ref_flag ? 0 : get_bits1(gb);        mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP,      BLK_16X8, ref[0]);        mv_pred(h, MV_FWD_X2, MV_FWD_A1, MV_PRED_LEFT,     BLK_16X8, ref[2]);        break;    case P_8X16:        ref[0] = h->ref_flag ? 0 : get_bits1(gb);        ref[1] = h->ref_flag ? 0 : get_bits1(gb);        mv_pred(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_LEFT,     BLK_8X16, ref[0]);        mv_pred(h, MV_FWD_X1, MV_FWD_C2, MV_PRED_TOPRIGHT, BLK_8X16, ref[1]);        break;    case P_8X8:        ref[0] = h->ref_flag ? 0 : get_bits1(gb);        ref[1] = h->ref_flag ? 0 : get_bits1(gb);        ref[2] = h->ref_flag ? 0 : get_bits1(gb);        ref[3] = h->ref_flag ? 0 : get_bits1(gb);        mv_pred(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_MEDIAN,   BLK_8X8, ref[0]);        mv_pred(h, MV_FWD_X1, MV_FWD_C2, MV_PRED_MEDIAN,   BLK_8X8, ref[1]);        mv_pred(h, MV_FWD_X2, MV_FWD_X1, MV_PRED_MEDIAN,   BLK_8X8, ref[2]);        mv_pred(h, MV_FWD_X3, MV_FWD_X0, MV_PRED_MEDIAN,   BLK_8X8, ref[3]);    }    inter_pred(h, mb_type);    store_mvs(h);    if(mb_type != P_SKIP)        decode_residual_inter(h);    filter_mb(h,mb_type);    *h->col_type = mb_type;}static void decode_mb_b(AVSContext *h, enum mb_t mb_type) {    int block;    enum sub_mb_t sub_type[4];    int flags;    init_mb(h);    /* reset all MVs */    h->mv[MV_FWD_X0] = dir_mv;    set_mvs(&h->mv[MV_FWD_X0], BLK_16X16);    h->mv[MV_BWD_X0] = dir_mv;    set_mvs(&h->mv[MV_BWD_X0], BLK_16X16);    switch(mb_type) {    case B_SKIP:    case B_DIRECT:        if(!(*h->col_type)) {            /* intra MB at co-location, do in-plane prediction */            mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_BSKIP, BLK_16X16, 1);            mv_pred(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_BSKIP, BLK_16X16, 0);        } else            /* direct prediction from co-located P MB, block-wise */            for(block=0;block<4;block++)                mv_pred_direct(h,&h->mv[mv_scan[block]],                            &h->col_mv[(h->mby*h->mb_width+h->mbx)*4 + block]);        break;    case B_FWD_16X16:        mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16, 1);        break;    case B_SYM_16X16:        mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16, 1);        mv_pred_sym(h, &h->mv[MV_FWD_X0], BLK_16X16);        break;    case B_BWD_16X16:        mv_pred(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_MEDIAN, BLK_16X16, 0);        break;    case B_8X8:        for(block=0;block<4;block++)            sub_type[block] = get_bits(&h->s.gb,2);        for(block=0;block<4;block++) {            switch(sub_type[block]) {            case B_SUB_DIRECT:                if(!(*h->col_type)) {                    /* intra MB at co-location, do in-plane prediction */                    mv_pred(h, mv_scan[block], mv_scan[block]-3,                            MV_PRED_BSKIP, BLK_8X8, 1);                    mv_pred(h, mv_scan[block]+MV_BWD_OFFS,                            mv_scan[block]-3+MV_BWD_OFFS,                            MV_PRED_BSKIP, BLK_8X8, 0);                } else                    mv_pred_direct(h,&h->mv[mv_scan[block]],                                   &h->col_mv[(h->mby*h->mb_width + h->mbx)*4 + block]);                break;            case B_SUB_FWD:                mv_pred(h, mv_scan[block], mv_scan[block]-3,                        MV_PRED_MEDIAN, BLK_8X8, 1);                break;            case B_SUB_SYM:                mv_pred(h, mv_scan[block], mv_scan[block]-3,                        MV_PRED_MEDIAN, BLK_8X8, 1);                mv_pred_sym(h, &h->mv[mv_scan[block]], BLK_8X8);                break;            }        }        for(block=0;block<4;block++) {            if(sub_type[block] == B_SUB_BWD)                mv_pred(h, mv_scan[block]+MV_BWD_OFFS,                        mv_scan[block]+MV_BWD_OFFS-3,                        MV_PRED_MEDIAN, BLK_8X8, 0);        }        break;    default:        assert((mb_type > B_SYM_16X16) && (mb_type < B_8X8));        flags = partition_flags[mb_type];        if(mb_type & 1) { /* 16x8 macroblock types */            if(flags & FWD0)                mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP,  BLK_16X8, 1);            if(flags & SYM0)                mv_pred_sym(h, &h->mv[MV_FWD_X0], BLK_16X8);            if(flags & FWD1)                mv_pred(h, MV_FWD_X2, MV_FWD_A1, MV_PRED_LEFT, BLK_16X8, 1);            if(flags & SYM1)                mv_pred_sym(h, &h->mv[MV_FWD_X2], BLK_16X8);            if(flags & BWD0)                mv_pred(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_TOP,  BLK_16X8, 0);            if(flags & BWD1)                mv_pred(h, MV_BWD_X2, MV_BWD_A1, MV_PRED_LEFT, BLK_16X8, 0);        } else {          /* 8x16 macroblock types */            if(flags & FWD0)                mv_pred(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_LEFT, BLK_8X16, 1);            if(flags & SYM0)                mv_pred_sym(h, &h->mv[MV_FWD_X0], BLK_8X16);            if(flags & FWD1)                mv_pred(h, MV_FWD_X1, MV_FWD_C2, MV_PRED_TOPRIGHT,BLK_8X16, 1);            if(flags & SYM1)                mv_pred_sym(h, &h->mv[MV_FWD_X1], BLK_8X16);            if(flags & BWD0)                mv_pred(h, MV_BWD_X0, MV_BWD_B3, MV_PRED_LEFT, BLK_8X16, 0);            if(flags & BWD1)                mv_pred(h, MV_BWD_X1, MV_BWD_C2, MV_PRED_TOPRIGHT,BLK_8X16, 0);        }    }    inter_pred(h, mb_type);    if(mb_type != B_SKIP)        decode_residual_inter(h);    filter_mb(h,mb_type);}/***************************************************************************** * * slice level * ****************************************************************************/static inline int decode_slice_header(AVSContext *h, GetBitContext *gb) {    if(h->stc > 0xAF)        av_log(h->s.avctx, AV_LOG_ERROR, "unexpected start code 0x%02x\n", h->stc);    h->mby = h->stc;    if((h->mby == 0) && (!h->qp_fixed)){        h->qp_fixed = get_bits1(gb);        h->qp = get_bits(gb,6);    }    /* inter frame or second slice can have weighting params */    if((h->pic_type != FF_I_TYPE) || (!h->pic_structure && h->mby >= h->mb_width/2))        if(get_bits1(gb)) { //slice_weighting_flag            av_log(h->s.avctx, AV_LOG_ERROR,                   "weighted prediction not yet supported\n");        }    return 0;}static inline void check_for_slice(AVSContext *h) {    GetBitContext *gb = &h->s.gb;    int align;    align = (-get_bits_count(gb)) & 7;    if((show_bits_long(gb,24+align) & 0xFFFFFF) == 0x000001) {        get_bits_long(gb,24+align);        h->stc = get_bits(gb,8);        decode_slice_header(h,gb);    }}/***************************************************************************** * * frame level * ****************************************************************************/static void init_pic(AVSContext *h) {    int i;    /* clear some predictors */    for(i=0;i<=20;i+=4)        h->mv[i] = un_mv;    h->mv[MV_BWD_X0] = dir_mv;    set_mvs(&h->mv[MV_BWD_X0], BLK_16X16);    h->mv[MV_FWD_X0] = dir_mv;    set_mvs(&h->mv[MV_FWD_X0], BLK_16X16);    h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL;    h->cy = h->picture.data[0];    h->cu = h->picture.data[1];    h->cv = h->picture.data[2];    h->l_stride = h->picture.linesize[0];    h->c_stride = h->picture.linesize[1];    h->luma_scan[2] = 8*h->l_stride;    h->luma_scan[3] = 8*h->l_stride+8;    h->mbx = h->mby = 0;    h->flags = 0;}static int decode_pic(AVSContext *h) {    MpegEncContext *s = &h->s;    int skip_count;    enum mb_t mb_type;    if (!s->context_initialized) {        s->avctx->idct_algo = FF_IDCT_CAVS;        if (MPV_common_init(s) < 0)            return -1;        ff_init_scantable(s->dsp.idct_permutation,&h->scantable,ff_zigzag_direct);    }    get_bits(&s->gb,16);//bbv_dwlay    if(h->stc == PIC_PB_START_CODE) {        h->pic_type = get_bits(&s->gb,2) + FF_I_TYPE;        if(h->pic_type > FF_B_TYPE) {            av_log(s->avctx, AV_LOG_ERROR, "illegal picture type\n");            return -1;        }        /* make sure we have the reference frames we need */        if(!h->DPB[0].data[0] ||          (!h->DPB[1].data[0] && h->pic_type == FF_B_TYPE))            return -1;    } else {

⌨️ 快捷键说明

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