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 }