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

📄 motion_est.c

📁 ffmpeg移植到symbian的全部源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    *mx_ptr = 16 * s->mb_x;    *my_ptr = 16 * s->mb_y;}#define Z_THRESHOLD 256#define CHECK_SAD_HALF_MV(suffix, x, y) \{\    d= s->dsp.pix_abs[size][(x?1:0)+(y?2:0)](NULL, pix, ptr+((x)>>1), stride, h);\    d += (mv_penalty[pen_x + x] + mv_penalty[pen_y + y])*penalty_factor;\    COPY3_IF_LT(dminh, d, dx, x, dy, y)\}static inline int sad_hpel_motion_search(MpegEncContext * s,                                  int *mx_ptr, int *my_ptr, int dmin,                                  int src_index, int ref_index,                                  int size, int h){    MotionEstContext * const c= &s->me;    const int penalty_factor= c->sub_penalty_factor;    int mx, my, dminh;    uint8_t *pix, *ptr;    int stride= c->stride;    const int flags= c->sub_flags;    LOAD_COMMON    assert(flags == 0);    if(c->skip){//    printf("S");        *mx_ptr = 0;        *my_ptr = 0;        return dmin;    }//    printf("N");    pix = c->src[src_index][0];    mx = *mx_ptr;    my = *my_ptr;    ptr = c->ref[ref_index][0] + (my * stride) + mx;    dminh = dmin;    if (mx > xmin && mx < xmax &&        my > ymin && my < ymax) {        int dx=0, dy=0;        int d, pen_x, pen_y;        const int index= (my<<ME_MAP_SHIFT) + mx;        const int t= score_map[(index-(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)];        const int l= score_map[(index- 1               )&(ME_MAP_SIZE-1)];        const int r= score_map[(index+ 1               )&(ME_MAP_SIZE-1)];        const int b= score_map[(index+(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)];        mx<<=1;        my<<=1;        pen_x= pred_x + mx;        pen_y= pred_y + my;        ptr-= stride;        if(t<=b){            CHECK_SAD_HALF_MV(y2 , 0, -1)            if(l<=r){                CHECK_SAD_HALF_MV(xy2, -1, -1)                if(t+r<=b+l){                    CHECK_SAD_HALF_MV(xy2, +1, -1)                    ptr+= stride;                }else{                    ptr+= stride;                    CHECK_SAD_HALF_MV(xy2, -1, +1)                }                CHECK_SAD_HALF_MV(x2 , -1,  0)            }else{                CHECK_SAD_HALF_MV(xy2, +1, -1)                if(t+l<=b+r){                    CHECK_SAD_HALF_MV(xy2, -1, -1)                    ptr+= stride;                }else{                    ptr+= stride;                    CHECK_SAD_HALF_MV(xy2, +1, +1)                }                CHECK_SAD_HALF_MV(x2 , +1,  0)            }        }else{            if(l<=r){                if(t+l<=b+r){                    CHECK_SAD_HALF_MV(xy2, -1, -1)                    ptr+= stride;                }else{                    ptr+= stride;                    CHECK_SAD_HALF_MV(xy2, +1, +1)                }                CHECK_SAD_HALF_MV(x2 , -1,  0)                CHECK_SAD_HALF_MV(xy2, -1, +1)            }else{                if(t+r<=b+l){                    CHECK_SAD_HALF_MV(xy2, +1, -1)                    ptr+= stride;                }else{                    ptr+= stride;                    CHECK_SAD_HALF_MV(xy2, -1, +1)                }                CHECK_SAD_HALF_MV(x2 , +1,  0)                CHECK_SAD_HALF_MV(xy2, +1, +1)            }            CHECK_SAD_HALF_MV(y2 ,  0, +1)        }        mx+=dx;        my+=dy;    }else{        mx<<=1;        my<<=1;    }    *mx_ptr = mx;    *my_ptr = my;    return dminh;}static inline void set_p_mv_tables(MpegEncContext * s, int mx, int my, int mv4){    const int xy= s->mb_x + s->mb_y*s->mb_stride;    s->p_mv_table[xy][0] = mx;    s->p_mv_table[xy][1] = my;    /* has already been set to the 4 MV if 4MV is done */    if(mv4){        int mot_xy= s->block_index[0];        s->current_picture.motion_val[0][mot_xy  ][0]= mx;        s->current_picture.motion_val[0][mot_xy  ][1]= my;        s->current_picture.motion_val[0][mot_xy+1][0]= mx;        s->current_picture.motion_val[0][mot_xy+1][1]= my;        mot_xy += s->b8_stride;        s->current_picture.motion_val[0][mot_xy  ][0]= mx;        s->current_picture.motion_val[0][mot_xy  ][1]= my;        s->current_picture.motion_val[0][mot_xy+1][0]= mx;        s->current_picture.motion_val[0][mot_xy+1][1]= my;    }}/** * get fullpel ME search limits. */static inline void get_limits(MpegEncContext *s, int x, int y){    MotionEstContext * const c= &s->me;    int range= c->avctx->me_range >> (1 + !!(c->flags&FLAG_QPEL));/*    if(c->avctx->me_range) c->range= c->avctx->me_range >> 1;    else                   c->range= 16;*/    if (s->unrestricted_mv) {        c->xmin = - x - 16;        c->ymin = - y - 16;        c->xmax = - x + s->mb_width *16;        c->ymax = - y + s->mb_height*16;    } else if (s->out_format == FMT_H261){        // Search range of H261 is different from other codec standards        c->xmin = (x > 15) ? - 15 : 0;        c->ymin = (y > 15) ? - 15 : 0;        c->xmax = (x < s->mb_width * 16 - 16) ? 15 : 0;        c->ymax = (y < s->mb_height * 16 - 16) ? 15 : 0;    } else {        c->xmin = - x;        c->ymin = - y;        c->xmax = - x + s->mb_width *16 - 16;        c->ymax = - y + s->mb_height*16 - 16;    }    if(range){        c->xmin = FFMAX(c->xmin,-range);        c->xmax = FFMIN(c->xmax, range);        c->ymin = FFMAX(c->ymin,-range);        c->ymax = FFMIN(c->ymax, range);    }}static inline void init_mv4_ref(MotionEstContext *c){    const int stride= c->stride;    c->ref[1][0] = c->ref[0][0] + 8;    c->ref[2][0] = c->ref[0][0] + 8*stride;    c->ref[3][0] = c->ref[2][0] + 8;    c->src[1][0] = c->src[0][0] + 8;    c->src[2][0] = c->src[0][0] + 8*stride;    c->src[3][0] = c->src[2][0] + 8;}static inline int h263_mv4_search(MpegEncContext *s, int mx, int my, int shift){    MotionEstContext * const c= &s->me;    const int size= 1;    const int h=8;    int block;    int P[10][2];    int dmin_sum=0, mx4_sum=0, my4_sum=0;    int same=1;    const int stride= c->stride;    uint8_t *mv_penalty= c->current_mv_penalty;    init_mv4_ref(c);    for(block=0; block<4; block++){        int mx4, my4;        int pred_x4, pred_y4;        int dmin4;        static const int off[4]= {2, 1, 1, -1};        const int mot_stride = s->b8_stride;        const int mot_xy = s->block_index[block];        P_LEFT[0] = s->current_picture.motion_val[0][mot_xy - 1][0];        P_LEFT[1] = s->current_picture.motion_val[0][mot_xy - 1][1];        if(P_LEFT[0]       > (c->xmax<<shift)) P_LEFT[0]       = (c->xmax<<shift);        /* special case for first line */        if (s->first_slice_line && block<2) {            c->pred_x= pred_x4= P_LEFT[0];            c->pred_y= pred_y4= P_LEFT[1];        } else {            P_TOP[0]      = s->current_picture.motion_val[0][mot_xy - mot_stride             ][0];            P_TOP[1]      = s->current_picture.motion_val[0][mot_xy - mot_stride             ][1];            P_TOPRIGHT[0] = s->current_picture.motion_val[0][mot_xy - mot_stride + off[block]][0];            P_TOPRIGHT[1] = s->current_picture.motion_val[0][mot_xy - mot_stride + off[block]][1];            if(P_TOP[1]      > (c->ymax<<shift)) P_TOP[1]     = (c->ymax<<shift);            if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);            if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift);            if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);            P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]);            P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]);            c->pred_x= pred_x4 = P_MEDIAN[0];            c->pred_y= pred_y4 = P_MEDIAN[1];        }        P_MV1[0]= mx;        P_MV1[1]= my;        dmin4 = epzs_motion_search4(s, &mx4, &my4, P, block, block, s->p_mv_table, (1<<16)>>shift);        dmin4= c->sub_motion_search(s, &mx4, &my4, dmin4, block, block, size, h);        if(s->dsp.me_sub_cmp[0] != s->dsp.mb_cmp[0]){            int dxy;            const int offset= ((block&1) + (block>>1)*stride)*8;            uint8_t *dest_y = c->scratchpad + offset;            if(s->quarter_sample){                uint8_t *ref= c->ref[block][0] + (mx4>>2) + (my4>>2)*stride;                dxy = ((my4 & 3) << 2) | (mx4 & 3);                if(s->no_rounding)                    s->dsp.put_no_rnd_qpel_pixels_tab[1][dxy](dest_y   , ref    , stride);                else                    s->dsp.put_qpel_pixels_tab       [1][dxy](dest_y   , ref    , stride);            }else{                uint8_t *ref= c->ref[block][0] + (mx4>>1) + (my4>>1)*stride;                dxy = ((my4 & 1) << 1) | (mx4 & 1);                if(s->no_rounding)                    s->dsp.put_no_rnd_pixels_tab[1][dxy](dest_y    , ref    , stride, h);                else                    s->dsp.put_pixels_tab       [1][dxy](dest_y    , ref    , stride, h);            }            dmin_sum+= (mv_penalty[mx4-pred_x4] + mv_penalty[my4-pred_y4])*c->mb_penalty_factor;        }else            dmin_sum+= dmin4;        if(s->quarter_sample){            mx4_sum+= mx4/2;            my4_sum+= my4/2;        }else{            mx4_sum+= mx4;            my4_sum+= my4;        }        s->current_picture.motion_val[0][ s->block_index[block] ][0]= mx4;        s->current_picture.motion_val[0][ s->block_index[block] ][1]= my4;        if(mx4 != mx || my4 != my) same=0;    }    if(same)        return INT_MAX;    if(s->dsp.me_sub_cmp[0] != s->dsp.mb_cmp[0]){        dmin_sum += s->dsp.mb_cmp[0](s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*16*stride, c->scratchpad, stride, 16);    }    if(c->avctx->mb_cmp&FF_CMP_CHROMA){        int dxy;        int mx, my;        int offset;        mx= ff_h263_round_chroma(mx4_sum);        my= ff_h263_round_chroma(my4_sum);        dxy = ((my & 1) << 1) | (mx & 1);        offset= (s->mb_x*8 + (mx>>1)) + (s->mb_y*8 + (my>>1))*s->uvlinesize;        if(s->no_rounding){            s->dsp.put_no_rnd_pixels_tab[1][dxy](c->scratchpad    , s->last_picture.data[1] + offset, s->uvlinesize, 8);            s->dsp.put_no_rnd_pixels_tab[1][dxy](c->scratchpad+8  , s->last_picture.data[2] + offset, s->uvlinesize, 8);        }else{            s->dsp.put_pixels_tab       [1][dxy](c->scratchpad    , s->last_picture.data[1] + offset, s->uvlinesize, 8);            s->dsp.put_pixels_tab       [1][dxy](c->scratchpad+8  , s->last_picture.data[2] + offset, s->uvlinesize, 8);        }        dmin_sum += s->dsp.mb_cmp[1](s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*8*s->uvlinesize, c->scratchpad  , s->uvlinesize, 8);        dmin_sum += s->dsp.mb_cmp[1](s, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*8*s->uvlinesize, c->scratchpad+8, s->uvlinesize, 8);    }    c->pred_x= mx;    c->pred_y= my;    switch(c->avctx->mb_cmp&0xFF){    /*case FF_CMP_SSE:        return dmin_sum+ 32*s->qscale*s->qscale;*/    case FF_CMP_RD:        return dmin_sum;    default:        return dmin_sum+ 11*c->mb_penalty_factor;    }}static inline void init_interlaced_ref(MpegEncContext *s, int ref_index){    MotionEstContext * const c= &s->me;    c->ref[1+ref_index][0] = c->ref[0+ref_index][0] + s->linesize;    c->src[1][0] = c->src[0][0] + s->linesize;    if(c->flags & FLAG_CHROMA){        c->ref[1+ref_index][1] = c->ref[0+ref_index][1] + s->uvlinesize;        c->ref[1+ref_index][2] = c->ref[0+ref_index][2] + s->uvlinesize;        c->src[1][1] = c->src[0][1] + s->uvlinesize;        c->src[1][2] = c->src[0][2] + s->uvlinesize;    }}static int interlaced_search(MpegEncContext *s, int ref_index,                             int16_t (*mv_tables[2][2])[2], uint8_t *field_select_tables[2], int mx, int my, int user_field_select){    MotionEstContext * const c= &s->me;

⌨️ 快捷键说明

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