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]; |
