comparison motion_est.c @ 853:eacc2dd8fd9d libavcodec

* using DSPContext - so each codec could use its local (sub)set of CPU extension
author kabi
date Mon, 11 Nov 2002 09:40:17 +0000
parents f3c369b8ddca
children 4ba00af12589
comparison
equal deleted inserted replaced
852:c01c98206ee6 853:eacc2dd8fd9d
86 pix2 += line_size - 16; 86 pix2 += line_size - 16;
87 } 87 }
88 return s; 88 return s;
89 } 89 }
90 90
91 static void no_motion_search(MpegEncContext * s, 91 static inline void no_motion_search(MpegEncContext * s,
92 int *mx_ptr, int *my_ptr) 92 int *mx_ptr, int *my_ptr)
93 { 93 {
94 *mx_ptr = 16 * s->mb_x; 94 *mx_ptr = 16 * s->mb_x;
95 *my_ptr = 16 * s->mb_y; 95 *my_ptr = 16 * s->mb_y;
96 } 96 }
97 97
121 dmin = 0x7fffffff; 121 dmin = 0x7fffffff;
122 mx = 0; 122 mx = 0;
123 my = 0; 123 my = 0;
124 for (y = y1; y <= y2; y++) { 124 for (y = y1; y <= y2; y++) {
125 for (x = x1; x <= x2; x++) { 125 for (x = x1; x <= x2; x++) {
126 d = pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, 126 d = s->dsp.pix_abs16x16(pix, ref_picture + (y * s->linesize) + x,
127 s->linesize); 127 s->linesize);
128 if (d < dmin || 128 if (d < dmin ||
129 (d == dmin && 129 (d == dmin &&
130 (abs(x - xx) + abs(y - yy)) < 130 (abs(x - xx) + abs(y - yy)) <
131 (abs(mx - xx) + abs(my - yy)))) { 131 (abs(mx - xx) + abs(my - yy)))) {
186 my = 0; 186 my = 0;
187 187
188 do { 188 do {
189 for (y = y1; y <= y2; y += range) { 189 for (y = y1; y <= y2; y += range) {
190 for (x = x1; x <= x2; x += range) { 190 for (x = x1; x <= x2; x += range) {
191 d = pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, s->linesize); 191 d = s->dsp.pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, s->linesize);
192 if (d < dmin || (d == dmin && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) { 192 if (d < dmin || (d == dmin && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) {
193 dmin = d; 193 dmin = d;
194 mx = x; 194 mx = x;
195 my = y; 195 my = y;
196 } 196 }
266 dminx = 0x7fffffff; 266 dminx = 0x7fffffff;
267 dminy = 0x7fffffff; 267 dminy = 0x7fffffff;
268 268
269 lastx = x; 269 lastx = x;
270 for (x = x1; x <= x2; x += range) { 270 for (x = x1; x <= x2; x += range) {
271 d = pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, s->linesize); 271 d = s->dsp.pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, s->linesize);
272 if (d < dminx || (d == dminx && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) { 272 if (d < dminx || (d == dminx && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) {
273 dminx = d; 273 dminx = d;
274 mx = x; 274 mx = x;
275 } 275 }
276 } 276 }
277 277
278 x = lastx; 278 x = lastx;
279 for (y = y1; y <= y2; y += range) { 279 for (y = y1; y <= y2; y += range) {
280 d = pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, s->linesize); 280 d = s->dsp.pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, s->linesize);
281 if (d < dminy || (d == dminy && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) { 281 if (d < dminy || (d == dminy && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) {
282 dminy = d; 282 dminy = d;
283 my = y; 283 my = y;
284 } 284 }
285 } 285 }
322 #define CHECK_MV(x,y)\ 322 #define CHECK_MV(x,y)\
323 {\ 323 {\
324 const int key= ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\ 324 const int key= ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\
325 const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1);\ 325 const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1);\
326 if(map[index]!=key){\ 326 if(map[index]!=key){\
327 d = pix_abs16x16(new_pic, old_pic + (x) + (y)*pic_stride, pic_stride);\ 327 d = s->dsp.pix_abs16x16(new_pic, old_pic + (x) + (y)*pic_stride, pic_stride);\
328 d += (mv_penalty[((x)<<shift)-pred_x] + mv_penalty[((y)<<shift)-pred_y])*quant;\ 328 d += (mv_penalty[((x)<<shift)-pred_x] + mv_penalty[((y)<<shift)-pred_y])*quant;\
329 COPY3_IF_LT(dmin, d, best[0], x, best[1], y)\ 329 COPY3_IF_LT(dmin, d, best[0], x, best[1], y)\
330 map[index]= key;\ 330 map[index]= key;\
331 score_map[index]= d;\ 331 score_map[index]= d;\
332 }\ 332 }\
353 #define CHECK_MV4(x,y)\ 353 #define CHECK_MV4(x,y)\
354 {\ 354 {\
355 const int key= ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\ 355 const int key= ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\
356 const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1);\ 356 const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1);\
357 if(map[index]!=key){\ 357 if(map[index]!=key){\
358 d = pix_abs8x8(new_pic, old_pic + (x) + (y)*pic_stride, pic_stride);\ 358 d = s->dsp.pix_abs8x8(new_pic, old_pic + (x) + (y)*pic_stride, pic_stride);\
359 d += (mv_penalty[((x)<<shift)-pred_x] + mv_penalty[((y)<<shift)-pred_y])*quant;\ 359 d += (mv_penalty[((x)<<shift)-pred_x] + mv_penalty[((y)<<shift)-pred_y])*quant;\
360 COPY3_IF_LT(dmin, d, best[0], x, best[1], y)\ 360 COPY3_IF_LT(dmin, d, best[0], x, best[1], y)\
361 map[index]= key;\ 361 map[index]= key;\
362 score_map[index]= d;\ 362 score_map[index]= d;\
363 }\ 363 }\
588 new_pic = s->new_picture[0] + pic_xy; 588 new_pic = s->new_picture[0] + pic_xy;
589 old_pic = ref_picture + pic_xy; 589 old_pic = ref_picture + pic_xy;
590 590
591 map_generation= update_map_generation(s); 591 map_generation= update_map_generation(s);
592 592
593 dmin = pix_abs16x16(new_pic, old_pic, pic_stride); 593 dmin = s->dsp.pix_abs16x16(new_pic, old_pic, pic_stride);
594 map[0]= map_generation; 594 map[0]= map_generation;
595 score_map[0]= dmin; 595 score_map[0]= dmin;
596 596
597 /* first line */ 597 /* first line */
598 if ((s->mb_y == 0 || s->first_slice_line)) { 598 if ((s->mb_y == 0 || s->first_slice_line)) {
642 #endif 642 #endif
643 //check(best[0],best[1],0, b0) 643 //check(best[0],best[1],0, b0)
644 if(s->me_method==ME_EPZS) 644 if(s->me_method==ME_EPZS)
645 dmin= small_diamond_search(s, best, dmin, new_pic, old_pic, pic_stride, 645 dmin= small_diamond_search(s, best, dmin, new_pic, old_pic, pic_stride,
646 pred_x, pred_y, mv_penalty, quant, xmin, ymin, xmax, ymax, 646 pred_x, pred_y, mv_penalty, quant, xmin, ymin, xmax, ymax,
647 shift, map, score_map, map_generation, pix_abs16x16); 647 shift, map, score_map, map_generation, s->dsp.pix_abs16x16);
648 else 648 else
649 dmin= cross_search(s, best, dmin, new_pic, old_pic, pic_stride, 649 dmin= cross_search(s, best, dmin, new_pic, old_pic, pic_stride,
650 pred_x, pred_y, mv_penalty, quant, xmin, ymin, xmax, ymax, 650 pred_x, pred_y, mv_penalty, quant, xmin, ymin, xmax, ymax,
651 shift, map, score_map, map_generation, pix_abs16x16); 651 shift, map, score_map, map_generation, s->dsp.pix_abs16x16);
652 //check(best[0],best[1],0, b1) 652 //check(best[0],best[1],0, b1)
653 *mx_ptr= best[0]; 653 *mx_ptr= best[0];
654 *my_ptr= best[1]; 654 *my_ptr= best[1];
655 655
656 // printf("%d %d %d \n", best[0], best[1], dmin); 656 // printf("%d %d %d \n", best[0], best[1], dmin);
681 681
682 dmin = 1000000; 682 dmin = 1000000;
683 //printf("%d %d %d %d //",xmin, ymin, xmax, ymax); 683 //printf("%d %d %d %d //",xmin, ymin, xmax, ymax);
684 /* first line */ 684 /* first line */
685 if ((s->mb_y == 0 || s->first_slice_line) && block<2) { 685 if ((s->mb_y == 0 || s->first_slice_line) && block<2) {
686 CHECK_MV4(P_LEFT[0]>>shift, P_LEFT[1]>>shift) 686 CHECK_MV4(P_LEFT[0]>>shift, P_LEFT[1]>>shift)
687 CHECK_MV4(P_LAST[0]>>shift, P_LAST[1]>>shift) 687 CHECK_MV4(P_LAST[0]>>shift, P_LAST[1]>>shift)
688 CHECK_MV4(P_MV1[0]>>shift, P_MV1[1]>>shift) 688 CHECK_MV4(P_MV1[0]>>shift, P_MV1[1]>>shift)
689 }else{ 689 }else{
690 CHECK_MV4(P_MV1[0]>>shift, P_MV1[1]>>shift) 690 CHECK_MV4(P_MV1[0]>>shift, P_MV1[1]>>shift)
691 //FIXME try some early stop 691 //FIXME try some early stop
703 } 703 }
704 704
705 if(s->me_method==ME_EPZS) 705 if(s->me_method==ME_EPZS)
706 dmin= small_diamond_search(s, best, dmin, new_pic, old_pic, pic_stride, 706 dmin= small_diamond_search(s, best, dmin, new_pic, old_pic, pic_stride,
707 pred_x, pred_y, mv_penalty, quant, xmin, ymin, xmax, ymax, 707 pred_x, pred_y, mv_penalty, quant, xmin, ymin, xmax, ymax,
708 shift, map, score_map, map_generation, pix_abs8x8); 708 shift, map, score_map, map_generation, s->dsp.pix_abs8x8);
709 else 709 else
710 dmin= cross_search(s, best, dmin, new_pic, old_pic, pic_stride, 710 dmin= cross_search(s, best, dmin, new_pic, old_pic, pic_stride,
711 pred_x, pred_y, mv_penalty, quant, xmin, ymin, xmax, ymax, 711 pred_x, pred_y, mv_penalty, quant, xmin, ymin, xmax, ymax,
712 shift, map, score_map, map_generation, pix_abs8x8); 712 shift, map, score_map, map_generation, s->dsp.pix_abs8x8);
713 713
714 *mx_ptr= best[0]; 714 *mx_ptr= best[0];
715 *my_ptr= best[1]; 715 *my_ptr= best[1];
716 716
717 // printf("%d %d %d \n", best[0], best[1], dmin); 717 // printf("%d %d %d \n", best[0], best[1], dmin);
1021 P_MV1[1]= my; 1021 P_MV1[1]= my;
1022 1022
1023 dmin4 = epzs_motion_search4(s, block, &mx4, &my4, P, pred_x4, pred_y4, rel_xmin4, rel_ymin4, rel_xmax4, rel_ymax4, ref_picture); 1023 dmin4 = epzs_motion_search4(s, block, &mx4, &my4, P, pred_x4, pred_y4, rel_xmin4, rel_ymin4, rel_xmax4, rel_ymax4, ref_picture);
1024 1024
1025 dmin4= fast_halfpel_motion_search(s, &mx4, &my4, dmin4, rel_xmin4, rel_ymin4, rel_xmax4, rel_ymax4, 1025 dmin4= fast_halfpel_motion_search(s, &mx4, &my4, dmin4, rel_xmin4, rel_ymin4, rel_xmax4, rel_ymax4,
1026 pred_x4, pred_y4, ref_picture, pix_abs8x8_x2, 1026 pred_x4, pred_y4, ref_picture, s->dsp.pix_abs8x8_x2,
1027 pix_abs8x8_y2, pix_abs8x8_xy2, block); 1027 s->dsp.pix_abs8x8_y2, s->dsp.pix_abs8x8_xy2, block);
1028 1028
1029 s->motion_val[ s->block_index[block] ][0]= mx4; 1029 s->motion_val[ s->block_index[block] ][0]= mx4;
1030 s->motion_val[ s->block_index[block] ][1]= my4; 1030 s->motion_val[ s->block_index[block] ][1]= my4;
1031 dmin_sum+= dmin4; 1031 dmin_sum+= dmin4;
1032 } 1032 }
1131 1131
1132 pix = s->new_picture[0] + (yy * s->linesize) + xx; 1132 pix = s->new_picture[0] + (yy * s->linesize) + xx;
1133 /* At this point (mx,my) are full-pell and the relative displacement */ 1133 /* At this point (mx,my) are full-pell and the relative displacement */
1134 ppix = ref_picture + ((yy+my) * s->linesize) + (xx+mx); 1134 ppix = ref_picture + ((yy+my) * s->linesize) + (xx+mx);
1135 1135
1136 sum = pix_sum(pix, s->linesize); 1136 sum = s->dsp.pix_sum(pix, s->linesize);
1137 1137
1138 varc = (pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8; 1138 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
1139 // FIXME: MMX OPTIMIZE
1139 vard = (pix_norm(pix, ppix, s->linesize)+128)>>8; 1140 vard = (pix_norm(pix, ppix, s->linesize)+128)>>8;
1140 1141
1141 //printf("%d %d %d %X %X %X\n", s->mb_width, mb_x, mb_y,(int)s, (int)s->mb_var, (int)s->mc_mb_var); fflush(stdout); 1142 //printf("%d %d %d %X %X %X\n", s->mb_width, mb_x, mb_y,(int)s, (int)s->mb_var, (int)s->mc_mb_var); fflush(stdout);
1142 s->mb_var [s->mb_width * mb_y + mb_x] = varc; 1143 s->mb_var [s->mb_width * mb_y + mb_x] = varc;
1143 s->mc_mb_var[s->mb_width * mb_y + mb_x] = vard; 1144 s->mc_mb_var[s->mb_width * mb_y + mb_x] = vard;
1159 if (vard*2 + 200 > varc) 1160 if (vard*2 + 200 > varc)
1160 mb_type|= MB_TYPE_INTRA; 1161 mb_type|= MB_TYPE_INTRA;
1161 if (varc*2 + 200 > vard){ 1162 if (varc*2 + 200 > vard){
1162 mb_type|= MB_TYPE_INTER; 1163 mb_type|= MB_TYPE_INTER;
1163 if(s->me_method >= ME_EPZS) 1164 if(s->me_method >= ME_EPZS)
1164 fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax, 1165 fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
1165 pred_x, pred_y, ref_picture, pix_abs16x16_x2, pix_abs16x16_y2, 1166 pred_x, pred_y, ref_picture, s->dsp.pix_abs16x16_x2,
1166 pix_abs16x16_xy2, 0); 1167 s->dsp.pix_abs16x16_y2, s->dsp.pix_abs16x16_xy2, 0);
1167 else 1168 else
1168 halfpel_motion_search( s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax, 1169 halfpel_motion_search( s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
1169 pred_x, pred_y, ref_picture, pix_abs16x16_x2, pix_abs16x16_y2, 1170 pred_x, pred_y, ref_picture, s->dsp.pix_abs16x16_x2,
1170 pix_abs16x16_xy2, 0); 1171 s->dsp.pix_abs16x16_y2, s->dsp.pix_abs16x16_xy2, 0);
1171 }else{ 1172 }else{
1172 mx <<=1; 1173 mx <<=1;
1173 my <<=1; 1174 my <<=1;
1174 } 1175 }
1175 if((s->flags&CODEC_FLAG_4MV) 1176 if((s->flags&CODEC_FLAG_4MV)
1184 if (vard <= 64 || vard < varc) { 1185 if (vard <= 64 || vard < varc) {
1185 s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); 1186 s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
1186 mb_type|= MB_TYPE_INTER; 1187 mb_type|= MB_TYPE_INTER;
1187 if (s->me_method != ME_ZERO) { 1188 if (s->me_method != ME_ZERO) {
1188 if(s->me_method >= ME_EPZS) 1189 if(s->me_method >= ME_EPZS)
1189 dmin= fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax, 1190 dmin= fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
1190 pred_x, pred_y, ref_picture, pix_abs16x16_x2, pix_abs16x16_y2, 1191 pred_x, pred_y, ref_picture, s->dsp.pix_abs16x16_x2, s->dsp.pix_abs16x16_y2,
1191 pix_abs16x16_xy2, 0); 1192 s->dsp.pix_abs16x16_xy2, 0);
1192 else 1193 else
1193 dmin= halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax, 1194 dmin= halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
1194 pred_x, pred_y, ref_picture, pix_abs16x16_x2, pix_abs16x16_y2, 1195 pred_x, pred_y, ref_picture, s->dsp.pix_abs16x16_x2, s->dsp.pix_abs16x16_y2,
1195 pix_abs16x16_xy2, 0); 1196 s->dsp.pix_abs16x16_xy2, 0);
1196 if((s->flags&CODEC_FLAG_4MV) 1197 if((s->flags&CODEC_FLAG_4MV)
1197 && !s->skip_me && varc>50 && vard>10){ 1198 && !s->skip_me && varc>50 && vard>10){
1198 int dmin4= mv4_search(s, rel_xmin, rel_ymin, rel_xmax, rel_ymax, mx, my, shift); 1199 int dmin4= mv4_search(s, rel_xmin, rel_ymin, rel_xmax, rel_ymax, mx, my, shift);
1199 if(dmin4 + 128 <dmin) 1200 if(dmin4 + 128 <dmin)
1200 mb_type= MB_TYPE_INTER4V; 1201 mb_type= MB_TYPE_INTER4V;
1301 dmin = epzs_motion_search(s, &mx, &my, P, pred_x, pred_y, rel_xmin, rel_ymin, rel_xmax, rel_ymax, ref_picture); 1302 dmin = epzs_motion_search(s, &mx, &my, P, pred_x, pred_y, rel_xmin, rel_ymin, rel_xmax, rel_ymax, ref_picture);
1302 1303
1303 break; 1304 break;
1304 } 1305 }
1305 1306
1306 dmin= fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax, 1307 dmin= fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
1307 pred_x, pred_y, ref_picture, pix_abs16x16_x2, pix_abs16x16_y2, 1308 pred_x, pred_y, ref_picture, s->dsp.pix_abs16x16_x2, s->dsp.pix_abs16x16_y2,
1308 pix_abs16x16_xy2, 0); 1309 s->dsp.pix_abs16x16_xy2, 0);
1309 //printf("%d %d %d %d//", s->mb_x, s->mb_y, mx, my); 1310 //printf("%d %d %d %d//", s->mb_x, s->mb_y, mx, my);
1310 // s->mb_type[mb_y*s->mb_width + mb_x]= mb_type; 1311 // s->mb_type[mb_y*s->mb_width + mb_x]= mb_type;
1311 mv_table[mot_xy][0]= mx; 1312 mv_table[mot_xy][0]= mx;
1312 mv_table[mot_xy][1]= my; 1313 mv_table[mot_xy][1]= my;
1313 return dmin; 1314 return dmin;
1341 src_y = clip(src_y, -16, s->height); 1342 src_y = clip(src_y, -16, s->height);
1342 if (src_y == s->height) 1343 if (src_y == s->height)
1343 dxy&= 1; 1344 dxy&= 1;
1344 1345
1345 ptr = s->last_picture[0] + (src_y * s->linesize) + src_x; 1346 ptr = s->last_picture[0] + (src_y * s->linesize) + src_x;
1346 put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); 1347 s->dsp.put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
1347 1348
1348 fbmin += (mv_penalty[motion_bx-pred_bx] + mv_penalty[motion_by-pred_by])*s->qscale; 1349 fbmin += (mv_penalty[motion_bx-pred_bx] + mv_penalty[motion_by-pred_by])*s->qscale;
1349 1350
1350 dxy = ((motion_by & 1) << 1) | (motion_bx & 1); 1351 dxy = ((motion_by & 1) << 1) | (motion_bx & 1);
1351 src_x = mb_x * 16 + (motion_bx >> 1); 1352 src_x = mb_x * 16 + (motion_bx >> 1);
1352 src_y = mb_y * 16 + (motion_by >> 1); 1353 src_y = mb_y * 16 + (motion_by >> 1);
1354 if (src_x == s->width) 1355 if (src_x == s->width)
1355 dxy&= 2; 1356 dxy&= 2;
1356 src_y = clip(src_y, -16, s->height); 1357 src_y = clip(src_y, -16, s->height);
1357 if (src_y == s->height) 1358 if (src_y == s->height)
1358 dxy&= 1; 1359 dxy&= 1;
1359 1360
1360 ptr = s->next_picture[0] + (src_y * s->linesize) + src_x; 1361 ptr = s->next_picture[0] + (src_y * s->linesize) + src_x;
1361 avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); 1362 s->dsp.avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
1362 1363
1363 fbmin += pix_abs16x16(s->new_picture[0] + mb_x*16 + mb_y*16*s->linesize, dest_y, s->linesize); 1364 fbmin += s->dsp.pix_abs16x16(s->new_picture[0] + mb_x*16 + mb_y*16*s->linesize, dest_y, s->linesize);
1364 return fbmin; 1365 return fbmin;
1365 } 1366 }
1366 1367
1367 /* refine the bidir vectors in hq mode and return the score in both lq & hq mode*/ 1368 /* refine the bidir vectors in hq mode and return the score in both lq & hq mode*/
1368 static inline int bidir_refine(MpegEncContext * s, 1369 static inline int bidir_refine(MpegEncContext * s,
1441 if (src_x == width) dxy &= ~1; 1442 if (src_x == width) dxy &= ~1;
1442 src_y = clip(src_y, -16, height); 1443 src_y = clip(src_y, -16, height);
1443 if (src_y == height) dxy &= ~2; 1444 if (src_y == height) dxy &= ~2;
1444 1445
1445 ptr = s->last_picture[0] + (src_y * s->linesize) + src_x; 1446 ptr = s->last_picture[0] + (src_y * s->linesize) + src_x;
1446 put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); 1447 s->dsp.put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
1447 1448
1448 dxy = ((motion_by & 1) << 1) | (motion_bx & 1); 1449 dxy = ((motion_by & 1) << 1) | (motion_bx & 1);
1449 src_x = (mb_x + bx) * 16 + (motion_bx >> 1); 1450 src_x = (mb_x + bx) * 16 + (motion_bx >> 1);
1450 src_y = (mb_y + by) * 16 + (motion_by >> 1); 1451 src_y = (mb_y + by) * 16 + (motion_by >> 1);
1451 src_x = clip(src_x, -16, width); 1452 src_x = clip(src_x, -16, width);
1452 if (src_x == width) dxy &= ~1; 1453 if (src_x == width) dxy &= ~1;
1453 src_y = clip(src_y, -16, height); 1454 src_y = clip(src_y, -16, height);
1454 if (src_y == height) dxy &= ~2; 1455 if (src_y == height) dxy &= ~2;
1455 1456
1456 avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); 1457 s->dsp.avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
1457 } 1458 }
1458 } 1459 }
1459 1460
1460 P_LAST[0] = mv_table[mot_xy ][0]; 1461 P_LAST[0] = mv_table[mot_xy ][0];
1461 P_LAST[1] = mv_table[mot_xy ][1]; 1462 P_LAST[1] = mv_table[mot_xy ][1];