diff -r 000000000000 -r 951a5db380a0 videoeditorengine/avcedit/src/framebuffer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoeditorengine/avcedit/src/framebuffer.cpp Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,289 @@ +/* +* 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: +* +*/ + + +#include +#include "globals.h" +#include "framebuffer.h" + +/* + * Static functions + */ + +static void *allocMem(int blkSize, size_t unitSize); + +static frmBuf_s *initRefFrame(frmBuf_s *recoBuf, frmBuf_s *refBuf); + + + +/* + * + * allocMem: + * + * Parameters: + * blkSize Block size + * unitSize unit size + * + * Function: + * Allocate blkSize*unitSize bytes of memory + * + * Returns: + * Pointer to allocated memory or NULL + * + */ +static void *allocMem(int blkSize, size_t unitSize) +{ + void *mem; + + if ((mem = User::Alloc(blkSize*unitSize)) == NULL) { + PRINT((_L("Cannot allocate memory for frame\n"))); + } + + return mem; +} + + +/* + * + * frmOpen: + * + * Parameters: + * mbData Macroblock state buffer + * width Width of the frame + * height Height of the frame + * + * Function: + * Allocate memory for frame buffer and macroblock state buffer. + * + * Returns: + * Pointer to allocated frame buffer or NULL + * + */ +frmBuf_s *frmOpen(mbAttributes_s **mbData, int width, int height) +{ +// int numPels = width*height; + int numBlksPerLine = width/BLK_SIZE; + int numBlocks = numBlksPerLine*height/BLK_SIZE; + int numMacroblocks = width/MBK_SIZE*height/MBK_SIZE; + frmBuf_s *recoBuf; + mbAttributes_s *mbDataTmp; + + if ((recoBuf = (frmBuf_s *)User::Alloc(sizeof(frmBuf_s))) == NULL) + return NULL; + + memset(recoBuf, 0, sizeof(frmBuf_s)); + + recoBuf->width = width; + recoBuf->height = height; + + if ((mbDataTmp = (mbAttributes_s *)User::Alloc(sizeof(mbAttributes_s))) == NULL) + return NULL; + + memset(mbDataTmp, 0, sizeof(mbAttributes_s)); + + if ((mbDataTmp->sliceMap = (int *)allocMem(numMacroblocks, sizeof(int))) == NULL) + return NULL; + if ((mbDataTmp->mbTypeTable = (int8 *)allocMem(numMacroblocks, sizeof(int8))) == NULL) + return NULL; + if ((mbDataTmp->qpTable = (int8 *)allocMem(numMacroblocks, sizeof(int8))) == NULL) + return NULL; + if ((mbDataTmp->refIdxTable = (int8 *)allocMem(numBlocks, sizeof(int8))) == NULL) + return NULL; + if ((mbDataTmp->cbpTable = (int *)allocMem(numMacroblocks, sizeof(int))) == NULL) + return NULL; + if ((mbDataTmp->motVecTable = (motVec_s *)allocMem(numBlocks, sizeof(motVec_s))) == NULL) + return NULL; + if ((mbDataTmp->ipModesUpPred = (int8 *)allocMem(numBlksPerLine, sizeof(int8))) == NULL) + return NULL; + + if ((mbDataTmp->numCoefUpPred[0] = (int8 *)allocMem(numBlksPerLine, sizeof(int8))) == NULL) + return NULL; + if ((mbDataTmp->numCoefUpPred[1] = (int8 *)allocMem(numBlksPerLine/2, sizeof(int8))) == NULL) + return NULL; + if ((mbDataTmp->numCoefUpPred[2] = (int8 *)allocMem(numBlksPerLine/2, sizeof(int8))) == NULL) + return NULL; + + if ((mbDataTmp->filterModeTab = (int8 *)allocMem(numMacroblocks, sizeof(int8))) == NULL) + return NULL; + if ((mbDataTmp->alphaOffset = (int8 *)allocMem(numMacroblocks, sizeof(int8))) == NULL) + return NULL; + if ((mbDataTmp->betaOffset = (int8 *)allocMem(numMacroblocks, sizeof(int8))) == NULL) + return NULL; + + *mbData = mbDataTmp; + + return recoBuf; +} + + +/* + * + * frmOpenRef: + * + * Parameters: + * width Width of the frame + * height Height of the frame + * + * Function: + * Allocate memory for reference frame buffer + * + * Returns: + * Pointer to Reference frame or NULL + * + */ +frmBuf_s *frmOpenRef(int width, int height) +{ +// int numPels = width*height; + frmBuf_s *ref; + + if ((ref = (frmBuf_s *)User::Alloc(sizeof(frmBuf_s))) == NULL) + return NULL; + + memset(ref, 0, sizeof(frmBuf_s)); + + ref->width = width; + ref->height = height; + ref->imgPadding = 0; + + ref->forOutput = 0; + ref->refType = FRM_NON_REF_PIC; + + return ref; +} + + +/* + * + * frmClose: + * + * Parameters: + * frame Frame + * mbData MB state buffers + * + * Function: + * Deallocate frame buffer and state array memory. + * + * Returns: + * Nothing + * + */ +void frmClose(frmBuf_s *recoBuf, mbAttributes_s *mbData) +{ + if (!recoBuf) + return; + + User::Free(mbData->sliceMap); + User::Free(mbData->mbTypeTable); + User::Free(mbData->qpTable); + User::Free(mbData->refIdxTable); + User::Free(mbData->cbpTable); + User::Free(mbData->motVecTable); + User::Free(mbData->ipModesUpPred); + User::Free(mbData->numCoefUpPred[0]); + User::Free(mbData->numCoefUpPred[1]); + User::Free(mbData->numCoefUpPred[2]); + User::Free(mbData->filterModeTab); + User::Free(mbData->alphaOffset); + User::Free(mbData->betaOffset); + User::Free(recoBuf); + User::Free(mbData); +} + + +/* + * + * frmCloseRef: + * + * Parameters: + * ref Reference frame + * + * Function: + * Deallocate reference frame buffer memory. + * + * Returns: + * Nothing + * + */ +void frmCloseRef(frmBuf_s *ref) +{ + if (!ref) + return; + + User::Free(ref); +} + + +/* + * + * initRefFrame: + * + * Parameters: + * recoBuf Reconstruction frame + * frameBuf Frame buffer to initialize + * + * Function: + * Initialize reference frame buffer refBuf using reconstructed buffer + * recoBuf. If width and height of the reference buffer do not those + * of the reconstructed buffer, reference buffer is reallocated. + * + * Returns: + * Pointer to reference frame + * + */ +static frmBuf_s *initRefFrame(frmBuf_s *recoBuf, frmBuf_s *refBuf) +{ + + /* If pic size is different, reopen with new size */ + if (!refBuf || refBuf->width != recoBuf->width || refBuf->height != recoBuf->height) { + frmCloseRef(refBuf); + if ((refBuf = frmOpenRef(recoBuf->width, recoBuf->height)) == NULL) + return NULL; + } + + /* Copy variables */ + *refBuf = *recoBuf; + + return refBuf; +} + + +/* + * + * frmMakeRefFrame: + * + * Parameters: + * recoBuf Reconstructed frame + * refBuf Reference frame + * + * Function: + * Generate reference frame refBuf using reconstructed frame recoBuf. + * Function does not copy pixel data, but it simply swaps pointers. + * + * Returns: + * Pointer to reference frame + * + */ +frmBuf_s *frmMakeRefFrame(frmBuf_s *recoBuf, frmBuf_s *refBuf) +{ + + refBuf = initRefFrame(recoBuf, refBuf); + if (refBuf == NULL) + return NULL; + + return refBuf; +}