diff -r 951a5db380a0 -r d87d32eab1a9 videoeditorengine/h263decoder/src/block.cpp --- 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