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

📄 motion_est.c

📁 tcpmp播放器的flv插件
💻 C
📖 第 1 页 / 共 5 页
字号:
	*my_ptr < -(2 * range) || *my_ptr >= (2 * range)) {	fprintf(stderr, "error %d %d\n", *mx_ptr, *my_ptr);    }#endif    return dmin;}static int log_motion_search(MpegEncContext * s,                             int *mx_ptr, int *my_ptr, int range,                             int xmin, int ymin, int xmax, int ymax, uint8_t *ref_picture){    int x1, y1, x2, y2, xx, yy, x, y;    int mx, my, dmin, d;    uint8_t *pix;    xx = s->mb_x << 4;    yy = s->mb_y << 4;    /* Left limit */    x1 = xx - range;    if (x1 < xmin)	x1 = xmin;    /* Right limit */    x2 = xx + range;    if (x2 > xmax)	x2 = xmax;    /* Upper limit */    y1 = yy - range;    if (y1 < ymin)	y1 = ymin;    /* Lower limit */    y2 = yy + range;    if (y2 > ymax)	y2 = ymax;    pix = s->new_picture.data[0] + (yy * s->linesize) + xx;    dmin = 0x7fffffff;    mx = 0;    my = 0;    do {	for (y = y1; y <= y2; y += range) {	    for (x = x1; x <= x2; x += range) {		d = s->dsp.pix_abs[0][0](NULL, pix, ref_picture + (y * s->linesize) + x, s->linesize, 16);		if (d < dmin || (d == dmin && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) {		    dmin = d;		    mx = x;		    my = y;		}	    }	}	range = range >> 1;	x1 = mx - range;	if (x1 < xmin)	    x1 = xmin;	x2 = mx + range;	if (x2 > xmax)	    x2 = xmax;	y1 = my - range;	if (y1 < ymin)	    y1 = ymin;	y2 = my + range;	if (y2 > ymax)	    y2 = ymax;    } while (range >= 1);#ifdef DEBUG    av_log(s->avctx, AV_LOG_DEBUG, "log       - MX: %d\tMY: %d\n", mx, my);#endif    *mx_ptr = mx;    *my_ptr = my;    return dmin;}static int phods_motion_search(MpegEncContext * s,                               int *mx_ptr, int *my_ptr, int range,                               int xmin, int ymin, int xmax, int ymax, uint8_t *ref_picture){    int x1, y1, x2, y2, xx, yy, x, y, lastx, d;    int mx, my, dminx, dminy;    uint8_t *pix;    xx = s->mb_x << 4;    yy = s->mb_y << 4;    /* Left limit */    x1 = xx - range;    if (x1 < xmin)	x1 = xmin;    /* Right limit */    x2 = xx + range;    if (x2 > xmax)	x2 = xmax;    /* Upper limit */    y1 = yy - range;    if (y1 < ymin)	y1 = ymin;    /* Lower limit */    y2 = yy + range;    if (y2 > ymax)	y2 = ymax;    pix = s->new_picture.data[0] + (yy * s->linesize) + xx;    mx = 0;    my = 0;    x = xx;    y = yy;    do {        dminx = 0x7fffffff;        dminy = 0x7fffffff;	lastx = x;	for (x = x1; x <= x2; x += range) {	    d = s->dsp.pix_abs[0][0](NULL, pix, ref_picture + (y * s->linesize) + x, s->linesize, 16);	    if (d < dminx || (d == dminx && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) {		dminx = d;		mx = x;	    }	}	x = lastx;	for (y = y1; y <= y2; y += range) {	    d = s->dsp.pix_abs[0][0](NULL, pix, ref_picture + (y * s->linesize) + x, s->linesize, 16);	    if (d < dminy || (d == dminy && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) {		dminy = d;		my = y;	    }	}	range = range >> 1;	x = mx;	y = my;	x1 = mx - range;	if (x1 < xmin)	    x1 = xmin;	x2 = mx + range;	if (x2 > xmax)	    x2 = xmax;	y1 = my - range;	if (y1 < ymin)	    y1 = ymin;	y2 = my + range;	if (y2 > ymax)	    y2 = ymax;    } while (range >= 1);#ifdef DEBUG    av_log(s->avctx, AV_LOG_DEBUG, "phods     - MX: %d\tMY: %d\n", mx, my);#endif    /* half pixel search */    *mx_ptr = mx;    *my_ptr = my;    return dminy;}#endif /* 0 */#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;/*    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;    }}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;

⌨️ 快捷键说明

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