diff -r 951a5db380a0 -r e0b5df5c0969 videoeditorengine/h263decoder/src/blcllcpy.cpp --- a/videoeditorengine/h263decoder/src/blcllcpy.cpp Fri Jan 29 14:08:33 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1065 +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: -* Block copying functions. -* -*/ - - - - -#include "h263dconfig.h" - - -/* - * - * blcMemSetIncBuf - * - * Parameters: - * void HUGE *buf destination buffer - * int ch input value - * size_t count the number of values to put into the buffer - * - * Function: - * This macro sets count bytes of buf into the low-order byte of ch - * and increases buf by count. - * - * Changes: - * buf - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -#define blcMemSetIncBuf(buf, ch, count) \ - MEMSET(buf, ch, count); \ - buf += count - - -/* - * - * blcCopyRowNBC copy a row without border checking - * - * Parameters: - * u_char HUGE *srcMem source row - * u_char HUGE *dstMem destination row - * - * int xlt0 ignored - * int xNormal See blcCopyBlockBC. - * int xgtmax ignored - * - * Function: - * This macro copies a row of pixels and assumes that - * - all pixels are within the image area - * - the pixels are in integer positions - * - * dstMem is increased by xNormal - * srcMem is increased by xNormal - 1 - * - * Changes: - * srcMem - * dstMem - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -#define blcCopyRowNBC(srcMem, dstMem, xlt0, xNormal, xgtmax, roundIncNotUsed) \ -{ \ - MEMCPY(dstMem, srcMem, xNormal); \ - dstMem += xNormal; \ - srcMem += xNormal - 1; \ -} - - -/* - * - * blcCopyRowBC copy a row with border checking - * - * Parameters: - * u_char HUGE *srcMem source row - * u_char HUGE *dstMem destination row - * - * int xlt0 See blcCopyBlockBC. - * int xNormal See blcCopyBlockBC. - * int xgtmax See blcCopyBlockBC. - * - * Function: - * This macro copies a row of pixels and assumes that - * - xlt0 pixels are in the left side of the image area and - * - xgtmax pixels are in the right side of the image area and - * - the pixels are in integer positions - * - * dstMem is increased by xlt0 + xNormal + xgtmax - * srcMem is increased by xNormal - 1 if xNormal > 0 - * - * Changes: - * srcMem - * dstMem - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -#define blcCopyRowBC(srcMem, dstMem, xlt0, xNormal, xgtmax, roundIncNotUsed) \ -{ \ - if (xlt0) MEMSET(dstMem, *srcMem, xlt0); \ - dstMem += xlt0; \ - if (xNormal) blcCopyRowNBC(srcMem, dstMem, xlt0, xNormal, xgtmax, roundIncNotUsed); \ - if (xgtmax) MEMSET(dstMem, *srcMem, xgtmax); \ - dstMem += xgtmax; \ -} - - -/* - * - * blcCopyRowSubXNBC - * - * Parameters: - * u_char HUGE *srcMem source row - * u_char HUGE *dstMem destination row - * - * int xlt0 ignored - * int xNormal See blcCopyBlockBC. - * int xgtmax ignored - * - * roundInc See blcCopyBlockSub*. - * - * Function: - * This macro copies a row of pixels and assumes that - * - all pixels are within the image area - * - the pixels are in integer pixel position in vertical direction - * - the pixels are in half pixel position in horizontal direction - * - * dstMem is increased by xNormal - * srcMem is increased by xNormal - * - * Changes: - * srcMem - * dstMem - * loopVar - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -#define blcCopyRowSubXNBC(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, roundInc) \ -for (loopVar = xNormal; loopVar; loopVar--, srcMem++) \ - *dstMem++ = (u_char) ((*srcMem + *(srcMem + 1) + roundInc) >> 1) - - -/* - * - * blcCopyRowSubXBC - * - * Parameters: - * u_char HUGE *srcMem source row - * u_char HUGE *dstMem destination row - * - * int xlt0 See blcCopyBlockBC. - * int xNormal See blcCopyBlockBC. - * int xgtmax See blcCopyBlockBC. - * - * roundInc See blcCopyBlockSub*. - * - * Function: - * This macro copies a row of pixels and assumes that - * - xlt0 pixels are in the left side of the image area and - * - xgtmax pixels are in the right side of the image area and - * - the pixels are in integer pixel position in vertical direction - * - the pixels are in half pixel position in horizontal direction - * - * dstMem is increased by xlt0 + xNormal + xgtmax - * srcMem is increased by xlt0 + xNormal + xgtmax - * - * Changes: - * srcMem - * dstMem - * loopVar - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -#define blcCopyRowSubXBC(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, roundInc) \ -{ \ - if (xlt0) \ - blcMemSetIncBuf(dstMem, *srcMem, xlt0); \ - blcCopyRowSubXNBC(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, roundInc); \ - if (xgtmax) blcMemSetIncBuf(dstMem, *srcMem, xgtmax); \ -} - - -/* - * - * blcCopyRowSubYNBC - * - * Parameters: - * u_char HUGE *srcMem source row - * u_char HUGE *dstMem destination row - * - * int xlt0 ignored - * int xNormal See blcCopyBlockBC. - * int xgtmax ignored - * - * roundInc See blcCopyBlockSub*. - * - * Function: - * This macro copies a row of pixels and assumes that - * - all pixels are within the image area - * - the pixels are in half pixel position in vertical direction - * - the pixels are in integer pixel position in horizontal direction - * - * dstMem is increased by xNormal - * srcMem is increased by xNormal - 1 if xNormal > 0 - * - * Changes: - * srcMem - * dstMem - * loopVar - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -#define blcCopyRowSubYNBC(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, \ - srcXSize, roundInc) \ -{ \ - for (loopVar = xNormal; loopVar; loopVar--, srcMem++) \ - *dstMem++ = (u_char) ((*srcMem + *(srcMem + srcXSize) + roundInc) >> 1); \ - if (xNormal) srcMem--; \ -} - - -/* - * - * blcCopyRowSubYBC - * - * Parameters: - * u_char HUGE *srcMem source row - * u_char HUGE *dstMem destination row - * - * int xlt0 See blcCopyBlockBC. - * int xNormal See blcCopyBlockBC. - * int xgtmax See blcCopyBlockBC. - * - * roundInc See blcCopyBlockSub*. - * - * Function: - * This macro copies a row of pixels and assumes that - * - xlt0 pixels are in the left side of the image area and - * - xgtmax pixels are in the right side of the image area and - * - the pixels are in half pixel position in vertical direction - * - the pixels are in integer pixel position in horizontal direction - * - * dstMem is increased by xlt0 + xNormal + xgtmax - * srcMem is increased by xNormal - 1 if xNormal > 0 - * - * Changes: - * srcMem - * dstMem - * loopVar - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -#define blcCopyRowSubYBC(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, \ - srcXSize, roundInc) \ -{ \ - if (xlt0) { \ - *dstMem++ = (u_char) ((*srcMem + *(srcMem + srcXSize) + roundInc) >> 1); \ - if (xlt0 > 1) blcMemSetIncBuf(dstMem, *(dstMem - 1), xlt0 - 1); \ - } \ - blcCopyRowSubYNBC(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, \ - srcXSize, roundInc); \ - if (xgtmax) { \ - if (xNormal) { \ - blcMemSetIncBuf(dstMem, *(dstMem - 1), xgtmax); \ - } \ - else { \ - *dstMem++ = (u_char) ((*srcMem + *(srcMem + srcXSize) + roundInc) >> 1); \ - if (xgtmax > 1) blcMemSetIncBuf(dstMem, *(dstMem - 1), xgtmax - 1); \ - } \ - } \ -} - - -/* - * - * blcCopyRowSubXYNBC - * - * Parameters: - * u_char HUGE *srcMem source row - * u_char HUGE *dstMem destination row - * - * int xlt0 ignored - * int xNormal See blcCopyBlockBC. - * int xgtmax ignored - * - * roundInc See blcCopyBlockSub*. - * - * Function: - * This macro copies a row of pixels and assumes that - * - all pixels are within the image area - * - the pixels are in half pixel position in vertical direction - * - the pixels are in half pixel position in horizontal direction - * - * dstMem is increased by xNormal - * srcMem is increased by xNormal - * - * Changes: - * srcMem - * dstMem - * loopVar - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -#define blcCopyRowSubXYNBC(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, \ - srcXSize, roundInc) \ -for (loopVar = xNormal; loopVar; loopVar--, srcMem++) \ - *dstMem++ = (u_char) ((*srcMem + *(srcMem + 1) + *(srcMem + srcXSize) + \ - *(srcMem + srcXSize + 1) + roundInc) >> 2) - - -/* - * - * blcCopyOutPicXPixelSubXYRoundInc1 - * blcCopyOutPicXPixelSubXYRoundInc2 - * - * Parameters: - * u_char HUGE *srcMem source row - * u_char HUGE *dstMem destination row - * srcXSize number of pixels (bytes) in source row - * - * Function: - * These macros copy one pixel which lies horizontally outside the picture - * area assuming that - * - the pixels are in half pixel position in vertical direction - * - the pixels are in half pixel position in horizontal direction - * - * If roundInc is 2, the macro takes advantage of the fact that - * (A + B + C + D + roundInc) / 4 = (A + A + C + C + 2) / 4 = - * (A + C + 1) / 2 - * when using the notation of section 6.1.2 of the H.263 recommendation. - * - * dstMem is increased by 1 - * - * Changes: - * dstMem - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -#define blcCopyOutPicXPixelSubXYRoundInc2(srcMem, dstMem, srcXSize) \ - *dstMem++ = (u_char) ((*srcMem + *(srcMem + srcXSize) + 1) >> 1) - -#define blcCopyOutPicXPixelSubXYRoundInc1(srcMem, dstMem, srcXSize) \ - *dstMem++ = (u_char) ((((*srcMem) << 1) + ((*(srcMem + srcXSize)) << 1) + 1) >> 2) - - -/* - * - * blcCopyRowSubXYBC - * - * Parameters: - * u_char HUGE *srcMem source row - * u_char HUGE *dstMem destination row - * - * int xlt0 ignored - * int xNormal See blcCopyBlockBC. - * int xgtmax ignored - * - * roundInc See blcCopyBlockSub*. - * - * Function: - * This macro copies a row of pixels and assumes that - * - xlt0 pixels are in the left side of the image area and - * - xgtmax pixels are in the right side of the image area and - * - the pixels are in half pixel position in vertical direction - * - the pixels are in half pixel position in horizontal direction - * - * dstMem is increased by xNormal - * srcMem is increased by xNormal - * - * Changes: - * srcMem - * dstMem - * loopVar - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -#define blcCopyRowSubXYBC(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, \ - srcXSize, roundInc) \ -{ \ - if (xlt0) { \ - blcCopyOutPicXPixelSubXYRoundInc ## roundInc(srcMem, dstMem, srcXSize); \ - if (xlt0 > 1) blcMemSetIncBuf(dstMem, *(dstMem - 1), xlt0 - 1); \ - } \ - blcCopyRowSubXYNBC(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, \ - srcXSize, roundInc); \ - if (xgtmax) { \ - blcCopyOutPicXPixelSubXYRoundInc ## roundInc(srcMem, dstMem, srcXSize); \ - if (xgtmax > 1) blcMemSetIncBuf(dstMem, *(dstMem - 1), xgtmax - 1); \ - } \ -} - - -/* - * - * blcCopyOutPicRowSubXYRoundInc1 - * blcCopyOutPicRowSubXYRoundInc2 - * - * Parameters: - * u_char HUGE *srcMem source row - * u_char HUGE *dstMem destination row - * srcXSize number of pixels (bytes) in source row - * - * Function: - * These macros copy one row which lies vertically outside the picture - * area assuming that - * - the pixels are in half pixel position in vertical direction - * - the pixels are in half pixel position in horizontal direction - * - * If roundInc is 2, the macro takes advantage of the fact that - * (A + B + C + D + roundInc) / 4 = (A + A + B + B + 2) / 4 = - * (A + B + 1) / 2 - * when using the notation of section 6.1.2 of the H.263 recommendation. - * - * Changes: - * srcMem - * dstMem - * loopVar - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -#define blcCopyOutPicRowSubXYRoundInc2(borderCheck, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, loopVar, srcXSize) \ - blcCopyRowSubX ## borderCheck(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, 1) - -#define blcCopyOutPicRowSubXYRoundInc1NBC(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, srcXSize) \ - for (loopVar = xNormal; loopVar; loopVar--, srcMem++) \ - *dstMem++ = (u_char) ((((*srcMem) << 1) + ((*(srcMem + 1)) << 1) + 1) >> 2) - -#define blcCopyOutPicRowSubXYRoundInc1BC(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, srcXSize) \ -{ \ - if (xlt0) {\ - blcMemSetIncBuf(dstMem, *(srcMem), xlt0); \ - } \ - blcCopyOutPicRowSubXYRoundInc1NBC(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar, srcXSize); \ - if (xgtmax) { \ - blcMemSetIncBuf(dstMem, *(srcMem), xgtmax); \ - } \ -} - -#define blcCopyOutPicRowSubXYRoundInc1(borderCheck, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, loopVar, srcXSize) \ - blcCopyOutPicRowSubXYRoundInc1 ## borderCheck(srcMem, dstMem, \ - xlt0, xNormal, xgtmax, loopVar, srcXSize) - - -/* - * - * Integer pixel position (x and y picture boundary checks respectively): - * blcCopyBlockNoSubNBCBC - * blcCopyBlockNoSubBCNBC - * blcCopyBlockNoSubNBCNBC - * blcCopyBlockNoSubBCBC - * - * Half pixel position in horizontal direction: - * blcCopyBlockSubXNBC - * blcCopyBlockSubXBC - * - * Half pixel position in vertical direction: - * blcCopyBlockSubYNBC - * blcCopyBlockSubYBC - * - * Half pixel position in horizontal and vertical direction: - * blcCopyBlockSubXYNBC - * blcCopyBlockSubXYBC - * - * NBC means that all pixels are within the vertical range of the image area. - * BC means that ylt0 pixels are above the image area and ygtmax pixels are - * below the image area. - * - * Parameters: - * Note that some parameters are not included into every macro. - * - * routineName corresponding row copying macro name - * - * u_char HUGE *srcMem source block - * u_char HUGE *dstMem destination block - * - * int xlt0 See blcCopyBlockBC. - * int xNormal See blcCopyBlockBC. - * int xgtmax See blcCopyBlockBC. - * - * int ylt0 See blcCopyBlockBC. - * int yNormal See blcCopyBlockBC. - * int ygtmax See blcCopyBlockBC. - * - * loopVar1, loopVar2 loop variables - * - * srcXSize the horizontal size of the source image - * dstXSize the horizontal size of the destination image - * blkXSize the horizontal size of the block to be copied, - * should be equal to xlt0 + xNormal + xgtmax - * - * srcInc increment to srcMem (after row copying) - * to get the next row - * dstInc increment to dstMem (after row copying) - * to get the next row - * - * roundInc for subpixel functions only: - * for interpolation in X or Y directions: - * roundInc = 1 - RCONTROL, i.e. - * 1 if RCONTROL == 0, - * 0 if RCONTROL == 1, - * for interpolation in X and Y directions: - * roundInc = 2 - RCONTROL, i.e. - * 2 if RCONTROL == 0, - * 1 if RCONTROL == 1 - * - * Function: - * These macros copy a block of pixels. - * - * Changes: - * srcMem - * dstMem - * loopVar1 - * loopVar2 - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - - -#define blcCopyBlockNoSubNBC(routineName, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc) \ -for (loopVar1 = yNormal; loopVar1; loopVar1--) { \ - routineName(srcMem, dstMem, xlt0, xNormal, xgtmax, 0); \ - srcMem += srcInc; \ - dstMem += dstInc; \ -} - -#define blcCopyBlockNoSubNBCBC(routineName, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc) \ -blcCopyBlockNoSubNBC(routineName, srcMem, dstMem, xlt0, xNormal, xgtmax, \ - ylt0, yNormal, ygtmax, loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, \ - srcInc, dstInc) - -#define blcCopyBlockNoSubBCNBC(routineName, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc) \ -{ \ - if (ylt0) { \ - for (loopVar2 = ylt0; loopVar2; loopVar2--, dstMem += dstXSize) \ - MEMCPY(dstMem, srcMem, blkXSize); \ - } \ -\ - blcCopyBlockNoSubNBC(routineName, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc); \ -\ - if (ygtmax) { \ - if (yNormal) srcMem -= srcXSize; \ - for (loopVar2 = ygtmax; loopVar2; loopVar2--, dstMem += dstXSize) \ - MEMCPY(dstMem, srcMem, blkXSize); \ - } \ -} - -#define blcCopyBlockNoSubNBCNBC(routineName, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc) \ -for (loopVar1 = yNormal; loopVar1; loopVar1--) { \ - MEMCPY(dstMem, srcMem, xNormal); \ - dstMem += dstXSize; \ - srcMem += srcXSize; \ -} - -#define blcCopyBlockNoSubBCBC(routineName, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc) \ -{ \ - if (ylt0) { \ - routineName(srcMem, dstMem, xlt0, xNormal, xgtmax, 0); \ - dstMem += dstInc; \ - for (loopVar2 = ylt0 - 1; loopVar2; loopVar2--, dstMem += dstXSize) \ - MEMCPY(dstMem, dstMem - dstXSize, blkXSize); \ - if (xNormal) srcMem -= (xNormal - 1); \ - } \ -\ - blcCopyBlockNoSubNBC(routineName, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc); \ -\ - if (ygtmax) { \ - if (yNormal) srcMem -= srcXSize; \ - routineName(srcMem, dstMem, xlt0, xNormal, xgtmax, 0); \ - dstMem += dstInc; \ - for (loopVar2 = ygtmax - 1; loopVar2; loopVar2--, dstMem += dstXSize) \ - MEMCPY(dstMem, dstMem - dstXSize, blkXSize); \ - } \ -} - -#define blcCopyBlockSubXNBC(routineName, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, dstXSize, blkXSize, srcInc, dstInc, roundInc) \ -for (loopVar1 = yNormal; loopVar1; loopVar1--) { \ - routineName(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar2, roundInc); \ - srcMem += srcInc; \ - dstMem += dstInc; \ -} - -#define blcCopyBlockSubXBC(routineName, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, dstXSize, blkXSize, srcInc, dstInc, roundInc) \ -{ \ - if (ylt0) { \ - routineName(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar2, roundInc); \ - dstMem += dstInc; \ - for (loopVar2 = ylt0 - 1; loopVar2; loopVar2--, dstMem += dstXSize) \ - MEMCPY(dstMem, dstMem - dstXSize, blkXSize); \ - srcMem -= xNormal; \ - } \ -\ - blcCopyBlockSubXNBC(routineName, srcMem, dstMem, xlt0, xNormal, xgtmax, \ - ylt0, yNormal, ygtmax, loopVar1, loopVar2, dstXSize, blkXSize, \ - srcInc, dstInc, roundInc); \ -\ - if (ygtmax) { \ - if (!yNormal) { \ - routineName(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar2, roundInc); \ - dstMem += dstInc; \ - } \ - for (loopVar2 = ygtmax - !yNormal; loopVar2; loopVar2--, \ - dstMem += dstXSize) \ - MEMCPY(dstMem, dstMem - dstXSize, blkXSize); \ - } \ -} - -#define blcCopyBlockSubYNBC(routineName, yoffRoutine, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc, roundInc) \ -for (loopVar1 = yNormal; loopVar1; loopVar1--) { \ - routineName(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar2, srcXSize, roundInc); \ - srcMem += srcInc; \ - dstMem += dstInc; \ -} \ - -#define blcCopyBlockSubYBC(normRoutine, yoffRoutine, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc, roundInc) \ -{ \ - if (ylt0) { \ - yoffRoutine(srcMem, dstMem, xlt0, xNormal, xgtmax, roundInc); \ - dstMem += dstInc; \ - for (loopVar2 = ylt0 - 1; loopVar2; loopVar2--, dstMem += dstXSize) \ - MEMCPY(dstMem, dstMem - dstXSize, blkXSize); \ - if (xNormal) srcMem -= (xNormal - 1); \ - } \ -\ - blcCopyBlockSubYNBC(normRoutine, yoffRoutine, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc, roundInc); \ -\ - if (ygtmax) { \ - yoffRoutine(srcMem, dstMem, xlt0, xNormal, xgtmax, roundInc); \ - dstMem += dstInc; \ - for (loopVar2 = ygtmax - 1; loopVar2; loopVar2--, dstMem += dstXSize) \ - MEMCPY(dstMem, dstMem - dstXSize, blkXSize); \ - } \ -} - -#define blcCopyBlockSubXYNBC(routineName, notUsed, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc, roundInc) \ -for (loopVar1 = yNormal; loopVar1; loopVar1--) { \ - routineName(srcMem, dstMem, xlt0, xNormal, xgtmax, loopVar2, \ - srcXSize, roundInc); \ - srcMem += srcInc; \ - dstMem += dstInc; \ -} \ - -#define blcCopyBlockSubXYBC(normRoutine, xoffBorderCheck, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc, roundInc) \ -{ \ - if (ylt0) { \ - blcCopyOutPicRowSubXYRoundInc ## roundInc(xoffBorderCheck, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, loopVar2, srcXSize); \ - dstMem += dstInc; \ - for (loopVar2 = ylt0 - 1; loopVar2; loopVar2--, dstMem += dstXSize) \ - MEMCPY(dstMem, dstMem - dstXSize, blkXSize); \ - srcMem -= xNormal; \ - } \ -\ - blcCopyBlockSubXYNBC(normRoutine, yoffRoutine, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc, roundInc); \ -\ - if (ygtmax) { \ - blcCopyOutPicRowSubXYRoundInc ## roundInc(xoffBorderCheck, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, loopVar2, srcXSize); \ - dstMem += dstInc; \ - for (loopVar2 = ygtmax - 1; loopVar2; loopVar2--, dstMem += dstXSize) \ - MEMCPY(dstMem, dstMem - dstXSize, blkXSize); \ - } \ -} - - -/* - * - * blcCopyBlockBCVar - * - * Parameters: - * xoffBorderCheck NBC if all the pixels of the block are within - * the horizontal range of the image area - * BC otherwise - * yoffBorderCheck NBC if all the pixels of the block are within - * the vertical range of the image area - * BC otherwise - * - * u_char HUGE *srcMem source block - * u_char HUGE *dstMem destination block - * - * int xlt0 See blcCopyBlockBC. - * int xNormal See blcCopyBlockBC. - * int xgtmax See blcCopyBlockBC. - * int ylt0 See blcCopyBlockBC. - * int yNormal See blcCopyBlockBC. - * int ygtmax See blcCopyBlockBC. - * int subpixelX See blcCopyBlockBC. - * int subpixelY See blcCopyBlockBC. - * - * loopVar1, loopVar2 loop variables - * - * srcXSize the horizontal size of the source image - * dstXSize the horizontal size of the destination image - * - * blkXSize the horizontal size of the block to be copied, - * should be equal to xlt0 + xNormal + xgtmax - * blkYSize the vertical size of the block to be copied, - * should be equal to ylt0 + yNormal + ygtmax - * - * dstInc increment to dstMem (after row copying) - * to get the next row - * - * rcontrol See blcCopyBlockBC. - * - * Function: - * This macro copies a block with appropriate image border crossing - * checkings. - * - * Changes: - * srcMem - * dstMem - * loopVar1 - * loopVar2 - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -#define blcCopyBlockBCVar(xoffBorderCheck, yoffBorderCheck, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, blkYSize, dstInc, \ - rcontrol) \ -{ \ - if (subpixelX) { \ - if (subpixelY) { \ - int srcInc = srcXSize - xNormal; \ - if (rcontrol) { \ - blcCopyBlockSubXY ## yoffBorderCheck( \ - blcCopyRowSubXY ## xoffBorderCheck, \ - xoffBorderCheck, srcMem, \ - dstMem, xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc, 1); \ - } \ - else { \ - blcCopyBlockSubXY ## yoffBorderCheck( \ - blcCopyRowSubXY ## xoffBorderCheck, \ - xoffBorderCheck, srcMem, \ - dstMem, xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc, 2); \ - } \ - } \ - else /* !subPixelY */ { \ - int srcInc = srcXSize - xNormal; \ - if (rcontrol) { \ - blcCopyBlockSubX ## yoffBorderCheck( \ - blcCopyRowSubX ## xoffBorderCheck, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, dstXSize, blkXSize, srcInc, dstInc, 0) \ - } \ - else { \ - blcCopyBlockSubX ## yoffBorderCheck( \ - blcCopyRowSubX ## xoffBorderCheck, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, dstXSize, blkXSize, srcInc, dstInc, 1) \ - } \ - } \ - } \ -\ - else /* !subpixelX */ { \ - if (subpixelY) { \ - int srcInc = srcXSize - xNormal + ((xNormal) ? 1 : 0); \ - if (rcontrol) { \ - blcCopyBlockSubY ## yoffBorderCheck( \ - blcCopyRowSubY ## xoffBorderCheck, \ - blcCopyRow ## yoffBorderCheck, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc, 0); \ - } \ - else { \ - blcCopyBlockSubY ## yoffBorderCheck( \ - blcCopyRowSubY ## xoffBorderCheck, \ - blcCopyRow ## yoffBorderCheck, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc, 1); \ - } \ - } \ - else /* !subpixelY */ { \ - int srcInc = srcXSize - xNormal + ((xNormal) ? 1 : 0); \ - blcCopyBlockNoSub ## yoffBorderCheck ## xoffBorderCheck ( \ - blcCopyRow ## xoffBorderCheck, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, \ - loopVar1, loopVar2, srcXSize, dstXSize, blkXSize, srcInc, dstInc); \ - } \ - } \ -} - - -/* - * - * blcCopyBlockBC - * blcCopyBlockNBC - * - * Parameters: - * u_char HUGE *srcMem source block - * u_char HUGE *dstMem destination block - * - * The next parameters describe a row of source pixels. - * int xlt0 the number of the source pixels in the left of - * the image area - * int xNormal the number of the source pixels within the image - * area - * int xgtmax the number of the source pixels in the right of - * the image area - * - * The next parameters describe a column of source pixels. - * int ylt0 the number of the source pixels above the image area - * int yNormal the number of the source pixels withing the image - * area - * int ygtmax the number of the source pixels below the image area - * - * int subpixelX 1 if source pixels are in half pixel position in - * horizontal direction, 0 otherwise - * int subpixelY 1 if source pixels are in half pixel position in - * vertical direction, 0 otherwise - * - * srcXSize the horizontal size of the source image - * dstXSize the horizontal size of the destination image - * - * blkXSize the horizontal size of the block to be copied, - * should be equal to xlt0 + xNormal + xgtmax - * blkYSize the vertical size of the block to be copied, - * should be equal to ylt0 + yNormal + ygtmax - * rcontrol 0 or 1, RCONTROL as in section 6.1.2. of H.263 - * version 2 - * - * Function: - * blcCopyBlockBC macro copies a block according to unrestricted motion - * vector mode, i.e. it checks if the motion vector points outside the - * image area, i.e. xlt0, xgtmax, ylt0 or ygtmax != 0. - * blcCopyBlockNBC macro copies a block assuming that the whole block is - * inside the image area. blcCopyBlockNBC is used in normal prediction - * mode (no options are used). - * - * Changes: - * srcMem - * dstMem - * - * Returns: - * Nothing. - * - * Error codes: - * None. - * - */ - -/*#define BLC_COPY_BLOCK_MACROS*/ -#ifdef BLC_COPY_BLOCK_MACROS -#define blcCopyBlockBC(srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, \ - srcXSize, dstXSize, blkXSize, blkYSize, rcontrol) \ -{ \ - int \ - dstInc = dstXSize - blkXSize, \ - i, j; \ -\ - if (xNormal == blkXSize) { \ - if (yNormal == blkYSize) { \ - blcCopyBlockBCVar(NBC, NBC, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, \ - j, i, srcXSize, dstXSize, blkXSize, blkYSize, dstInc, rcontrol); \ - } \ - else { \ - blcCopyBlockBCVar(NBC, BC, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, \ - j, i, srcXSize, dstXSize, blkXSize, blkYSize, dstInc, rcontrol); \ - } \ - } \ - else { \ - if (yNormal == blkYSize) { \ - blcCopyBlockBCVar(BC, NBC, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, \ - j, i, srcXSize, dstXSize, blkXSize, blkYSize, dstInc, rcontrol); \ - } \ - else { \ - blcCopyBlockBCVar(BC, BC, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, \ - j, i, srcXSize, dstXSize, blkXSize, blkYSize, dstInc, rcontrol); \ - } \ - } \ -} - -#define blcCopyBlockNBC(srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, \ - srcXSize, dstXSize, blkXSize, blkYSize, rcontrol) \ -{ \ - int \ - dstInc = dstXSize - blkXSize, \ - i, j; \ -\ - blcCopyBlockBCVar(NBC, NBC, srcMem, dstMem, \ - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, \ - j, i, srcXSize, dstXSize, blkXSize, blkYSize, dstInc, rcontrol); \ -} - -#else -static void blcCopyBlockBC(u_char HUGE *srcMem, u_char HUGE *dstMem, - int xlt0, int xNormal, int xgtmax, int ylt0, int yNormal, int ygtmax, - int subpixelX, int subpixelY, - int srcXSize, int dstXSize, int blkXSize, int blkYSize, int rcontrol) -{ - int - dstInc = dstXSize - blkXSize, - i, j; - - if (xNormal == blkXSize) { - if (yNormal == blkYSize) { - blcCopyBlockBCVar(NBC, NBC, srcMem, dstMem, - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, - j, i, srcXSize, dstXSize, blkXSize, blkYSize, dstInc, rcontrol); - } - else { - blcCopyBlockBCVar(NBC, BC, srcMem, dstMem, - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, - j, i, srcXSize, dstXSize, blkXSize, blkYSize, dstInc, rcontrol); - } - } - else { - if (yNormal == blkYSize) { - blcCopyBlockBCVar(BC, NBC, srcMem, dstMem, - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, - j, i, srcXSize, dstXSize, blkXSize, blkYSize, dstInc, rcontrol); - } - else { - blcCopyBlockBCVar(BC, BC, srcMem, dstMem, - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, - j, i, srcXSize, dstXSize, blkXSize, blkYSize, dstInc, rcontrol); - } - } -} - -static void blcCopyBlockNBC(u_char HUGE *srcMem, u_char HUGE *dstMem, - int xlt0, int xNormal, int xgtmax, int ylt0, int yNormal, int ygtmax, - int subpixelX, int subpixelY, - int srcXSize, int dstXSize, int blkXSize, int blkYSize, int rcontrol) -{ - int - dstInc = dstXSize - blkXSize, - i, j; - - blcCopyBlockBCVar(NBC, NBC, srcMem, dstMem, - xlt0, xNormal, xgtmax, ylt0, yNormal, ygtmax, subpixelX, subpixelY, - j, i, srcXSize, dstXSize, blkXSize, blkYSize, dstInc, rcontrol); -} -#endif - - -// End of file