summaryrefslogtreecommitdiffstats
path: root/libvideoeditor/vss/src/M4xVSS_internal.c
diff options
context:
space:
mode:
Diffstat (limited to 'libvideoeditor/vss/src/M4xVSS_internal.c')
-rwxr-xr-xlibvideoeditor/vss/src/M4xVSS_internal.c4889
1 files changed, 0 insertions, 4889 deletions
diff --git a/libvideoeditor/vss/src/M4xVSS_internal.c b/libvideoeditor/vss/src/M4xVSS_internal.c
deleted file mode 100755
index 84959ec..0000000
--- a/libvideoeditor/vss/src/M4xVSS_internal.c
+++ /dev/null
@@ -1,4889 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- ******************************************************************************
- * @file M4xVSS_internal.c
- * @brief Internal functions of extended Video Studio Service (Video Studio 2.1)
- * @note
- ******************************************************************************
- */
-#include "M4OSA_Debug.h"
-#include "M4OSA_CharStar.h"
-
-#include "NXPSW_CompilerSwitches.h"
-
-#include "M4VSS3GPP_API.h"
-#include "M4VSS3GPP_ErrorCodes.h"
-
-#include "M4xVSS_API.h"
-#include "M4xVSS_Internal.h"
-
-/*for rgb16 color effect*/
-#include "M4VIFI_Defines.h"
-#include "M4VIFI_Clip.h"
-
-/**
- * component includes */
-#include "M4VFL_transition.h" /**< video effects */
-
-/* Internal header file of VSS is included because of MMS use case */
-#include "M4VSS3GPP_InternalTypes.h"
-
-/*Exif header files to add image rendering support (cropping, black borders)*/
-#include "M4EXIFC_CommonAPI.h"
-// StageFright encoders require %16 resolution
-#include "M4ENCODER_common.h"
-
-#define TRANSPARENT_COLOR 0x7E0
-
-/* Prototype of M4VIFI_xVSS_RGB565toYUV420 function (avoid green effect of transparency color) */
-M4VIFI_UInt8 M4VIFI_xVSS_RGB565toYUV420(void *pUserData, M4VIFI_ImagePlane *pPlaneIn,
- M4VIFI_ImagePlane *pPlaneOut);
-
-
-/*special MCS function used only in VideoArtist and VideoStudio to open the media in the normal
- mode. That way the media duration is accurate*/
-extern M4OSA_ERR M4MCS_open_normalMode(M4MCS_Context pContext, M4OSA_Void* pFileIn,
- M4VIDEOEDITING_FileType InputFileType,
- M4OSA_Void* pFileOut, M4OSA_Void* pTempFile);
-
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalStartTranscoding(M4OSA_Context pContext)
- * @brief This function initializes MCS (3GP transcoder) with the given
- * parameters
- * @note The transcoding parameters are given by the internal xVSS context.
- * This context contains a pointer on the current element of the
- * chained list of MCS parameters.
- *
- * @param pContext (IN) Pointer on the xVSS edit context
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL
- * @return M4ERR_ALLOC: Memory allocation has failed
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalStartTranscoding(M4OSA_Context pContext,
- M4OSA_UInt32 *rotationDegree)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4OSA_ERR err;
- M4MCS_Context mcs_context;
- M4MCS_OutputParams Params;
- M4MCS_EncodingParams Rates;
- M4OSA_UInt32 i;
- M4VIDEOEDITING_ClipProperties clipProps;
-
- err = M4MCS_init(&mcs_context, xVSS_context->pFileReadPtr, xVSS_context->pFileWritePtr);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("Error in M4MCS_init: 0x%x", err);
- return err;
- }
-
- err = M4MCS_open(mcs_context, xVSS_context->pMCScurrentParams->pFileIn,
- xVSS_context->pMCScurrentParams->InputFileType,
- xVSS_context->pMCScurrentParams->pFileOut,
- xVSS_context->pMCScurrentParams->pFileTemp);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("Error in M4MCS_open: 0x%x", err);
- M4MCS_abort(mcs_context);
- return err;
- }
-
- /** Get the clip properties
- */
- err = M4MCS_getInputFileProperties(mcs_context, &clipProps);
- if (err != M4NO_ERROR) {
- M4OSA_TRACE1_1("Error in M4MCS_getInputFileProperties: 0x%x", err);
- M4MCS_abort(mcs_context);
- return err;
- }
- *rotationDegree = clipProps.videoRotationDegrees;
-
- /**
- * Fill MCS parameters with the parameters contained in the current element of the
- MCS parameters chained list */
- Params.OutputFileType = xVSS_context->pMCScurrentParams->OutputFileType;
- Params.OutputVideoFormat = xVSS_context->pMCScurrentParams->OutputVideoFormat;
- Params.outputVideoProfile= xVSS_context->pMCScurrentParams->outputVideoProfile;
- Params.outputVideoLevel = xVSS_context->pMCScurrentParams->outputVideoLevel;
- Params.OutputVideoFrameSize = xVSS_context->pMCScurrentParams->OutputVideoFrameSize;
- Params.OutputVideoFrameRate = xVSS_context->pMCScurrentParams->OutputVideoFrameRate;
- Params.OutputAudioFormat = xVSS_context->pMCScurrentParams->OutputAudioFormat;
- Params.OutputAudioSamplingFrequency =
- xVSS_context->pMCScurrentParams->OutputAudioSamplingFrequency;
- Params.bAudioMono = xVSS_context->pMCScurrentParams->bAudioMono;
- Params.pOutputPCMfile = M4OSA_NULL;
- /*FB 2008/10/20: add media rendering parameter to keep aspect ratio*/
- switch(xVSS_context->pMCScurrentParams->MediaRendering)
- {
- case M4xVSS_kResizing:
- Params.MediaRendering = M4MCS_kResizing;
- break;
- case M4xVSS_kCropping:
- Params.MediaRendering = M4MCS_kCropping;
- break;
- case M4xVSS_kBlackBorders:
- Params.MediaRendering = M4MCS_kBlackBorders;
- break;
- default:
- break;
- }
- /**/
- // new params after integrating MCS 2.0
- // Set the number of audio effects; 0 for now.
- Params.nbEffects = 0;
-
- // Set the audio effect; null for now.
- Params.pEffects = NULL;
-
- // Set the audio effect; null for now.
- Params.bDiscardExif = M4OSA_FALSE;
-
- // Set the audio effect; null for now.
- Params.bAdjustOrientation = M4OSA_FALSE;
- // new params after integrating MCS 2.0
-
- /**
- * Set output parameters */
- err = M4MCS_setOutputParams(mcs_context, &Params);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("Error in M4MCS_setOutputParams: 0x%x", err);
- M4MCS_abort(mcs_context);
- return err;
- }
-
- Rates.OutputVideoBitrate = xVSS_context->pMCScurrentParams->OutputVideoBitrate;
- Rates.OutputAudioBitrate = xVSS_context->pMCScurrentParams->OutputAudioBitrate;
- Rates.BeginCutTime = 0;
- Rates.EndCutTime = 0;
- Rates.OutputFileSize = 0;
-
- /*FB: transcoding per parts*/
- Rates.BeginCutTime = xVSS_context->pMCScurrentParams->BeginCutTime;
- Rates.EndCutTime = xVSS_context->pMCScurrentParams->EndCutTime;
- Rates.OutputVideoTimescale = xVSS_context->pMCScurrentParams->OutputVideoTimescale;
-
- err = M4MCS_setEncodingParams(mcs_context, &Rates);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("Error in M4MCS_setEncodingParams: 0x%x", err);
- M4MCS_abort(mcs_context);
- return err;
- }
-
- err = M4MCS_checkParamsAndStart(mcs_context);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("Error in M4MCS_checkParamsAndStart: 0x%x", err);
- M4MCS_abort(mcs_context);
- return err;
- }
-
- /**
- * Save MCS context to be able to call MCS step function in M4xVSS_step function */
- xVSS_context->pMCS_Ctxt = mcs_context;
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalStopTranscoding(M4OSA_Context pContext)
- * @brief This function cleans up MCS (3GP transcoder)
- * @note
- *
- * @param pContext (IN) Pointer on the xVSS edit context
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL
- * @return M4ERR_ALLOC: Memory allocation has failed
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalStopTranscoding(M4OSA_Context pContext)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4OSA_ERR err;
-
- err = M4MCS_close(xVSS_context->pMCS_Ctxt);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalStopTranscoding: Error in M4MCS_close: 0x%x", err);
- M4MCS_abort(xVSS_context->pMCS_Ctxt);
- return err;
- }
-
- /**
- * Free this MCS instance */
- err = M4MCS_cleanUp(xVSS_context->pMCS_Ctxt);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalStopTranscoding: Error in M4MCS_cleanUp: 0x%x", err);
- return err;
- }
-
- xVSS_context->pMCS_Ctxt = M4OSA_NULL;
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * M4OSA_ERR M4xVSS_internalConvertAndResizeARGB8888toYUV420(M4OSA_Void* pFileIn,
- * M4OSA_FileReadPointer* pFileReadPtr,
- * M4VIFI_ImagePlane* pImagePlanes,
- * M4OSA_UInt32 width,
- * M4OSA_UInt32 height);
- * @brief It Coverts and resizes a ARGB8888 image to YUV420
- * @note
- * @param pFileIn (IN) The Image input file
- * @param pFileReadPtr (IN) Pointer on filesystem functions
- * @param pImagePlanes (IN/OUT) Pointer on YUV420 output planes allocated by the user
- * ARGB8888 image will be converted and resized to output
- * YUV420 plane size
- *@param width (IN) width of the ARGB8888
- *@param height (IN) height of the ARGB8888
- * @return M4NO_ERROR: No error
- * @return M4ERR_ALLOC: memory error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-
-M4OSA_ERR M4xVSS_internalConvertAndResizeARGB8888toYUV420(M4OSA_Void* pFileIn,
- M4OSA_FileReadPointer* pFileReadPtr,
- M4VIFI_ImagePlane* pImagePlanes,
- M4OSA_UInt32 width,M4OSA_UInt32 height)
-{
- M4OSA_Context pARGBIn;
- M4VIFI_ImagePlane rgbPlane1 ,rgbPlane2;
- M4OSA_UInt32 frameSize_argb=(width * height * 4);
- M4OSA_UInt32 frameSize = (width * height * 3); //Size of RGB888 data.
- M4OSA_UInt32 i = 0,j= 0;
- M4OSA_ERR err=M4NO_ERROR;
-
-
- M4OSA_UInt8 *pTmpData = (M4OSA_UInt8*) M4OSA_32bitAlignedMalloc(frameSize_argb,
- M4VS, (M4OSA_Char*)"Image argb data");
- M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 Entering :");
- if(pTmpData == M4OSA_NULL) {
- M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 :\
- Failed to allocate memory for Image clip");
- return M4ERR_ALLOC;
- }
-
- M4OSA_TRACE1_2("M4xVSS_internalConvertAndResizeARGB8888toYUV420 :width and height %d %d",
- width ,height);
- /* Get file size (mandatory for chunk decoding) */
- err = pFileReadPtr->openRead(&pARGBIn, pFileIn, M4OSA_kFileRead);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_2("M4xVSS_internalConvertAndResizeARGB8888toYUV420 :\
- Can't open input ARGB8888 file %s, error: 0x%x\n",pFileIn, err);
- free(pTmpData);
- pTmpData = M4OSA_NULL;
- goto cleanup;
- }
-
- err = pFileReadPtr->readData(pARGBIn,(M4OSA_MemAddr8)pTmpData, &frameSize_argb);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_2("M4xVSS_internalConvertAndResizeARGB8888toYUV420 Can't close ARGB8888\
- file %s, error: 0x%x\n",pFileIn, err);
- pFileReadPtr->closeRead(pARGBIn);
- free(pTmpData);
- pTmpData = M4OSA_NULL;
- goto cleanup;
- }
-
- err = pFileReadPtr->closeRead(pARGBIn);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_2("M4xVSS_internalConvertAndResizeARGB8888toYUV420 Can't close ARGB8888 \
- file %s, error: 0x%x\n",pFileIn, err);
- free(pTmpData);
- pTmpData = M4OSA_NULL;
- goto cleanup;
- }
-
- rgbPlane1.pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize, M4VS,
- (M4OSA_Char*)"Image clip RGB888 data");
- if(rgbPlane1.pac_data == M4OSA_NULL)
- {
- M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 \
- Failed to allocate memory for Image clip");
- free(pTmpData);
- return M4ERR_ALLOC;
- }
-
- rgbPlane1.u_height = height;
- rgbPlane1.u_width = width;
- rgbPlane1.u_stride = width*3;
- rgbPlane1.u_topleft = 0;
-
-
- /** Remove the alpha channel */
- for (i=0, j = 0; i < frameSize_argb; i++) {
- if ((i % 4) == 0) continue;
- rgbPlane1.pac_data[j] = pTmpData[i];
- j++;
- }
- free(pTmpData);
-
- /* To Check if resizing is required with color conversion */
- if(width != pImagePlanes->u_width || height != pImagePlanes->u_height)
- {
- M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 Resizing :");
- frameSize = ( pImagePlanes->u_width * pImagePlanes->u_height * 3);
- rgbPlane2.pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize, M4VS,
- (M4OSA_Char*)"Image clip RGB888 data");
- if(rgbPlane2.pac_data == M4OSA_NULL)
- {
- M4OSA_TRACE1_0("Failed to allocate memory for Image clip");
- free(pTmpData);
- return M4ERR_ALLOC;
- }
- rgbPlane2.u_height = pImagePlanes->u_height;
- rgbPlane2.u_width = pImagePlanes->u_width;
- rgbPlane2.u_stride = pImagePlanes->u_width*3;
- rgbPlane2.u_topleft = 0;
-
- /* Resizing RGB888 to RGB888 */
- err = M4VIFI_ResizeBilinearRGB888toRGB888(M4OSA_NULL, &rgbPlane1, &rgbPlane2);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("error when converting from Resize RGB888 to RGB888: 0x%x\n", err);
- free(rgbPlane2.pac_data);
- free(rgbPlane1.pac_data);
- return err;
- }
- /*Converting Resized RGB888 to YUV420 */
- err = M4VIFI_RGB888toYUV420(M4OSA_NULL, &rgbPlane2, pImagePlanes);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("error when converting from RGB888 to YUV: 0x%x\n", err);
- free(rgbPlane2.pac_data);
- free(rgbPlane1.pac_data);
- return err;
- }
- free(rgbPlane2.pac_data);
- free(rgbPlane1.pac_data);
-
- M4OSA_TRACE1_0("RGB to YUV done");
-
-
- }
- else
- {
- M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 NO Resizing :");
- err = M4VIFI_RGB888toYUV420(M4OSA_NULL, &rgbPlane1, pImagePlanes);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("error when converting from RGB to YUV: 0x%x\n", err);
- }
- free(rgbPlane1.pac_data);
-
- M4OSA_TRACE1_0("RGB to YUV done");
- }
-cleanup:
- M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 leaving :");
- return err;
-}
-
-/**
- ******************************************************************************
- * M4OSA_ERR M4xVSS_internalConvertARGB8888toYUV420(M4OSA_Void* pFileIn,
- * M4OSA_FileReadPointer* pFileReadPtr,
- * M4VIFI_ImagePlane* pImagePlanes,
- * M4OSA_UInt32 width,
- * M4OSA_UInt32 height);
- * @brief It Coverts a ARGB8888 image to YUV420
- * @note
- * @param pFileIn (IN) The Image input file
- * @param pFileReadPtr (IN) Pointer on filesystem functions
- * @param pImagePlanes (IN/OUT) Pointer on YUV420 output planes allocated by the user
- * ARGB8888 image will be converted and resized to output
- * YUV420 plane size
- * @param width (IN) width of the ARGB8888
- * @param height (IN) height of the ARGB8888
- * @return M4NO_ERROR: No error
- * @return M4ERR_ALLOC: memory error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-
-M4OSA_ERR M4xVSS_internalConvertARGB8888toYUV420(M4OSA_Void* pFileIn,
- M4OSA_FileReadPointer* pFileReadPtr,
- M4VIFI_ImagePlane** pImagePlanes,
- M4OSA_UInt32 width,M4OSA_UInt32 height)
-{
- M4OSA_ERR err = M4NO_ERROR;
- M4VIFI_ImagePlane *yuvPlane = M4OSA_NULL;
-
- yuvPlane = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc(3*sizeof(M4VIFI_ImagePlane),
- M4VS, (M4OSA_Char*)"M4xVSS_internalConvertRGBtoYUV: Output plane YUV");
- if(yuvPlane == M4OSA_NULL) {
- M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 :\
- Failed to allocate memory for Image clip");
- return M4ERR_ALLOC;
- }
- yuvPlane[0].u_height = height;
- yuvPlane[0].u_width = width;
- yuvPlane[0].u_stride = width;
- yuvPlane[0].u_topleft = 0;
- yuvPlane[0].pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(yuvPlane[0].u_height \
- * yuvPlane[0].u_width * 1.5, M4VS, (M4OSA_Char*)"imageClip YUV data");
-
- yuvPlane[1].u_height = yuvPlane[0].u_height >>1;
- yuvPlane[1].u_width = yuvPlane[0].u_width >> 1;
- yuvPlane[1].u_stride = yuvPlane[1].u_width;
- yuvPlane[1].u_topleft = 0;
- yuvPlane[1].pac_data = (M4VIFI_UInt8*)(yuvPlane[0].pac_data + yuvPlane[0].u_height \
- * yuvPlane[0].u_width);
-
- yuvPlane[2].u_height = yuvPlane[0].u_height >>1;
- yuvPlane[2].u_width = yuvPlane[0].u_width >> 1;
- yuvPlane[2].u_stride = yuvPlane[2].u_width;
- yuvPlane[2].u_topleft = 0;
- yuvPlane[2].pac_data = (M4VIFI_UInt8*)(yuvPlane[1].pac_data + yuvPlane[1].u_height \
- * yuvPlane[1].u_width);
- err = M4xVSS_internalConvertAndResizeARGB8888toYUV420( pFileIn,pFileReadPtr,
- yuvPlane, width, height);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalConvertAndResizeARGB8888toYUV420 return error: 0x%x\n", err);
- free(yuvPlane);
- return err;
- }
-
- *pImagePlanes = yuvPlane;
-
- M4OSA_TRACE1_0("M4xVSS_internalConvertARGB8888toYUV420 :Leaving");
- return err;
-
-}
-
-/**
- ******************************************************************************
- * M4OSA_ERR M4xVSS_PictureCallbackFct (M4OSA_Void* pPictureCtxt,
- * M4VIFI_ImagePlane* pImagePlanes,
- * M4OSA_UInt32* pPictureDuration);
- * @brief It feeds the PTO3GPP with YUV420 pictures.
- * @note This function is given to the PTO3GPP in the M4PTO3GPP_Params structure
- * @param pContext (IN) The integrator own context
- * @param pImagePlanes(IN/OUT) Pointer to an array of three valid image planes
- * @param pPictureDuration(OUT) Duration of the returned picture
- *
- * @return M4NO_ERROR: No error
- * @return M4PTO3GPP_WAR_LAST_PICTURE: The returned image is the last one
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_PictureCallbackFct(M4OSA_Void* pPictureCtxt, M4VIFI_ImagePlane* pImagePlanes,
- M4OSA_Double* pPictureDuration)
-{
- M4OSA_ERR err = M4NO_ERROR;
- M4OSA_UInt8 last_frame_flag = 0;
- M4xVSS_PictureCallbackCtxt* pC = (M4xVSS_PictureCallbackCtxt*) (pPictureCtxt);
-
- /*Used for pan&zoom*/
- M4OSA_UInt8 tempPanzoomXa = 0;
- M4OSA_UInt8 tempPanzoomXb = 0;
- M4AIR_Params Params;
- /**/
-
- /*Used for cropping and black borders*/
- M4OSA_Context pPictureContext = M4OSA_NULL;
- M4OSA_FilePosition pictureSize = 0 ;
- M4OSA_UInt8* pictureBuffer = M4OSA_NULL;
- //M4EXIFC_Context pExifContext = M4OSA_NULL;
- M4EXIFC_BasicTags pBasicTags;
- M4VIFI_ImagePlane pImagePlanes1 = pImagePlanes[0];
- M4VIFI_ImagePlane pImagePlanes2 = pImagePlanes[1];
- M4VIFI_ImagePlane pImagePlanes3 = pImagePlanes[2];
- /**/
-
- /**
- * Check input parameters */
- M4OSA_DEBUG_IF2((M4OSA_NULL==pPictureCtxt), M4ERR_PARAMETER,
- "M4xVSS_PictureCallbackFct: pPictureCtxt is M4OSA_NULL");
- M4OSA_DEBUG_IF2((M4OSA_NULL==pImagePlanes), M4ERR_PARAMETER,
- "M4xVSS_PictureCallbackFct: pImagePlanes is M4OSA_NULL");
- M4OSA_DEBUG_IF2((M4OSA_NULL==pPictureDuration), M4ERR_PARAMETER,
- "M4xVSS_PictureCallbackFct: pPictureDuration is M4OSA_NULL");
- M4OSA_TRACE1_0("M4xVSS_PictureCallbackFct :Entering");
- /*PR P4ME00003181 In case the image number is 0, pan&zoom can not be used*/
- if(M4OSA_TRUE == pC->m_pPto3GPPparams->isPanZoom && pC->m_NbImage == 0)
- {
- pC->m_pPto3GPPparams->isPanZoom = M4OSA_FALSE;
- }
-
- /*If no cropping/black borders or pan&zoom, just decode and resize the picture*/
- if(pC->m_mediaRendering == M4xVSS_kResizing && M4OSA_FALSE == pC->m_pPto3GPPparams->isPanZoom)
- {
- /**
- * Convert and resize input ARGB8888 file to YUV420 */
- /*To support ARGB8888 : */
- M4OSA_TRACE1_2("M4xVSS_PictureCallbackFct 1: width and heght %d %d",
- pC->m_pPto3GPPparams->width,pC->m_pPto3GPPparams->height);
- err = M4xVSS_internalConvertAndResizeARGB8888toYUV420(pC->m_FileIn,
- pC->m_pFileReadPtr, pImagePlanes,pC->m_pPto3GPPparams->width,
- pC->m_pPto3GPPparams->height);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct: Error when decoding JPEG: 0x%x\n", err);
- return err;
- }
- }
- /*In case of cropping, black borders or pan&zoom, call the EXIF reader and the AIR*/
- else
- {
- /**
- * Computes ratios */
- if(pC->m_pDecodedPlane == M4OSA_NULL)
- {
- /**
- * Convert input ARGB8888 file to YUV420 */
- M4OSA_TRACE1_2("M4xVSS_PictureCallbackFct 2: width and heght %d %d",
- pC->m_pPto3GPPparams->width,pC->m_pPto3GPPparams->height);
- err = M4xVSS_internalConvertARGB8888toYUV420(pC->m_FileIn, pC->m_pFileReadPtr,
- &(pC->m_pDecodedPlane),pC->m_pPto3GPPparams->width,pC->m_pPto3GPPparams->height);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct: Error when decoding JPEG: 0x%x\n", err);
- if(pC->m_pDecodedPlane != M4OSA_NULL)
- {
- /* YUV420 planar is returned but allocation is made only once
- (contigous planes in memory) */
- if(pC->m_pDecodedPlane->pac_data != M4OSA_NULL)
- {
- free(pC->m_pDecodedPlane->pac_data);
- }
- free(pC->m_pDecodedPlane);
- pC->m_pDecodedPlane = M4OSA_NULL;
- }
- return err;
- }
- }
-
- /*Initialize AIR Params*/
- Params.m_inputCoord.m_x = 0;
- Params.m_inputCoord.m_y = 0;
- Params.m_inputSize.m_height = pC->m_pDecodedPlane->u_height;
- Params.m_inputSize.m_width = pC->m_pDecodedPlane->u_width;
- Params.m_outputSize.m_width = pImagePlanes->u_width;
- Params.m_outputSize.m_height = pImagePlanes->u_height;
- Params.m_bOutputStripe = M4OSA_FALSE;
- Params.m_outputOrientation = M4COMMON_kOrientationTopLeft;
-
- /*Initialize Exif params structure*/
- pBasicTags.orientation = M4COMMON_kOrientationUnknown;
-
- /**
- Pan&zoom params*/
- if(M4OSA_TRUE == pC->m_pPto3GPPparams->isPanZoom)
- {
- /*Save ratio values, they can be reused if the new ratios are 0*/
- tempPanzoomXa = (M4OSA_UInt8)pC->m_pPto3GPPparams->PanZoomXa;
- tempPanzoomXb = (M4OSA_UInt8)pC->m_pPto3GPPparams->PanZoomXb;
- /*Check that the ratio is not 0*/
- /*Check (a) parameters*/
- if(pC->m_pPto3GPPparams->PanZoomXa == 0)
- {
- M4OSA_UInt8 maxRatio = 0;
- if(pC->m_pPto3GPPparams->PanZoomTopleftXa >=
- pC->m_pPto3GPPparams->PanZoomTopleftYa)
- {
- /*The ratio is 0, that means the area of the picture defined with (a)
- parameters is bigger than the image size*/
- if(pC->m_pPto3GPPparams->PanZoomTopleftXa + tempPanzoomXa > 1000)
- {
- /*The oversize is maxRatio*/
- maxRatio = pC->m_pPto3GPPparams->PanZoomTopleftXa + tempPanzoomXa - 1000;
- }
- }
- else
- {
- /*The ratio is 0, that means the area of the picture defined with (a)
- parameters is bigger than the image size*/
- if(pC->m_pPto3GPPparams->PanZoomTopleftYa + tempPanzoomXa > 1000)
- {
- /*The oversize is maxRatio*/
- maxRatio = pC->m_pPto3GPPparams->PanZoomTopleftYa + tempPanzoomXa - 1000;
- }
- }
- /*Modify the (a) parameters:*/
- if(pC->m_pPto3GPPparams->PanZoomTopleftXa >= maxRatio)
- {
- /*The (a) topleft parameters can be moved to keep the same area size*/
- pC->m_pPto3GPPparams->PanZoomTopleftXa -= maxRatio;
- }
- else
- {
- /*Move the (a) topleft parameter to 0 but the ratio will be also further
- modified to match the image size*/
- pC->m_pPto3GPPparams->PanZoomTopleftXa = 0;
- }
- if(pC->m_pPto3GPPparams->PanZoomTopleftYa >= maxRatio)
- {
- /*The (a) topleft parameters can be moved to keep the same area size*/
- pC->m_pPto3GPPparams->PanZoomTopleftYa -= maxRatio;
- }
- else
- {
- /*Move the (a) topleft parameter to 0 but the ratio will be also further
- modified to match the image size*/
- pC->m_pPto3GPPparams->PanZoomTopleftYa = 0;
- }
- /*The new ratio is the original one*/
- pC->m_pPto3GPPparams->PanZoomXa = tempPanzoomXa;
- if(pC->m_pPto3GPPparams->PanZoomXa + pC->m_pPto3GPPparams->PanZoomTopleftXa > 1000)
- {
- /*Change the ratio if the area of the picture defined with (a) parameters is
- bigger than the image size*/
- pC->m_pPto3GPPparams->PanZoomXa = 1000 - pC->m_pPto3GPPparams->PanZoomTopleftXa;
- }
- if(pC->m_pPto3GPPparams->PanZoomXa + pC->m_pPto3GPPparams->PanZoomTopleftYa > 1000)
- {
- /*Change the ratio if the area of the picture defined with (a) parameters is
- bigger than the image size*/
- pC->m_pPto3GPPparams->PanZoomXa = 1000 - pC->m_pPto3GPPparams->PanZoomTopleftYa;
- }
- }
- /*Check (b) parameters*/
- if(pC->m_pPto3GPPparams->PanZoomXb == 0)
- {
- M4OSA_UInt8 maxRatio = 0;
- if(pC->m_pPto3GPPparams->PanZoomTopleftXb >=
- pC->m_pPto3GPPparams->PanZoomTopleftYb)
- {
- /*The ratio is 0, that means the area of the picture defined with (b)
- parameters is bigger than the image size*/
- if(pC->m_pPto3GPPparams->PanZoomTopleftXb + tempPanzoomXb > 1000)
- {
- /*The oversize is maxRatio*/
- maxRatio = pC->m_pPto3GPPparams->PanZoomTopleftXb + tempPanzoomXb - 1000;
- }
- }
- else
- {
- /*The ratio is 0, that means the area of the picture defined with (b)
- parameters is bigger than the image size*/
- if(pC->m_pPto3GPPparams->PanZoomTopleftYb + tempPanzoomXb > 1000)
- {
- /*The oversize is maxRatio*/
- maxRatio = pC->m_pPto3GPPparams->PanZoomTopleftYb + tempPanzoomXb - 1000;
- }
- }
- /*Modify the (b) parameters:*/
- if(pC->m_pPto3GPPparams->PanZoomTopleftXb >= maxRatio)
- {
- /*The (b) topleft parameters can be moved to keep the same area size*/
- pC->m_pPto3GPPparams->PanZoomTopleftXb -= maxRatio;
- }
- else
- {
- /*Move the (b) topleft parameter to 0 but the ratio will be also further
- modified to match the image size*/
- pC->m_pPto3GPPparams->PanZoomTopleftXb = 0;
- }
- if(pC->m_pPto3GPPparams->PanZoomTopleftYb >= maxRatio)
- {
- /*The (b) topleft parameters can be moved to keep the same area size*/
- pC->m_pPto3GPPparams->PanZoomTopleftYb -= maxRatio;
- }
- else
- {
- /*Move the (b) topleft parameter to 0 but the ratio will be also further
- modified to match the image size*/
- pC->m_pPto3GPPparams->PanZoomTopleftYb = 0;
- }
- /*The new ratio is the original one*/
- pC->m_pPto3GPPparams->PanZoomXb = tempPanzoomXb;
- if(pC->m_pPto3GPPparams->PanZoomXb + pC->m_pPto3GPPparams->PanZoomTopleftXb > 1000)
- {
- /*Change the ratio if the area of the picture defined with (b) parameters is
- bigger than the image size*/
- pC->m_pPto3GPPparams->PanZoomXb = 1000 - pC->m_pPto3GPPparams->PanZoomTopleftXb;
- }
- if(pC->m_pPto3GPPparams->PanZoomXb + pC->m_pPto3GPPparams->PanZoomTopleftYb > 1000)
- {
- /*Change the ratio if the area of the picture defined with (b) parameters is
- bigger than the image size*/
- pC->m_pPto3GPPparams->PanZoomXb = 1000 - pC->m_pPto3GPPparams->PanZoomTopleftYb;
- }
- }
-
- /**
- * Computes AIR parameters */
-/* Params.m_inputCoord.m_x = (M4OSA_UInt32)(pC->m_pDecodedPlane->u_width *
- (pC->m_pPto3GPPparams->PanZoomTopleftXa +
- (M4OSA_Int16)((pC->m_pPto3GPPparams->PanZoomTopleftXb \
- - pC->m_pPto3GPPparams->PanZoomTopleftXa) *
- pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage)) / 100;
- Params.m_inputCoord.m_y = (M4OSA_UInt32)(pC->m_pDecodedPlane->u_height *
- (pC->m_pPto3GPPparams->PanZoomTopleftYa +
- (M4OSA_Int16)((pC->m_pPto3GPPparams->PanZoomTopleftYb\
- - pC->m_pPto3GPPparams->PanZoomTopleftYa) *
- pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage)) / 100;
-
- Params.m_inputSize.m_width = (M4OSA_UInt32)(pC->m_pDecodedPlane->u_width *
- (pC->m_pPto3GPPparams->PanZoomXa +
- (M4OSA_Int16)((pC->m_pPto3GPPparams->PanZoomXb - pC->m_pPto3GPPparams->PanZoomXa) *
- pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage)) / 100;
-
- Params.m_inputSize.m_height = (M4OSA_UInt32)(pC->m_pDecodedPlane->u_height *
- (pC->m_pPto3GPPparams->PanZoomXa +
- (M4OSA_Int16)((pC->m_pPto3GPPparams->PanZoomXb - pC->m_pPto3GPPparams->PanZoomXa) *
- pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage)) / 100;
- */
- // Instead of using pC->m_NbImage we have to use (pC->m_NbImage-1) as pC->m_ImageCounter
- // will be x-1 max for x no. of frames
- Params.m_inputCoord.m_x = (M4OSA_UInt32)((((M4OSA_Double)pC->m_pDecodedPlane->u_width *
- (pC->m_pPto3GPPparams->PanZoomTopleftXa +
- (M4OSA_Double)((M4OSA_Double)(pC->m_pPto3GPPparams->PanZoomTopleftXb\
- - pC->m_pPto3GPPparams->PanZoomTopleftXa) *
- pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage-1)) / 1000));
- Params.m_inputCoord.m_y =
- (M4OSA_UInt32)((((M4OSA_Double)pC->m_pDecodedPlane->u_height *
- (pC->m_pPto3GPPparams->PanZoomTopleftYa +
- (M4OSA_Double)((M4OSA_Double)(pC->m_pPto3GPPparams->PanZoomTopleftYb\
- - pC->m_pPto3GPPparams->PanZoomTopleftYa) *
- pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage-1)) / 1000));
-
- Params.m_inputSize.m_width =
- (M4OSA_UInt32)((((M4OSA_Double)pC->m_pDecodedPlane->u_width *
- (pC->m_pPto3GPPparams->PanZoomXa +
- (M4OSA_Double)((M4OSA_Double)(pC->m_pPto3GPPparams->PanZoomXb\
- - pC->m_pPto3GPPparams->PanZoomXa) *
- pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage-1)) / 1000));
-
- Params.m_inputSize.m_height =
- (M4OSA_UInt32)((((M4OSA_Double)pC->m_pDecodedPlane->u_height *
- (pC->m_pPto3GPPparams->PanZoomXa +
- (M4OSA_Double)((M4OSA_Double)(pC->m_pPto3GPPparams->PanZoomXb \
- - pC->m_pPto3GPPparams->PanZoomXa) *
- pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage-1)) / 1000));
-
- if((Params.m_inputSize.m_width + Params.m_inputCoord.m_x)\
- > pC->m_pDecodedPlane->u_width)
- {
- Params.m_inputSize.m_width = pC->m_pDecodedPlane->u_width \
- - Params.m_inputCoord.m_x;
- }
-
- if((Params.m_inputSize.m_height + Params.m_inputCoord.m_y)\
- > pC->m_pDecodedPlane->u_height)
- {
- Params.m_inputSize.m_height = pC->m_pDecodedPlane->u_height\
- - Params.m_inputCoord.m_y;
- }
-
-
-
- Params.m_inputSize.m_width = (Params.m_inputSize.m_width>>1)<<1;
- Params.m_inputSize.m_height = (Params.m_inputSize.m_height>>1)<<1;
- }
-
-
-
- /**
- Picture rendering: Black borders*/
-
- if(pC->m_mediaRendering == M4xVSS_kBlackBorders)
- {
- memset((void *)pImagePlanes[0].pac_data,Y_PLANE_BORDER_VALUE,
- (pImagePlanes[0].u_height*pImagePlanes[0].u_stride));
- memset((void *)pImagePlanes[1].pac_data,U_PLANE_BORDER_VALUE,
- (pImagePlanes[1].u_height*pImagePlanes[1].u_stride));
- memset((void *)pImagePlanes[2].pac_data,V_PLANE_BORDER_VALUE,
- (pImagePlanes[2].u_height*pImagePlanes[2].u_stride));
-
- /**
- First without pan&zoom*/
- if(M4OSA_FALSE == pC->m_pPto3GPPparams->isPanZoom)
- {
- switch(pBasicTags.orientation)
- {
- default:
- case M4COMMON_kOrientationUnknown:
- Params.m_outputOrientation = M4COMMON_kOrientationTopLeft;
- case M4COMMON_kOrientationTopLeft:
- case M4COMMON_kOrientationTopRight:
- case M4COMMON_kOrientationBottomRight:
- case M4COMMON_kOrientationBottomLeft:
- if((M4OSA_UInt32)((pC->m_pDecodedPlane->u_height * pImagePlanes->u_width)\
- /pC->m_pDecodedPlane->u_width) <= pImagePlanes->u_height)
- //Params.m_inputSize.m_height < Params.m_inputSize.m_width)
- {
- /*it is height so black borders will be on the top and on the bottom side*/
- Params.m_outputSize.m_width = pImagePlanes->u_width;
- Params.m_outputSize.m_height =
- (M4OSA_UInt32)((pC->m_pDecodedPlane->u_height \
- * pImagePlanes->u_width) /pC->m_pDecodedPlane->u_width);
- /*number of lines at the top*/
- pImagePlanes[0].u_topleft =
- (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_height\
- -Params.m_outputSize.m_height)>>1))*pImagePlanes[0].u_stride;
- pImagePlanes[0].u_height = Params.m_outputSize.m_height;
- pImagePlanes[1].u_topleft =
- (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_height\
- -(Params.m_outputSize.m_height>>1)))>>1)*pImagePlanes[1].u_stride;
- pImagePlanes[1].u_height = Params.m_outputSize.m_height>>1;
- pImagePlanes[2].u_topleft =
- (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_height\
- -(Params.m_outputSize.m_height>>1)))>>1)*pImagePlanes[2].u_stride;
- pImagePlanes[2].u_height = Params.m_outputSize.m_height>>1;
- }
- else
- {
- /*it is width so black borders will be on the left and right side*/
- Params.m_outputSize.m_height = pImagePlanes->u_height;
- Params.m_outputSize.m_width =
- (M4OSA_UInt32)((pC->m_pDecodedPlane->u_width \
- * pImagePlanes->u_height) /pC->m_pDecodedPlane->u_height);
-
- pImagePlanes[0].u_topleft =
- (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_width\
- -Params.m_outputSize.m_width)>>1));
- pImagePlanes[0].u_width = Params.m_outputSize.m_width;
- pImagePlanes[1].u_topleft =
- (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_width\
- -(Params.m_outputSize.m_width>>1)))>>1);
- pImagePlanes[1].u_width = Params.m_outputSize.m_width>>1;
- pImagePlanes[2].u_topleft =
- (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_width\
- -(Params.m_outputSize.m_width>>1)))>>1);
- pImagePlanes[2].u_width = Params.m_outputSize.m_width>>1;
- }
- break;
- case M4COMMON_kOrientationLeftTop:
- case M4COMMON_kOrientationLeftBottom:
- case M4COMMON_kOrientationRightTop:
- case M4COMMON_kOrientationRightBottom:
- if((M4OSA_UInt32)((pC->m_pDecodedPlane->u_width * pImagePlanes->u_width)\
- /pC->m_pDecodedPlane->u_height) < pImagePlanes->u_height)
- //Params.m_inputSize.m_height > Params.m_inputSize.m_width)
- {
- /*it is height so black borders will be on the top and on
- the bottom side*/
- Params.m_outputSize.m_height = pImagePlanes->u_width;
- Params.m_outputSize.m_width =
- (M4OSA_UInt32)((pC->m_pDecodedPlane->u_width \
- * pImagePlanes->u_width) /pC->m_pDecodedPlane->u_height);
- /*number of lines at the top*/
- pImagePlanes[0].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_height\
- -Params.m_outputSize.m_width))>>1)*pImagePlanes[0].u_stride)+1;
- pImagePlanes[0].u_height = Params.m_outputSize.m_width;
- pImagePlanes[1].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_height\
- -(Params.m_outputSize.m_width>>1)))>>1)\
- *pImagePlanes[1].u_stride)+1;
- pImagePlanes[1].u_height = Params.m_outputSize.m_width>>1;
- pImagePlanes[2].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_height\
- -(Params.m_outputSize.m_width>>1)))>>1)\
- *pImagePlanes[2].u_stride)+1;
- pImagePlanes[2].u_height = Params.m_outputSize.m_width>>1;
- }
- else
- {
- /*it is width so black borders will be on the left and right side*/
- Params.m_outputSize.m_width = pImagePlanes->u_height;
- Params.m_outputSize.m_height =
- (M4OSA_UInt32)((pC->m_pDecodedPlane->u_height\
- * pImagePlanes->u_height) /pC->m_pDecodedPlane->u_width);
-
- pImagePlanes[0].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_width\
- -Params.m_outputSize.m_height))>>1))+1;
- pImagePlanes[0].u_width = Params.m_outputSize.m_height;
- pImagePlanes[1].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_width\
- -(Params.m_outputSize.m_height>>1)))>>1))+1;
- pImagePlanes[1].u_width = Params.m_outputSize.m_height>>1;
- pImagePlanes[2].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_width\
- -(Params.m_outputSize.m_height>>1)))>>1))+1;
- pImagePlanes[2].u_width = Params.m_outputSize.m_height>>1;
- }
- break;
- }
- }
-
- /**
- Secondly with pan&zoom*/
- else
- {
- switch(pBasicTags.orientation)
- {
- default:
- case M4COMMON_kOrientationUnknown:
- Params.m_outputOrientation = M4COMMON_kOrientationTopLeft;
- case M4COMMON_kOrientationTopLeft:
- case M4COMMON_kOrientationTopRight:
- case M4COMMON_kOrientationBottomRight:
- case M4COMMON_kOrientationBottomLeft:
- /*NO ROTATION*/
- if((M4OSA_UInt32)((pC->m_pDecodedPlane->u_height * pImagePlanes->u_width)\
- /pC->m_pDecodedPlane->u_width) <= pImagePlanes->u_height)
- //Params.m_inputSize.m_height < Params.m_inputSize.m_width)
- {
- /*Black borders will be on the top and bottom of the output video*/
- /*Maximum output height if the input image aspect ratio is kept and if
- the output width is the screen width*/
- M4OSA_UInt32 tempOutputSizeHeight =
- (M4OSA_UInt32)((pC->m_pDecodedPlane->u_height\
- * pImagePlanes->u_width) /pC->m_pDecodedPlane->u_width);
- M4OSA_UInt32 tempInputSizeHeightMax = 0;
- M4OSA_UInt32 tempFinalInputHeight = 0;
- /*The output width is the screen width*/
- Params.m_outputSize.m_width = pImagePlanes->u_width;
- tempOutputSizeHeight = (tempOutputSizeHeight>>1)<<1;
-
- /*Maximum input height according to the maximum output height
- (proportional to the maximum output height)*/
- tempInputSizeHeightMax = (pImagePlanes->u_height\
- *Params.m_inputSize.m_height)/tempOutputSizeHeight;
- tempInputSizeHeightMax = (tempInputSizeHeightMax>>1)<<1;
-
- /*Check if the maximum possible input height is contained into the
- input image height*/
- if(tempInputSizeHeightMax <= pC->m_pDecodedPlane->u_height)
- {
- /*The maximum possible input height is contained in the input
- image height,
- that means no black borders, the input pan zoom area will be extended
- so that the input AIR height will be the maximum possible*/
- if(((tempInputSizeHeightMax - Params.m_inputSize.m_height)>>1)\
- <= Params.m_inputCoord.m_y
- && ((tempInputSizeHeightMax - Params.m_inputSize.m_height)>>1)\
- <= pC->m_pDecodedPlane->u_height -(Params.m_inputCoord.m_y\
- + Params.m_inputSize.m_height))
- {
- /*The input pan zoom area can be extended symmetrically on the
- top and bottom side*/
- Params.m_inputCoord.m_y -= ((tempInputSizeHeightMax \
- - Params.m_inputSize.m_height)>>1);
- }
- else if(Params.m_inputCoord.m_y < pC->m_pDecodedPlane->u_height\
- -(Params.m_inputCoord.m_y + Params.m_inputSize.m_height))
- {
- /*There is not enough place above the input pan zoom area to
- extend it symmetrically,
- so extend it to the maximum on the top*/
- Params.m_inputCoord.m_y = 0;
- }
- else
- {
- /*There is not enough place below the input pan zoom area to
- extend it symmetrically,
- so extend it to the maximum on the bottom*/
- Params.m_inputCoord.m_y = pC->m_pDecodedPlane->u_height \
- - tempInputSizeHeightMax;
- }
- /*The input height of the AIR is the maximum possible height*/
- Params.m_inputSize.m_height = tempInputSizeHeightMax;
- }
- else
- {
- /*The maximum possible input height is greater than the input
- image height,
- that means black borders are necessary to keep aspect ratio
- The input height of the AIR is all the input image height*/
- Params.m_outputSize.m_height =
- (tempOutputSizeHeight*pC->m_pDecodedPlane->u_height)\
- /Params.m_inputSize.m_height;
- Params.m_outputSize.m_height = (Params.m_outputSize.m_height>>1)<<1;
- Params.m_inputCoord.m_y = 0;
- Params.m_inputSize.m_height = pC->m_pDecodedPlane->u_height;
- pImagePlanes[0].u_topleft =
- (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_height\
- -Params.m_outputSize.m_height)>>1))*pImagePlanes[0].u_stride;
- pImagePlanes[0].u_height = Params.m_outputSize.m_height;
- pImagePlanes[1].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_height\
- -(Params.m_outputSize.m_height>>1)))>>1)\
- *pImagePlanes[1].u_stride);
- pImagePlanes[1].u_height = Params.m_outputSize.m_height>>1;
- pImagePlanes[2].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_height\
- -(Params.m_outputSize.m_height>>1)))>>1)\
- *pImagePlanes[2].u_stride);
- pImagePlanes[2].u_height = Params.m_outputSize.m_height>>1;
- }
- }
- else
- {
- /*Black borders will be on the left and right side of the output video*/
- /*Maximum output width if the input image aspect ratio is kept and if the
- output height is the screen height*/
- M4OSA_UInt32 tempOutputSizeWidth =
- (M4OSA_UInt32)((pC->m_pDecodedPlane->u_width \
- * pImagePlanes->u_height) /pC->m_pDecodedPlane->u_height);
- M4OSA_UInt32 tempInputSizeWidthMax = 0;
- M4OSA_UInt32 tempFinalInputWidth = 0;
- /*The output height is the screen height*/
- Params.m_outputSize.m_height = pImagePlanes->u_height;
- tempOutputSizeWidth = (tempOutputSizeWidth>>1)<<1;
-
- /*Maximum input width according to the maximum output width
- (proportional to the maximum output width)*/
- tempInputSizeWidthMax =
- (pImagePlanes->u_width*Params.m_inputSize.m_width)\
- /tempOutputSizeWidth;
- tempInputSizeWidthMax = (tempInputSizeWidthMax>>1)<<1;
-
- /*Check if the maximum possible input width is contained into the input
- image width*/
- if(tempInputSizeWidthMax <= pC->m_pDecodedPlane->u_width)
- {
- /*The maximum possible input width is contained in the input
- image width,
- that means no black borders, the input pan zoom area will be extended
- so that the input AIR width will be the maximum possible*/
- if(((tempInputSizeWidthMax - Params.m_inputSize.m_width)>>1) \
- <= Params.m_inputCoord.m_x
- && ((tempInputSizeWidthMax - Params.m_inputSize.m_width)>>1)\
- <= pC->m_pDecodedPlane->u_width -(Params.m_inputCoord.m_x \
- + Params.m_inputSize.m_width))
- {
- /*The input pan zoom area can be extended symmetrically on the
- right and left side*/
- Params.m_inputCoord.m_x -= ((tempInputSizeWidthMax\
- - Params.m_inputSize.m_width)>>1);
- }
- else if(Params.m_inputCoord.m_x < pC->m_pDecodedPlane->u_width\
- -(Params.m_inputCoord.m_x + Params.m_inputSize.m_width))
- {
- /*There is not enough place above the input pan zoom area to
- extend it symmetrically,
- so extend it to the maximum on the left*/
- Params.m_inputCoord.m_x = 0;
- }
- else
- {
- /*There is not enough place below the input pan zoom area
- to extend it symmetrically,
- so extend it to the maximum on the right*/
- Params.m_inputCoord.m_x = pC->m_pDecodedPlane->u_width \
- - tempInputSizeWidthMax;
- }
- /*The input width of the AIR is the maximum possible width*/
- Params.m_inputSize.m_width = tempInputSizeWidthMax;
- }
- else
- {
- /*The maximum possible input width is greater than the input
- image width,
- that means black borders are necessary to keep aspect ratio
- The input width of the AIR is all the input image width*/
- Params.m_outputSize.m_width =\
- (tempOutputSizeWidth*pC->m_pDecodedPlane->u_width)\
- /Params.m_inputSize.m_width;
- Params.m_outputSize.m_width = (Params.m_outputSize.m_width>>1)<<1;
- Params.m_inputCoord.m_x = 0;
- Params.m_inputSize.m_width = pC->m_pDecodedPlane->u_width;
- pImagePlanes[0].u_topleft =
- (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_width\
- -Params.m_outputSize.m_width)>>1));
- pImagePlanes[0].u_width = Params.m_outputSize.m_width;
- pImagePlanes[1].u_topleft =
- (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_width\
- -(Params.m_outputSize.m_width>>1)))>>1);
- pImagePlanes[1].u_width = Params.m_outputSize.m_width>>1;
- pImagePlanes[2].u_topleft =
- (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_width\
- -(Params.m_outputSize.m_width>>1)))>>1);
- pImagePlanes[2].u_width = Params.m_outputSize.m_width>>1;
- }
- }
- break;
- case M4COMMON_kOrientationLeftTop:
- case M4COMMON_kOrientationLeftBottom:
- case M4COMMON_kOrientationRightTop:
- case M4COMMON_kOrientationRightBottom:
- /*ROTATION*/
- if((M4OSA_UInt32)((pC->m_pDecodedPlane->u_width * pImagePlanes->u_width)\
- /pC->m_pDecodedPlane->u_height) < pImagePlanes->u_height)
- //Params.m_inputSize.m_height > Params.m_inputSize.m_width)
- {
- /*Black borders will be on the left and right side of the output video*/
- /*Maximum output height if the input image aspect ratio is kept and if
- the output height is the screen width*/
- M4OSA_UInt32 tempOutputSizeHeight =
- (M4OSA_UInt32)((pC->m_pDecodedPlane->u_width * pImagePlanes->u_width)\
- /pC->m_pDecodedPlane->u_height);
- M4OSA_UInt32 tempInputSizeHeightMax = 0;
- M4OSA_UInt32 tempFinalInputHeight = 0;
- /*The output width is the screen height*/
- Params.m_outputSize.m_height = pImagePlanes->u_width;
- Params.m_outputSize.m_width= pImagePlanes->u_height;
- tempOutputSizeHeight = (tempOutputSizeHeight>>1)<<1;
-
- /*Maximum input height according to the maximum output height
- (proportional to the maximum output height)*/
- tempInputSizeHeightMax =
- (pImagePlanes->u_height*Params.m_inputSize.m_width)\
- /tempOutputSizeHeight;
- tempInputSizeHeightMax = (tempInputSizeHeightMax>>1)<<1;
-
- /*Check if the maximum possible input height is contained into the
- input image width (rotation included)*/
- if(tempInputSizeHeightMax <= pC->m_pDecodedPlane->u_width)
- {
- /*The maximum possible input height is contained in the input
- image width (rotation included),
- that means no black borders, the input pan zoom area will be extended
- so that the input AIR width will be the maximum possible*/
- if(((tempInputSizeHeightMax - Params.m_inputSize.m_width)>>1) \
- <= Params.m_inputCoord.m_x
- && ((tempInputSizeHeightMax - Params.m_inputSize.m_width)>>1)\
- <= pC->m_pDecodedPlane->u_width -(Params.m_inputCoord.m_x \
- + Params.m_inputSize.m_width))
- {
- /*The input pan zoom area can be extended symmetrically on the
- right and left side*/
- Params.m_inputCoord.m_x -= ((tempInputSizeHeightMax \
- - Params.m_inputSize.m_width)>>1);
- }
- else if(Params.m_inputCoord.m_x < pC->m_pDecodedPlane->u_width\
- -(Params.m_inputCoord.m_x + Params.m_inputSize.m_width))
- {
- /*There is not enough place on the left of the input pan
- zoom area to extend it symmetrically,
- so extend it to the maximum on the left*/
- Params.m_inputCoord.m_x = 0;
- }
- else
- {
- /*There is not enough place on the right of the input pan zoom
- area to extend it symmetrically,
- so extend it to the maximum on the right*/
- Params.m_inputCoord.m_x =
- pC->m_pDecodedPlane->u_width - tempInputSizeHeightMax;
- }
- /*The input width of the AIR is the maximum possible width*/
- Params.m_inputSize.m_width = tempInputSizeHeightMax;
- }
- else
- {
- /*The maximum possible input height is greater than the input
- image width (rotation included),
- that means black borders are necessary to keep aspect ratio
- The input width of the AIR is all the input image width*/
- Params.m_outputSize.m_width =
- (tempOutputSizeHeight*pC->m_pDecodedPlane->u_width)\
- /Params.m_inputSize.m_width;
- Params.m_outputSize.m_width = (Params.m_outputSize.m_width>>1)<<1;
- Params.m_inputCoord.m_x = 0;
- Params.m_inputSize.m_width = pC->m_pDecodedPlane->u_width;
- pImagePlanes[0].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_height\
- -Params.m_outputSize.m_width))>>1)*pImagePlanes[0].u_stride)+1;
- pImagePlanes[0].u_height = Params.m_outputSize.m_width;
- pImagePlanes[1].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_height\
- -(Params.m_outputSize.m_width>>1)))>>1)\
- *pImagePlanes[1].u_stride)+1;
- pImagePlanes[1].u_height = Params.m_outputSize.m_width>>1;
- pImagePlanes[2].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_height\
- -(Params.m_outputSize.m_width>>1)))>>1)\
- *pImagePlanes[2].u_stride)+1;
- pImagePlanes[2].u_height = Params.m_outputSize.m_width>>1;
- }
- }
- else
- {
- /*Black borders will be on the top and bottom of the output video*/
- /*Maximum output width if the input image aspect ratio is kept and if
- the output width is the screen height*/
- M4OSA_UInt32 tempOutputSizeWidth =
- (M4OSA_UInt32)((pC->m_pDecodedPlane->u_height * pImagePlanes->u_height)\
- /pC->m_pDecodedPlane->u_width);
- M4OSA_UInt32 tempInputSizeWidthMax = 0;
- M4OSA_UInt32 tempFinalInputWidth = 0, tempFinalOutputWidth = 0;
- /*The output height is the screen width*/
- Params.m_outputSize.m_width = pImagePlanes->u_height;
- Params.m_outputSize.m_height= pImagePlanes->u_width;
- tempOutputSizeWidth = (tempOutputSizeWidth>>1)<<1;
-
- /*Maximum input width according to the maximum output width
- (proportional to the maximum output width)*/
- tempInputSizeWidthMax =
- (pImagePlanes->u_width*Params.m_inputSize.m_height)/tempOutputSizeWidth;
- tempInputSizeWidthMax = (tempInputSizeWidthMax>>1)<<1;
-
- /*Check if the maximum possible input width is contained into the input
- image height (rotation included)*/
- if(tempInputSizeWidthMax <= pC->m_pDecodedPlane->u_height)
- {
- /*The maximum possible input width is contained in the input
- image height (rotation included),
- that means no black borders, the input pan zoom area will be extended
- so that the input AIR height will be the maximum possible*/
- if(((tempInputSizeWidthMax - Params.m_inputSize.m_height)>>1) \
- <= Params.m_inputCoord.m_y
- && ((tempInputSizeWidthMax - Params.m_inputSize.m_height)>>1)\
- <= pC->m_pDecodedPlane->u_height -(Params.m_inputCoord.m_y \
- + Params.m_inputSize.m_height))
- {
- /*The input pan zoom area can be extended symmetrically on
- the right and left side*/
- Params.m_inputCoord.m_y -= ((tempInputSizeWidthMax \
- - Params.m_inputSize.m_height)>>1);
- }
- else if(Params.m_inputCoord.m_y < pC->m_pDecodedPlane->u_height\
- -(Params.m_inputCoord.m_y + Params.m_inputSize.m_height))
- {
- /*There is not enough place on the top of the input pan zoom
- area to extend it symmetrically,
- so extend it to the maximum on the top*/
- Params.m_inputCoord.m_y = 0;
- }
- else
- {
- /*There is not enough place on the bottom of the input pan zoom
- area to extend it symmetrically,
- so extend it to the maximum on the bottom*/
- Params.m_inputCoord.m_y = pC->m_pDecodedPlane->u_height\
- - tempInputSizeWidthMax;
- }
- /*The input height of the AIR is the maximum possible height*/
- Params.m_inputSize.m_height = tempInputSizeWidthMax;
- }
- else
- {
- /*The maximum possible input width is greater than the input\
- image height (rotation included),
- that means black borders are necessary to keep aspect ratio
- The input height of the AIR is all the input image height*/
- Params.m_outputSize.m_height =
- (tempOutputSizeWidth*pC->m_pDecodedPlane->u_height)\
- /Params.m_inputSize.m_height;
- Params.m_outputSize.m_height = (Params.m_outputSize.m_height>>1)<<1;
- Params.m_inputCoord.m_y = 0;
- Params.m_inputSize.m_height = pC->m_pDecodedPlane->u_height;
- pImagePlanes[0].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_width\
- -Params.m_outputSize.m_height))>>1))+1;
- pImagePlanes[0].u_width = Params.m_outputSize.m_height;
- pImagePlanes[1].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_width\
- -(Params.m_outputSize.m_height>>1)))>>1))+1;
- pImagePlanes[1].u_width = Params.m_outputSize.m_height>>1;
- pImagePlanes[2].u_topleft =
- ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_width\
- -(Params.m_outputSize.m_height>>1)))>>1))+1;
- pImagePlanes[2].u_width = Params.m_outputSize.m_height>>1;
- }
- }
- break;
- }
- }
-
- /*Width and height have to be even*/
- Params.m_outputSize.m_width = (Params.m_outputSize.m_width>>1)<<1;
- Params.m_outputSize.m_height = (Params.m_outputSize.m_height>>1)<<1;
- Params.m_inputSize.m_width = (Params.m_inputSize.m_width>>1)<<1;
- Params.m_inputSize.m_height = (Params.m_inputSize.m_height>>1)<<1;
- pImagePlanes[0].u_width = (pImagePlanes[0].u_width>>1)<<1;
- pImagePlanes[1].u_width = (pImagePlanes[1].u_width>>1)<<1;
- pImagePlanes[2].u_width = (pImagePlanes[2].u_width>>1)<<1;
- pImagePlanes[0].u_height = (pImagePlanes[0].u_height>>1)<<1;
- pImagePlanes[1].u_height = (pImagePlanes[1].u_height>>1)<<1;
- pImagePlanes[2].u_height = (pImagePlanes[2].u_height>>1)<<1;
-
- /*Check that values are coherent*/
- if(Params.m_inputSize.m_height == Params.m_outputSize.m_height)
- {
- Params.m_inputSize.m_width = Params.m_outputSize.m_width;
- }
- else if(Params.m_inputSize.m_width == Params.m_outputSize.m_width)
- {
- Params.m_inputSize.m_height = Params.m_outputSize.m_height;
- }
- }
-
- /**
- Picture rendering: Resizing and Cropping*/
- if(pC->m_mediaRendering != M4xVSS_kBlackBorders)
- {
- switch(pBasicTags.orientation)
- {
- default:
- case M4COMMON_kOrientationUnknown:
- Params.m_outputOrientation = M4COMMON_kOrientationTopLeft;
- case M4COMMON_kOrientationTopLeft:
- case M4COMMON_kOrientationTopRight:
- case M4COMMON_kOrientationBottomRight:
- case M4COMMON_kOrientationBottomLeft:
- Params.m_outputSize.m_height = pImagePlanes->u_height;
- Params.m_outputSize.m_width = pImagePlanes->u_width;
- break;
- case M4COMMON_kOrientationLeftTop:
- case M4COMMON_kOrientationLeftBottom:
- case M4COMMON_kOrientationRightTop:
- case M4COMMON_kOrientationRightBottom:
- Params.m_outputSize.m_height = pImagePlanes->u_width;
- Params.m_outputSize.m_width = pImagePlanes->u_height;
- break;
- }
- }
-
- /**
- Picture rendering: Cropping*/
- if(pC->m_mediaRendering == M4xVSS_kCropping)
- {
- if((Params.m_outputSize.m_height * Params.m_inputSize.m_width)\
- /Params.m_outputSize.m_width<Params.m_inputSize.m_height)
- {
- M4OSA_UInt32 tempHeight = Params.m_inputSize.m_height;
- /*height will be cropped*/
- Params.m_inputSize.m_height = (M4OSA_UInt32)((Params.m_outputSize.m_height \
- * Params.m_inputSize.m_width) /Params.m_outputSize.m_width);
- Params.m_inputSize.m_height = (Params.m_inputSize.m_height>>1)<<1;
- if(M4OSA_FALSE == pC->m_pPto3GPPparams->isPanZoom)
- {
- Params.m_inputCoord.m_y = (M4OSA_Int32)((M4OSA_Int32)\
- ((pC->m_pDecodedPlane->u_height - Params.m_inputSize.m_height))>>1);
- }
- else
- {
- Params.m_inputCoord.m_y += (M4OSA_Int32)((M4OSA_Int32)\
- ((tempHeight - Params.m_inputSize.m_height))>>1);
- }
- }
- else
- {
- M4OSA_UInt32 tempWidth= Params.m_inputSize.m_width;
- /*width will be cropped*/
- Params.m_inputSize.m_width = (M4OSA_UInt32)((Params.m_outputSize.m_width \
- * Params.m_inputSize.m_height) /Params.m_outputSize.m_height);
- Params.m_inputSize.m_width = (Params.m_inputSize.m_width>>1)<<1;
- if(M4OSA_FALSE == pC->m_pPto3GPPparams->isPanZoom)
- {
- Params.m_inputCoord.m_x = (M4OSA_Int32)((M4OSA_Int32)\
- ((pC->m_pDecodedPlane->u_width - Params.m_inputSize.m_width))>>1);
- }
- else
- {
- Params.m_inputCoord.m_x += (M4OSA_Int32)\
- (((M4OSA_Int32)(tempWidth - Params.m_inputSize.m_width))>>1);
- }
- }
- }
-
-
-
- /**
- * Call AIR functions */
- if(M4OSA_NULL == pC->m_air_context)
- {
- err = M4AIR_create(&pC->m_air_context, M4AIR_kYUV420P);
- if(err != M4NO_ERROR)
- {
- free(pC->m_pDecodedPlane[0].pac_data);
- free(pC->m_pDecodedPlane);
- pC->m_pDecodedPlane = M4OSA_NULL;
- M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct:\
- Error when initializing AIR: 0x%x", err);
- return err;
- }
- }
-
- err = M4AIR_configure(pC->m_air_context, &Params);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct:\
- Error when configuring AIR: 0x%x", err);
- M4AIR_cleanUp(pC->m_air_context);
- free(pC->m_pDecodedPlane[0].pac_data);
- free(pC->m_pDecodedPlane);
- pC->m_pDecodedPlane = M4OSA_NULL;
- return err;
- }
-
- err = M4AIR_get(pC->m_air_context, pC->m_pDecodedPlane, pImagePlanes);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct: Error when getting AIR plane: 0x%x", err);
- M4AIR_cleanUp(pC->m_air_context);
- free(pC->m_pDecodedPlane[0].pac_data);
- free(pC->m_pDecodedPlane);
- pC->m_pDecodedPlane = M4OSA_NULL;
- return err;
- }
- pImagePlanes[0] = pImagePlanes1;
- pImagePlanes[1] = pImagePlanes2;
- pImagePlanes[2] = pImagePlanes3;
- }
-
-
- /**
- * Increment the image counter */
- pC->m_ImageCounter++;
-
- /**
- * Check end of sequence */
- last_frame_flag = (pC->m_ImageCounter >= pC->m_NbImage);
-
- /**
- * Keep the picture duration */
- *pPictureDuration = pC->m_timeDuration;
-
- if (1 == last_frame_flag)
- {
- if(M4OSA_NULL != pC->m_air_context)
- {
- err = M4AIR_cleanUp(pC->m_air_context);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct: Error when cleaning AIR: 0x%x", err);
- return err;
- }
- }
- if(M4OSA_NULL != pC->m_pDecodedPlane)
- {
- free(pC->m_pDecodedPlane[0].pac_data);
- free(pC->m_pDecodedPlane);
- pC->m_pDecodedPlane = M4OSA_NULL;
- }
- return M4PTO3GPP_WAR_LAST_PICTURE;
- }
-
- M4OSA_TRACE1_0("M4xVSS_PictureCallbackFct: Leaving ");
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * M4OSA_ERR M4xVSS_internalStartConvertPictureTo3gp(M4OSA_Context pContext)
- * @brief This function initializes Pto3GPP with the given parameters
- * @note The "Pictures to 3GPP" parameters are given by the internal xVSS
- * context. This context contains a pointer on the current element
- * of the chained list of Pto3GPP parameters.
- * @param pContext (IN) The integrator own context
- *
- * @return M4NO_ERROR: No error
- * @return M4PTO3GPP_WAR_LAST_PICTURE: The returned image is the last one
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalStartConvertPictureTo3gp(M4OSA_Context pContext)
-{
- /************************************************************************/
- /* Definitions to generate dummy AMR file used to add AMR silence in files generated
- by Pto3GPP */
- #define M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE 13
- /* This constant is defined in M4VSS3GPP_InternalConfig.h */
- extern const M4OSA_UInt8\
- M4VSS3GPP_AMR_AU_SILENCE_FRAME_048[M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE];
-
- /* AMR silent frame used to compute dummy AMR silence file */
- #define M4VSS3GPP_AMR_HEADER_SIZE 6
- const M4OSA_UInt8 M4VSS3GPP_AMR_HEADER[M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE] =
- { 0x23, 0x21, 0x41, 0x4d, 0x52, 0x0a };
- /************************************************************************/
-
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4OSA_ERR err;
- M4PTO3GPP_Context pM4PTO3GPP_Ctxt = M4OSA_NULL;
- M4PTO3GPP_Params Params;
- M4xVSS_PictureCallbackCtxt* pCallBackCtxt;
- M4OSA_Bool cmpResult=M4OSA_FALSE;
- M4OSA_Context pDummyAMRFile;
- M4OSA_Char out_amr[M4XVSS_MAX_PATH_LEN];
- /*UTF conversion support*/
- M4OSA_Char* pDecodedPath = M4OSA_NULL;
- M4OSA_UInt32 i;
-
- /**
- * Create a M4PTO3GPP instance */
- err = M4PTO3GPP_Init( &pM4PTO3GPP_Ctxt, xVSS_context->pFileReadPtr,
- xVSS_context->pFileWritePtr);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalStartConvertPictureTo3gp returned %ld\n",err);
- return err;
- }
-
- pCallBackCtxt = (M4xVSS_PictureCallbackCtxt*)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_PictureCallbackCtxt),
- M4VS,(M4OSA_Char *) "Pto3gpp callback struct");
- if(pCallBackCtxt == M4OSA_NULL)
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_internalStartConvertPictureTo3gp");
- return M4ERR_ALLOC;
- }
-
- Params.OutputVideoFrameSize = xVSS_context->pSettings->xVSS.outputVideoSize;
- Params.OutputVideoFormat = xVSS_context->pSettings->xVSS.outputVideoFormat;
- Params.videoProfile = xVSS_context->pSettings->xVSS.outputVideoProfile;
- Params.videoLevel = xVSS_context->pSettings->xVSS.outputVideoLevel;
-
- /**
- * Generate "dummy" amr file containing silence in temporary folder */
- M4OSA_chrNCopy(out_amr, xVSS_context->pTempPath, M4XVSS_MAX_PATH_LEN - 1);
- strncat((char *)out_amr, (const char *)"dummy.amr\0", 10);
-
- /**
- * UTF conversion: convert the temporary path into the customer format*/
- pDecodedPath = out_amr;
-
- if(xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer != M4OSA_NULL)
- {
- M4OSA_UInt32 length = 0;
- err = M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void*) out_amr,
- (M4OSA_Void*) xVSS_context->UTFConversionContext.pTempOutConversionBuffer, &length);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalStartConvertPictureTo3gp:\
- M4xVSS_internalConvertFromUTF8 returns err: 0x%x",err);
- return err;
- }
- pDecodedPath = xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the conversion, now use the converted path*/
-
- err = xVSS_context->pFileWritePtr->openWrite(&pDummyAMRFile, pDecodedPath, M4OSA_kFileWrite);
-
- /*Commented because of the use of the UTF conversion see above*/
-/* err = xVSS_context->pFileWritePtr->openWrite(&pDummyAMRFile, out_amr, M4OSA_kFileWrite);
- */
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_2("M4xVSS_internalConvertPictureTo3gp: Can't open output dummy amr file %s,\
- error: 0x%x\n",out_amr, err);
- return err;
- }
-
- err = xVSS_context->pFileWritePtr->writeData(pDummyAMRFile,
- (M4OSA_Int8*)M4VSS3GPP_AMR_HEADER, M4VSS3GPP_AMR_HEADER_SIZE);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_2("M4xVSS_internalConvertPictureTo3gp: Can't write output dummy amr file %s,\
- error: 0x%x\n",out_amr, err);
- return err;
- }
-
- err = xVSS_context->pFileWritePtr->writeData(pDummyAMRFile,
- (M4OSA_Int8*)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048, M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_2("M4xVSS_internalConvertPictureTo3gp: \
- Can't write output dummy amr file %s, error: 0x%x\n",out_amr, err);
- return err;
- }
-
- err = xVSS_context->pFileWritePtr->closeWrite(pDummyAMRFile);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_2("M4xVSS_internalConvertPictureTo3gp: \
- Can't close output dummy amr file %s, error: 0x%x\n",out_amr, err);
- return err;
- }
-
- /**
- * Fill parameters for Pto3GPP with the parameters contained in the current element of the
- * Pto3GPP parameters chained list and with default parameters */
-/*+ New Encoder bitrates */
- if(xVSS_context->pSettings->xVSS.outputVideoBitrate == 0) {
- Params.OutputVideoBitrate = M4VIDEOEDITING_kVARIABLE_KBPS;
- }
- else {
- Params.OutputVideoBitrate = xVSS_context->pSettings->xVSS.outputVideoBitrate;
- }
- M4OSA_TRACE1_1("M4xVSS_internalStartConvertPicTo3GP: video bitrate = %d",
- Params.OutputVideoBitrate);
-/*- New Encoder bitrates */
- Params.OutputFileMaxSize = M4PTO3GPP_kUNLIMITED;
- Params.pPictureCallbackFct = M4xVSS_PictureCallbackFct;
- Params.pPictureCallbackCtxt = pCallBackCtxt;
- /*FB: change to use the converted path (UTF conversion) see the conversion above*/
- /*Fix :- Adding Audio Track in Image as input :AudioTarckFile Setting to NULL */
- Params.pInputAudioTrackFile = M4OSA_NULL;//(M4OSA_Void*)pDecodedPath;//out_amr;
- Params.AudioPaddingMode = M4PTO3GPP_kAudioPaddingMode_Loop;
- Params.AudioFileFormat = M4VIDEOEDITING_kFileType_AMR;
- Params.pOutput3gppFile = xVSS_context->pPTo3GPPcurrentParams->pFileOut;
- Params.pTemporaryFile = xVSS_context->pPTo3GPPcurrentParams->pFileTemp;
- /*+PR No: blrnxpsw#223*/
- /*Increasing frequency of Frame, calculating Nos of Frame = duration /FPS */
- /*Other changes made is @ M4xVSS_API.c @ line 3841 in M4xVSS_SendCommand*/
- /*If case check for PanZoom removed */
- Params.NbVideoFrames = (M4OSA_UInt32)
- (xVSS_context->pPTo3GPPcurrentParams->duration \
- / xVSS_context->pPTo3GPPcurrentParams->framerate); /* */
- pCallBackCtxt->m_timeDuration = xVSS_context->pPTo3GPPcurrentParams->framerate;
- /*-PR No: blrnxpsw#223*/
- pCallBackCtxt->m_ImageCounter = 0;
- pCallBackCtxt->m_FileIn = xVSS_context->pPTo3GPPcurrentParams->pFileIn;
- pCallBackCtxt->m_NbImage = Params.NbVideoFrames;
- pCallBackCtxt->m_pFileReadPtr = xVSS_context->pFileReadPtr;
- pCallBackCtxt->m_pDecodedPlane = M4OSA_NULL;
- pCallBackCtxt->m_pPto3GPPparams = xVSS_context->pPTo3GPPcurrentParams;
- pCallBackCtxt->m_air_context = M4OSA_NULL;
- pCallBackCtxt->m_mediaRendering = xVSS_context->pPTo3GPPcurrentParams->MediaRendering;
-
- /**
- * Set the input and output files */
- err = M4PTO3GPP_Open(pM4PTO3GPP_Ctxt, &Params);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4PTO3GPP_Open returned: 0x%x\n",err);
- if(pCallBackCtxt != M4OSA_NULL)
- {
- free(pCallBackCtxt);
- pCallBackCtxt = M4OSA_NULL;
- }
- M4PTO3GPP_CleanUp(pM4PTO3GPP_Ctxt);
- return err;
- }
-
- /**
- * Save context to be able to call Pto3GPP step function in M4xVSS_step function */
- xVSS_context->pM4PTO3GPP_Ctxt = pM4PTO3GPP_Ctxt;
- xVSS_context->pCallBackCtxt = pCallBackCtxt;
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * M4OSA_ERR M4xVSS_internalStopConvertPictureTo3gp(M4OSA_Context pContext)
- * @brief This function cleans up Pto3GPP
- * @note
- * @param pContext (IN) The integrator own context
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalStopConvertPictureTo3gp(M4OSA_Context pContext)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4OSA_ERR err;
- M4OSA_Char out_amr[M4XVSS_MAX_PATH_LEN];
- /*UTF conversion support*/
- M4OSA_Char* pDecodedPath = M4OSA_NULL;
-
- /**
- * Free the PTO3GPP callback context */
- if(M4OSA_NULL != xVSS_context->pCallBackCtxt)
- {
- free(xVSS_context->pCallBackCtxt);
- xVSS_context->pCallBackCtxt = M4OSA_NULL;
- }
-
- /**
- * Finalize the output file */
- err = M4PTO3GPP_Close(xVSS_context->pM4PTO3GPP_Ctxt);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4PTO3GPP_Close returned 0x%x\n",err);
- M4PTO3GPP_CleanUp(xVSS_context->pM4PTO3GPP_Ctxt);
- return err;
- }
-
- /**
- * Free this M4PTO3GPP instance */
- err = M4PTO3GPP_CleanUp(xVSS_context->pM4PTO3GPP_Ctxt);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4PTO3GPP_CleanUp returned 0x%x\n",err);
- return err;
- }
-
- /**
- * Remove dummy.amr file */
- M4OSA_chrNCopy(out_amr, xVSS_context->pTempPath, M4XVSS_MAX_PATH_LEN - 1);
- strncat((char *)out_amr, (const char *)"dummy.amr\0", 10);
-
- /**
- * UTF conversion: convert the temporary path into the customer format*/
- pDecodedPath = out_amr;
-
- if(xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer != M4OSA_NULL)
- {
- M4OSA_UInt32 length = 0;
- err = M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void*) out_amr,
- (M4OSA_Void*) xVSS_context->UTFConversionContext.pTempOutConversionBuffer, &length);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalStopConvertPictureTo3gp:\
- M4xVSS_internalConvertFromUTF8 returns err: 0x%x",err);
- return err;
- }
- pDecodedPath = xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
- /**
- * End of the conversion, now use the decoded path*/
- remove((const char *)pDecodedPath);
-
- /*Commented because of the use of the UTF conversion*/
-/* remove(out_amr);
- */
-
- xVSS_context->pM4PTO3GPP_Ctxt = M4OSA_NULL;
- xVSS_context->pCallBackCtxt = M4OSA_NULL;
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalConvertRGBtoYUV(M4xVSS_FramingStruct* framingCtx)
- * @brief This function converts an RGB565 plane to YUV420 planar
- * @note It is used only for framing effect
- * It allocates output YUV planes
- * @param framingCtx (IN) The framing struct containing input RGB565 plane
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- * @return M4ERR_ALLOC: Allocation error (no more memory)
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalConvertRGBtoYUV(M4xVSS_FramingStruct* framingCtx)
-{
- M4OSA_ERR err;
-
- /**
- * Allocate output YUV planes */
- framingCtx->FramingYuv = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc(3*sizeof(M4VIFI_ImagePlane),
- M4VS, (M4OSA_Char *)"M4xVSS_internalConvertRGBtoYUV: Output plane YUV");
- if(framingCtx->FramingYuv == M4OSA_NULL)
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertRGBtoYUV");
- return M4ERR_ALLOC;
- }
- framingCtx->FramingYuv[0].u_width = framingCtx->FramingRgb->u_width;
- framingCtx->FramingYuv[0].u_height = framingCtx->FramingRgb->u_height;
- framingCtx->FramingYuv[0].u_topleft = 0;
- framingCtx->FramingYuv[0].u_stride = framingCtx->FramingRgb->u_width;
- framingCtx->FramingYuv[0].pac_data =
- (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc((framingCtx->FramingYuv[0].u_width\
- *framingCtx->FramingYuv[0].u_height*3)>>1, M4VS, (M4OSA_Char *)\
- "Alloc for the Convertion output YUV");;
- if(framingCtx->FramingYuv[0].pac_data == M4OSA_NULL)
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertRGBtoYUV");
- return M4ERR_ALLOC;
- }
- framingCtx->FramingYuv[1].u_width = (framingCtx->FramingRgb->u_width)>>1;
- framingCtx->FramingYuv[1].u_height = (framingCtx->FramingRgb->u_height)>>1;
- framingCtx->FramingYuv[1].u_topleft = 0;
- framingCtx->FramingYuv[1].u_stride = (framingCtx->FramingRgb->u_width)>>1;
- framingCtx->FramingYuv[1].pac_data = framingCtx->FramingYuv[0].pac_data \
- + framingCtx->FramingYuv[0].u_width * framingCtx->FramingYuv[0].u_height;
- framingCtx->FramingYuv[2].u_width = (framingCtx->FramingRgb->u_width)>>1;
- framingCtx->FramingYuv[2].u_height = (framingCtx->FramingRgb->u_height)>>1;
- framingCtx->FramingYuv[2].u_topleft = 0;
- framingCtx->FramingYuv[2].u_stride = (framingCtx->FramingRgb->u_width)>>1;
- framingCtx->FramingYuv[2].pac_data = framingCtx->FramingYuv[1].pac_data \
- + framingCtx->FramingYuv[1].u_width * framingCtx->FramingYuv[1].u_height;
-
- /**
- * Convert input RGB 565 to YUV 420 to be able to merge it with output video in framing
- effect */
- err = M4VIFI_xVSS_RGB565toYUV420(M4OSA_NULL, framingCtx->FramingRgb, framingCtx->FramingYuv);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalConvertRGBtoYUV:\
- error when converting from RGB to YUV: 0x%x\n", err);
- }
-
- framingCtx->duration = 0;
- framingCtx->previousClipTime = -1;
- framingCtx->previewOffsetClipTime = -1;
-
- /**
- * Only one element in the chained list (no animated image with RGB buffer...) */
- framingCtx->pCurrent = framingCtx;
- framingCtx->pNext = framingCtx;
-
- return M4NO_ERROR;
-}
-
-M4OSA_ERR M4xVSS_internalSetPlaneTransparent(M4OSA_UInt8* planeIn, M4OSA_UInt32 size)
-{
- M4OSA_UInt32 i;
- M4OSA_UInt8* plane = planeIn;
- M4OSA_UInt8 transparent1 = (M4OSA_UInt8)((TRANSPARENT_COLOR & 0xFF00)>>8);
- M4OSA_UInt8 transparent2 = (M4OSA_UInt8)TRANSPARENT_COLOR;
-
- for(i=0; i<(size>>1); i++)
- {
- *plane++ = transparent1;
- *plane++ = transparent2;
- }
-
- return M4NO_ERROR;
-}
-
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalConvertARBG888toYUV420_FrammingEffect(M4OSA_Context pContext,
- * M4VSS3GPP_EffectSettings* pEffect,
- * M4xVSS_FramingStruct* framingCtx,
- M4VIDEOEDITING_VideoFrameSize OutputVideoResolution)
- *
- * @brief This function converts ARGB8888 input file to YUV420 whenused for framming effect
- * @note The input ARGB8888 file path is contained in the pEffect structure
- * If the ARGB8888 must be resized to fit output video size, this function
- * will do it.
- * @param pContext (IN) The integrator own context
- * @param pEffect (IN) The effect structure containing all informations on
- * the file to decode, resizing ...
- * @param framingCtx (IN/OUT) Structure in which the output RGB will be stored
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- * @return M4ERR_ALLOC: Allocation error (no more memory)
- * @return M4ERR_FILE_NOT_FOUND: File not found.
- ******************************************************************************
- */
-
-
-M4OSA_ERR M4xVSS_internalConvertARGB888toYUV420_FrammingEffect(M4OSA_Context pContext,
- M4VSS3GPP_EffectSettings* pEffect,
- M4xVSS_FramingStruct* framingCtx,
- M4VIDEOEDITING_VideoFrameSize\
- OutputVideoResolution)
-{
- M4OSA_ERR err = M4NO_ERROR;
- M4OSA_Context pARGBIn;
- M4OSA_UInt32 file_size;
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4OSA_UInt32 width, height, width_out, height_out;
- M4OSA_Void* pFile = pEffect->xVSS.pFramingFilePath;
- M4OSA_UInt8 transparent1 = (M4OSA_UInt8)((TRANSPARENT_COLOR & 0xFF00)>>8);
- M4OSA_UInt8 transparent2 = (M4OSA_UInt8)TRANSPARENT_COLOR;
- /*UTF conversion support*/
- M4OSA_Char* pDecodedPath = M4OSA_NULL;
- M4OSA_UInt32 i = 0,j = 0;
- M4VIFI_ImagePlane rgbPlane;
- M4OSA_UInt32 frameSize_argb=(framingCtx->width * framingCtx->height * 4);
- M4OSA_UInt32 frameSize;
- M4OSA_UInt32 tempAlphaPercent = 0;
- M4VIFI_UInt8* TempPacData = M4OSA_NULL;
- M4OSA_UInt16 *ptr = M4OSA_NULL;
- M4OSA_UInt32 z = 0;
-
- M4OSA_TRACE3_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect: Entering ");
-
- M4OSA_TRACE1_2("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect width and height %d %d ",
- framingCtx->width,framingCtx->height);
-
- M4OSA_UInt8 *pTmpData = (M4OSA_UInt8*) M4OSA_32bitAlignedMalloc(frameSize_argb, M4VS, (M4OSA_Char*)\
- "Image argb data");
- if(pTmpData == M4OSA_NULL) {
- M4OSA_TRACE1_0("Failed to allocate memory for Image clip");
- return M4ERR_ALLOC;
- }
- /**
- * UTF conversion: convert the file path into the customer format*/
- pDecodedPath = pFile;
-
- if(xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer != M4OSA_NULL)
- {
- M4OSA_UInt32 length = 0;
- err = M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void*) pFile,
- (M4OSA_Void*) xVSS_context->UTFConversionContext.pTempOutConversionBuffer, &length);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalDecodePNG:\
- M4xVSS_internalConvertFromUTF8 returns err: 0x%x",err);
- free(pTmpData);
- pTmpData = M4OSA_NULL;
- return err;
- }
- pDecodedPath = xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the conversion, now use the decoded path*/
-
- /* Open input ARGB8888 file and store it into memory */
- err = xVSS_context->pFileReadPtr->openRead(&pARGBIn, pDecodedPath, M4OSA_kFileRead);
-
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_2("Can't open input ARGB8888 file %s, error: 0x%x\n",pFile, err);
- free(pTmpData);
- pTmpData = M4OSA_NULL;
- return err;
- }
-
- err = xVSS_context->pFileReadPtr->readData(pARGBIn,(M4OSA_MemAddr8)pTmpData, &frameSize_argb);
- if(err != M4NO_ERROR)
- {
- xVSS_context->pFileReadPtr->closeRead(pARGBIn);
- free(pTmpData);
- pTmpData = M4OSA_NULL;
- return err;
- }
-
-
- err = xVSS_context->pFileReadPtr->closeRead(pARGBIn);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_2("Can't close input png file %s, error: 0x%x\n",pFile, err);
- free(pTmpData);
- pTmpData = M4OSA_NULL;
- return err;
- }
-
-
- rgbPlane.u_height = framingCtx->height;
- rgbPlane.u_width = framingCtx->width;
- rgbPlane.u_stride = rgbPlane.u_width*3;
- rgbPlane.u_topleft = 0;
-
- frameSize = (rgbPlane.u_width * rgbPlane.u_height * 3); //Size of RGB888 data
- rgbPlane.pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(((frameSize)+ (2 * framingCtx->width)),
- M4VS, (M4OSA_Char*)"Image clip RGB888 data");
- if(rgbPlane.pac_data == M4OSA_NULL)
- {
- M4OSA_TRACE1_0("Failed to allocate memory for Image clip");
- free(pTmpData);
- return M4ERR_ALLOC;
- }
-
- M4OSA_TRACE1_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect:\
- Remove the alpha channel ");
-
- /* premultiplied alpha % on RGB */
- for (i=0, j = 0; i < frameSize_argb; i += 4) {
- /* this is alpha value */
- if ((i % 4) == 0)
- {
- tempAlphaPercent = pTmpData[i];
- }
-
- /* R */
- rgbPlane.pac_data[j] = pTmpData[i+1];
- j++;
-
- /* G */
- if (tempAlphaPercent > 0) {
- rgbPlane.pac_data[j] = pTmpData[i+2];
- j++;
- } else {/* In case of alpha value 0, make GREEN to 255 */
- rgbPlane.pac_data[j] = 255; //pTmpData[i+2];
- j++;
- }
-
- /* B */
- rgbPlane.pac_data[j] = pTmpData[i+3];
- j++;
- }
-
- free(pTmpData);
- pTmpData = M4OSA_NULL;
-
- /* convert RGB888 to RGB565 */
-
- /* allocate temp RGB 565 buffer */
- TempPacData = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize +
- (4 * (framingCtx->width + framingCtx->height + 1)),
- M4VS, (M4OSA_Char*)"Image clip RGB565 data");
- if (TempPacData == M4OSA_NULL) {
- M4OSA_TRACE1_0("Failed to allocate memory for Image clip RGB565 data");
- free(rgbPlane.pac_data);
- return M4ERR_ALLOC;
- }
-
- ptr = (M4OSA_UInt16 *)TempPacData;
- z = 0;
-
- for (i = 0; i < j ; i += 3)
- {
- ptr[z++] = PACK_RGB565(0, rgbPlane.pac_data[i],
- rgbPlane.pac_data[i+1],
- rgbPlane.pac_data[i+2]);
- }
-
- /* free the RBG888 and assign RGB565 */
- free(rgbPlane.pac_data);
- rgbPlane.pac_data = TempPacData;
-
- /**
- * Check if output sizes are odd */
- if(rgbPlane.u_height % 2 != 0)
- {
- M4VIFI_UInt8* output_pac_data = rgbPlane.pac_data;
- M4OSA_UInt32 i;
- M4OSA_TRACE1_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect:\
- output height is odd ");
- output_pac_data +=rgbPlane.u_width * rgbPlane.u_height*2;
-
- for(i=0;i<rgbPlane.u_width;i++)
- {
- *output_pac_data++ = transparent1;
- *output_pac_data++ = transparent2;
- }
-
- /**
- * We just add a white line to the PNG that will be transparent */
- rgbPlane.u_height++;
- }
- if(rgbPlane.u_width % 2 != 0)
- {
- /**
- * We add a new column of white (=transparent), but we need to parse all RGB lines ... */
- M4OSA_UInt32 i;
- M4VIFI_UInt8* newRGBpac_data;
- M4VIFI_UInt8* output_pac_data, *input_pac_data;
-
- rgbPlane.u_width++;
- M4OSA_TRACE1_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect: \
- output width is odd ");
- /**
- * We need to allocate a new RGB output buffer in which all decoded data
- + white line will be copied */
- newRGBpac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(rgbPlane.u_height*rgbPlane.u_width*2\
- *sizeof(M4VIFI_UInt8), M4VS, (M4OSA_Char *)"New Framing GIF Output pac_data RGB");
-
- if(newRGBpac_data == M4OSA_NULL)
- {
- M4OSA_TRACE1_0("Allocation error in \
- M4xVSS_internalConvertARGB888toYUV420_FrammingEffect");
- free(rgbPlane.pac_data);
- return M4ERR_ALLOC;
- }
-
- output_pac_data= newRGBpac_data;
- input_pac_data = rgbPlane.pac_data;
-
- for(i=0;i<rgbPlane.u_height;i++)
- {
- memcpy((void *)output_pac_data, (void *)input_pac_data,
- (rgbPlane.u_width-1)*2);
-
- output_pac_data += ((rgbPlane.u_width-1)*2);
- /* Put the pixel to transparency color */
- *output_pac_data++ = transparent1;
- *output_pac_data++ = transparent2;
-
- input_pac_data += ((rgbPlane.u_width-1)*2);
- }
- free(rgbPlane.pac_data);
- rgbPlane.pac_data = newRGBpac_data;
- }
-
- /* reset stride */
- rgbPlane.u_stride = rgbPlane.u_width*2;
-
- /**
- * Initialize chained list parameters */
- framingCtx->duration = 0;
- framingCtx->previousClipTime = -1;
- framingCtx->previewOffsetClipTime = -1;
-
- /**
- * Only one element in the chained list (no animated image ...) */
- framingCtx->pCurrent = framingCtx;
- framingCtx->pNext = framingCtx;
-
- /**
- * Get output width/height */
- switch(OutputVideoResolution)
- //switch(xVSS_context->pSettings->xVSS.outputVideoSize)
- {
- case M4VIDEOEDITING_kSQCIF:
- width_out = 128;
- height_out = 96;
- break;
- case M4VIDEOEDITING_kQQVGA:
- width_out = 160;
- height_out = 120;
- break;
- case M4VIDEOEDITING_kQCIF:
- width_out = 176;
- height_out = 144;
- break;
- case M4VIDEOEDITING_kQVGA:
- width_out = 320;
- height_out = 240;
- break;
- case M4VIDEOEDITING_kCIF:
- width_out = 352;
- height_out = 288;
- break;
- case M4VIDEOEDITING_kVGA:
- width_out = 640;
- height_out = 480;
- break;
- case M4VIDEOEDITING_kWVGA:
- width_out = 800;
- height_out = 480;
- break;
- case M4VIDEOEDITING_kNTSC:
- width_out = 720;
- height_out = 480;
- break;
- case M4VIDEOEDITING_k640_360:
- width_out = 640;
- height_out = 360;
- break;
- case M4VIDEOEDITING_k854_480:
- // StageFright encoders require %16 resolution
- width_out = M4ENCODER_854_480_Width;
- height_out = 480;
- break;
- case M4VIDEOEDITING_k1280_720:
- width_out = 1280;
- height_out = 720;
- break;
- case M4VIDEOEDITING_k1080_720:
- // StageFright encoders require %16 resolution
- width_out = M4ENCODER_1080_720_Width;
- height_out = 720;
- break;
- case M4VIDEOEDITING_k960_720:
- width_out = 960;
- height_out = 720;
- break;
- case M4VIDEOEDITING_k1920_1080:
- width_out = 1920;
- height_out = M4ENCODER_1920_1080_Height;
- break;
- /**
- * If output video size is not given, we take QCIF size,
- * should not happen, because already done in M4xVSS_sendCommand */
- default:
- width_out = 176;
- height_out = 144;
- break;
- }
-
- /**
- * Allocate output planes structures */
- framingCtx->FramingRgb = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc(sizeof(M4VIFI_ImagePlane), M4VS,
- (M4OSA_Char *)"Framing Output plane RGB");
- if(framingCtx->FramingRgb == M4OSA_NULL)
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertARGB888toYUV420_FrammingEffect");
- return M4ERR_ALLOC;
- }
- /**
- * Resize RGB if needed */
- if((pEffect->xVSS.bResize) &&
- (rgbPlane.u_width != width_out || rgbPlane.u_height != height_out))
- {
- width = width_out;
- height = height_out;
-
- M4OSA_TRACE1_2("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect: \
- New Width and height %d %d ",width,height);
-
- framingCtx->FramingRgb->u_height = height_out;
- framingCtx->FramingRgb->u_width = width_out;
- framingCtx->FramingRgb->u_stride = framingCtx->FramingRgb->u_width*2;
- framingCtx->FramingRgb->u_topleft = 0;
-
- framingCtx->FramingRgb->pac_data =
- (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(framingCtx->FramingRgb->u_height*framingCtx->\
- FramingRgb->u_width*2*sizeof(M4VIFI_UInt8), M4VS,
- (M4OSA_Char *)"Framing Output pac_data RGB");
-
- if(framingCtx->FramingRgb->pac_data == M4OSA_NULL)
- {
- M4OSA_TRACE1_0("Allocation error in \
- M4xVSS_internalConvertARGB888toYUV420_FrammingEffect");
- free(framingCtx->FramingRgb);
- free(rgbPlane.pac_data);
- return M4ERR_ALLOC;
- }
-
- M4OSA_TRACE1_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect: Resizing Needed ");
- M4OSA_TRACE1_2("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect:\
- rgbPlane.u_height & rgbPlane.u_width %d %d",rgbPlane.u_height,rgbPlane.u_width);
-
- //err = M4VIFI_ResizeBilinearRGB888toRGB888(M4OSA_NULL, &rgbPlane,framingCtx->FramingRgb);
- err = M4VIFI_ResizeBilinearRGB565toRGB565(M4OSA_NULL, &rgbPlane,framingCtx->FramingRgb);
-
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect :\
- when resizing RGB plane: 0x%x\n", err);
- return err;
- }
-
- if(rgbPlane.pac_data != M4OSA_NULL)
- {
- free(rgbPlane.pac_data);
- rgbPlane.pac_data = M4OSA_NULL;
- }
- }
- else
- {
-
- M4OSA_TRACE1_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect:\
- Resizing Not Needed ");
-
- width = rgbPlane.u_width;
- height = rgbPlane.u_height;
- framingCtx->FramingRgb->u_height = height;
- framingCtx->FramingRgb->u_width = width;
- framingCtx->FramingRgb->u_stride = framingCtx->FramingRgb->u_width*2;
- framingCtx->FramingRgb->u_topleft = 0;
- framingCtx->FramingRgb->pac_data = rgbPlane.pac_data;
- }
-
-
- if(pEffect->xVSS.bResize)
- {
- /**
- * Force topleft to 0 for pure framing effect */
- framingCtx->topleft_x = 0;
- framingCtx->topleft_y = 0;
- }
-
-
- /**
- * Convert RGB output to YUV 420 to be able to merge it with output video in framing
- effect */
- framingCtx->FramingYuv = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc(3*sizeof(M4VIFI_ImagePlane), M4VS,
- (M4OSA_Char *)"Framing Output plane YUV");
- if(framingCtx->FramingYuv == M4OSA_NULL)
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertARGB888toYUV420_FrammingEffect");
- free(framingCtx->FramingRgb->pac_data);
- return M4ERR_ALLOC;
- }
-
- // Alloc for Y, U and V planes
- framingCtx->FramingYuv[0].u_width = ((width+1)>>1)<<1;
- framingCtx->FramingYuv[0].u_height = ((height+1)>>1)<<1;
- framingCtx->FramingYuv[0].u_topleft = 0;
- framingCtx->FramingYuv[0].u_stride = ((width+1)>>1)<<1;
- framingCtx->FramingYuv[0].pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc
- ((framingCtx->FramingYuv[0].u_width*framingCtx->FramingYuv[0].u_height), M4VS,
- (M4OSA_Char *)"Alloc for the output Y");
- if(framingCtx->FramingYuv[0].pac_data == M4OSA_NULL)
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertARGB888toYUV420_FrammingEffect");
- free(framingCtx->FramingYuv);
- free(framingCtx->FramingRgb->pac_data);
- return M4ERR_ALLOC;
- }
- framingCtx->FramingYuv[1].u_width = (((width+1)>>1)<<1)>>1;
- framingCtx->FramingYuv[1].u_height = (((height+1)>>1)<<1)>>1;
- framingCtx->FramingYuv[1].u_topleft = 0;
- framingCtx->FramingYuv[1].u_stride = (((width+1)>>1)<<1)>>1;
-
-
- framingCtx->FramingYuv[1].pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(
- framingCtx->FramingYuv[1].u_width * framingCtx->FramingYuv[1].u_height, M4VS,
- (M4OSA_Char *)"Alloc for the output U");
- if (framingCtx->FramingYuv[1].pac_data == M4OSA_NULL) {
- free(framingCtx->FramingYuv[0].pac_data);
- free(framingCtx->FramingYuv);
- free(framingCtx->FramingRgb->pac_data);
- return M4ERR_ALLOC;
- }
-
- framingCtx->FramingYuv[2].u_width = (((width+1)>>1)<<1)>>1;
- framingCtx->FramingYuv[2].u_height = (((height+1)>>1)<<1)>>1;
- framingCtx->FramingYuv[2].u_topleft = 0;
- framingCtx->FramingYuv[2].u_stride = (((width+1)>>1)<<1)>>1;
-
-
- framingCtx->FramingYuv[2].pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(
- framingCtx->FramingYuv[2].u_width * framingCtx->FramingYuv[0].u_height, M4VS,
- (M4OSA_Char *)"Alloc for the output V");
- if (framingCtx->FramingYuv[2].pac_data == M4OSA_NULL) {
- free(framingCtx->FramingYuv[1].pac_data);
- free(framingCtx->FramingYuv[0].pac_data);
- free(framingCtx->FramingYuv);
- free(framingCtx->FramingRgb->pac_data);
- return M4ERR_ALLOC;
- }
-
- M4OSA_TRACE3_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect:\
- convert RGB to YUV ");
-
- //err = M4VIFI_RGB888toYUV420(M4OSA_NULL, framingCtx->FramingRgb, framingCtx->FramingYuv);
- err = M4VIFI_RGB565toYUV420(M4OSA_NULL, framingCtx->FramingRgb, framingCtx->FramingYuv);
-
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("SPS png: error when converting from RGB to YUV: 0x%x\n", err);
- }
- M4OSA_TRACE3_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect: Leaving ");
- return err;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalGenerateEditedFile(M4OSA_Context pContext)
- *
- * @brief This function prepares VSS for editing
- * @note It also set special xVSS effect as external effects for the VSS
- * @param pContext (IN) The integrator own context
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- * @return M4ERR_ALLOC: Allocation error (no more memory)
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalGenerateEditedFile(M4OSA_Context pContext)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4VSS3GPP_EditContext pVssCtxt;
- M4OSA_UInt32 i,j;
- M4OSA_ERR err;
-
- /**
- * Create a VSS 3GPP edition instance */
- err = M4VSS3GPP_editInit( &pVssCtxt, xVSS_context->pFileReadPtr, xVSS_context->pFileWritePtr);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalGenerateEditedFile: M4VSS3GPP_editInit returned 0x%x\n",
- err);
- M4VSS3GPP_editCleanUp(pVssCtxt);
- /**
- * Set the VSS context to NULL */
- xVSS_context->pCurrentEditContext = M4OSA_NULL;
- return err;
- }
-
- M4VSS3GPP_InternalEditContext* pVSSContext =
- (M4VSS3GPP_InternalEditContext*)pVssCtxt;
- pVSSContext->xVSS.outputVideoFormat =
- xVSS_context->pSettings->xVSS.outputVideoFormat;
- pVSSContext->xVSS.outputVideoSize =
- xVSS_context->pSettings->xVSS.outputVideoSize ;
- pVSSContext->xVSS.outputAudioFormat =
- xVSS_context->pSettings->xVSS.outputAudioFormat;
- pVSSContext->xVSS.outputAudioSamplFreq =
- xVSS_context->pSettings->xVSS.outputAudioSamplFreq;
- pVSSContext->xVSS.outputVideoBitrate =
- xVSS_context->pSettings->xVSS.outputVideoBitrate ;
- pVSSContext->xVSS.outputAudioBitrate =
- xVSS_context->pSettings->xVSS.outputAudioBitrate ;
- pVSSContext->xVSS.bAudioMono =
- xVSS_context->pSettings->xVSS.bAudioMono;
- pVSSContext->xVSS.outputVideoProfile =
- xVSS_context->pSettings->xVSS.outputVideoProfile;
- pVSSContext->xVSS.outputVideoLevel =
- xVSS_context->pSettings->xVSS.outputVideoLevel;
- /* In case of MMS use case, we fill directly into the VSS context the targeted bitrate */
- if(xVSS_context->targetedBitrate != 0)
- {
- M4VSS3GPP_InternalEditContext* pVSSContext = (M4VSS3GPP_InternalEditContext*)pVssCtxt;
-
- pVSSContext->bIsMMS = M4OSA_TRUE;
- pVSSContext->uiMMSVideoBitrate = xVSS_context->targetedBitrate;
- pVSSContext->MMSvideoFramerate = xVSS_context->pSettings->videoFrameRate;
- }
-
- /*Warning: since the adding of the UTF conversion, pSettings has been changed in the next
- part in pCurrentEditSettings (there is a specific current editing structure for the saving,
- as for the preview)*/
-
- /**
- * Set the external video effect functions, for saving mode (to be moved to
- M4xVSS_saveStart() ?)*/
- for (i=0; i<xVSS_context->pCurrentEditSettings->uiClipNumber; i++)
- {
- for (j=0; j<xVSS_context->pCurrentEditSettings->nbEffects; j++)
- {
- if (M4xVSS_kVideoEffectType_BlackAndWhite ==
- xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType)
- {
- xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct =
- M4VSS3GPP_externalVideoEffectColor;
- //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- // (M4OSA_Void*)M4xVSS_kVideoEffectType_BlackAndWhite;
- /*commented FB*/
- /**
- * We do not need to set the color context, it is already set
- during sendCommand function */
- }
- if (M4xVSS_kVideoEffectType_Pink ==
- xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType)
- {
- xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct =
- M4VSS3GPP_externalVideoEffectColor;
- //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- // (M4OSA_Void*)M4xVSS_kVideoEffectType_Pink; /**< we don't
- // use any function context */
- /*commented FB*/
- /**
- * We do not need to set the color context,
- it is already set during sendCommand function */
- }
- if (M4xVSS_kVideoEffectType_Green ==
- xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType)
- {
- xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct =
- M4VSS3GPP_externalVideoEffectColor;
- //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- // (M4OSA_Void*)M4xVSS_kVideoEffectType_Green;
- /**< we don't use any function context */
- /*commented FB*/
- /**
- * We do not need to set the color context, it is already set during
- sendCommand function */
- }
- if (M4xVSS_kVideoEffectType_Sepia ==
- xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType)
- {
- xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct =
- M4VSS3GPP_externalVideoEffectColor;
- //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- // (M4OSA_Void*)M4xVSS_kVideoEffectType_Sepia;
- /**< we don't use any function context */
- /*commented FB*/
- /**
- * We do not need to set the color context, it is already set during
- sendCommand function */
- }
- if (M4xVSS_kVideoEffectType_Fifties ==
- xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType)
- {
- xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct =
- M4VSS3GPP_externalVideoEffectFifties;
- /**
- * We do not need to set the framing context, it is already set during
- sendCommand function */
- }
- if (M4xVSS_kVideoEffectType_Negative ==
- xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType)
- {
- xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct =
- M4VSS3GPP_externalVideoEffectColor;
- //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- // (M4OSA_Void*)M4xVSS_kVideoEffectType_Negative;
- /**< we don't use any function context */
- /*commented FB*/
- /**
- * We do not need to set the color context, it is already set during
- sendCommand function */
- }
- if (M4xVSS_kVideoEffectType_Framing ==
- xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType)
- {
- xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct =
- M4VSS3GPP_externalVideoEffectFraming;
- /**
- * We do not need to set the framing context, it is already set during
- sendCommand function */
- }
- if (M4xVSS_kVideoEffectType_ZoomIn ==
- xVSS_context->pSettings->Effects[j].VideoEffectType)
- {
- xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct =
- M4VSS3GPP_externalVideoEffectZoom;
- xVSS_context->pCurrentEditSettings->Effects[j].pExtVideoEffectFctCtxt =
- (M4OSA_Void*)M4xVSS_kVideoEffectType_ZoomIn; /**< we don't use any
- function context */
- }
- if (M4xVSS_kVideoEffectType_ZoomOut ==
- xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType)
- {
- xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct =
- M4VSS3GPP_externalVideoEffectZoom;
- xVSS_context->pCurrentEditSettings->Effects[j].pExtVideoEffectFctCtxt =
- (M4OSA_Void*)M4xVSS_kVideoEffectType_ZoomOut; /**< we don't use any
- function context */
- }
- if (M4xVSS_kVideoEffectType_ColorRGB16 ==
- xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType)
- {
- xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct =
- M4VSS3GPP_externalVideoEffectColor;
- //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- // (M4OSA_Void*)M4xVSS_kVideoEffectType_ColorRGB16;
- /**< we don't use any function context */
- /**
- * We do not need to set the color context, it is already set during
- sendCommand function */
- }
- if (M4xVSS_kVideoEffectType_Gradient ==
- xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType)
- {
- xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct =
- M4VSS3GPP_externalVideoEffectColor;
- //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- // (M4OSA_Void*)M4xVSS_kVideoEffectType_ColorRGB16;
- /**< we don't use any function context */
- /**
- * We do not need to set the color context, it is already set during
- sendCommand function */
- }
-
- }
- }
-
- /**
- * Open the VSS 3GPP */
- err = M4VSS3GPP_editOpen(pVssCtxt, xVSS_context->pCurrentEditSettings);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalGenerateEditedFile:\
- M4VSS3GPP_editOpen returned 0x%x\n",err);
- M4VSS3GPP_editCleanUp(pVssCtxt);
- /**
- * Set the VSS context to NULL */
- xVSS_context->pCurrentEditContext = M4OSA_NULL;
- return err;
- }
-
- /**
- * Save VSS context to be able to close / free VSS later */
- xVSS_context->pCurrentEditContext = pVssCtxt;
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalCloseEditedFile(M4OSA_Context pContext)
- *
- * @brief This function cleans up VSS
- * @note
- * @param pContext (IN) The integrator own context
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalCloseEditedFile(M4OSA_Context pContext)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4VSS3GPP_EditContext pVssCtxt = xVSS_context->pCurrentEditContext;
- M4OSA_ERR err;
-
- if(xVSS_context->pCurrentEditContext != M4OSA_NULL)
- {
- /**
- * Close the VSS 3GPP */
- err = M4VSS3GPP_editClose(pVssCtxt);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalCloseEditedFile:\
- M4VSS3GPP_editClose returned 0x%x\n",err);
- M4VSS3GPP_editCleanUp(pVssCtxt);
- /**
- * Set the VSS context to NULL */
- xVSS_context->pCurrentEditContext = M4OSA_NULL;
- return err;
- }
-
- /**
- * Free this VSS3GPP edition instance */
- err = M4VSS3GPP_editCleanUp(pVssCtxt);
- /**
- * Set the VSS context to NULL */
- xVSS_context->pCurrentEditContext = M4OSA_NULL;
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalCloseEditedFile: \
- M4VSS3GPP_editCleanUp returned 0x%x\n",err);
- return err;
- }
- }
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalGenerateAudioMixFile(M4OSA_Context pContext)
- *
- * @brief This function prepares VSS for audio mixing
- * @note It takes its parameters from the BGM settings in the xVSS internal context
- * @param pContext (IN) The integrator own context
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- * @return M4ERR_ALLOC: Allocation error (no more memory)
- ******************************************************************************
- */
-/***
- * FB: the function has been modified since the structure used for the saving is now the
- * pCurrentEditSettings and not the pSettings
- * This change has been added for the UTF support
- * All the "xVSS_context->pSettings" has been replaced by "xVSS_context->pCurrentEditSettings"
- ***/
-M4OSA_ERR M4xVSS_internalGenerateAudioMixFile(M4OSA_Context pContext)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4VSS3GPP_AudioMixingSettings* pAudioMixSettings;
- M4VSS3GPP_AudioMixingContext pAudioMixingCtxt;
- M4OSA_ERR err;
- M4VIDEOEDITING_ClipProperties fileProperties;
-
- /**
- * Allocate audio mixing settings structure and fill it with BGM parameters */
- pAudioMixSettings = (M4VSS3GPP_AudioMixingSettings*)M4OSA_32bitAlignedMalloc
- (sizeof(M4VSS3GPP_AudioMixingSettings), M4VS, (M4OSA_Char *)"pAudioMixSettings");
- if(pAudioMixSettings == M4OSA_NULL)
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_internalGenerateAudioMixFile");
- return M4ERR_ALLOC;
- }
-
- if(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->FileType ==
- M4VIDEOEDITING_kFileType_3GPP)
- {
- err = M4xVSS_internalGetProperties((M4OSA_Context)xVSS_context,
- (M4OSA_Char*)xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile,
- &fileProperties);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalGenerateAudioMixFile:\
- impossible to retrieve audio BGM properties ->\
- reencoding audio background music", err);
- fileProperties.AudioStreamType =
- xVSS_context->pCurrentEditSettings->xVSS.outputAudioFormat+1;
- /* To force BGM encoding */
- }
- }
-
- pAudioMixSettings->bRemoveOriginal = M4OSA_FALSE;
- pAudioMixSettings->AddedAudioFileType =
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->FileType;
- pAudioMixSettings->pAddedAudioTrackFile =
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile;
- pAudioMixSettings->uiAddVolume =
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->uiAddVolume;
-
- pAudioMixSettings->outputAudioFormat = xVSS_context->pSettings->xVSS.outputAudioFormat;
- pAudioMixSettings->outputASF = xVSS_context->pSettings->xVSS.outputAudioSamplFreq;
- pAudioMixSettings->outputAudioBitrate = xVSS_context->pSettings->xVSS.outputAudioBitrate;
- pAudioMixSettings->uiSamplingFrequency =
- xVSS_context->pSettings->xVSS.pBGMtrack->uiSamplingFrequency;
- pAudioMixSettings->uiNumChannels = xVSS_context->pSettings->xVSS.pBGMtrack->uiNumChannels;
-
- pAudioMixSettings->b_DuckingNeedeed =
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->b_DuckingNeedeed;
- pAudioMixSettings->fBTVolLevel =
- (M4OSA_Float )xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->uiAddVolume/100;
- pAudioMixSettings->InDucking_threshold =
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->InDucking_threshold;
- pAudioMixSettings->InDucking_lowVolume =
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->lowVolume/100;
- pAudioMixSettings->fPTVolLevel =
- (M4OSA_Float)xVSS_context->pSettings->PTVolLevel/100;
- pAudioMixSettings->bLoop = xVSS_context->pSettings->xVSS.pBGMtrack->bLoop;
-
- if(xVSS_context->pSettings->xVSS.bAudioMono)
- {
- pAudioMixSettings->outputNBChannels = 1;
- }
- else
- {
- pAudioMixSettings->outputNBChannels = 2;
- }
-
- /**
- * Fill audio mix settings with BGM parameters */
- pAudioMixSettings->uiBeginLoop =
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->uiBeginLoop;
- pAudioMixSettings->uiEndLoop =
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->uiEndLoop;
- pAudioMixSettings->uiAddCts =
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->uiAddCts;
-
- /**
- * Output file of the audio mixer will be final file (audio mixing is the last step) */
- pAudioMixSettings->pOutputClipFile = xVSS_context->pOutputFile;
- pAudioMixSettings->pTemporaryFile = xVSS_context->pTemporaryFile;
-
- /**
- * Input file of the audio mixer is a temporary file containing all audio/video editions */
- pAudioMixSettings->pOriginalClipFile = xVSS_context->pCurrentEditSettings->pOutputFile;
-
- /**
- * Save audio mixing settings pointer to be able to free it in
- M4xVSS_internalCloseAudioMixedFile function */
- xVSS_context->pAudioMixSettings = pAudioMixSettings;
-
- /**
- * Create a VSS 3GPP audio mixing instance */
- err = M4VSS3GPP_audioMixingInit(&pAudioMixingCtxt, pAudioMixSettings,
- xVSS_context->pFileReadPtr, xVSS_context->pFileWritePtr);
-
- /**
- * Save audio mixing context to be able to call audio mixing step function in
- M4xVSS_step function */
- xVSS_context->pAudioMixContext = pAudioMixingCtxt;
-
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalGenerateAudioMixFile:\
- M4VSS3GPP_audioMixingInit returned 0x%x\n",err);
- //M4VSS3GPP_audioMixingCleanUp(pAudioMixingCtxt);
- return err;
- }
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalCloseAudioMixedFile(M4OSA_Context pContext)
- *
- * @brief This function cleans up VSS for audio mixing
- * @note
- * @param pContext (IN) The integrator own context
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalCloseAudioMixedFile(M4OSA_Context pContext)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4OSA_ERR err;
-
- /**
- * Free this VSS3GPP audio mixing instance */
- if(xVSS_context->pAudioMixContext != M4OSA_NULL)
- {
- err = M4VSS3GPP_audioMixingCleanUp(xVSS_context->pAudioMixContext);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalCloseAudioMixedFile:\
- M4VSS3GPP_audioMixingCleanUp returned 0x%x\n",err);
- return err;
- }
- }
-
- /**
- * Free VSS audio mixing settings */
- if(xVSS_context->pAudioMixSettings != M4OSA_NULL)
- {
- free(xVSS_context->pAudioMixSettings);
- xVSS_context->pAudioMixSettings = M4OSA_NULL;
- }
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalFreePreview(M4OSA_Context pContext)
- *
- * @brief This function cleans up preview edition structure used to generate
- * preview.3gp file given to the VPS
- * @note It also free the preview structure given to the VPS
- * @param pContext (IN) The integrator own context
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalFreePreview(M4OSA_Context pContext)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4OSA_UInt8 i;
-
- /**
- * Free clip/transition settings */
- for(i=0; i<xVSS_context->pCurrentEditSettings->uiClipNumber; i++)
- {
- M4xVSS_FreeClipSettings(xVSS_context->pCurrentEditSettings->pClipList[i]);
-
- free((xVSS_context->pCurrentEditSettings->pClipList[i]));
- xVSS_context->pCurrentEditSettings->pClipList[i] = M4OSA_NULL;
-
- /**
- * Because there is 1 less transition than clip number */
- if(i != xVSS_context->pCurrentEditSettings->uiClipNumber-1)
- {
- free((xVSS_context->pCurrentEditSettings->pTransitionList[i]));
- xVSS_context->pCurrentEditSettings->pTransitionList[i] = M4OSA_NULL;
- }
- }
-
- /**
- * Free clip/transition list */
- if(xVSS_context->pCurrentEditSettings->pClipList != M4OSA_NULL)
- {
- free((xVSS_context->pCurrentEditSettings->pClipList));
- xVSS_context->pCurrentEditSettings->pClipList = M4OSA_NULL;
- }
- if(xVSS_context->pCurrentEditSettings->pTransitionList != M4OSA_NULL)
- {
- free((xVSS_context->pCurrentEditSettings->pTransitionList));
- xVSS_context->pCurrentEditSettings->pTransitionList = M4OSA_NULL;
- }
-
- /**
- * Free output preview file path */
- if(xVSS_context->pCurrentEditSettings->pOutputFile != M4OSA_NULL)
- {
- free(xVSS_context->pCurrentEditSettings->pOutputFile);
- xVSS_context->pCurrentEditSettings->pOutputFile = M4OSA_NULL;
- }
-
- /**
- * Free temporary preview file path */
- if(xVSS_context->pCurrentEditSettings->pTemporaryFile != M4OSA_NULL)
- {
- remove((const char *)xVSS_context->pCurrentEditSettings->pTemporaryFile);
- free(xVSS_context->pCurrentEditSettings->pTemporaryFile);
- xVSS_context->pCurrentEditSettings->pTemporaryFile = M4OSA_NULL;
- }
-
- /**
- * Free "local" BGM settings */
- if(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack != M4OSA_NULL)
- {
- if(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile != M4OSA_NULL)
- {
- free(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile);
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile = M4OSA_NULL;
- }
- free(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack);
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack = M4OSA_NULL;
- }
-
- /**
- * Free current edit settings structure */
- if(xVSS_context->pCurrentEditSettings != M4OSA_NULL)
- {
- free(xVSS_context->pCurrentEditSettings);
- xVSS_context->pCurrentEditSettings = M4OSA_NULL;
- }
-
- /**
- * Free preview effects given to application */
- if(M4OSA_NULL != xVSS_context->pPreviewSettings->Effects)
- {
- free(xVSS_context->pPreviewSettings->Effects);
- xVSS_context->pPreviewSettings->Effects = M4OSA_NULL;
- xVSS_context->pPreviewSettings->nbEffects = 0;
- }
-
- return M4NO_ERROR;
-}
-
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalFreeSaving(M4OSA_Context pContext)
- *
- * @brief This function cleans up saving edition structure used to generate
- * output.3gp file given to the VPS
- * @note
- * @param pContext (IN) The integrator own context
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalFreeSaving(M4OSA_Context pContext)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4OSA_UInt8 i;
-
- if(xVSS_context->pCurrentEditSettings != M4OSA_NULL)
- {
- /**
- * Free clip/transition settings */
- for(i=0; i<xVSS_context->pCurrentEditSettings->uiClipNumber; i++)
- {
- M4xVSS_FreeClipSettings(xVSS_context->pCurrentEditSettings->pClipList[i]);
-
- free((xVSS_context->pCurrentEditSettings->pClipList[i]));
- xVSS_context->pCurrentEditSettings->pClipList[i] = M4OSA_NULL;
-
- /**
- * Because there is 1 less transition than clip number */
- if(i != xVSS_context->pCurrentEditSettings->uiClipNumber-1)
- {
- free(\
- (xVSS_context->pCurrentEditSettings->pTransitionList[i]));
- xVSS_context->pCurrentEditSettings->pTransitionList[i] = M4OSA_NULL;
- }
- }
-
- /**
- * Free clip/transition list */
- if(xVSS_context->pCurrentEditSettings->pClipList != M4OSA_NULL)
- {
- free((xVSS_context->pCurrentEditSettings->pClipList));
- xVSS_context->pCurrentEditSettings->pClipList = M4OSA_NULL;
- }
- if(xVSS_context->pCurrentEditSettings->pTransitionList != M4OSA_NULL)
- {
- free((xVSS_context->pCurrentEditSettings->pTransitionList));
- xVSS_context->pCurrentEditSettings->pTransitionList = M4OSA_NULL;
- }
-
- if(xVSS_context->pCurrentEditSettings->Effects != M4OSA_NULL)
- {
- free((xVSS_context->pCurrentEditSettings->Effects));
- xVSS_context->pCurrentEditSettings->Effects = M4OSA_NULL;
- xVSS_context->pCurrentEditSettings->nbEffects = 0;
- }
-
- /**
- * Free output saving file path */
- if(xVSS_context->pCurrentEditSettings->pOutputFile != M4OSA_NULL)
- {
- if(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack != M4OSA_NULL)
- {
- remove((const char *)xVSS_context->pCurrentEditSettings->pOutputFile);
- free(xVSS_context->pCurrentEditSettings->pOutputFile);
- }
- if(xVSS_context->pOutputFile != M4OSA_NULL)
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- xVSS_context->pSettings->pOutputFile = M4OSA_NULL;
- xVSS_context->pCurrentEditSettings->pOutputFile = M4OSA_NULL;
- }
-
- /**
- * Free temporary saving file path */
- if(xVSS_context->pCurrentEditSettings->pTemporaryFile != M4OSA_NULL)
- {
- remove((const char *)xVSS_context->pCurrentEditSettings->pTemporaryFile);
- free(xVSS_context->pCurrentEditSettings->pTemporaryFile);
- xVSS_context->pCurrentEditSettings->pTemporaryFile = M4OSA_NULL;
- }
-
- /**
- * Free "local" BGM settings */
- if(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack != M4OSA_NULL)
- {
- if(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile != M4OSA_NULL)
- {
- free(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile);
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile = M4OSA_NULL;
- }
- free(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack);
- xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack = M4OSA_NULL;
- }
-
- /**
- * Free current edit settings structure */
- free(xVSS_context->pCurrentEditSettings);
- xVSS_context->pCurrentEditSettings = M4OSA_NULL;
- }
-
- return M4NO_ERROR;
-}
-
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_freeSettings(M4OSA_Context pContext)
- *
- * @brief This function cleans up an M4VSS3GPP_EditSettings structure
- * @note
- * @param pSettings (IN) Pointer on M4VSS3GPP_EditSettings structure to free
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_freeSettings(M4VSS3GPP_EditSettings* pSettings)
-{
- M4OSA_UInt8 i,j;
-
- /**
- * For each clip ... */
- for(i=0; i<pSettings->uiClipNumber; i++)
- {
- /**
- * ... free clip settings */
- if(pSettings->pClipList[i] != M4OSA_NULL)
- {
- M4xVSS_FreeClipSettings(pSettings->pClipList[i]);
-
- free((pSettings->pClipList[i]));
- pSettings->pClipList[i] = M4OSA_NULL;
- }
-
- /**
- * ... free transition settings */
- if(i < pSettings->uiClipNumber-1) /* Because there is 1 less transition than clip number */
- {
- if(pSettings->pTransitionList[i] != M4OSA_NULL)
- {
- switch (pSettings->pTransitionList[i]->VideoTransitionType)
- {
- case M4xVSS_kVideoTransitionType_AlphaMagic:
-
- /**
- * In case of Alpha Magic transition,
- some extra parameters need to be freed */
- if(pSettings->pTransitionList[i]->pExtVideoTransitionFctCtxt\
- != M4OSA_NULL)
- {
- free((((M4xVSS_internal_AlphaMagicSettings*)\
- pSettings->pTransitionList[i]->pExtVideoTransitionFctCtxt)->\
- pPlane->pac_data));
- ((M4xVSS_internal_AlphaMagicSettings*)pSettings->pTransitionList[i\
- ]->pExtVideoTransitionFctCtxt)->pPlane->pac_data = M4OSA_NULL;
-
- free((((M4xVSS_internal_AlphaMagicSettings*)\
- pSettings->pTransitionList[i]->\
- pExtVideoTransitionFctCtxt)->pPlane));
- ((M4xVSS_internal_AlphaMagicSettings*)pSettings->pTransitionList[i]\
- ->pExtVideoTransitionFctCtxt)->pPlane = M4OSA_NULL;
-
- free((pSettings->pTransitionList[i]->\
- pExtVideoTransitionFctCtxt));
- pSettings->pTransitionList[i]->pExtVideoTransitionFctCtxt = M4OSA_NULL;
-
- for(j=i+1;j<pSettings->uiClipNumber-1;j++)
- {
- if(pSettings->pTransitionList[j] != M4OSA_NULL)
- {
- if(pSettings->pTransitionList[j]->VideoTransitionType ==
- M4xVSS_kVideoTransitionType_AlphaMagic)
- {
- M4OSA_UInt32 pCmpResult=0;
- pCmpResult = strcmp((const char *)pSettings->pTransitionList[i]->\
- xVSS.transitionSpecific.pAlphaMagicSettings->\
- pAlphaFilePath,
- (const char *)pSettings->pTransitionList[j]->\
- xVSS.transitionSpecific.pAlphaMagicSettings->\
- pAlphaFilePath);
- if(pCmpResult == 0)
- {
- /* Free extra internal alpha magic structure and put
- it to NULL to avoid refreeing it */
- free((pSettings->\
- pTransitionList[j]->pExtVideoTransitionFctCtxt));
- pSettings->pTransitionList[j]->\
- pExtVideoTransitionFctCtxt = M4OSA_NULL;
- }
- }
- }
- }
- }
-
- if(pSettings->pTransitionList[i]->\
- xVSS.transitionSpecific.pAlphaMagicSettings != M4OSA_NULL)
- {
- if(pSettings->pTransitionList[i]->\
- xVSS.transitionSpecific.pAlphaMagicSettings->\
- pAlphaFilePath != M4OSA_NULL)
- {
- free(pSettings->\
- pTransitionList[i]->\
- xVSS.transitionSpecific.pAlphaMagicSettings->\
- pAlphaFilePath);
- pSettings->pTransitionList[i]->\
- xVSS.transitionSpecific.pAlphaMagicSettings->\
- pAlphaFilePath = M4OSA_NULL;
- }
- free(pSettings->pTransitionList[i]->\
- xVSS.transitionSpecific.pAlphaMagicSettings);
- pSettings->pTransitionList[i]->\
- xVSS.transitionSpecific.pAlphaMagicSettings = M4OSA_NULL;
-
- }
-
- break;
-
-
- case M4xVSS_kVideoTransitionType_SlideTransition:
- if (M4OSA_NULL != pSettings->pTransitionList[i]->\
- xVSS.transitionSpecific.pSlideTransitionSettings)
- {
- free(pSettings->pTransitionList[i]->\
- xVSS.transitionSpecific.pSlideTransitionSettings);
- pSettings->pTransitionList[i]->\
- xVSS.transitionSpecific.pSlideTransitionSettings = M4OSA_NULL;
- }
- if(pSettings->pTransitionList[i]->pExtVideoTransitionFctCtxt != M4OSA_NULL)
- {
- free((pSettings->pTransitionList[i]->\
- pExtVideoTransitionFctCtxt));
- pSettings->pTransitionList[i]->pExtVideoTransitionFctCtxt = M4OSA_NULL;
- }
- break;
- default:
- break;
-
- }
- /**
- * Free transition settings structure */
- free((pSettings->pTransitionList[i]));
- pSettings->pTransitionList[i] = M4OSA_NULL;
- }
- }
- }
-
- /**
- * Free clip list */
- if(pSettings->pClipList != M4OSA_NULL)
- {
- free((pSettings->pClipList));
- pSettings->pClipList = M4OSA_NULL;
- }
-
- /**
- * Free transition list */
- if(pSettings->pTransitionList != M4OSA_NULL)
- {
- free((pSettings->pTransitionList));
- pSettings->pTransitionList = M4OSA_NULL;
- }
-
- /**
- * RC: Free effects list */
- if(pSettings->Effects != M4OSA_NULL)
- {
- for(i=0; i<pSettings->nbEffects; i++)
- {
- /**
- * For each clip, free framing structure if needed */
- if(pSettings->Effects[i].VideoEffectType == M4xVSS_kVideoEffectType_Framing
- || pSettings->Effects[i].VideoEffectType == M4xVSS_kVideoEffectType_Text)
- {
-#ifdef DECODE_GIF_ON_SAVING
- M4xVSS_FramingContext* framingCtx = pSettings->Effects[i].pExtVideoEffectFctCtxt;
-#else
- M4xVSS_FramingStruct* framingCtx = pSettings->Effects[i].pExtVideoEffectFctCtxt;
- M4xVSS_FramingStruct* framingCtx_save;
- M4xVSS_Framing3102Struct* framingCtx_first = framingCtx;
-#endif
-
-#ifdef DECODE_GIF_ON_SAVING
- if(framingCtx != M4OSA_NULL) /* Bugfix 1.2.0: crash, trying to free non existant
- pointer */
- {
- if(framingCtx->aFramingCtx != M4OSA_NULL)
- {
- {
- if(framingCtx->aFramingCtx->FramingRgb != M4OSA_NULL)
- {
- free(framingCtx->aFramingCtx->\
- FramingRgb->pac_data);
- framingCtx->aFramingCtx->FramingRgb->pac_data = M4OSA_NULL;
- free(framingCtx->aFramingCtx->FramingRgb);
- framingCtx->aFramingCtx->FramingRgb = M4OSA_NULL;
- }
- }
- if(framingCtx->aFramingCtx->FramingYuv != M4OSA_NULL)
- {
- free(framingCtx->aFramingCtx->\
- FramingYuv[0].pac_data);
- framingCtx->aFramingCtx->FramingYuv[0].pac_data = M4OSA_NULL;
- free(framingCtx->aFramingCtx->\
- FramingYuv[1].pac_data);
- framingCtx->aFramingCtx->FramingYuv[1].pac_data = M4OSA_NULL;
- free(framingCtx->aFramingCtx->\
- FramingYuv[2].pac_data);
- framingCtx->aFramingCtx->FramingYuv[2].pac_data = M4OSA_NULL;
- free(framingCtx->aFramingCtx->FramingYuv);
- framingCtx->aFramingCtx->FramingYuv = M4OSA_NULL;
- }
- free(framingCtx->aFramingCtx);
- framingCtx->aFramingCtx = M4OSA_NULL;
- }
- if(framingCtx->aFramingCtx_last != M4OSA_NULL)
- {
- if(framingCtx->aFramingCtx_last->FramingRgb != M4OSA_NULL)
- {
- free(framingCtx->aFramingCtx_last->\
- FramingRgb->pac_data);
- framingCtx->aFramingCtx_last->FramingRgb->pac_data = M4OSA_NULL;
- free(framingCtx->aFramingCtx_last->\
- FramingRgb);
- framingCtx->aFramingCtx_last->FramingRgb = M4OSA_NULL;
- }
- if(framingCtx->aFramingCtx_last->FramingYuv != M4OSA_NULL)
- {
- free(framingCtx->aFramingCtx_last->\
- FramingYuv[0].pac_data);
- framingCtx->aFramingCtx_last->FramingYuv[0].pac_data = M4OSA_NULL;
- free(framingCtx->aFramingCtx_last->FramingYuv);
- framingCtx->aFramingCtx_last->FramingYuv = M4OSA_NULL;
- }
- free(framingCtx->aFramingCtx_last);
- framingCtx->aFramingCtx_last = M4OSA_NULL;
- }
- if(framingCtx->pEffectFilePath != M4OSA_NULL)
- {
- free(framingCtx->pEffectFilePath);
- framingCtx->pEffectFilePath = M4OSA_NULL;
- }
- /*In case there are still allocated*/
- if(framingCtx->pSPSContext != M4OSA_NULL)
- {
- // M4SPS_destroy(framingCtx->pSPSContext);
- framingCtx->pSPSContext = M4OSA_NULL;
- }
- /*Alpha blending structure*/
- if(framingCtx->alphaBlendingStruct != M4OSA_NULL)
- {
- free(framingCtx->alphaBlendingStruct);
- framingCtx->alphaBlendingStruct = M4OSA_NULL;
- }
-
- free(framingCtx);
- framingCtx = M4OSA_NULL;
- }
-#else
- do
- {
- if(framingCtx != M4OSA_NULL) /* Bugfix 1.2.0: crash, trying to free non
- existant pointer */
- {
- if(framingCtx->FramingRgb != M4OSA_NULL)
- {
- free(framingCtx->FramingRgb->pac_data);
- framingCtx->FramingRgb->pac_data = M4OSA_NULL;
- free(framingCtx->FramingRgb);
- framingCtx->FramingRgb = M4OSA_NULL;
- }
- if(framingCtx->FramingYuv != M4OSA_NULL)
- {
- free(framingCtx->FramingYuv[0].pac_data);
- framingCtx->FramingYuv[0].pac_data = M4OSA_NULL;
- free(framingCtx->FramingYuv);
- framingCtx->FramingYuv = M4OSA_NULL;
- }
- framingCtx_save = framingCtx->pNext;
- free(framingCtx);
- framingCtx = M4OSA_NULL;
- framingCtx = framingCtx_save;
- }
- else
- {
- /*FB: bug fix P4ME00003002*/
- break;
- }
- } while(framingCtx_first != framingCtx);
-#endif
- }
- else if( M4xVSS_kVideoEffectType_Fifties == pSettings->Effects[i].VideoEffectType)
- {
- /* Free Fifties context */
- M4xVSS_FiftiesStruct* FiftiesCtx = pSettings->Effects[i].pExtVideoEffectFctCtxt;
-
- if(FiftiesCtx != M4OSA_NULL)
- {
- free(FiftiesCtx);
- FiftiesCtx = M4OSA_NULL;
- }
-
- }
- else if( M4xVSS_kVideoEffectType_ColorRGB16 == pSettings->Effects[i].VideoEffectType
- || M4xVSS_kVideoEffectType_BlackAndWhite == pSettings->Effects[i].VideoEffectType
- || M4xVSS_kVideoEffectType_Pink == pSettings->Effects[i].VideoEffectType
- || M4xVSS_kVideoEffectType_Green == pSettings->Effects[i].VideoEffectType
- || M4xVSS_kVideoEffectType_Sepia == pSettings->Effects[i].VideoEffectType
- || M4xVSS_kVideoEffectType_Negative== pSettings->Effects[i].VideoEffectType
- || M4xVSS_kVideoEffectType_Gradient== pSettings->Effects[i].VideoEffectType)
- {
- /* Free Color context */
- M4xVSS_ColorStruct* ColorCtx = pSettings->Effects[i].pExtVideoEffectFctCtxt;
-
- if(ColorCtx != M4OSA_NULL)
- {
- free(ColorCtx);
- ColorCtx = M4OSA_NULL;
- }
- }
-
- /* Free simple fields */
- if(pSettings->Effects[i].xVSS.pFramingFilePath != M4OSA_NULL)
- {
- free(pSettings->Effects[i].xVSS.pFramingFilePath);
- pSettings->Effects[i].xVSS.pFramingFilePath = M4OSA_NULL;
- }
- if(pSettings->Effects[i].xVSS.pFramingBuffer != M4OSA_NULL)
- {
- free(pSettings->Effects[i].xVSS.pFramingBuffer);
- pSettings->Effects[i].xVSS.pFramingBuffer = M4OSA_NULL;
- }
- if(pSettings->Effects[i].xVSS.pTextBuffer != M4OSA_NULL)
- {
- free(pSettings->Effects[i].xVSS.pTextBuffer);
- pSettings->Effects[i].xVSS.pTextBuffer = M4OSA_NULL;
- }
- }
- free(pSettings->Effects);
- pSettings->Effects = M4OSA_NULL;
- }
-
- return M4NO_ERROR;
-}
-
-M4OSA_ERR M4xVSS_freeCommand(M4OSA_Context pContext)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
-// M4OSA_UInt8 i,j;
-
- /* Free "local" BGM settings */
- if(xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL)
- {
- if(xVSS_context->pSettings->xVSS.pBGMtrack->pFile != M4OSA_NULL)
- {
- free(xVSS_context->pSettings->xVSS.pBGMtrack->pFile);
- xVSS_context->pSettings->xVSS.pBGMtrack->pFile = M4OSA_NULL;
- }
- free(xVSS_context->pSettings->xVSS.pBGMtrack);
- xVSS_context->pSettings->xVSS.pBGMtrack = M4OSA_NULL;
- }
-
- M4xVSS_freeSettings(xVSS_context->pSettings);
-
- if(xVSS_context->pPTo3GPPparamsList != M4OSA_NULL)
- {
- M4xVSS_Pto3GPP_params* pParams = xVSS_context->pPTo3GPPparamsList;
- M4xVSS_Pto3GPP_params* pParams_sauv;
-
- while(pParams != M4OSA_NULL)
- {
- if(pParams->pFileIn != M4OSA_NULL)
- {
- free(pParams->pFileIn);
- pParams->pFileIn = M4OSA_NULL;
- }
- if(pParams->pFileOut != M4OSA_NULL)
- {
- /* Delete temporary file */
- remove((const char *)pParams->pFileOut);
- free(pParams->pFileOut);
- pParams->pFileOut = M4OSA_NULL;
- }
- if(pParams->pFileTemp != M4OSA_NULL)
- {
- /* Delete temporary file */
-#ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE
- remove((const char *)pParams->pFileTemp);
- free(pParams->pFileTemp);
-#endif/*M4xVSS_RESERVED_MOOV_DISK_SPACE*/
- pParams->pFileTemp = M4OSA_NULL;
- }
- pParams_sauv = pParams;
- pParams = pParams->pNext;
- free(pParams_sauv);
- pParams_sauv = M4OSA_NULL;
- }
- }
-
- if(xVSS_context->pMCSparamsList != M4OSA_NULL)
- {
- M4xVSS_MCS_params* pParams = xVSS_context->pMCSparamsList;
- M4xVSS_MCS_params* pParams_sauv;
-
- while(pParams != M4OSA_NULL)
- {
- if(pParams->pFileIn != M4OSA_NULL)
- {
- free(pParams->pFileIn);
- pParams->pFileIn = M4OSA_NULL;
- }
- if(pParams->pFileOut != M4OSA_NULL)
- {
- /* Delete temporary file */
- remove((const char *)pParams->pFileOut);
- free(pParams->pFileOut);
- pParams->pFileOut = M4OSA_NULL;
- }
- if(pParams->pFileTemp != M4OSA_NULL)
- {
- /* Delete temporary file */
-#ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE
- remove((const char *)pParams->pFileTemp);
- free(pParams->pFileTemp);
-#endif/*M4xVSS_RESERVED_MOOV_DISK_SPACE*/
- pParams->pFileTemp = M4OSA_NULL;
- }
- pParams_sauv = pParams;
- pParams = pParams->pNext;
- free(pParams_sauv);
- pParams_sauv = M4OSA_NULL;
- }
- }
-
- if(xVSS_context->pcmPreviewFile != M4OSA_NULL)
- {
- free(xVSS_context->pcmPreviewFile);
- xVSS_context->pcmPreviewFile = M4OSA_NULL;
- }
- if(xVSS_context->pSettings->pOutputFile != M4OSA_NULL
- && xVSS_context->pOutputFile != M4OSA_NULL)
- {
- free(xVSS_context->pSettings->pOutputFile);
- xVSS_context->pSettings->pOutputFile = M4OSA_NULL;
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
-
- /* Reinit all context variables */
- xVSS_context->previousClipNumber = 0;
- xVSS_context->editingStep = M4xVSS_kMicroStateEditing;
- xVSS_context->analyseStep = M4xVSS_kMicroStateAnalysePto3GPP;
- xVSS_context->pPTo3GPPparamsList = M4OSA_NULL;
- xVSS_context->pPTo3GPPcurrentParams = M4OSA_NULL;
- xVSS_context->pMCSparamsList = M4OSA_NULL;
- xVSS_context->pMCScurrentParams = M4OSA_NULL;
- xVSS_context->tempFileIndex = 0;
- xVSS_context->targetedTimescale = 0;
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalGetProperties(M4OSA_Context pContext,
- * M4OSA_Char* pFile,
- * M4VIDEOEDITING_ClipProperties *pFileProperties)
- *
- * @brief This function retrieve properties of an input 3GP file using MCS
- * @note
- * @param pContext (IN) The integrator own context
- * @param pFile (IN) 3GP file to analyse
- * @param pFileProperties (IN/OUT) Pointer on a structure that will contain
- * the 3GP file properties
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalGetProperties(M4OSA_Context pContext, M4OSA_Char* pFile,
- M4VIDEOEDITING_ClipProperties *pFileProperties)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4OSA_ERR err;
- M4MCS_Context mcs_context;
-
- err = M4MCS_init(&mcs_context, xVSS_context->pFileReadPtr, xVSS_context->pFileWritePtr);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalGetProperties: Error in M4MCS_init: 0x%x", err);
- return err;
- }
-
- /*open the MCS in the "normal opening" mode to retrieve the exact duration*/
- err = M4MCS_open_normalMode(mcs_context, pFile, M4VIDEOEDITING_kFileType_3GPP,
- M4OSA_NULL, M4OSA_NULL);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalGetProperties: Error in M4MCS_open: 0x%x", err);
- M4MCS_abort(mcs_context);
- return err;
- }
-
- err = M4MCS_getInputFileProperties(mcs_context, pFileProperties);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("Error in M4MCS_getInputFileProperties: 0x%x", err);
- M4MCS_abort(mcs_context);
- return err;
- }
-
- err = M4MCS_abort(mcs_context);
- if (err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalGetProperties: Error in M4MCS_abort: 0x%x", err);
- return err;
- }
-
- return M4NO_ERROR;
-}
-
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalGetTargetedTimeScale(M4OSA_Context pContext,
- * M4OSA_UInt32* pTargetedTimeScale)
- *
- * @brief This function retrieve targeted time scale
- * @note
- * @param pContext (IN) The integrator own context
- * @param pTargetedTimeScale (OUT) Targeted time scale
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalGetTargetedTimeScale(M4OSA_Context pContext,
- M4VSS3GPP_EditSettings* pSettings,
- M4OSA_UInt32* pTargetedTimeScale)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4OSA_ERR err;
- M4OSA_UInt32 totalDuration = 0;
- M4OSA_UInt8 i = 0;
- M4OSA_UInt32 tempTimeScale = 0, tempDuration = 0;
-
- for(i=0;i<pSettings->uiClipNumber;i++)
- {
- /*search timescale only in mpeg4 case*/
- if(pSettings->pClipList[i]->FileType == M4VIDEOEDITING_kFileType_3GPP
- || pSettings->pClipList[i]->FileType == M4VIDEOEDITING_kFileType_MP4
- || pSettings->pClipList[i]->FileType == M4VIDEOEDITING_kFileType_M4V)
- {
- M4VIDEOEDITING_ClipProperties fileProperties;
-
- /*UTF conversion support*/
- M4OSA_Char* pDecodedPath = M4OSA_NULL;
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath = pSettings->pClipList[i]->pFile;
-
- if(xVSS_context->UTFConversionContext.pConvToUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer != M4OSA_NULL)
- {
- M4OSA_UInt32 length = 0;
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void*) pSettings->pClipList[i]->pFile,
- (M4OSA_Void*) xVSS_context->UTFConversionContext.pTempOutConversionBuffer,
- &length);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_Init:\
- M4xVSS_internalConvertToUTF8 returns err: 0x%x",err);
- return err;
- }
- pDecodedPath = xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /*End of the conversion: use the decoded path*/
- err = M4xVSS_internalGetProperties(xVSS_context, pDecodedPath, &fileProperties);
-
- /*get input file properties*/
- /*err = M4xVSS_internalGetProperties(xVSS_context, pSettings->\
- pClipList[i]->pFile, &fileProperties);*/
- if(M4NO_ERROR != err)
- {
- M4OSA_TRACE1_1("M4xVSS_internalGetTargetedTimeScale:\
- M4xVSS_internalGetProperties returned: 0x%x", err);
- return err;
- }
- if(fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
- {
- if(pSettings->pClipList[i]->uiEndCutTime > 0)
- {
- if(tempDuration < (pSettings->pClipList[i]->uiEndCutTime \
- - pSettings->pClipList[i]->uiBeginCutTime))
- {
- tempTimeScale = fileProperties.uiVideoTimeScale;
- tempDuration = (pSettings->pClipList[i]->uiEndCutTime\
- - pSettings->pClipList[i]->uiBeginCutTime);
- }
- }
- else
- {
- if(tempDuration < (fileProperties.uiClipDuration\
- - pSettings->pClipList[i]->uiBeginCutTime))
- {
- tempTimeScale = fileProperties.uiVideoTimeScale;
- tempDuration = (fileProperties.uiClipDuration\
- - pSettings->pClipList[i]->uiBeginCutTime);
- }
- }
- }
- }
- if(pSettings->pClipList[i]->FileType == M4VIDEOEDITING_kFileType_ARGB8888)
- {
- /*the timescale is 30 for PTO3GP*/
- *pTargetedTimeScale = 30;
- return M4NO_ERROR;
-
- }
- }
-
- if(tempTimeScale >= 30)/*Define a minimum time scale, otherwise if the timescale is not
- enough, there will be an infinite loop in the shell encoder*/
- {
- *pTargetedTimeScale = tempTimeScale;
- }
- else
- {
- *pTargetedTimeScale = 30;
- }
-
- return M4NO_ERROR;
-}
-
-
-/**
- ******************************************************************************
- * prototype M4VSS3GPP_externalVideoEffectColor(M4OSA_Void *pFunctionContext,
- * M4VIFI_ImagePlane *PlaneIn,
- * M4VIFI_ImagePlane *PlaneOut,
- * M4VSS3GPP_ExternalProgress *pProgress,
- * M4OSA_UInt32 uiEffectKind)
- *
- * @brief This function apply a color effect on an input YUV420 planar frame
- * @note
- * @param pFunctionContext(IN) Contains which color to apply (not very clean ...)
- * @param PlaneIn (IN) Input YUV420 planar
- * @param PlaneOut (IN/OUT) Output YUV420 planar
- * @param pProgress (IN/OUT) Progress indication (0-100)
- * @param uiEffectKind (IN) Unused
- *
- * @return M4VIFI_OK: No error
- ******************************************************************************
- */
-M4OSA_ERR M4VSS3GPP_externalVideoEffectColor(M4OSA_Void *pFunctionContext,
- M4VIFI_ImagePlane *PlaneIn,
- M4VIFI_ImagePlane *PlaneOut,
- M4VSS3GPP_ExternalProgress *pProgress,
- M4OSA_UInt32 uiEffectKind)
-{
- M4VIFI_Int32 plane_number;
- M4VIFI_UInt32 i,j;
- M4VIFI_UInt8 *p_buf_src, *p_buf_dest;
- M4xVSS_ColorStruct* ColorContext = (M4xVSS_ColorStruct*)pFunctionContext;
-
- for (plane_number = 0; plane_number < 3; plane_number++)
- {
- p_buf_src = &(PlaneIn[plane_number].pac_data[PlaneIn[plane_number].u_topleft]);
- p_buf_dest = &(PlaneOut[plane_number].pac_data[PlaneOut[plane_number].u_topleft]);
- for (i = 0; i < PlaneOut[plane_number].u_height; i++)
- {
- /**
- * Chrominance */
- if(plane_number==1 || plane_number==2)
- {
- //switch ((M4OSA_UInt32)pFunctionContext)
- // commented because a structure for the effects context exist
- switch (ColorContext->colorEffectType)
- {
- case M4xVSS_kVideoEffectType_BlackAndWhite:
- memset((void *)p_buf_dest,128,
- PlaneIn[plane_number].u_width);
- break;
- case M4xVSS_kVideoEffectType_Pink:
- memset((void *)p_buf_dest,255,
- PlaneIn[plane_number].u_width);
- break;
- case M4xVSS_kVideoEffectType_Green:
- memset((void *)p_buf_dest,0,
- PlaneIn[plane_number].u_width);
- break;
- case M4xVSS_kVideoEffectType_Sepia:
- if(plane_number==1)
- {
- memset((void *)p_buf_dest,117,
- PlaneIn[plane_number].u_width);
- }
- else
- {
- memset((void *)p_buf_dest,139,
- PlaneIn[plane_number].u_width);
- }
- break;
- case M4xVSS_kVideoEffectType_Negative:
- memcpy((void *)p_buf_dest,
- (void *)p_buf_src ,PlaneOut[plane_number].u_width);
- break;
-
- case M4xVSS_kVideoEffectType_ColorRGB16:
- {
- M4OSA_UInt16 r = 0,g = 0,b = 0,y = 0,u = 0,v = 0;
-
- /*first get the r, g, b*/
- b = (ColorContext->rgb16ColorData & 0x001f);
- g = (ColorContext->rgb16ColorData & 0x07e0)>>5;
- r = (ColorContext->rgb16ColorData & 0xf800)>>11;
-
- /*keep y, but replace u and v*/
- if(plane_number==1)
- {
- /*then convert to u*/
- u = U16(r, g, b);
- memset((void *)p_buf_dest,(M4OSA_UInt8)u,
- PlaneIn[plane_number].u_width);
- }
- if(plane_number==2)
- {
- /*then convert to v*/
- v = V16(r, g, b);
- memset((void *)p_buf_dest, (M4OSA_UInt8)v,
- PlaneIn[plane_number].u_width);
- }
- }
- break;
- case M4xVSS_kVideoEffectType_Gradient:
- {
- M4OSA_UInt16 r = 0,g = 0,b = 0,y = 0,u = 0,v = 0;
-
- /*first get the r, g, b*/
- b = (ColorContext->rgb16ColorData & 0x001f);
- g = (ColorContext->rgb16ColorData & 0x07e0)>>5;
- r = (ColorContext->rgb16ColorData & 0xf800)>>11;
-
- /*for color gradation*/
- b = (M4OSA_UInt16)( b - ((b*i)/PlaneIn[plane_number].u_height));
- g = (M4OSA_UInt16)(g - ((g*i)/PlaneIn[plane_number].u_height));
- r = (M4OSA_UInt16)(r - ((r*i)/PlaneIn[plane_number].u_height));
-
- /*keep y, but replace u and v*/
- if(plane_number==1)
- {
- /*then convert to u*/
- u = U16(r, g, b);
- memset((void *)p_buf_dest,(M4OSA_UInt8)u,
- PlaneIn[plane_number].u_width);
- }
- if(plane_number==2)
- {
- /*then convert to v*/
- v = V16(r, g, b);
- memset((void *)p_buf_dest,(M4OSA_UInt8)v,
- PlaneIn[plane_number].u_width);
- }
- }
- break;
- default:
- break;
- }
- }
- /**
- * Luminance */
- else
- {
- //switch ((M4OSA_UInt32)pFunctionContext)
- // commented because a structure for the effects context exist
- switch (ColorContext->colorEffectType)
- {
- case M4xVSS_kVideoEffectType_Negative:
- for(j=0;j<PlaneOut[plane_number].u_width;j++)
- {
- p_buf_dest[j] = 255 - p_buf_src[j];
- }
- break;
- default:
- memcpy((void *)p_buf_dest,
- (void *)p_buf_src ,PlaneOut[plane_number].u_width);
- break;
- }
- }
- p_buf_src += PlaneIn[plane_number].u_stride;
- p_buf_dest += PlaneOut[plane_number].u_stride;
- }
- }
-
- return M4VIFI_OK;
-}
-
-/**
- ******************************************************************************
- * prototype M4VSS3GPP_externalVideoEffectFraming(M4OSA_Void *pFunctionContext,
- * M4VIFI_ImagePlane *PlaneIn,
- * M4VIFI_ImagePlane *PlaneOut,
- * M4VSS3GPP_ExternalProgress *pProgress,
- * M4OSA_UInt32 uiEffectKind)
- *
- * @brief This function add a fixed or animated image on an input YUV420 planar frame
- * @note
- * @param pFunctionContext(IN) Contains which color to apply (not very clean ...)
- * @param PlaneIn (IN) Input YUV420 planar
- * @param PlaneOut (IN/OUT) Output YUV420 planar
- * @param pProgress (IN/OUT) Progress indication (0-100)
- * @param uiEffectKind (IN) Unused
- *
- * @return M4VIFI_OK: No error
- ******************************************************************************
- */
-M4OSA_ERR M4VSS3GPP_externalVideoEffectFraming( M4OSA_Void *userData,
- M4VIFI_ImagePlane PlaneIn[3],
- M4VIFI_ImagePlane *PlaneOut,
- M4VSS3GPP_ExternalProgress *pProgress,
- M4OSA_UInt32 uiEffectKind )
-{
- M4VIFI_UInt32 x,y;
-
- M4VIFI_UInt8 *p_in_Y = PlaneIn[0].pac_data;
- M4VIFI_UInt8 *p_in_U = PlaneIn[1].pac_data;
- M4VIFI_UInt8 *p_in_V = PlaneIn[2].pac_data;
-
- M4xVSS_FramingStruct* Framing = M4OSA_NULL;
- M4xVSS_FramingStruct* currentFraming = M4OSA_NULL;
- M4VIFI_UInt8 *FramingRGB = M4OSA_NULL;
-
- M4VIFI_UInt8 *p_out0;
- M4VIFI_UInt8 *p_out1;
- M4VIFI_UInt8 *p_out2;
-
- M4VIFI_UInt32 topleft[2];
-
- M4OSA_UInt8 transparent1 = (M4OSA_UInt8)((TRANSPARENT_COLOR & 0xFF00)>>8);
- M4OSA_UInt8 transparent2 = (M4OSA_UInt8)TRANSPARENT_COLOR;
-
-#ifndef DECODE_GIF_ON_SAVING
- Framing = (M4xVSS_FramingStruct *)userData;
- currentFraming = (M4xVSS_FramingStruct *)Framing->pCurrent;
- FramingRGB = Framing->FramingRgb->pac_data;
-#endif /*DECODE_GIF_ON_SAVING*/
-
- /*FB*/
-#ifdef DECODE_GIF_ON_SAVING
- M4OSA_ERR err;
- Framing = (M4xVSS_FramingStruct *)((M4xVSS_FramingContext*)userData)->aFramingCtx;
- currentFraming = (M4xVSS_FramingStruct *)Framing;
- FramingRGB = Framing->FramingRgb->pac_data;
-#endif /*DECODE_GIF_ON_SAVING*/
- /*end FB*/
-
- /**
- * Initialize input / output plane pointers */
- p_in_Y += PlaneIn[0].u_topleft;
- p_in_U += PlaneIn[1].u_topleft;
- p_in_V += PlaneIn[2].u_topleft;
-
- p_out0 = PlaneOut[0].pac_data;
- p_out1 = PlaneOut[1].pac_data;
- p_out2 = PlaneOut[2].pac_data;
-
- /**
- * Depending on time, initialize Framing frame to use */
- if(Framing->previousClipTime == -1)
- {
- Framing->previousClipTime = pProgress->uiOutputTime;
- }
-
- /**
- * If the current clip time has reach the duration of one frame of the framing picture
- * we need to step to next framing picture */
-
- Framing->previousClipTime = pProgress->uiOutputTime;
- FramingRGB = currentFraming->FramingRgb->pac_data;
- topleft[0] = currentFraming->topleft_x;
- topleft[1] = currentFraming->topleft_y;
-
- for( x=0 ;x < PlaneIn[0].u_height ; x++)
- {
- for( y=0 ;y < PlaneIn[0].u_width ; y++)
- {
- /**
- * To handle framing with input size != output size
- * Framing is applyed if coordinates matches between framing/topleft and input plane */
- if( y < (topleft[0] + currentFraming->FramingYuv[0].u_width) &&
- y >= topleft[0] &&
- x < (topleft[1] + currentFraming->FramingYuv[0].u_height) &&
- x >= topleft[1])
- {
- /*Alpha blending support*/
- M4OSA_Float alphaBlending = 1;
- M4xVSS_internalEffectsAlphaBlending* alphaBlendingStruct =\
- (M4xVSS_internalEffectsAlphaBlending*)\
- ((M4xVSS_FramingContext*)userData)->alphaBlendingStruct;
-
- if(alphaBlendingStruct != M4OSA_NULL)
- {
- if(pProgress->uiProgress \
- < (M4OSA_UInt32)(alphaBlendingStruct->m_fadeInTime*10))
- {
- if(alphaBlendingStruct->m_fadeInTime == 0) {
- alphaBlending = alphaBlendingStruct->m_start / 100;
- } else {
- alphaBlending = ((M4OSA_Float)(alphaBlendingStruct->m_middle\
- - alphaBlendingStruct->m_start)\
- *pProgress->uiProgress/(alphaBlendingStruct->m_fadeInTime*10));
- alphaBlending += alphaBlendingStruct->m_start;
- alphaBlending /= 100;
- }
- }
- else if(pProgress->uiProgress >= (M4OSA_UInt32)(alphaBlendingStruct->\
- m_fadeInTime*10) && pProgress->uiProgress < 1000\
- - (M4OSA_UInt32)(alphaBlendingStruct->m_fadeOutTime*10))
- {
- alphaBlending = (M4OSA_Float)\
- ((M4OSA_Float)alphaBlendingStruct->m_middle/100);
- }
- else if(pProgress->uiProgress >= 1000 - (M4OSA_UInt32)\
- (alphaBlendingStruct->m_fadeOutTime*10))
- {
- if(alphaBlendingStruct->m_fadeOutTime == 0) {
- alphaBlending = alphaBlendingStruct->m_end / 100;
- } else {
- alphaBlending = ((M4OSA_Float)(alphaBlendingStruct->m_middle \
- - alphaBlendingStruct->m_end))*(1000 - pProgress->uiProgress)\
- /(alphaBlendingStruct->m_fadeOutTime*10);
- alphaBlending += alphaBlendingStruct->m_end;
- alphaBlending /= 100;
- }
- }
- }
- /**/
-
- if((*(FramingRGB)==transparent1) && (*(FramingRGB+1)==transparent2))
- {
- *( p_out0+y+x*PlaneOut[0].u_stride)=(*(p_in_Y+y+x*PlaneIn[0].u_stride));
- *( p_out1+(y>>1)+(x>>1)*PlaneOut[1].u_stride)=
- (*(p_in_U+(y>>1)+(x>>1)*PlaneIn[1].u_stride));
- *( p_out2+(y>>1)+(x>>1)*PlaneOut[2].u_stride)=
- (*(p_in_V+(y>>1)+(x>>1)*PlaneIn[2].u_stride));
- }
- else
- {
- *( p_out0+y+x*PlaneOut[0].u_stride)=
- (*(currentFraming->FramingYuv[0].pac_data+(y-topleft[0])\
- +(x-topleft[1])*currentFraming->FramingYuv[0].u_stride))*alphaBlending;
- *( p_out0+y+x*PlaneOut[0].u_stride)+=
- (*(p_in_Y+y+x*PlaneIn[0].u_stride))*(1-alphaBlending);
- *( p_out1+(y>>1)+(x>>1)*PlaneOut[1].u_stride)=
- (*(currentFraming->FramingYuv[1].pac_data+((y-topleft[0])>>1)\
- +((x-topleft[1])>>1)*currentFraming->FramingYuv[1].u_stride))\
- *alphaBlending;
- *( p_out1+(y>>1)+(x>>1)*PlaneOut[1].u_stride)+=
- (*(p_in_U+(y>>1)+(x>>1)*PlaneIn[1].u_stride))*(1-alphaBlending);
- *( p_out2+(y>>1)+(x>>1)*PlaneOut[2].u_stride)=
- (*(currentFraming->FramingYuv[2].pac_data+((y-topleft[0])>>1)\
- +((x-topleft[1])>>1)*currentFraming->FramingYuv[2].u_stride))\
- *alphaBlending;
- *( p_out2+(y>>1)+(x>>1)*PlaneOut[2].u_stride)+=
- (*(p_in_V+(y>>1)+(x>>1)*PlaneIn[2].u_stride))*(1-alphaBlending);
- }
- if( PlaneIn[0].u_width < (topleft[0] + currentFraming->FramingYuv[0].u_width) &&
- y == PlaneIn[0].u_width-1)
- {
- FramingRGB = FramingRGB + 2 \
- * (topleft[0] + currentFraming->FramingYuv[0].u_width \
- - PlaneIn[0].u_width + 1);
- }
- else
- {
- FramingRGB = FramingRGB + 2;
- }
- }
- /**
- * Just copy input plane to output plane */
- else
- {
- *( p_out0+y+x*PlaneOut[0].u_stride)=*(p_in_Y+y+x*PlaneIn[0].u_stride);
- *( p_out1+(y>>1)+(x>>1)*PlaneOut[1].u_stride)=
- *(p_in_U+(y>>1)+(x>>1)*PlaneIn[1].u_stride);
- *( p_out2+(y>>1)+(x>>1)*PlaneOut[2].u_stride)=
- *(p_in_V+(y>>1)+(x>>1)*PlaneIn[2].u_stride);
- }
- }
- }
-
-
- return M4VIFI_OK;
-}
-
-
-/**
- ******************************************************************************
- * prototype M4VSS3GPP_externalVideoEffectFifties(M4OSA_Void *pFunctionContext,
- * M4VIFI_ImagePlane *PlaneIn,
- * M4VIFI_ImagePlane *PlaneOut,
- * M4VSS3GPP_ExternalProgress *pProgress,
- * M4OSA_UInt32 uiEffectKind)
- *
- * @brief This function make a video look as if it was taken in the fifties
- * @note
- * @param pUserData (IN) Context
- * @param pPlaneIn (IN) Input YUV420 planar
- * @param pPlaneOut (IN/OUT) Output YUV420 planar
- * @param pProgress (IN/OUT) Progress indication (0-100)
- * @param uiEffectKind (IN) Unused
- *
- * @return M4VIFI_OK: No error
- * @return M4ERR_PARAMETER: pFiftiesData, pPlaneOut or pProgress are NULL (DEBUG only)
- ******************************************************************************
- */
-M4OSA_ERR M4VSS3GPP_externalVideoEffectFifties( M4OSA_Void *pUserData,
- M4VIFI_ImagePlane *pPlaneIn,
- M4VIFI_ImagePlane *pPlaneOut,
- M4VSS3GPP_ExternalProgress *pProgress,
- M4OSA_UInt32 uiEffectKind )
-{
- M4VIFI_UInt32 x, y, xShift;
- M4VIFI_UInt8 *pInY = pPlaneIn[0].pac_data;
- M4VIFI_UInt8 *pOutY, *pInYbegin;
- M4VIFI_UInt8 *pInCr,* pOutCr;
- M4VIFI_Int32 plane_number;
-
- /* Internal context*/
- M4xVSS_FiftiesStruct* p_FiftiesData = (M4xVSS_FiftiesStruct *)pUserData;
-
- /* Check the inputs (debug only) */
- M4OSA_DEBUG_IF2((p_FiftiesData == M4OSA_NULL),M4ERR_PARAMETER,
- "xVSS: p_FiftiesData is M4OSA_NULL in M4VSS3GPP_externalVideoEffectFifties");
- M4OSA_DEBUG_IF2((pPlaneOut == M4OSA_NULL),M4ERR_PARAMETER,
- "xVSS: p_PlaneOut is M4OSA_NULL in M4VSS3GPP_externalVideoEffectFifties");
- M4OSA_DEBUG_IF2((pProgress == M4OSA_NULL),M4ERR_PARAMETER,
- "xVSS: p_Progress is M4OSA_NULL in M4VSS3GPP_externalVideoEffectFifties");
-
- /* Initialize input / output plane pointers */
- pInY += pPlaneIn[0].u_topleft;
- pOutY = pPlaneOut[0].pac_data;
- pInYbegin = pInY;
-
- /* Initialize the random */
- if(p_FiftiesData->previousClipTime < 0)
- {
- M4OSA_randInit();
- M4OSA_rand((M4OSA_Int32 *)&(p_FiftiesData->shiftRandomValue), (pPlaneIn[0].u_height) >> 4);
- M4OSA_rand((M4OSA_Int32 *)&(p_FiftiesData->stripeRandomValue), (pPlaneIn[0].u_width)<< 2);
- p_FiftiesData->previousClipTime = pProgress->uiOutputTime;
- }
-
- /* Choose random values if we have reached the duration of a partial effect */
- else if( (pProgress->uiOutputTime - p_FiftiesData->previousClipTime)\
- > p_FiftiesData->fiftiesEffectDuration)
- {
- M4OSA_rand((M4OSA_Int32 *)&(p_FiftiesData->shiftRandomValue), (pPlaneIn[0].u_height) >> 4);
- M4OSA_rand((M4OSA_Int32 *)&(p_FiftiesData->stripeRandomValue), (pPlaneIn[0].u_width)<< 2);
- p_FiftiesData->previousClipTime = pProgress->uiOutputTime;
- }
-
- /* Put in Sepia the chrominance */
- for (plane_number = 1; plane_number < 3; plane_number++)
- {
- pInCr = pPlaneIn[plane_number].pac_data + pPlaneIn[plane_number].u_topleft;
- pOutCr = pPlaneOut[plane_number].pac_data + pPlaneOut[plane_number].u_topleft;
-
- for (x = 0; x < pPlaneOut[plane_number].u_height; x++)
- {
- if (1 == plane_number)
- memset((void *)pOutCr, 117,pPlaneIn[plane_number].u_width); /* U value */
- else
- memset((void *)pOutCr, 139,pPlaneIn[plane_number].u_width); /* V value */
-
- pInCr += pPlaneIn[plane_number].u_stride;
- pOutCr += pPlaneOut[plane_number].u_stride;
- }
- }
-
- /* Compute the new pixels values */
- for( x = 0 ; x < pPlaneIn[0].u_height ; x++)
- {
- M4VIFI_UInt8 *p_outYtmp, *p_inYtmp;
-
- /* Compute the xShift (random value) */
- if (0 == (p_FiftiesData->shiftRandomValue % 5 ))
- xShift = (x + p_FiftiesData->shiftRandomValue ) % (pPlaneIn[0].u_height - 1);
- else
- xShift = (x + (pPlaneIn[0].u_height - p_FiftiesData->shiftRandomValue) ) \
- % (pPlaneIn[0].u_height - 1);
-
- /* Initialize the pointers */
- p_outYtmp = pOutY + 1; /* yShift of 1 pixel */
- p_inYtmp = pInYbegin + (xShift * pPlaneIn[0].u_stride); /* Apply the xShift */
-
- for( y = 0 ; y < pPlaneIn[0].u_width ; y++)
- {
- /* Set Y value */
- if (xShift > (pPlaneIn[0].u_height - 4))
- *p_outYtmp = 40; /* Add some horizontal black lines between the
- two parts of the image */
- else if ( y == p_FiftiesData->stripeRandomValue)
- *p_outYtmp = 90; /* Add a random vertical line for the bulk */
- else
- *p_outYtmp = *p_inYtmp;
-
-
- /* Go to the next pixel */
- p_outYtmp++;
- p_inYtmp++;
-
- /* Restart at the beginning of the line for the last pixel*/
- if (y == (pPlaneIn[0].u_width - 2))
- p_outYtmp = pOutY;
- }
-
- /* Go to the next line */
- pOutY += pPlaneOut[0].u_stride;
- }
-
- return M4VIFI_OK;
-}
-
-/**
- ******************************************************************************
- * M4OSA_ERR M4VSS3GPP_externalVideoEffectZoom( )
- * @brief Zoom in/out video effect functions.
- * @note The external video function is used only if VideoEffectType is set to
- * M4VSS3GPP_kVideoEffectType_ZoomIn or M4VSS3GPP_kVideoEffectType_ZoomOut.
- *
- * @param pFunctionContext (IN) The function context, previously set by the integrator
- * @param pInputPlanes (IN) Input YUV420 image: pointer to an array of three valid
- * image planes (Y, U and V)
- * @param pOutputPlanes (IN/OUT) Output (filtered) YUV420 image: pointer to an array of
- * three valid image planes (Y, U and V)
- * @param pProgress (IN) Set of information about the video transition progress.
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL (debug only)
- ******************************************************************************
- */
-
-M4OSA_ERR M4VSS3GPP_externalVideoEffectZoom(
- M4OSA_Void *pFunctionContext,
- M4VIFI_ImagePlane *pInputPlanes,
- M4VIFI_ImagePlane *pOutputPlanes,
- M4VSS3GPP_ExternalProgress *pProgress,
- M4OSA_UInt32 uiEffectKind
-)
-{
- M4OSA_UInt32 boxWidth;
- M4OSA_UInt32 boxHeight;
- M4OSA_UInt32 boxPosX;
- M4OSA_UInt32 boxPosY;
- M4OSA_UInt32 ratio = 0;
- /* * 1.189207 between ratio */
- /* zoom between x1 and x16 */
- M4OSA_UInt32 ratiotab[17] ={1024,1218,1448,1722,2048,2435,2896,3444,4096,4871,5793,\
- 6889,8192,9742,11585,13777,16384};
- M4OSA_UInt32 ik;
-
- M4VIFI_ImagePlane boxPlane[3];
-
- if((M4OSA_Void *)M4xVSS_kVideoEffectType_ZoomOut == pFunctionContext)
- {
- //ratio = 16 - (15 * pProgress->uiProgress)/1000;
- ratio = 16 - pProgress->uiProgress / 66 ;
- }
- else if((M4OSA_Void *)M4xVSS_kVideoEffectType_ZoomIn == pFunctionContext)
- {
- //ratio = 1 + (15 * pProgress->uiProgress)/1000;
- ratio = 1 + pProgress->uiProgress / 66 ;
- }
-
- for(ik=0;ik<3;ik++){
-
- boxPlane[ik].u_stride = pInputPlanes[ik].u_stride;
- boxPlane[ik].pac_data = pInputPlanes[ik].pac_data;
-
- boxHeight = ( pInputPlanes[ik].u_height << 10 ) / ratiotab[ratio];
- boxWidth = ( pInputPlanes[ik].u_width << 10 ) / ratiotab[ratio];
- boxPlane[ik].u_height = (boxHeight)&(~1);
- boxPlane[ik].u_width = (boxWidth)&(~1);
-
- boxPosY = (pInputPlanes[ik].u_height >> 1) - (boxPlane[ik].u_height >> 1);
- boxPosX = (pInputPlanes[ik].u_width >> 1) - (boxPlane[ik].u_width >> 1);
- boxPlane[ik].u_topleft = boxPosY * boxPlane[ik].u_stride + boxPosX;
- }
-
- M4VIFI_ResizeBilinearYUV420toYUV420(M4OSA_NULL, (M4VIFI_ImagePlane*)&boxPlane, pOutputPlanes);
-
- /**
- * Return */
- return(M4NO_ERROR);
-}
-
-/**
- ******************************************************************************
- * prototype M4xVSS_AlphaMagic( M4OSA_Void *userData,
- * M4VIFI_ImagePlane PlaneIn1[3],
- * M4VIFI_ImagePlane PlaneIn2[3],
- * M4VIFI_ImagePlane *PlaneOut,
- * M4VSS3GPP_ExternalProgress *pProgress,
- * M4OSA_UInt32 uiTransitionKind)
- *
- * @brief This function apply a color effect on an input YUV420 planar frame
- * @note
- * @param userData (IN) Contains a pointer on a settings structure
- * @param PlaneIn1 (IN) Input YUV420 planar from video 1
- * @param PlaneIn2 (IN) Input YUV420 planar from video 2
- * @param PlaneOut (IN/OUT) Output YUV420 planar
- * @param pProgress (IN/OUT) Progress indication (0-100)
- * @param uiTransitionKind(IN) Unused
- *
- * @return M4VIFI_OK: No error
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_AlphaMagic( M4OSA_Void *userData, M4VIFI_ImagePlane PlaneIn1[3],
- M4VIFI_ImagePlane PlaneIn2[3], M4VIFI_ImagePlane *PlaneOut,
- M4VSS3GPP_ExternalProgress *pProgress, M4OSA_UInt32 uiTransitionKind)
-{
-
- M4OSA_ERR err;
-
- M4xVSS_internal_AlphaMagicSettings* alphaContext;
- M4VIFI_Int32 alphaProgressLevel;
-
- M4VIFI_ImagePlane* planeswap;
- M4VIFI_UInt32 x,y;
-
- M4VIFI_UInt8 *p_out0;
- M4VIFI_UInt8 *p_out1;
- M4VIFI_UInt8 *p_out2;
- M4VIFI_UInt8 *alphaMask;
- /* "Old image" */
- M4VIFI_UInt8 *p_in1_Y;
- M4VIFI_UInt8 *p_in1_U;
- M4VIFI_UInt8 *p_in1_V;
- /* "New image" */
- M4VIFI_UInt8 *p_in2_Y;
- M4VIFI_UInt8 *p_in2_U;
- M4VIFI_UInt8 *p_in2_V;
-
- err = M4NO_ERROR;
-
- alphaContext = (M4xVSS_internal_AlphaMagicSettings*)userData;
-
- alphaProgressLevel = (pProgress->uiProgress * 128)/1000;
-
- if( alphaContext->isreverse != M4OSA_FALSE)
- {
- alphaProgressLevel = 128 - alphaProgressLevel;
- planeswap = PlaneIn1;
- PlaneIn1 = PlaneIn2;
- PlaneIn2 = planeswap;
- }
-
- p_out0 = PlaneOut[0].pac_data;
- p_out1 = PlaneOut[1].pac_data;
- p_out2 = PlaneOut[2].pac_data;
-
- alphaMask = alphaContext->pPlane->pac_data;
-
- /* "Old image" */
- p_in1_Y = PlaneIn1[0].pac_data;
- p_in1_U = PlaneIn1[1].pac_data;
- p_in1_V = PlaneIn1[2].pac_data;
- /* "New image" */
- p_in2_Y = PlaneIn2[0].pac_data;
- p_in2_U = PlaneIn2[1].pac_data;
- p_in2_V = PlaneIn2[2].pac_data;
-
- /**
- * For each column ... */
- for( y=0; y<PlaneOut->u_height; y++ )
- {
- /**
- * ... and each row of the alpha mask */
- for( x=0; x<PlaneOut->u_width; x++ )
- {
- /**
- * If the value of the current pixel of the alpha mask is > to the current time
- * ( current time is normalized on [0-255] ) */
- if( alphaProgressLevel < alphaMask[x+y*PlaneOut->u_width] )
- {
- /* We keep "old image" in output plane */
- *( p_out0+x+y*PlaneOut[0].u_stride)=*(p_in1_Y+x+y*PlaneIn1[0].u_stride);
- *( p_out1+(x>>1)+(y>>1)*PlaneOut[1].u_stride)=
- *(p_in1_U+(x>>1)+(y>>1)*PlaneIn1[1].u_stride);
- *( p_out2+(x>>1)+(y>>1)*PlaneOut[2].u_stride)=
- *(p_in1_V+(x>>1)+(y>>1)*PlaneIn1[2].u_stride);
- }
- else
- {
- /* We take "new image" in output plane */
- *( p_out0+x+y*PlaneOut[0].u_stride)=*(p_in2_Y+x+y*PlaneIn2[0].u_stride);
- *( p_out1+(x>>1)+(y>>1)*PlaneOut[1].u_stride)=
- *(p_in2_U+(x>>1)+(y>>1)*PlaneIn2[1].u_stride);
- *( p_out2+(x>>1)+(y>>1)*PlaneOut[2].u_stride)=
- *(p_in2_V+(x>>1)+(y>>1)*PlaneIn2[2].u_stride);
- }
- }
- }
-
- return(err);
-}
-
-/**
- ******************************************************************************
- * prototype M4xVSS_AlphaMagicBlending( M4OSA_Void *userData,
- * M4VIFI_ImagePlane PlaneIn1[3],
- * M4VIFI_ImagePlane PlaneIn2[3],
- * M4VIFI_ImagePlane *PlaneOut,
- * M4VSS3GPP_ExternalProgress *pProgress,
- * M4OSA_UInt32 uiTransitionKind)
- *
- * @brief This function apply a color effect on an input YUV420 planar frame
- * @note
- * @param userData (IN) Contains a pointer on a settings structure
- * @param PlaneIn1 (IN) Input YUV420 planar from video 1
- * @param PlaneIn2 (IN) Input YUV420 planar from video 2
- * @param PlaneOut (IN/OUT) Output YUV420 planar
- * @param pProgress (IN/OUT) Progress indication (0-100)
- * @param uiTransitionKind(IN) Unused
- *
- * @return M4VIFI_OK: No error
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_AlphaMagicBlending( M4OSA_Void *userData, M4VIFI_ImagePlane PlaneIn1[3],
- M4VIFI_ImagePlane PlaneIn2[3], M4VIFI_ImagePlane *PlaneOut,
- M4VSS3GPP_ExternalProgress *pProgress,
- M4OSA_UInt32 uiTransitionKind)
-{
- M4OSA_ERR err;
-
- M4xVSS_internal_AlphaMagicSettings* alphaContext;
- M4VIFI_Int32 alphaProgressLevel;
- M4VIFI_Int32 alphaBlendLevelMin;
- M4VIFI_Int32 alphaBlendLevelMax;
- M4VIFI_Int32 alphaBlendRange;
-
- M4VIFI_ImagePlane* planeswap;
- M4VIFI_UInt32 x,y;
- M4VIFI_Int32 alphaMaskValue;
-
- M4VIFI_UInt8 *p_out0;
- M4VIFI_UInt8 *p_out1;
- M4VIFI_UInt8 *p_out2;
- M4VIFI_UInt8 *alphaMask;
- /* "Old image" */
- M4VIFI_UInt8 *p_in1_Y;
- M4VIFI_UInt8 *p_in1_U;
- M4VIFI_UInt8 *p_in1_V;
- /* "New image" */
- M4VIFI_UInt8 *p_in2_Y;
- M4VIFI_UInt8 *p_in2_U;
- M4VIFI_UInt8 *p_in2_V;
-
-
- err = M4NO_ERROR;
-
- alphaContext = (M4xVSS_internal_AlphaMagicSettings*)userData;
-
- alphaProgressLevel = (pProgress->uiProgress * 128)/1000;
-
- if( alphaContext->isreverse != M4OSA_FALSE)
- {
- alphaProgressLevel = 128 - alphaProgressLevel;
- planeswap = PlaneIn1;
- PlaneIn1 = PlaneIn2;
- PlaneIn2 = planeswap;
- }
-
- alphaBlendLevelMin = alphaProgressLevel-alphaContext->blendingthreshold;
-
- alphaBlendLevelMax = alphaProgressLevel+alphaContext->blendingthreshold;
-
- alphaBlendRange = (alphaContext->blendingthreshold)*2;
-
- p_out0 = PlaneOut[0].pac_data;
- p_out1 = PlaneOut[1].pac_data;
- p_out2 = PlaneOut[2].pac_data;
-
- alphaMask = alphaContext->pPlane->pac_data;
-
- /* "Old image" */
- p_in1_Y = PlaneIn1[0].pac_data;
- p_in1_U = PlaneIn1[1].pac_data;
- p_in1_V = PlaneIn1[2].pac_data;
- /* "New image" */
- p_in2_Y = PlaneIn2[0].pac_data;
- p_in2_U = PlaneIn2[1].pac_data;
- p_in2_V = PlaneIn2[2].pac_data;
-
- /* apply Alpha Magic on each pixel */
- for( y=0; y<PlaneOut->u_height; y++ )
- {
- for( x=0; x<PlaneOut->u_width; x++ )
- {
- alphaMaskValue = alphaMask[x+y*PlaneOut->u_width];
- if( alphaBlendLevelMax < alphaMaskValue )
- {
- /* We keep "old image" in output plane */
- *( p_out0+x+y*PlaneOut[0].u_stride)=*(p_in1_Y+x+y*PlaneIn1[0].u_stride);
- *( p_out1+(x>>1)+(y>>1)*PlaneOut[1].u_stride)=
- *(p_in1_U+(x>>1)+(y>>1)*PlaneIn1[1].u_stride);
- *( p_out2+(x>>1)+(y>>1)*PlaneOut[2].u_stride)=
- *(p_in1_V+(x>>1)+(y>>1)*PlaneIn1[2].u_stride);
- }
- else if( (alphaBlendLevelMin < alphaMaskValue)&&
- (alphaMaskValue <= alphaBlendLevelMax ) )
- {
- /* We blend "old and new image" in output plane */
- *( p_out0+x+y*PlaneOut[0].u_stride)=(M4VIFI_UInt8)
- (( (alphaMaskValue-alphaBlendLevelMin)*( *(p_in1_Y+x+y*PlaneIn1[0].u_stride))
- +(alphaBlendLevelMax-alphaMaskValue)\
- *( *(p_in2_Y+x+y*PlaneIn2[0].u_stride)) )/alphaBlendRange );
-
- *( p_out1+(x>>1)+(y>>1)*PlaneOut[1].u_stride)=(M4VIFI_UInt8)\
- (( (alphaMaskValue-alphaBlendLevelMin)*( *(p_in1_U+(x>>1)+(y>>1)\
- *PlaneIn1[1].u_stride))
- +(alphaBlendLevelMax-alphaMaskValue)*( *(p_in2_U+(x>>1)+(y>>1)\
- *PlaneIn2[1].u_stride)) )/alphaBlendRange );
-
- *( p_out2+(x>>1)+(y>>1)*PlaneOut[2].u_stride)=
- (M4VIFI_UInt8)(( (alphaMaskValue-alphaBlendLevelMin)\
- *( *(p_in1_V+(x>>1)+(y>>1)*PlaneIn1[2].u_stride))
- +(alphaBlendLevelMax-alphaMaskValue)*( *(p_in2_V+(x>>1)+(y>>1)\
- *PlaneIn2[2].u_stride)) )/alphaBlendRange );
-
- }
- else
- {
- /* We take "new image" in output plane */
- *( p_out0+x+y*PlaneOut[0].u_stride)=*(p_in2_Y+x+y*PlaneIn2[0].u_stride);
- *( p_out1+(x>>1)+(y>>1)*PlaneOut[1].u_stride)=
- *(p_in2_U+(x>>1)+(y>>1)*PlaneIn2[1].u_stride);
- *( p_out2+(x>>1)+(y>>1)*PlaneOut[2].u_stride)=
- *(p_in2_V+(x>>1)+(y>>1)*PlaneIn2[2].u_stride);
- }
- }
- }
-
- return(err);
-}
-
-#define M4XXX_SampleAddress(plane, x, y) ( (plane).pac_data + (plane).u_topleft + (y)\
- * (plane).u_stride + (x) )
-
-static void M4XXX_CopyPlane(M4VIFI_ImagePlane* dest, M4VIFI_ImagePlane* source)
-{
- M4OSA_UInt32 height, width, sourceStride, destStride, y;
- M4OSA_MemAddr8 sourceWalk, destWalk;
-
- /* cache the vars used in the loop so as to avoid them being repeatedly fetched and
- recomputed from memory. */
- height = dest->u_height;
- width = dest->u_width;
-
- sourceWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(*source, 0, 0);
- sourceStride = source->u_stride;
-
- destWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(*dest, 0, 0);
- destStride = dest->u_stride;
-
- for (y=0; y<height; y++)
- {
- memcpy((void *)destWalk, (void *)sourceWalk, width);
- destWalk += destStride;
- sourceWalk += sourceStride;
- }
-}
-
-static M4OSA_ERR M4xVSS_VerticalSlideTransition(M4VIFI_ImagePlane* topPlane,
- M4VIFI_ImagePlane* bottomPlane,
- M4VIFI_ImagePlane *PlaneOut,
- M4OSA_UInt32 shiftUV)
-{
- M4OSA_UInt32 i;
-
- /* Do three loops, one for each plane type, in order to avoid having too many buffers
- "hot" at the same time (better for cache). */
- for (i=0; i<3; i++)
- {
- M4OSA_UInt32 topPartHeight, bottomPartHeight, width, sourceStride, destStride, y;
- M4OSA_MemAddr8 sourceWalk, destWalk;
-
- /* cache the vars used in the loop so as to avoid them being repeatedly fetched and
- recomputed from memory. */
- if (0 == i) /* Y plane */
- {
- bottomPartHeight = 2*shiftUV;
- }
- else /* U and V planes */
- {
- bottomPartHeight = shiftUV;
- }
- topPartHeight = PlaneOut[i].u_height - bottomPartHeight;
- width = PlaneOut[i].u_width;
-
- sourceWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(topPlane[i], 0, bottomPartHeight);
- sourceStride = topPlane[i].u_stride;
-
- destWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(PlaneOut[i], 0, 0);
- destStride = PlaneOut[i].u_stride;
-
- /* First the part from the top source clip frame. */
- for (y=0; y<topPartHeight; y++)
- {
- memcpy((void *)destWalk, (void *)sourceWalk, width);
- destWalk += destStride;
- sourceWalk += sourceStride;
- }
-
- /* and now change the vars to copy the part from the bottom source clip frame. */
- sourceWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(bottomPlane[i], 0, 0);
- sourceStride = bottomPlane[i].u_stride;
-
- /* destWalk is already at M4XXX_SampleAddress(PlaneOut[i], 0, topPartHeight) */
-
- for (y=0; y<bottomPartHeight; y++)
- {
- memcpy((void *)destWalk, (void *)sourceWalk, width);
- destWalk += destStride;
- sourceWalk += sourceStride;
- }
- }
- return M4NO_ERROR;
-}
-
-static M4OSA_ERR M4xVSS_HorizontalSlideTransition(M4VIFI_ImagePlane* leftPlane,
- M4VIFI_ImagePlane* rightPlane,
- M4VIFI_ImagePlane *PlaneOut,
- M4OSA_UInt32 shiftUV)
-{
- M4OSA_UInt32 i, y;
- /* If we shifted by exactly 0, or by the width of the target image, then we would get the left
- frame or the right frame, respectively. These cases aren't handled too well by the general
- handling, since they result in 0-size memcopies, so might as well particularize them. */
-
- if (0 == shiftUV) /* output left frame */
- {
- for (i = 0; i<3; i++) /* for each YUV plane */
- {
- M4XXX_CopyPlane(&(PlaneOut[i]), &(leftPlane[i]));
- }
-
- return M4NO_ERROR;
- }
-
- if (PlaneOut[1].u_width == shiftUV) /* output right frame */
- {
- for (i = 0; i<3; i++) /* for each YUV plane */
- {
- M4XXX_CopyPlane(&(PlaneOut[i]), &(rightPlane[i]));
- }
-
- return M4NO_ERROR;
- }
-
-
- /* Do three loops, one for each plane type, in order to avoid having too many buffers
- "hot" at the same time (better for cache). */
- for (i=0; i<3; i++)
- {
- M4OSA_UInt32 height, leftPartWidth, rightPartWidth;
- M4OSA_UInt32 leftStride, rightStride, destStride;
- M4OSA_MemAddr8 leftWalk, rightWalk, destWalkLeft, destWalkRight;
-
- /* cache the vars used in the loop so as to avoid them being repeatedly fetched
- and recomputed from memory. */
- height = PlaneOut[i].u_height;
-
- if (0 == i) /* Y plane */
- {
- rightPartWidth = 2*shiftUV;
- }
- else /* U and V planes */
- {
- rightPartWidth = shiftUV;
- }
- leftPartWidth = PlaneOut[i].u_width - rightPartWidth;
-
- leftWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(leftPlane[i], rightPartWidth, 0);
- leftStride = leftPlane[i].u_stride;
-
- rightWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(rightPlane[i], 0, 0);
- rightStride = rightPlane[i].u_stride;
-
- destWalkLeft = (M4OSA_MemAddr8)M4XXX_SampleAddress(PlaneOut[i], 0, 0);
- destWalkRight = (M4OSA_MemAddr8)M4XXX_SampleAddress(PlaneOut[i], leftPartWidth, 0);
- destStride = PlaneOut[i].u_stride;
-
- for (y=0; y<height; y++)
- {
- memcpy((void *)destWalkLeft, (void *)leftWalk, leftPartWidth);
- leftWalk += leftStride;
-
- memcpy((void *)destWalkRight, (void *)rightWalk, rightPartWidth);
- rightWalk += rightStride;
-
- destWalkLeft += destStride;
- destWalkRight += destStride;
- }
- }
-
- return M4NO_ERROR;
-}
-
-
-M4OSA_ERR M4xVSS_SlideTransition( M4OSA_Void *userData, M4VIFI_ImagePlane PlaneIn1[3],
- M4VIFI_ImagePlane PlaneIn2[3], M4VIFI_ImagePlane *PlaneOut,
- M4VSS3GPP_ExternalProgress *pProgress,
- M4OSA_UInt32 uiTransitionKind)
-{
- M4xVSS_internal_SlideTransitionSettings* settings =
- (M4xVSS_internal_SlideTransitionSettings*)userData;
- M4OSA_UInt32 shiftUV;
-
- M4OSA_TRACE1_0("inside M4xVSS_SlideTransition");
- if ((M4xVSS_SlideTransition_RightOutLeftIn == settings->direction)
- || (M4xVSS_SlideTransition_LeftOutRightIn == settings->direction) )
- {
- /* horizontal slide */
- shiftUV = ((PlaneOut[1]).u_width * pProgress->uiProgress)/1000;
- M4OSA_TRACE1_2("M4xVSS_SlideTransition upper: shiftUV = %d,progress = %d",
- shiftUV,pProgress->uiProgress );
- if (M4xVSS_SlideTransition_RightOutLeftIn == settings->direction)
- {
- /* Put the previous clip frame right, the next clip frame left, and reverse shiftUV
- (since it's a shift from the left frame) so that we start out on the right
- (i.e. not left) frame, it
- being from the previous clip. */
- return M4xVSS_HorizontalSlideTransition(PlaneIn2, PlaneIn1, PlaneOut,
- (PlaneOut[1]).u_width - shiftUV);
- }
- else /* Left out, right in*/
- {
- return M4xVSS_HorizontalSlideTransition(PlaneIn1, PlaneIn2, PlaneOut, shiftUV);
- }
- }
- else
- {
- /* vertical slide */
- shiftUV = ((PlaneOut[1]).u_height * pProgress->uiProgress)/1000;
- M4OSA_TRACE1_2("M4xVSS_SlideTransition bottom: shiftUV = %d,progress = %d",shiftUV,
- pProgress->uiProgress );
- if (M4xVSS_SlideTransition_TopOutBottomIn == settings->direction)
- {
- /* Put the previous clip frame top, the next clip frame bottom. */
- return M4xVSS_VerticalSlideTransition(PlaneIn1, PlaneIn2, PlaneOut, shiftUV);
- }
- else /* Bottom out, top in */
- {
- return M4xVSS_VerticalSlideTransition(PlaneIn2, PlaneIn1, PlaneOut,
- (PlaneOut[1]).u_height - shiftUV);
- }
- }
-
- /* Note: it might be worthwhile to do some parameter checking, see if dimensions match, etc.,
- at least in debug mode. */
-}
-
-
-/**
- ******************************************************************************
- * prototype M4xVSS_FadeBlackTransition(M4OSA_Void *pFunctionContext,
- * M4VIFI_ImagePlane *PlaneIn,
- * M4VIFI_ImagePlane *PlaneOut,
- * M4VSS3GPP_ExternalProgress *pProgress,
- * M4OSA_UInt32 uiEffectKind)
- *
- * @brief This function apply a fade to black and then a fade from black
- * @note
- * @param pFunctionContext(IN) Contains which color to apply (not very clean ...)
- * @param PlaneIn (IN) Input YUV420 planar
- * @param PlaneOut (IN/OUT) Output YUV420 planar
- * @param pProgress (IN/OUT) Progress indication (0-100)
- * @param uiEffectKind (IN) Unused
- *
- * @return M4VIFI_OK: No error
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_FadeBlackTransition(M4OSA_Void *userData, M4VIFI_ImagePlane PlaneIn1[3],
- M4VIFI_ImagePlane PlaneIn2[3],
- M4VIFI_ImagePlane *PlaneOut,
- M4VSS3GPP_ExternalProgress *pProgress,
- M4OSA_UInt32 uiTransitionKind)
-{
- M4OSA_Int32 tmp = 0;
- M4OSA_ERR err = M4NO_ERROR;
-
-
- if((pProgress->uiProgress) < 500)
- {
- /**
- * Compute where we are in the effect (scale is 0->1024) */
- tmp = (M4OSA_Int32)((1.0 - ((M4OSA_Float)(pProgress->uiProgress*2)/1000)) * 1024 );
-
- /**
- * Apply the darkening effect */
- err = M4VFL_modifyLumaWithScale( (M4ViComImagePlane*)PlaneIn1,
- (M4ViComImagePlane*)PlaneOut, tmp, M4OSA_NULL);
- if (M4NO_ERROR != err)
- {
- M4OSA_TRACE1_1("M4xVSS_FadeBlackTransition: M4VFL_modifyLumaWithScale returns\
- error 0x%x, returning M4VSS3GPP_ERR_LUMA_FILTER_ERROR", err);
- return M4VSS3GPP_ERR_LUMA_FILTER_ERROR;
- }
- }
- else
- {
- /**
- * Compute where we are in the effect (scale is 0->1024). */
- tmp = (M4OSA_Int32)( (((M4OSA_Float)(((pProgress->uiProgress-500)*2))/1000)) * 1024 );
-
- /**
- * Apply the darkening effect */
- err = M4VFL_modifyLumaWithScale((M4ViComImagePlane*)PlaneIn2,
- (M4ViComImagePlane*)PlaneOut, tmp, M4OSA_NULL);
- if (M4NO_ERROR != err)
- {
- M4OSA_TRACE1_1("M4xVSS_FadeBlackTransition:\
- M4VFL_modifyLumaWithScale returns error 0x%x,\
- returning M4VSS3GPP_ERR_LUMA_FILTER_ERROR", err);
- return M4VSS3GPP_ERR_LUMA_FILTER_ERROR;
- }
- }
-
-
- return M4VIFI_OK;
-}
-
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalConvertToUTF8(M4OSA_Context pContext,
- * M4OSA_Void* pBufferIn,
- * M4OSA_Void* pBufferOut,
- * M4OSA_UInt32* convertedSize)
- *
- * @brief This function convert from the customer format to UTF8
- * @note
- * @param pContext (IN) The integrator own context
- * @param pBufferIn (IN) Buffer to convert
- * @param pBufferOut (OUT) Converted buffer
- * @param convertedSize (OUT) Size of the converted buffer
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalConvertToUTF8(M4OSA_Context pContext, M4OSA_Void* pBufferIn,
- M4OSA_Void* pBufferOut, M4OSA_UInt32* convertedSize)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4OSA_ERR err;
-
- pBufferOut = pBufferIn;
- if(xVSS_context->UTFConversionContext.pConvToUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer != M4OSA_NULL)
- {
- M4OSA_UInt32 ConvertedSize = xVSS_context->UTFConversionContext.m_TempOutConversionSize;
-
- memset((void *)xVSS_context->UTFConversionContext.pTempOutConversionBuffer,0
- ,(M4OSA_UInt32)xVSS_context->UTFConversionContext.m_TempOutConversionSize);
-
- err = xVSS_context->UTFConversionContext.pConvToUTF8Fct((M4OSA_Void*)pBufferIn,
- (M4OSA_UInt8*)xVSS_context->UTFConversionContext.pTempOutConversionBuffer,
- (M4OSA_UInt32*)&ConvertedSize);
- if(err == M4xVSSWAR_BUFFER_OUT_TOO_SMALL)
- {
- M4OSA_TRACE2_1("M4xVSS_internalConvertToUTF8: pConvToUTF8Fct return 0x%x",err);
-
- /*free too small buffer*/
- free(xVSS_context->\
- UTFConversionContext.pTempOutConversionBuffer);
-
- /*re-allocate the buffer*/
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer =
- (M4OSA_Void*)M4OSA_32bitAlignedMalloc(ConvertedSize*sizeof(M4OSA_UInt8), M4VA,
- (M4OSA_Char *)"M4xVSS_internalConvertToUTF8: UTF conversion buffer");
- if(M4OSA_NULL == xVSS_context->UTFConversionContext.pTempOutConversionBuffer)
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertToUTF8");
- return M4ERR_ALLOC;
- }
- xVSS_context->UTFConversionContext.m_TempOutConversionSize = ConvertedSize;
-
- memset((void *)xVSS_context->\
- UTFConversionContext.pTempOutConversionBuffer,0,(M4OSA_UInt32)xVSS_context->\
- UTFConversionContext.m_TempOutConversionSize);
-
- err = xVSS_context->UTFConversionContext.pConvToUTF8Fct((M4OSA_Void*)pBufferIn,
- (M4OSA_Void*)xVSS_context->UTFConversionContext.pTempOutConversionBuffer,
- (M4OSA_UInt32*)&ConvertedSize);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalConvertToUTF8: pConvToUTF8Fct return 0x%x",err);
- return err;
- }
- }
- else if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalConvertToUTF8: pConvToUTF8Fct return 0x%x",err);
- return err;
- }
- /*decoded path*/
- pBufferOut = xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- (*convertedSize) = ConvertedSize;
- }
- return M4NO_ERROR;
-}
-
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_internalConvertFromUTF8(M4OSA_Context pContext)
- *
- * @brief This function convert from UTF8 to the customer format
- * @note
- * @param pContext (IN) The integrator own context
- * @param pBufferIn (IN) Buffer to convert
- * @param pBufferOut (OUT) Converted buffer
- * @param convertedSize (OUT) Size of the converted buffer
- *
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one of the function parameters is null
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_internalConvertFromUTF8(M4OSA_Context pContext, M4OSA_Void* pBufferIn,
- M4OSA_Void* pBufferOut, M4OSA_UInt32* convertedSize)
-{
- M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext;
- M4OSA_ERR err;
-
- pBufferOut = pBufferIn;
- if(xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer != M4OSA_NULL)
- {
- M4OSA_UInt32 ConvertedSize = xVSS_context->UTFConversionContext.m_TempOutConversionSize;
-
- memset((void *)xVSS_context->\
- UTFConversionContext.pTempOutConversionBuffer,0,(M4OSA_UInt32)xVSS_context->\
- UTFConversionContext.m_TempOutConversionSize);
-
- err = xVSS_context->UTFConversionContext.pConvFromUTF8Fct\
- ((M4OSA_Void*)pBufferIn,(M4OSA_UInt8*)xVSS_context->\
- UTFConversionContext.pTempOutConversionBuffer, (M4OSA_UInt32*)&ConvertedSize);
- if(err == M4xVSSWAR_BUFFER_OUT_TOO_SMALL)
- {
- M4OSA_TRACE2_1("M4xVSS_internalConvertFromUTF8: pConvFromUTF8Fct return 0x%x",err);
-
- /*free too small buffer*/
- free(xVSS_context->\
- UTFConversionContext.pTempOutConversionBuffer);
-
- /*re-allocate the buffer*/
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer =
- (M4OSA_Void*)M4OSA_32bitAlignedMalloc(ConvertedSize*sizeof(M4OSA_UInt8), M4VA,
- (M4OSA_Char *)"M4xVSS_internalConvertFromUTF8: UTF conversion buffer");
- if(M4OSA_NULL == xVSS_context->UTFConversionContext.pTempOutConversionBuffer)
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertFromUTF8");
- return M4ERR_ALLOC;
- }
- xVSS_context->UTFConversionContext.m_TempOutConversionSize = ConvertedSize;
-
- memset((void *)xVSS_context->\
- UTFConversionContext.pTempOutConversionBuffer,0,(M4OSA_UInt32)xVSS_context->\
- UTFConversionContext.m_TempOutConversionSize);
-
- err = xVSS_context->UTFConversionContext.pConvFromUTF8Fct((M4OSA_Void*)pBufferIn,
- (M4OSA_Void*)xVSS_context->UTFConversionContext.pTempOutConversionBuffer,
- (M4OSA_UInt32*)&ConvertedSize);
- if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalConvertFromUTF8: pConvFromUTF8Fct return 0x%x",err);
- return err;
- }
- }
- else if(err != M4NO_ERROR)
- {
- M4OSA_TRACE1_1("M4xVSS_internalConvertFromUTF8: pConvFromUTF8Fct return 0x%x",err);
- return err;
- }
- /*decoded path*/
- pBufferOut = xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- (*convertedSize) = ConvertedSize;
- }
-
-
- return M4NO_ERROR;
-}