videoeditorengine/h263decoder/src/block.cpp
branchRCL_3
changeset 3 e0b5df5c0969
parent 0 951a5db380a0
child 7 4c409de21d23
--- a/videoeditorengine/h263decoder/src/block.cpp	Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1094 +0,0 @@
-/*
-* Copyright (c) 2010 Ixonos Plc.
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - Initial contribution
-*
-* Contributors:
-* Ixonos Plc
-*
-* Description:  
-* Motion compensation functions.
-*
-*/
-
-
-#include "h263dConfig.h"
-
-#include "block.h"
-
-#include "errcodes.h"
-#include "vdcmvc.h"
-#include "debug.h"
-
-#ifndef blcAssert
-   #define blcAssert assert
-#endif
-#include "blcllcpy.cpp"
-
-/* See the description above. */
-typedef void (* blcCopyBlock_t) (u_char *, u_char *,
-    int, int, int, int, int, int, int, int, int, int, int, int, int);
-
-/* This structure is used to pass a pointer either to blcUVCountRefXY1MV or
-   blcUVCountRefXY4MVs. */
-typedef void (* blcUVCountRefXY_t) 
-   (int, int, int *, int *, int *, int *, int *, int *);
-
-
-/*
- * Local function prototypes
- */
-
-static int blcCopyNormalYPredictionMBWith1MV(
-   blcCopyBlock_t copyBlock,
-   int *mvxArray, int *mvyArray, 
-   u_char *dstYBlk,
-   u_char *srcYFrame,
-   int dstYXPos, int dstYYPos, 
-   int dstYXSize,
-   int srcYXSize, int srcYYSize,
-   int fMVsOverPictureBoundaries, 
-   int rcontrol);
-
-static int blcCopyNormalYPredictionMBWith4MVs(
-   blcCopyBlock_t copyBlock,
-   int *mvxArray, int *mvyArray, 
-   u_char *dstYBlk,
-   u_char *srcYFrame,
-   int dstYXPos, int dstYYPos, 
-   int dstYXSize,
-   int srcYXSize, int srcYYSize,
-   int fMVsOverPictureBoundaries, 
-   int rcontrol);
-
-static int blcCopyUVPredictionBlocks(
-   blcUVCountRefXY_t uvCountSourceXY,
-   blcCopyBlock_t copyBlock,
-   int *mvxArray, int *mvyArray, 
-   u_char *dstUBlk, u_char *dstVBlk,
-   u_char *srcUFrame, u_char *srcVFrame, 
-   int dstUVXPos, int dstUVYPos, 
-   int dstUVXSize,
-   int srcUVXSize, int srcUVYSize,
-   int fMVsOverPictureBoundaries, 
-   int rcontrol);
-
-static void blcHandleRefOverPictBoundariesBC(
-   int xBlkSize, int yBlkSize,
-   int xSize, int ySize, 
-   int subpixelX, int subpixelY, 
-   int *sourceX, int *sourceY,
-   int *xlt0, int *xNormal, int *xgtmax, 
-   int *ylt0, int *yNormal, int *ygtmax);
-
-static int blcIsRefOverPictBoundaries(
-   int xBlkSize, int yBlkSize,
-   int xSize, int ySize, 
-   int subpixelX, int subpixelY, 
-   int sourceX, int sourceY);
-
-static void blcUVCountMVOffset4MVs(
-   int *mvxArray, int *mvyArray,
-   int *offsetX, int *offsetY,
-   int *subpixelX, int *subpixelY);
-
-static void blcUVCountRefXY1MV(
-   int origoX, int origoY,
-   int *mvxArray, int *mvyArray, 
-   int *sourceX, int *sourceY,
-   int *subpixelX, int *subpixelY);
-
-static void blcUVCountRefXY4MVs(
-   int origoX, int origoY,
-   int *mvxArray, int *mvyArray, 
-   int *sourceX, int *sourceY,
-   int *subpixelX, int *subpixelY);
-
-static void blcYCountRefXY(
-   int mvxVal, int mvyVal,
-   int destX, int destY, 
-   int *sourceX, int *sourceY,
-   int *subpixelX, int *subpixelY);
-
-
-/*
- * Module-scope constants
- */
-
-/* Clipping table to sature values to range 0..255 */
-static const u_char wholeClippingTable[4*256] = {
-        0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-        0,   0,   0,   0,   0,   0,   1,   2,   3,   4,
-        5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
-       15,  16,  17,  18,  19,  20,  21,  22,  23,  24,
-       25,  26,  27,  28,  29,  30,  31,  32,  33,  34,
-       35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
-       45,  46,  47,  48,  49,  50,  51,  52,  53,  54,
-       55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
-       65,  66,  67,  68,  69,  70,  71,  72,  73,  74,
-       75,  76,  77,  78,  79,  80,  81,  82,  83,  84,
-       85,  86,  87,  88,  89,  90,  91,  92,  93,  94,
-       95,  96,  97,  98,  99, 100, 101, 102, 103, 104,
-      105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
-      115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
-      125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
-      135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
-      145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
-      155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
-      165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
-      175, 176, 177, 178, 179, 180, 181, 182, 183, 184,
-      185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
-      195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
-      205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
-      215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
-      225, 226, 227, 228, 229, 230, 231, 232, 233, 234,
-      235, 236, 237, 238, 239, 240, 241, 242, 243, 244,
-      245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-      255, 255, 255, 255, 255, 255, 255};
-
-static const u_char * const clippingTable = &wholeClippingTable[512];
-
-
-/*
- * Global functions
- */
-
-/* {{-output"blcAddBlock.txt"}} */
-/*
- * blcAddBlock
- *    
- *
- * Parameters:
- *    block                block array (of 64 pixels)
- *    dstBlk               pointer to present frame in the place,
- *                         where the block is added
- *    xSize                X size of the frame.
- *    mbPlace              flag that indicates the place for the current
- *                         macroblock inside the macroblock row:
- *                            -1 beginning of row
- *                             0 middle of row
- *                             1 end of row
- *    fourMVs              1 if Advanced Prediction Mode is used, otherwise 0
- *    prevDiffBlock        if fourMVs == 1 and mbPlace <= 0 the difference
- *                         block is stored to prevDiffBlock for later use
- *
- * Function:
- *    This function sums the given block into block being currently decoded in
- *    present frame. Parameters are the table consisting a block, a pointer to
- *    the frame at the correct place and the width of the frame.
- *
- * Returns:
- *    Nothing.
- *
- */
-
-void blcAddBlock(int *block, u_char *dstBlk, int xSize,
-   int mbPlace, u_char fourMVs, int *prevDiffBlock)
-/* {{-output"blcAddBlock.txt"}} */
-{
-   int i;
-
-   if (fourMVs && mbPlace <= 0) {
-       MEMCPY(prevDiffBlock, block, 64 * sizeof(int));
-   }
-   else {
-      for(i = 8; i; i--) {
-         *dstBlk++ = clippingTable[*dstBlk + *block++];
-         *dstBlk++ = clippingTable[*dstBlk + *block++];
-         *dstBlk++ = clippingTable[*dstBlk + *block++];
-         *dstBlk++ = clippingTable[*dstBlk + *block++];
-         *dstBlk++ = clippingTable[*dstBlk + *block++];
-         *dstBlk++ = clippingTable[*dstBlk + *block++];
-         *dstBlk++ = clippingTable[*dstBlk + *block++];
-         *dstBlk++ = clippingTable[*dstBlk + *block++];
-         dstBlk += xSize - 8;
-      }
-   }
-}
-
-
-/* {{-output"blcBlockToFrame.txt"}} */
-/*
- * blcBlockToFrame
- *    
- *
- * Parameters:
- *    block        block array (of 64 pixels)
- *    dstBlk       pointer to present frame in the place, where the block is
- *                 written
- *    xSize        X size of the frame.
- *
- * Function:
- *    This function writes the given block into block being currently decoded
- *    in present frame. Parameters are the table consisting a block, a pointer
- *    to the frame at the correct place and the width of the frame.
- *
- * Returns:
- *      Nothing.
- *
- */
-
-void blcBlockToFrame(int *block, u_char *dstBlk, int xSize)
-/* {{-output"blcBlockToFrame.txt"}} */
-{
-   int i;
-
-   for( i = 0; i < 8; i++ )
-   {
-     *dstBlk = clippingTable[ *block ];
-     *(dstBlk+1) = clippingTable[ *(block+1) ];
-     *(dstBlk+2) = clippingTable[ *(block+2) ];
-     *(dstBlk+3) = clippingTable[ *(block+3) ];
-     *(dstBlk+4) = clippingTable[ *(block+4) ];
-     *(dstBlk+5) = clippingTable[ *(block+5) ];
-     *(dstBlk+6) = clippingTable[ *(block+6) ];
-     *(dstBlk+7) = clippingTable[ *(block+7) ];
-     dstBlk += xSize;
-     block += 8;
-   }
-}
-
-
-/* {{-output"blcCopyPredictionMB.txt"}} */
-/*
- * blcCopyPredictionMB
- *    
- *
- * Parameters:
- *    param                      input and output parameters
- *
- * Function:
- *    This function copies one macroblock from previous frame into present
- *    frame at the location of macroblock being currently decoded. 
- *    The location where the macroblock is read is the location of 
- *    the current block changed with motion vectors.
- *
- * Returns:
- *    >= 0                       the function was successful
- *    < 0                        an error occured
- *
- */
-
-int blcCopyPredictionMB(blcCopyPredictionMBParam_t *param)
-/* {{-output"blcCopyPredictionMB.txt"}} */
-{
-   int
-      uvWidth = param->uvWidth,
-      uvHeight = param->uvHeight,
-      yWidth = uvWidth * 2,
-      yHeight = uvHeight * 2,
-      uvDstX = param->uvBlkXCoord,
-      uvDstY = param->uvBlkYCoord,
-      yDstX = uvDstX * 2,
-      yDstY = uvDstY * 2,
-      *mvx = param->mvx, 
-      *mvy = param->mvy,
-      status;
-
-   u_char
-      *dstYBlk = param->currYMBInFrame,
-      *dstUBlk = param->currUBlkInFrame,
-      *dstVBlk = param->currVBlkInFrame,
-      *srcYFrame = param->refY,
-      *srcUFrame = param->refU,
-      *srcVFrame = param->refV;
-
-   blcCopyBlock_t copyBlock = (param->fMVsOverPictureBoundaries) ?
-      blcCopyBlockBC : blcCopyBlockNBC;
-
-   blcAssert(param != NULL);
-   blcAssert(param->rcontrol == 0 || param->rcontrol == 1);
-
-   /* Copy UV prediction blocks */
-   status = blcCopyUVPredictionBlocks(
-      (param->fourMVs) ? 
-         blcUVCountRefXY4MVs : blcUVCountRefXY1MV,
-      copyBlock,
-      mvx, mvy,
-      dstUBlk, dstVBlk,
-      srcUFrame, srcVFrame,
-      uvDstX, uvDstY,
-      uvWidth,
-      uvWidth, uvHeight,
-      param->fMVsOverPictureBoundaries,
-      param->rcontrol);
-
-   if (status < 0) 
-      return status;
-
-   /* If Advanced Prediction is in use */
-   if (param->fAdvancedPrediction) {
-
-        // not supported
-        
-   }
-
-   /* Else normal prediction mode is in use */
-   else { 
-
-      /* Copy Y prediction MB */
-      if(param->fourMVs)
-         status = blcCopyNormalYPredictionMBWith4MVs(
-            copyBlock,
-            mvx, mvy,
-            dstYBlk,
-            srcYFrame,
-            yDstX, yDstY,
-            yWidth,
-            yWidth, yHeight,
-            param->fMVsOverPictureBoundaries,
-            param->rcontrol);
-      else
-         status = blcCopyNormalYPredictionMBWith1MV(
-            copyBlock,
-            mvx, mvy,
-            dstYBlk,
-            srcYFrame,
-            yDstX, yDstY,
-            yWidth,
-            yWidth, yHeight,
-            param->fMVsOverPictureBoundaries,
-            param->rcontrol);
-      if (status < 0)
-         return status;
-   }
-
-   return 0;
-}
-
-
-
-
-
-/*
- *    Local functions
- */
-
-
-
-
-
-/*
- * blcCopyNormalYPredictionMBWith1MV
- *    
- *
- * Parameters:
- *    copyBlock                  a pointer to either blcCopyBlockBC or
- *                               blcCopyBlockNBC (or their Assembler versions)
- *
- *    mvxArray                   an array of four for x component of MVs
- *    mvyArray                   an array of four for y component of MVs
- *                               (Only the first entry of the array is used.)
- *
- *    dstYBlk                    a pointer to the current Y macroblock
- *                               in the destination Y frame
- *
- *    srcYFrame                  the top-left corner of the source Y frame
- *
- *    dstYXPos                   the x coordinate of dstYBlk (in pixels)
- *    dstYYPos                   the y coordinate of dstYBlk (in pixels)
- *
- *    dstYXSize                  the width of the Y destination frame
- *    srcYXSize                  the width of the Y source frame
- *    srcYYSize                  the height of the Y source frame
- *
- *    fMVsOverPictureBoundaries  non-zero if motion vectors may point outside
- *                               picture boundaries, zero otherwise
- *
- *    rcontrol                   RCONTROL (section 6.1.2 of the H.263 standard)
- *
- * Function:
- *    This function copies a luminance prediction macroblock from the given
- *    source frame to the given position of the destination frame.
- *    The prediction macroblock is associated with one motion vector.
- *
- * Returns:
- *    >= 0 if everything is ok
- *    < 0 if an error occured
- *
- */
-
-static int blcCopyNormalYPredictionMBWith1MV(
-   blcCopyBlock_t copyBlock,
-   int *mvxArray, int *mvyArray, 
-   u_char *dstYBlk,
-   u_char *srcYFrame,
-   int dstYXPos, int dstYYPos, 
-   int dstYXSize,
-   int srcYXSize, int srcYYSize,
-   int fMVsOverPictureBoundaries, 
-   int rcontrol)
-{
-   int 
-      mvxVal = *mvxArray, mvyVal = *mvyArray,
-      subpixelX, subpixelY,
-      xlt0, xNormal, xgtmax,
-      ylt0, yNormal, ygtmax,
-      srcXPos, srcYPos;
-   u_char *srcBlk;
-
-   blcYCountRefXY(mvxVal, mvyVal, dstYXPos, dstYYPos, &srcXPos, &srcYPos,
-      &subpixelX, &subpixelY);
-
-   if (fMVsOverPictureBoundaries)
-      blcHandleRefOverPictBoundariesBC(
-         16, 16,
-         srcYXSize, srcYYSize, 
-         subpixelX, subpixelY, 
-         &srcXPos, &srcYPos,
-         &xlt0, &xNormal, &xgtmax, 
-         &ylt0, &yNormal, &ygtmax);
-
-   else {
-      if (blcIsRefOverPictBoundaries(
-         16, 16,
-         srcYXSize, srcYYSize, 
-         subpixelX, subpixelY, 
-         srcXPos, srcYPos))
-         return -1;
-      xlt0 = xgtmax = ylt0 = ygtmax = 0;
-      xNormal = yNormal = 16;
-   }
-
-   srcBlk = srcYFrame + srcYPos * srcYXSize + srcXPos;
-
-   copyBlock(srcBlk, dstYBlk, xlt0, xNormal, xgtmax,
-      ylt0, yNormal, ygtmax, subpixelX, subpixelY,
-      srcYXSize, dstYXSize, 16, 16, rcontrol);
-
-   return 0;
-}
-
-
-/*
- * blcCopyNormalYPredictionMBWith4MVs
- *    
- *
- * Parameters:
- *    See blcCopyNormalYPredictionMBWith1MV.
- *    All 4 entries of mvxArray and mvyArray are used.
- *
- * Function:
- *    This function copies a luminance prediction macroblock from the given
- *    source frame to the given position of the destination frame.
- *    The prediction macroblock is associated with four motion vectors.
- *
- * Returns:
- *    >= 0 if everything is ok
- *    < 0 if an error occured
- *
- */
-
-static int blcCopyNormalYPredictionMBWith4MVs(
-   blcCopyBlock_t copyBlock,
-   int *mvxArray, int *mvyArray, 
-   u_char *dstYBlk,
-   u_char *srcYFrame,
-   int dstYXPos, int dstYYPos, 
-   int dstYXSize,
-   int srcYXSize, int srcYYSize,
-   int fMVsOverPictureBoundaries, 
-   int rcontrol)
-{
-   int 
-      nh, nv, 
-      mvi = 0, 
-      mvxVal, mvyVal,
-      subpixelX, subpixelY,
-      xlt0, xNormal, xgtmax,
-      ylt0, yNormal, ygtmax,
-      srcXPos, srcYPos;
-
-   u_char 
-      *srcBlk, 
-      *origDest; 
-
-   origDest = dstYBlk; 
-   for (nv = 0; nv <= 1; nv++, dstYYPos += 8,
-      origDest += (dstYXSize << 3) - 16, dstYXPos -= 16) {
-      for (nh = 0; nh <= 1; nh++, dstYXPos += 8, origDest += 8, mvi++) { 
-         dstYBlk = origDest; 
-         mvxVal = mvxArray[mvi];
-         mvyVal = mvyArray[mvi];
-
-         blcYCountRefXY(mvxVal, mvyVal, dstYXPos, dstYYPos, &srcXPos, &srcYPos,
-            &subpixelX, &subpixelY);
-
-         if (fMVsOverPictureBoundaries)
-            blcHandleRefOverPictBoundariesBC(
-               8, 8,
-               srcYXSize, srcYYSize, 
-               subpixelX, subpixelY, 
-               &srcXPos, &srcYPos,
-               &xlt0, &xNormal, &xgtmax, 
-               &ylt0, &yNormal, &ygtmax);
-
-         else {
-            if (blcIsRefOverPictBoundaries(
-               8, 8,
-               srcYXSize, srcYYSize, 
-               subpixelX, subpixelY, 
-               srcXPos, srcYPos))
-               return -1;
-            xlt0 = xgtmax = ylt0 = ygtmax = 0;
-            xNormal = yNormal = 8;
-         }
-
-         srcBlk = srcYFrame + srcYPos * srcYXSize + srcXPos; 
-
-         copyBlock(srcBlk, dstYBlk, xlt0, xNormal, xgtmax, 
-            ylt0, yNormal, ygtmax, subpixelX, subpixelY, srcYXSize, 
-            dstYXSize, 8, 8, rcontrol); 
-      } 
-   } 
-
-   return 0;
-}
-
-
-
-/*
- * blcCopyUVPredictionBlocks
- *    
- *
- * Parameters:
- *    uvCountSourceXY            a pointer to either blcUVCountRefXY1MV or 
- *                               blcUVCountRefXY4MVs
- *
- *    copyBlock                  a pointer to either blcCopyBlockBC or
- *                               blcCopyBlockNBC (or their Assembler versions)
- *
- *    mvxArray                   an array of four for x component of MVs
- *    mvyArray                   an array of four for y component of MVs
- *
- *    dstUBlk                    a pointer to the current U block
- *                               in the destination U frame
- *    dstVBlk                    a pointer to the current V block
- *                               in the destination V frame
- *
- *    srcUFrame                  the top-left corner of the source U frame
- *    srcVFrame                  the top-left corner of the source V frame
- *
- *    dstUVXPos                  the x coordinate of dstUBlk
- *    dstUVYPos                  the y coordinate of dstUBlk
- *
- *    dstUVXSize                 the width of the U and V destination frame
- *    srcUVXSize                 the width of the U and V source frame
- *    srcUVYSize                 the height of the U and V source frame
- *
- *    fMVsOverPictureBoundaries  non-zero if motion vectors may point outside
- *                               picture boundaries, zero otherwise
- *
- *    rcontrol                   RCONTROL (section 6.1.2 of the H.263 standard)
- *
- * Function:
- *    This function copies chrominance prediction blocks from the given
- *    source frames to the given positions of the destination frames.
- *
- * Returns:
- *    >= 0 if everything is ok
- *    < 0 if an error occured
- *
- */
-
-static int blcCopyUVPredictionBlocks(
-   blcUVCountRefXY_t uvCountSourceXY,
-   blcCopyBlock_t copyBlock,
-   int *mvxArray, int *mvyArray, 
-   u_char *dstUBlk, u_char *dstVBlk,
-   u_char *srcUFrame, u_char *srcVFrame, 
-   int dstUVXPos, int dstUVYPos, 
-   int dstUVXSize,
-   int srcUVXSize, int srcUVYSize,
-   int fMVsOverPictureBoundaries, 
-   int rcontrol)
-{
-   int
-      srcXPos,
-      srcYPos,
-      subpixelX,
-      subpixelY,
-      xlt0,
-      xNormal,
-      xgtmax,
-      ylt0,
-      yNormal,
-      ygtmax;
-
-   u_char *srcBlk;
-
-   uvCountSourceXY(dstUVXPos, dstUVYPos, mvxArray, mvyArray, 
-       &srcXPos, &srcYPos, &subpixelX, &subpixelY);
-
-   if (fMVsOverPictureBoundaries)
-      blcHandleRefOverPictBoundariesBC(
-         8, 8,
-         srcUVXSize, srcUVYSize, 
-         subpixelX, subpixelY, 
-         &srcXPos, &srcYPos,
-         &xlt0, &xNormal, &xgtmax, 
-         &ylt0, &yNormal, &ygtmax);
-
-   else {
-      if (blcIsRefOverPictBoundaries(
-         8, 8,
-         srcUVXSize, srcUVYSize, 
-         subpixelX, subpixelY, 
-         srcXPos, srcYPos))
-         return -1;
-      xlt0 = xgtmax = ylt0 = ygtmax = 0;
-      xNormal = yNormal = 8;
-   }
-
-   /* U block */ \
-   srcBlk = srcUFrame + srcYPos * srcUVXSize + srcXPos;
-
-   /*deb0p("Copy U block\n");
-   deb1p("srcBlk %x\n", srcBlk);
-   deb1p("dstUBlk %x\n", dstUBlk);
-   deb1p("xlt0 %d\n", xlt0);
-   deb1p("xNormal %d\n", xNormal);
-   deb1p("xgtmax %d\n", xgtmax);
-   deb1p("ylt0 %d\n", ylt0);
-   deb1p("yNormal %d\n", yNormal);
-   deb1p("ygtmax %d\n", ygtmax);
-   deb1p("subpixelX %d\n", subpixelX);
-   deb1p("subpixelY %d\n", subpixelY);
-   deb1p("srcUVXSize %d\n", srcUVXSize);
-   deb1p("dstUVXSize %d\n", dstUVXSize);
-   deb1p("rcontrol %d\n", rcontrol);*/
-
-   copyBlock(srcBlk, dstUBlk, xlt0, xNormal, xgtmax,
-      ylt0, yNormal, ygtmax, subpixelX, subpixelY,
-      srcUVXSize, dstUVXSize, 8, 8, rcontrol);
-
-   /* V block */ \
-   srcBlk = srcVFrame + srcYPos * srcUVXSize + srcXPos;
-
-   copyBlock(srcBlk, dstVBlk, xlt0, xNormal, xgtmax,
-      ylt0, yNormal, ygtmax, subpixelX, subpixelY,
-      srcUVXSize, dstUVXSize, 8, 8, rcontrol);
-
-   return 0;
-}
-
-
-/*
- * blcHandleRefOverPictBoundariesBC
- *    
- *
- * Input parameters:
- *    xBlkSize                   the width of the block to copy
- *    yBlkSize                   the height of the block to copy
- *    xSize                      the width of the frame
- *    ySize                      the height of the frame
- *
- *    subpixelX                  1 if half pixel position is used in X direction
- *    subpixelY                  1 if half pixel position is used in Y direction
- *
- * Input/output parameters:
- *    sourceX                    input: the absolute position of the source
- *    sourceY                    block (may be negative, half-pixel values are
- *                               truncated to the next smaller integer)
- *                               output: the coordinates of the first valid
- *                               pixel in the source block
- *
- * Output parameters:
- *    The next parameters describe a row of source pixels.
- *    xlt0                       the number of the source pixels in the left of
- *                               the image area
- *    xNormal                    the number of the source pixels within 
- *                               the image area
- *    xgtmax                     the number of the source pixels in the right of
- *                               the image area
- *
- *    The next parameters describe a column of source pixels.
- *    ylt0                       the number of the source pixels above 
- *                               the image area
- *    yNormal                    the number of the source pixels withing 
- *                               the image area
- *    ygtmax                     the number of the source pixels below 
- *                               the image area
- *
- * Function:
- *    This function counts how many pixels are outside the picture area
- *    and the coordinates of the first valid pixel in the source block.
- *
- * Returns:
- *    See output parameters.
- *
- */
-
-static void blcHandleRefOverPictBoundariesBC(
-   int xBlkSize, int yBlkSize,
-   int xSize, int ySize, 
-   int subpixelX, int subpixelY, 
-   int *sourceX, int *sourceY,
-   int *xlt0, int *xNormal, int *xgtmax, 
-   int *ylt0, int *yNormal, int *ygtmax)
-{
-   int
-      xSizeMinus = xSize - xBlkSize,
-      ySizeMinus = ySize - yBlkSize;
-
-   if (*sourceX < 0) {
-      *xlt0 = (-(*sourceX) < xBlkSize) ? -(*sourceX) : xBlkSize;
-      *sourceX = 0;
-   }
-   else *xlt0 = 0;
-
-   if (*sourceY < 0) {
-      *ylt0 = (-(*sourceY) < yBlkSize) ? -(*sourceY) : yBlkSize;
-      *sourceY = 0;
-   }
-   else *ylt0 = 0;
-
-   if (*sourceX + subpixelX > xSizeMinus) {
-      if (*sourceX + subpixelX < xSize)
-         *xgtmax = *sourceX + subpixelX - xSizeMinus;
-      else {
-         *xgtmax = xBlkSize;
-         *sourceX = xSize - 1;
-      }
-   }
-   else *xgtmax = 0;
-
-   if (*sourceY + subpixelY > ySizeMinus) {
-      if (*sourceY + subpixelY < ySize)
-         *ygtmax = *sourceY + subpixelY - ySizeMinus;
-      else {
-         *ygtmax = yBlkSize;
-         *sourceY = ySize - 1;
-      }
-   }
-   else *ygtmax = 0;
-
-   *xNormal = xBlkSize - *xgtmax - *xlt0;
-   *yNormal = yBlkSize - *ygtmax - *ylt0;
-}
-
-
-/*
- * blcIsRefOverPictBoundaries
- *    
- *
- * Input parameters:
- *    xBlkSize                   the width of the block to copy
- *    yBlkSize                   the height of the block to copy
- *    xSize                      the width of the frame
- *    ySize                      the height of the frame
- *
- *    subpixelX                  1 if half pixel position is used in X direction
- *    subpixelY                  1 if half pixel position is used in Y direction
- *
- *    sourceX                    the absolute position of the source
- *    sourceY                    block (may be negative, half-pixel values are
- *                               truncated to the next smaller integer)
- *
- * Function:
- *    This function checks if the reference (source, prediction) block
- *    is (partly) outside the picture area.
- *
- * Returns:
- *    1 if the reference block is (partly) outside the picture area
- *    0 if the whole reference block is inside the picture area
- *
- */
-
-static int blcIsRefOverPictBoundaries(
-   int xBlkSize, int yBlkSize,
-   int xSize, int ySize, 
-   int subpixelX, int subpixelY, 
-   int sourceX, int sourceY)
-{
-   if (sourceX < 0)
-      return 1;
-
-   if (sourceY < 0)
-      return 1;
-
-   if (sourceX + subpixelX > xSize - xBlkSize)
-      return 1;
-
-   if (sourceY + subpixelY > ySize - yBlkSize)
-      return 1;
-
-   return 0;
-}
-
-
-
-/*
- * blcUVCountMVOffset4MVs
- *    
- *
- * Input parameters:
- *    mvxArray                   an array of the four horizontal components of
- *                               the motion vectors for a particular macroblock
- *    mvyArray                   an array of the four vertical components of
- *                               the motion vectors for a particular macroblock
- *
- * Output parameters:
- *    offsetX                    the relative position of the source
- *    offsetY                    block (the origo is the destination block, 
- *                               half-pixel values are truncated to the next 
- *                               smaller integer)
- *
- *    subpixelX                  1 if half pixel position is used in X direction
- *    subpixelY                  1 if half pixel position is used in Y direction
- *
- * Function:
- *    This function counts the relative position of the chrominance source block
- *    when it is given the motion vectors for the destination block. The macro
- *    uses interpolation of four motion vectors described in Annex F of H.263
- *    Recommendation.
- *
- * Returns:
- *    See output parameters.
- *
- *    
- *
- */
-
-static void blcUVCountMVOffset4MVs(
-   int *mvxArray, int *mvyArray,
-   int *offsetX, int *offsetY,
-   int *subpixelX, int *subpixelY)
-{
-   /* These arrays define the table 16 in H.263 recommendation which is used
-      for interpolating chrominance motion vectors when four motion vectors
-      per macroblock is used. */
-   static const int
-      halfPixelOrig16[31] =
-         {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
-          0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
-      * const halfPixel16 = &halfPixelOrig16[15],
-      fullPixelOrig16[31] =
-         {-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
-      * const fullPixel16 = &fullPixelOrig16[15];
-
-   int mvSum, pixelPos;
-
-   mvSum = mvxArray[0] + mvxArray[1] + mvxArray[2] + mvxArray[3];
-   pixelPos = (mvSum % 80) / 5;
-   *subpixelX = halfPixel16[pixelPos];
-   *offsetX = (mvSum / 80) + fullPixel16[pixelPos];
-   if (mvSum < 0 && *subpixelX)
-      (*offsetX)--;
-
-   mvSum = mvyArray[0] + mvyArray[1] + mvyArray[2] + mvyArray[3];
-   pixelPos = (mvSum % 80) / 5;
-   *subpixelY = halfPixel16[pixelPos];
-   *offsetY = (mvSum / 80) + fullPixel16[pixelPos];
-   if (mvSum < 0 && *subpixelY)
-      (*offsetY)--;
-}
-
-
-/*
- * blcUVCountRefXY1MV
- * blcUVCountRefXY4MVs
- *    
- *
- * Input parameters:
- *    origoX                     the coordinates of the destination block
- *    origoY
- *
- *    mvxArray                   an array of the four horizontal components of
- *                               the motion vectors for a particular macroblock
- *    mvyArray                   an array of the four vertical components of
- *                               the motion vectors for a particular macroblock
- *                               In blcUVCountRefXY1MV, only the first entry of
- *                               the array is used.
- *
- * Output parameters:
- *    sourceX                    the absolute position of the source
- *    sourceY                    block (may be negative, half-pixel values are
- *                               truncated to the next smaller integer)
- *
- *    subpixelX                  1 if half pixel position is used in X direction
- *    subpixelY                  1 if half pixel position is used in Y direction
- *
- * Function:
- *    These macros count the absolute position of the chrominance source block 
- *    (and sets sourceX, sourceY, subpixelX and subpixelY according to it) 
- *    when it is given the position of the destination block and 
- *    the motion vectors for the destination block. blcUVCountRefXY4MVs
- *    uses interpolation of four motion vectors described in Annex F of H.263
- *    Recommendation. blcUVCountRefXY1MV uses only the first motion vector
- *    of the array as described in chapter 6.1.1 of H.263 Recommendation.
- *
- * Returns:
- *    See output parameters.
- *
- *    
- *
- */
-
-static void blcUVCountRefXY1MV(
-   int origoX, int origoY,
-   int *mvxArray, int *mvyArray, 
-   int *sourceX, int *sourceY,
-   int *subpixelX, int *subpixelY)
-{
-   int mvxVal = *mvxArray, mvyVal = *mvyArray;
-
-   *sourceX = origoX + mvxVal / 20;
-   *sourceY = origoY + mvyVal / 20;
-
-   *subpixelX = (mvxVal % 20) != 0;
-   *subpixelY = (mvyVal % 20) != 0;
-
-   if (mvxVal < 0 && *subpixelX)
-      *sourceX -= 1;
-   if (mvyVal < 0 && *subpixelY)
-      *sourceY -= 1;
-}
-
-
-static void blcUVCountRefXY4MVs(
-   int origoX, int origoY,
-   int *mvxArray, int *mvyArray, 
-   int *sourceX, int *sourceY,
-   int *subpixelX, int *subpixelY)
-{
-   int offX, offY;
-
-   blcUVCountMVOffset4MVs(mvxArray, mvyArray, &offX, &offY, subpixelX, subpixelY);
-   *sourceX = origoX + offX;
-   *sourceY = origoY + offY;
-}
-
-
-/*
- * blcYCountRefXY
- *    
- *
- * Input parameters:
- *    mvxVal                     motion vector components for the block
- *    mvyVal
- *
- *    destX                      the coordinates of the destination block
- *    destY
- *
- * Output parameters:
- *    sourceX                    the absolute position of the source
- *    sourceY                    block (may be negative, half-pixel values are
- *                               truncated to the next smaller integer)
- *
- *    subpixelX                  1 if half pixel position is used in X direction
- *    subpixelY                  1 if half pixel position is used in Y direction
- *
- * Function:
- *    This function counts the absolute position of the luminance source block (and
- *    sets sourceX, sourceY, subpixelX and subpixelY according to it) when it is
- *    given the position of the destination block and a motion vector pointing
- *    to the source block.
- *
- * Returns:
- *    See output parameters.
- *
- *    
- *
- */
-
-static void blcYCountRefXY(
-   int mvxVal, int mvyVal,
-   int destX, int destY, 
-   int *sourceX, int *sourceY,
-   int *subpixelX, int *subpixelY)
-{
-   *sourceX = destX + mvxVal / 10;
-   *sourceY = destY + mvyVal / 10;
-
-   *subpixelX = mvxVal & 1;
-   *subpixelY = mvyVal & 1;
-
-   if (mvxVal < 0 && *subpixelX)
-      *sourceX -= 1;
-   if (mvyVal < 0 && *subpixelY)
-      *sourceY -= 1;
-}
-// End of File