Mercurial > libavcodec.hg
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]; |