--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoeditorengine/h263decoder/src/rendri.cpp Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,409 @@
+/*
+* 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:
+* Renderer Draw Item Interface.
+*
+*/
+
+
+
+#include "h263dconfig.h"
+#include "rendri.h"
+#include "debug.h"
+
+
+/*
+ * Preprocessor definitions
+ */
+
+
+#define renDriMalloc malloc
+#define renDriCalloc calloc
+#define renDriRealloc realloc
+#define renDriDealloc free
+
+#ifndef renAssert
+ #ifndef assert
+ #include <assert.h>
+ #endif
+ #define renAssert(exp) assert(exp)
+#endif
+
+
+/*
+ * Local function prototypes
+ */
+
+
+/*
+ * Global functions
+ */
+
+/* {{-output"renDriAlloc.txt"}} */
+/*
+ * renDriAlloc
+ *
+ *
+ * Parameters:
+ * width luminance image width in pixels
+ * height luminance image height in pixels
+ *
+ * Function:
+ * This function creates and initializes a new draw item.
+ *
+ * When passed to the renderer the following members of the draw item
+ * must be explicitly set (i.e. these members are not set by this
+ * function):
+ * drawItem->param.dwFlags
+ * drawItem->param.lTime
+ * drawItem->extParam.flags
+ * drawItem->extParam.rate
+ * drawItem->extParam.scale
+ * drawItem->extParam.numOfCodedMBs
+ * drawItem->extParam.snapshotRect
+ * drawItem->extParam.ckInfo
+ * drawItem->retFrame
+ * drawItem->retFrameParam
+ *
+ * Returns:
+ * a pointer to the created
+ * draw item if the function was successful
+ * NULL indicating a general error
+ *
+ *
+ */
+
+renDrawItem_t * renDriAlloc(int width, int height, int fYuvNeeded)
+/* {{-output"renDriAlloc.txt"}} */
+{
+ renDrawItem_t *drawItem;
+ renBitmapInfoHeader_t *bmi;
+ void *data;
+
+ /* Allocate draw item */
+ drawItem = (renDrawItem_t *) renDriMalloc(sizeof(renDrawItem_t));
+ if (drawItem == NULL)
+ return NULL;
+ memset(drawItem, 0, sizeof(renDrawItem_t));
+
+ /* Allocate bitmap info header */
+ bmi = (renBitmapInfoHeader_t *) renDriMalloc(sizeof(renBitmapInfoHeader_t));
+ if (bmi == NULL) {
+ renDriDealloc(drawItem);
+ return NULL;
+ }
+
+ /* Initialize bitmap info header */
+ bmi->biSize = sizeof(renBitmapInfoHeader_t);
+ bmi->biWidth = width;
+ bmi->biHeight = height;
+ if ( fYuvNeeded )
+ {
+ bmi->biSizeImage = (u_int32) width * (u_int32) height * 3 / 2;
+ /* Allocate room for frame data */
+ data = renDriMalloc(bmi->biSizeImage);
+ if (data == NULL) {
+ renDriDealloc(bmi);
+ renDriDealloc(drawItem);
+ return NULL;
+ }
+ }
+ else
+ {
+ bmi->biSizeImage = 0;
+ data = NULL;
+ }
+
+
+ /* Initialize renDrawParam_t member of draw item */
+ /* dwFlags set by application */
+ drawItem->param.lpFormat = bmi;
+ drawItem->param.lpData = data;
+ drawItem->param.cbData = bmi->biSizeImage;
+ /* lTime set by application */
+
+ drawItem->extParam.size = sizeof(renExtDrawParam_t);
+ /* flags set by application */
+ /* rate set by application */
+ /* scale set by application */
+ drawItem->extParam.numOfMBs = (width / 16) * (height / 16);
+ /* numOfCodedMBs set by application */
+ drawItem->extParam.fCodedMBs = (u_char *) renDriMalloc(
+ drawItem->extParam.numOfMBs * sizeof(u_char));
+ if (drawItem->extParam.fCodedMBs == NULL) {
+ renDriDealloc(data);
+ renDriDealloc(bmi);
+ renDriDealloc(drawItem);
+ return NULL;
+ }
+ /* snapshotRect set by application */
+ /* ckInfo set by application */
+
+ /* retFrame and retFrameParam members of draw item are set by application */
+
+ return drawItem;
+}
+
+
+/* {{-output"renDriCopyParameters.txt"}} */
+/*
+ * renDriCopyParameters
+ *
+ *
+ * Parameters:
+ * dstDrawItem destination draw item
+ * srcDrawItem source draw item
+ *
+ * Function:
+ * This function copies the srcDrawItem structure to the dstDrawItem
+ * structure. All other parameters are copied but the actual picture
+ * contents. The function handles nested structures correctly.
+ * No pointers are overwritten but rather the contents corresponding
+ * to a pointer are copied from the source to the destionation structure.
+ *
+ * Returns:
+ * Nothing
+ *
+ *
+ */
+
+void renDriCopyParameters(
+ renDrawItem_t *dstDrawItem,
+ const renDrawItem_t *srcDrawItem)
+/* {{-output"renDriCopyParameters.txt"}} */
+{
+ /* param */
+ {
+ renDrawParam_t *dstDrawParam = &(dstDrawItem->param);
+ const renDrawParam_t *srcDrawParam = &(srcDrawItem->param);
+
+ /* dwFlags */
+ dstDrawParam->dwFlags = srcDrawParam->dwFlags;
+
+ /* lpFormat */
+ {
+ const renBitmapInfoHeader_t *srcBitmapInfoHeader =
+ (renBitmapInfoHeader_t *) srcDrawParam->lpFormat;
+
+ /* biSize indicates the size of the bitmap info header.
+ Thus, copy biSize bytes from source to destination bitmap info
+ header.
+ Note: it is assumed that biSize (and the amount of allocated
+ memory) is the same in both structures. */
+ MEMCPY(
+ dstDrawParam->lpFormat,
+ srcDrawParam->lpFormat,
+ (TInt)srcBitmapInfoHeader->biSize);
+ }
+
+ /* lpData */
+ /* Not copied since contains a pointer to actual picture contents.
+ Set to NULL for clarity. */
+
+ /* cbData */
+ dstDrawParam->cbData = srcDrawParam->cbData;
+
+ /* lTime */
+ dstDrawParam->lTime = srcDrawParam->lTime;
+ }
+
+ /* extParam */
+ {
+ renExtDrawParam_t *dstExtDrawParam = &(dstDrawItem->extParam);
+ const renExtDrawParam_t *srcExtDrawParam = &(srcDrawItem->extParam);
+ u_char *dstFCodedMBs = dstExtDrawParam->fCodedMBs;
+
+ /* fCodedMBs is the only pointer in the structure. Thus, it is easier
+ to temporally save the destionation fCodedMBs, then overwrite each
+ member of the destination structure by corresponding member of
+ the source structure and finally restore fCodedMBs in the destination
+ structure. */
+
+ /* "size" member indicates the size of the structure.
+ Thus, copy size bytes from source to destination structure.
+ Note: it is assumed that size (and the amount of allocated
+ memory) is the same in both structures. */
+ MEMCPY(
+ (void *) dstExtDrawParam,
+ (void *) srcExtDrawParam,
+ (TInt)srcExtDrawParam->size);
+
+ /* Restore destination fCodedMBs. */
+ dstExtDrawParam->fCodedMBs = dstFCodedMBs;
+
+ /* Copy coded MBs array */
+ MEMCPY(
+ (void *) dstFCodedMBs,
+ (void *) srcExtDrawParam->fCodedMBs,
+ (TInt)srcExtDrawParam->numOfMBs);
+ }
+
+}
+
+/* {{-output"renDriCopyFrameData.txt"}} */
+/*
+ * renDriCopyFrameData
+ *
+ * Parameters:
+ * dstDrawItem destination draw item
+ * srcDrawItem source draw item
+ *
+ * Function:
+ * This function copies the actual picture data contents from srcDrawItem
+ * structure to the dstDrawItem structure. No pointers are overwritten
+ * but rather the contents corresponding to a pointer are copied from
+ * the source to the destination structure.
+ *
+ * Returns:
+ * Nothing
+ *
+ */
+
+void renDriCopyFrameData(
+ renDrawItem_t *dstDrawItem,
+ const renDrawItem_t *srcDrawItem)
+/* {{-output"renDriCopyFrameData.txt"}} */
+{
+
+ renDrawParam_t *dstDrawParam = &(dstDrawItem->param);
+ const renDrawParam_t *srcDrawParam = &(srcDrawItem->param);
+ const renBitmapInfoHeader_t *srcBitmapInfoHeader =
+ (renBitmapInfoHeader_t *) srcDrawParam->lpFormat;
+
+ /* biSizeImage indicates the size of the image data in bytes.
+ Copy biSizeImage bytes from source to destination frame data.
+ Note: it is assumed that size (and the amount of allocated
+ memory) is the same in both structures. */
+
+ renAssert(((renBitmapInfoHeader_t *) dstDrawParam->lpFormat)->biSizeImage == srcBitmapInfoHeader->biSizeImage);
+
+ MEMCPY(dstDrawParam->lpData,
+ srcDrawParam->lpData,
+ (TInt)srcBitmapInfoHeader->biSizeImage);
+
+}
+
+/* {{-output"renDriFree.txt"}} */
+/*
+ * renDriFree
+ *
+ *
+ * Parameters:
+ * drawItem a pointer to the draw item to free
+ *
+ * Function:
+ * This function destroys the passed draw item.
+ *
+ * Returns:
+ * Nothing.
+ *
+ *
+ */
+
+void renDriFree(renDrawItem_t *drawItem)
+/* {{-output"renDriFree.txt"}} */
+{
+ renDrawParam_t *param;
+ renExtDrawParam_t *extParam;
+
+ if (!drawItem)
+ return;
+
+ param = &drawItem->param;
+ extParam = &drawItem->extParam;
+
+ if (param) {
+ if (param->lpFormat)
+ renDriDealloc(param->lpFormat);
+ if (param->lpData)
+ renDriDealloc(param->lpData);
+ }
+
+ if (extParam) {
+ if (extParam->fCodedMBs)
+ renDriDealloc(extParam->fCodedMBs);
+ }
+
+ renDriDealloc(drawItem);
+}
+
+
+
+
+
+/* {{-output"renDriYUV.txt"}} */
+/*
+ * renDriYUV
+ *
+ *
+ * Parameters:
+ * drawItem a pointer to a draw item
+ * y, u, v top-left corners of the Y, U and V frames
+ * corresponding to the passed draw item
+ * width, height the dimensions of the luminance frame of
+ * the passed draw item
+ *
+ * Function:
+ * This function returns the Y, U and V pointers to the passed draw item
+ * as well as the dimensions of the luminance frame of the draw item.
+ *
+ * Returns:
+ * REN_OK if the function was successful
+ * REN_ERROR indicating a general error
+ *
+ */
+
+int renDriYUV(renDrawItem_t *drawItem,
+ u_char **y, u_char **u, u_char **v, int *width, int *height)
+/* {{-output"renDriYUV.txt"}} */
+{
+ renBitmapInfoHeader_t *bmi;
+ int32 ySize, uvSize;
+
+ /* If invalid arguments */
+ if (!drawItem || !drawItem->param.lpFormat ||
+ !y || !u || !v || !width || !height) {
+ /* Return error */
+ debPrintf("renGetYUVFromDrawParam: ERROR - null pointer.\n");
+ return REN_ERROR;
+ }
+
+
+ bmi = (renBitmapInfoHeader_t *) drawItem->param.lpFormat;
+
+ *width = bmi->biWidth;
+ *height = labs(bmi->biHeight);
+
+ if ( drawItem->param.lpData == NULL )
+ {
+ // no YUV buffer, parsing-only instance
+ *y = NULL,
+ *u = NULL;
+ *v = NULL;
+
+ return REN_OK;
+ }
+
+ ySize = (*width) * (*height) * sizeof(u_char);
+ uvSize = ySize / 4;
+
+ *y = (u_char *) drawItem->param.lpData;
+ *u = *y + ySize;
+ *v = *u + uvSize;
+
+ return REN_OK;
+}
+
+// End of File