Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

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  * subsample.c                                                               *
00003  *                                                                           *
00004  *      Procedures concerned with subsampling                                *
00005  *                                                                           *
00006  * EXPORTED PROCEDURES:                                                      *
00007  *      LumMotionErrorA                                                      *
00008  *      LumMotionErrorB                                                      *
00009  *      LumMotionErrorC                                                      *
00010  *      LumMotionErrorD                                                      *
00011  *                                                                           *
00012  *===========================================================================*/
00013 
00014 /*
00015  * Copyright (c) 1995 The Regents of the University of California.
00016  * All rights reserved.
00017  *
00018  * Permission to use, copy, modify, and distribute this software and its
00019  * documentation for any purpose, without fee, and without written agreement is
00020  * hereby granted, provided that the above copyright notice and the following
00021  * two paragraphs appear in all copies of this software.
00022  *
00023  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
00024  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
00025  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
00026  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00027  *
00028  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
00029  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
00030  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
00031  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
00032  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
00033  */
00034 
00035 /*  
00036  *  $Header: /misc/elrond0/share/cvs/AFNI/src/mpeg_encodedir/subsample.c,v 1.5 2004/04/02 15:12:41 rwcox Exp $
00037  *  $Log: subsample.c,v $
00038  *  Revision 1.5  2004/04/02 15:12:41  rwcox
00039  *  Cput
00040  *
00041  *  Revision 1.4  2004/02/05 21:32:23  rwcox
00042  *  Cput
00043  *
00044  *  Revision 1.3  2003/12/23 13:50:08  rwcox
00045  *  Cput
00046  *
00047  *  Revision 1.2  2003/12/03 14:46:14  rwcox
00048  *  Cput
00049  *
00050  *  Revision 1.1  2001/12/17 16:11:55  rwcox
00051  *  Cadd
00052  *
00053  * Revision 1.6  1995/01/19  23:09:28  eyhung
00054  * Changed copyrights
00055  *
00056  * Revision 1.5  1994/11/12  02:12:01  keving
00057  * nothing
00058  *
00059  * Revision 1.4  1993/12/22  19:19:01  keving
00060  * nothing
00061  *
00062  * Revision 1.4  1993/12/22  19:19:01  keving
00063  * nothing
00064  *
00065  * Revision 1.3  1993/07/22  22:23:43  keving
00066  * nothing
00067  *
00068  * Revision 1.2  1993/06/30  20:06:09  keving
00069  * nothing
00070  *
00071  * Revision 1.1  1993/06/22  21:56:05  keving
00072  * nothing
00073  *
00074  */
00075 
00076 
00077 /*==============*
00078  * HEADER FILES *
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  * EXPORTED PROCEDURES *
00093  *=====================*/
00094 
00095 
00096 /*===========================================================================*
00097  *
00098  * LumMotionErrorA
00099  *
00100  *      compute the motion error for the A subsampling pattern
00101  *
00102  * RETURNS:     the error, or some number greater if it is worse
00103  *
00104  * SIDE EFFECTS:    none
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;     /* max value of diff is 255*256 = 65280 */
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  * LumMotionErrorB
00276  *
00277  *      compute the motion error for the B subsampling pattern
00278  *
00279  * RETURNS:     the error, or some number greater if it is worse
00280  *
00281  * SIDE EFFECTS:    none
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;     /* max value of diff is 255*256 = 65280 */
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  * LumMotionErrorC
00453  *
00454  *      compute the motion error for the C subsampling pattern
00455  *
00456  * RETURNS:     the error, or some number greater if it is worse
00457  *
00458  * SIDE EFFECTS:    none
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;     /* max value of diff is 255*256 = 65280 */
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  * LumMotionErrorD
00630  *
00631  *      compute the motion error for the D subsampling pattern
00632  *
00633  * RETURNS:     the error, or some number greater if it is worse
00634  *
00635  * SIDE EFFECTS:    none
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;     /* max value of diff is 255*256 = 65280 */
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 }
 

Powered by Plone

This site conforms to the following standards: