Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
subsample.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 #include "all.h"
00082 #include "mtypes.h"
00083 #include "frames.h"
00084 #include "bitio.h"
00085 #include "prototypes.h"
00086
00087 #undef ABS
00088 #define ABS(x) ((x < 0) ? (-x) : x)
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 int32
00108 LumMotionErrorA(currentBlock, prevFrame, by, bx, my, mx, bestSoFar)
00109 LumBlock currentBlock;
00110 MpegFrame *prevFrame;
00111 int by;
00112 int bx;
00113 int my;
00114 int mx;
00115 int32 bestSoFar;
00116 {
00117 register int32 diff = 0;
00118 register int32 localDiff;
00119 register uint8 *macross;
00120 register uint8 **prev;
00121 register int fy, fx;
00122 boolean xHalf, yHalf;
00123
00124 xHalf = (ABS(mx) % 2 == 1);
00125 yHalf = (ABS(my) % 2 == 1);
00126
00127 MOTION_TO_FRAME_COORD(by, bx, my/2, mx/2, fy, fx);
00128
00129 if ( xHalf ) {
00130 if ( mx < 0 ) {
00131 fx--;
00132 }
00133
00134 if ( yHalf ) {
00135 if ( my < 0 ) {
00136 fy--;
00137 }
00138
00139 prev = prevFrame->halfBoth;
00140 } else {
00141 prev = prevFrame->halfX;
00142 }
00143 } else if ( yHalf ) {
00144 if ( my < 0 ) {
00145 fy--;
00146 }
00147
00148 prev = prevFrame->halfY;
00149 } else {
00150 prev = prevFrame->ref_y;
00151 }
00152
00153 macross = &(prev[fy][fx]);
00154
00155 localDiff = macross[0]-currentBlock[0][0]; diff += ABS(localDiff);
00156 localDiff = macross[2]-currentBlock[0][2]; diff += ABS(localDiff);
00157 localDiff = macross[4]-currentBlock[0][4]; diff += ABS(localDiff);
00158 localDiff = macross[6]-currentBlock[0][6]; diff += ABS(localDiff);
00159 localDiff = macross[8]-currentBlock[0][8]; diff += ABS(localDiff);
00160 localDiff = macross[10]-currentBlock[0][10]; diff += ABS(localDiff);
00161 localDiff = macross[12]-currentBlock[0][12]; diff += ABS(localDiff);
00162 localDiff = macross[14]-currentBlock[0][14]; diff += ABS(localDiff);
00163
00164 if ( diff > bestSoFar ) {
00165 return diff;
00166 }
00167
00168 macross = &(prev[fy+2][fx]);
00169
00170 localDiff = macross[0]-currentBlock[2][0]; diff += ABS(localDiff);
00171 localDiff = macross[2]-currentBlock[2][2]; diff += ABS(localDiff);
00172 localDiff = macross[4]-currentBlock[2][4]; diff += ABS(localDiff);
00173 localDiff = macross[6]-currentBlock[2][6]; diff += ABS(localDiff);
00174 localDiff = macross[8]-currentBlock[2][8]; diff += ABS(localDiff);
00175 localDiff = macross[10]-currentBlock[2][10]; diff += ABS(localDiff);
00176 localDiff = macross[12]-currentBlock[2][12]; diff += ABS(localDiff);
00177 localDiff = macross[14]-currentBlock[2][14]; diff += ABS(localDiff);
00178
00179 if ( diff > bestSoFar ) {
00180 return diff;
00181 }
00182
00183 macross = &(prev[fy+4][fx]);
00184
00185 localDiff = macross[0]-currentBlock[4][0]; diff += ABS(localDiff);
00186 localDiff = macross[2]-currentBlock[4][2]; diff += ABS(localDiff);
00187 localDiff = macross[4]-currentBlock[4][4]; diff += ABS(localDiff);
00188 localDiff = macross[6]-currentBlock[4][6]; diff += ABS(localDiff);
00189 localDiff = macross[8]-currentBlock[4][8]; diff += ABS(localDiff);
00190 localDiff = macross[10]-currentBlock[4][10]; diff += ABS(localDiff);
00191 localDiff = macross[12]-currentBlock[4][12]; diff += ABS(localDiff);
00192 localDiff = macross[14]-currentBlock[4][14]; diff += ABS(localDiff);
00193
00194 if ( diff > bestSoFar ) {
00195 return diff;
00196 }
00197
00198 macross = &(prev[fy+6][fx]);
00199
00200 localDiff = macross[0]-currentBlock[6][0]; diff += ABS(localDiff);
00201 localDiff = macross[2]-currentBlock[6][2]; diff += ABS(localDiff);
00202 localDiff = macross[4]-currentBlock[6][4]; diff += ABS(localDiff);
00203 localDiff = macross[6]-currentBlock[6][6]; diff += ABS(localDiff);
00204 localDiff = macross[8]-currentBlock[6][8]; diff += ABS(localDiff);
00205 localDiff = macross[10]-currentBlock[6][10]; diff += ABS(localDiff);
00206 localDiff = macross[12]-currentBlock[6][12]; diff += ABS(localDiff);
00207 localDiff = macross[14]-currentBlock[6][14]; diff += ABS(localDiff);
00208
00209 if ( diff > bestSoFar ) {
00210 return diff;
00211 }
00212
00213 macross = &(prev[fy+8][fx]);
00214
00215 localDiff = macross[0]-currentBlock[8][0]; diff += ABS(localDiff);
00216 localDiff = macross[2]-currentBlock[8][2]; diff += ABS(localDiff);
00217 localDiff = macross[4]-currentBlock[8][4]; diff += ABS(localDiff);
00218 localDiff = macross[6]-currentBlock[8][6]; diff += ABS(localDiff);
00219 localDiff = macross[8]-currentBlock[8][8]; diff += ABS(localDiff);
00220 localDiff = macross[10]-currentBlock[8][10]; diff += ABS(localDiff);
00221 localDiff = macross[12]-currentBlock[8][12]; diff += ABS(localDiff);
00222 localDiff = macross[14]-currentBlock[8][14]; diff += ABS(localDiff);
00223
00224 if ( diff > bestSoFar ) {
00225 return diff;
00226 }
00227
00228 macross = &(prev[fy+10][fx]);
00229
00230 localDiff = macross[0]-currentBlock[10][0]; diff += ABS(localDiff);
00231 localDiff = macross[2]-currentBlock[10][2]; diff += ABS(localDiff);
00232 localDiff = macross[4]-currentBlock[10][4]; diff += ABS(localDiff);
00233 localDiff = macross[6]-currentBlock[10][6]; diff += ABS(localDiff);
00234 localDiff = macross[8]-currentBlock[10][8]; diff += ABS(localDiff);
00235 localDiff = macross[10]-currentBlock[10][10]; diff += ABS(localDiff);
00236 localDiff = macross[12]-currentBlock[10][12]; diff += ABS(localDiff);
00237 localDiff = macross[14]-currentBlock[10][14]; diff += ABS(localDiff);
00238
00239 if ( diff > bestSoFar ) {
00240 return diff;
00241 }
00242
00243 macross = &(prev[fy+12][fx]);
00244
00245 localDiff = macross[0]-currentBlock[12][0]; diff += ABS(localDiff);
00246 localDiff = macross[2]-currentBlock[12][2]; diff += ABS(localDiff);
00247 localDiff = macross[4]-currentBlock[12][4]; diff += ABS(localDiff);
00248 localDiff = macross[6]-currentBlock[12][6]; diff += ABS(localDiff);
00249 localDiff = macross[8]-currentBlock[12][8]; diff += ABS(localDiff);
00250 localDiff = macross[10]-currentBlock[12][10]; diff += ABS(localDiff);
00251 localDiff = macross[12]-currentBlock[12][12]; diff += ABS(localDiff);
00252 localDiff = macross[14]-currentBlock[12][14]; diff += ABS(localDiff);
00253
00254 if ( diff > bestSoFar ) {
00255 return diff;
00256 }
00257
00258 macross = &(prev[fy+14][fx]);
00259
00260 localDiff = macross[0]-currentBlock[14][0]; diff += ABS(localDiff);
00261 localDiff = macross[2]-currentBlock[14][2]; diff += ABS(localDiff);
00262 localDiff = macross[4]-currentBlock[14][4]; diff += ABS(localDiff);
00263 localDiff = macross[6]-currentBlock[14][6]; diff += ABS(localDiff);
00264 localDiff = macross[8]-currentBlock[14][8]; diff += ABS(localDiff);
00265 localDiff = macross[10]-currentBlock[14][10]; diff += ABS(localDiff);
00266 localDiff = macross[12]-currentBlock[14][12]; diff += ABS(localDiff);
00267 localDiff = macross[14]-currentBlock[14][14]; diff += ABS(localDiff);
00268
00269 return diff;
00270 }
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284 int32
00285 LumMotionErrorB(currentBlock, prevFrame, by, bx, my, mx, bestSoFar)
00286 LumBlock currentBlock;
00287 MpegFrame *prevFrame;
00288 int by;
00289 int bx;
00290 int my;
00291 int mx;
00292 int32 bestSoFar;
00293 {
00294 register int32 diff = 0;
00295 register int32 localDiff;
00296 register uint8 *macross;
00297 register uint8 **prev;
00298 register int fy, fx;
00299 boolean xHalf, yHalf;
00300
00301 xHalf = (ABS(mx) % 2 == 1);
00302 yHalf = (ABS(my) % 2 == 1);
00303
00304 MOTION_TO_FRAME_COORD(by, bx, my/2, mx/2, fy, fx);
00305
00306 if ( xHalf ) {
00307 if ( mx < 0 ) {
00308 fx--;
00309 }
00310
00311 if ( yHalf ) {
00312 if ( my < 0 ) {
00313 fy--;
00314 }
00315
00316 prev = prevFrame->halfBoth;
00317 } else {
00318 prev = prevFrame->halfX;
00319 }
00320 } else if ( yHalf ) {
00321 if ( my < 0 ) {
00322 fy--;
00323 }
00324
00325 prev = prevFrame->halfY;
00326 } else {
00327 prev = prevFrame->ref_y;
00328 }
00329
00330 macross = &(prev[fy+0][fx]);
00331
00332 localDiff = macross[1]-currentBlock[0][1]; diff += ABS(localDiff);
00333 localDiff = macross[3]-currentBlock[0][3]; diff += ABS(localDiff);
00334 localDiff = macross[5]-currentBlock[0][5]; diff += ABS(localDiff);
00335 localDiff = macross[7]-currentBlock[0][7]; diff += ABS(localDiff);
00336 localDiff = macross[9]-currentBlock[0][9]; diff += ABS(localDiff);
00337 localDiff = macross[11]-currentBlock[0][11]; diff += ABS(localDiff);
00338 localDiff = macross[13]-currentBlock[0][13]; diff += ABS(localDiff);
00339 localDiff = macross[15]-currentBlock[0][15]; diff += ABS(localDiff);
00340
00341 if ( diff > bestSoFar ) {
00342 return diff;
00343 }
00344
00345 macross = &(prev[fy+2][fx]);
00346
00347 localDiff = macross[1]-currentBlock[2][1]; diff += ABS(localDiff);
00348 localDiff = macross[3]-currentBlock[2][3]; diff += ABS(localDiff);
00349 localDiff = macross[5]-currentBlock[2][5]; diff += ABS(localDiff);
00350 localDiff = macross[7]-currentBlock[2][7]; diff += ABS(localDiff);
00351 localDiff = macross[9]-currentBlock[2][9]; diff += ABS(localDiff);
00352 localDiff = macross[11]-currentBlock[2][11]; diff += ABS(localDiff);
00353 localDiff = macross[13]-currentBlock[2][13]; diff += ABS(localDiff);
00354 localDiff = macross[15]-currentBlock[2][15]; diff += ABS(localDiff);
00355
00356 if ( diff > bestSoFar ) {
00357 return diff;
00358 }
00359
00360 macross = &(prev[fy+4][fx]);
00361
00362 localDiff = macross[1]-currentBlock[4][1]; diff += ABS(localDiff);
00363 localDiff = macross[3]-currentBlock[4][3]; diff += ABS(localDiff);
00364 localDiff = macross[5]-currentBlock[4][5]; diff += ABS(localDiff);
00365 localDiff = macross[7]-currentBlock[4][7]; diff += ABS(localDiff);
00366 localDiff = macross[9]-currentBlock[4][9]; diff += ABS(localDiff);
00367 localDiff = macross[11]-currentBlock[4][11]; diff += ABS(localDiff);
00368 localDiff = macross[13]-currentBlock[4][13]; diff += ABS(localDiff);
00369 localDiff = macross[15]-currentBlock[4][15]; diff += ABS(localDiff);
00370
00371 if ( diff > bestSoFar ) {
00372 return diff;
00373 }
00374
00375 macross = &(prev[fy+6][fx]);
00376
00377 localDiff = macross[1]-currentBlock[6][1]; diff += ABS(localDiff);
00378 localDiff = macross[3]-currentBlock[6][3]; diff += ABS(localDiff);
00379 localDiff = macross[5]-currentBlock[6][5]; diff += ABS(localDiff);
00380 localDiff = macross[7]-currentBlock[6][7]; diff += ABS(localDiff);
00381 localDiff = macross[9]-currentBlock[6][9]; diff += ABS(localDiff);
00382 localDiff = macross[11]-currentBlock[6][11]; diff += ABS(localDiff);
00383 localDiff = macross[13]-currentBlock[6][13]; diff += ABS(localDiff);
00384 localDiff = macross[15]-currentBlock[6][15]; diff += ABS(localDiff);
00385
00386 if ( diff > bestSoFar ) {
00387 return diff;
00388 }
00389
00390 macross = &(prev[fy+8][fx]);
00391
00392 localDiff = macross[1]-currentBlock[8][1]; diff += ABS(localDiff);
00393 localDiff = macross[3]-currentBlock[8][3]; diff += ABS(localDiff);
00394 localDiff = macross[5]-currentBlock[8][5]; diff += ABS(localDiff);
00395 localDiff = macross[7]-currentBlock[8][7]; diff += ABS(localDiff);
00396 localDiff = macross[9]-currentBlock[8][9]; diff += ABS(localDiff);
00397 localDiff = macross[11]-currentBlock[8][11]; diff += ABS(localDiff);
00398 localDiff = macross[13]-currentBlock[8][13]; diff += ABS(localDiff);
00399 localDiff = macross[15]-currentBlock[8][15]; diff += ABS(localDiff);
00400
00401 if ( diff > bestSoFar ) {
00402 return diff;
00403 }
00404
00405 macross = &(prev[fy+10][fx]);
00406
00407 localDiff = macross[1]-currentBlock[10][1]; diff += ABS(localDiff);
00408 localDiff = macross[3]-currentBlock[10][3]; diff += ABS(localDiff);
00409 localDiff = macross[5]-currentBlock[10][5]; diff += ABS(localDiff);
00410 localDiff = macross[7]-currentBlock[10][7]; diff += ABS(localDiff);
00411 localDiff = macross[9]-currentBlock[10][9]; diff += ABS(localDiff);
00412 localDiff = macross[11]-currentBlock[10][11]; diff += ABS(localDiff);
00413 localDiff = macross[13]-currentBlock[10][13]; diff += ABS(localDiff);
00414 localDiff = macross[15]-currentBlock[10][15]; diff += ABS(localDiff);
00415
00416 if ( diff > bestSoFar ) {
00417 return diff;
00418 }
00419
00420 macross = &(prev[fy+12][fx]);
00421
00422 localDiff = macross[1]-currentBlock[12][1]; diff += ABS(localDiff);
00423 localDiff = macross[3]-currentBlock[12][3]; diff += ABS(localDiff);
00424 localDiff = macross[5]-currentBlock[12][5]; diff += ABS(localDiff);
00425 localDiff = macross[7]-currentBlock[12][7]; diff += ABS(localDiff);
00426 localDiff = macross[9]-currentBlock[12][9]; diff += ABS(localDiff);
00427 localDiff = macross[11]-currentBlock[12][11]; diff += ABS(localDiff);
00428 localDiff = macross[13]-currentBlock[12][13]; diff += ABS(localDiff);
00429 localDiff = macross[15]-currentBlock[12][15]; diff += ABS(localDiff);
00430
00431 if ( diff > bestSoFar ) {
00432 return diff;
00433 }
00434
00435 macross = &(prev[fy+14][fx]);
00436
00437 localDiff = macross[1]-currentBlock[14][1]; diff += ABS(localDiff);
00438 localDiff = macross[3]-currentBlock[14][3]; diff += ABS(localDiff);
00439 localDiff = macross[5]-currentBlock[14][5]; diff += ABS(localDiff);
00440 localDiff = macross[7]-currentBlock[14][7]; diff += ABS(localDiff);
00441 localDiff = macross[9]-currentBlock[14][9]; diff += ABS(localDiff);
00442 localDiff = macross[11]-currentBlock[14][11]; diff += ABS(localDiff);
00443 localDiff = macross[13]-currentBlock[14][13]; diff += ABS(localDiff);
00444 localDiff = macross[15]-currentBlock[14][15]; diff += ABS(localDiff);
00445
00446 return diff;
00447 }
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461 int32
00462 LumMotionErrorC(currentBlock, prevFrame, by, bx, my, mx, bestSoFar)
00463 LumBlock currentBlock;
00464 MpegFrame *prevFrame;
00465 int by;
00466 int bx;
00467 int my;
00468 int mx;
00469 int32 bestSoFar;
00470 {
00471 register int32 diff = 0;
00472 register int32 localDiff;
00473 register uint8 *macross;
00474 register uint8 **prev;
00475 register int fy, fx;
00476 boolean xHalf, yHalf;
00477
00478 xHalf = (ABS(mx) % 2 == 1);
00479 yHalf = (ABS(my) % 2 == 1);
00480
00481 MOTION_TO_FRAME_COORD(by, bx, my/2, mx/2, fy, fx);
00482
00483 if ( xHalf ) {
00484 if ( mx < 0 ) {
00485 fx--;
00486 }
00487
00488 if ( yHalf ) {
00489 if ( my < 0 ) {
00490 fy--;
00491 }
00492
00493 prev = prevFrame->halfBoth;
00494 } else {
00495 prev = prevFrame->halfX;
00496 }
00497 } else if ( yHalf ) {
00498 if ( my < 0 ) {
00499 fy--;
00500 }
00501
00502 prev = prevFrame->halfY;
00503 } else {
00504 prev = prevFrame->ref_y;
00505 }
00506
00507 macross = &(prev[fy+1][fx]);
00508
00509 localDiff = macross[0]-currentBlock[1][0]; diff += ABS(localDiff);
00510 localDiff = macross[2]-currentBlock[1][2]; diff += ABS(localDiff);
00511 localDiff = macross[4]-currentBlock[1][4]; diff += ABS(localDiff);
00512 localDiff = macross[6]-currentBlock[1][6]; diff += ABS(localDiff);
00513 localDiff = macross[8]-currentBlock[1][8]; diff += ABS(localDiff);
00514 localDiff = macross[10]-currentBlock[1][10]; diff += ABS(localDiff);
00515 localDiff = macross[12]-currentBlock[1][12]; diff += ABS(localDiff);
00516 localDiff = macross[14]-currentBlock[1][14]; diff += ABS(localDiff);
00517
00518 if ( diff > bestSoFar ) {
00519 return diff;
00520 }
00521
00522 macross = &(prev[fy+3][fx]);
00523
00524 localDiff = macross[0]-currentBlock[3][0]; diff += ABS(localDiff);
00525 localDiff = macross[2]-currentBlock[3][2]; diff += ABS(localDiff);
00526 localDiff = macross[4]-currentBlock[3][4]; diff += ABS(localDiff);
00527 localDiff = macross[6]-currentBlock[3][6]; diff += ABS(localDiff);
00528 localDiff = macross[8]-currentBlock[3][8]; diff += ABS(localDiff);
00529 localDiff = macross[10]-currentBlock[3][10]; diff += ABS(localDiff);
00530 localDiff = macross[12]-currentBlock[3][12]; diff += ABS(localDiff);
00531 localDiff = macross[14]-currentBlock[3][14]; diff += ABS(localDiff);
00532
00533 if ( diff > bestSoFar ) {
00534 return diff;
00535 }
00536
00537 macross = &(prev[fy+5][fx]);
00538
00539 localDiff = macross[0]-currentBlock[5][0]; diff += ABS(localDiff);
00540 localDiff = macross[2]-currentBlock[5][2]; diff += ABS(localDiff);
00541 localDiff = macross[4]-currentBlock[5][4]; diff += ABS(localDiff);
00542 localDiff = macross[6]-currentBlock[5][6]; diff += ABS(localDiff);
00543 localDiff = macross[8]-currentBlock[5][8]; diff += ABS(localDiff);
00544 localDiff = macross[10]-currentBlock[5][10]; diff += ABS(localDiff);
00545 localDiff = macross[12]-currentBlock[5][12]; diff += ABS(localDiff);
00546 localDiff = macross[14]-currentBlock[5][14]; diff += ABS(localDiff);
00547
00548 if ( diff > bestSoFar ) {
00549 return diff;
00550 }
00551
00552 macross = &(prev[fy+7][fx]);
00553
00554 localDiff = macross[0]-currentBlock[7][0]; diff += ABS(localDiff);
00555 localDiff = macross[2]-currentBlock[7][2]; diff += ABS(localDiff);
00556 localDiff = macross[4]-currentBlock[7][4]; diff += ABS(localDiff);
00557 localDiff = macross[6]-currentBlock[7][6]; diff += ABS(localDiff);
00558 localDiff = macross[8]-currentBlock[7][8]; diff += ABS(localDiff);
00559 localDiff = macross[10]-currentBlock[7][10]; diff += ABS(localDiff);
00560 localDiff = macross[12]-currentBlock[7][12]; diff += ABS(localDiff);
00561 localDiff = macross[14]-currentBlock[7][14]; diff += ABS(localDiff);
00562
00563 if ( diff > bestSoFar ) {
00564 return diff;
00565 }
00566
00567 macross = &(prev[fy+9][fx]);
00568
00569 localDiff = macross[0]-currentBlock[9][0]; diff += ABS(localDiff);
00570 localDiff = macross[2]-currentBlock[9][2]; diff += ABS(localDiff);
00571 localDiff = macross[4]-currentBlock[9][4]; diff += ABS(localDiff);
00572 localDiff = macross[6]-currentBlock[9][6]; diff += ABS(localDiff);
00573 localDiff = macross[8]-currentBlock[9][8]; diff += ABS(localDiff);
00574 localDiff = macross[10]-currentBlock[9][10]; diff += ABS(localDiff);
00575 localDiff = macross[12]-currentBlock[9][12]; diff += ABS(localDiff);
00576 localDiff = macross[14]-currentBlock[9][14]; diff += ABS(localDiff);
00577
00578 if ( diff > bestSoFar ) {
00579 return diff;
00580 }
00581
00582 macross = &(prev[fy+11][fx]);
00583
00584 localDiff = macross[0]-currentBlock[11][0]; diff += ABS(localDiff);
00585 localDiff = macross[2]-currentBlock[11][2]; diff += ABS(localDiff);
00586 localDiff = macross[4]-currentBlock[11][4]; diff += ABS(localDiff);
00587 localDiff = macross[6]-currentBlock[11][6]; diff += ABS(localDiff);
00588 localDiff = macross[8]-currentBlock[11][8]; diff += ABS(localDiff);
00589 localDiff = macross[10]-currentBlock[11][10]; diff += ABS(localDiff);
00590 localDiff = macross[12]-currentBlock[11][12]; diff += ABS(localDiff);
00591 localDiff = macross[14]-currentBlock[11][14]; diff += ABS(localDiff);
00592
00593 if ( diff > bestSoFar ) {
00594 return diff;
00595 }
00596
00597 macross = &(prev[fy+13][fx]);
00598
00599 localDiff = macross[0]-currentBlock[13][0]; diff += ABS(localDiff);
00600 localDiff = macross[2]-currentBlock[13][2]; diff += ABS(localDiff);
00601 localDiff = macross[4]-currentBlock[13][4]; diff += ABS(localDiff);
00602 localDiff = macross[6]-currentBlock[13][6]; diff += ABS(localDiff);
00603 localDiff = macross[8]-currentBlock[13][8]; diff += ABS(localDiff);
00604 localDiff = macross[10]-currentBlock[13][10]; diff += ABS(localDiff);
00605 localDiff = macross[12]-currentBlock[13][12]; diff += ABS(localDiff);
00606 localDiff = macross[14]-currentBlock[13][14]; diff += ABS(localDiff);
00607
00608 if ( diff > bestSoFar ) {
00609 return diff;
00610 }
00611
00612 macross = &(prev[fy+15][fx]);
00613
00614 localDiff = macross[0]-currentBlock[15][0]; diff += ABS(localDiff);
00615 localDiff = macross[2]-currentBlock[15][2]; diff += ABS(localDiff);
00616 localDiff = macross[4]-currentBlock[15][4]; diff += ABS(localDiff);
00617 localDiff = macross[6]-currentBlock[15][6]; diff += ABS(localDiff);
00618 localDiff = macross[8]-currentBlock[15][8]; diff += ABS(localDiff);
00619 localDiff = macross[10]-currentBlock[15][10]; diff += ABS(localDiff);
00620 localDiff = macross[12]-currentBlock[15][12]; diff += ABS(localDiff);
00621 localDiff = macross[14]-currentBlock[15][14]; diff += ABS(localDiff);
00622
00623 return diff;
00624 }
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638 int32
00639 LumMotionErrorD(currentBlock, prevFrame, by, bx, my, mx, bestSoFar)
00640 LumBlock currentBlock;
00641 MpegFrame *prevFrame;
00642 int by;
00643 int bx;
00644 int my;
00645 int mx;
00646 int32 bestSoFar;
00647 {
00648 register int32 diff = 0;
00649 register int32 localDiff;
00650 register uint8 *macross;
00651 register uint8 **prev;
00652 register int fy, fx;
00653 boolean xHalf, yHalf;
00654
00655 xHalf = (ABS(mx) % 2 == 1);
00656 yHalf = (ABS(my) % 2 == 1);
00657
00658 MOTION_TO_FRAME_COORD(by, bx, my/2, mx/2, fy, fx);
00659
00660 if ( xHalf ) {
00661 if ( mx < 0 ) {
00662 fx--;
00663 }
00664
00665 if ( yHalf ) {
00666 if ( my < 0 ) {
00667 fy--;
00668 }
00669 prev = prevFrame->halfBoth;
00670 } else {
00671 prev = prevFrame->halfX;
00672 }
00673 } else if ( yHalf ) {
00674 if ( my < 0 ) {
00675 fy--;
00676 }
00677 prev = prevFrame->halfY;
00678 } else {
00679 prev = prevFrame->ref_y;
00680 }
00681
00682 macross = &(prev[fy+1][fx]);
00683
00684 localDiff = macross[1]-currentBlock[1][1]; diff += ABS(localDiff);
00685 localDiff = macross[3]-currentBlock[1][3]; diff += ABS(localDiff);
00686 localDiff = macross[5]-currentBlock[1][5]; diff += ABS(localDiff);
00687 localDiff = macross[7]-currentBlock[1][7]; diff += ABS(localDiff);
00688 localDiff = macross[9]-currentBlock[1][9]; diff += ABS(localDiff);
00689 localDiff = macross[11]-currentBlock[1][11]; diff += ABS(localDiff);
00690 localDiff = macross[13]-currentBlock[1][13]; diff += ABS(localDiff);
00691 localDiff = macross[15]-currentBlock[1][15]; diff += ABS(localDiff);
00692
00693 if ( diff > bestSoFar ) {
00694 return diff;
00695 }
00696
00697 macross = &(prev[fy+3][fx]);
00698
00699 localDiff = macross[1]-currentBlock[3][1]; diff += ABS(localDiff);
00700 localDiff = macross[3]-currentBlock[3][3]; diff += ABS(localDiff);
00701 localDiff = macross[5]-currentBlock[3][5]; diff += ABS(localDiff);
00702 localDiff = macross[7]-currentBlock[3][7]; diff += ABS(localDiff);
00703 localDiff = macross[9]-currentBlock[3][9]; diff += ABS(localDiff);
00704 localDiff = macross[11]-currentBlock[3][11]; diff += ABS(localDiff);
00705 localDiff = macross[13]-currentBlock[3][13]; diff += ABS(localDiff);
00706 localDiff = macross[15]-currentBlock[3][15]; diff += ABS(localDiff);
00707
00708 if ( diff > bestSoFar ) {
00709 return diff;
00710 }
00711
00712 macross = &(prev[fy+5][fx]);
00713
00714 localDiff = macross[1]-currentBlock[5][1]; diff += ABS(localDiff);
00715 localDiff = macross[3]-currentBlock[5][3]; diff += ABS(localDiff);
00716 localDiff = macross[5]-currentBlock[5][5]; diff += ABS(localDiff);
00717 localDiff = macross[7]-currentBlock[5][7]; diff += ABS(localDiff);
00718 localDiff = macross[9]-currentBlock[5][9]; diff += ABS(localDiff);
00719 localDiff = macross[11]-currentBlock[5][11]; diff += ABS(localDiff);
00720 localDiff = macross[13]-currentBlock[5][13]; diff += ABS(localDiff);
00721 localDiff = macross[15]-currentBlock[5][15]; diff += ABS(localDiff);
00722
00723 if ( diff > bestSoFar ) {
00724 return diff;
00725 }
00726
00727 macross = &(prev[fy+7][fx]);
00728
00729 localDiff = macross[1]-currentBlock[7][1]; diff += ABS(localDiff);
00730 localDiff = macross[3]-currentBlock[7][3]; diff += ABS(localDiff);
00731 localDiff = macross[5]-currentBlock[7][5]; diff += ABS(localDiff);
00732 localDiff = macross[7]-currentBlock[7][7]; diff += ABS(localDiff);
00733 localDiff = macross[9]-currentBlock[7][9]; diff += ABS(localDiff);
00734 localDiff = macross[11]-currentBlock[7][11]; diff += ABS(localDiff);
00735 localDiff = macross[13]-currentBlock[7][13]; diff += ABS(localDiff);
00736 localDiff = macross[15]-currentBlock[7][15]; diff += ABS(localDiff);
00737
00738 if ( diff > bestSoFar ) {
00739 return diff;
00740 }
00741
00742 macross = &(prev[fy+9][fx]);
00743
00744 localDiff = macross[1]-currentBlock[9][1]; diff += ABS(localDiff);
00745 localDiff = macross[3]-currentBlock[9][3]; diff += ABS(localDiff);
00746 localDiff = macross[5]-currentBlock[9][5]; diff += ABS(localDiff);
00747 localDiff = macross[7]-currentBlock[9][7]; diff += ABS(localDiff);
00748 localDiff = macross[9]-currentBlock[9][9]; diff += ABS(localDiff);
00749 localDiff = macross[11]-currentBlock[9][11]; diff += ABS(localDiff);
00750 localDiff = macross[13]-currentBlock[9][13]; diff += ABS(localDiff);
00751 localDiff = macross[15]-currentBlock[9][15]; diff += ABS(localDiff);
00752
00753 if ( diff > bestSoFar ) {
00754 return diff;
00755 }
00756
00757 macross = &(prev[fy+11][fx]);
00758
00759 localDiff = macross[1]-currentBlock[11][1]; diff += ABS(localDiff);
00760 localDiff = macross[3]-currentBlock[11][3]; diff += ABS(localDiff);
00761 localDiff = macross[5]-currentBlock[11][5]; diff += ABS(localDiff);
00762 localDiff = macross[7]-currentBlock[11][7]; diff += ABS(localDiff);
00763 localDiff = macross[9]-currentBlock[11][9]; diff += ABS(localDiff);
00764 localDiff = macross[11]-currentBlock[11][11]; diff += ABS(localDiff);
00765 localDiff = macross[13]-currentBlock[11][13]; diff += ABS(localDiff);
00766 localDiff = macross[15]-currentBlock[11][15]; diff += ABS(localDiff);
00767
00768 if ( diff > bestSoFar ) {
00769 return diff;
00770 }
00771
00772 macross = &(prev[fy+13][fx]);
00773
00774 localDiff = macross[1]-currentBlock[13][1]; diff += ABS(localDiff);
00775 localDiff = macross[3]-currentBlock[13][3]; diff += ABS(localDiff);
00776 localDiff = macross[5]-currentBlock[13][5]; diff += ABS(localDiff);
00777 localDiff = macross[7]-currentBlock[13][7]; diff += ABS(localDiff);
00778 localDiff = macross[9]-currentBlock[13][9]; diff += ABS(localDiff);
00779 localDiff = macross[11]-currentBlock[13][11]; diff += ABS(localDiff);
00780 localDiff = macross[13]-currentBlock[13][13]; diff += ABS(localDiff);
00781 localDiff = macross[15]-currentBlock[13][15]; diff += ABS(localDiff);
00782
00783 if ( diff > bestSoFar ) {
00784 return diff;
00785 }
00786
00787 macross = &(prev[fy+15][fx]);
00788
00789 localDiff = macross[1]-currentBlock[15][1]; diff += ABS(localDiff);
00790 localDiff = macross[3]-currentBlock[15][3]; diff += ABS(localDiff);
00791 localDiff = macross[5]-currentBlock[15][5]; diff += ABS(localDiff);
00792 localDiff = macross[7]-currentBlock[15][7]; diff += ABS(localDiff);
00793 localDiff = macross[9]-currentBlock[15][9]; diff += ABS(localDiff);
00794 localDiff = macross[11]-currentBlock[15][11]; diff += ABS(localDiff);
00795 localDiff = macross[13]-currentBlock[15][13]; diff += ABS(localDiff);
00796 localDiff = macross[15]-currentBlock[15][15]; diff += ABS(localDiff);
00797
00798 return diff;
00799 }