summaryrefslogtreecommitdiffstats
path: root/libvideoeditor/vss/src/M4xVSS_API.c
diff options
context:
space:
mode:
Diffstat (limited to 'libvideoeditor/vss/src/M4xVSS_API.c')
-rwxr-xr-xlibvideoeditor/vss/src/M4xVSS_API.c6367
1 files changed, 0 insertions, 6367 deletions
diff --git a/libvideoeditor/vss/src/M4xVSS_API.c b/libvideoeditor/vss/src/M4xVSS_API.c
deleted file mode 100755
index 9f5410b..0000000
--- a/libvideoeditor/vss/src/M4xVSS_API.c
+++ /dev/null
@@ -1,6367 +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_API.c
- * @brief API of eXtended Video Studio Service (Video Studio 2.1)
- * @note
- ******************************************************************************
- */
-
-/**
- * OSAL main types and errors ***/
-#include "M4OSA_Types.h"
-#include "M4OSA_Error.h"
-#include "M4OSA_Memory.h"
-#include "M4OSA_Debug.h"
-#include "M4OSA_FileReader.h"
-#include "M4OSA_FileWriter.h"
-#include "M4OSA_CoreID.h"
-#include "M4OSA_CharStar.h"
-// StageFright encoders require %16 resolution
-#include "M4ENCODER_common.h"
-#include "M4DECODER_Common.h"
-#include "VideoEditorVideoDecoder.h"
-
-/**
- * VSS 3GPP API definition */
-#include "M4VSS3GPP_ErrorCodes.h"
-
-/*************************
-Begin of xVSS API
- **************************/
-
-#include "M4xVSS_API.h"
-#include "M4xVSS_Internal.h"
-
-/* RC: to delete unecessary temp files on the fly */
-#include "M4VSS3GPP_InternalTypes.h"
-#include <utils/Log.h>
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_Init(M4OSA_Context* pContext, M4xVSS_InitParams* pParams)
- * @brief This function initializes the xVSS
- * @note Initializes the xVSS edit operation (allocates an execution context).
- *
- * @param pContext (OUT) Pointer on the xVSS edit context to allocate
- * @param params (IN) Parameters mandatory for xVSS
- * @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_Init( M4OSA_Context *pContext, M4xVSS_InitParams *pParams )
-{
- M4xVSS_Context *xVSS_context;
- M4OSA_UInt32 length = 0, i;
-
- if( pParams == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Parameter structure for M4xVSS_Init function is NULL");
- return M4ERR_PARAMETER;
- }
-
- if( pParams->pFileReadPtr == M4OSA_NULL
- || pParams->pFileWritePtr == M4OSA_NULL )
- {
- M4OSA_TRACE1_0(
- "pFileReadPtr or pFileWritePtr in M4xVSS_InitParams structure is NULL");
- return M4ERR_PARAMETER;
- }
-
- xVSS_context = (M4xVSS_Context *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_Context), M4VS,
- (M4OSA_Char *)"Context of the xVSS layer");
-
- if( xVSS_context == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_Init");
- return M4ERR_ALLOC;
- }
-
- /* Initialize file read/write functions pointers */
- xVSS_context->pFileReadPtr = pParams->pFileReadPtr;
- xVSS_context->pFileWritePtr = pParams->pFileWritePtr;
-
- /*UTF Conversion support: copy conversion functions pointers and allocate the temporary
- buffer*/
- if( pParams->pConvFromUTF8Fct != M4OSA_NULL )
- {
- if( pParams->pConvToUTF8Fct != M4OSA_NULL )
- {
- xVSS_context->UTFConversionContext.pConvFromUTF8Fct =
- pParams->pConvFromUTF8Fct;
- xVSS_context->UTFConversionContext.pConvToUTF8Fct =
- pParams->pConvToUTF8Fct;
- xVSS_context->UTFConversionContext.m_TempOutConversionSize =
- UTF_CONVERSION_BUFFER_SIZE;
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer =
- (M4OSA_Void *)M4OSA_32bitAlignedMalloc(UTF_CONVERSION_BUFFER_SIZE
- * sizeof(M4OSA_UInt8),
- M4VA, (M4OSA_Char *)"M4xVSS_Init: UTF conversion buffer");
-
- if( M4OSA_NULL
- == xVSS_context->UTFConversionContext.pTempOutConversionBuffer )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_Init");
- free(xVSS_context->pTempPath);
- xVSS_context->pTempPath = M4OSA_NULL;
- free(xVSS_context);
- xVSS_context = M4OSA_NULL;
- return M4ERR_ALLOC;
- }
- }
- else
- {
- M4OSA_TRACE1_0("M4xVSS_Init: one UTF conversion pointer is null and the other\
- is not null");
- free(xVSS_context->pTempPath);
- xVSS_context->pTempPath = M4OSA_NULL;
- free(xVSS_context);
- xVSS_context = M4OSA_NULL;
- return M4ERR_PARAMETER;
- }
- }
- else
- {
- xVSS_context->UTFConversionContext.pConvFromUTF8Fct = M4OSA_NULL;
- xVSS_context->UTFConversionContext.pConvToUTF8Fct = M4OSA_NULL;
- xVSS_context->UTFConversionContext.m_TempOutConversionSize = 0;
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer =
- M4OSA_NULL;
- }
-
- if( pParams->pTempPath != M4OSA_NULL )
- {
- /*No need to convert into UTF8 as all input of xVSS are in UTF8
- (the conversion customer format into UTF8
- is done in VA/VAL)*/
- xVSS_context->pTempPath =
- (M4OSA_Void *)M4OSA_32bitAlignedMalloc(strlen(pParams->pTempPath) + 1,
- M4VS, (M4OSA_Char *)"xVSS Path for temporary files");
-
- if( xVSS_context->pTempPath == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_Init");
- return M4ERR_ALLOC;
- }
- memcpy((void *)xVSS_context->pTempPath, (void *)pParams->pTempPath,
- strlen(pParams->pTempPath) + 1);
- /* TODO: Check that no previous xVSS temporary files are present ? */
- }
- else
- {
- M4OSA_TRACE1_0("Path for temporary files is NULL");
- free(xVSS_context);
- xVSS_context = M4OSA_NULL;
- return M4ERR_PARAMETER;
- }
-
- xVSS_context->pSettings =
- (M4VSS3GPP_EditSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_EditSettings),
- M4VS, (M4OSA_Char *)"Copy of VSS structure");
-
- if( xVSS_context->pSettings == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_Init");
- free(xVSS_context->pTempPath);
- xVSS_context->pTempPath = M4OSA_NULL;
- free(xVSS_context);
- xVSS_context = M4OSA_NULL;
- return M4ERR_ALLOC;
- }
-
- /* Initialize pointers in pSettings */
- xVSS_context->pSettings->pClipList = M4OSA_NULL;
- xVSS_context->pSettings->pTransitionList = M4OSA_NULL;
- xVSS_context->pSettings->Effects = M4OSA_NULL; /* RC */
- xVSS_context->pSettings->xVSS.pBGMtrack = M4OSA_NULL;
-
- /* This is used to know if the user has added or removed some medias */
- xVSS_context->previousClipNumber = 0;
-
- /* "State machine" */
- xVSS_context->editingStep = 0;
- xVSS_context->analyseStep = 0;
-
- xVSS_context->pcmPreviewFile = M4OSA_NULL;
-
- /* Initialize Pto3GPP and MCS lists */
- xVSS_context->pMCSparamsList = M4OSA_NULL;
- xVSS_context->pPTo3GPPparamsList = M4OSA_NULL;
- xVSS_context->pPTo3GPPcurrentParams = M4OSA_NULL;
- xVSS_context->pMCScurrentParams = M4OSA_NULL;
-
- xVSS_context->tempFileIndex = 0;
-
- xVSS_context->targetedBitrate = 0;
-
- xVSS_context->targetedTimescale = 0;
-
- xVSS_context->pAudioMixContext = M4OSA_NULL;
- xVSS_context->pAudioMixSettings = M4OSA_NULL;
-
- /*FB: initialize to avoid crash when error during the editing*/
- xVSS_context->pCurrentEditSettings = M4OSA_NULL;
-
- /* Initialize state if all initializations are corrects */
- xVSS_context->m_state = M4xVSS_kStateInitialized;
-
- /* initialize MCS context*/
- xVSS_context->pMCS_Ctxt = M4OSA_NULL;
-
- *pContext = xVSS_context;
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4xVSS_ReduceTranscode
- * @brief This function changes the given editing structure in order to
- * minimize the transcoding time.
- * @note The xVSS analyses this structure, and if needed, changes the
- * output parameters (Video codec, video size, audio codec,
- * audio nb of channels) to minimize the transcoding time.
- *
- * @param pContext (OUT) Pointer on the xVSS edit context to allocate
- * @param pSettings (IN) Edition settings (allocated by the user)
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL
- * @return M4ERR_ALLOC: Memory allocation has failed
- * @return M4ERR_STATE: This function cannot not be called at this time
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_ReduceTranscode( M4OSA_Context pContext,
- M4VSS3GPP_EditSettings *pSettings )
-{
- M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
- M4OSA_ERR err = M4NO_ERROR;
- M4VIDEOEDITING_ClipProperties fileProperties;
- M4OSA_UInt8 i, j;
- M4OSA_Bool bAudioTransition = M4OSA_FALSE;
- M4OSA_Bool bIsBGMReplace = M4OSA_FALSE;
- M4OSA_Bool bFound;
- M4OSA_UInt32 videoConfig[9] =
- {
- 0, 0, 0, 0, 0, 0, 0, 0, 0
- };
- /** Index <-> Video config **/
- /* 0: H263 SQCIF */
- /* 1: H263 QCIF */
- /* 2: H263 CIF */
- /* 3: MPEG4 SQCIF */
- /* 4: MPEG4 QQVGA */
- /* 5: MPEG4 QCIF */
- /* 6: MPEG4 QVGA */
- /* 7: MPEG4 CIF */
- /* 8: MPEG4 VGA */
- /****************************/
- M4OSA_UInt32 audioConfig[3] =
- {
- 0, 0, 0
- };
- /** Index <-> Audio config **/
- /* 0: AMR */
- /* 1: AAC 16kHz mono */
- /* 2: AAC 16kHz stereo */
- /****************************/
-
- /* Check state */
- if( xVSS_context->m_state != M4xVSS_kStateInitialized \
- && xVSS_context->m_state != M4xVSS_kStateOpened )
- {
- M4OSA_TRACE1_1(
- "Bad state when calling M4xVSS_ReduceTranscode function! State is %d",
- xVSS_context->m_state);
- return M4ERR_STATE;
- }
-
- /* Check number of clips */
- if( pSettings->uiClipNumber == 0 )
- {
- M4OSA_TRACE1_0("The number of input clip must be greater than 0 !");
- return M4ERR_PARAMETER;
- }
-
- /* Check if there is a background music, and if its audio will replace input clip audio */
- if( pSettings->xVSS.pBGMtrack != M4OSA_NULL )
- {
- if( pSettings->xVSS.pBGMtrack->uiAddVolume == 100 )
- {
- bIsBGMReplace = M4OSA_TRUE;
- }
- }
-
- /* Parse all clips, and give occurences of each combination */
- for ( i = 0; i < pSettings->uiClipNumber; i++ )
- {
- /* We ignore JPG input files as they are always transcoded */
- if( pSettings->pClipList[i]->FileType == M4VIDEOEDITING_kFileType_3GPP )
- {
- /**
- * UTF conversion: convert into the customer format*/
- M4OSA_Void *pDecodedPath = pSettings->pClipList[i]->pFile;
- M4OSA_UInt32 ConvertedSize = 0;
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)pSettings->pClipList[i]->pFile,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer,
- &ConvertedSize);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1("M4xVSS_ReduceTranscode:\
- M4xVSS_internalConvertFromUTF8 returns err: 0x%x", err);
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
- /**
- * End of the utf conversion, now use the converted path*/
- err = M4xVSS_internalGetProperties(xVSS_context, pDecodedPath,
- &fileProperties);
-
- //err = M4xVSS_internalGetProperties(xVSS_context, pSettings->pClipList[i]->pFile,
- // &fileProperties);
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_sendCommand: M4xVSS_internalGetProperties returned 0x%x",
- err);
- /* TODO: Translate error code of MCS to an xVSS error code ? */
- return err;
- }
-
- /* Check best video settings */
- if( fileProperties.uiVideoWidth == 128
- && fileProperties.uiVideoHeight == 96 )
- {
- if( fileProperties.VideoStreamType == M4VIDEOEDITING_kH263 )
- {
- videoConfig[0] += fileProperties.uiClipVideoDuration;
- }
- else if( ( fileProperties.VideoStreamType
- == M4VIDEOEDITING_kMPEG4) \
- || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) )
- {
- videoConfig[3] += fileProperties.uiClipVideoDuration;
- }
- }
- else if( fileProperties.uiVideoWidth == 160
- && fileProperties.uiVideoHeight == 120 )
- {
- if( ( fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) \
- || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) )
- {
- videoConfig[4] += fileProperties.uiClipVideoDuration;
- }
- }
- else if( fileProperties.uiVideoWidth == 176
- && fileProperties.uiVideoHeight == 144 )
- {
- if( fileProperties.VideoStreamType == M4VIDEOEDITING_kH263 )
- {
- videoConfig[1] += fileProperties.uiClipVideoDuration;
- }
- else if( ( fileProperties.VideoStreamType
- == M4VIDEOEDITING_kMPEG4) \
- || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) )
- {
- videoConfig[5] += fileProperties.uiClipVideoDuration;
- }
- }
- else if( fileProperties.uiVideoWidth == 320
- && fileProperties.uiVideoHeight == 240 )
- {
- if( ( fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) \
- || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) )
- {
- videoConfig[6] += fileProperties.uiClipVideoDuration;
- }
- }
- else if( fileProperties.uiVideoWidth == 352
- && fileProperties.uiVideoHeight == 288 )
- {
- if( fileProperties.VideoStreamType == M4VIDEOEDITING_kH263 )
- {
- videoConfig[2] += fileProperties.uiClipVideoDuration;
- }
- else if( ( fileProperties.VideoStreamType
- == M4VIDEOEDITING_kMPEG4) \
- || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) )
- {
- videoConfig[7] += fileProperties.uiClipVideoDuration;
- }
- }
- else if( fileProperties.uiVideoWidth == 640
- && fileProperties.uiVideoHeight == 480 )
- {
- if( ( fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) \
- || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) )
- {
- videoConfig[8] += fileProperties.uiClipVideoDuration;
- }
- }
-
- /* If there is a BGM that replaces existing audio track, we do not care about
- audio track as it will be replaced */
- /* If not, we try to minimize audio reencoding */
- if( bIsBGMReplace == M4OSA_FALSE )
- {
- if( fileProperties.AudioStreamType == M4VIDEOEDITING_kAAC )
- {
- if( fileProperties.uiSamplingFrequency == 16000 && \
- fileProperties.uiNbChannels == 1 )
- {
- audioConfig[1] += fileProperties.uiClipAudioDuration;
- }
- else if( fileProperties.uiSamplingFrequency == 16000 && \
- fileProperties.uiNbChannels == 2 )
- {
- audioConfig[2] += fileProperties.uiClipAudioDuration;
- }
- }
- else if( fileProperties.AudioStreamType
- == M4VIDEOEDITING_kAMR_NB )
- {
- audioConfig[0] += fileProperties.uiClipAudioDuration;
- }
- }
- }
- }
-
- /* Find best output video format (the most occuring combination) */
- j = 0;
- bFound = M4OSA_FALSE;
-
- for ( i = 0; i < 9; i++ )
- {
- if( videoConfig[i] >= videoConfig[j] )
- {
- j = i;
- bFound = M4OSA_TRUE;
- }
- }
-
- if( bFound )
- {
- switch( j )
- {
- case 0:
- pSettings->xVSS.outputVideoFormat = M4VIDEOEDITING_kH263;
- pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kSQCIF;
- break;
-
- case 1:
- pSettings->xVSS.outputVideoFormat = M4VIDEOEDITING_kH263;
- pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kQCIF;
- break;
-
- case 2:
- pSettings->xVSS.outputVideoFormat = M4VIDEOEDITING_kH263;
- pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kCIF;
- break;
-
- case 3:
- pSettings->xVSS.outputVideoFormat =
- (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
- ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264;
- pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kSQCIF;
- break;
-
- case 4:
- pSettings->xVSS.outputVideoFormat =
- (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
- ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264;
- pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kQQVGA;
- break;
-
- case 5:
- pSettings->xVSS.outputVideoFormat =
- (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
- ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264;
- pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kQCIF;
- break;
-
- case 6:
- pSettings->xVSS.outputVideoFormat =
- (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
- ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264;
- pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kQVGA;
- break;
-
- case 7:
- pSettings->xVSS.outputVideoFormat =
- (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
- ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264;
- pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kCIF;
- break;
-
- case 8:
- pSettings->xVSS.outputVideoFormat =
- (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
- ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264;
- pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kVGA;
- break;
- }
- }
-
- /* Find best output audio format (the most occuring combination) */
- j = 0;
- bFound = M4OSA_FALSE;
-
- for ( i = 0; i < 3; i++ )
- {
- if( audioConfig[i] >= audioConfig[j] )
- {
- j = i;
- bFound = M4OSA_TRUE;
- }
- }
-
- if( bFound )
- {
- switch( j )
- {
- case 0:
- pSettings->xVSS.outputAudioFormat = M4VIDEOEDITING_kAMR_NB;
- pSettings->xVSS.bAudioMono = M4OSA_TRUE;
- break;
-
- case 1:
- pSettings->xVSS.outputAudioFormat = M4VIDEOEDITING_kAAC;
- pSettings->xVSS.bAudioMono = M4OSA_TRUE;
- break;
-
- case 2:
- pSettings->xVSS.outputAudioFormat = M4VIDEOEDITING_kAAC;
- pSettings->xVSS.bAudioMono = M4OSA_FALSE;
- break;
- }
- }
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_SendCommand(M4OSA_Context pContext,
- * M4VSS3GPP_EditSettings* pSettings)
- * @brief This function gives to the xVSS an editing structure
- * @note The xVSS analyses this structure, and prepare edition
- * This function must be called after M4xVSS_Init, after
- * M4xVSS_CloseCommand, or after M4xVSS_PreviewStop.
- * After this function, the user must call M4xVSS_Step until
- * it returns another error than M4NO_ERROR.
- *
- * @param pContext (IN) Pointer on the xVSS edit context
- * @param pSettings (IN) Edition settings (allocated by the user)
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL
- * @return M4ERR_ALLOC: Memory allocation has failed
- * @return M4ERR_STATE: This function cannot not be called at this time
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_SendCommand( M4OSA_Context pContext,
- M4VSS3GPP_EditSettings *pSettings )
-{
- M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
- M4OSA_UInt8 i, j;
- M4OSA_UInt8 nbOfSameClip = 0;
- M4OSA_ERR err;
- M4OSA_Bool isNewBGM = M4OSA_TRUE;
- M4xVSS_Pto3GPP_params *pPto3GPP_last = M4OSA_NULL;
- M4xVSS_MCS_params *pMCS_last = M4OSA_NULL;
- M4OSA_UInt32 width, height, samplingFreq;
- M4OSA_Bool bIsTranscoding = M4OSA_FALSE;
- M4OSA_Int32 totalDuration;
- M4OSA_UInt32 outputSamplingFrequency = 0;
- M4OSA_UInt32 length = 0;
- M4OSA_Int8 masterClip = -1;
-
- i = 0;
- /* Check state */
- if( xVSS_context->m_state != M4xVSS_kStateInitialized \
- && xVSS_context->m_state != M4xVSS_kStateOpened )
- {
- M4OSA_TRACE1_1(
- "Bad state when calling M4xVSS_SendCommand function! State is %d",
- xVSS_context->m_state);
- return M4ERR_STATE;
- }
-
- /* State is back to initialized to allow call of cleanup function in case of error */
- xVSS_context->m_state = M4xVSS_kStateInitialized;
-
- /* Check if a previous sendCommand has been called */
- if( xVSS_context->previousClipNumber != 0 )
- {
- M4OSA_UInt32 pCmpResult = 0;
-
- /* Compare BGM input */
- if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL \
- && pSettings->xVSS.pBGMtrack != M4OSA_NULL )
- {
- pCmpResult = strcmp((const char *)xVSS_context->pSettings->xVSS.pBGMtrack->pFile,
- (const char *)pSettings->xVSS.pBGMtrack->pFile);
-
- if( pCmpResult == 0 )
- {
- /* Check if audio output parameters have changed */
- if( xVSS_context->pSettings->xVSS.outputAudioFormat ==
- pSettings->xVSS.outputAudioFormat
- && xVSS_context->pSettings->xVSS.bAudioMono
- == pSettings->xVSS.bAudioMono )
- {
- /* It means that BGM is the same as before, so, no need to redecode it */
- M4OSA_TRACE2_0(
- "BGM is the same as before, nothing to decode");
- isNewBGM = M4OSA_FALSE;
- }
- else
- {
- /* We need to unallocate PCM preview file path in internal context */
- if( xVSS_context->pcmPreviewFile != M4OSA_NULL )
- {
- free(xVSS_context->pcmPreviewFile);
- xVSS_context->pcmPreviewFile = M4OSA_NULL;
- }
- }
- }
- else
- {
- /* We need to unallocate PCM preview file path in internal context */
- if( xVSS_context->pcmPreviewFile != M4OSA_NULL )
- {
- free(xVSS_context->pcmPreviewFile);
- xVSS_context->pcmPreviewFile = M4OSA_NULL;
- }
- }
- }
-
- /* Check if output settings have changed */
- if( xVSS_context->pSettings->xVSS.outputVideoSize
- != pSettings->xVSS.outputVideoSize
- || xVSS_context->pSettings->xVSS.outputVideoFormat
- != pSettings->xVSS.outputVideoFormat
- || xVSS_context->pSettings->xVSS.outputVideoProfile
- != pSettings->xVSS.outputVideoProfile
- || xVSS_context->pSettings->xVSS.outputVideoLevel
- != pSettings->xVSS.outputVideoLevel
- || xVSS_context->pSettings->xVSS.outputAudioFormat
- != pSettings->xVSS.outputAudioFormat
- || xVSS_context->pSettings->xVSS.bAudioMono
- != pSettings->xVSS.bAudioMono
- || xVSS_context->pSettings->xVSS.outputAudioSamplFreq
- != pSettings->xVSS.outputAudioSamplFreq )
- {
- /* If it is the case, we can't reuse already transcoded/converted files */
- /* so, we delete these files and remove them from chained list */
- 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;
- }
- xVSS_context->pPTo3GPPparamsList = M4OSA_NULL;
- }
-
- if( xVSS_context->pMCSparamsList != M4OSA_NULL )
- {
- M4xVSS_MCS_params *pParams = xVSS_context->pMCSparamsList;
- M4xVSS_MCS_params *pParams_sauv;
- M4xVSS_MCS_params *pParams_bgm = M4OSA_NULL;
-
- while( pParams != M4OSA_NULL )
- {
- /* Here, we do not delete BGM */
- if( pParams->isBGM != M4OSA_TRUE )
- {
- 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;
- }
- else
- {
- pParams_bgm = pParams;
- pParams = pParams->pNext;
- /*PR P4ME00003182 initialize this pointer because the following params
- element will be deallocated*/
- if( pParams != M4OSA_NULL
- && pParams->isBGM != M4OSA_TRUE )
- {
- pParams_bgm->pNext = M4OSA_NULL;
- }
- }
- }
- xVSS_context->pMCSparamsList = pParams_bgm;
- }
- /* Maybe need to implement framerate changing */
- //xVSS_context->pSettings->videoFrameRate;
- }
-
- /* Unallocate previous xVSS_context->pSettings structure */
- M4xVSS_freeSettings(xVSS_context->pSettings);
-
- /*Unallocate output file path*/
- if( xVSS_context->pSettings->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pSettings->pOutputFile);
- xVSS_context->pSettings->pOutputFile = M4OSA_NULL;
- }
- xVSS_context->pSettings->uiOutputPathSize = 0;
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
-
- /**********************************
- Clips registering
- **********************************/
-
- /* Copy settings from user given structure to our "local" structure */
- xVSS_context->pSettings->xVSS.outputVideoFormat =
- pSettings->xVSS.outputVideoFormat;
- xVSS_context->pSettings->xVSS.outputVideoProfile =
- pSettings->xVSS.outputVideoProfile;
- xVSS_context->pSettings->xVSS.outputVideoLevel =
- pSettings->xVSS.outputVideoLevel;
- xVSS_context->pSettings->xVSS.outputVideoSize =
- pSettings->xVSS.outputVideoSize;
- xVSS_context->pSettings->xVSS.outputAudioFormat =
- pSettings->xVSS.outputAudioFormat;
- xVSS_context->pSettings->xVSS.bAudioMono = pSettings->xVSS.bAudioMono;
- xVSS_context->pSettings->xVSS.outputAudioSamplFreq =
- pSettings->xVSS.outputAudioSamplFreq;
- /*xVSS_context->pSettings->pOutputFile = pSettings->pOutputFile;*/
- /*FB: VAL CR P4ME00003076
- The output video and audio bitrate are given by the user in the edition settings structure*/
- xVSS_context->pSettings->xVSS.outputVideoBitrate =
- pSettings->xVSS.outputVideoBitrate;
- xVSS_context->pSettings->xVSS.outputAudioBitrate =
- pSettings->xVSS.outputAudioBitrate;
- xVSS_context->pSettings->PTVolLevel = pSettings->PTVolLevel;
-
- /*FB: bug fix if the output path is given in M4xVSS_sendCommand*/
-
- if( pSettings->pOutputFile != M4OSA_NULL
- && pSettings->uiOutputPathSize > 0 )
- {
- M4OSA_Void *pDecodedPath = pSettings->pOutputFile;
- /*As all inputs of the xVSS are in UTF8, convert the output file path into the
- customer format*/
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)pSettings->pOutputFile,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer, &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1("M4xVSS_SendCommand:\
- M4xVSS_internalConvertFromUTF8 returns err: 0x%x", err);
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- pSettings->uiOutputPathSize = length;
- }
-
- xVSS_context->pSettings->pOutputFile = (M4OSA_Void *)M4OSA_32bitAlignedMalloc \
- (pSettings->uiOutputPathSize + 1, M4VS,
- (M4OSA_Char *)"output file path");
-
- if( xVSS_context->pSettings->pOutputFile == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- memcpy((void *)xVSS_context->pSettings->pOutputFile,
- (void *)pDecodedPath, pSettings->uiOutputPathSize + 1);
- xVSS_context->pSettings->uiOutputPathSize = pSettings->uiOutputPathSize;
- xVSS_context->pOutputFile = xVSS_context->pSettings->pOutputFile;
- }
- else
- {
- xVSS_context->pSettings->pOutputFile = M4OSA_NULL;
- xVSS_context->pSettings->uiOutputPathSize = 0;
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- xVSS_context->pSettings->pTemporaryFile = pSettings->pTemporaryFile;
- xVSS_context->pSettings->uiClipNumber = pSettings->uiClipNumber;
- xVSS_context->pSettings->videoFrameRate = pSettings->videoFrameRate;
- xVSS_context->pSettings->uiMasterClip =
- 0; /* With VSS 2.0, this new param is mandatory */
- xVSS_context->pSettings->xVSS.pTextRenderingFct =
- pSettings->xVSS.pTextRenderingFct; /* CR text handling */
- xVSS_context->pSettings->xVSS.outputFileSize =
- pSettings->xVSS.outputFileSize;
-
- if( pSettings->xVSS.outputFileSize != 0 \
- && pSettings->xVSS.outputAudioFormat != M4VIDEOEDITING_kAMR_NB )
- {
- M4OSA_TRACE1_0("M4xVSS_SendCommand: Impossible to limit file\
- size with other audio output than AAC");
- return M4ERR_PARAMETER;
- }
- xVSS_context->nbStepTotal = 0;
- xVSS_context->currentStep = 0;
-
- if( xVSS_context->pSettings->xVSS.outputVideoFormat != M4VIDEOEDITING_kMPEG4
- && xVSS_context->pSettings->xVSS.outputVideoFormat
- != M4VIDEOEDITING_kH263
- && xVSS_context->pSettings->xVSS.outputVideoFormat
- != M4VIDEOEDITING_kH264 )
- {
- xVSS_context->pSettings->xVSS.outputVideoFormat =
- M4VIDEOEDITING_kNoneVideo;
- }
-
- /* Get output width/height */
- switch( xVSS_context->pSettings->xVSS.outputVideoSize )
- {
- case M4VIDEOEDITING_kSQCIF:
- width = 128;
- height = 96;
- break;
-
- case M4VIDEOEDITING_kQQVGA:
- width = 160;
- height = 120;
- break;
-
- case M4VIDEOEDITING_kQCIF:
- width = 176;
- height = 144;
- break;
-
- case M4VIDEOEDITING_kQVGA:
- width = 320;
- height = 240;
- break;
-
- case M4VIDEOEDITING_kCIF:
- width = 352;
- height = 288;
- break;
-
- case M4VIDEOEDITING_kVGA:
- width = 640;
- height = 480;
- break;
- /* +PR LV5807 */
- case M4VIDEOEDITING_kWVGA:
- width = 800;
- height = 480;
- break;
-
- case M4VIDEOEDITING_kNTSC:
- width = 720;
- height = 480;
- break;
- /* -PR LV5807 */
- /* +CR Google */
- case M4VIDEOEDITING_k640_360:
- width = 640;
- height = 360;
- break;
-
- case M4VIDEOEDITING_k854_480:
-
- // StageFright encoders require %16 resolution
-
- width = M4ENCODER_854_480_Width;
-
- height = 480;
- break;
-
- case M4VIDEOEDITING_k1280_720:
- width = 1280;
- height = 720;
- break;
-
- case M4VIDEOEDITING_k1080_720:
- // StageFright encoders require %16 resolution
- width = M4ENCODER_1080_720_Width;
- height = 720;
- break;
-
- case M4VIDEOEDITING_k960_720:
- width = 960;
- height = 720;
- break;
-
- case M4VIDEOEDITING_k1920_1080:
- width = 1920;
- height = M4ENCODER_1920_1080_Height;
- break;
-
- /* -CR Google */
- default: /* If output video size is not given, we take QCIF size */
- width = 176;
- height = 144;
- xVSS_context->pSettings->xVSS.outputVideoSize =
- M4VIDEOEDITING_kQCIF;
- break;
- }
-
- /* Get output Sampling frequency */
- switch( xVSS_context->pSettings->xVSS.outputAudioSamplFreq )
- {
- case M4VIDEOEDITING_k8000_ASF:
- samplingFreq = 8000;
- break;
-
- case M4VIDEOEDITING_k16000_ASF:
- samplingFreq = 16000;
- break;
-
- case M4VIDEOEDITING_k22050_ASF:
- samplingFreq = 22050;
- break;
-
- case M4VIDEOEDITING_k24000_ASF:
- samplingFreq = 24000;
- break;
-
- case M4VIDEOEDITING_k32000_ASF:
- samplingFreq = 32000;
- break;
-
- case M4VIDEOEDITING_k44100_ASF:
- samplingFreq = 44100;
- break;
-
- case M4VIDEOEDITING_k48000_ASF:
- samplingFreq = 48000;
- break;
-
- case M4VIDEOEDITING_kDefault_ASF:
- default:
- if( xVSS_context->pSettings->xVSS.outputAudioFormat
- == M4VIDEOEDITING_kAMR_NB )
- {
- samplingFreq = 8000;
- }
- else if( xVSS_context->pSettings->xVSS.outputAudioFormat
- == M4VIDEOEDITING_kAAC )
- {
- samplingFreq = 16000;
- }
- else
- {
- samplingFreq = 0;
- }
- break;
- }
-
- /* Allocate clip/transitions if clip number is not null ... */
- if( 0 < xVSS_context->pSettings->uiClipNumber )
- {
- if( xVSS_context->pSettings->pClipList != M4OSA_NULL )
- {
- free((xVSS_context->pSettings->pClipList));
- xVSS_context->pSettings->pClipList = M4OSA_NULL;
- }
-
- if( xVSS_context->pSettings->pTransitionList != M4OSA_NULL )
- {
- free(xVSS_context->pSettings->pTransitionList);
- xVSS_context->pSettings->pTransitionList = M4OSA_NULL;
- }
-
- xVSS_context->pSettings->pClipList =
- (M4VSS3GPP_ClipSettings ** )M4OSA_32bitAlignedMalloc \
- (sizeof(M4VSS3GPP_ClipSettings *)*xVSS_context->pSettings->uiClipNumber,
- M4VS, (M4OSA_Char *)"xVSS, copy of pClipList");
-
- if( xVSS_context->pSettings->pClipList == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- /* Set clip list to NULL */
- memset((void *)xVSS_context->pSettings->pClipList,0,
- sizeof(M4VSS3GPP_ClipSettings *)
- *xVSS_context->pSettings->uiClipNumber);
-
- if( xVSS_context->pSettings->uiClipNumber > 1 )
- {
- xVSS_context->pSettings->pTransitionList =
- (M4VSS3GPP_TransitionSettings ** ) \
- M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings *) \
- *(xVSS_context->pSettings->uiClipNumber - 1), M4VS, (M4OSA_Char *) \
- "xVSS, copy of pTransitionList");
-
- if( xVSS_context->pSettings->pTransitionList == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- /* Set transition list to NULL */
- memset(
- (void *)xVSS_context->pSettings->pTransitionList,0,
- sizeof(M4VSS3GPP_TransitionSettings *)
- *(xVSS_context->pSettings->uiClipNumber - 1));
- }
- else
- {
- xVSS_context->pSettings->pTransitionList = M4OSA_NULL;
- }
- }
- /* else, there is a pb in the input settings structure */
- else
- {
- M4OSA_TRACE1_0("No clip in this settings list !!");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_PARAMETER;
- }
-
- /* RC Allocate effects settings */
- xVSS_context->pSettings->nbEffects = pSettings->nbEffects;
-
- if( 0 < xVSS_context->pSettings->nbEffects )
- {
- xVSS_context->pSettings->Effects =
- (M4VSS3GPP_EffectSettings *)M4OSA_32bitAlignedMalloc \
- (xVSS_context->pSettings->nbEffects * sizeof(M4VSS3GPP_EffectSettings),
- M4VS, (M4OSA_Char *)"effects settings");
-
- if( xVSS_context->pSettings->Effects == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- /*FB bug fix 19.03.2008: these pointers were not initialized -> crash when free*/
- for ( i = 0; i < xVSS_context->pSettings->nbEffects; i++ )
- {
- xVSS_context->pSettings->Effects[i].xVSS.pFramingFilePath =
- M4OSA_NULL;
- xVSS_context->pSettings->Effects[i].xVSS.pFramingBuffer =
- M4OSA_NULL;
- xVSS_context->pSettings->Effects[i].xVSS.pTextBuffer = M4OSA_NULL;
- }
- /**/
- }
-
- if( xVSS_context->targetedTimescale == 0 )
- {
- M4OSA_UInt32 pTargetedTimeScale = 0;
-
- err = M4xVSS_internalGetTargetedTimeScale(xVSS_context, pSettings,
- &pTargetedTimeScale);
-
- if( M4NO_ERROR != err || pTargetedTimeScale == 0 )
- {
- M4OSA_TRACE1_1("M4xVSS_SendCommand: M4xVSS_internalGetTargetedTimeScale\
- returned 0x%x", err);
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return err;
- }
- xVSS_context->targetedTimescale = pTargetedTimeScale;
- }
-
- /* Initialize total duration variable */
- totalDuration = 0;
-
- /* Parsing list of clips given by application, and prepare analyzing */
- for ( i = 0; i < xVSS_context->pSettings->uiClipNumber; i++ )
- {
- /* Allocate current clip */
- xVSS_context->pSettings->pClipList[i] =
- (M4VSS3GPP_ClipSettings *)M4OSA_32bitAlignedMalloc \
- (sizeof(M4VSS3GPP_ClipSettings), M4VS, (M4OSA_Char *)"clip settings");
-
- if( xVSS_context->pSettings->pClipList[i] == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
-
- /* Copy clip settings from given structure to our xVSS_context structure */
- err =
- M4xVSS_DuplicateClipSettings(xVSS_context->pSettings->pClipList[i],
- pSettings->pClipList[i], M4OSA_TRUE);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_DuplicateClipSettings return error 0x%x",
- err);
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return err;
- }
-
- xVSS_context->pSettings->pClipList[i]->bTranscodingRequired =
- M4OSA_FALSE;
-
- /* Because there is 1 less transition than clip number */
- if( i < xVSS_context->pSettings->uiClipNumber - 1 )
- {
- xVSS_context->pSettings->pTransitionList[i] =
- (M4VSS3GPP_TransitionSettings
- *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings),
- M4VS, (M4OSA_Char *)"transition settings");
-
- if( xVSS_context->pSettings->pTransitionList[i] == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
-
- memcpy(
- (void *)xVSS_context->pSettings->pTransitionList[i],
- (void *)pSettings->pTransitionList[i],
- sizeof(M4VSS3GPP_TransitionSettings));
- /* Initialize external effect context to NULL, to know if input jpg has already been
- decoded or not */
- xVSS_context->pSettings->pTransitionList[i]->
- pExtVideoTransitionFctCtxt = M4OSA_NULL;
-
- switch( xVSS_context->pSettings->
- pTransitionList[i]->VideoTransitionType )
- {
- /* If transition type is alpha magic, we need to decode input file */
- case M4xVSS_kVideoTransitionType_AlphaMagic:
- /* Allocate our alpha magic settings structure to have a copy of the
- provided one */
- xVSS_context->pSettings->pTransitionList[i]-> \
- xVSS.transitionSpecific.pAlphaMagicSettings =
- (M4xVSS_AlphaMagicSettings *)M4OSA_32bitAlignedMalloc \
- (sizeof(M4xVSS_AlphaMagicSettings), M4VS,
- (M4OSA_Char *)"Input Alpha magic settings structure");
-
- if( xVSS_context->pSettings->pTransitionList[i]-> \
- xVSS.transitionSpecific.pAlphaMagicSettings == M4OSA_NULL )
- {
- M4OSA_TRACE1_0(
- "Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- /* Copy data from the provided alpha magic settings structure tou our
- structure */
- memcpy((void *)xVSS_context->pSettings->
- pTransitionList[i]-> \
- xVSS.transitionSpecific.pAlphaMagicSettings,
- (void *)pSettings->pTransitionList[i]-> \
- xVSS.transitionSpecific.pAlphaMagicSettings,
- sizeof(M4xVSS_AlphaMagicSettings));
-
- /* Allocate our alpha magic input filename */
- xVSS_context->pSettings->pTransitionList[i]-> \
- xVSS.transitionSpecific.pAlphaMagicSettings->
- pAlphaFilePath = M4OSA_32bitAlignedMalloc(
- (strlen(pSettings->pTransitionList[i]-> \
- xVSS.transitionSpecific.pAlphaMagicSettings->pAlphaFilePath)
- + 1), M4VS, (M4OSA_Char *)"Alpha magic file path");
-
- if( xVSS_context->pSettings->pTransitionList[i]-> \
- xVSS.transitionSpecific.pAlphaMagicSettings->pAlphaFilePath
- == M4OSA_NULL )
- {
- M4OSA_TRACE1_0(
- "Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- /* Copy data from the provided alpha magic filename to our */
- M4OSA_chrNCopy(
- xVSS_context->pSettings->pTransitionList[i]->xVSS.
- transitionSpecific.pAlphaMagicSettings->
- pAlphaFilePath,
- pSettings->pTransitionList[i]->xVSS.
- transitionSpecific.pAlphaMagicSettings->
- pAlphaFilePath, strlen(
- pSettings->pTransitionList[i]->xVSS.
- transitionSpecific.pAlphaMagicSettings->
- pAlphaFilePath) + 1);
-
- /* Parse all transition to know if the input jpg has already been decoded */
- for ( j = 0; j < i; j++ )
- {
- if( xVSS_context->pSettings->
- pTransitionList[j]->VideoTransitionType
- == M4xVSS_kVideoTransitionType_AlphaMagic )
- {
- M4OSA_UInt32 pCmpResult = 0;
- pCmpResult = strcmp((const char *)xVSS_context->pSettings->
- pTransitionList[i]->xVSS.
- transitionSpecific.pAlphaMagicSettings->
- pAlphaFilePath, (const char *)xVSS_context->pSettings->
- pTransitionList[j]->xVSS.
- transitionSpecific.
- pAlphaMagicSettings->pAlphaFilePath);
-
- if( pCmpResult == 0 )
- {
- M4xVSS_internal_AlphaMagicSettings
- *alphaSettings;
-
- alphaSettings =
- (M4xVSS_internal_AlphaMagicSettings
- *)M4OSA_32bitAlignedMalloc(
- sizeof(
- M4xVSS_internal_AlphaMagicSettings),
- M4VS,
- (M4OSA_Char
- *)
- "Alpha magic settings structure 1");
-
- if( alphaSettings == M4OSA_NULL )
- {
- M4OSA_TRACE1_0(
- "Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send
- command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- alphaSettings->pPlane =
- ((M4xVSS_internal_AlphaMagicSettings *)(
- xVSS_context->pSettings->
- pTransitionList[j]->
- pExtVideoTransitionFctCtxt))->
- pPlane;
-
- if( xVSS_context->pSettings->
- pTransitionList[i]->xVSS.transitionSpecific.
- pAlphaMagicSettings->blendingPercent > 0
- && xVSS_context->pSettings->
- pTransitionList[i]->xVSS.
- transitionSpecific.
- pAlphaMagicSettings->blendingPercent
- <= 100 )
- {
- alphaSettings->blendingthreshold =
- ( xVSS_context->pSettings->
- pTransitionList[i]->xVSS.
- transitionSpecific.
- pAlphaMagicSettings->
- blendingPercent) * 255 / 200;
- }
- else
- {
- alphaSettings->blendingthreshold = 0;
- }
- alphaSettings->isreverse =
- xVSS_context->pSettings->
- pTransitionList[i]->xVSS.
- transitionSpecific.
- pAlphaMagicSettings->isreverse;
- /* It means that the input jpg file for alpha magic has already
- been decoded -> no nedd to decode it again */
- if( alphaSettings->blendingthreshold == 0 )
- {
- xVSS_context->pSettings->
- pTransitionList[i]->
- ExtVideoTransitionFct =
- M4xVSS_AlphaMagic;
- }
- else
- {
- xVSS_context->pSettings->
- pTransitionList[i]->
- ExtVideoTransitionFct =
- M4xVSS_AlphaMagicBlending;
- }
- xVSS_context->pSettings->pTransitionList[i]->
- pExtVideoTransitionFctCtxt = alphaSettings;
- break;
- }
- }
- }
-
- /* If the jpg has not been decoded yet ... */
- if( xVSS_context->pSettings->
- pTransitionList[i]->pExtVideoTransitionFctCtxt
- == M4OSA_NULL )
- {
- M4VIFI_ImagePlane *outputPlane;
- M4xVSS_internal_AlphaMagicSettings *alphaSettings;
- /*UTF conversion support*/
- M4OSA_Void *pDecodedPath = M4OSA_NULL;
-
- /*To support ARGB8888 : get the width and height */
- M4OSA_UInt32 width_ARGB888 =
- xVSS_context->pSettings->pTransitionList[i]->xVSS.
- transitionSpecific.pAlphaMagicSettings->width;
- M4OSA_UInt32 height_ARGB888 =
- xVSS_context->pSettings->pTransitionList[i]->xVSS.
- transitionSpecific.pAlphaMagicSettings->height;
- M4OSA_TRACE1_1(
- " TransitionListM4xVSS_SendCommand width State is %d",
- width_ARGB888);
- M4OSA_TRACE1_1(
- " TransitionListM4xVSS_SendCommand height! State is %d",
- height_ARGB888);
- /* Allocate output plane */
- outputPlane = (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(3
- * sizeof(M4VIFI_ImagePlane), M4VS, (M4OSA_Char
- *)
- "Output plane for Alpha magic transition");
-
- if( outputPlane == M4OSA_NULL )
- {
- M4OSA_TRACE1_0(
- "Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
-
- outputPlane[0].u_width = width;
- outputPlane[0].u_height = height;
- outputPlane[0].u_topleft = 0;
- outputPlane[0].u_stride = width;
- outputPlane[0].pac_data = (M4VIFI_UInt8
- *)M4OSA_32bitAlignedMalloc(( width * height * 3)
- >> 1,
- M4VS,
- (M4OSA_Char
- *)
- "Alloc for the Alpha magic pac_data output YUV");
- ;
-
- if( outputPlane[0].pac_data == M4OSA_NULL )
- {
- free(outputPlane);
- outputPlane = M4OSA_NULL;
- M4OSA_TRACE1_0(
- "Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- outputPlane[1].u_width = width >> 1;
- outputPlane[1].u_height = height >> 1;
- outputPlane[1].u_topleft = 0;
- outputPlane[1].u_stride = width >> 1;
- outputPlane[1].pac_data = outputPlane[0].pac_data
- + outputPlane[0].u_width * outputPlane[0].u_height;
- outputPlane[2].u_width = width >> 1;
- outputPlane[2].u_height = height >> 1;
- outputPlane[2].u_topleft = 0;
- outputPlane[2].u_stride = width >> 1;
- outputPlane[2].pac_data = outputPlane[1].pac_data
- + outputPlane[1].u_width * outputPlane[1].u_height;
-
- pDecodedPath =
- xVSS_context->pSettings->pTransitionList[i]->xVSS.
- transitionSpecific.pAlphaMagicSettings->
- pAlphaFilePath;
- /**
- * UTF conversion: convert into the customer format, before being used*/
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.
- pTempOutConversionBuffer != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)xVSS_context->pSettings->
- pTransitionList[i]->xVSS.
- transitionSpecific.
- pAlphaMagicSettings->pAlphaFilePath,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.
- pTempOutConversionBuffer, &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: pConvFromUTF8Fct returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.
- pTempOutConversionBuffer;
- }
- /**
- End of the conversion, use the decoded path*/
- /*To support ARGB8888 : convert + resizing from ARGB8888 to yuv420 */
-
- err = M4xVSS_internalConvertAndResizeARGB8888toYUV420(
- pDecodedPath,
- xVSS_context->pFileReadPtr, outputPlane,
- width_ARGB888, height_ARGB888);
-
- if( err != M4NO_ERROR )
- {
- free(outputPlane[0].pac_data);
- outputPlane[0].pac_data = M4OSA_NULL;
- free(outputPlane);
- outputPlane = M4OSA_NULL;
- M4xVSS_freeCommand(xVSS_context);
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: error when decoding alpha magic JPEG: 0x%x",
- err);
- return err;
- }
-
- /* Allocate alpha settings structure */
- alphaSettings =
- (M4xVSS_internal_AlphaMagicSettings *)M4OSA_32bitAlignedMalloc(
- sizeof(M4xVSS_internal_AlphaMagicSettings),
- M4VS, (M4OSA_Char
- *)"Alpha magic settings structure 2");
-
- if( alphaSettings == M4OSA_NULL )
- {
- M4OSA_TRACE1_0(
- "Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- alphaSettings->pPlane = outputPlane;
-
- if( xVSS_context->pSettings->pTransitionList[i]->xVSS.
- transitionSpecific.pAlphaMagicSettings->
- blendingPercent > 0 && xVSS_context->pSettings->
- pTransitionList[i]->xVSS.
- transitionSpecific.pAlphaMagicSettings->
- blendingPercent <= 100 )
- {
- alphaSettings->blendingthreshold =
- ( xVSS_context->pSettings->
- pTransitionList[i]->xVSS.
- transitionSpecific.pAlphaMagicSettings->
- blendingPercent) * 255 / 200;
- }
- else
- {
- alphaSettings->blendingthreshold = 0;
- }
- alphaSettings->isreverse =
- xVSS_context->pSettings->pTransitionList[i]->xVSS.
- transitionSpecific.pAlphaMagicSettings->
- isreverse;
-
- if( alphaSettings->blendingthreshold == 0 )
- {
- xVSS_context->pSettings->pTransitionList[i]->
- ExtVideoTransitionFct = M4xVSS_AlphaMagic;
- }
- else
- {
- xVSS_context->pSettings->pTransitionList[i]->
- ExtVideoTransitionFct =
- M4xVSS_AlphaMagicBlending;
- }
- xVSS_context->pSettings->pTransitionList[i]->
- pExtVideoTransitionFctCtxt = alphaSettings;
- }
-
- break;
-
- case M4xVSS_kVideoTransitionType_SlideTransition:
- {
- M4xVSS_internal_SlideTransitionSettings *slideSettings;
- slideSettings =
- (M4xVSS_internal_SlideTransitionSettings *)M4OSA_32bitAlignedMalloc(
- sizeof(M4xVSS_internal_SlideTransitionSettings),
- M4VS, (M4OSA_Char
- *)"Internal slide transition settings");
-
- if( M4OSA_NULL == slideSettings )
- {
- M4OSA_TRACE1_0(
- "Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- /* Just copy the lone parameter from the input settings to the internal
- context. */
-
- slideSettings->direction =
- pSettings->pTransitionList[i]->xVSS.transitionSpecific.
- pSlideTransitionSettings->direction;
-
- /* No need to keep our copy of the settings. */
- xVSS_context->pSettings->pTransitionList[i]->
- xVSS.transitionSpecific.pSlideTransitionSettings =
- M4OSA_NULL;
- xVSS_context->pSettings->pTransitionList[i]->
- ExtVideoTransitionFct = &M4xVSS_SlideTransition;
- xVSS_context->pSettings->pTransitionList[i]->
- pExtVideoTransitionFctCtxt = slideSettings;
- }
- break;
-
- case M4xVSS_kVideoTransitionType_FadeBlack:
- {
- xVSS_context->pSettings->pTransitionList[i]->
- ExtVideoTransitionFct = &M4xVSS_FadeBlackTransition;
- }
- break;
-
- case M4xVSS_kVideoTransitionType_External:
- {
- xVSS_context->pSettings->pTransitionList[i]->
- ExtVideoTransitionFct =
- pSettings->pTransitionList[i]->ExtVideoTransitionFct;
- xVSS_context->pSettings->pTransitionList[i]->
- pExtVideoTransitionFctCtxt =
- pSettings->pTransitionList[i]->
- pExtVideoTransitionFctCtxt;
- xVSS_context->pSettings->pTransitionList[i]->
- VideoTransitionType =
- M4VSS3GPP_kVideoTransitionType_External;
- }
- break;
-
- default:
- break;
- } // switch
-
- /* Update total_duration with transition duration */
- totalDuration -= xVSS_context->pSettings->
- pTransitionList[i]->uiTransitionDuration;
- }
-
-
- if( xVSS_context->pSettings->pClipList[i]->FileType
- == M4VIDEOEDITING_kFileType_ARGB8888 )
- {
- if(M4OSA_TRUE ==
- xVSS_context->pSettings->pClipList[i]->xVSS.isPanZoom) {
- M4OSA_Char out_img[M4XVSS_MAX_PATH_LEN];
- M4OSA_Char out_img_tmp[M4XVSS_MAX_PATH_LEN];
- M4xVSS_Pto3GPP_params *pParams = M4OSA_NULL;
- M4OSA_Context pARGBFileIn;
- /*UTF conversion support*/
- M4OSA_Void *pDecodedPath = pSettings->pClipList[i]->pFile;
-
- /* Parse Pto3GPP params chained list to know if input file has already been
- converted */
- if( xVSS_context->pPTo3GPPparamsList != M4OSA_NULL )
- {
- M4OSA_UInt32 pCmpResult = 0;
-
- pParams = xVSS_context->pPTo3GPPparamsList;
- /* We parse all Pto3gpp Param chained list */
- while( pParams != M4OSA_NULL )
- {
- pCmpResult = strcmp((const char *)pSettings->pClipList[i]->pFile,
- (const char *)pParams->pFileIn);
-
- if( pCmpResult == 0
- && (pSettings->pClipList[i]->uiEndCutTime
- == pParams->duration
- || pSettings->pClipList[i]->xVSS.uiDuration
- == pParams->duration)
- && pSettings->pClipList[i]->xVSS.MediaRendering
- == pParams->MediaRendering )
-
-
-
- {
- /* Replace JPG filename with existing 3GP filename */
- goto replaceARGB_3GP;
- }
- /* We need to update this variable, in case some pictures have been
- added between two */
- /* calls to M4xVSS_sendCommand */
- pPto3GPP_last = pParams;
- pParams = pParams->pNext;
- }
- }
-
- /* Construct output temporary 3GP filename */
- err = M4OSA_chrSPrintf(out_img, M4XVSS_MAX_PATH_LEN - 1, (M4OSA_Char *)"%simg%d.3gp",
- xVSS_context->pTempPath, xVSS_context->tempFileIndex);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1("Error in M4OSA_chrSPrintf: 0x%x", err);
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return err;
- }
-
- #ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE
-
- err = M4OSA_chrSPrintf(out_img_tmp, M4XVSS_MAX_PATH_LEN - 1, "%simg%d.tmp",
- xVSS_context->pTempPath, xVSS_context->tempFileIndex);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1("Error in M4OSA_chrSPrintf: 0x%x", err);
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return err;
- }
-
- #endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/
-
- xVSS_context->tempFileIndex++;
-
- /* Allocate last element Pto3GPP params structure */
- pParams = (M4xVSS_Pto3GPP_params
- *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_Pto3GPP_params),
- M4VS, (M4OSA_Char *)"Element of Pto3GPP Params");
-
- if( pParams == M4OSA_NULL )
- {
- M4OSA_TRACE1_0(
- "M4xVSS_sendCommand: Problem when allocating one element Pto3GPP Params");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
-
- /* Initializes pfilexxx members of pParams to be able to free them correctly */
- pParams->pFileIn = M4OSA_NULL;
- pParams->pFileOut = M4OSA_NULL;
- pParams->pFileTemp = M4OSA_NULL;
- pParams->pNext = M4OSA_NULL;
- pParams->MediaRendering = M4xVSS_kResizing;
-
- /*To support ARGB8888 :get the width and height */
- pParams->height = pSettings->pClipList[
- i]->ClipProperties.uiStillPicHeight; //ARGB_Height;
- pParams->width = pSettings->pClipList[
- i]->ClipProperties.uiStillPicWidth; //ARGB_Width;
- M4OSA_TRACE3_1("CLIP M4xVSS_SendCommand ARGB8888 H = %d", pParams->height);
- M4OSA_TRACE3_1("CLIP M4xVSS_SendCommand ARGB8888 W = %d", pParams->width);
-
- if( xVSS_context->pPTo3GPPparamsList
- == M4OSA_NULL ) /* Means it is the first element of the list */
- {
- /* Initialize the xVSS context with the first element of the list */
- xVSS_context->pPTo3GPPparamsList = pParams;
-
- /* Save this element in case of other file to convert */
- pPto3GPP_last = pParams;
- }
- else
- {
- /* Update next pointer of the previous last element of the chain */
- pPto3GPP_last->pNext = pParams;
-
- /* Update save of last element of the chain */
- pPto3GPP_last = pParams;
- }
-
- /* Fill the last M4xVSS_Pto3GPP_params element */
- pParams->duration =
- xVSS_context->pSettings->pClipList[i]->uiEndCutTime;
- /* If duration is filled, let's use it instead of EndCutTime */
- if( xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration != 0 )
- {
- pParams->duration =
- xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration;
- }
-
- pParams->InputFileType = M4VIDEOEDITING_kFileType_ARGB8888;
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath = xVSS_context->pSettings->pClipList[i]->pFile;
- length = strlen(pDecodedPath);
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void
- *)xVSS_context->pSettings->pClipList[i]->pFile,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer,
- &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: pConvFromUTF8Fct returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- pParams->pFileIn = (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS,
- (M4OSA_Char *)"Pto3GPP Params: file in");
-
- if( pParams->pFileIn == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- memcpy((void *)pParams->pFileIn, (void *)pDecodedPath,
- (length + 1)); /* Copy input file path */
-
- /* Check that JPG file is present on the FS (P4ME00002974) by just opening
- and closing it */
- err =
- xVSS_context->pFileReadPtr->openRead(&pARGBFileIn, pDecodedPath,
- M4OSA_kFileRead);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_2("Can't open input jpg file %s, error: 0x%x\n",
- pDecodedPath, err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- err = xVSS_context->pFileReadPtr->closeRead(pARGBFileIn);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_2("Can't close input jpg file %s, error: 0x%x\n",
- pDecodedPath, err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath = out_img;
- length = strlen(pDecodedPath);
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)out_img, (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer, &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: pConvFromUTF8Fct returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- pParams->pFileOut = (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS,
- (M4OSA_Char *)"Pto3GPP Params: file out");
-
- if( pParams->pFileOut == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- memcpy((void *)pParams->pFileOut, (void *)pDecodedPath,
- (length + 1)); /* Copy output file path */
-
- #ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE
- /**
- * UTF conversion: convert into the customer format, before being used*/
-
- pDecodedPath = out_img_tmp;
- length = strlen(pDecodedPath);
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)out_img_tmp, (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer, &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1("M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8\
- returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- pParams->pFileTemp = (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS,
- (M4OSA_Char *)"Pto3GPP Params: file temp");
-
- if( pParams->pFileTemp == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- memcpy((void *)pParams->pFileTemp, (void *)pDecodedPath,
- (length + 1)); /* Copy temporary file path */
-
- #endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/
-
- /* Fill PanAndZoom settings if needed */
-
- if( M4OSA_TRUE
- == xVSS_context->pSettings->pClipList[i]->xVSS.isPanZoom )
- {
- pParams->isPanZoom =
- xVSS_context->pSettings->pClipList[i]->xVSS.isPanZoom;
- /* Check that Pan & Zoom parameters are corrects */
- if( xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXa > 1000
- || xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXa
- <= 0 || xVSS_context->pSettings->pClipList[i]->xVSS.
- PanZoomTopleftXa > 1000
- || xVSS_context->pSettings->pClipList[i]->xVSS.
- PanZoomTopleftYa > 1000
- || xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXb
- > 1000
- || xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXb
- <= 0 || xVSS_context->pSettings->pClipList[i]->xVSS.
- PanZoomTopleftXb > 1000
- || xVSS_context->pSettings->pClipList[i]->xVSS.
- PanZoomTopleftYb > 1000)
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_PARAMETER;
- }
-
- pParams->PanZoomXa =
- xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXa;
- pParams->PanZoomTopleftXa =
- xVSS_context->pSettings->
- pClipList[i]->xVSS.PanZoomTopleftXa;
- pParams->PanZoomTopleftYa =
- xVSS_context->pSettings->
- pClipList[i]->xVSS.PanZoomTopleftYa;
- pParams->PanZoomXb =
- xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXb;
- pParams->PanZoomTopleftXb =
- xVSS_context->pSettings->
- pClipList[i]->xVSS.PanZoomTopleftXb;
- pParams->PanZoomTopleftYb =
- xVSS_context->pSettings->
- pClipList[i]->xVSS.PanZoomTopleftYb;
- }
- else
- {
- pParams->isPanZoom = M4OSA_FALSE;
- }
- /*+ PR No: blrnxpsw#223*/
- /*Intializing the Video Frame Rate as it may not be intialized*/
- /*Other changes made is @ M4xVSS_Internal.c @ line 1518 in
- M4xVSS_internalStartConvertPictureTo3gp*/
- switch( xVSS_context->pSettings->videoFrameRate )
- {
- case M4VIDEOEDITING_k30_FPS:
- pParams->framerate = 33;
- break;
-
- case M4VIDEOEDITING_k25_FPS:
- pParams->framerate = 40;
- break;
-
- case M4VIDEOEDITING_k20_FPS:
- pParams->framerate = 50;
- break;
-
- case M4VIDEOEDITING_k15_FPS:
- pParams->framerate = 66;
- break;
-
- case M4VIDEOEDITING_k12_5_FPS:
- pParams->framerate = 80;
- break;
-
- case M4VIDEOEDITING_k10_FPS:
- pParams->framerate = 100;
- break;
-
- case M4VIDEOEDITING_k7_5_FPS:
- pParams->framerate = 133;
- break;
-
- case M4VIDEOEDITING_k5_FPS:
- pParams->framerate = 200;
- break;
-
- default:
- /*Making Default Frame Rate @ 15 FPS*/
- pParams->framerate = 66;
- break;
- }
- /*-PR No: blrnxpsw#223*/
- if( xVSS_context->pSettings->pClipList[i]->xVSS.MediaRendering
- == M4xVSS_kCropping
- || xVSS_context->pSettings->pClipList[i]->xVSS.
- MediaRendering == M4xVSS_kBlackBorders
- || xVSS_context->pSettings->pClipList[i]->xVSS.
- MediaRendering == M4xVSS_kResizing )
- {
- pParams->MediaRendering =
- xVSS_context->pSettings->pClipList[i]->xVSS.MediaRendering;
- }
-
- pParams->pNext = M4OSA_NULL;
- pParams->isCreated = M4OSA_FALSE;
- xVSS_context->nbStepTotal++;
- /* Set bTranscodingRequired to TRUE to indicate the kenburn video has
- * been generated in analysis phase, and does not need to be tanscoded again
- * in saving phase */
- xVSS_context->pSettings->pClipList[i]->bTranscodingRequired =
- M4OSA_TRUE;
-
- replaceARGB_3GP:
- /* Update total duration */
- totalDuration += pParams->duration;
-
- /* Replacing in VSS structure the JPG file by the 3gp file */
- xVSS_context->pSettings->pClipList[i]->FileType =
- M4VIDEOEDITING_kFileType_3GPP;
-
- if( xVSS_context->pSettings->pClipList[i]->pFile != M4OSA_NULL )
- {
- free(xVSS_context->pSettings->pClipList[i]->pFile);
- xVSS_context->pSettings->pClipList[i]->pFile = M4OSA_NULL;
- }
-
- /**
- * UTF conversion: convert into UTF8, before being used*/
- pDecodedPath = pParams->pFileOut;
-
- if( xVSS_context->UTFConversionContext.pConvToUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertToUTF8(xVSS_context,
- (M4OSA_Void *)pParams->pFileOut,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer,
- &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_internalConvertToUTF8 returns err: \
- 0x%x",err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
- else
- {
- length = strlen(pDecodedPath);
- }
- /**
- * End of the UTF conversion, use the converted file path*/
- xVSS_context->pSettings->pClipList[i]->pFile = M4OSA_32bitAlignedMalloc((length
- + 1), M4VS, (M4OSA_Char *)"xVSS file path of ARGB to 3gp");
-
- if( xVSS_context->pSettings->pClipList[i]->pFile == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- memcpy((void *)xVSS_context->pSettings->pClipList[i]->pFile,
- (void *)pDecodedPath, (length + 1));
- /*FB: add file path size because of UTF16 conversion*/
- xVSS_context->pSettings->pClipList[i]->filePathSize = length+1;
- }
- }
- /************************
- 3GP input file type case
- *************************/
- else if( xVSS_context->pSettings->pClipList[i]->FileType
- == M4VIDEOEDITING_kFileType_3GPP
- || xVSS_context->pSettings->pClipList[i]->FileType
- == M4VIDEOEDITING_kFileType_MP4
- || xVSS_context->pSettings->pClipList[i]->FileType
- == M4VIDEOEDITING_kFileType_M4V )
- {
- /*UTF conversion support*/
- M4OSA_Void *pDecodedPath = M4OSA_NULL;
-
- /* Need to call MCS in case 3GP video/audio types are not compatible
- (H263/MPEG4 or AMRNB/AAC) */
- /* => Need to fill MCS_Params structure with the right parameters ! */
- /* Need also to parse MCS params struct to check if file has already been transcoded */
-
- M4VIDEOEDITING_ClipProperties fileProperties;
- M4xVSS_MCS_params *pParams;
- M4OSA_Bool audioIsDifferent = M4OSA_FALSE;
- M4OSA_Bool videoIsDifferent = M4OSA_FALSE;
- M4OSA_Bool bAudioMono;
- /* Initialize file properties structure */
-
- memset((void *) &fileProperties,0,
- sizeof(M4VIDEOEDITING_ClipProperties));
-
- //fileProperties.AudioStreamType = M4VIDEOEDITING_kNoneAudio;
-
- /* Prevent from bad initializing of percentage cut time */
- if( xVSS_context->pSettings->pClipList[i]->xVSS.uiEndCutPercent
- > 100 || xVSS_context->pSettings->pClipList[i]->xVSS.
- uiBeginCutPercent > 100 )
- {
- /* These percentage cut time have probably not been initialized */
- /* Let's not use them by setting them to 0 */
- xVSS_context->pSettings->pClipList[i]->xVSS.uiEndCutPercent = 0;
- xVSS_context->pSettings->pClipList[i]->xVSS.uiBeginCutPercent =
- 0;
- }
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath = xVSS_context->pSettings->pClipList[i]->pFile;
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void
- *)xVSS_context->pSettings->pClipList[i]->pFile,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer,
- &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
- /**
- * End of the UTF conversion, use the converted file path*/
- err = M4xVSS_internalGetProperties(xVSS_context, pDecodedPath,
- &fileProperties);
-
- if( err != M4NO_ERROR )
- {
- M4xVSS_freeCommand(xVSS_context);
- M4OSA_TRACE1_1(
- "M4xVSS_sendCommand: M4xVSS_internalGetProperties returned 0x%x",
- err);
- /* TODO: Translate error code of MCS to an xVSS error code */
- return err;
- }
-
- /* Parse MCS params chained list to know if input file has already been converted */
- if( xVSS_context->pMCSparamsList != M4OSA_NULL )
- {
- M4OSA_UInt32 pCmpResult = 0;
-
- pParams = xVSS_context->pMCSparamsList;
- /* We parse all MCS Param chained list */
- while( pParams != M4OSA_NULL )
- {
-
- /**
- * UTF conversion: convert into UTF8, before being used*/
- pDecodedPath = pParams->pFileIn;
-
- if( xVSS_context->UTFConversionContext.pConvToUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertToUTF8(xVSS_context,
- (M4OSA_Void *)pParams->pFileIn,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.
- pTempOutConversionBuffer, &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_internalConvertToUTF8 returns err:\
- 0x%x", err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath = xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- pCmpResult = strcmp((const char *)pSettings->pClipList[i]->pFile,
- (const char *)pDecodedPath);
-
- /* If input filenames are the same, and if this is not a BGM, we can reuse
- the transcoded file */
- if( pCmpResult == 0 && pParams->isBGM == M4OSA_FALSE
- && pParams->BeginCutTime
- == pSettings->pClipList[i]->uiBeginCutTime
- && (pParams->EndCutTime
- == pSettings->pClipList[i]->uiEndCutTime
- || pParams->EndCutTime
- == pSettings->pClipList[i]->uiBeginCutTime
- + pSettings->pClipList[i]->xVSS.uiDuration)
- && pSettings->pClipList[i]->xVSS.MediaRendering
- == pParams->MediaRendering )
- {
- if( pSettings->xVSS.pBGMtrack != M4OSA_NULL )
- {
- if( pSettings->xVSS.pBGMtrack->uiAddVolume == 100
- || (pParams->OutputAudioFormat
- == M4VIDEOEDITING_kNullAudio
- && fileProperties.AudioStreamType
- == pSettings->xVSS.outputAudioFormat)
- || pParams->OutputAudioFormat
- == pSettings->xVSS.outputAudioFormat
- || fileProperties.AudioStreamType
- == M4VIDEOEDITING_kNoneAudio )
- {
- /* Replace 3GP filename with transcoded 3GP filename */
- goto replace3GP_3GP;
- }
- }
- else if( ( pParams->OutputAudioFormat
- == M4VIDEOEDITING_kNullAudio
- && fileProperties.AudioStreamType
- == pSettings->xVSS.outputAudioFormat)
- || pParams->OutputAudioFormat
- == pSettings->xVSS.outputAudioFormat
- || fileProperties.AudioStreamType
- == M4VIDEOEDITING_kNoneAudio )
- {
- /* Replace 3GP filename with transcoded 3GP filename */
- goto replace3GP_3GP;
- }
- }
-
- /* We need to update this variable, in case some 3GP files have been added
- between two */
- /* calls to M4xVSS_sendCommand */
- pMCS_last = pParams;
- pParams = pParams->pNext;
- }
- }
-
- /* If we have percentage information let's use it... */
- if( xVSS_context->pSettings->pClipList[i]->xVSS.uiEndCutPercent != 0
- || xVSS_context->pSettings->pClipList[i]->xVSS.uiBeginCutPercent
- != 0 )
- {
- /* If percentage information are not correct and if duration field is not filled */
- if( ( xVSS_context->pSettings->pClipList[i]->xVSS.
- uiEndCutPercent
- <= xVSS_context->pSettings->pClipList[i]->xVSS.
- uiBeginCutPercent)
- && xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration
- == 0 )
- {
- M4OSA_TRACE1_0(
- "M4xVSS_sendCommand: Bad percentage for begin and end cut time !");
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_PARAMETER;
- }
-
- /* We transform the percentage into absolute time */
- xVSS_context->pSettings->pClipList[i]->uiBeginCutTime
- = (M4OSA_UInt32)(
- xVSS_context->pSettings->pClipList[i]->xVSS.
- uiBeginCutPercent
- * fileProperties.uiClipDuration / 100);
- xVSS_context->pSettings->pClipList[i]->uiEndCutTime
- = (M4OSA_UInt32)(
- xVSS_context->pSettings->pClipList[i]->xVSS.
- uiEndCutPercent
- * fileProperties.uiClipDuration / 100);
- }
- /* ...Otherwise, we use absolute time. */
- else
- {
- /* If endCutTime == 0, it means all the file is taken. Let's change to the file
- duration, to accurate preview. */
- if( xVSS_context->pSettings->pClipList[i]->uiEndCutTime == 0
- || xVSS_context->pSettings->pClipList[i]->uiEndCutTime
- > fileProperties.uiClipDuration )
- {
- xVSS_context->pSettings->pClipList[i]->uiEndCutTime =
- fileProperties.uiClipDuration;
- }
- }
-
- /* If duration field is filled, it has priority on other fields on EndCutTime,
- so let's use it */
- if( xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration != 0 )
- {
- xVSS_context->pSettings->pClipList[i]->uiEndCutTime =
- xVSS_context->pSettings->pClipList[i]->uiBeginCutTime
- +xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration;
-
- if( xVSS_context->pSettings->pClipList[i]->uiEndCutTime
- > fileProperties.uiClipDuration )
- {
- xVSS_context->pSettings->pClipList[i]->uiEndCutTime =
- fileProperties.uiClipDuration;
- }
- }
-
- /* If output video format is not set, we take video format of the first 3GP video */
- if( xVSS_context->pSettings->xVSS.outputVideoFormat
- == M4VIDEOEDITING_kNoneVideo )
- {
- //xVSS_context->pSettings->xVSS.outputVideoFormat = fileProperties.VideoStreamType;
- //M4OSA_TRACE2_1("Output video format is not set, set it to current clip: %d",
- // xVSS_context->pSettings->xVSS.outputVideoFormat);
- M4OSA_TRACE1_0(
- "Output video format is not set, an error parameter is returned.");
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_PARAMETER;
- }
-
- if( xVSS_context->pSettings->xVSS.outputAudioFormat
- == M4VIDEOEDITING_kNoneAudio )
- {
- //xVSS_context->pSettings->xVSS.outputAudioFormat = fileProperties.AudioStreamType;
- M4OSA_TRACE2_1(
- "Output audio format is not set -> remove audio track of clip: %d",
- i);
- }
-
- if( fileProperties.uiNbChannels == 1 )
- {
- bAudioMono = M4OSA_TRUE;
- }
- else
- {
- bAudioMono = M4OSA_FALSE;
- }
-
- if( fileProperties.AudioStreamType
- != xVSS_context->pSettings->xVSS.outputAudioFormat
- || (fileProperties.AudioStreamType == M4VIDEOEDITING_kAAC
- && (fileProperties.uiSamplingFrequency != samplingFreq
- || bAudioMono
- != xVSS_context->pSettings->xVSS.bAudioMono)) )
- {
- audioIsDifferent = M4OSA_TRUE;
- /* If we want to replace audio, there is no need to transcode audio */
- if( pSettings->xVSS.pBGMtrack != M4OSA_NULL )
- {
- /* temp fix :PT volume not herad in the second clip */
- if( /*(pSettings->xVSS.pBGMtrack->uiAddVolume == 100
- && xVSS_context->pSettings->xVSS.outputFileSize == 0)
- ||*/
- fileProperties.AudioStreamType
- == M4VIDEOEDITING_kNoneAudio ) /*11/12/2008 CR 3283 VAL for the MMS
- use case, we need to transcode except the media without audio*/
- {
- audioIsDifferent = M4OSA_FALSE;
- }
- }
- else if( fileProperties.AudioStreamType
- == M4VIDEOEDITING_kNoneAudio )
- {
- audioIsDifferent = M4OSA_FALSE;
- }
- }
- /* Here check the clip video profile and level, if it exceeds
- * the profile and level of export file, then the file needs
- * to be transcoded(do not do compress domain trim).
- * Also for MPEG4 fomart, always do transcoding since HW encoder
- * may use different time scale value than the input clip*/
- if ((fileProperties.uiVideoProfile >
- xVSS_context->pSettings->xVSS.outputVideoProfile) ||
- (fileProperties.uiVideoLevel >
- xVSS_context->pSettings->xVSS.outputVideoLevel) ||
- (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)) {
- /* Set bTranscodingRequired to TRUE to indicate the video will be
- * transcoded in MCS. */
- xVSS_context->pSettings->pClipList[i]->bTranscodingRequired =
- M4OSA_TRUE;
- videoIsDifferent = M4OSA_TRUE;
- }
-
- if( videoIsDifferent == M4OSA_TRUE || audioIsDifferent == M4OSA_TRUE)
- {
- M4OSA_Char out_3gp[M4XVSS_MAX_PATH_LEN];
- M4OSA_Char out_3gp_tmp[M4XVSS_MAX_PATH_LEN];
-
- /* Construct output temporary 3GP filename */
- err = M4OSA_chrSPrintf(out_3gp, M4XVSS_MAX_PATH_LEN - 1, (M4OSA_Char *)"%svid%d.3gp",
- xVSS_context->pTempPath, xVSS_context->tempFileIndex);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1("Error in M4OSA_chrSPrintf: 0x%x", err);
- return err;
- }
-
-#ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE
-
- err = M4OSA_chrSPrintf(out_3gp_tmp, M4XVSS_MAX_PATH_LEN - 1, "%svid%d.tmp",
- xVSS_context->pTempPath, xVSS_context->tempFileIndex);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1("Error in M4OSA_chrSPrintf: 0x%x", err);
- return err;
- }
-
-#endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/
-
- xVSS_context->tempFileIndex++;
-
- pParams =
- (M4xVSS_MCS_params *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_MCS_params),
- M4VS, (M4OSA_Char *)"Element of MCS Params (for 3GP)");
-
- if( pParams == M4OSA_NULL )
- {
- M4OSA_TRACE1_0(
- "M4xVSS_sendCommand: Problem when allocating one element MCS Params");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- pParams->MediaRendering = M4xVSS_kResizing;
- pParams->videoclipnumber = i; // Indicates video clip index
-
- if( xVSS_context->pMCSparamsList
- == M4OSA_NULL ) /* Means it is the first element of the list */
- {
- /* Initialize the xVSS context with the first element of the list */
- xVSS_context->pMCSparamsList = pParams;
- }
- else
- {
- /* Update next pointer of the previous last element of the chain */
- pMCS_last->pNext = pParams;
- }
-
- /* Save this element in case of other file to convert */
- pMCS_last = pParams;
-
- /* Fill the last M4xVSS_MCS_params element */
- pParams->InputFileType = M4VIDEOEDITING_kFileType_3GPP;
- pParams->OutputFileType = M4VIDEOEDITING_kFileType_3GPP;
-
- pParams->OutputVideoTimescale = xVSS_context->targetedTimescale;
-
- /* We do not need to reencode video if its parameters do not differ */
- /* from output settings parameters */
- if( videoIsDifferent == M4OSA_TRUE )
- {
- pParams->OutputVideoFormat =
- xVSS_context->pSettings->xVSS.outputVideoFormat;
- pParams->outputVideoProfile =
- xVSS_context->pSettings->xVSS.outputVideoProfile;
- pParams->outputVideoLevel =
- xVSS_context->pSettings->xVSS.outputVideoLevel;
- pParams->OutputVideoFrameRate =
- xVSS_context->pSettings->videoFrameRate;
- pParams->OutputVideoFrameSize =
- xVSS_context->pSettings->xVSS.outputVideoSize;
-
- /*FB: VAL CR P4ME00003076
- The output video bitrate is now directly given by the user in the edition
- settings structure If the bitrate given by the user is irrelevant
- (the MCS minimum and maximum video bitrate are used),
- the output video bitrate is hardcoded according to the output video size*/
- if( xVSS_context->pSettings->xVSS.outputVideoBitrate
- >= M4VIDEOEDITING_k16_KBPS
- && xVSS_context->pSettings->xVSS.outputVideoBitrate
- <= M4VIDEOEDITING_k8_MBPS ) /*+ New Encoder bitrates */
- {
- pParams->OutputVideoBitrate =
- xVSS_context->pSettings->xVSS.outputVideoBitrate;
- }
- else
- {
- switch( xVSS_context->pSettings->xVSS.outputVideoSize )
- {
- case M4VIDEOEDITING_kSQCIF:
- pParams->OutputVideoBitrate =
- M4VIDEOEDITING_k48_KBPS;
- break;
-
- case M4VIDEOEDITING_kQQVGA:
- pParams->OutputVideoBitrate =
- M4VIDEOEDITING_k64_KBPS;
- break;
-
- case M4VIDEOEDITING_kQCIF:
- pParams->OutputVideoBitrate =
- M4VIDEOEDITING_k128_KBPS;
- break;
-
- case M4VIDEOEDITING_kQVGA:
- pParams->OutputVideoBitrate =
- M4VIDEOEDITING_k384_KBPS;
- break;
-
- case M4VIDEOEDITING_kCIF:
- pParams->OutputVideoBitrate =
- M4VIDEOEDITING_k384_KBPS;
- break;
-
- case M4VIDEOEDITING_kVGA:
- pParams->OutputVideoBitrate =
- M4VIDEOEDITING_k512_KBPS;
- break;
-
- default: /* Should not happen !! */
- pParams->OutputVideoBitrate =
- M4VIDEOEDITING_k64_KBPS;
- break;
- }
- }
- }
- else
- {
- pParams->outputVideoProfile =
- xVSS_context->pSettings->xVSS.outputVideoProfile;
- pParams->outputVideoLevel =
- xVSS_context->pSettings->xVSS.outputVideoLevel;
- pParams->OutputVideoFormat = M4VIDEOEDITING_kNullVideo;
- pParams->OutputVideoFrameRate =
- M4VIDEOEDITING_k15_FPS; /* Must be set, otherwise, MCS returns an error */
- }
-
- if( audioIsDifferent == M4OSA_TRUE )
- {
- pParams->OutputAudioFormat =
- xVSS_context->pSettings->xVSS.outputAudioFormat;
-
- switch( xVSS_context->pSettings->xVSS.outputAudioFormat )
- {
- case M4VIDEOEDITING_kNoneAudio:
- break;
-
- case M4VIDEOEDITING_kAMR_NB:
- pParams->OutputAudioBitrate =
- M4VIDEOEDITING_k12_2_KBPS;
- pParams->bAudioMono = M4OSA_TRUE;
- pParams->OutputAudioSamplingFrequency =
- M4VIDEOEDITING_kDefault_ASF;
- break;
-
- case M4VIDEOEDITING_kAAC:
- {
- /*FB: VAL CR P4ME00003076
- The output audio bitrate in the AAC case is now directly given by
- the user in the edition settings structure
- If the bitrate given by the user is irrelevant or undefined
- (the MCS minimum and maximum audio bitrate are used),
- the output audio bitrate is hard coded according to the output
- audio sampling frequency*/
-
- /*Check if the audio bitrate is correctly defined*/
-
- /*Mono
- MCS values for AAC Mono are min: 16kbps and max: 192 kbps*/
- if( xVSS_context->pSettings->xVSS.outputAudioBitrate
- >= M4VIDEOEDITING_k16_KBPS
- && xVSS_context->pSettings->
- xVSS.outputAudioBitrate
- <= M4VIDEOEDITING_k192_KBPS
- && xVSS_context->pSettings->xVSS.bAudioMono
- == M4OSA_TRUE )
- {
- pParams->OutputAudioBitrate =
- xVSS_context->pSettings->
- xVSS.outputAudioBitrate;
- }
- /*Stereo
- MCS values for AAC Mono are min: 32kbps and max: 192 kbps*/
- else if( xVSS_context->pSettings->
- xVSS.outputAudioBitrate
- >= M4VIDEOEDITING_k32_KBPS
- && xVSS_context->pSettings->
- xVSS.outputAudioBitrate
- <= M4VIDEOEDITING_k192_KBPS
- && xVSS_context->pSettings->xVSS.bAudioMono
- == M4OSA_FALSE )
- {
- pParams->OutputAudioBitrate =
- xVSS_context->pSettings->
- xVSS.outputAudioBitrate;
- }
-
- /*The audio bitrate is hard coded according to the output audio
- sampling frequency*/
- else
- {
- switch( xVSS_context->pSettings->
- xVSS.outputAudioSamplFreq )
- {
- case M4VIDEOEDITING_k16000_ASF:
- pParams->OutputAudioBitrate =
- M4VIDEOEDITING_k24_KBPS;
- break;
-
- case M4VIDEOEDITING_k22050_ASF:
- case M4VIDEOEDITING_k24000_ASF:
- pParams->OutputAudioBitrate =
- M4VIDEOEDITING_k32_KBPS;
- break;
-
- case M4VIDEOEDITING_k32000_ASF:
- pParams->OutputAudioBitrate =
- M4VIDEOEDITING_k48_KBPS;
- break;
-
- case M4VIDEOEDITING_k44100_ASF:
- case M4VIDEOEDITING_k48000_ASF:
- pParams->OutputAudioBitrate =
- M4VIDEOEDITING_k64_KBPS;
- break;
-
- default:
- pParams->OutputAudioBitrate =
- M4VIDEOEDITING_k64_KBPS;
- break;
- }
-
- if( xVSS_context->pSettings->xVSS.bAudioMono
- == M4OSA_FALSE )
- {
- /* Output bitrate have to be doubled */
- pParams->OutputAudioBitrate +=
- pParams->OutputAudioBitrate;
- }
- }
-
- pParams->bAudioMono =
- xVSS_context->pSettings->xVSS.bAudioMono;
-
- if( xVSS_context->pSettings->
- xVSS.outputAudioSamplFreq
- == M4VIDEOEDITING_k8000_ASF )
- {
- /* Prevent from unallowed sampling frequencies */
- pParams->OutputAudioSamplingFrequency =
- M4VIDEOEDITING_kDefault_ASF;
- }
- else
- {
- pParams->OutputAudioSamplingFrequency =
- xVSS_context->pSettings->
- xVSS.outputAudioSamplFreq;
- }
- break;
- }
-
- default: /* Should not happen !! */
- pParams->OutputAudioFormat = M4VIDEOEDITING_kAMR_NB;
- pParams->OutputAudioBitrate =
- M4VIDEOEDITING_k12_2_KBPS;
- pParams->bAudioMono = M4OSA_TRUE;
- pParams->OutputAudioSamplingFrequency =
- M4VIDEOEDITING_kDefault_ASF;
- break;
- }
- }
- else
- {
- pParams->OutputAudioFormat = M4VIDEOEDITING_kNullAudio;
- }
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath = xVSS_context->pSettings->pClipList[i]->pFile;
- length = strlen(pDecodedPath);
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)xVSS_context->pSettings->
- pClipList[i]->pFile,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer,
- &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath = xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- pParams->pFileIn =
- (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS,
- (M4OSA_Char *)"MCS 3GP Params: file in");
-
- if( pParams->pFileIn == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- memcpy((void *)pParams->pFileIn, (void *)pDecodedPath,
- (length + 1)); /* Copy input file path */
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath = out_3gp;
- length = strlen(pDecodedPath);
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)out_3gp, (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer,
- &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath = xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- pParams->pFileOut =
- (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS,
- (M4OSA_Char *)"MCS 3GP Params: file out");
-
- if( pParams->pFileOut == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- memcpy((void *)pParams->pFileOut, (void *)pDecodedPath,
- (length + 1)); /* Copy output file path */
-
-#ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE
- /**
- * UTF conversion: convert into the customer format, before being used*/
-
- pDecodedPath = out_3gp_tmp;
- length = strlen(pDecodedPath);
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)out_3gp_tmp,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer,
- &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath = xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- pParams->pFileTemp =
- (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS,
- (M4OSA_Char *)"MCS 3GP Params: file temp");
-
- if( pParams->pFileTemp == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- memcpy((void *)pParams->pFileTemp, (void *)pDecodedPath,
- (length + 1)); /* Copy temporary file path */
-
-#else
-
- pParams->pFileTemp = M4OSA_NULL;
-
-#endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/
-
- /*FB 2008/10/20 keep media aspect ratio, add media rendering parameter*/
-
- if( xVSS_context->pSettings->pClipList[i]->xVSS.MediaRendering
- == M4xVSS_kCropping
- || xVSS_context->pSettings->pClipList[i]->xVSS.
- MediaRendering == M4xVSS_kBlackBorders
- || xVSS_context->pSettings->pClipList[i]->xVSS.
- MediaRendering == M4xVSS_kResizing )
- {
- pParams->MediaRendering =
- xVSS_context->pSettings->pClipList[i]->xVSS.
- MediaRendering;
- }
-
- /*FB: transcoding per parts*/
- pParams->BeginCutTime =
- xVSS_context->pSettings->pClipList[i]->uiBeginCutTime;
- pParams->EndCutTime =
- xVSS_context->pSettings->pClipList[i]->uiEndCutTime;
-
- pParams->pNext = M4OSA_NULL;
- pParams->isBGM = M4OSA_FALSE;
- pParams->isCreated = M4OSA_FALSE;
- xVSS_context->nbStepTotal++;
- bIsTranscoding = M4OSA_TRUE;
-
-replace3GP_3GP:
- /* Update total duration */
- totalDuration +=
- xVSS_context->pSettings->pClipList[i]->uiEndCutTime
- - xVSS_context->pSettings->pClipList[i]->uiBeginCutTime;
-
- /* Replacing in VSS structure the original 3GP file by the transcoded 3GP file */
- xVSS_context->pSettings->pClipList[i]->FileType =
- M4VIDEOEDITING_kFileType_3GPP;
-
- if( xVSS_context->pSettings->pClipList[i]->pFile != M4OSA_NULL )
- {
- free(xVSS_context->pSettings->pClipList[i]->pFile);
- xVSS_context->pSettings->pClipList[i]->pFile = M4OSA_NULL;
- }
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath = pParams->pFileOut;
-
- if( xVSS_context->UTFConversionContext.pConvToUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertToUTF8(xVSS_context,
- (M4OSA_Void *)pParams->pFileOut,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer,
- &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_internalConvertToUTF8 returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath = xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer;
- }
- else
- {
- length = strlen(pDecodedPath);
- }
- /**
- * End of the UTF conversion, use the converted file path*/
- xVSS_context->pSettings->pClipList[i]->pFile = M4OSA_32bitAlignedMalloc(
- (length + 1),
- M4VS, (M4OSA_Char *)"xVSS file path of 3gp to 3gp");
-
- if( xVSS_context->pSettings->pClipList[i]->pFile == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- memcpy((void *)xVSS_context->pSettings->pClipList[i]->pFile,
- (void *)pDecodedPath, (length + 1));
- /*FB: add file path size because of UTF 16 conversion*/
- xVSS_context->pSettings->pClipList[i]->filePathSize = length+1;
-
- /* We define master clip as first 3GP input clip */
- /*if(xVSS_context->pSettings->uiMasterClip == 0 && fileProperties.
- AudioStreamType != M4VIDEOEDITING_kNoneAudio)
- {
- xVSS_context->pSettings->uiMasterClip = i;
- }*/
- }
- else
- {
- /* Update total duration */
- totalDuration +=
- xVSS_context->pSettings->pClipList[i]->uiEndCutTime
- - xVSS_context->pSettings->pClipList[i]->uiBeginCutTime;
- }
- /* We define master clip as first 3GP input clip */
- if( masterClip == -1
- && fileProperties.AudioStreamType != M4VIDEOEDITING_kNoneAudio )
- {
- masterClip = i;
- xVSS_context->pSettings->uiMasterClip = i;
- }
-
- }
- /**************************
- Other input file type case
- ***************************/
- else
- {
- M4OSA_TRACE1_0("Bad file type as input clip");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_PARAMETER;
- }
- }
-
- /*********************************************************
- * Parse all effects to make some adjustment for framing, *
- * text and to transform relative time into absolute time *
- **********************************************************/
- for ( j = 0; j < xVSS_context->pSettings->nbEffects; j++ )
- {
- /* Copy effect to "local" structure */
- memcpy((void *) &(xVSS_context->pSettings->Effects[j]),
- (void *) &(pSettings->Effects[j]),
- sizeof(M4VSS3GPP_EffectSettings));
-
- /* Prevent from bad initializing of effect percentage time */
- if( xVSS_context->pSettings->Effects[j].xVSS.uiDurationPercent > 100
- || xVSS_context->pSettings->Effects[j].xVSS.uiStartPercent > 100 )
- {
- /* These percentage time have probably not been initialized */
- /* Let's not use them by setting them to 0 */
- xVSS_context->pSettings->Effects[j].xVSS.uiDurationPercent = 0;
- xVSS_context->pSettings->Effects[j].xVSS.uiStartPercent = 0;
- }
-
- /* If we have percentage information let's use it... Otherwise, we use absolute time. */
- if( xVSS_context->pSettings->Effects[j].xVSS.uiDurationPercent != 0 )
- {
- xVSS_context->pSettings->
- Effects[j].uiStartTime = (M4OSA_UInt32)(totalDuration
- * xVSS_context->pSettings->Effects[j].xVSS.uiStartPercent
- / 100);
- /* The percentage of effect duration is based on the duration of the clip -
- start time */
- xVSS_context->pSettings->
- Effects[j].uiDuration = (M4OSA_UInt32)(totalDuration
- * xVSS_context->pSettings->Effects[j].xVSS.uiDurationPercent
- / 100);
- }
-
- /* If there is a framing effect, we need to allocate framing effect structure */
- if( xVSS_context->pSettings->Effects[j].VideoEffectType
- == M4xVSS_kVideoEffectType_Framing )
- {
-#ifdef DECODE_GIF_ON_SAVING
-
- M4xVSS_FramingContext *framingCtx;
- /*UTF conversion support*/
- M4OSA_Void *pDecodedPath = M4OSA_NULL;
-
-#else
-
- M4xVSS_FramingStruct *framingCtx;
-
-#endif /*DECODE_GIF_ON_SAVING*/
-
- M4OSA_Char *pExt2 = M4OSA_NULL;
- M4VIFI_ImagePlane *pPlane =
- xVSS_context->pSettings->Effects[j].xVSS.pFramingBuffer;
- M4OSA_Int32 result1, result2;
-
- /* Copy framing file path */
- if( pSettings->Effects[j].xVSS.pFramingFilePath != M4OSA_NULL )
- {
- xVSS_context->pSettings->
- Effects[j].xVSS.pFramingFilePath = M4OSA_32bitAlignedMalloc(
- strlen(pSettings->Effects[j].xVSS.pFramingFilePath)
- + 1, M4VS, (M4OSA_Char *)"Local Framing file path");
-
- if( xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath
- == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- memcpy((void *)xVSS_context->pSettings->
- Effects[j].xVSS.pFramingFilePath,
- (void *)pSettings->
- Effects[j].xVSS.pFramingFilePath, strlen(
- pSettings->Effects[j].xVSS.pFramingFilePath) + 1);
-
- pExt2 =
- xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath;
- }
-
-#ifdef DECODE_GIF_ON_SAVING
-
- framingCtx = (M4xVSS_FramingContext
- *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingContext),
- M4VS, (M4OSA_Char *)"Context of the framing effect");
-
- if( framingCtx == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- framingCtx->aFramingCtx = M4OSA_NULL;
- framingCtx->aFramingCtx_last = M4OSA_NULL;
- framingCtx->pSPSContext = M4OSA_NULL;
- framingCtx->outputVideoSize =
- xVSS_context->pSettings->xVSS.outputVideoSize;
- framingCtx->topleft_x =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
- framingCtx->topleft_y =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
- framingCtx->bEffectResize =
- xVSS_context->pSettings->Effects[j].xVSS.bResize;
- framingCtx->pEffectFilePath =
- xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath;
- framingCtx->pFileReadPtr = xVSS_context->pFileReadPtr;
- framingCtx->pFileWritePtr = xVSS_context->pFileWritePtr;
- framingCtx->effectDuration =
- xVSS_context->pSettings->Effects[j].uiDuration;
- framingCtx->b_IsFileGif = M4OSA_FALSE;
- framingCtx->alphaBlendingStruct = M4OSA_NULL;
- framingCtx->b_animated = M4OSA_FALSE;
-
- /* Output ratio for the effect is stored in uiFiftiesOutFrameRate parameters of the
- extended xVSS effects structure */
- if( xVSS_context->pSettings->Effects[j].xVSS.uiFiftiesOutFrameRate
- != 0 )
- {
- framingCtx->frameDurationRatio =
- (M4OSA_Float)(( xVSS_context->pSettings->
- Effects[j].xVSS.uiFiftiesOutFrameRate) / 1000.0);
- }
- else
- {
- framingCtx->frameDurationRatio = 1.0;
- }
-
- /*Alpha blending*/
- /*Check if the alpha blending parameters are corrects*/
- if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime > 100 )
- {
- pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime = 0;
- }
-
- if( pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime > 100 )
- {
- pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime = 0;
- }
-
- if( pSettings->Effects[j].xVSS.uialphaBlendingEnd > 100 )
- {
- pSettings->Effects[j].xVSS.uialphaBlendingEnd = 100;
- }
-
- if( pSettings->Effects[j].xVSS.uialphaBlendingMiddle > 100 )
- {
- pSettings->Effects[j].xVSS.uialphaBlendingMiddle = 100;
- }
-
- if( pSettings->Effects[j].xVSS.uialphaBlendingStart > 100 )
- {
- pSettings->Effects[j].xVSS.uialphaBlendingStart = 100;
- }
-
- if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime > 0
- || pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime > 0 )
- {
- /*Allocate the alpha blending structure*/
- framingCtx->alphaBlendingStruct =
- (M4xVSS_internalEffectsAlphaBlending *)M4OSA_32bitAlignedMalloc(
- sizeof(M4xVSS_internalEffectsAlphaBlending),
- M4VS, (M4OSA_Char *)"alpha blending structure");
-
- if( framingCtx->alphaBlendingStruct == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_ALLOC;
- }
- /*Fill the alpha blending structure*/
- framingCtx->alphaBlendingStruct->m_fadeInTime =
- pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime;
- framingCtx->alphaBlendingStruct->m_fadeOutTime =
- pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime;
- framingCtx->alphaBlendingStruct->m_end =
- pSettings->Effects[j].xVSS.uialphaBlendingEnd;
- framingCtx->alphaBlendingStruct->m_middle =
- pSettings->Effects[j].xVSS.uialphaBlendingMiddle;
- framingCtx->alphaBlendingStruct->m_start =
- pSettings->Effects[j].xVSS.uialphaBlendingStart;
-
- if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime
- + pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime
- > 100 )
- {
- framingCtx->alphaBlendingStruct->m_fadeOutTime =
- 100 - framingCtx->alphaBlendingStruct->m_fadeInTime;
- }
- }
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath =
- xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath;
- length = strlen(pDecodedPath);
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)xVSS_context->pSettings->
- Effects[j].xVSS.pFramingFilePath,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer,
- &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- framingCtx->pEffectFilePath = M4OSA_32bitAlignedMalloc(length + 1, M4VS,
- (M4OSA_Char *)"Local Framing file path");
-
- if( framingCtx->pEffectFilePath == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- memcpy((void *)framingCtx->pEffectFilePath,
- (void *)pDecodedPath, length + 1);
-
- /* Save framing structure associated with corresponding effect */
- xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- framingCtx;
-
-#else
-
- framingCtx = (M4xVSS_FramingStruct
- *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct),
- M4VS, (M4OSA_Char *)"Context of the framing effect");
-
- if( framingCtx == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
-
- framingCtx->topleft_x =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
- framingCtx->topleft_y =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
-
- /* BugFix 1.2.0: Leak when decoding error */
- framingCtx->FramingRgb = M4OSA_NULL;
- framingCtx->FramingYuv = M4OSA_NULL;
- framingCtx->pNext = framingCtx;
- /* Save framing structure associated with corresponding effect */
- xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- framingCtx;
-
-#endif /*DECODE_GIF_ON_SAVING*/
-
- if( pExt2 != M4OSA_NULL )
- {
- /* Decode the image associated to the effect, and fill framing structure */
- pExt2 += (strlen((const char *)pExt2) - 4);
-
- result1 = strcmp((const char *)pExt2,(const char *)".rgb");
- result2 = strcmp((const char *)pExt2,(const char *)".RGB");
-
- if( 0 == result1 || 0 == result2 )
- {
-#ifdef DECODE_GIF_ON_SAVING
-
- framingCtx->aFramingCtx =
- (M4xVSS_FramingStruct
- *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct),
- M4VS,
- (M4OSA_Char
- *)
- "M4xVSS_internalDecodeGIF: Context of the framing effect");
-
- if( framingCtx->aFramingCtx == M4OSA_NULL )
- {
- M4OSA_TRACE1_0(
- "Allocation error in M4xVSS_SendCommand");
- /* TODO: Translate error code of SPS to an xVSS error code */
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_ALLOC;
- }
- framingCtx->aFramingCtx->pCurrent =
- M4OSA_NULL; /* Only used by the first element of the chain */
- framingCtx->aFramingCtx->previousClipTime = -1;
- framingCtx->aFramingCtx->FramingYuv = M4OSA_NULL;
- framingCtx->aFramingCtx->FramingRgb = M4OSA_NULL;
- framingCtx->aFramingCtx->topleft_x =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
- framingCtx->aFramingCtx->topleft_y =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
- /*To support ARGB8888 : get the width and height */
-
- framingCtx->aFramingCtx->width =
- xVSS_context->pSettings->Effects[j].xVSS.width;
- framingCtx->aFramingCtx->height =
- xVSS_context->pSettings->Effects[j].xVSS.height;
- M4OSA_TRACE1_1("FRAMMING BEFORE M4xVSS_SendCommand %d",
- framingCtx->aFramingCtx->width);
- M4OSA_TRACE1_1("FRAMMING BEFORE M4xVSS_SendCommand %d",
- framingCtx->aFramingCtx->height);
-
-#endif
-
- err = M4xVSS_internalConvertARGB888toYUV420_FrammingEffect(
- xVSS_context,
- &(xVSS_context->pSettings->Effects[j]),
- framingCtx->aFramingCtx,xVSS_context->pSettings->xVSS.outputVideoSize);
- M4OSA_TRACE3_1("FRAMING WIDTH BEFORE M4xVSS_SendCommand %d",
- framingCtx->aFramingCtx->width);
- M4OSA_TRACE3_1("FRAMING HEIGHT BEFORE M4xVSS_SendCommand %d",
- framingCtx->aFramingCtx->height);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_internalDecodePNG returned 0x%x",
- err);
- /* TODO: Translate error code of SPS to an xVSS error code */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- }
- else
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: Not supported still picture format 0x%x",
- err);
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_PARAMETER;
- }
- }
- else if( pPlane != M4OSA_NULL )
- {
-#ifdef DECODE_GIF_ON_SAVING
-
- framingCtx->aFramingCtx = (M4xVSS_FramingStruct
- *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct),
- M4VS, (M4OSA_Char *)"Context of the framing effect");
-
- if( framingCtx->aFramingCtx == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
-
- framingCtx->aFramingCtx->topleft_x =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
- framingCtx->aFramingCtx->topleft_y =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
-
- /* BugFix 1.2.0: Leak when decoding error */
- framingCtx->aFramingCtx->FramingRgb = M4OSA_NULL;
- framingCtx->aFramingCtx->FramingYuv = M4OSA_NULL;
- framingCtx->aFramingCtx->pNext = framingCtx->aFramingCtx;
- framingCtx->aFramingCtx->pCurrent = framingCtx->aFramingCtx;
- framingCtx->aFramingCtx->duration = 0;
- framingCtx->aFramingCtx->previousClipTime = -1;
- framingCtx->aFramingCtx->FramingRgb =
- xVSS_context->pSettings->Effects[j].xVSS.pFramingBuffer;
- /* Force input RGB buffer to even size to avoid errors in YUV conversion */
- framingCtx->aFramingCtx->FramingRgb->u_width =
- framingCtx->aFramingCtx->FramingRgb->u_width & ~1;
- framingCtx->aFramingCtx->FramingRgb->u_height =
- framingCtx->aFramingCtx->FramingRgb->u_height & ~1;
- /* Input RGB plane is provided, let's convert it to YUV420, and update framing
- structure */
- err = M4xVSS_internalConvertRGBtoYUV(framingCtx->aFramingCtx);
-
-#else
-
- framingCtx->FramingRgb =
- xVSS_context->pSettings->Effects[j].xVSS.pFramingBuffer;
- /* Force input RGB buffer to even size to avoid errors in YUV conversion */
- framingCtx->FramingRgb.u_width =
- framingCtx->FramingRgb.u_width & ~1;
- framingCtx->FramingRgb.u_height =
- framingCtx->FramingRgb.u_height & ~1;
- /* Input RGB plane is provided, let's convert it to YUV420, and update framing
- structure */
- err = M4xVSS_internalConvertRGBtoYUV(framingCtx);
-
-#endif
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_sendCommand: error when converting RGB to YUV: 0w%x",
- err);
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return err;
- }
- }
- else
- {
- M4OSA_TRACE1_0(
- "M4xVSS_sendCommand: No input image/plane provided for framing effect.");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_PARAMETER;
- }
- }
- /* CR: Add text handling with external text interface */
- /* If effect type is text, we call external text function to get RGB 565 buffer */
- if( xVSS_context->pSettings->Effects[j].VideoEffectType
- == M4xVSS_kVideoEffectType_Text )
- {
- /* Call the font engine function pointer to get RGB565 buffer */
- /* We transform text effect into framing effect from buffer */
- if( xVSS_context->pSettings->xVSS.pTextRenderingFct != M4OSA_NULL )
- {
- /*FB: add UTF convertion for text buffer*/
- M4OSA_Void *pDecodedPath = M4OSA_NULL;
-#ifdef DECODE_GIF_ON_SAVING
-
- M4xVSS_FramingContext *framingCtx;
-
-#else
-
- M4xVSS_FramingStruct *framingCtx;
-
-#endif /*DECODE_GIF_ON_SAVING*/
-
-#ifdef DECODE_GIF_ON_SAVING
-
- framingCtx = (M4xVSS_FramingContext
- *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingContext),
- M4VS, (M4OSA_Char *)"Context of the framing effect");
-
- if( framingCtx == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- framingCtx->aFramingCtx = M4OSA_NULL;
- framingCtx->aFramingCtx_last = M4OSA_NULL;
- framingCtx->pSPSContext = M4OSA_NULL;
- framingCtx->outputVideoSize =
- xVSS_context->pSettings->xVSS.outputVideoSize;
- framingCtx->topleft_x =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
- framingCtx->topleft_y =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
- framingCtx->bEffectResize =
- xVSS_context->pSettings->Effects[j].xVSS.bResize;
- framingCtx->pEffectFilePath =
- xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath;
- framingCtx->pFileReadPtr = xVSS_context->pFileReadPtr;
- framingCtx->pFileWritePtr = xVSS_context->pFileWritePtr;
- framingCtx->effectDuration =
- xVSS_context->pSettings->Effects[j].uiDuration;
- framingCtx->b_IsFileGif = M4OSA_FALSE;
- framingCtx->b_animated = M4OSA_FALSE;
- framingCtx->alphaBlendingStruct = M4OSA_NULL;
-
- /* Save framing structure associated with corresponding effect */
- xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- framingCtx;
-
- framingCtx->aFramingCtx = (M4xVSS_FramingStruct
- *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct),
- M4VS, (M4OSA_Char *)"Context of the framing effect");
-
- if( framingCtx->aFramingCtx == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
-
- framingCtx->aFramingCtx->topleft_x =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
- framingCtx->aFramingCtx->topleft_y =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
-
- /* BugFix 1.2.0: Leak when decoding error */
- framingCtx->aFramingCtx->FramingRgb = M4OSA_NULL;
- framingCtx->aFramingCtx->FramingYuv = M4OSA_NULL;
- framingCtx->aFramingCtx->pNext = framingCtx->aFramingCtx;
- framingCtx->aFramingCtx->pCurrent = framingCtx->aFramingCtx;
- framingCtx->aFramingCtx->duration = 0;
- framingCtx->aFramingCtx->previousClipTime = -1;
-
- /*Alpha blending*/
- /*Check if the alpha blending parameters are corrects*/
- if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime > 100 )
- {
- pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime = 0;
- }
-
- if( pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime > 100 )
- {
- pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime = 0;
- }
-
- if( pSettings->Effects[j].xVSS.uialphaBlendingEnd > 100 )
- {
- pSettings->Effects[j].xVSS.uialphaBlendingEnd = 100;
- }
-
- if( pSettings->Effects[j].xVSS.uialphaBlendingMiddle > 100 )
- {
- pSettings->Effects[j].xVSS.uialphaBlendingMiddle = 100;
- }
-
- if( pSettings->Effects[j].xVSS.uialphaBlendingStart > 100 )
- {
- pSettings->Effects[j].xVSS.uialphaBlendingStart = 100;
- }
-
- if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime > 0
- || pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime
- > 0 )
- {
- /*Allocate the alpha blending structure*/
- framingCtx->alphaBlendingStruct =
- (M4xVSS_internalEffectsAlphaBlending *)M4OSA_32bitAlignedMalloc(
- sizeof(M4xVSS_internalEffectsAlphaBlending),
- M4VS, (M4OSA_Char *)"alpha blending structure");
-
- if( framingCtx->alphaBlendingStruct == M4OSA_NULL )
- {
- M4OSA_TRACE1_0(
- "Allocation error in M4xVSS_SendCommand");
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_ALLOC;
- }
- /*Fill the alpha blending structure*/
- framingCtx->alphaBlendingStruct->m_fadeInTime =
- pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime;
- framingCtx->alphaBlendingStruct->m_fadeOutTime =
- pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime;
- framingCtx->alphaBlendingStruct->m_end =
- pSettings->Effects[j].xVSS.uialphaBlendingEnd;
- framingCtx->alphaBlendingStruct->m_middle =
- pSettings->Effects[j].xVSS.uialphaBlendingMiddle;
- framingCtx->alphaBlendingStruct->m_start =
- pSettings->Effects[j].xVSS.uialphaBlendingStart;
-
- if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime
- + pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime
- > 100 )
- {
- framingCtx->alphaBlendingStruct->m_fadeOutTime =
- 100 - framingCtx->alphaBlendingStruct->m_fadeInTime;
- }
- }
-#else
-
- framingCtx = (M4xVSS_FramingStruct
- *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct),
- M4VS, (M4OSA_Char
- *)"Context of the framing effect (for text)");
-
- if( framingCtx == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
-
- framingCtx->topleft_x =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
- framingCtx->topleft_y =
- xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
- framingCtx->FramingRgb = M4OSA_NULL;
-
- /* BugFix 1.2.0: Leak when decoding error */
- framingCtx->FramingYuv = M4OSA_NULL;
- framingCtx->pNext = framingCtx;
-
-#endif
- /* Save framing structure associated with corresponding effect */
-
- xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- framingCtx;
-
- /* FB: changes for Video Artist: memcopy pTextBuffer so that it can be changed
- after a complete analysis*/
- if( pSettings->Effects[j].xVSS.pTextBuffer == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("M4xVSS_SendCommand: pTextBuffer is null");
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_PARAMETER;
- }
-
- /*Convert text buffer into customer format before being used*/
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath = pSettings->Effects[j].xVSS.pTextBuffer;
- xVSS_context->pSettings->Effects[j].xVSS.textBufferSize =
- pSettings->Effects[j].xVSS.textBufferSize;
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)pSettings->
- Effects[j].xVSS.pTextBuffer,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer,
- &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath = xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer;
- xVSS_context->pSettings->Effects[j].xVSS.textBufferSize =
- length;
- }
- /**
- * End of the UTF conversion, use the converted file path*/
-
- xVSS_context->pSettings->
- Effects[j].xVSS.pTextBuffer = M4OSA_32bitAlignedMalloc(
- xVSS_context->pSettings->Effects[j].xVSS.textBufferSize + 1,
- M4VS, (M4OSA_Char *)"Local text buffer effect");
-
- //xVSS_context->pSettings->Effects[j].xVSS.pTextBuffer =
- // M4OSA_32bitAlignedMalloc(strlen(pSettings->Effects[j].xVSS.pTextBuffer)+1,
- // M4VS, "Local text buffer effect");
- if( xVSS_context->pSettings->Effects[j].xVSS.pTextBuffer
- == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
-
- if( pSettings->Effects[j].xVSS.pTextBuffer != M4OSA_NULL )
- {
- //memcpy((M4OSA_MemAddr8)xVSS_context->pSettings->Effects[j]
- //.xVSS.pTextBuffer, (M4OSA_MemAddr8)pSettings->Effects[j].xVSS.pTextBuffer,
- // strlen(pSettings->Effects[j].xVSS.pTextBuffer)+1);
- memcpy((void *)xVSS_context->pSettings->
- Effects[j].xVSS.pTextBuffer,
- (void *)pDecodedPath, xVSS_context->pSettings->
- Effects[j].xVSS.textBufferSize + 1);
- }
-
- /*Allocate the text RGB buffer*/
- framingCtx->aFramingCtx->FramingRgb =
- (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(sizeof(M4VIFI_ImagePlane),
- M4VS,
- (M4OSA_Char *)"RGB structure for the text effect");
-
- if( framingCtx->aFramingCtx->FramingRgb == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
-
- if( xVSS_context->pSettings->Effects[j].xVSS.uiTextBufferWidth
- == 0 || xVSS_context->pSettings->
- Effects[j].xVSS.uiTextBufferHeight == 0 )
- {
- M4OSA_TRACE1_0(
- "M4xVSS_SendCommand: text plane width and height are not defined");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_PARAMETER;
- }
- /* Allocate input RGB text buffer and force it to even size to avoid errors in
- YUV conversion */
- framingCtx->aFramingCtx->FramingRgb->u_width =
- xVSS_context->pSettings->
- Effects[j].xVSS.uiTextBufferWidth & ~1;
- framingCtx->aFramingCtx->FramingRgb->u_height =
- xVSS_context->pSettings->
- Effects[j].xVSS.uiTextBufferHeight & ~1;
- framingCtx->aFramingCtx->FramingRgb->u_stride =
- 2 * framingCtx->aFramingCtx->FramingRgb->u_width;
- framingCtx->aFramingCtx->FramingRgb->u_topleft = 0;
- framingCtx->aFramingCtx->FramingRgb->pac_data =
- (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(
- framingCtx->aFramingCtx->FramingRgb->u_height
- * framingCtx->aFramingCtx->FramingRgb->u_stride,
- M4VS, (M4OSA_Char *)"Text RGB plane->pac_data");
-
- if( framingCtx->aFramingCtx->FramingRgb->pac_data
- == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
-
-#ifdef DECODE_GIF_ON_SAVING
- /**/
- /* Call text rendering function */
-
- err = xVSS_context->pSettings->xVSS.pTextRenderingFct(
- xVSS_context->pSettings->Effects[j].xVSS.pRenderingData,
- xVSS_context->pSettings->
- Effects[j].xVSS.pTextBuffer,
- xVSS_context->pSettings->
- Effects[j].xVSS.textBufferSize,
- &(framingCtx->aFramingCtx->FramingRgb));
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_0("Text rendering external function failed\n");
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
-
- /* Check that RGB buffer is set */
- if( framingCtx->aFramingCtx->FramingRgb == M4OSA_NULL )
- {
- M4OSA_TRACE1_0(
- "Text rendering function did not set RGB buffer correctly !");
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_PARAMETER;
- }
-
- /* Convert RGB plane to YUV420 and update framing structure */
- err = M4xVSS_internalConvertRGBtoYUV(framingCtx->aFramingCtx);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_sendCommand: error when converting RGB to YUV: 0w%x",
- err);
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
-
-#else
- /**/
- /* Call text rendering function */
-
- err = xVSS_context->pSettings->xVSS.pTextRenderingFct(
- xVSS_context->pSettings->Effects[j].xVSS.pRenderingData,
- xVSS_context->pSettings->
- Effects[j].xVSS.pTextBuffer,
- xVSS_context->pSettings->
- Effects[j].xVSS.textBufferSize,
- &(framingCtx->FramingRgb));
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_0("Text rendering external function failed\n");
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
-
- /* Check that RGB buffer is set */
- if( framingCtx->FramingRgb == M4OSA_NULL )
- {
- M4OSA_TRACE1_0(
- "Text rendering function did not set RGB buffer correctly !");
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_PARAMETER;
- }
-
- /* Convert RGB plane to YUV420 and update framing structure */
- err = M4xVSS_internalConvertRGBtoYUV(framingCtx);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_sendCommand: error when converting RGB to YUV: 0w%x",
- err);
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
-
-#endif /*DECODE_GIF_ON_SAVING*/
-
- /* Change internally effect type from "text" to framing */
-
- xVSS_context->pSettings->Effects[j].VideoEffectType =
- M4xVSS_kVideoEffectType_Framing;
- xVSS_context->pSettings->Effects[j].xVSS.bResize = M4OSA_FALSE;
- }
- else
- {
- M4OSA_TRACE1_0(
- "M4xVSS_sendCommand: No text rendering function set !!");
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_PARAMETER;
- }
- }
-
- /* Allocate the structure to store the data needed by the Fifties effect */
- else if( xVSS_context->pSettings->Effects[j].VideoEffectType
- == M4xVSS_kVideoEffectType_Fifties )
- {
- M4xVSS_FiftiesStruct *fiftiesCtx;
-
- /* Check the expected frame rate for the fifties effect (must be above 0) */
- if( 0 == xVSS_context->pSettings->
- Effects[j].xVSS.uiFiftiesOutFrameRate )
- {
- M4OSA_TRACE1_0(
- "The frame rate for the fifties effect must be greater than 0 !");
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_PARAMETER;
- }
-
- fiftiesCtx = (M4xVSS_FiftiesStruct
- *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FiftiesStruct),
- M4VS, (M4OSA_Char *)"Context of the fifties effect");
-
- if( fiftiesCtx == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_ALLOC;
- }
-
- fiftiesCtx->previousClipTime = -1;
- fiftiesCtx->fiftiesEffectDuration = 1000 / xVSS_context->pSettings->
- Effects[j].xVSS.uiFiftiesOutFrameRate;
- fiftiesCtx->shiftRandomValue = 0;
- fiftiesCtx->stripeRandomValue = 0;
-
- /* Save the structure associated with corresponding effect */
- xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- fiftiesCtx;
- }
-
- /* Allocate the structure to store the data needed by the Color effect */
- else if( xVSS_context->pSettings->Effects[j].VideoEffectType
- == M4xVSS_kVideoEffectType_ColorRGB16
- || xVSS_context->pSettings->Effects[j].VideoEffectType
- == M4xVSS_kVideoEffectType_BlackAndWhite
- || xVSS_context->pSettings->Effects[j].VideoEffectType
- == M4xVSS_kVideoEffectType_Pink
- || xVSS_context->pSettings->Effects[j].VideoEffectType
- == M4xVSS_kVideoEffectType_Green
- || xVSS_context->pSettings->Effects[j].VideoEffectType
- == M4xVSS_kVideoEffectType_Sepia
- || xVSS_context->pSettings->Effects[j].VideoEffectType
- == M4xVSS_kVideoEffectType_Negative
- || xVSS_context->pSettings->Effects[j].VideoEffectType
- == M4xVSS_kVideoEffectType_Gradient )
- {
- M4xVSS_ColorStruct *ColorCtx;
-
- ColorCtx =
- (M4xVSS_ColorStruct *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_ColorStruct),
- M4VS, (M4OSA_Char *)"Context of the color effect");
-
- if( ColorCtx == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return M4ERR_ALLOC;
- }
-
- ColorCtx->colorEffectType =
- xVSS_context->pSettings->Effects[j].VideoEffectType;
-
- if( xVSS_context->pSettings->Effects[j].VideoEffectType
- == M4xVSS_kVideoEffectType_ColorRGB16
- || xVSS_context->pSettings->Effects[j].VideoEffectType
- == M4xVSS_kVideoEffectType_Gradient )
- {
- ColorCtx->rgb16ColorData =
- xVSS_context->pSettings->Effects[j].xVSS.uiRgb16InputColor;
- }
- else
- {
- ColorCtx->rgb16ColorData = 0;
- }
-
- /* Save the structure associated with corresponding effect */
- xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
- ColorCtx;
- }
- }
-
- /**********************************
- Background music registering
- **********************************/
- if( pSettings->xVSS.pBGMtrack != M4OSA_NULL && isNewBGM == M4OSA_TRUE )
- {
-#ifdef PREVIEW_ENABLED
-
- M4xVSS_MCS_params *pParams;
- M4OSA_Char *out_pcm;
- /*UTF conversion support*/
- M4OSA_Void *pDecodedPath = M4OSA_NULL;
-
-#endif
-
- /* We save output file pointer, because we will need to use it when saving audio mixed
- file (last save step) */
-
- xVSS_context->pOutputFile = xVSS_context->pSettings->pOutputFile;
- xVSS_context->pTemporaryFile = xVSS_context->pSettings->pTemporaryFile;
-
- /* If a previous BGM has already been registered, delete it */
- /* Here can be implemented test to know if the same BGM is registered */
- 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;
- }
-
- /* Allocate BGM */
- xVSS_context->pSettings->xVSS.pBGMtrack =
- (M4xVSS_BGMSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_BGMSettings), M4VS,
- (M4OSA_Char *)"xVSS_context->pSettings->xVSS.pBGMtrack");
-
- if( xVSS_context->pSettings->xVSS.pBGMtrack == M4OSA_NULL )
- {
- M4xVSS_freeCommand(xVSS_context);
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- return M4ERR_ALLOC;
- }
-
- /* Copy input structure to our structure */
- memcpy((void *)xVSS_context->pSettings->xVSS.pBGMtrack,
- (void *)pSettings->xVSS.pBGMtrack,
- sizeof(M4xVSS_BGMSettings));
- /* Allocate file name, and copy file name buffer to our structure */
- xVSS_context->pSettings->xVSS.pBGMtrack->pFile =
- M4OSA_32bitAlignedMalloc((strlen(pSettings->xVSS.pBGMtrack->pFile)
- + 1), M4VS, (M4OSA_Char *)"xVSS BGM file path");
-
- if( xVSS_context->pSettings->xVSS.pBGMtrack->pFile == M4OSA_NULL )
- {
- M4xVSS_freeCommand(xVSS_context);
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- return M4ERR_ALLOC;
- }
- memcpy((void *)xVSS_context->pSettings->xVSS.pBGMtrack->pFile,
- (void *)pSettings->xVSS.pBGMtrack->pFile,
- strlen(pSettings->xVSS.pBGMtrack->pFile) + 1);
-
-#ifdef PREVIEW_ENABLED
- /* Decode BGM track to pcm output file */
-
- pParams =
- (M4xVSS_MCS_params *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_MCS_params), M4VS,
- (M4OSA_Char *)"Element of MCS Params (for BGM)");
-
- if( pParams == M4OSA_NULL )
- {
- M4xVSS_freeCommand(xVSS_context);
- M4OSA_TRACE1_0(
- "M4xVSS_sendCommand: Problem when allocating one element MCS Params");
- return M4ERR_ALLOC;
- }
-
- /* Initialize the pointers in case of problem (PR 2273) */
- pParams->pFileIn = M4OSA_NULL;
- pParams->pFileOut = M4OSA_NULL;
- pParams->pFileTemp = M4OSA_NULL;
- pParams->pNext = M4OSA_NULL;
- pParams->BeginCutTime = 0;
- pParams->EndCutTime = 0;
-
- if( xVSS_context->pMCSparamsList
- == M4OSA_NULL ) /* Means it is the first element of the list */
- {
- /* Initialize the xVSS context with the first element of the list */
- xVSS_context->pMCSparamsList = pParams;
-
- }
- else
- {
- M4xVSS_MCS_params *pParams_temp = xVSS_context->pMCSparamsList;
- M4xVSS_MCS_params *pParams_prev = M4OSA_NULL;
-
- /* Parse MCS params chained list to find and delete BGM element */
- while( pParams_temp != M4OSA_NULL )
- {
- if( pParams_temp->isBGM == M4OSA_TRUE )
- {
- /* Remove this element */
- if( pParams_temp->pFileIn != M4OSA_NULL )
- {
- free(pParams_temp->pFileIn);
- pParams_temp->pFileIn = M4OSA_NULL;
- }
-
- if( pParams_temp->pFileOut != M4OSA_NULL )
- {
- /* Remove PCM temporary file */
- remove((const char *)pParams_temp->pFileOut);
- free(pParams_temp->pFileOut);
- pParams_temp->pFileOut = M4OSA_NULL;
- }
- /* Chain previous element with next element = remove BGM chained
- list element */
- if( pParams_prev != M4OSA_NULL )
- {
- pParams_prev->pNext = pParams_temp->pNext;
- }
- /* If current pointer is the first of the chained list and next pointer of
- the chained list is NULL */
- /* it means that there was only one element in the list */
- /* => we put the context variable to NULL to reaffect the first chained list
- element */
- if( pParams_temp == xVSS_context->pMCSparamsList
- && pParams_temp->pNext == M4OSA_NULL )
- {
- xVSS_context->pMCSparamsList = M4OSA_NULL;
- }
- /* In that case, BGM pointer is the first one, but there are others elements
- after it */
- /* So, we need to change first chained list element */
- else if( pParams_temp->pNext != M4OSA_NULL
- && pParams_prev == M4OSA_NULL )
- {
- xVSS_context->pMCSparamsList = pParams_temp->pNext;
- }
-
- if( pParams_temp->pNext != M4OSA_NULL )
- {
- pParams_prev = pParams_temp->pNext;
- free(pParams_temp);
- pParams_temp = M4OSA_NULL;
- pParams_temp = pParams_prev;
- }
- else
- {
- free(pParams_temp);
- pParams_temp = M4OSA_NULL;
- }
- }
- else
- {
- pParams_prev = pParams_temp;
- pParams_temp = pParams_temp->pNext;
- }
- }
- /* We need to initialize the last element of the chained list to be able to add new
- BGM element */
- pMCS_last = pParams_prev;
-
- if( xVSS_context->pMCSparamsList == M4OSA_NULL )
- {
- /* In that case, it means that there was only one element in the chained list */
- /* So, we need to save the new params*/
- xVSS_context->pMCSparamsList = pParams;
- }
- else
- {
- /* Update next pointer of the previous last element of the chain */
- pMCS_last->pNext = pParams;
- }
-
- }
-
- /* Fill the last M4xVSS_MCS_params element */
- pParams->InputFileType =
- xVSS_context->pSettings->xVSS.pBGMtrack->FileType;
- pParams->OutputFileType = M4VIDEOEDITING_kFileType_PCM;
- pParams->OutputVideoFormat = M4VIDEOEDITING_kNoneVideo;
- pParams->OutputVideoFrameSize = M4VIDEOEDITING_kQCIF;
- pParams->OutputVideoFrameRate = M4VIDEOEDITING_k15_FPS;
-
- if( xVSS_context->pSettings->xVSS.outputAudioFormat
- == M4VIDEOEDITING_kAAC )
- {
- pParams->OutputAudioFormat = M4VIDEOEDITING_kAAC;
- pParams->OutputAudioSamplingFrequency = M4VIDEOEDITING_kDefault_ASF;
-
- /*FB: VAL CR P4ME00003076
- The output audio bitrate in the AAC case is now directly given by the user*/
- /*Check if the audio bitrate is correctly defined*/
- /*Mono
- MCS values for AAC Mono are min: 16kbps and max: 192 kbps*/
- if( xVSS_context->pSettings->xVSS.outputAudioBitrate
- >= M4VIDEOEDITING_k16_KBPS
- && xVSS_context->pSettings->xVSS.outputAudioBitrate
- <= M4VIDEOEDITING_k192_KBPS
- && xVSS_context->pSettings->xVSS.bAudioMono == M4OSA_TRUE )
- {
- pParams->OutputAudioBitrate =
- xVSS_context->pSettings->xVSS.outputAudioBitrate;
- }
- /*Stereo
- MCS values for AAC Mono are min: 32kbps and max: 192 kbps*/
- else if( xVSS_context->pSettings->xVSS.outputAudioBitrate
- >= M4VIDEOEDITING_k32_KBPS
- && xVSS_context->pSettings->xVSS.outputAudioBitrate
- <= M4VIDEOEDITING_k192_KBPS
- && xVSS_context->pSettings->xVSS.bAudioMono == M4OSA_FALSE )
- {
- pParams->OutputAudioBitrate =
- xVSS_context->pSettings->xVSS.outputAudioBitrate;
- }
- else
- {
- pParams->OutputAudioBitrate = M4VIDEOEDITING_k32_KBPS;
- }
- pParams->bAudioMono = xVSS_context->pSettings->xVSS.bAudioMono;
- }
- else
- {
- pParams->OutputAudioFormat = M4VIDEOEDITING_kAMR_NB;
- pParams->OutputAudioSamplingFrequency = M4VIDEOEDITING_kDefault_ASF;
- pParams->OutputAudioBitrate = M4VIDEOEDITING_k12_2_KBPS;
- pParams->bAudioMono = M4OSA_TRUE;
- }
- pParams->OutputVideoBitrate = M4VIDEOEDITING_kUndefinedBitrate;
-
- /* Prepare output filename */
- /* 21 is the size of "preview_16000_2.pcm" + \0 */
- out_pcm =
- (M4OSA_Char *)M4OSA_32bitAlignedMalloc(strlen(xVSS_context->pTempPath)
- + 21, M4VS, (M4OSA_Char *)"Temp char* for pcmPreviewFile");
-
- if( out_pcm == M4OSA_NULL )
- {
- M4xVSS_freeCommand(xVSS_context);
- M4OSA_TRACE1_0("Allocation error in M4xVSS_Init");
- return M4ERR_ALLOC;
- }
-
- /* Copy temporary path to final preview path string */
- M4OSA_chrNCopy(out_pcm, xVSS_context->pTempPath,
- strlen(xVSS_context->pTempPath) + 1);
-
- /* Depending of the output sample frequency and nb of channels, we construct preview
- output filename */
- if( xVSS_context->pSettings->xVSS.outputAudioFormat
- == M4VIDEOEDITING_kAAC )
- {
- /* Construct output temporary PCM filename */
- if( xVSS_context->pSettings->xVSS.bAudioMono == M4OSA_TRUE )
- {
- strncat((char *)out_pcm, (const char *)"preview_16000_1.pcm\0",
- 20);
- }
- else
- {
- strncat((char *)out_pcm, (const char *)"preview_16000_2.pcm\0",
- 20);
- }
- }
- else if( xVSS_context->pSettings->xVSS.outputAudioFormat
- == M4VIDEOEDITING_kAMR_NB )
- {
- /* Construct output temporary PCM filename */
- strncat((char *)out_pcm, (const char *)"preview_08000_1.pcm\0", 20);
- }
- else
- {
- if( out_pcm != M4OSA_NULL )
- {
- free(out_pcm);
- out_pcm = M4OSA_NULL;
- }
- M4xVSS_freeCommand(xVSS_context);
- M4OSA_TRACE1_0("Bad audio output format \n");
- return M4ERR_PARAMETER;
- }
-
- xVSS_context->pcmPreviewFile = out_pcm;
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath = out_pcm;
- length = strlen(pDecodedPath);
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)out_pcm, (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer, &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- xVSS_context->pcmPreviewFile =
- (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS,
- (M4OSA_Char *)"pcmPreviewFile");
-
- if( xVSS_context->pcmPreviewFile == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- free(out_pcm);
- out_pcm = M4OSA_NULL;
- /*FB: to avoid leaks when there is an error in the send command*/
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- /**/
- return M4ERR_ALLOC;
- }
- memcpy((void *)xVSS_context->pcmPreviewFile, (void *)pDecodedPath, length + 1);
-
- /* Free temporary output filename */
- if( out_pcm != M4OSA_NULL )
- {
- free(out_pcm);
- out_pcm = M4OSA_NULL;
- }
-
- pParams->pFileOut = M4OSA_32bitAlignedMalloc((length + 1), M4VS,
- (M4OSA_Char *)"MCS BGM Params: file out");
-
- if( pParams->pFileOut == M4OSA_NULL )
- {
- M4xVSS_freeCommand(xVSS_context);
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- return M4ERR_ALLOC;
- }
- pParams->pFileTemp = M4OSA_NULL;
-
- memcpy((void *)pParams->pFileOut,(void *) xVSS_context->pcmPreviewFile,
- (length + 1)); /* Copy output file path */
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
-
- pDecodedPath = xVSS_context->pSettings->xVSS.pBGMtrack->pFile;
- length = strlen(pDecodedPath);
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)xVSS_context->pSettings->xVSS.pBGMtrack->
- pFile, (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer, &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- pParams->pFileIn = (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS,
- (M4OSA_Char *)"MCS BGM Params: file in");
-
- if( pParams->pFileIn == M4OSA_NULL )
- {
- M4xVSS_freeCommand(xVSS_context);
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
- return M4ERR_ALLOC;
- }
- memcpy((void *)pParams->pFileIn, (void *)pDecodedPath,
- (length + 1)); /* Copy input file path */
-
- pParams->isBGM = M4OSA_TRUE;
- pParams->isCreated = M4OSA_FALSE;
- xVSS_context->nbStepTotal++;
- bIsTranscoding = M4OSA_TRUE;
-#endif /* PREVIEW_ENABLED */
-
- }
- else if( pSettings->xVSS.pBGMtrack != M4OSA_NULL
- && isNewBGM == M4OSA_FALSE )
- {
-#ifdef PREVIEW_ENABLED
- /* BGM is the same as previously, no need to redecode audio */
- /* Need to update MCS params chained list, to signal M4xVSS_step function to skip
- BGM decoding */
-
- M4xVSS_MCS_params *pParams_temp = xVSS_context->pMCSparamsList;
- M4xVSS_MCS_params *pParams_prev = M4OSA_NULL;
-
-#endif /* PREVIEW_ENABLED */
- /* We save output file pointer, because we will need to use it when saving audio
- mixed file (last save step) */
-
- xVSS_context->pOutputFile = xVSS_context->pSettings->pOutputFile;
- xVSS_context->pTemporaryFile = xVSS_context->pSettings->pTemporaryFile;
-
- /* Re-write BGM settings in case they have changed between two sendCommand */
- xVSS_context->pSettings->xVSS.pBGMtrack->uiAddCts =
- pSettings->xVSS.pBGMtrack->uiAddCts;
- xVSS_context->pSettings->xVSS.pBGMtrack->uiAddVolume =
- pSettings->xVSS.pBGMtrack->uiAddVolume;
- xVSS_context->pSettings->xVSS.pBGMtrack->uiBeginLoop =
- pSettings->xVSS.pBGMtrack->uiBeginLoop;
- xVSS_context->pSettings->xVSS.pBGMtrack->uiEndLoop =
- pSettings->xVSS.pBGMtrack->uiEndLoop;
-
-#ifdef PREVIEW_ENABLED
- /* Parse MCS params chained list to find and delete BGM element */
-
- while( pParams_temp != M4OSA_NULL )
- {
- if( pParams_temp->isBGM == M4OSA_TRUE )
- {
- pParams_temp->isCreated = M4OSA_TRUE;
- break;
- }
- pParams_prev = pParams_temp;
- pParams_temp = pParams_temp->pNext;
- }
-
-#endif /* PREVIEW_ENABLED */
-
- M4OSA_TRACE2_0("M4xVSS_SendCommand has been recalled, BGM is the same");
- }
- else
- {
- M4OSA_TRACE1_0("No BGM in this xVSS command");
-
- if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL )
- {
-#ifdef PREVIEW_ENABLED
- /* Need to remove MCS previous params chained list */
-
- M4xVSS_MCS_params *pParams_temp = xVSS_context->pMCSparamsList;
- M4xVSS_MCS_params *pParams_prev = M4OSA_NULL;
-
- /* Parse MCS params chained list to find and delete BGM element */
- while( pParams_temp != M4OSA_NULL )
- {
- if( pParams_temp->isBGM == M4OSA_TRUE )
- {
- /* Remove this element */
- if( pParams_temp->pFileIn != M4OSA_NULL )
- {
- free(pParams_temp->pFileIn);
- pParams_temp->pFileIn = M4OSA_NULL;
- }
-
- if( pParams_temp->pFileOut != M4OSA_NULL )
- {
- free(pParams_temp->pFileOut);
- pParams_temp->pFileOut = M4OSA_NULL;
- }
- /* Chain previous element with next element */
- if( pParams_prev != M4OSA_NULL )
- {
- pParams_prev->pNext = pParams_temp->pNext;
- }
- /* If current pointer is the first of the chained list and next pointer
- of the chained list is NULL */
- /* it means that there was only one element in the list */
- /* => we put the context variable to NULL */
- if( pParams_temp == xVSS_context->pMCSparamsList
- && pParams_temp->pNext == M4OSA_NULL )
- {
- free(pParams_temp);
- xVSS_context->pMCSparamsList = M4OSA_NULL;
- }
- /* In that case, BGM pointer is the first one, but there are others
- elements after it */
- /* So, we need to change first chained list element */
- else if( pParams_temp->pNext != M4OSA_NULL )
- {
- xVSS_context->pMCSparamsList = pParams_temp->pNext;
- free(pParams_temp);
- pParams_temp = M4OSA_NULL;
- }
- /* In all other cases, nothing else to do except freeing the chained
- list element */
- else
- {
- free(pParams_temp);
- pParams_temp = M4OSA_NULL;
- }
- break;
- }
- pParams_prev = pParams_temp;
- pParams_temp = pParams_temp->pNext;
- }
-
-#endif /* PREVIEW_ENABLED */
- /* Here, we unallocate all BGM components and put xVSS_context->pSettings->
- xVSS.pBGMtrack to NULL */
-
- 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;
- }
- }
- }
-
- /* Changed to be able to mix with video only files -> in case no master clip is found
- (i.e only JPG input or video only input) */
- /* and if there is a BGM, we force the added volume to 100 (i.e replace audio) */
-
- if( masterClip == -1
- && xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL )
- {
- /* In that case, it means that no input 3GP file has a video track.
- Therefore, if a mixing is asked, it will fail. Thus, we force replace audio. */
- xVSS_context->pSettings->xVSS.pBGMtrack->uiAddVolume = 100;
- }
-
- /* Save clip number to know if a M4xVSS_sendCommand has already been called */
- xVSS_context->previousClipNumber = xVSS_context->pSettings->uiClipNumber;
-
- /* Change state */
- xVSS_context->m_state = M4xVSS_kStateAnalyzing;
-
- /* In case of MMS use case, we compute here the max video bitrate */
- /* In case of too low bitrate, a specific warning is returned */
- if( xVSS_context->pSettings->xVSS.outputFileSize != 0 && totalDuration > 0 )
- {
- M4OSA_UInt32 targetedBitrate = 0;
- M4VIDEOEDITING_ClipProperties fileProperties;
- M4OSA_Double ratio;
-
- if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL )
- {
- if( xVSS_context->pSettings->xVSS.pBGMtrack->uiAddVolume
- == 100 ) /* We are in "replace audio mode, need to check the filetype */
- {
- if( xVSS_context->pSettings->xVSS.pBGMtrack->FileType
- == M4VIDEOEDITING_kFileType_3GPP )
- {
- M4OSA_Void *pDecodedPath;
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath =
- xVSS_context->pSettings->xVSS.pBGMtrack->pFile;
- length = strlen(pDecodedPath);
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)xVSS_context->pSettings->
- xVSS.pBGMtrack->pFile,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.
- pTempOutConversionBuffer, &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1("M4xVSS_SendCommand: \
- M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
- return err;
- }
- pDecodedPath = xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- err =
- M4xVSS_internalGetProperties(xVSS_context, pDecodedPath,
- &fileProperties);
-
- /* Get the properties of the BGM track */
- /*err = M4xVSS_internalGetProperties(xVSS_context, xVSS_context->pSettings->
- xVSS.pBGMtrack->pFile, &fileProperties);*/
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_sendCommand: M4xVSS_internalGetProperties returned an error:\
- 0x%x", err);
- return err;
- }
-
- if( fileProperties.AudioStreamType
- != M4VIDEOEDITING_kAMR_NB )
- {
- M4OSA_TRACE1_0(
- "M4xVSS_sendCommand: Impossible to use MMS mode with BGM != AMR-NB");
- return M4ERR_PARAMETER;
- }
- }
- else if( xVSS_context->pSettings->xVSS.pBGMtrack->FileType
- != M4VIDEOEDITING_kFileType_AMR
- && xVSS_context->pSettings->xVSS.pBGMtrack->FileType
- != M4VIDEOEDITING_kFileType_MP3 )
- {
- M4OSA_TRACE1_0("M4xVSS_sendCommand: Bad input BGM file");
- return M4ERR_PARAMETER;
- }
- }
- }
-
- /* Compute targeted bitrate, with 8% margin (moov) */
- if( totalDuration > 1000 )
- {
- targetedBitrate =
- (M4OSA_UInt32)(( xVSS_context->pSettings->xVSS.outputFileSize
- * 8 * 0.84) / (totalDuration / 1000));
- }
- else
- {
- targetedBitrate = 0;
- }
-
- /* Remove audio bitrate */
- if( targetedBitrate >= 12200 )
- {
- targetedBitrate -= 12200; /* Only AMR is supported in MMS case */
- }
- else
- {
- targetedBitrate = 0;
- }
-
- /* Compute an indicator of "complexity" depending on nb of sequences and total duration */
- /* The highest is the number of sequences, the more there are some I frames */
- /* In that case, it is necessary to reduce the target bitrate */
- ratio =
- (M4OSA_Double)((M4OSA_Double)(xVSS_context->pSettings->uiClipNumber
- * 100000) / (M4OSA_Double)(totalDuration));
- M4OSA_TRACE2_3(
- "Ratio clip_nb/duration = %f\nTargeted bitrate = %d\nTotal duration: %d",
- (M4OSA_Double)((M4OSA_Double)(xVSS_context->pSettings->uiClipNumber
- * 100000) / (M4OSA_Double)(totalDuration)),
- targetedBitrate, totalDuration);
-
- if( ratio > 50 && ratio <= 75 )
- {
- /* It means that there is a potential risk of having a higher file size
- than specified */
- targetedBitrate -= (M4OSA_UInt32)(targetedBitrate * 0.1);
- M4OSA_TRACE2_2(
- "New bitrate1 !!\nRatio clip_nb/duration = %f\nTargeted bitrate = %d",
- ratio, targetedBitrate);
- }
- else if( ratio > 75 )
- {
- targetedBitrate -= (M4OSA_UInt32)(targetedBitrate * 0.15);
- M4OSA_TRACE2_2(
- "New bitrate2 !!\nRatio clip_nb/duration = %f\nTargeted bitrate = %d",
- ratio, targetedBitrate);
- }
-
- /*CR 3283 MMS use case for VAL:
- Decrease the output file size to keep a margin of 5%
- The writer will stop when the targeted output file size will be reached*/
- xVSS_context->pSettings->xVSS.outputFileSize -=
- (M4OSA_UInt32)(xVSS_context->pSettings->xVSS.outputFileSize * 0.05);
-
- switch( xVSS_context->pSettings->xVSS.outputVideoSize )
- {
- case M4VIDEOEDITING_kSQCIF:
- if( targetedBitrate < 32000 )
- {
- xVSS_context->targetedBitrate = 32000;
- return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED;
- }
- break;
-
- case M4VIDEOEDITING_kQQVGA:
- if( targetedBitrate < 32000 ) /*48000)*/
- {
- xVSS_context->targetedBitrate = 32000; /*48000;*/
- return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED;
- }
- break;
-
- case M4VIDEOEDITING_kQCIF:
- if( targetedBitrate < 48000 ) /*64000)*/
- {
- xVSS_context->targetedBitrate = 48000; /*64000;*/
- return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED;
- }
- break;
-
- case M4VIDEOEDITING_kQVGA:
- if( targetedBitrate < 64000 ) /*128000)*/
- {
- xVSS_context->targetedBitrate = 64000; /*128000;*/
- return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED;
- }
- break;
-
- case M4VIDEOEDITING_kCIF:
- if( targetedBitrate < 128000 )
- {
- xVSS_context->targetedBitrate = 128000;
- return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED;
- }
- break;
-
- case M4VIDEOEDITING_kVGA:
- if( targetedBitrate < 192000 )
- {
- xVSS_context->targetedBitrate = 192000;
- return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED;
- }
- break;
-
- default:
- /* Cannot happen */
- M4OSA_TRACE1_0(
- "M4xVSS_sendCommand: Error in output fileSize !");
- return M4ERR_PARAMETER;
- break;
- }
- xVSS_context->targetedBitrate = (M4OSA_UInt32)targetedBitrate;
- }
-
- if( bIsTranscoding )
- {
- return M4VSS3GPP_WAR_TRANSCODING_NECESSARY;
- }
- else
- {
- return M4NO_ERROR;
- }
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_SaveStart(M4OSA_Context pContext, M4OSA_Char* pFilePath)
- * @brief This function prepare the save
- * @note The xVSS create 3GP edited final file
- * This function must be called once M4xVSS_Step has returned
- * M4VSS3GPP_WAR_ANALYZING_DONE
- * After this function, the user must call M4xVSS_Step until
- * it returns another error than M4NO_ERROR.
- *
- * @param pContext (IN) Pointer on the xVSS edit context
- * @param pFilePath (IN) If the user wants to provide a different
- * output filename, else can be NULL (allocated by the user)
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL
- * @return M4ERR_ALLOC: Memory allocation has failed
- * @return M4ERR_STATE: This function cannot not be called at this time
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_SaveStart( M4OSA_Context pContext, M4OSA_Void *pFilePath,
- M4OSA_UInt32 filePathSize )
-{
- M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
- M4OSA_ERR err;
-
- /*Add for UTF conversion: copy the pSettings structure into a new pCurrentEditSettings*/
- M4VSS3GPP_EditSettings *pEditSavingSettings = M4OSA_NULL;
- M4OSA_UInt8 i, j;
- M4OSA_UInt32 offset = 0;
- M4OSA_UInt8 nbEffects = 0;
- /*only for UTF conversion support*/
- M4OSA_Void *pDecodedPath = M4OSA_NULL;
- M4OSA_UInt32 length = 0;
- /**/
-
- /* Check state */
- if( xVSS_context->m_state != M4xVSS_kStateOpened )
- {
- M4OSA_TRACE1_1(
- "Bad state when calling M4xVSS_SaveStart function! State is %d",
- xVSS_context->m_state);
- return M4ERR_STATE;
- }
-
- /* RC: to temporary handle changing of output filepath */
- /* TO BE CHANGED CLEANLY WITH A MALLOC/MEMCPY !!!! */
- if( pFilePath != M4OSA_NULL )
- {
- if( xVSS_context->pSettings->pOutputFile != M4OSA_NULL )
- {
- /*it means that pOutputFile has been allocated in M4xVSS_sendCommand()*/
- free(xVSS_context->pSettings->pOutputFile);
- xVSS_context->pSettings->pOutputFile = M4OSA_NULL;
- xVSS_context->pSettings->uiOutputPathSize = 0;
- }
-
- pDecodedPath = pFilePath;
- /*As all inputs of the xVSS are in UTF8, convert the output file path into the customer
- format*/
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)pFilePath, (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer, &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- filePathSize = length;
- }
-
- xVSS_context->pOutputFile =
- (M4OSA_Void *)M4OSA_32bitAlignedMalloc(filePathSize + 1, M4VS,
- (M4OSA_Char *)"M4xVSS_SaveStart: output file");
-
- if( xVSS_context->pOutputFile == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
- return M4ERR_ALLOC;
- }
- memcpy((void *)xVSS_context->pOutputFile, (void *)pDecodedPath, filePathSize + 1);
- xVSS_context->pOutputFile[filePathSize] = '\0';
- xVSS_context->pSettings->pOutputFile = xVSS_context->pOutputFile;
- xVSS_context->pSettings->uiOutputPathSize = filePathSize;
- }
-
- /**
- ***/
-
- /*FB: Add for UTF conversion: copy the pSettings structure into a new pCurrentEditSettings*/
- /*It is the same principle as in the PreviewStart()*/
- pEditSavingSettings =
- (M4VSS3GPP_EditSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_EditSettings),
- M4VS, (M4OSA_Char *)"Saving, copy of VSS structure");
-
- if( pEditSavingSettings == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_ALLOC;
- }
-
- /* Copy settings from input structure */
- memcpy((void *) &(pEditSavingSettings->xVSS),
- (void *) &(xVSS_context->pSettings->xVSS),
- sizeof(M4xVSS_EditSettings));
-
- /* Initialize pEditSavingSettings structure */
- pEditSavingSettings->xVSS.pBGMtrack = M4OSA_NULL;
-
- pEditSavingSettings->videoFrameRate =
- xVSS_context->pSettings->videoFrameRate;
- pEditSavingSettings->uiClipNumber = xVSS_context->pSettings->uiClipNumber;
- pEditSavingSettings->uiMasterClip =
- xVSS_context->pSettings->uiMasterClip; /* VSS2.0 mandatory parameter */
-
- /* Allocate savingSettings.pClipList/pTransitions structure */
- pEditSavingSettings->pClipList = (M4VSS3GPP_ClipSettings *
- * )M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_ClipSettings *)
- *pEditSavingSettings->uiClipNumber,
- M4VS, (M4OSA_Char *)"xVSS, saving , copy of pClipList");
-
- if( pEditSavingSettings->pClipList == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_ALLOC;
- }
-
- if( pEditSavingSettings->uiClipNumber > 1 )
- {
- pEditSavingSettings->pTransitionList = (M4VSS3GPP_TransitionSettings *
- * )M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings *)
- *(pEditSavingSettings->uiClipNumber - 1),
- M4VS, (M4OSA_Char *)"xVSS, saving, copy of pTransitionList");
-
- if( pEditSavingSettings->pTransitionList == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_ALLOC;
- }
- }
- else
- {
- pEditSavingSettings->pTransitionList = M4OSA_NULL;
- }
-
- for ( i = 0; i < pEditSavingSettings->uiClipNumber; i++ )
- {
- pEditSavingSettings->pClipList[i] = (M4VSS3GPP_ClipSettings
- *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_ClipSettings),
- M4VS, (M4OSA_Char *)"saving clip settings");
-
- if( pEditSavingSettings->pClipList[i] == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_ALLOC;
- }
-
- if( i < pEditSavingSettings->uiClipNumber
- - 1 ) /* Because there is 1 less transition than clip number */
- {
- pEditSavingSettings->pTransitionList[i] =
- (M4VSS3GPP_TransitionSettings
- *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings),
- M4VS, (M4OSA_Char *)"saving transition settings");
-
- if( pEditSavingSettings->pTransitionList[i] == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_ALLOC;
- }
- }
- }
-
- for ( i = 0; i < xVSS_context->pSettings->uiClipNumber; i++ )
- {
- // Add MP4 file support
-
- if( ( xVSS_context->pSettings->pClipList[i]->FileType
- == M4VIDEOEDITING_kFileType_3GPP)
- || (xVSS_context->pSettings->pClipList[i]->FileType
- == M4VIDEOEDITING_kFileType_MP4)
- || (xVSS_context->pSettings->pClipList[i]->FileType
- == M4VIDEOEDITING_kFileType_M4V)
- || (xVSS_context->pSettings->pClipList[i]->FileType
- == M4VIDEOEDITING_kFileType_ARGB8888))
-
- {
- /* Copy data from given structure to our saving structure */
- M4xVSS_DuplicateClipSettings(pEditSavingSettings->pClipList[i],
- xVSS_context->pSettings->pClipList[i],
- M4OSA_FALSE /* remove effects */);
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath = pEditSavingSettings->pClipList[i]->pFile;
- length = strlen(pDecodedPath);
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err =
- M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void
- *)pEditSavingSettings->pClipList[i]->pFile,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer,
- &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return err;
- }
- pDecodedPath = xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer;
-
- /**
- * End of the UTF conversion, use the converted file path*/
- free(
- pEditSavingSettings->pClipList[i]->pFile);
- pEditSavingSettings->pClipList[i]->pFile = (M4OSA_Void
- *)M4OSA_32bitAlignedMalloc((length + 1),
- M4VS, (M4OSA_Char *)"saving transition settings");
-
- if( pEditSavingSettings->pClipList[i]->pFile == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_ALLOC;
- }
- memcpy((void *)pEditSavingSettings->pClipList[i]->pFile,
- (void *)pDecodedPath, length + 1);
- }
- /*FB: add file path size because of UTF 16 conversion*/
- pEditSavingSettings->pClipList[i]->filePathSize = length+1;
-
- if( i
- < xVSS_context->pSettings->uiClipNumber
- - 1 ) /* Because there is 1 less transition than clip number */
- {
- memcpy(
- (void *)pEditSavingSettings->pTransitionList[i],
- (void *)xVSS_context->pSettings->
- pTransitionList[i],
- sizeof(M4VSS3GPP_TransitionSettings));
- }
- }
- else
- {
- M4OSA_TRACE1_0(
- "M4xVSS_SaveStart: Error when parsing xVSS_context->pSettings->pClipList[i]:\
- Bad file type");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_PARAMETER;
- }
- }
-
- /* Count the number of video effects, used to know how much memory is needed to allocate*/
- /* FB 2008/10/15: removed : not compatible with M4VSS3GPP_kVideoEffectType_None
- for(j=0;j<xVSS_context->pSettings->nbEffects;j++)
- {
- if(xVSS_context->pSettings->Effects[j].VideoEffectType != M4VSS3GPP_kVideoEffectType_None)
- {
- nbEffects++;
- }
- }*/
- nbEffects = xVSS_context->pSettings->nbEffects;
-
- /* Allocate effects saving structure with correct number of effects */
- if( nbEffects != 0 )
- {
- pEditSavingSettings->Effects =
- (M4VSS3GPP_EffectSettings *)M4OSA_32bitAlignedMalloc(nbEffects
- * sizeof(M4VSS3GPP_EffectSettings), M4VS, (M4OSA_Char
- *)"Saving settings, effects table of structure settings");
-
- if( pEditSavingSettings->Effects == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_ALLOC;
- }
-
- /* Just copy effect structure to saving structure, as effects time are now */
- /* relative to output clip time*/
- memcpy((void *)pEditSavingSettings->Effects,
- (void *)xVSS_context->pSettings->Effects,
- nbEffects * sizeof(M4VSS3GPP_EffectSettings));
- }
- else
- {
- pEditSavingSettings->Effects = M4OSA_NULL;
- pEditSavingSettings->nbEffects = 0;
- }
- pEditSavingSettings->nbEffects = nbEffects;
-
- if( pFilePath != M4OSA_NULL )
- {
- pEditSavingSettings->pOutputFile = pFilePath;
- }
-
- /* Save pointer of saving video editor to use in step function */
- xVSS_context->pCurrentEditSettings = pEditSavingSettings;
-
- /* Change output file name to temporary output file name, because final file will be
- generated by audio mixer */
- if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL )
- {
-
- M4OSA_Char out_3gp[M4XVSS_MAX_PATH_LEN];
- M4OSA_Char out_3gp_tmp[M4XVSS_MAX_PATH_LEN];
-
- /**/
- pEditSavingSettings->xVSS.pBGMtrack =
- (M4xVSS_BGMSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_BGMSettings), M4VS,
- (M4OSA_Char
- *)"Saving settings, effects table of structure settings");
-
- if( pEditSavingSettings->xVSS.pBGMtrack == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_ALLOC;
- }
-
- /* Just copy effect structure to saving structure, as effects time are now */
- /* relative to output clip time*/
- memcpy((void *)pEditSavingSettings->xVSS.pBGMtrack,
- (void *)xVSS_context->pSettings->xVSS.pBGMtrack,
- sizeof(M4xVSS_BGMSettings));
-
- /* Allocate file name, and copy file name buffer to our structure */
- pEditSavingSettings->xVSS.pBGMtrack->pFile = M4OSA_32bitAlignedMalloc(
- (strlen(xVSS_context->pSettings->xVSS.pBGMtrack->pFile)
- + 1),
- M4VS, (M4OSA_Char *)"Saving struct xVSS BGM file path");
-
- if( pEditSavingSettings->xVSS.pBGMtrack->pFile == M4OSA_NULL )
- {
- M4xVSS_freeCommand(xVSS_context);
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_ALLOC;
- }
- memcpy((void *)pEditSavingSettings->xVSS.pBGMtrack->pFile,
- (void *)xVSS_context->pSettings->xVSS.pBGMtrack->pFile,
- strlen(xVSS_context->pSettings->xVSS.pBGMtrack->pFile)
- + 1);
-
- /*Copy BGM track file path*/
-
- /**
- * UTF conversion*/
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)pEditSavingSettings->xVSS.pBGMtrack->pFile,
- (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer, &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
-
- free(pEditSavingSettings->xVSS.pBGMtrack->pFile);
- pEditSavingSettings->xVSS.pBGMtrack->pFile =
- (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS, (M4OSA_Char
- *)"M4xVSS_SaveStart: Temp filename in case of BGM");
-
- if( pEditSavingSettings->xVSS.pBGMtrack->pFile == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_ALLOC;
- }
- memcpy((void *)pEditSavingSettings->xVSS.pBGMtrack->pFile,
- (void *)pDecodedPath, length + 1);
- }
-
- /**/
-
- M4OSA_chrNCopy(out_3gp, xVSS_context->pTempPath, M4XVSS_MAX_PATH_LEN - 1);
- M4OSA_chrNCopy(out_3gp_tmp, xVSS_context->pTempPath, M4XVSS_MAX_PATH_LEN - 1);
-
- /* Construct output temporary 3GP filename */
- strncat((char *)out_3gp, (const char *)"savetemp.3gp\0", 13);
- strncat((char *)out_3gp_tmp, (const char *)"savetemp.tmp\0", 13);
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath = out_3gp;
- length = strlen(pDecodedPath);
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)out_3gp, (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer, &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- xVSS_context->pCurrentEditSettings->pOutputFile =
- (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS,
- (M4OSA_Char *)"M4xVSS_SaveStart: Temp filename in case of BGM");
-
- if( xVSS_context->pCurrentEditSettings->pOutputFile == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_ALLOC;
- }
- memcpy((void *)xVSS_context->pCurrentEditSettings->pOutputFile,
- (void *)pDecodedPath, length + 1);
- xVSS_context->pCurrentEditSettings->uiOutputPathSize = length + 1;
-
- /**
- * UTF conversion: convert into the customer format, before being used*/
- pDecodedPath = out_3gp_tmp;
- length = strlen(pDecodedPath);
-
- if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
- && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- err = M4xVSS_internalConvertFromUTF8(xVSS_context,
- (M4OSA_Void *)out_3gp_tmp, (M4OSA_Void *)xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer, &length);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
- err);
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return err;
- }
- pDecodedPath =
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
- }
-
- /**
- * End of the UTF conversion, use the converted file path*/
- xVSS_context->pCurrentEditSettings->pTemporaryFile =
- (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS,
- (M4OSA_Char *)"M4xVSS_SaveStart: Temporary file");
-
- if( xVSS_context->pCurrentEditSettings->pTemporaryFile == M4OSA_NULL )
- {
- M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- return M4ERR_ALLOC;
- }
- memcpy((void *)xVSS_context->pCurrentEditSettings->pTemporaryFile,
- (void *)pDecodedPath, length + 1);
-
- /* Put nb of step for progression monitoring to 2, because audio mixing is needed */
- xVSS_context->nbStepTotal = 2;
- }
- else
- {
- xVSS_context->pCurrentEditSettings->pOutputFile =
- xVSS_context->pOutputFile;
- xVSS_context->pCurrentEditSettings->pTemporaryFile = M4OSA_NULL;
-
- /* Put nb of step for progression monitoring to 1, because no audio mixing is needed */
- xVSS_context->nbStepTotal = 1;
- }
-
- /**
- ***/
-
- err = M4xVSS_internalGenerateEditedFile(xVSS_context);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_SaveStart: M4xVSS_internalGenerateEditedFile returned an error: 0x%x",
- err);
-
- /**/
- if( xVSS_context->pCurrentEditSettings->pOutputFile != M4OSA_NULL
- && xVSS_context->pSettings->xVSS.pBGMtrack == M4OSA_NULL )
- {
- free(xVSS_context->pCurrentEditSettings->
- pOutputFile);
- xVSS_context->pCurrentEditSettings->pOutputFile = M4OSA_NULL;
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
-
- if( xVSS_context->pCurrentEditSettings->pTemporaryFile != M4OSA_NULL
- && xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL )
- {
- free(xVSS_context->pCurrentEditSettings->
- pTemporaryFile);
- xVSS_context->pCurrentEditSettings->pTemporaryFile = M4OSA_NULL;
- }
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
- /* TODO: Translate error code of VSS to an xVSS error code */
- return err;
- }
-
- /* Reinitialize current step number for progression monitoring */
- xVSS_context->currentStep = 0;
-
- /* Change xVSS state */
- xVSS_context->m_state = M4xVSS_kStateSaving;
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_SaveStop(M4OSA_Context pContext)
- * @brief This function unallocate save ressources and change xVSS
- * internal state.
- * @note This function must be called once M4xVSS_Step has returned
- * M4VSS3GPP_WAR_SAVING_DONE
- *
- * @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_STATE: This function cannot not be called at this time
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_SaveStop( M4OSA_Context pContext )
-{
- M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
- M4OSA_ERR err = M4NO_ERROR;
-
- /* Check state */
- if( xVSS_context->m_state != M4xVSS_kStateSaving )
- {
- M4OSA_TRACE1_1(
- "Bad state when calling M4xVSS_SaveStop function! State is %d",
- xVSS_context->m_state);
- return M4ERR_STATE;
- }
-
- /* Free saving structures */
- M4xVSS_internalFreeSaving(xVSS_context);
-
- if( xVSS_context->pOutputFile != M4OSA_NULL )
- {
- free(xVSS_context->pOutputFile);
- xVSS_context->pOutputFile = M4OSA_NULL;
- }
-
- /* Change xVSS state */
- xVSS_context->m_state = M4xVSS_kStateSaved;
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_Step(M4OSA_Context pContext, M4OSA_UInt8 *pProgress)
- * @brief This function executes differents tasks, depending of xVSS
- * internal state.
- * @note This function:
- * - analyses editing structure if called after M4xVSS_SendCommand
- * - generates preview file if called after M4xVSS_PreviewStart
- * - generates final edited file if called after M4xVSS_SaveStart
- *
- * @param pContext (IN) Pointer on the xVSS edit context
- * @param pProgress (IN/OUT) Pointer on an integer giving a
- * progress indication (between 0-100)
- * @return M4NO_ERROR: No error, the user must call M4xVSS_Step again
- * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL
- * @return M4ERR_STATE: This function cannot not be called at this time
- * @return M4VSS3GPP_WAR_PREVIEW_READY: Preview file is generated
- * @return M4VSS3GPP_WAR_SAVING_DONE: Final edited file is generated
- * @return M4VSS3GPP_WAR_ANALYZING_DONE: Analyse is done
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_Step( M4OSA_Context pContext, M4OSA_UInt8 *pProgress )
-{
- M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
- M4VSS3GPP_EditContext pVssCtxt = xVSS_context->pCurrentEditContext;
- M4VSS3GPP_AudioMixingContext pAudioMixingCtxt =
- xVSS_context->pAudioMixContext;
- M4OSA_ERR err = M4NO_ERROR;
- M4OSA_UInt8 uiProgress = 0;
-
- switch( xVSS_context->m_state )
- {
- case M4xVSS_kStateSaving:
- //case M4xVSS_kStateGeneratingPreview:
- {
- if( xVSS_context->editingStep
- == M4xVSS_kMicroStateEditing ) /* VSS -> creating effects, transitions ... */
- {
- /* RC: to delete unecessary temp files on the fly */
- M4VSS3GPP_InternalEditContext *pVSSContext =
- (M4VSS3GPP_InternalEditContext *)pVssCtxt;
-
- err = M4VSS3GPP_editStep(pVssCtxt, &uiProgress);
-
- if( ( err != M4NO_ERROR) && (err != M4VSS3GPP_WAR_EDITING_DONE)
- && (err != M4VSS3GPP_WAR_SWITCH_CLIP) )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_Step: M4VSS3GPP_editStep returned 0x%x\n", err);
- M4VSS3GPP_editCleanUp(pVssCtxt);
- /* TODO ? : Translate error code of VSS to an xVSS error code ? */
- xVSS_context->pCurrentEditContext = M4OSA_NULL;
- return err;
- }
-
- /* RC: to delete unecessary temp files on the fly */
- if( err == M4VSS3GPP_WAR_SWITCH_CLIP )
- {
-#ifndef DO_NOT_REMOVE_TEMP_FILES
- /* It means we can delete the temporary file */
- /* First step, check the temp file is not use somewhere else after */
-
- M4OSA_UInt32 i;
- M4OSA_Int32 cmpResult = -1;
-
- for ( i = pVSSContext->uiCurrentClip;
- i < pVSSContext->uiClipNumber; i++ )
- {
- if( pVSSContext->pClipList[pVSSContext->uiCurrentClip
- - 1].filePathSize
- == pVSSContext->pClipList[i].filePathSize )
- {
- cmpResult = memcmp((void *)pVSSContext->
- pClipList[pVSSContext->uiCurrentClip
- - 1].pFile, (void *)pVSSContext->pClipList[i].pFile,
- pVSSContext->
- pClipList[pVSSContext->uiCurrentClip
- - 1].filePathSize);
-
- if( cmpResult == 0 )
- {
- /* It means we found a corresponding file, we do not delete
- this temporary file */
- break;
- }
- }
- }
-
- if( cmpResult != 0 )
- {
- M4OSA_UInt32 ConvertedSize = 0;
- M4OSA_Char *toto;
- M4OSA_Char *pTmpStr;
-
- /* Convert result in UTF8 to check if we can delete it or not */
- if( xVSS_context->UTFConversionContext.pConvToUTF8Fct
- != M4OSA_NULL && xVSS_context->
- UTFConversionContext.
- pTempOutConversionBuffer != M4OSA_NULL )
- {
- M4xVSS_internalConvertToUTF8(xVSS_context,
- (M4OSA_Void *)pVSSContext->
- pClipList[pVSSContext->uiCurrentClip
- - 1].pFile, (M4OSA_Void *)xVSS_context->
- UTFConversionContext.
- pTempOutConversionBuffer, &ConvertedSize);
- toto = (M4OSA_Char *)strstr((const char *)xVSS_context->
- UTFConversionContext.
- pTempOutConversionBuffer,
- (const char *)xVSS_context->pTempPath);
- pTmpStr =
- xVSS_context->UTFConversionContext.
- pTempOutConversionBuffer;
- }
- else
- {
- toto = (M4OSA_Char *)strstr((const char *)pVSSContext->
- pClipList[pVSSContext->uiCurrentClip
- - 1].pFile, (const char *)xVSS_context->pTempPath);
- pTmpStr = pVSSContext->
- pClipList[pVSSContext->uiCurrentClip
- - 1].pFile;
- }
-
- if( toto != M4OSA_NULL )
- {
- /* As temporary files can be imgXXX.3gp or vidXXX.3gp */
- pTmpStr +=
- (strlen((const char *)pTmpStr)
- - 10); /* Because temporary files have a length at most of
- 10 bytes */
- toto = (M4OSA_Char *)strstr((const char *)pTmpStr,
- (const char *)"img");
-
- if( toto != M4OSA_NULL )
- {
- toto = (M4OSA_Char *)strstr((const char *)pTmpStr,
- (const char *)"vid");
- }
-
- if( err
- == M4NO_ERROR ) /* It means the file is a temporary file, we
- can delete it */
- {
- remove((const char *)pVSSContext->
- pClipList[pVSSContext->uiCurrentClip
- - 1].pFile);
- }
- }
- }
-
-#endif /* DO_NOT_REMOVE_TEMP_FILES*/
- /* */
-
- err = M4NO_ERROR;
- }
-
- if( err == M4VSS3GPP_WAR_EDITING_DONE )
- {
- xVSS_context->currentStep++;
- /* P4ME00003276: When a step is complete, increment currentStep and reset
- uiProgress unless progress would be wrong */
- uiProgress = 0;
- err = M4xVSS_internalCloseEditedFile(xVSS_context);
- /* Fix for blrnxpsw#234---> */
- if( err != M4NO_ERROR )
- {
- if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) )
- {
- err = M4xVSSERR_NO_MORE_SPACE;
- }
- M4OSA_TRACE1_1(
- "M4xVSS_internalCloseEditedFile returned an error: 0x%x",
- err);
- return err;
- }
- /*<---- Fix for blrnxpsw#234 */
- if( xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack
- != M4OSA_NULL )
- {
- xVSS_context->editingStep =
- M4xVSS_kMicroStateAudioMixing;
- /* Open Audio mixing component */
- err = M4xVSS_internalGenerateAudioMixFile(xVSS_context);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_internalGenerateAudioMixFile returned an error: 0x%x",
- err);
- /* TODO ? : Translate error code of VSS to an xVSS error code */
- return err;
- }
- err = M4NO_ERROR;
- goto end_step;
- }
- else
- {
-
- err = M4VSS3GPP_WAR_SAVING_DONE;
- goto end_step;
-
- }
- }
- }
- else if( xVSS_context->editingStep
- == M4xVSS_kMicroStateAudioMixing ) /* Audio mixing: mix/replace audio track
- with given BGM */
- {
- err = M4VSS3GPP_audioMixingStep(pAudioMixingCtxt, &uiProgress);
-
- if( ( err != M4NO_ERROR)
- && (err != M4VSS3GPP_WAR_END_OF_AUDIO_MIXING) )
- {
- M4OSA_TRACE1_1(
- "M4VSS3GPP_audioMixingMain: M4VSS3GPP_audioMixingStep returned 0x%x\n",
- err);
- /* TODO ? : Translate error code of VSS to an xVSS error code */
- return err;
- }
-
- if( err == M4VSS3GPP_WAR_END_OF_AUDIO_MIXING )
- {
- xVSS_context->currentStep++;
- /* P4ME00003276: When a step is complete, increment currentStep and reset
- uiProgress unless progress would be wrong */
- uiProgress = 0;
- err = M4xVSS_internalCloseAudioMixedFile(xVSS_context);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1(
- "M4xVSS_internalCloseAudioMixedFile returned an error: 0x%x",
- err);
- /* TODO ? : Translate error code of VSS to an xVSS error code */
- return err;
- }
-
- err = M4VSS3GPP_WAR_SAVING_DONE;
- goto end_step;
-
- }
- }
- else
- {
- M4OSA_TRACE1_0("Bad state in step function !");
- return M4ERR_STATE;
- }
- }
- break;
-
- case M4xVSS_kStateAnalyzing:
- {
- if( xVSS_context->analyseStep
- == M4xVSS_kMicroStateAnalysePto3GPP ) /* Pto3GPP, analysing input parameters */
- {
- if( xVSS_context->pPTo3GPPcurrentParams == M4OSA_NULL
- && xVSS_context->pPTo3GPPparamsList != M4OSA_NULL )
- {
- xVSS_context->pPTo3GPPcurrentParams =
- xVSS_context->
- pPTo3GPPparamsList; /* Current Pto3GPP Parameter is the first element
- of the list */
- }
- else if( xVSS_context->pPTo3GPPcurrentParams != M4OSA_NULL
- && xVSS_context->pPTo3GPPparamsList != M4OSA_NULL )
- {
- xVSS_context->pPTo3GPPcurrentParams =
- xVSS_context->pPTo3GPPcurrentParams->
- pNext; /* Current Pto3GPP Parameter is the next element of the list */
-
- if( xVSS_context->pPTo3GPPcurrentParams
- == M4OSA_NULL ) /* It means there is no next image to convert */
- {
- /* We step to MCS phase */
- xVSS_context->analyseStep =
- M4xVSS_kMicroStateAnalyzeMCS;
- err = M4NO_ERROR;
- goto end_step;
- }
- }
- else if( xVSS_context->pPTo3GPPparamsList == M4OSA_NULL )
- {
- xVSS_context->analyseStep =
- M4xVSS_kMicroStateAnalyzeMCS; /* Change Analyzing micro state to
- MCS phase */
- err = M4NO_ERROR;
- goto end_step;
- }
-
- /* Check if this file has to be converted or not */
- /* If not, we just return M4NO_ERROR, and go to next file */
- if( xVSS_context->pPTo3GPPcurrentParams->isCreated
- == M4OSA_FALSE )
- {
- /* Opening Pto3GPP */
- err = M4xVSS_internalStartConvertPictureTo3gp(xVSS_context);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1("M4xVSS_Step: M4xVSS_internalStartConvertPictureTo3gp \
- returned error: 0x%x",
- err)
- /* TODO ? : Translate error code of VSS to an xVSS error code */
- return err;
- }
- xVSS_context->analyseStep =
- M4xVSS_kMicroStateConvertPto3GPP;
- }
- }
- else if( xVSS_context->analyseStep
- == M4xVSS_kMicroStateConvertPto3GPP ) /* Pto3GPP, converting */
- {
- err = M4PTO3GPP_Step(xVSS_context->pM4PTO3GPP_Ctxt);
- /* update progress bar */
- if(xVSS_context->pCallBackCtxt->m_NbImage > 1)
- {
- uiProgress = (xVSS_context->pCallBackCtxt->m_ImageCounter * 100) / (xVSS_context->pCallBackCtxt->m_NbImage -1);
- }
-
- if( ( err != M4NO_ERROR) && (err
- != ((M4OSA_UInt32)M4PTO3GPP_WAR_END_OF_PROCESSING)) )
- {
- /* TO BE CHECKED NO LEAKS !!!!! */
- M4OSA_TRACE1_1(
- "M4xVSS_Step: M4PTO3GPP_Step returned 0x%x\n", err);
- /* TODO ? : Translate error code of VSS to an xVSS error code */
- return err;
- }
- else if( err
- == ((M4OSA_UInt32)M4PTO3GPP_WAR_END_OF_PROCESSING) )
- {
- xVSS_context->currentStep++;
- /* P4ME00003276: When a step is complete, increment currentStep and reset
- uiProgress unless progress would be wrong */
- uiProgress = 0;
- xVSS_context->analyseStep =
- M4xVSS_kMicroStateAnalysePto3GPP; /* We go back to analyze parameters
- to see if there is a next file to convert */
- /* RC !!!!!!!! */
- xVSS_context->pPTo3GPPcurrentParams->isCreated =
- M4OSA_TRUE; /* To avoid reconverting it if another SendCommand is
- called */
- err = M4xVSS_internalStopConvertPictureTo3gp(xVSS_context);
- /*SS:blrnxpsw# 234 */
- if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) )
- {
- err = M4xVSSERR_NO_MORE_SPACE;
- }
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1("M4xVSS_Step:\
- M4xVSS_internalStopConvertPictureTo3gp returned 0x%x",
- err);
- /* TODO ? : Translate error code of VSS to an xVSS error code */
- return err;
- }
- }
- }
- else if( xVSS_context->analyseStep
- ==
- M4xVSS_kMicroStateAnalyzeMCS ) /* MCS: analyzing input parameters */
- {
- if( xVSS_context->pMCScurrentParams == M4OSA_NULL \
- && xVSS_context->pMCSparamsList != M4OSA_NULL )
- {
- xVSS_context->pMCScurrentParams = xVSS_context->
- pMCSparamsList; /* Current MCS Parameter is the first
- element of the list */
- }
- else if( xVSS_context->pMCScurrentParams != M4OSA_NULL \
- && xVSS_context->pMCSparamsList != M4OSA_NULL )
- {
- xVSS_context->pMCScurrentParams =
- xVSS_context->pMCScurrentParams->
- pNext; /* Current MCS Parameter
- is the next element of the list */
-
- if( xVSS_context->pMCScurrentParams == M4OSA_NULL )
- /* It means there is no next image to convert */
- {
- xVSS_context->analyseStep =
- M4xVSS_kMicroStateAnalysePto3GPP; /* Reinit Analyzing micro state */
- xVSS_context->m_state =
- M4xVSS_kStateOpened; /* Change xVSS state */
- err = M4VSS3GPP_WAR_ANALYZING_DONE;
- goto end_step; /* End of Analysis */
- }
- }
- else if( xVSS_context->pMCSparamsList == M4OSA_NULL )
- {
- xVSS_context->analyseStep =
- M4xVSS_kMicroStateAnalysePto3GPP; /* Reinit Analyzing micro state */
- xVSS_context->m_state =
- M4xVSS_kStateOpened; /* Change xVSS state */
- err = M4VSS3GPP_WAR_ANALYZING_DONE;
- goto end_step; /* End of Analysis */
- }
-
- /* Check if this file has to be transcoded or not */
- /* If not, we just return M4NO_ERROR, and go to next file */
- if( xVSS_context->pMCScurrentParams->isCreated == M4OSA_FALSE )
- {
- /* Opening MCS */
- M4OSA_UInt32 rotationDegree = 0;
- err = M4xVSS_internalStartTranscoding(xVSS_context, &rotationDegree);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1("M4xVSS_Step: M4xVSS_internalStartTranscoding returned\
- error: 0x%x", err);
- return err;
- }
- int32_t index = xVSS_context->pMCScurrentParams->videoclipnumber;
-
- /* The cuts are done in the MCS, so we need to replace
- the beginCutTime and endCutTime to keep the entire video*/
- xVSS_context->pSettings->pClipList[index]->uiBeginCutTime = 0;
- xVSS_context->pSettings->pClipList[index]->uiEndCutTime = 0;
-
-
- M4OSA_TRACE1_1("M4xVSS_Step: \
- M4xVSS_internalStartTranscoding returned \
- success; MCS context: 0x%x",
- xVSS_context->pMCS_Ctxt);
- xVSS_context->analyseStep =
- M4xVSS_kMicroStateTranscodeMCS;
-
- // Retain rotation info of trimmed / transcoded file
- xVSS_context->pSettings->pClipList[index]->\
- ClipProperties.videoRotationDegrees = rotationDegree;
- }
- }
- else if( xVSS_context->analyseStep
- == M4xVSS_kMicroStateTranscodeMCS )
- /* MCS: transcoding file */
- {
- err = M4MCS_step(xVSS_context->pMCS_Ctxt, &uiProgress);
- /*SS:blrnxpsw# 234 */
- if( err == ((M4OSA_UInt32)M4MCS_ERR_NOMORE_SPACE) )
- {
- err = M4xVSSERR_NO_MORE_SPACE;
- }
-
- if( ( err != M4NO_ERROR)
- && (err != M4MCS_WAR_TRANSCODING_DONE) )
- {
- /* TO BE CHECKED NO LEAKS !!!!! */
- M4OSA_TRACE1_1("M4xVSS_Step: M4MCS_step returned 0x%x\n",
- err);
- /* TODO ? : Translate error code of MCS to an xVSS error code ? */
- return err;
- }
- else if( err == M4MCS_WAR_TRANSCODING_DONE )
- {
- xVSS_context->currentStep++;
- /* P4ME00003276: When a step is complete, increment currentStep and reset
- uiProgress unless progress would be wrong */
- uiProgress = 0;
- xVSS_context->analyseStep =
- M4xVSS_kMicroStateAnalyzeMCS; /* We go back to
- analyze parameters to see if there is
- a next file to transcode */
- /* RC !!!!!!!!!*/
- xVSS_context->pMCScurrentParams->isCreated =
- M4OSA_TRUE; /* To avoid
- reconverting it if another SendCommand is called */
- err = M4xVSS_internalStopTranscoding(xVSS_context);
-
- if( err != M4NO_ERROR )
- {
- M4OSA_TRACE1_1("M4xVSS_Step:\
- M4xVSS_internalStopTranscoding returned 0x%x", err);
- /* TODO ? : Translate error code of MCS to an xVSS error code ? */
- return err;
- }
- }
- }
- else
- {
- M4OSA_TRACE1_0("Bad micro state in analyzing state")
- return M4ERR_STATE;
- }
- }
- break;
-
- default:
- M4OSA_TRACE1_1(
- "Bad state when calling M4xVSS_Step function! State is %d",
- xVSS_context->m_state);
- return M4ERR_STATE;
- }
-
-end_step:
- /* Compute progression */
- if( xVSS_context->nbStepTotal != 0 )
- {
- *pProgress = (M4OSA_UInt8)(( ( xVSS_context->currentStep * 100) \
- / (xVSS_context->nbStepTotal))
- + (uiProgress / (xVSS_context->nbStepTotal)));
-
- if( *pProgress > 100 )
- {
- *pProgress = 100;
- }
- }
- else
- {
- *pProgress = 100;
- }
-
- return err;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_CloseCommand(M4OSA_Context pContext)
- * @brief This function deletes current editing profile, unallocate
- * ressources and change xVSS internal state.
- * @note After this function, the user can call a new M4xVSS_SendCommand
- *
- * @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_STATE: This function cannot not be called at this time
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_CloseCommand( M4OSA_Context pContext )
-{
- M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
- M4OSA_ERR err = M4NO_ERROR;
-
- /* Check state */
- /* Depending of the state, differents things have to be done */
- switch( xVSS_context->m_state )
- {
- case M4xVSS_kStateOpened:
- /* Nothing to do here */
- err = M4xVSS_internalFreeSaving(xVSS_context);
- break;
-
- case M4xVSS_kStateSaving:
- {
- if( xVSS_context->editingStep == M4xVSS_kMicroStateEditing )
- {
- err = M4xVSS_internalCloseEditedFile(xVSS_context);
-
- if( err != M4NO_ERROR )
- {
- /* Fix for blrnxpsw#234---->*/
- if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) )
- {
- err = M4xVSSERR_NO_MORE_SPACE;
- }
- M4OSA_TRACE1_1("M4xVSS_CloseCommand:\
- M4xVSS_internalCloseEditedFile returned an error: 0x%x",
- err);
- /* we are retaining error here and returning error in the end of the
- function as to aviod memory leak*/
- //return err;
- }
- }
- else if( xVSS_context->editingStep
- == M4xVSS_kMicroStateAudioMixing )
- {
- err = M4xVSS_internalCloseAudioMixedFile(xVSS_context);
-
- if( err != M4NO_ERROR )
- {
- /* Fix for blrnxpsw#234---->*/
- if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) )
- {
- err = M4xVSSERR_NO_MORE_SPACE;
- }
- M4OSA_TRACE1_1("M4xVSS_CloseCommand: \
- M4xVSS_internalCloseAudioMixedFile returned an error: 0x%x", err);
- /* we are retaining error here and returning error in the end of
- the function as to aviod memory leak*/
- //return err;
- /* <----Fix for blrnxpsw#234*/
- }
- }
- err = M4xVSS_internalFreeSaving(xVSS_context);
- /* We free this pointer only if a BGM track is present, because in that case,
- this pointer owns to us */
- if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL ) {
- /*if(M4OSA_NULL != xVSS_context->pSettings->pOutputFile)
- {
- free(xVSS_context->pSettings->pOutputFile);
- xVSS_context->pSettings->pOutputFile = M4OSA_NULL;
- }*/
- /*if(M4OSA_NULL != xVSS_context->pSettings->pTemporaryFile)
- {
- free(xVSS_context->pSettings->pTemporaryFile);
- xVSS_context->pSettings->pTemporaryFile = M4OSA_NULL;
- }*/
- }
- }
- break;
-
- case M4xVSS_kStateSaved:
- break;
-
- case M4xVSS_kStateAnalyzing:
- {
- if( xVSS_context->analyseStep == M4xVSS_kMicroStateConvertPto3GPP )
- {
- /* Free Pto3GPP module */
- err = M4xVSS_internalStopConvertPictureTo3gp(xVSS_context);
- /* Fix for blrnxpsw#234---->*/
- if( err != M4NO_ERROR )
- {
- if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) )
- {
- err = M4xVSSERR_NO_MORE_SPACE;
- }
- M4OSA_TRACE1_1("M4xVSS_Step: \
- M4xVSS_internalStopConvertPictureTo3gp returned 0x%x", err);
- /* we are retaining error here and returning error in the end of the
- function as to aviod memory leak*/
- //return err;
- }
- /* <-----Fix for blrnxpsw#234>*/
- }
- else if( xVSS_context->analyseStep
- == M4xVSS_kMicroStateTranscodeMCS )
- {
- /* Free MCS module */
- err = M4MCS_abort(xVSS_context->pMCS_Ctxt);
- /* Fix for blrnxpsw#234---->*/
- if( err != M4NO_ERROR )
- {
- if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) )
- {
- err = M4xVSSERR_NO_MORE_SPACE;
- }
- M4OSA_TRACE1_1("M4xVSS_Step: M4MCS_abort returned 0x%x",
- err);
- /* we are retaining error here and returning error in the end of the
- function as to aviod memory leak*/
- //return err;
- }
- /* <---Fix for blrnxpsw#234*/
- }
- }
- break;
-
- default:
- M4OSA_TRACE1_1(
- "Bad state when calling M4xVSS_CloseCommand function! State is %d",
- xVSS_context->m_state);
- return M4ERR_STATE;
- }
-
- /* Free Send command */
- M4xVSS_freeCommand(xVSS_context);
-
- xVSS_context->m_state = M4xVSS_kStateInitialized; /* Change xVSS state */
-
- return err;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_CleanUp(M4OSA_Context pContext)
- * @brief This function deletes all xVSS ressources
- * @note This function must be called after M4xVSS_CloseCommand.
- *
- * @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_STATE: This function cannot not be called at this time
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_CleanUp( M4OSA_Context pContext )
-{
- M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
- M4OSA_TRACE3_0("M4xVSS_CleanUp:entering");
-
- /* Check state */
- if( xVSS_context->m_state != M4xVSS_kStateInitialized )
- {
- M4OSA_TRACE1_1(\
- "Bad state when calling M4xVSS_CleanUp function! State is %d",\
- xVSS_context->m_state);
- return M4ERR_STATE;
- }
-
- /**
- * UTF conversion: free temporary buffer*/
- if( xVSS_context->UTFConversionContext.pTempOutConversionBuffer
- != M4OSA_NULL )
- {
- free(xVSS_context->
- UTFConversionContext.pTempOutConversionBuffer);
- xVSS_context->UTFConversionContext.pTempOutConversionBuffer =
- M4OSA_NULL;
- }
-
- free(xVSS_context->pTempPath);
- xVSS_context->pTempPath = M4OSA_NULL;
-
- free(xVSS_context->pSettings);
- xVSS_context->pSettings = M4OSA_NULL;
-
- free(xVSS_context);
- xVSS_context = M4OSA_NULL;
- M4OSA_TRACE3_0("M4xVSS_CleanUp:leaving ");
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4xVSS_GetVersion(M4_VersionInfo *pVersion)
- * @brief This function get the version of the Video Studio 2.1
- *
- * @param pVersion (IN) Pointer on the version info struct
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_GetVersion( M4_VersionInfo *pVersion )
-{
- /* Just used for a grep in code */
- /* CHANGE_VERSION_HERE */
- static const M4OSA_Char cVersion[26] = "NXPSW_VideoStudio21_1_3_0";
-
- if( M4OSA_NULL == pVersion )
- {
- return M4ERR_PARAMETER;
- }
-
- pVersion->m_major = M4_xVSS_MAJOR;
- pVersion->m_minor = M4_xVSS_MINOR;
- pVersion->m_revision = M4_xVSS_REVISION;
- pVersion->m_structSize = sizeof(M4_VersionInfo);
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * M4OSA_ERR M4xVSS_CreateClipSettings()
- * @brief Allows filling a clip settings structure with default values
- *
- * @note WARNING: pClipSettings->Effects[ ] will be allocated in this function.
- * pClipSettings->pFile will be allocated in this function.
- *
- * @param pClipSettings (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
- * @param pFile (IN) Clip file name
- * @param filePathSize (IN) Size of the clip path (needed for the UTF16 conversion)
- * @param nbEffects (IN) Nb of effect settings to allocate
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: pClipSettings is M4OSA_NULL (debug only)
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_CreateClipSettings( M4VSS3GPP_ClipSettings *pClipSettings,
- M4OSA_Void *pFile, M4OSA_UInt32 filePathSize,
- M4OSA_UInt8 nbEffects )
-{
- M4OSA_ERR err = M4NO_ERROR;
-
- M4OSA_TRACE3_1("M4xVSS_CreateClipSettings called with pClipSettings=0x%p",
- pClipSettings);
-
- /**
- * Check input parameter */
- M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettings), M4ERR_PARAMETER,
- "M4xVSS_CreateClipSettings: pClipSettings is NULL");
-
- /* Create inherited VSS3GPP stuff */
- /*err = M4VSS3GPP_editCreateClipSettings(pClipSettings, pFile,nbEffects);*/
- /*FB: add clip path size (needed for UTF 16 conversion)*/
- err = M4VSS3GPP_editCreateClipSettings(pClipSettings, pFile, filePathSize,
- nbEffects);
-
- if( M4NO_ERROR != err )
- {
- M4OSA_TRACE1_1("M4xVSS_CreateClipSettings :\
- ERROR in M4VSS3GPP_editCreateClipSettings = 0x%x", err);
- return err;
- }
-
- /* Set the clip settings to default */
- pClipSettings->xVSS.uiBeginCutPercent = 0;
- pClipSettings->xVSS.uiEndCutPercent = 0;
- pClipSettings->xVSS.uiDuration = 0;
- pClipSettings->xVSS.isPanZoom = M4OSA_FALSE;
- pClipSettings->xVSS.PanZoomTopleftXa = 0;
- pClipSettings->xVSS.PanZoomTopleftYa = 0;
- pClipSettings->xVSS.PanZoomTopleftXb = 0;
- pClipSettings->xVSS.PanZoomTopleftYb = 0;
- pClipSettings->xVSS.PanZoomXa = 0;
- pClipSettings->xVSS.PanZoomXb = 0;
-
- /**
- * Return with no error */
- M4OSA_TRACE3_0("M4xVSS_CreateClipSettings(): returning M4NO_ERROR");
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * M4OSA_ERR M4xVSS_DuplicateClipSettings()
- * @brief Duplicates a clip settings structure, performing allocations if required
- *
- * @param pClipSettingsDest (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
- * @param pClipSettingsOrig (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
- * @param bCopyEffects (IN) Flag to know if we have to duplicate effects
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: pClipSettings is M4OSA_NULL (debug only)
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_DuplicateClipSettings( M4VSS3GPP_ClipSettings
- *pClipSettingsDest,
- M4VSS3GPP_ClipSettings *pClipSettingsOrig,
- M4OSA_Bool bCopyEffects )
-{
- M4OSA_ERR err = M4NO_ERROR;
-
- M4OSA_TRACE3_2(
- "M4xVSS_DuplicateClipSettings called with dest=0x%p src=0x%p",
- pClipSettingsDest, pClipSettingsOrig);
-
- /* Check input parameter */
- M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettingsDest), M4ERR_PARAMETER,
- "M4xVSS_DuplicateClipSettings: pClipSettingsDest is NULL");
- M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettingsOrig), M4ERR_PARAMETER,
- "M4xVSS_DuplicateClipSettings: pClipSettingsOrig is NULL");
-
- /* Call inherited VSS3GPP duplication */
- err = M4VSS3GPP_editDuplicateClipSettings(pClipSettingsDest,
- pClipSettingsOrig, bCopyEffects);
-
- if( M4NO_ERROR != err )
- {
- M4OSA_TRACE1_1("M4xVSS_CreateClipSettings :\
- ERROR in M4VSS3GPP_editDuplicateClipSettings = 0x%x", err);
- return err;
- }
-
- /* Return with no error */
- M4OSA_TRACE3_0("M4xVSS_DuplicateClipSettings(): returning M4NO_ERROR");
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * M4OSA_ERR M4xVSS_FreeClipSettings()
- * @brief Free the pointers allocated in the ClipSetting structure (pFile, Effects, ...).
- *
- * @param pClipSettings (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: pClipSettings is M4OSA_NULL (debug only)
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_FreeClipSettings( M4VSS3GPP_ClipSettings *pClipSettings )
-{
- /**
- * Check input parameter */
- M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettings), M4ERR_PARAMETER,
- "M4xVSS_FreeClipSettings: pClipSettings is NULL");
-
- /* Free inherited VSS3GPP stuff */
- M4VSS3GPP_editFreeClipSettings(pClipSettings);
-
- return M4NO_ERROR;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_getMCSContext(M4OSA_Context pContext, M4OSA_Context* mcsContext)
- * @brief This function returns the MCS context within the xVSS internal context
- * @note This function must be called only after VSS state has moved to analyzing state or
- * beyond
- *
- * @param pContext (IN) Pointer on the xVSS edit context
- * @param mcsContext (OUT) Pointer to pointer of mcs context to return
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL
- * @return M4ERR_STATE: This function cannot not be called at this time
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_getMCSContext( M4OSA_Context pContext,
- M4OSA_Context *mcsContext )
-{
- M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
- M4OSA_ERR err = M4NO_ERROR;
-
- /**
- * Check input parameter */
- M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
- "M4xVSS_getMCSContext: pContext is NULL");
-
- if( xVSS_context->m_state == M4xVSS_kStateInitialized )
- {
- M4OSA_TRACE1_1("M4xVSS_getMCSContext: Bad state! State is %d",\
- xVSS_context->m_state);
- return M4ERR_STATE;
- }
-
- *mcsContext = xVSS_context->pMCS_Ctxt;
-
- return err;
-}
-
-/**
- ******************************************************************************
- * prototype M4OSA_ERR M4xVSS_getVSS3GPPContext(M4OSA_Context pContext,
- * M4OSA_Context* mcsContext)
- * @brief This function returns the VSS3GPP context within the xVSS internal context
- * @note This function must be called only after VSS state has moved to Generating preview
- * or beyond
- * @param pContext (IN) Pointer on the xVSS edit context
- * @param vss3gppContext (OUT) Pointer to pointer of vss3gpp context to return
- * @return M4NO_ERROR: No error
- * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL
- * @return M4ERR_STATE: This function cannot not be called at this time
- ******************************************************************************
- */
-M4OSA_ERR M4xVSS_getVSS3GPPContext( M4OSA_Context pContext,
- M4OSA_Context *vss3gppContext )
-{
- M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
- M4OSA_ERR err = M4NO_ERROR;
-
- /**
- * Check input parameter */
- M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
- "M4xVSS_getVSS3GPPContext: pContext is NULL");
-
- if( xVSS_context->m_state < M4xVSS_kStateSaving )
- {
- M4OSA_TRACE1_1("M4xVSS_getVSS3GPPContext: Bad state! State is %d",\
- xVSS_context->m_state);
- return M4ERR_STATE;
- }
-
- *vss3gppContext = xVSS_context->pCurrentEditContext;
-
- return err;
-}
-
-M4OSA_ERR M4xVSS_getVideoDecoderCapabilities(M4DECODER_VideoDecoders **decoders) {
- M4OSA_ERR err = M4NO_ERROR;
-
- // Call the decoder api directly
- // to get all the video decoder capablities.
- err = VideoEditorVideoDecoder_getVideoDecodersAndCapabilities(decoders);
- return err;
-}