44
44
COPY3_IF_LT(dmin, d, bx, hx, by, hy)\
48
static int hpel_motion_search)(MpegEncContext * s,
49
int *mx_ptr, int *my_ptr, int dmin,
53
const int xx = 16 * s->mb_x + 8*(n&1);
54
const int yy = 16 * s->mb_y + 8*(n>>1);
55
const int mx = *mx_ptr;
56
const int my = *my_ptr;
57
const int penalty_factor= c->sub_penalty_factor;
63
me_cmp_func cmp, chroma_cmp, cmp_sub, chroma_cmp_sub;
65
if(s->no_rounding /*FIXME b_type*/){
66
hpel_put= &s->dsp.put_no_rnd_pixels_tab[size];
67
chroma_hpel_put= &s->dsp.put_no_rnd_pixels_tab[size+1];
69
hpel_put=& s->dsp.put_pixels_tab[size];
70
chroma_hpel_put= &s->dsp.put_pixels_tab[size+1];
72
cmpf= s->dsp.me_cmp[size];
73
chroma_cmpf= s->dsp.me_cmp[size+1];
74
cmp_sub= s->dsp.me_sub_cmp[size];
75
chroma_cmp_sub= s->dsp.me_sub_cmp[size+1];
77
if(c->skip){ //FIXME somehow move up (benchmark)
83
if(c->avctx->me_cmp != c->avctx->me_sub_cmp){
84
CMP_HPEL(dmin, 0, 0, mx, my, size);
86
dmin += (mv_penalty[2*mx - pred_x] + mv_penalty[2*my - pred_y])*penalty_factor;
89
if (mx > xmin && mx < xmax &&
90
my > ymin && my < ymax) {
94
CHECK_HALF_MV(1, 1, mx-1, my-1)
95
CHECK_HALF_MV(0, 1, mx , my-1)
96
CHECK_HALF_MV(1, 1, mx , my-1)
97
CHECK_HALF_MV(1, 0, mx-1, my )
98
CHECK_HALF_MV(1, 0, mx , my )
99
CHECK_HALF_MV(1, 1, mx-1, my )
100
CHECK_HALF_MV(0, 1, mx , my )
101
CHECK_HALF_MV(1, 1, mx , my )
103
assert(bx >= xmin*2 || bx <= xmax*2 || by >= ymin*2 || by <= ymax*2);
116
47
static int hpel_motion_search(MpegEncContext * s,
117
48
int *mx_ptr, int *my_ptr, int dmin,
118
49
int src_index, int ref_index,
410
339
CHECK_QUARTER_MV(nx&3, ny&3, nx>>2, ny>>2)
414
const int tl= score_map[(index-(1<<ME_MAP_SHIFT)-1)&(ME_MAP_SIZE-1)];
415
const int bl= score_map[(index+(1<<ME_MAP_SHIFT)-1)&(ME_MAP_SIZE-1)];
416
const int tr= score_map[(index-(1<<ME_MAP_SHIFT)+1)&(ME_MAP_SIZE-1)];
417
const int br= score_map[(index+(1<<ME_MAP_SHIFT)+1)&(ME_MAP_SIZE-1)];
418
// if(l < r && l < t && l < b && l < tl && l < bl && l < tr && l < br && bl < tl){
421
// nx= FFMAX(4*mx - bx, bx - 4*mx);
422
// ny= FFMAX(4*my - by, by - 4*my);
424
static int stats[7][7], count;
426
stats[4*mx - bx + 3][4*my - by + 3]++;
427
if(256*256*256*64 % count ==0){
429
if((i%7)==0) printf("\n");
430
printf("%6d ", stats[0][i]);
438
CHECK_QUARTER_MV(2, 2, mx-1, my-1)
439
CHECK_QUARTER_MV(0, 2, mx , my-1)
440
CHECK_QUARTER_MV(2, 2, mx , my-1)
441
CHECK_QUARTER_MV(2, 0, mx , my )
442
CHECK_QUARTER_MV(2, 2, mx , my )
443
CHECK_QUARTER_MV(0, 2, mx , my )
444
CHECK_QUARTER_MV(2, 2, mx-1, my )
445
CHECK_QUARTER_MV(2, 0, mx-1, my )
451
int ox[8]= {0, 1, 1, 1, 0,-1,-1,-1};
452
int oy[8]= {1, 1, 0,-1,-1,-1, 0, 1};
453
CHECK_QUARTER_MV((nx + ox[i])&3, (ny + oy[i])&3, (nx + ox[i])>>2, (ny + oy[i])>>2)
458
CHECK_QUARTER_MV(1, 3, mx-1, my-1)
459
CHECK_QUARTER_MV(1, 2, mx-1, my-1)
460
CHECK_QUARTER_MV(1, 1, mx-1, my-1)
461
CHECK_QUARTER_MV(2, 1, mx-1, my-1)
462
CHECK_QUARTER_MV(3, 1, mx-1, my-1)
463
CHECK_QUARTER_MV(0, 1, mx , my-1)
464
CHECK_QUARTER_MV(1, 1, mx , my-1)
465
CHECK_QUARTER_MV(2, 1, mx , my-1)
466
CHECK_QUARTER_MV(3, 1, mx , my-1)
467
CHECK_QUARTER_MV(3, 2, mx , my-1)
468
CHECK_QUARTER_MV(3, 3, mx , my-1)
469
CHECK_QUARTER_MV(3, 0, mx , my )
470
CHECK_QUARTER_MV(3, 1, mx , my )
471
CHECK_QUARTER_MV(3, 2, mx , my )
472
CHECK_QUARTER_MV(3, 3, mx , my )
473
CHECK_QUARTER_MV(2, 3, mx , my )
474
CHECK_QUARTER_MV(1, 3, mx , my )
475
CHECK_QUARTER_MV(0, 3, mx , my )
476
CHECK_QUARTER_MV(3, 3, mx-1, my )
477
CHECK_QUARTER_MV(2, 3, mx-1, my )
478
CHECK_QUARTER_MV(1, 3, mx-1, my )
479
CHECK_QUARTER_MV(1, 2, mx-1, my )
480
CHECK_QUARTER_MV(1, 1, mx-1, my )
481
CHECK_QUARTER_MV(1, 0, mx-1, my )
483
342
assert(bx >= xmin*4 && bx <= xmax*4 && by >= ymin*4 && by <= ymax*4);
1001
860
int ref_mv_scale, int flags, int size, int h)
1003
862
MotionEstContext * const c= &s->me;
1004
int best[2]={0, 0}; /*!< x and y coordinates of the best motion vector.
863
int best[2]={0, 0}; /**< x and y coordinates of the best motion vector.
1005
864
i.e. the difference between the position of the
1006
865
block currently being encoded and the position of
1007
866
the block chosen to predict it from. */
1008
867
int d; ///< the score (cmp + penalty) of any given mv
1009
int dmin; /*!< the best value of d, i.e. the score
868
int dmin; /**< the best value of d, i.e. the score
1010
869
corresponding to the mv stored in best[]. */
870
unsigned map_generation;
1012
871
int penalty_factor;
1013
872
const int ref_mv_stride= s->mb_stride; //pass as arg FIXME
1014
873
const int ref_mv_xy= s->mb_x + s->mb_y*ref_mv_stride; //add to last_mv beforepassing FIXME