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

📄 cavs.c

📁 ffmpeg移植到symbian的全部源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    qpix_op[luma_xy](dest_y, src_y, h->l_stride); //FIXME try variable height perhaps?    if(!square){        qpix_op[luma_xy](dest_y + delta, src_y + delta, h->l_stride);    }    if(emu){        ff_emulated_edge_mc(s->edge_emu_buffer, src_cb, h->c_stride,                            9, 9/*FIXME*/, (mx>>3), (my>>3), pic_width>>1, pic_height>>1);        src_cb= s->edge_emu_buffer;    }    chroma_op(dest_cb, src_cb, h->c_stride, chroma_height, mx&7, my&7);    if(emu){        ff_emulated_edge_mc(s->edge_emu_buffer, src_cr, h->c_stride,                            9, 9/*FIXME*/, (mx>>3), (my>>3), pic_width>>1, pic_height>>1);        src_cr= s->edge_emu_buffer;    }    chroma_op(dest_cr, src_cr, h->c_stride, chroma_height, mx&7, my&7);}static inline void mc_part_std(AVSContext *h,int square,int chroma_height,int delta,                        uint8_t *dest_y,uint8_t *dest_cb,uint8_t *dest_cr,                        int x_offset, int y_offset,qpel_mc_func *qpix_put,                        h264_chroma_mc_func chroma_put,qpel_mc_func *qpix_avg,                        h264_chroma_mc_func chroma_avg, vector_t *mv){    qpel_mc_func *qpix_op=  qpix_put;    h264_chroma_mc_func chroma_op= chroma_put;    dest_y  += 2*x_offset + 2*y_offset*h->l_stride;    dest_cb +=   x_offset +   y_offset*h->c_stride;    dest_cr +=   x_offset +   y_offset*h->c_stride;    x_offset += 8*h->mbx;    y_offset += 8*h->mby;    if(mv->ref >= 0){        Picture *ref= &h->DPB[mv->ref];        mc_dir_part(h, ref, square, chroma_height, delta, 0,                    dest_y, dest_cb, dest_cr, x_offset, y_offset,                    qpix_op, chroma_op, mv);        qpix_op=  qpix_avg;        chroma_op= chroma_avg;    }    if((mv+MV_BWD_OFFS)->ref >= 0){        Picture *ref= &h->DPB[0];        mc_dir_part(h, ref, square, chroma_height, delta, 1,                    dest_y, dest_cb, dest_cr, x_offset, y_offset,                    qpix_op, chroma_op, mv+MV_BWD_OFFS);    }}void ff_cavs_inter(AVSContext *h, enum mb_t mb_type) {    if(ff_cavs_partition_flags[mb_type] == 0){ // 16x16        mc_part_std(h, 1, 8, 0, h->cy, h->cu, h->cv, 0, 0,                h->s.dsp.put_cavs_qpel_pixels_tab[0],                h->s.dsp.put_h264_chroma_pixels_tab[0],                h->s.dsp.avg_cavs_qpel_pixels_tab[0],                h->s.dsp.avg_h264_chroma_pixels_tab[0],&h->mv[MV_FWD_X0]);    }else{        mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 0, 0,                h->s.dsp.put_cavs_qpel_pixels_tab[1],                h->s.dsp.put_h264_chroma_pixels_tab[1],                h->s.dsp.avg_cavs_qpel_pixels_tab[1],                h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X0]);        mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 4, 0,                h->s.dsp.put_cavs_qpel_pixels_tab[1],                h->s.dsp.put_h264_chroma_pixels_tab[1],                h->s.dsp.avg_cavs_qpel_pixels_tab[1],                h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X1]);        mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 0, 4,                h->s.dsp.put_cavs_qpel_pixels_tab[1],                h->s.dsp.put_h264_chroma_pixels_tab[1],                h->s.dsp.avg_cavs_qpel_pixels_tab[1],                h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X2]);        mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 4, 4,                h->s.dsp.put_cavs_qpel_pixels_tab[1],                h->s.dsp.put_h264_chroma_pixels_tab[1],                h->s.dsp.avg_cavs_qpel_pixels_tab[1],                h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X3]);    }}/***************************************************************************** * * motion vector prediction * ****************************************************************************/static inline void scale_mv(AVSContext *h, int *d_x, int *d_y, vector_t *src, int distp) {    int den = h->scale_den[src->ref];    *d_x = (src->x*distp*den + 256 + (src->x>>31)) >> 9;    *d_y = (src->y*distp*den + 256 + (src->y>>31)) >> 9;}static inline void mv_pred_median(AVSContext *h, vector_t *mvP, vector_t *mvA, vector_t *mvB, vector_t *mvC) {    int ax, ay, bx, by, cx, cy;    int len_ab, len_bc, len_ca, len_mid;    /* scale candidates according to their temporal span */    scale_mv(h, &ax, &ay, mvA, mvP->dist);    scale_mv(h, &bx, &by, mvB, mvP->dist);    scale_mv(h, &cx, &cy, mvC, mvP->dist);    /* find the geometrical median of the three candidates */    len_ab = abs(ax - bx) + abs(ay - by);    len_bc = abs(bx - cx) + abs(by - cy);    len_ca = abs(cx - ax) + abs(cy - ay);    len_mid = mid_pred(len_ab, len_bc, len_ca);    if(len_mid == len_ab) {        mvP->x = cx;        mvP->y = cy;    } else if(len_mid == len_bc) {        mvP->x = ax;        mvP->y = ay;    } else {        mvP->x = bx;        mvP->y = by;    }}void ff_cavs_mv(AVSContext *h, enum mv_loc_t nP, enum mv_loc_t nC,                enum mv_pred_t mode, enum block_t size, int ref) {    vector_t *mvP = &h->mv[nP];    vector_t *mvA = &h->mv[nP-1];    vector_t *mvB = &h->mv[nP-4];    vector_t *mvC = &h->mv[nC];    const vector_t *mvP2 = NULL;    mvP->ref = ref;    mvP->dist = h->dist[mvP->ref];    if(mvC->ref == NOT_AVAIL)        mvC = &h->mv[nP-5]; // set to top-left (mvD)    if((mode == MV_PRED_PSKIP) &&       ((mvA->ref == NOT_AVAIL) || (mvB->ref == NOT_AVAIL) ||           ((mvA->x | mvA->y | mvA->ref) == 0)  ||           ((mvB->x | mvB->y | mvB->ref) == 0) )) {        mvP2 = &ff_cavs_un_mv;    /* if there is only one suitable candidate, take it */    } else if((mvA->ref >= 0) && (mvB->ref < 0) && (mvC->ref < 0)) {        mvP2= mvA;    } else if((mvA->ref < 0) && (mvB->ref >= 0) && (mvC->ref < 0)) {        mvP2= mvB;    } else if((mvA->ref < 0) && (mvB->ref < 0) && (mvC->ref >= 0)) {        mvP2= mvC;    } else if(mode == MV_PRED_LEFT     && mvA->ref == ref){        mvP2= mvA;    } else if(mode == MV_PRED_TOP      && mvB->ref == ref){        mvP2= mvB;    } else if(mode == MV_PRED_TOPRIGHT && mvC->ref == ref){        mvP2= mvC;    }    if(mvP2){        mvP->x = mvP2->x;        mvP->y = mvP2->y;    }else        mv_pred_median(h, mvP, mvA, mvB, mvC);    if(mode < MV_PRED_PSKIP) {        mvP->x += get_se_golomb(&h->s.gb);        mvP->y += get_se_golomb(&h->s.gb);    }    set_mvs(mvP,size);}/***************************************************************************** * * macroblock level * ****************************************************************************//** * initialise predictors for motion vectors and intra prediction */void ff_cavs_init_mb(AVSContext *h) {    int i;    /* copy predictors from top line (MB B and C) into cache */    for(i=0;i<3;i++) {        h->mv[MV_FWD_B2+i] = h->top_mv[0][h->mbx*2+i];        h->mv[MV_BWD_B2+i] = h->top_mv[1][h->mbx*2+i];    }    h->pred_mode_Y[1] = h->top_pred_Y[h->mbx*2+0];    h->pred_mode_Y[2] = h->top_pred_Y[h->mbx*2+1];    /* clear top predictors if MB B is not available */    if(!(h->flags & B_AVAIL)) {        h->mv[MV_FWD_B2] = ff_cavs_un_mv;        h->mv[MV_FWD_B3] = ff_cavs_un_mv;        h->mv[MV_BWD_B2] = ff_cavs_un_mv;        h->mv[MV_BWD_B3] = ff_cavs_un_mv;        h->pred_mode_Y[1] = h->pred_mode_Y[2] = NOT_AVAIL;        h->flags &= ~(C_AVAIL|D_AVAIL);    } else if(h->mbx) {        h->flags |= D_AVAIL;    }    if(h->mbx == h->mb_width-1) //MB C not available        h->flags &= ~C_AVAIL;    /* clear top-right predictors if MB C is not available */    if(!(h->flags & C_AVAIL)) {        h->mv[MV_FWD_C2] = ff_cavs_un_mv;        h->mv[MV_BWD_C2] = ff_cavs_un_mv;    }    /* clear top-left predictors if MB D is not available */    if(!(h->flags & D_AVAIL)) {        h->mv[MV_FWD_D3] = ff_cavs_un_mv;        h->mv[MV_BWD_D3] = ff_cavs_un_mv;    }    /* set pointer for co-located macroblock type */    h->col_type = &h->col_type_base[h->mby*h->mb_width + h->mbx];}/** * save predictors for later macroblocks and increase * macroblock address * @returns 0 if end of frame is reached, 1 otherwise */int ff_cavs_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] = ff_cavs_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;}/***************************************************************************** * * frame level * ****************************************************************************/void ff_cavs_init_pic(AVSContext *h) {    int i;    /* clear some predictors */    for(i=0;i<=20;i+=4)        h->mv[i] = ff_cavs_un_mv;    h->mv[MV_BWD_X0] = ff_cavs_dir_mv;    set_mvs(&h->mv[MV_BWD_X0], BLK_16X16);    h->mv[MV_FWD_X0] = ff_cavs_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;}/***************************************************************************** * * headers and interface * ****************************************************************************//** * some predictions require data from the top-neighbouring macroblock. * this data has to be stored for one complete row of macroblocks * and this storage space is allocated here */void ff_cavs_init_top_lines(AVSContext *h) {    /* alloc top line of predictors */    h->top_qp       = av_malloc( h->mb_width);    h->top_mv[0]    = av_malloc((h->mb_width*2+1)*sizeof(vector_t));    h->top_mv[1]    = av_malloc((h->mb_width*2+1)*sizeof(vector_t));    h->top_pred_Y   = av_malloc( h->mb_width*2*sizeof(*h->top_pred_Y));    h->top_border_y = av_malloc((h->mb_width+1)*16);    h->top_border_u = av_malloc((h->mb_width)*10);    h->top_border_v = av_malloc((h->mb_width)*10);    /* alloc space for co-located MVs and types */    h->col_mv       = av_malloc( h->mb_width*h->mb_height*4*sizeof(vector_t));    h->col_type_base = av_malloc(h->mb_width*h->mb_height);    h->block        = av_mallocz(64*sizeof(DCTELEM));}av_cold int ff_cavs_init(AVCodecContext *avctx) {    AVSContext *h = avctx->priv_data;    MpegEncContext * const s = &h->s;    MPV_decode_defaults(s);    s->avctx = avctx;    avctx->pix_fmt= PIX_FMT_YUV420P;    h->luma_scan[0] = 0;    h->luma_scan[1] = 8;    h->intra_pred_l[      INTRA_L_VERT] = intra_pred_vert;    h->intra_pred_l[     INTRA_L_HORIZ] = intra_pred_horiz;    h->intra_pred_l[        INTRA_L_LP] = intra_pred_lp;    h->intra_pred_l[ INTRA_L_DOWN_LEFT] = intra_pred_down_left;    h->intra_pred_l[INTRA_L_DOWN_RIGHT] = intra_pred_down_right;    h->intra_pred_l[   INTRA_L_LP_LEFT] = intra_pred_lp_left;    h->intra_pred_l[    INTRA_L_LP_TOP] = intra_pred_lp_top;    h->intra_pred_l[    INTRA_L_DC_128] = intra_pred_dc_128;    h->intra_pred_c[        INTRA_C_LP] = intra_pred_lp;    h->intra_pred_c[     INTRA_C_HORIZ] = intra_pred_horiz;    h->intra_pred_c[      INTRA_C_VERT] = intra_pred_vert;    h->intra_pred_c[     INTRA_C_PLANE] = intra_pred_plane;    h->intra_pred_c[   INTRA_C_LP_LEFT] = intra_pred_lp_left;    h->intra_pred_c[    INTRA_C_LP_TOP] = intra_pred_lp_top;    h->intra_pred_c[    INTRA_C_DC_128] = intra_pred_dc_128;    h->mv[ 7] = ff_cavs_un_mv;    h->mv[19] = ff_cavs_un_mv;    return 0;}av_cold int ff_cavs_end(AVCodecContext *avctx) {    AVSContext *h = avctx->priv_data;    av_free(h->top_qp);    av_free(h->top_mv[0]);    av_free(h->top_mv[1]);    av_free(h->top_pred_Y);    av_free(h->top_border_y);    av_free(h->top_border_u);    av_free(h->top_border_v);    av_free(h->col_mv);    av_free(h->col_type_base);    av_free(h->block);    return 0;}

⌨️ 快捷键说明

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