Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 /**
     17  ******************************************************************************
     18  * @file    M4xVSS_API.c
     19  * @brief    API of eXtended Video Studio Service (Video Studio 2.1)
     20  * @note
     21  ******************************************************************************
     22  */
     23 
     24 /**
     25  * OSAL main types and errors ***/
     26 #include "M4OSA_Types.h"
     27 #include "M4OSA_Error.h"
     28 #include "M4OSA_Memory.h"
     29 #include "M4OSA_Debug.h"
     30 #include "M4OSA_FileReader.h"
     31 #include "M4OSA_FileWriter.h"
     32 #include "M4OSA_CoreID.h"
     33 #include "M4OSA_CharStar.h"
     34 // StageFright encoders require %16 resolution
     35 #include "M4ENCODER_common.h"
     36 #include "M4DECODER_Common.h"
     37 #include "VideoEditorVideoDecoder.h"
     38 
     39 /**
     40  * VSS 3GPP API definition */
     41 #include "M4VSS3GPP_ErrorCodes.h"
     42 
     43 /*************************
     44 Begin of xVSS API
     45  **************************/
     46 
     47 #include "M4xVSS_API.h"
     48 #include "M4xVSS_Internal.h"
     49 
     50 /* RC: to delete unecessary temp files on the fly */
     51 #include "M4VSS3GPP_InternalTypes.h"
     52 #include <utils/Log.h>
     53 
     54 /**
     55  ******************************************************************************
     56  * prototype    M4OSA_ERR M4xVSS_Init(M4OSA_Context* pContext, M4xVSS_InitParams* pParams)
     57  * @brief        This function initializes the xVSS
     58  * @note        Initializes the xVSS edit operation (allocates an execution context).
     59  *
     60  * @param    pContext            (OUT) Pointer on the xVSS edit context to allocate
     61  * @param    params                (IN) Parameters mandatory for xVSS
     62  * @return    M4NO_ERROR:            No error
     63  * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
     64  * @return    M4ERR_ALLOC:        Memory allocation has failed
     65  ******************************************************************************
     66  */
     67 
     68 M4OSA_ERR M4xVSS_Init( M4OSA_Context *pContext, M4xVSS_InitParams *pParams )
     69 {
     70     M4xVSS_Context *xVSS_context;
     71     M4OSA_UInt32 length = 0, i;
     72 
     73     if( pParams == M4OSA_NULL )
     74     {
     75         M4OSA_TRACE1_0("Parameter structure for M4xVSS_Init function is NULL");
     76         return M4ERR_PARAMETER;
     77     }
     78 
     79     if( pParams->pFileReadPtr == M4OSA_NULL
     80         || pParams->pFileWritePtr == M4OSA_NULL )
     81     {
     82         M4OSA_TRACE1_0(
     83             "pFileReadPtr or pFileWritePtr in M4xVSS_InitParams structure is NULL");
     84         return M4ERR_PARAMETER;
     85     }
     86 
     87     xVSS_context = (M4xVSS_Context *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_Context), M4VS,
     88         (M4OSA_Char *)"Context of the xVSS layer");
     89 
     90     if( xVSS_context == M4OSA_NULL )
     91     {
     92         M4OSA_TRACE1_0("Allocation error in M4xVSS_Init");
     93         return M4ERR_ALLOC;
     94     }
     95 
     96     /* Initialize file read/write functions pointers */
     97     xVSS_context->pFileReadPtr = pParams->pFileReadPtr;
     98     xVSS_context->pFileWritePtr = pParams->pFileWritePtr;
     99 
    100     /*UTF Conversion support: copy conversion functions pointers and allocate the temporary
    101      buffer*/
    102     if( pParams->pConvFromUTF8Fct != M4OSA_NULL )
    103     {
    104         if( pParams->pConvToUTF8Fct != M4OSA_NULL )
    105         {
    106             xVSS_context->UTFConversionContext.pConvFromUTF8Fct =
    107                 pParams->pConvFromUTF8Fct;
    108             xVSS_context->UTFConversionContext.pConvToUTF8Fct =
    109                 pParams->pConvToUTF8Fct;
    110             xVSS_context->UTFConversionContext.m_TempOutConversionSize =
    111                 UTF_CONVERSION_BUFFER_SIZE;
    112             xVSS_context->UTFConversionContext.pTempOutConversionBuffer =
    113                 (M4OSA_Void *)M4OSA_32bitAlignedMalloc(UTF_CONVERSION_BUFFER_SIZE
    114                 * sizeof(M4OSA_UInt8),
    115                 M4VA, (M4OSA_Char *)"M4xVSS_Init: UTF conversion buffer");
    116 
    117             if( M4OSA_NULL
    118                 == xVSS_context->UTFConversionContext.pTempOutConversionBuffer )
    119             {
    120                 M4OSA_TRACE1_0("Allocation error in M4xVSS_Init");
    121                 free(xVSS_context->pTempPath);
    122                 xVSS_context->pTempPath = M4OSA_NULL;
    123                 free(xVSS_context);
    124                 xVSS_context = M4OSA_NULL;
    125                 return M4ERR_ALLOC;
    126             }
    127         }
    128         else
    129         {
    130             M4OSA_TRACE1_0("M4xVSS_Init: one UTF conversion pointer is null and the other\
    131                            is not null");
    132             free(xVSS_context->pTempPath);
    133             xVSS_context->pTempPath = M4OSA_NULL;
    134             free(xVSS_context);
    135             xVSS_context = M4OSA_NULL;
    136             return M4ERR_PARAMETER;
    137         }
    138     }
    139     else
    140     {
    141         xVSS_context->UTFConversionContext.pConvFromUTF8Fct = M4OSA_NULL;
    142         xVSS_context->UTFConversionContext.pConvToUTF8Fct = M4OSA_NULL;
    143         xVSS_context->UTFConversionContext.m_TempOutConversionSize = 0;
    144         xVSS_context->UTFConversionContext.pTempOutConversionBuffer =
    145             M4OSA_NULL;
    146     }
    147 
    148     if( pParams->pTempPath != M4OSA_NULL )
    149     {
    150         /*No need to convert into UTF8 as all input of xVSS are in UTF8
    151         (the conversion customer format into UTF8
    152         is done in VA/VAL)*/
    153         xVSS_context->pTempPath =
    154             (M4OSA_Void *)M4OSA_32bitAlignedMalloc(strlen(pParams->pTempPath) + 1,
    155             M4VS, (M4OSA_Char *)"xVSS Path for temporary files");
    156 
    157         if( xVSS_context->pTempPath == M4OSA_NULL )
    158         {
    159             M4OSA_TRACE1_0("Allocation error in M4xVSS_Init");
    160             return M4ERR_ALLOC;
    161         }
    162         memcpy((void *)xVSS_context->pTempPath, (void *)pParams->pTempPath,
    163             strlen(pParams->pTempPath) + 1);
    164         /* TODO: Check that no previous xVSS temporary files are present ? */
    165     }
    166     else
    167     {
    168         M4OSA_TRACE1_0("Path for temporary files is NULL");
    169         free(xVSS_context);
    170         xVSS_context = M4OSA_NULL;
    171         return M4ERR_PARAMETER;
    172     }
    173 
    174     xVSS_context->pSettings =
    175         (M4VSS3GPP_EditSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_EditSettings),
    176         M4VS, (M4OSA_Char *)"Copy of VSS structure");
    177 
    178     if( xVSS_context->pSettings == M4OSA_NULL )
    179     {
    180         M4OSA_TRACE1_0("Allocation error in M4xVSS_Init");
    181         free(xVSS_context->pTempPath);
    182         xVSS_context->pTempPath = M4OSA_NULL;
    183         free(xVSS_context);
    184         xVSS_context = M4OSA_NULL;
    185         return M4ERR_ALLOC;
    186     }
    187 
    188     /* Initialize pointers in pSettings */
    189     xVSS_context->pSettings->pClipList = M4OSA_NULL;
    190     xVSS_context->pSettings->pTransitionList = M4OSA_NULL;
    191     xVSS_context->pSettings->Effects = M4OSA_NULL; /* RC */
    192     xVSS_context->pSettings->xVSS.pBGMtrack = M4OSA_NULL;
    193 
    194     /* This is used to know if the user has added or removed some medias */
    195     xVSS_context->previousClipNumber = 0;
    196 
    197     /* "State machine" */
    198     xVSS_context->editingStep = 0;
    199     xVSS_context->analyseStep = 0;
    200 
    201     xVSS_context->pcmPreviewFile = M4OSA_NULL;
    202 
    203     /* Initialize Pto3GPP and MCS lists */
    204     xVSS_context->pMCSparamsList = M4OSA_NULL;
    205     xVSS_context->pPTo3GPPparamsList = M4OSA_NULL;
    206     xVSS_context->pPTo3GPPcurrentParams = M4OSA_NULL;
    207     xVSS_context->pMCScurrentParams = M4OSA_NULL;
    208 
    209     xVSS_context->tempFileIndex = 0;
    210 
    211     xVSS_context->targetedBitrate = 0;
    212 
    213     xVSS_context->targetedTimescale = 0;
    214 
    215     xVSS_context->pAudioMixContext = M4OSA_NULL;
    216     xVSS_context->pAudioMixSettings = M4OSA_NULL;
    217 
    218     /*FB: initialize to avoid crash when error during the editing*/
    219     xVSS_context->pCurrentEditSettings = M4OSA_NULL;
    220 
    221     /* Initialize state if all initializations are corrects */
    222     xVSS_context->m_state = M4xVSS_kStateInitialized;
    223 
    224     /* initialize MCS context*/
    225     xVSS_context->pMCS_Ctxt = M4OSA_NULL;
    226 
    227     *pContext = xVSS_context;
    228 
    229     return M4NO_ERROR;
    230 }
    231 
    232 /**
    233  ******************************************************************************
    234  * prototype    M4xVSS_ReduceTranscode
    235  * @brief        This function changes the given editing structure in order to
    236  *                minimize the transcoding time.
    237  * @note        The xVSS analyses this structure, and if needed, changes the
    238  *                output parameters (Video codec, video size, audio codec,
    239  *                audio nb of channels) to minimize the transcoding time.
    240  *
    241  * @param    pContext            (OUT) Pointer on the xVSS edit context to allocate
    242  * @param    pSettings            (IN) Edition settings (allocated by the user)
    243  * @return    M4NO_ERROR:            No error
    244  * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
    245  * @return    M4ERR_ALLOC:        Memory allocation has failed
    246  * @return    M4ERR_STATE:        This function cannot not be called at this time
    247  ******************************************************************************
    248  */
    249 M4OSA_ERR M4xVSS_ReduceTranscode( M4OSA_Context pContext,
    250                                  M4VSS3GPP_EditSettings *pSettings )
    251 {
    252     M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
    253     M4OSA_ERR err = M4NO_ERROR;
    254     M4VIDEOEDITING_ClipProperties fileProperties;
    255     M4OSA_UInt8 i, j;
    256     M4OSA_Bool bAudioTransition = M4OSA_FALSE;
    257     M4OSA_Bool bIsBGMReplace = M4OSA_FALSE;
    258     M4OSA_Bool bFound;
    259     M4OSA_UInt32 videoConfig[9] =
    260     {
    261         0, 0, 0, 0, 0, 0, 0, 0, 0
    262     };
    263     /** Index <-> Video config **/
    264     /* 0:        H263  SQCIF        */
    265     /* 1:        H263  QCIF        */
    266     /* 2:        H263  CIF        */
    267     /* 3:        MPEG4 SQCIF        */
    268     /* 4:        MPEG4 QQVGA        */
    269     /* 5:        MPEG4 QCIF        */
    270     /* 6:        MPEG4 QVGA        */
    271     /* 7:        MPEG4 CIF        */
    272     /* 8:        MPEG4 VGA        */
    273     /****************************/
    274     M4OSA_UInt32 audioConfig[3] =
    275     {
    276         0, 0, 0
    277     };
    278     /** Index <-> Audio config **/
    279     /* 0:    AMR                    */
    280     /* 1:    AAC    16kHz mono        */
    281     /* 2:    AAC 16kHz stereo    */
    282     /****************************/
    283 
    284     /* Check state */
    285     if( xVSS_context->m_state != M4xVSS_kStateInitialized \
    286         && xVSS_context->m_state != M4xVSS_kStateOpened )
    287     {
    288         M4OSA_TRACE1_1(
    289             "Bad state when calling M4xVSS_ReduceTranscode function! State is %d",
    290             xVSS_context->m_state);
    291         return M4ERR_STATE;
    292     }
    293 
    294     /* Check number of clips */
    295     if( pSettings->uiClipNumber == 0 )
    296     {
    297         M4OSA_TRACE1_0("The number of input clip must be greater than 0 !");
    298         return M4ERR_PARAMETER;
    299     }
    300 
    301     /* Check if there is a background music, and if its audio will replace input clip audio */
    302     if( pSettings->xVSS.pBGMtrack != M4OSA_NULL )
    303     {
    304         if( pSettings->xVSS.pBGMtrack->uiAddVolume == 100 )
    305         {
    306             bIsBGMReplace = M4OSA_TRUE;
    307         }
    308     }
    309 
    310     /* Parse all clips, and give occurences of each combination */
    311     for ( i = 0; i < pSettings->uiClipNumber; i++ )
    312     {
    313         /* We ignore JPG input files as they are always transcoded */
    314         if( pSettings->pClipList[i]->FileType == M4VIDEOEDITING_kFileType_3GPP )
    315         {
    316             /**
    317             * UTF conversion: convert into the customer format*/
    318             M4OSA_Void *pDecodedPath = pSettings->pClipList[i]->pFile;
    319             M4OSA_UInt32 ConvertedSize = 0;
    320 
    321             if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
    322                 != M4OSA_NULL && xVSS_context->
    323                 UTFConversionContext.pTempOutConversionBuffer
    324                 != M4OSA_NULL )
    325             {
    326                 err = M4xVSS_internalConvertFromUTF8(xVSS_context,
    327                     (M4OSA_Void *)pSettings->pClipList[i]->pFile,
    328                     (M4OSA_Void *)xVSS_context->
    329                     UTFConversionContext.pTempOutConversionBuffer,
    330                     &ConvertedSize);
    331 
    332                 if( err != M4NO_ERROR )
    333                 {
    334                     M4OSA_TRACE1_1("M4xVSS_ReduceTranscode:\
    335                                    M4xVSS_internalConvertFromUTF8 returns err: 0x%x", err);
    336                     return err;
    337                 }
    338                 pDecodedPath =
    339                     xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
    340             }
    341             /**
    342             * End of the utf conversion, now use the converted path*/
    343             err = M4xVSS_internalGetProperties(xVSS_context, pDecodedPath,
    344                 &fileProperties);
    345 
    346             //err = M4xVSS_internalGetProperties(xVSS_context, pSettings->pClipList[i]->pFile,
    347             //     &fileProperties);
    348             if( err != M4NO_ERROR )
    349             {
    350                 M4OSA_TRACE1_1(
    351                     "M4xVSS_sendCommand: M4xVSS_internalGetProperties returned 0x%x",
    352                     err);
    353                 /* TODO: Translate error code of MCS to an xVSS error code ? */
    354                 return err;
    355             }
    356 
    357             /* Check best video settings */
    358             if( fileProperties.uiVideoWidth == 128
    359                 && fileProperties.uiVideoHeight == 96 )
    360             {
    361                 if( fileProperties.VideoStreamType == M4VIDEOEDITING_kH263 )
    362                 {
    363                     videoConfig[0] += fileProperties.uiClipVideoDuration;
    364                 }
    365                 else if( ( fileProperties.VideoStreamType
    366                     == M4VIDEOEDITING_kMPEG4) \
    367                     || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) )
    368                 {
    369                     videoConfig[3] += fileProperties.uiClipVideoDuration;
    370                 }
    371             }
    372             else if( fileProperties.uiVideoWidth == 160
    373                 && fileProperties.uiVideoHeight == 120 )
    374             {
    375                 if( ( fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) \
    376                     || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) )
    377                 {
    378                     videoConfig[4] += fileProperties.uiClipVideoDuration;
    379                 }
    380             }
    381             else if( fileProperties.uiVideoWidth == 176
    382                 && fileProperties.uiVideoHeight == 144 )
    383             {
    384                 if( fileProperties.VideoStreamType == M4VIDEOEDITING_kH263 )
    385                 {
    386                     videoConfig[1] += fileProperties.uiClipVideoDuration;
    387                 }
    388                 else if( ( fileProperties.VideoStreamType
    389                     == M4VIDEOEDITING_kMPEG4) \
    390                     || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) )
    391                 {
    392                     videoConfig[5] += fileProperties.uiClipVideoDuration;
    393                 }
    394             }
    395             else if( fileProperties.uiVideoWidth == 320
    396                 && fileProperties.uiVideoHeight == 240 )
    397             {
    398                 if( ( fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) \
    399                     || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) )
    400                 {
    401                     videoConfig[6] += fileProperties.uiClipVideoDuration;
    402                 }
    403             }
    404             else if( fileProperties.uiVideoWidth == 352
    405                 && fileProperties.uiVideoHeight == 288 )
    406             {
    407                 if( fileProperties.VideoStreamType == M4VIDEOEDITING_kH263 )
    408                 {
    409                     videoConfig[2] += fileProperties.uiClipVideoDuration;
    410                 }
    411                 else if( ( fileProperties.VideoStreamType
    412                     == M4VIDEOEDITING_kMPEG4) \
    413                     || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) )
    414                 {
    415                     videoConfig[7] += fileProperties.uiClipVideoDuration;
    416                 }
    417             }
    418             else if( fileProperties.uiVideoWidth == 640
    419                 && fileProperties.uiVideoHeight == 480 )
    420             {
    421                 if( ( fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) \
    422                     || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) )
    423                 {
    424                     videoConfig[8] += fileProperties.uiClipVideoDuration;
    425                 }
    426             }
    427 
    428             /* If there is a BGM that replaces existing audio track, we do not care about
    429             audio track as it will be replaced */
    430             /* If not, we try to minimize audio reencoding */
    431             if( bIsBGMReplace == M4OSA_FALSE )
    432             {
    433                 if( fileProperties.AudioStreamType == M4VIDEOEDITING_kAAC )
    434                 {
    435                     if( fileProperties.uiSamplingFrequency == 16000 && \
    436                         fileProperties.uiNbChannels == 1 )
    437                     {
    438                         audioConfig[1] += fileProperties.uiClipAudioDuration;
    439                     }
    440                     else if( fileProperties.uiSamplingFrequency == 16000 && \
    441                         fileProperties.uiNbChannels == 2 )
    442                     {
    443                         audioConfig[2] += fileProperties.uiClipAudioDuration;
    444                     }
    445                 }
    446                 else if( fileProperties.AudioStreamType
    447                     == M4VIDEOEDITING_kAMR_NB )
    448                 {
    449                     audioConfig[0] += fileProperties.uiClipAudioDuration;
    450                 }
    451             }
    452         }
    453     }
    454 
    455     /* Find best output video format (the most occuring combination) */
    456     j = 0;
    457     bFound = M4OSA_FALSE;
    458 
    459     for ( i = 0; i < 9; i++ )
    460     {
    461         if( videoConfig[i] >= videoConfig[j] )
    462         {
    463             j = i;
    464             bFound = M4OSA_TRUE;
    465         }
    466     }
    467 
    468     if( bFound )
    469     {
    470         switch( j )
    471         {
    472             case 0:
    473                 pSettings->xVSS.outputVideoFormat = M4VIDEOEDITING_kH263;
    474                 pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kSQCIF;
    475                 break;
    476 
    477             case 1:
    478                 pSettings->xVSS.outputVideoFormat = M4VIDEOEDITING_kH263;
    479                 pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kQCIF;
    480                 break;
    481 
    482             case 2:
    483                 pSettings->xVSS.outputVideoFormat = M4VIDEOEDITING_kH263;
    484                 pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kCIF;
    485                 break;
    486 
    487             case 3:
    488                 pSettings->xVSS.outputVideoFormat =
    489                     (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
    490                     ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264;
    491                 pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kSQCIF;
    492                 break;
    493 
    494             case 4:
    495                 pSettings->xVSS.outputVideoFormat =
    496                     (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
    497                     ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264;
    498                 pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kQQVGA;
    499                 break;
    500 
    501             case 5:
    502                 pSettings->xVSS.outputVideoFormat =
    503                     (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
    504                     ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264;
    505                 pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kQCIF;
    506                 break;
    507 
    508             case 6:
    509                 pSettings->xVSS.outputVideoFormat =
    510                     (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
    511                     ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264;
    512                 pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kQVGA;
    513                 break;
    514 
    515             case 7:
    516                 pSettings->xVSS.outputVideoFormat =
    517                     (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
    518                     ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264;
    519                 pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kCIF;
    520                 break;
    521 
    522             case 8:
    523                 pSettings->xVSS.outputVideoFormat =
    524                     (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)
    525                     ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264;
    526                 pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kVGA;
    527                 break;
    528         }
    529     }
    530 
    531     /* Find best output audio format (the most occuring combination) */
    532     j = 0;
    533     bFound = M4OSA_FALSE;
    534 
    535     for ( i = 0; i < 3; i++ )
    536     {
    537         if( audioConfig[i] >= audioConfig[j] )
    538         {
    539             j = i;
    540             bFound = M4OSA_TRUE;
    541         }
    542     }
    543 
    544     if( bFound )
    545     {
    546         switch( j )
    547         {
    548             case 0:
    549                 pSettings->xVSS.outputAudioFormat = M4VIDEOEDITING_kAMR_NB;
    550                 pSettings->xVSS.bAudioMono = M4OSA_TRUE;
    551                 break;
    552 
    553             case 1:
    554                 pSettings->xVSS.outputAudioFormat = M4VIDEOEDITING_kAAC;
    555                 pSettings->xVSS.bAudioMono = M4OSA_TRUE;
    556                 break;
    557 
    558             case 2:
    559                 pSettings->xVSS.outputAudioFormat = M4VIDEOEDITING_kAAC;
    560                 pSettings->xVSS.bAudioMono = M4OSA_FALSE;
    561                 break;
    562         }
    563     }
    564 
    565     return M4NO_ERROR;
    566 }
    567 
    568 /**
    569  ******************************************************************************
    570  * prototype    M4OSA_ERR M4xVSS_SendCommand(M4OSA_Context pContext,
    571  *                                         M4VSS3GPP_EditSettings* pSettings)
    572  * @brief        This function gives to the xVSS an editing structure
    573  * @note        The xVSS analyses this structure, and prepare edition
    574  *                This function must be called after M4xVSS_Init, after
    575  *                M4xVSS_CloseCommand, or after M4xVSS_PreviewStop.
    576  *                After this function, the user must call M4xVSS_Step until
    577  *                it returns another error than M4NO_ERROR.
    578  *
    579  * @param    pContext            (IN) Pointer on the xVSS edit context
    580  * @param    pSettings            (IN) Edition settings (allocated by the user)
    581  * @return    M4NO_ERROR:            No error
    582  * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
    583  * @return    M4ERR_ALLOC:        Memory allocation has failed
    584  * @return    M4ERR_STATE:        This function cannot not be called at this time
    585  ******************************************************************************
    586  */
    587 M4OSA_ERR M4xVSS_SendCommand( M4OSA_Context pContext,
    588                              M4VSS3GPP_EditSettings *pSettings )
    589 {
    590     M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
    591     M4OSA_UInt8 i, j;
    592     M4OSA_UInt8 nbOfSameClip = 0;
    593     M4OSA_ERR err;
    594     M4OSA_Bool isNewBGM = M4OSA_TRUE;
    595     M4xVSS_Pto3GPP_params *pPto3GPP_last = M4OSA_NULL;
    596     M4xVSS_MCS_params *pMCS_last = M4OSA_NULL;
    597     M4OSA_UInt32 width, height, samplingFreq;
    598     M4OSA_Bool bIsTranscoding = M4OSA_FALSE;
    599     M4OSA_Int32 totalDuration;
    600     M4OSA_UInt32 outputSamplingFrequency = 0;
    601     M4OSA_UInt32 length = 0;
    602     M4OSA_Int8 masterClip = -1;
    603 
    604     i = 0;
    605     /* Check state */
    606     if( xVSS_context->m_state != M4xVSS_kStateInitialized \
    607         && xVSS_context->m_state != M4xVSS_kStateOpened )
    608     {
    609         M4OSA_TRACE1_1(
    610             "Bad state when calling M4xVSS_SendCommand function! State is %d",
    611             xVSS_context->m_state);
    612         return M4ERR_STATE;
    613     }
    614 
    615     /* State is back to initialized to allow call of cleanup function in case of error */
    616     xVSS_context->m_state = M4xVSS_kStateInitialized;
    617 
    618     /* Check if a previous sendCommand has been called */
    619     if( xVSS_context->previousClipNumber != 0 )
    620     {
    621         M4OSA_UInt32 pCmpResult = 0;
    622 
    623         /* Compare BGM input */
    624         if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL \
    625             && pSettings->xVSS.pBGMtrack != M4OSA_NULL )
    626         {
    627             pCmpResult = strcmp((const char *)xVSS_context->pSettings->xVSS.pBGMtrack->pFile,
    628                 (const char *)pSettings->xVSS.pBGMtrack->pFile);
    629 
    630             if( pCmpResult == 0 )
    631             {
    632                 /* Check if audio output parameters have changed */
    633                 if( xVSS_context->pSettings->xVSS.outputAudioFormat ==
    634                     pSettings->xVSS.outputAudioFormat
    635                     && xVSS_context->pSettings->xVSS.bAudioMono
    636                     == pSettings->xVSS.bAudioMono )
    637                 {
    638                     /* It means that BGM is the same as before, so, no need to redecode it */
    639                     M4OSA_TRACE2_0(
    640                         "BGM is the same as before, nothing to decode");
    641                     isNewBGM = M4OSA_FALSE;
    642                 }
    643                 else
    644                 {
    645                     /* We need to unallocate PCM preview file path in internal context */
    646                     if( xVSS_context->pcmPreviewFile != M4OSA_NULL )
    647                     {
    648                         free(xVSS_context->pcmPreviewFile);
    649                         xVSS_context->pcmPreviewFile = M4OSA_NULL;
    650                     }
    651                 }
    652             }
    653             else
    654             {
    655                 /* We need to unallocate PCM preview file path in internal context */
    656                 if( xVSS_context->pcmPreviewFile != M4OSA_NULL )
    657                 {
    658                     free(xVSS_context->pcmPreviewFile);
    659                     xVSS_context->pcmPreviewFile = M4OSA_NULL;
    660                 }
    661             }
    662         }
    663 
    664         /* Check if output settings have changed */
    665         if( xVSS_context->pSettings->xVSS.outputVideoSize
    666             != pSettings->xVSS.outputVideoSize
    667             || xVSS_context->pSettings->xVSS.outputVideoFormat
    668             != pSettings->xVSS.outputVideoFormat
    669             || xVSS_context->pSettings->xVSS.outputVideoProfile
    670             != pSettings->xVSS.outputVideoProfile
    671             || xVSS_context->pSettings->xVSS.outputVideoLevel
    672             != pSettings->xVSS.outputVideoLevel
    673             || xVSS_context->pSettings->xVSS.outputAudioFormat
    674             != pSettings->xVSS.outputAudioFormat
    675             || xVSS_context->pSettings->xVSS.bAudioMono
    676             != pSettings->xVSS.bAudioMono
    677             || xVSS_context->pSettings->xVSS.outputAudioSamplFreq
    678             != pSettings->xVSS.outputAudioSamplFreq )
    679         {
    680             /* If it is the case, we can't reuse already transcoded/converted files */
    681             /* so, we delete these files and remove them from chained list */
    682             if( xVSS_context->pPTo3GPPparamsList != M4OSA_NULL )
    683             {
    684                 M4xVSS_Pto3GPP_params *pParams =
    685                     xVSS_context->pPTo3GPPparamsList;
    686                 M4xVSS_Pto3GPP_params *pParams_sauv;
    687 
    688                 while( pParams != M4OSA_NULL )
    689                 {
    690                     if( pParams->pFileIn != M4OSA_NULL )
    691                     {
    692                         free(pParams->pFileIn);
    693                         pParams->pFileIn = M4OSA_NULL;
    694                     }
    695 
    696                     if( pParams->pFileOut != M4OSA_NULL )
    697                     {
    698                         /* Delete temporary file */
    699                         remove((const char *)pParams->pFileOut);
    700                         free(pParams->pFileOut);
    701                         pParams->pFileOut = M4OSA_NULL;
    702                     }
    703 
    704                     if( pParams->pFileTemp != M4OSA_NULL )
    705                     {
    706                         /* Delete temporary file */
    707 #ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE
    708 
    709                         remove((const char *)pParams->pFileTemp);
    710                         free(pParams->pFileTemp);
    711 
    712 #endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/
    713 
    714                         pParams->pFileTemp = M4OSA_NULL;
    715                     }
    716                     pParams_sauv = pParams;
    717                     pParams = pParams->pNext;
    718                     free(pParams_sauv);
    719                     pParams_sauv = M4OSA_NULL;
    720                 }
    721                 xVSS_context->pPTo3GPPparamsList = M4OSA_NULL;
    722             }
    723 
    724             if( xVSS_context->pMCSparamsList != M4OSA_NULL )
    725             {
    726                 M4xVSS_MCS_params *pParams = xVSS_context->pMCSparamsList;
    727                 M4xVSS_MCS_params *pParams_sauv;
    728                 M4xVSS_MCS_params *pParams_bgm = M4OSA_NULL;
    729 
    730                 while( pParams != M4OSA_NULL )
    731                 {
    732                     /* Here, we do not delete BGM */
    733                     if( pParams->isBGM != M4OSA_TRUE )
    734                     {
    735                         if( pParams->pFileIn != M4OSA_NULL )
    736                         {
    737                             free(pParams->pFileIn);
    738                             pParams->pFileIn = M4OSA_NULL;
    739                         }
    740 
    741                         if( pParams->pFileOut != M4OSA_NULL )
    742                         {
    743                             /* Delete temporary file */
    744                             remove((const char *)pParams->pFileOut);
    745                             free(pParams->pFileOut);
    746                             pParams->pFileOut = M4OSA_NULL;
    747                         }
    748 
    749                         if( pParams->pFileTemp != M4OSA_NULL )
    750                         {
    751                             /* Delete temporary file */
    752 #ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE
    753 
    754                             remove((const char *)pParams->pFileTemp);
    755                             free(pParams->pFileTemp);
    756 
    757 #endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/
    758 
    759                             pParams->pFileTemp = M4OSA_NULL;
    760                         }
    761                         pParams_sauv = pParams;
    762                         pParams = pParams->pNext;
    763                         free(pParams_sauv);
    764                         pParams_sauv = M4OSA_NULL;
    765                     }
    766                     else
    767                     {
    768                         pParams_bgm = pParams;
    769                         pParams = pParams->pNext;
    770                         /*PR P4ME00003182 initialize this pointer because the following params
    771                         element will be deallocated*/
    772                         if( pParams != M4OSA_NULL
    773                             && pParams->isBGM != M4OSA_TRUE )
    774                         {
    775                             pParams_bgm->pNext = M4OSA_NULL;
    776                         }
    777                     }
    778                 }
    779                 xVSS_context->pMCSparamsList = pParams_bgm;
    780             }
    781             /* Maybe need to implement framerate changing */
    782             //xVSS_context->pSettings->videoFrameRate;
    783         }
    784 
    785         /* Unallocate previous xVSS_context->pSettings structure */
    786         M4xVSS_freeSettings(xVSS_context->pSettings);
    787 
    788         /*Unallocate output file path*/
    789         if( xVSS_context->pSettings->pOutputFile != M4OSA_NULL )
    790         {
    791             free(xVSS_context->pSettings->pOutputFile);
    792             xVSS_context->pSettings->pOutputFile = M4OSA_NULL;
    793         }
    794         xVSS_context->pSettings->uiOutputPathSize = 0;
    795         xVSS_context->pOutputFile = M4OSA_NULL;
    796     }
    797 
    798     /**********************************
    799     Clips registering
    800     **********************************/
    801 
    802     /* Copy settings from user given structure to our "local" structure */
    803     xVSS_context->pSettings->xVSS.outputVideoFormat =
    804         pSettings->xVSS.outputVideoFormat;
    805     xVSS_context->pSettings->xVSS.outputVideoProfile =
    806         pSettings->xVSS.outputVideoProfile;
    807     xVSS_context->pSettings->xVSS.outputVideoLevel =
    808         pSettings->xVSS.outputVideoLevel;
    809     xVSS_context->pSettings->xVSS.outputVideoSize =
    810         pSettings->xVSS.outputVideoSize;
    811     xVSS_context->pSettings->xVSS.outputAudioFormat =
    812         pSettings->xVSS.outputAudioFormat;
    813     xVSS_context->pSettings->xVSS.bAudioMono = pSettings->xVSS.bAudioMono;
    814     xVSS_context->pSettings->xVSS.outputAudioSamplFreq =
    815         pSettings->xVSS.outputAudioSamplFreq;
    816     /*xVSS_context->pSettings->pOutputFile = pSettings->pOutputFile;*/
    817     /*FB: VAL CR P4ME00003076
    818     The output video and audio bitrate are given by the user in the edition settings structure*/
    819     xVSS_context->pSettings->xVSS.outputVideoBitrate =
    820         pSettings->xVSS.outputVideoBitrate;
    821     xVSS_context->pSettings->xVSS.outputAudioBitrate =
    822         pSettings->xVSS.outputAudioBitrate;
    823     xVSS_context->pSettings->PTVolLevel = pSettings->PTVolLevel;
    824 
    825     /*FB: bug fix if the output path is given in M4xVSS_sendCommand*/
    826 
    827     if( pSettings->pOutputFile != M4OSA_NULL
    828         && pSettings->uiOutputPathSize > 0 )
    829     {
    830         M4OSA_Void *pDecodedPath = pSettings->pOutputFile;
    831         /*As all inputs of the xVSS are in UTF8, convert the output file path into the
    832         customer format*/
    833         if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
    834             && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
    835             != M4OSA_NULL )
    836         {
    837             err = M4xVSS_internalConvertFromUTF8(xVSS_context,
    838                 (M4OSA_Void *)pSettings->pOutputFile,
    839                 (M4OSA_Void *)xVSS_context->
    840                 UTFConversionContext.pTempOutConversionBuffer, &length);
    841 
    842             if( err != M4NO_ERROR )
    843             {
    844                 M4OSA_TRACE1_1("M4xVSS_SendCommand:\
    845                                M4xVSS_internalConvertFromUTF8 returns err: 0x%x", err);
    846                 return err;
    847             }
    848             pDecodedPath =
    849                 xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
    850             pSettings->uiOutputPathSize = length;
    851         }
    852 
    853         xVSS_context->pSettings->pOutputFile = (M4OSA_Void *)M4OSA_32bitAlignedMalloc \
    854             (pSettings->uiOutputPathSize + 1, M4VS,
    855             (M4OSA_Char *)"output file path");
    856 
    857         if( xVSS_context->pSettings->pOutputFile == M4OSA_NULL )
    858         {
    859             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
    860             /*FB: to avoid leaks when there is an error in the send command*/
    861             /* Free Send command */
    862             M4xVSS_freeCommand(xVSS_context);
    863             /**/
    864             return M4ERR_ALLOC;
    865         }
    866         memcpy((void *)xVSS_context->pSettings->pOutputFile,
    867             (void *)pDecodedPath, pSettings->uiOutputPathSize + 1);
    868         xVSS_context->pSettings->uiOutputPathSize = pSettings->uiOutputPathSize;
    869         xVSS_context->pOutputFile = xVSS_context->pSettings->pOutputFile;
    870     }
    871     else
    872     {
    873         xVSS_context->pSettings->pOutputFile = M4OSA_NULL;
    874         xVSS_context->pSettings->uiOutputPathSize = 0;
    875         xVSS_context->pOutputFile = M4OSA_NULL;
    876     }
    877     xVSS_context->pSettings->pTemporaryFile = pSettings->pTemporaryFile;
    878     xVSS_context->pSettings->uiClipNumber = pSettings->uiClipNumber;
    879     xVSS_context->pSettings->videoFrameRate = pSettings->videoFrameRate;
    880     xVSS_context->pSettings->uiMasterClip =
    881         0; /* With VSS 2.0, this new param is mandatory */
    882     xVSS_context->pSettings->xVSS.pTextRenderingFct =
    883         pSettings->xVSS.pTextRenderingFct; /* CR text handling */
    884     xVSS_context->pSettings->xVSS.outputFileSize =
    885         pSettings->xVSS.outputFileSize;
    886 
    887     if( pSettings->xVSS.outputFileSize != 0 \
    888         && pSettings->xVSS.outputAudioFormat != M4VIDEOEDITING_kAMR_NB )
    889     {
    890         M4OSA_TRACE1_0("M4xVSS_SendCommand: Impossible to limit file\
    891                        size with other audio output than AAC");
    892         return M4ERR_PARAMETER;
    893     }
    894     xVSS_context->nbStepTotal = 0;
    895     xVSS_context->currentStep = 0;
    896 
    897     if( xVSS_context->pSettings->xVSS.outputVideoFormat != M4VIDEOEDITING_kMPEG4
    898         && xVSS_context->pSettings->xVSS.outputVideoFormat
    899         != M4VIDEOEDITING_kH263
    900         && xVSS_context->pSettings->xVSS.outputVideoFormat
    901         != M4VIDEOEDITING_kH264 )
    902     {
    903         xVSS_context->pSettings->xVSS.outputVideoFormat =
    904             M4VIDEOEDITING_kNoneVideo;
    905     }
    906 
    907     /* Get output width/height */
    908     switch( xVSS_context->pSettings->xVSS.outputVideoSize )
    909     {
    910         case M4VIDEOEDITING_kSQCIF:
    911             width = 128;
    912             height = 96;
    913             break;
    914 
    915         case M4VIDEOEDITING_kQQVGA:
    916             width = 160;
    917             height = 120;
    918             break;
    919 
    920         case M4VIDEOEDITING_kQCIF:
    921             width = 176;
    922             height = 144;
    923             break;
    924 
    925         case M4VIDEOEDITING_kQVGA:
    926             width = 320;
    927             height = 240;
    928             break;
    929 
    930         case M4VIDEOEDITING_kCIF:
    931             width = 352;
    932             height = 288;
    933             break;
    934 
    935         case M4VIDEOEDITING_kVGA:
    936             width = 640;
    937             height = 480;
    938             break;
    939             /* +PR LV5807 */
    940         case M4VIDEOEDITING_kWVGA:
    941             width = 800;
    942             height = 480;
    943             break;
    944 
    945         case M4VIDEOEDITING_kNTSC:
    946             width = 720;
    947             height = 480;
    948             break;
    949             /* -PR LV5807 */
    950             /* +CR Google */
    951         case M4VIDEOEDITING_k640_360:
    952             width = 640;
    953             height = 360;
    954             break;
    955 
    956         case M4VIDEOEDITING_k854_480:
    957 
    958             // StageFright encoders require %16 resolution
    959 
    960             width = M4ENCODER_854_480_Width;
    961 
    962             height = 480;
    963             break;
    964 
    965         case M4VIDEOEDITING_k1280_720:
    966             width = 1280;
    967             height = 720;
    968             break;
    969 
    970         case M4VIDEOEDITING_k1080_720:
    971             // StageFright encoders require %16 resolution
    972             width = M4ENCODER_1080_720_Width;
    973             height = 720;
    974             break;
    975 
    976         case M4VIDEOEDITING_k960_720:
    977             width = 960;
    978             height = 720;
    979             break;
    980 
    981         case M4VIDEOEDITING_k1920_1080:
    982             width = 1920;
    983             height = M4ENCODER_1920_1080_Height;
    984             break;
    985 
    986             /* -CR Google */
    987         default: /* If output video size is not given, we take QCIF size */
    988             width = 176;
    989             height = 144;
    990             xVSS_context->pSettings->xVSS.outputVideoSize =
    991                 M4VIDEOEDITING_kQCIF;
    992             break;
    993     }
    994 
    995     /* Get output Sampling frequency */
    996     switch( xVSS_context->pSettings->xVSS.outputAudioSamplFreq )
    997     {
    998         case M4VIDEOEDITING_k8000_ASF:
    999             samplingFreq = 8000;
   1000             break;
   1001 
   1002         case M4VIDEOEDITING_k16000_ASF:
   1003             samplingFreq = 16000;
   1004             break;
   1005 
   1006         case M4VIDEOEDITING_k22050_ASF:
   1007             samplingFreq = 22050;
   1008             break;
   1009 
   1010         case M4VIDEOEDITING_k24000_ASF:
   1011             samplingFreq = 24000;
   1012             break;
   1013 
   1014         case M4VIDEOEDITING_k32000_ASF:
   1015             samplingFreq = 32000;
   1016             break;
   1017 
   1018         case M4VIDEOEDITING_k44100_ASF:
   1019             samplingFreq = 44100;
   1020             break;
   1021 
   1022         case M4VIDEOEDITING_k48000_ASF:
   1023             samplingFreq = 48000;
   1024             break;
   1025 
   1026         case M4VIDEOEDITING_kDefault_ASF:
   1027         default:
   1028             if( xVSS_context->pSettings->xVSS.outputAudioFormat
   1029                 == M4VIDEOEDITING_kAMR_NB )
   1030             {
   1031                 samplingFreq = 8000;
   1032             }
   1033             else if( xVSS_context->pSettings->xVSS.outputAudioFormat
   1034                 == M4VIDEOEDITING_kAAC )
   1035             {
   1036                 samplingFreq = 16000;
   1037             }
   1038             else
   1039             {
   1040                 samplingFreq = 0;
   1041             }
   1042             break;
   1043     }
   1044 
   1045     /* Allocate clip/transitions if clip number is not null ... */
   1046     if( 0 < xVSS_context->pSettings->uiClipNumber )
   1047     {
   1048         if( xVSS_context->pSettings->pClipList != M4OSA_NULL )
   1049         {
   1050             free((xVSS_context->pSettings->pClipList));
   1051             xVSS_context->pSettings->pClipList = M4OSA_NULL;
   1052         }
   1053 
   1054         if( xVSS_context->pSettings->pTransitionList != M4OSA_NULL )
   1055         {
   1056             free(xVSS_context->pSettings->pTransitionList);
   1057             xVSS_context->pSettings->pTransitionList = M4OSA_NULL;
   1058         }
   1059 
   1060         xVSS_context->pSettings->pClipList =
   1061             (M4VSS3GPP_ClipSettings ** )M4OSA_32bitAlignedMalloc \
   1062             (sizeof(M4VSS3GPP_ClipSettings *)*xVSS_context->pSettings->uiClipNumber,
   1063             M4VS, (M4OSA_Char *)"xVSS, copy of pClipList");
   1064 
   1065         if( xVSS_context->pSettings->pClipList == M4OSA_NULL )
   1066         {
   1067             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   1068             /*FB: to avoid leaks when there is an error in the send command*/
   1069             /* Free Send command */
   1070             M4xVSS_freeCommand(xVSS_context);
   1071             /**/
   1072             return M4ERR_ALLOC;
   1073         }
   1074         /* Set clip list to NULL */
   1075         memset((void *)xVSS_context->pSettings->pClipList,0,
   1076             sizeof(M4VSS3GPP_ClipSettings *)
   1077             *xVSS_context->pSettings->uiClipNumber);
   1078 
   1079         if( xVSS_context->pSettings->uiClipNumber > 1 )
   1080         {
   1081             xVSS_context->pSettings->pTransitionList =
   1082                 (M4VSS3GPP_TransitionSettings ** ) \
   1083                 M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings *)                \
   1084                 *(xVSS_context->pSettings->uiClipNumber - 1), M4VS, (M4OSA_Char *) \
   1085                 "xVSS, copy of pTransitionList");
   1086 
   1087             if( xVSS_context->pSettings->pTransitionList == M4OSA_NULL )
   1088             {
   1089                 M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   1090                 /*FB: to avoid leaks when there is an error in the send command*/
   1091                 /* Free Send command */
   1092                 M4xVSS_freeCommand(xVSS_context);
   1093                 /**/
   1094                 return M4ERR_ALLOC;
   1095             }
   1096             /* Set transition list to NULL */
   1097             memset(
   1098                 (void *)xVSS_context->pSettings->pTransitionList,0,
   1099                 sizeof(M4VSS3GPP_TransitionSettings *)
   1100                 *(xVSS_context->pSettings->uiClipNumber - 1));
   1101         }
   1102         else
   1103         {
   1104             xVSS_context->pSettings->pTransitionList = M4OSA_NULL;
   1105         }
   1106     }
   1107     /* else, there is a pb in the input settings structure */
   1108     else
   1109     {
   1110         M4OSA_TRACE1_0("No clip in this settings list !!");
   1111         /*FB: to avoid leaks when there is an error in the send command*/
   1112         /* Free Send command */
   1113         M4xVSS_freeCommand(xVSS_context);
   1114         /**/
   1115         return M4ERR_PARAMETER;
   1116     }
   1117 
   1118     /* RC Allocate effects settings */
   1119     xVSS_context->pSettings->nbEffects = pSettings->nbEffects;
   1120 
   1121     if( 0 < xVSS_context->pSettings->nbEffects )
   1122     {
   1123         xVSS_context->pSettings->Effects =
   1124             (M4VSS3GPP_EffectSettings *)M4OSA_32bitAlignedMalloc \
   1125             (xVSS_context->pSettings->nbEffects * sizeof(M4VSS3GPP_EffectSettings),
   1126             M4VS, (M4OSA_Char *)"effects settings");
   1127 
   1128         if( xVSS_context->pSettings->Effects == M4OSA_NULL )
   1129         {
   1130             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   1131             /*FB: to avoid leaks when there is an error in the send command*/
   1132             /* Free Send command */
   1133             M4xVSS_freeCommand(xVSS_context);
   1134             /**/
   1135             return M4ERR_ALLOC;
   1136         }
   1137         /*FB bug fix 19.03.2008: these pointers were not initialized -> crash when free*/
   1138         for ( i = 0; i < xVSS_context->pSettings->nbEffects; i++ )
   1139         {
   1140             xVSS_context->pSettings->Effects[i].xVSS.pFramingFilePath =
   1141                 M4OSA_NULL;
   1142             xVSS_context->pSettings->Effects[i].xVSS.pFramingBuffer =
   1143                 M4OSA_NULL;
   1144             xVSS_context->pSettings->Effects[i].xVSS.pTextBuffer = M4OSA_NULL;
   1145         }
   1146         /**/
   1147     }
   1148 
   1149     if( xVSS_context->targetedTimescale == 0 )
   1150     {
   1151         M4OSA_UInt32 pTargetedTimeScale = 0;
   1152 
   1153         err = M4xVSS_internalGetTargetedTimeScale(xVSS_context, pSettings,
   1154             &pTargetedTimeScale);
   1155 
   1156         if( M4NO_ERROR != err || pTargetedTimeScale == 0 )
   1157         {
   1158             M4OSA_TRACE1_1("M4xVSS_SendCommand: M4xVSS_internalGetTargetedTimeScale\
   1159                            returned 0x%x", err);
   1160             /*FB: to avoid leaks when there is an error in the send command*/
   1161             /* Free Send command */
   1162             M4xVSS_freeCommand(xVSS_context);
   1163             /**/
   1164             return err;
   1165         }
   1166         xVSS_context->targetedTimescale = pTargetedTimeScale;
   1167     }
   1168 
   1169     /* Initialize total duration variable */
   1170     totalDuration = 0;
   1171 
   1172     /* Parsing list of clips given by application, and prepare analyzing */
   1173     for ( i = 0; i < xVSS_context->pSettings->uiClipNumber; i++ )
   1174     {
   1175         /* Allocate current clip */
   1176         xVSS_context->pSettings->pClipList[i] =
   1177             (M4VSS3GPP_ClipSettings *)M4OSA_32bitAlignedMalloc \
   1178             (sizeof(M4VSS3GPP_ClipSettings), M4VS, (M4OSA_Char *)"clip settings");
   1179 
   1180         if( xVSS_context->pSettings->pClipList[i] == M4OSA_NULL )
   1181         {
   1182             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   1183             /*FB: to avoid leaks when there is an error in the send command*/
   1184             /* Free Send command */
   1185             M4xVSS_freeCommand(xVSS_context);
   1186             /**/
   1187             return M4ERR_ALLOC;
   1188         }
   1189 
   1190         /* Copy clip settings from given structure to our xVSS_context structure */
   1191         err =
   1192             M4xVSS_DuplicateClipSettings(xVSS_context->pSettings->pClipList[i],
   1193             pSettings->pClipList[i], M4OSA_TRUE);
   1194 
   1195         if( err != M4NO_ERROR )
   1196         {
   1197             M4OSA_TRACE1_1(
   1198                 "M4xVSS_SendCommand: M4xVSS_DuplicateClipSettings return error 0x%x",
   1199                 err);
   1200             /*FB: to avoid leaks when there is an error in the send command*/
   1201             /* Free Send command */
   1202             M4xVSS_freeCommand(xVSS_context);
   1203             /**/
   1204             return err;
   1205         }
   1206 
   1207         xVSS_context->pSettings->pClipList[i]->bTranscodingRequired =
   1208             M4OSA_FALSE;
   1209 
   1210         /* Because there is 1 less transition than clip number */
   1211         if( i < xVSS_context->pSettings->uiClipNumber - 1 )
   1212         {
   1213             xVSS_context->pSettings->pTransitionList[i] =
   1214                 (M4VSS3GPP_TransitionSettings
   1215                 *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings),
   1216                 M4VS, (M4OSA_Char *)"transition settings");
   1217 
   1218             if( xVSS_context->pSettings->pTransitionList[i] == M4OSA_NULL )
   1219             {
   1220                 M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   1221                 /*FB: to avoid leaks when there is an error in the send command*/
   1222                 /* Free Send command */
   1223                 M4xVSS_freeCommand(xVSS_context);
   1224                 /**/
   1225                 return M4ERR_ALLOC;
   1226             }
   1227 
   1228             memcpy(
   1229                 (void *)xVSS_context->pSettings->pTransitionList[i],
   1230                 (void *)pSettings->pTransitionList[i],
   1231                 sizeof(M4VSS3GPP_TransitionSettings));
   1232             /* Initialize external effect context to NULL, to know if input jpg has already been
   1233             decoded or not */
   1234             xVSS_context->pSettings->pTransitionList[i]->
   1235                 pExtVideoTransitionFctCtxt = M4OSA_NULL;
   1236 
   1237             switch( xVSS_context->pSettings->
   1238                 pTransitionList[i]->VideoTransitionType )
   1239             {
   1240                     /* If transition type is alpha magic, we need to decode input file */
   1241                 case M4xVSS_kVideoTransitionType_AlphaMagic:
   1242                     /* Allocate our alpha magic settings structure to have a copy of the
   1243                     provided one */
   1244                     xVSS_context->pSettings->pTransitionList[i]->      \
   1245                      xVSS.transitionSpecific.pAlphaMagicSettings =
   1246                         (M4xVSS_AlphaMagicSettings *)M4OSA_32bitAlignedMalloc \
   1247                         (sizeof(M4xVSS_AlphaMagicSettings), M4VS,
   1248                         (M4OSA_Char *)"Input Alpha magic settings structure");
   1249 
   1250                     if( xVSS_context->pSettings->pTransitionList[i]-> \
   1251                         xVSS.transitionSpecific.pAlphaMagicSettings == M4OSA_NULL )
   1252                     {
   1253                         M4OSA_TRACE1_0(
   1254                             "Allocation error in M4xVSS_SendCommand");
   1255                         /*FB: to avoid leaks when there is an error in the send command*/
   1256                         /* Free Send command */
   1257                         M4xVSS_freeCommand(xVSS_context);
   1258                         /**/
   1259                         return M4ERR_ALLOC;
   1260                     }
   1261                     /* Copy data from the provided alpha magic settings structure tou our
   1262                     structure */
   1263                     memcpy((void *)xVSS_context->pSettings->
   1264                         pTransitionList[i]-> \
   1265                         xVSS.transitionSpecific.pAlphaMagicSettings,
   1266                         (void *)pSettings->pTransitionList[i]-> \
   1267                         xVSS.transitionSpecific.pAlphaMagicSettings,
   1268                         sizeof(M4xVSS_AlphaMagicSettings));
   1269 
   1270                     /* Allocate our alpha magic input filename */
   1271                     xVSS_context->pSettings->pTransitionList[i]-> \
   1272                         xVSS.transitionSpecific.pAlphaMagicSettings->
   1273                         pAlphaFilePath = M4OSA_32bitAlignedMalloc(
   1274                         (strlen(pSettings->pTransitionList[i]-> \
   1275                         xVSS.transitionSpecific.pAlphaMagicSettings->pAlphaFilePath)
   1276                         + 1), M4VS, (M4OSA_Char *)"Alpha magic file path");
   1277 
   1278                     if( xVSS_context->pSettings->pTransitionList[i]-> \
   1279                         xVSS.transitionSpecific.pAlphaMagicSettings->pAlphaFilePath
   1280                         == M4OSA_NULL )
   1281                     {
   1282                         M4OSA_TRACE1_0(
   1283                             "Allocation error in M4xVSS_SendCommand");
   1284                         /*FB: to avoid leaks when there is an error in the send command*/
   1285                         /* Free Send command */
   1286                         M4xVSS_freeCommand(xVSS_context);
   1287                         /**/
   1288                         return M4ERR_ALLOC;
   1289                     }
   1290                     /* Copy data from the provided alpha magic filename to our */
   1291                     M4OSA_chrNCopy(
   1292                         xVSS_context->pSettings->pTransitionList[i]->xVSS.
   1293                         transitionSpecific.pAlphaMagicSettings->
   1294                         pAlphaFilePath,
   1295                         pSettings->pTransitionList[i]->xVSS.
   1296                         transitionSpecific.pAlphaMagicSettings->
   1297                         pAlphaFilePath, strlen(
   1298                         pSettings->pTransitionList[i]->xVSS.
   1299                         transitionSpecific.pAlphaMagicSettings->
   1300                         pAlphaFilePath) + 1);
   1301 
   1302                     /* Parse all transition to know if the input jpg has already been decoded */
   1303                     for ( j = 0; j < i; j++ )
   1304                     {
   1305                         if( xVSS_context->pSettings->
   1306                             pTransitionList[j]->VideoTransitionType
   1307                             == M4xVSS_kVideoTransitionType_AlphaMagic )
   1308                         {
   1309                             M4OSA_UInt32 pCmpResult = 0;
   1310                             pCmpResult = strcmp((const char *)xVSS_context->pSettings->
   1311                                 pTransitionList[i]->xVSS.
   1312                                 transitionSpecific.pAlphaMagicSettings->
   1313                                 pAlphaFilePath, (const char *)xVSS_context->pSettings->
   1314                                 pTransitionList[j]->xVSS.
   1315                                 transitionSpecific.
   1316                                 pAlphaMagicSettings->pAlphaFilePath);
   1317 
   1318                             if( pCmpResult == 0 )
   1319                             {
   1320                                 M4xVSS_internal_AlphaMagicSettings
   1321                                     *alphaSettings;
   1322 
   1323                                 alphaSettings =
   1324                                     (M4xVSS_internal_AlphaMagicSettings
   1325                                     *)M4OSA_32bitAlignedMalloc(
   1326                                     sizeof(
   1327                                     M4xVSS_internal_AlphaMagicSettings),
   1328                                     M4VS,
   1329                                     (M4OSA_Char
   1330                                     *)
   1331                                     "Alpha magic settings structure 1");
   1332 
   1333                                 if( alphaSettings == M4OSA_NULL )
   1334                                 {
   1335                                     M4OSA_TRACE1_0(
   1336                                         "Allocation error in M4xVSS_SendCommand");
   1337                                     /*FB: to avoid leaks when there is an error in the send
   1338                                      command*/
   1339                                     /* Free Send command */
   1340                                     M4xVSS_freeCommand(xVSS_context);
   1341                                     /**/
   1342                                     return M4ERR_ALLOC;
   1343                                 }
   1344                                 alphaSettings->pPlane =
   1345                                     ((M4xVSS_internal_AlphaMagicSettings *)(
   1346                                     xVSS_context->pSettings->
   1347                                     pTransitionList[j]->
   1348                                     pExtVideoTransitionFctCtxt))->
   1349                                     pPlane;
   1350 
   1351                                 if( xVSS_context->pSettings->
   1352                                     pTransitionList[i]->xVSS.transitionSpecific.
   1353                                     pAlphaMagicSettings->blendingPercent > 0
   1354                                     && xVSS_context->pSettings->
   1355                                     pTransitionList[i]->xVSS.
   1356                                     transitionSpecific.
   1357                                     pAlphaMagicSettings->blendingPercent
   1358                                     <= 100 )
   1359                                 {
   1360                                     alphaSettings->blendingthreshold =
   1361                                         ( xVSS_context->pSettings->
   1362                                         pTransitionList[i]->xVSS.
   1363                                         transitionSpecific.
   1364                                         pAlphaMagicSettings->
   1365                                         blendingPercent) * 255 / 200;
   1366                                 }
   1367                                 else
   1368                                 {
   1369                                     alphaSettings->blendingthreshold = 0;
   1370                                 }
   1371                                 alphaSettings->isreverse =
   1372                                     xVSS_context->pSettings->
   1373                                     pTransitionList[i]->xVSS.
   1374                                     transitionSpecific.
   1375                                     pAlphaMagicSettings->isreverse;
   1376                                 /* It means that the input jpg file for alpha magic has already
   1377                                  been decoded -> no nedd to decode it again */
   1378                                 if( alphaSettings->blendingthreshold == 0 )
   1379                                 {
   1380                                     xVSS_context->pSettings->
   1381                                         pTransitionList[i]->
   1382                                         ExtVideoTransitionFct =
   1383                                         M4xVSS_AlphaMagic;
   1384                                 }
   1385                                 else
   1386                                 {
   1387                                     xVSS_context->pSettings->
   1388                                         pTransitionList[i]->
   1389                                         ExtVideoTransitionFct =
   1390                                         M4xVSS_AlphaMagicBlending;
   1391                                 }
   1392                                 xVSS_context->pSettings->pTransitionList[i]->
   1393                                     pExtVideoTransitionFctCtxt = alphaSettings;
   1394                                 break;
   1395                             }
   1396                         }
   1397                     }
   1398 
   1399                     /* If the jpg has not been decoded yet ... */
   1400                     if( xVSS_context->pSettings->
   1401                         pTransitionList[i]->pExtVideoTransitionFctCtxt
   1402                         == M4OSA_NULL )
   1403                     {
   1404                         M4VIFI_ImagePlane *outputPlane;
   1405                         M4xVSS_internal_AlphaMagicSettings *alphaSettings;
   1406                         /*UTF conversion support*/
   1407                         M4OSA_Void *pDecodedPath = M4OSA_NULL;
   1408 
   1409                         /*To support ARGB8888 : get the width and height */
   1410                         M4OSA_UInt32 width_ARGB888 =
   1411                             xVSS_context->pSettings->pTransitionList[i]->xVSS.
   1412                             transitionSpecific.pAlphaMagicSettings->width;
   1413                         M4OSA_UInt32 height_ARGB888 =
   1414                             xVSS_context->pSettings->pTransitionList[i]->xVSS.
   1415                             transitionSpecific.pAlphaMagicSettings->height;
   1416                         M4OSA_TRACE1_1(
   1417                             " TransitionListM4xVSS_SendCommand width State is %d",
   1418                             width_ARGB888);
   1419                         M4OSA_TRACE1_1(
   1420                             " TransitionListM4xVSS_SendCommand height! State is %d",
   1421                             height_ARGB888);
   1422                         /* Allocate output plane */
   1423                         outputPlane = (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(3
   1424                             * sizeof(M4VIFI_ImagePlane), M4VS, (M4OSA_Char
   1425                             *)
   1426                             "Output plane for Alpha magic transition");
   1427 
   1428                         if( outputPlane == M4OSA_NULL )
   1429                         {
   1430                             M4OSA_TRACE1_0(
   1431                                 "Allocation error in M4xVSS_SendCommand");
   1432                             /*FB: to avoid leaks when there is an error in the send command*/
   1433                             /* Free Send command */
   1434                             M4xVSS_freeCommand(xVSS_context);
   1435                             /**/
   1436                             return M4ERR_ALLOC;
   1437                         }
   1438 
   1439                         outputPlane[0].u_width = width;
   1440                         outputPlane[0].u_height = height;
   1441                         outputPlane[0].u_topleft = 0;
   1442                         outputPlane[0].u_stride = width;
   1443                         outputPlane[0].pac_data = (M4VIFI_UInt8
   1444                             *)M4OSA_32bitAlignedMalloc(( width * height * 3)
   1445                             >> 1,
   1446                             M4VS,
   1447                             (M4OSA_Char
   1448                             *)
   1449                             "Alloc for the Alpha magic pac_data output YUV");
   1450                         ;
   1451 
   1452                         if( outputPlane[0].pac_data == M4OSA_NULL )
   1453                         {
   1454                             free(outputPlane);
   1455                             outputPlane = M4OSA_NULL;
   1456                             M4OSA_TRACE1_0(
   1457                                 "Allocation error in M4xVSS_SendCommand");
   1458                             /*FB: to avoid leaks when there is an error in the send command*/
   1459                             /* Free Send command */
   1460                             M4xVSS_freeCommand(xVSS_context);
   1461                             /**/
   1462                             return M4ERR_ALLOC;
   1463                         }
   1464                         outputPlane[1].u_width = width >> 1;
   1465                         outputPlane[1].u_height = height >> 1;
   1466                         outputPlane[1].u_topleft = 0;
   1467                         outputPlane[1].u_stride = width >> 1;
   1468                         outputPlane[1].pac_data = outputPlane[0].pac_data
   1469                             + outputPlane[0].u_width * outputPlane[0].u_height;
   1470                         outputPlane[2].u_width = width >> 1;
   1471                         outputPlane[2].u_height = height >> 1;
   1472                         outputPlane[2].u_topleft = 0;
   1473                         outputPlane[2].u_stride = width >> 1;
   1474                         outputPlane[2].pac_data = outputPlane[1].pac_data
   1475                             + outputPlane[1].u_width * outputPlane[1].u_height;
   1476 
   1477                         pDecodedPath =
   1478                             xVSS_context->pSettings->pTransitionList[i]->xVSS.
   1479                             transitionSpecific.pAlphaMagicSettings->
   1480                             pAlphaFilePath;
   1481                         /**
   1482                         * UTF conversion: convert into the customer format, before being used*/
   1483                         if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
   1484                             != M4OSA_NULL && xVSS_context->
   1485                             UTFConversionContext.
   1486                             pTempOutConversionBuffer != M4OSA_NULL )
   1487                         {
   1488                             err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   1489                                 (M4OSA_Void *)xVSS_context->pSettings->
   1490                                 pTransitionList[i]->xVSS.
   1491                                 transitionSpecific.
   1492                                 pAlphaMagicSettings->pAlphaFilePath,
   1493                                 (M4OSA_Void *)xVSS_context->
   1494                                 UTFConversionContext.
   1495                                 pTempOutConversionBuffer, &length);
   1496 
   1497                             if( err != M4NO_ERROR )
   1498                             {
   1499                                 M4OSA_TRACE1_1(
   1500                                     "M4xVSS_SendCommand: pConvFromUTF8Fct returns err: 0x%x",
   1501                                     err);
   1502                                 /* Free Send command */
   1503                                 M4xVSS_freeCommand(xVSS_context);
   1504                                 return err;
   1505                             }
   1506                             pDecodedPath =
   1507                                 xVSS_context->UTFConversionContext.
   1508                                 pTempOutConversionBuffer;
   1509                         }
   1510                         /**
   1511                         End of the conversion, use the decoded path*/
   1512                         /*To support ARGB8888 : convert + resizing from ARGB8888 to yuv420 */
   1513 
   1514                         err = M4xVSS_internalConvertAndResizeARGB8888toYUV420(
   1515                             pDecodedPath,
   1516                             xVSS_context->pFileReadPtr, outputPlane,
   1517                             width_ARGB888, height_ARGB888);
   1518 
   1519                         if( err != M4NO_ERROR )
   1520                         {
   1521                             free(outputPlane[0].pac_data);
   1522                             outputPlane[0].pac_data = M4OSA_NULL;
   1523                             free(outputPlane);
   1524                             outputPlane = M4OSA_NULL;
   1525                             M4xVSS_freeCommand(xVSS_context);
   1526                             M4OSA_TRACE1_1(
   1527                                 "M4xVSS_SendCommand: error when decoding alpha magic JPEG: 0x%x",
   1528                                 err);
   1529                             return err;
   1530                         }
   1531 
   1532                         /* Allocate alpha settings structure */
   1533                         alphaSettings =
   1534                             (M4xVSS_internal_AlphaMagicSettings *)M4OSA_32bitAlignedMalloc(
   1535                             sizeof(M4xVSS_internal_AlphaMagicSettings),
   1536                             M4VS, (M4OSA_Char
   1537                             *)"Alpha magic settings structure 2");
   1538 
   1539                         if( alphaSettings == M4OSA_NULL )
   1540                         {
   1541                             M4OSA_TRACE1_0(
   1542                                 "Allocation error in M4xVSS_SendCommand");
   1543                             /*FB: to avoid leaks when there is an error in the send command*/
   1544                             /* Free Send command */
   1545                             M4xVSS_freeCommand(xVSS_context);
   1546                             /**/
   1547                             return M4ERR_ALLOC;
   1548                         }
   1549                         alphaSettings->pPlane = outputPlane;
   1550 
   1551                         if( xVSS_context->pSettings->pTransitionList[i]->xVSS.
   1552                             transitionSpecific.pAlphaMagicSettings->
   1553                             blendingPercent > 0 && xVSS_context->pSettings->
   1554                             pTransitionList[i]->xVSS.
   1555                             transitionSpecific.pAlphaMagicSettings->
   1556                             blendingPercent <= 100 )
   1557                         {
   1558                             alphaSettings->blendingthreshold =
   1559                                 ( xVSS_context->pSettings->
   1560                                 pTransitionList[i]->xVSS.
   1561                                 transitionSpecific.pAlphaMagicSettings->
   1562                                 blendingPercent) * 255 / 200;
   1563                         }
   1564                         else
   1565                         {
   1566                             alphaSettings->blendingthreshold = 0;
   1567                         }
   1568                         alphaSettings->isreverse =
   1569                             xVSS_context->pSettings->pTransitionList[i]->xVSS.
   1570                             transitionSpecific.pAlphaMagicSettings->
   1571                             isreverse;
   1572 
   1573                         if( alphaSettings->blendingthreshold == 0 )
   1574                         {
   1575                             xVSS_context->pSettings->pTransitionList[i]->
   1576                                 ExtVideoTransitionFct = M4xVSS_AlphaMagic;
   1577                         }
   1578                         else
   1579                         {
   1580                             xVSS_context->pSettings->pTransitionList[i]->
   1581                                 ExtVideoTransitionFct =
   1582                                 M4xVSS_AlphaMagicBlending;
   1583                         }
   1584                         xVSS_context->pSettings->pTransitionList[i]->
   1585                             pExtVideoTransitionFctCtxt = alphaSettings;
   1586                     }
   1587 
   1588                     break;
   1589 
   1590                 case M4xVSS_kVideoTransitionType_SlideTransition:
   1591                     {
   1592                         M4xVSS_internal_SlideTransitionSettings *slideSettings;
   1593                         slideSettings =
   1594                             (M4xVSS_internal_SlideTransitionSettings *)M4OSA_32bitAlignedMalloc(
   1595                             sizeof(M4xVSS_internal_SlideTransitionSettings),
   1596                             M4VS, (M4OSA_Char
   1597                             *)"Internal slide transition settings");
   1598 
   1599                         if( M4OSA_NULL == slideSettings )
   1600                         {
   1601                             M4OSA_TRACE1_0(
   1602                                 "Allocation error in M4xVSS_SendCommand");
   1603                             /*FB: to avoid leaks when there is an error in the send command*/
   1604                             /* Free Send command */
   1605                             M4xVSS_freeCommand(xVSS_context);
   1606                             /**/
   1607                             return M4ERR_ALLOC;
   1608                         }
   1609                         /* Just copy the lone parameter from the input settings to the internal
   1610                          context. */
   1611 
   1612                         slideSettings->direction =
   1613                             pSettings->pTransitionList[i]->xVSS.transitionSpecific.
   1614                             pSlideTransitionSettings->direction;
   1615 
   1616                         /* No need to keep our copy of the settings. */
   1617                         xVSS_context->pSettings->pTransitionList[i]->
   1618                             xVSS.transitionSpecific.pSlideTransitionSettings =
   1619                             M4OSA_NULL;
   1620                         xVSS_context->pSettings->pTransitionList[i]->
   1621                             ExtVideoTransitionFct = &M4xVSS_SlideTransition;
   1622                         xVSS_context->pSettings->pTransitionList[i]->
   1623                             pExtVideoTransitionFctCtxt = slideSettings;
   1624                     }
   1625                     break;
   1626 
   1627                 case M4xVSS_kVideoTransitionType_FadeBlack:
   1628                     {
   1629                         xVSS_context->pSettings->pTransitionList[i]->
   1630                             ExtVideoTransitionFct = &M4xVSS_FadeBlackTransition;
   1631                     }
   1632                     break;
   1633 
   1634                 case M4xVSS_kVideoTransitionType_External:
   1635                     {
   1636                         xVSS_context->pSettings->pTransitionList[i]->
   1637                             ExtVideoTransitionFct =
   1638                             pSettings->pTransitionList[i]->ExtVideoTransitionFct;
   1639                         xVSS_context->pSettings->pTransitionList[i]->
   1640                             pExtVideoTransitionFctCtxt =
   1641                             pSettings->pTransitionList[i]->
   1642                             pExtVideoTransitionFctCtxt;
   1643                         xVSS_context->pSettings->pTransitionList[i]->
   1644                             VideoTransitionType =
   1645                             M4VSS3GPP_kVideoTransitionType_External;
   1646                     }
   1647                     break;
   1648 
   1649                 default:
   1650                     break;
   1651                 } // switch
   1652 
   1653             /* Update total_duration with transition duration */
   1654             totalDuration -= xVSS_context->pSettings->
   1655                 pTransitionList[i]->uiTransitionDuration;
   1656         }
   1657 
   1658 
   1659         if( xVSS_context->pSettings->pClipList[i]->FileType
   1660             == M4VIDEOEDITING_kFileType_ARGB8888 )
   1661         {
   1662             if(M4OSA_TRUE ==
   1663                    xVSS_context->pSettings->pClipList[i]->xVSS.isPanZoom) {
   1664                 M4OSA_Char out_img[M4XVSS_MAX_PATH_LEN];
   1665                 M4OSA_Char out_img_tmp[M4XVSS_MAX_PATH_LEN];
   1666                 M4xVSS_Pto3GPP_params *pParams = M4OSA_NULL;
   1667                 M4OSA_Context pARGBFileIn;
   1668                 /*UTF conversion support*/
   1669                 M4OSA_Void *pDecodedPath = pSettings->pClipList[i]->pFile;
   1670 
   1671                 /* Parse Pto3GPP params chained list to know if input file has already been
   1672                 converted */
   1673                 if( xVSS_context->pPTo3GPPparamsList != M4OSA_NULL )
   1674                 {
   1675                     M4OSA_UInt32 pCmpResult = 0;
   1676 
   1677                     pParams = xVSS_context->pPTo3GPPparamsList;
   1678                     /* We parse all Pto3gpp Param chained list */
   1679                     while( pParams != M4OSA_NULL )
   1680                     {
   1681                         pCmpResult = strcmp((const char *)pSettings->pClipList[i]->pFile,
   1682                             (const char *)pParams->pFileIn);
   1683 
   1684                         if( pCmpResult == 0
   1685                             && (pSettings->pClipList[i]->uiEndCutTime
   1686                             == pParams->duration
   1687                             || pSettings->pClipList[i]->xVSS.uiDuration
   1688                             == pParams->duration)
   1689                             && pSettings->pClipList[i]->xVSS.MediaRendering
   1690                             == pParams->MediaRendering )
   1691 
   1692 
   1693 
   1694                         {
   1695                             /* Replace JPG filename with existing 3GP filename */
   1696                             goto replaceARGB_3GP;
   1697                         }
   1698                         /* We need to update this variable, in case some pictures have been
   1699                          added between two */
   1700                         /* calls to M4xVSS_sendCommand */
   1701                         pPto3GPP_last = pParams;
   1702                         pParams = pParams->pNext;
   1703                     }
   1704                 }
   1705 
   1706                 /* Construct output temporary 3GP filename */
   1707                 err = M4OSA_chrSPrintf(out_img, M4XVSS_MAX_PATH_LEN - 1, (M4OSA_Char *)"%simg%d.3gp",
   1708                     xVSS_context->pTempPath, xVSS_context->tempFileIndex);
   1709 
   1710                 if( err != M4NO_ERROR )
   1711                 {
   1712                     M4OSA_TRACE1_1("Error in M4OSA_chrSPrintf: 0x%x", err);
   1713                     /*FB: to avoid leaks when there is an error in the send command*/
   1714                     /* Free Send command */
   1715                     M4xVSS_freeCommand(xVSS_context);
   1716                     /**/
   1717                     return err;
   1718                 }
   1719 
   1720     #ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE
   1721 
   1722                 err = M4OSA_chrSPrintf(out_img_tmp, M4XVSS_MAX_PATH_LEN - 1, "%simg%d.tmp",
   1723                     xVSS_context->pTempPath, xVSS_context->tempFileIndex);
   1724 
   1725                 if( err != M4NO_ERROR )
   1726                 {
   1727                     M4OSA_TRACE1_1("Error in M4OSA_chrSPrintf: 0x%x", err);
   1728                     /*FB: to avoid leaks when there is an error in the send command*/
   1729                     /* Free Send command */
   1730                     M4xVSS_freeCommand(xVSS_context);
   1731                     /**/
   1732                     return err;
   1733                 }
   1734 
   1735     #endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/
   1736 
   1737                 xVSS_context->tempFileIndex++;
   1738 
   1739                 /* Allocate last element Pto3GPP params structure */
   1740                 pParams = (M4xVSS_Pto3GPP_params
   1741                     *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_Pto3GPP_params),
   1742                     M4VS, (M4OSA_Char *)"Element of Pto3GPP Params");
   1743 
   1744                 if( pParams == M4OSA_NULL )
   1745                 {
   1746                     M4OSA_TRACE1_0(
   1747                         "M4xVSS_sendCommand: Problem when allocating one element Pto3GPP Params");
   1748                     /*FB: to avoid leaks when there is an error in the send command*/
   1749                     /* Free Send command */
   1750                     M4xVSS_freeCommand(xVSS_context);
   1751                     /**/
   1752                     return M4ERR_ALLOC;
   1753                 }
   1754 
   1755                 /* Initializes pfilexxx members of pParams to be able to free them correctly */
   1756                 pParams->pFileIn = M4OSA_NULL;
   1757                 pParams->pFileOut = M4OSA_NULL;
   1758                 pParams->pFileTemp = M4OSA_NULL;
   1759                 pParams->pNext = M4OSA_NULL;
   1760                 pParams->MediaRendering = M4xVSS_kResizing;
   1761 
   1762                 /*To support ARGB8888 :get the width and height */
   1763                 pParams->height = pSettings->pClipList[
   1764                     i]->ClipProperties.uiStillPicHeight; //ARGB_Height;
   1765                     pParams->width = pSettings->pClipList[
   1766                         i]->ClipProperties.uiStillPicWidth; //ARGB_Width;
   1767                         M4OSA_TRACE3_1("CLIP M4xVSS_SendCommand ARGB8888 H = %d", pParams->height);
   1768                         M4OSA_TRACE3_1("CLIP M4xVSS_SendCommand ARGB8888 W = %d", pParams->width);
   1769 
   1770                         if( xVSS_context->pPTo3GPPparamsList
   1771                             == M4OSA_NULL ) /* Means it is the first element of the list */
   1772                         {
   1773                             /* Initialize the xVSS context with the first element of the list */
   1774                             xVSS_context->pPTo3GPPparamsList = pParams;
   1775 
   1776                             /* Save this element in case of other file to convert */
   1777                             pPto3GPP_last = pParams;
   1778                         }
   1779                         else
   1780                         {
   1781                             /* Update next pointer of the previous last element of the chain */
   1782                             pPto3GPP_last->pNext = pParams;
   1783 
   1784                             /* Update save of last element of the chain */
   1785                             pPto3GPP_last = pParams;
   1786                         }
   1787 
   1788                         /* Fill the last M4xVSS_Pto3GPP_params element */
   1789                         pParams->duration =
   1790                             xVSS_context->pSettings->pClipList[i]->uiEndCutTime;
   1791                         /* If duration is filled, let's use it instead of EndCutTime */
   1792                         if( xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration != 0 )
   1793                         {
   1794                             pParams->duration =
   1795                                 xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration;
   1796                         }
   1797 
   1798                         pParams->InputFileType = M4VIDEOEDITING_kFileType_ARGB8888;
   1799 
   1800                         /**
   1801                         * UTF conversion: convert into the customer format, before being used*/
   1802                         pDecodedPath = xVSS_context->pSettings->pClipList[i]->pFile;
   1803                         length = strlen(pDecodedPath);
   1804 
   1805                         /**
   1806                         * UTF conversion: convert into the customer format, before being used*/
   1807                         if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
   1808                             != M4OSA_NULL && xVSS_context->
   1809                             UTFConversionContext.pTempOutConversionBuffer
   1810                             != M4OSA_NULL )
   1811                         {
   1812                             err = M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void
   1813                                 *)xVSS_context->pSettings->pClipList[i]->pFile,
   1814                                 (M4OSA_Void *)xVSS_context->
   1815                                 UTFConversionContext.pTempOutConversionBuffer,
   1816                                 &length);
   1817 
   1818                             if( err != M4NO_ERROR )
   1819                             {
   1820                                 M4OSA_TRACE1_1(
   1821                                     "M4xVSS_SendCommand: pConvFromUTF8Fct returns err: 0x%x",
   1822                                     err);
   1823                                 /* Free Send command */
   1824                                 M4xVSS_freeCommand(xVSS_context);
   1825                                 return err;
   1826                             }
   1827                             pDecodedPath =
   1828                                 xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
   1829                         }
   1830 
   1831                         /**
   1832                         * End of the UTF conversion, use the converted file path*/
   1833                         pParams->pFileIn = (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS,
   1834                             (M4OSA_Char *)"Pto3GPP Params: file in");
   1835 
   1836                         if( pParams->pFileIn == M4OSA_NULL )
   1837                         {
   1838                             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   1839                             /*FB: to avoid leaks when there is an error in the send command*/
   1840                             /* Free Send command */
   1841                             M4xVSS_freeCommand(xVSS_context);
   1842                             /**/
   1843                             return M4ERR_ALLOC;
   1844                         }
   1845                         memcpy((void *)pParams->pFileIn, (void *)pDecodedPath,
   1846                             (length + 1)); /* Copy input file path */
   1847 
   1848                         /* Check that JPG file is present on the FS (P4ME00002974) by just opening
   1849                          and closing it */
   1850                         err =
   1851                             xVSS_context->pFileReadPtr->openRead(&pARGBFileIn, pDecodedPath,
   1852                             M4OSA_kFileRead);
   1853 
   1854                         if( err != M4NO_ERROR )
   1855                         {
   1856                             M4OSA_TRACE1_2("Can't open input jpg file %s, error: 0x%x\n",
   1857                                 pDecodedPath, err);
   1858                             /* Free Send command */
   1859                             M4xVSS_freeCommand(xVSS_context);
   1860                             return err;
   1861                         }
   1862                         err = xVSS_context->pFileReadPtr->closeRead(pARGBFileIn);
   1863 
   1864                         if( err != M4NO_ERROR )
   1865                         {
   1866                             M4OSA_TRACE1_2("Can't close input jpg file %s, error: 0x%x\n",
   1867                                 pDecodedPath, err);
   1868                             /* Free Send command */
   1869                             M4xVSS_freeCommand(xVSS_context);
   1870                             return err;
   1871                         }
   1872 
   1873                         /**
   1874                         * UTF conversion: convert into the customer format, before being used*/
   1875                         pDecodedPath = out_img;
   1876                         length = strlen(pDecodedPath);
   1877 
   1878                         if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
   1879                             != M4OSA_NULL && xVSS_context->
   1880                             UTFConversionContext.pTempOutConversionBuffer
   1881                             != M4OSA_NULL )
   1882                         {
   1883                             err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   1884                                 (M4OSA_Void *)out_img, (M4OSA_Void *)xVSS_context->
   1885                                 UTFConversionContext.pTempOutConversionBuffer, &length);
   1886 
   1887                             if( err != M4NO_ERROR )
   1888                             {
   1889                                 M4OSA_TRACE1_1(
   1890                                     "M4xVSS_SendCommand: pConvFromUTF8Fct returns err: 0x%x",
   1891                                     err);
   1892                                 /* Free Send command */
   1893                                 M4xVSS_freeCommand(xVSS_context);
   1894                                 return err;
   1895                             }
   1896                             pDecodedPath =
   1897                                 xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
   1898                         }
   1899 
   1900                         /**
   1901                         * End of the UTF conversion, use the converted file path*/
   1902                         pParams->pFileOut = (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS,
   1903                             (M4OSA_Char *)"Pto3GPP Params: file out");
   1904 
   1905                         if( pParams->pFileOut == M4OSA_NULL )
   1906                         {
   1907                             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   1908                             /*FB: to avoid leaks when there is an error in the send command*/
   1909                             /* Free Send command */
   1910                             M4xVSS_freeCommand(xVSS_context);
   1911                             /**/
   1912                             return M4ERR_ALLOC;
   1913                         }
   1914                         memcpy((void *)pParams->pFileOut, (void *)pDecodedPath,
   1915                             (length + 1)); /* Copy output file path */
   1916 
   1917     #ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE
   1918                         /**
   1919                         * UTF conversion: convert into the customer format, before being used*/
   1920 
   1921                         pDecodedPath = out_img_tmp;
   1922                         length = strlen(pDecodedPath);
   1923 
   1924                         if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
   1925                             != M4OSA_NULL && xVSS_context->
   1926                             UTFConversionContext.pTempOutConversionBuffer
   1927                             != M4OSA_NULL )
   1928                         {
   1929                             err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   1930                                 (M4OSA_Void *)out_img_tmp, (M4OSA_Void *)xVSS_context->
   1931                                 UTFConversionContext.pTempOutConversionBuffer, &length);
   1932 
   1933                             if( err != M4NO_ERROR )
   1934                             {
   1935                                 M4OSA_TRACE1_1("M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8\
   1936                                      returns err: 0x%x",
   1937                                     err);
   1938                                 /* Free Send command */
   1939                                 M4xVSS_freeCommand(xVSS_context);
   1940                                 return err;
   1941                             }
   1942                             pDecodedPath =
   1943                                 xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
   1944                         }
   1945 
   1946                         /**
   1947                         * End of the UTF conversion, use the converted file path*/
   1948                         pParams->pFileTemp = (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS,
   1949                             (M4OSA_Char *)"Pto3GPP Params: file temp");
   1950 
   1951                         if( pParams->pFileTemp == M4OSA_NULL )
   1952                         {
   1953                             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   1954                             /*FB: to avoid leaks when there is an error in the send command*/
   1955                             /* Free Send command */
   1956                             M4xVSS_freeCommand(xVSS_context);
   1957                             /**/
   1958                             return M4ERR_ALLOC;
   1959                         }
   1960                         memcpy((void *)pParams->pFileTemp, (void *)pDecodedPath,
   1961                             (length + 1)); /* Copy temporary file path */
   1962 
   1963     #endif                         /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/
   1964 
   1965                         /* Fill PanAndZoom settings if needed */
   1966 
   1967                         if( M4OSA_TRUE
   1968                             == xVSS_context->pSettings->pClipList[i]->xVSS.isPanZoom )
   1969                         {
   1970                             pParams->isPanZoom =
   1971                                 xVSS_context->pSettings->pClipList[i]->xVSS.isPanZoom;
   1972                             /* Check that Pan & Zoom parameters are corrects */
   1973                             if( xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXa > 1000
   1974                                 || xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXa
   1975                                 <= 0 || xVSS_context->pSettings->pClipList[i]->xVSS.
   1976                                 PanZoomTopleftXa > 1000
   1977                                 || xVSS_context->pSettings->pClipList[i]->xVSS.
   1978                                 PanZoomTopleftYa > 1000
   1979                                 || xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXb
   1980                                 > 1000
   1981                                 || xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXb
   1982                                 <= 0 || xVSS_context->pSettings->pClipList[i]->xVSS.
   1983                                 PanZoomTopleftXb > 1000
   1984                                 || xVSS_context->pSettings->pClipList[i]->xVSS.
   1985                                 PanZoomTopleftYb > 1000)
   1986                             {
   1987                                 M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   1988                                 M4xVSS_freeCommand(xVSS_context);
   1989                                 return M4ERR_PARAMETER;
   1990                             }
   1991 
   1992                             pParams->PanZoomXa =
   1993                                 xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXa;
   1994                             pParams->PanZoomTopleftXa =
   1995                                 xVSS_context->pSettings->
   1996                                 pClipList[i]->xVSS.PanZoomTopleftXa;
   1997                             pParams->PanZoomTopleftYa =
   1998                                 xVSS_context->pSettings->
   1999                                 pClipList[i]->xVSS.PanZoomTopleftYa;
   2000                             pParams->PanZoomXb =
   2001                                 xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXb;
   2002                             pParams->PanZoomTopleftXb =
   2003                                 xVSS_context->pSettings->
   2004                                 pClipList[i]->xVSS.PanZoomTopleftXb;
   2005                             pParams->PanZoomTopleftYb =
   2006                                 xVSS_context->pSettings->
   2007                                 pClipList[i]->xVSS.PanZoomTopleftYb;
   2008                         }
   2009                         else
   2010                         {
   2011                             pParams->isPanZoom = M4OSA_FALSE;
   2012                         }
   2013                         /*+ PR No: blrnxpsw#223*/
   2014                         /*Intializing the Video Frame Rate as it may not be intialized*/
   2015                         /*Other changes made is @ M4xVSS_Internal.c @ line 1518 in
   2016                         M4xVSS_internalStartConvertPictureTo3gp*/
   2017                         switch( xVSS_context->pSettings->videoFrameRate )
   2018                         {
   2019                             case M4VIDEOEDITING_k30_FPS:
   2020                                 pParams->framerate = 33;
   2021                                 break;
   2022 
   2023                             case M4VIDEOEDITING_k25_FPS:
   2024                                 pParams->framerate = 40;
   2025                                 break;
   2026 
   2027                             case M4VIDEOEDITING_k20_FPS:
   2028                                 pParams->framerate = 50;
   2029                                 break;
   2030 
   2031                             case M4VIDEOEDITING_k15_FPS:
   2032                                 pParams->framerate = 66;
   2033                                 break;
   2034 
   2035                             case M4VIDEOEDITING_k12_5_FPS:
   2036                                 pParams->framerate = 80;
   2037                                 break;
   2038 
   2039                             case M4VIDEOEDITING_k10_FPS:
   2040                                 pParams->framerate = 100;
   2041                                 break;
   2042 
   2043                             case M4VIDEOEDITING_k7_5_FPS:
   2044                                 pParams->framerate = 133;
   2045                                 break;
   2046 
   2047                             case M4VIDEOEDITING_k5_FPS:
   2048                                 pParams->framerate = 200;
   2049                                 break;
   2050 
   2051                             default:
   2052                                 /*Making Default Frame Rate @ 15 FPS*/
   2053                                 pParams->framerate = 66;
   2054                                 break;
   2055                         }
   2056                         /*-PR No: blrnxpsw#223*/
   2057                         if( xVSS_context->pSettings->pClipList[i]->xVSS.MediaRendering
   2058                             == M4xVSS_kCropping
   2059                             || xVSS_context->pSettings->pClipList[i]->xVSS.
   2060                             MediaRendering == M4xVSS_kBlackBorders
   2061                             || xVSS_context->pSettings->pClipList[i]->xVSS.
   2062                             MediaRendering == M4xVSS_kResizing )
   2063                         {
   2064                             pParams->MediaRendering =
   2065                                 xVSS_context->pSettings->pClipList[i]->xVSS.MediaRendering;
   2066                         }
   2067 
   2068                         pParams->pNext = M4OSA_NULL;
   2069                         pParams->isCreated = M4OSA_FALSE;
   2070                         xVSS_context->nbStepTotal++;
   2071                        /* Set bTranscodingRequired to TRUE to indicate the kenburn video has
   2072                         * been generated in analysis phase, and does not need to be tanscoded again
   2073                         * in saving phase */
   2074                         xVSS_context->pSettings->pClipList[i]->bTranscodingRequired =
   2075                            M4OSA_TRUE;
   2076 
   2077     replaceARGB_3GP:
   2078                         /* Update total duration */
   2079                         totalDuration += pParams->duration;
   2080 
   2081                         /* Replacing in VSS structure the JPG file by the 3gp file */
   2082                         xVSS_context->pSettings->pClipList[i]->FileType =
   2083                             M4VIDEOEDITING_kFileType_3GPP;
   2084 
   2085                         if( xVSS_context->pSettings->pClipList[i]->pFile != M4OSA_NULL )
   2086                         {
   2087                             free(xVSS_context->pSettings->pClipList[i]->pFile);
   2088                             xVSS_context->pSettings->pClipList[i]->pFile = M4OSA_NULL;
   2089                         }
   2090 
   2091                         /**
   2092                         * UTF conversion: convert into UTF8, before being used*/
   2093                         pDecodedPath = pParams->pFileOut;
   2094 
   2095                         if( xVSS_context->UTFConversionContext.pConvToUTF8Fct != M4OSA_NULL
   2096                             && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
   2097                             != M4OSA_NULL )
   2098                         {
   2099                             err = M4xVSS_internalConvertToUTF8(xVSS_context,
   2100                                 (M4OSA_Void *)pParams->pFileOut,
   2101                                 (M4OSA_Void *)xVSS_context->
   2102                                 UTFConversionContext.pTempOutConversionBuffer,
   2103                                 &length);
   2104 
   2105                             if( err != M4NO_ERROR )
   2106                             {
   2107                                 M4OSA_TRACE1_1(
   2108                                     "M4xVSS_SendCommand: M4xVSS_internalConvertToUTF8 returns err: \
   2109                                     0x%x",err);
   2110                                 /* Free Send command */
   2111                                 M4xVSS_freeCommand(xVSS_context);
   2112                                 return err;
   2113                             }
   2114                             pDecodedPath =
   2115                                 xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
   2116                         }
   2117                         else
   2118                         {
   2119                             length = strlen(pDecodedPath);
   2120                         }
   2121                         /**
   2122                         * End of the UTF conversion, use the converted file path*/
   2123                         xVSS_context->pSettings->pClipList[i]->pFile = M4OSA_32bitAlignedMalloc((length
   2124                             + 1), M4VS, (M4OSA_Char *)"xVSS file path of ARGB to 3gp");
   2125 
   2126                         if( xVSS_context->pSettings->pClipList[i]->pFile == M4OSA_NULL )
   2127                         {
   2128                             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   2129                             /*FB: to avoid leaks when there is an error in the send command*/
   2130                             /* Free Send command */
   2131                             M4xVSS_freeCommand(xVSS_context);
   2132                             /**/
   2133                             return M4ERR_ALLOC;
   2134                         }
   2135                         memcpy((void *)xVSS_context->pSettings->pClipList[i]->pFile,
   2136                             (void *)pDecodedPath, (length + 1));
   2137                         /*FB: add file path size because of UTF16 conversion*/
   2138                         xVSS_context->pSettings->pClipList[i]->filePathSize = length+1;
   2139             }
   2140         }
   2141         /************************
   2142         3GP input file type case
   2143         *************************/
   2144         else if( xVSS_context->pSettings->pClipList[i]->FileType
   2145             == M4VIDEOEDITING_kFileType_3GPP
   2146             || xVSS_context->pSettings->pClipList[i]->FileType
   2147             == M4VIDEOEDITING_kFileType_MP4
   2148             || xVSS_context->pSettings->pClipList[i]->FileType
   2149             == M4VIDEOEDITING_kFileType_M4V )
   2150         {
   2151             /*UTF conversion support*/
   2152             M4OSA_Void *pDecodedPath = M4OSA_NULL;
   2153 
   2154             /* Need to call MCS in case 3GP video/audio types are not compatible
   2155             (H263/MPEG4 or AMRNB/AAC) */
   2156             /* => Need to fill MCS_Params structure with the right parameters ! */
   2157             /* Need also to parse MCS params struct to check if file has already been transcoded */
   2158 
   2159             M4VIDEOEDITING_ClipProperties fileProperties;
   2160             M4xVSS_MCS_params *pParams;
   2161             M4OSA_Bool audioIsDifferent = M4OSA_FALSE;
   2162             M4OSA_Bool videoIsDifferent = M4OSA_FALSE;
   2163             M4OSA_Bool bAudioMono;
   2164             /* Initialize file properties structure */
   2165 
   2166             memset((void *) &fileProperties,0,
   2167                 sizeof(M4VIDEOEDITING_ClipProperties));
   2168 
   2169             //fileProperties.AudioStreamType = M4VIDEOEDITING_kNoneAudio;
   2170 
   2171             /* Prevent from bad initializing of percentage cut time */
   2172             if( xVSS_context->pSettings->pClipList[i]->xVSS.uiEndCutPercent
   2173                             > 100 || xVSS_context->pSettings->pClipList[i]->xVSS.
   2174                             uiBeginCutPercent > 100 )
   2175             {
   2176                 /* These percentage cut time have probably not been initialized */
   2177                 /* Let's not use them by setting them to 0 */
   2178                 xVSS_context->pSettings->pClipList[i]->xVSS.uiEndCutPercent = 0;
   2179                 xVSS_context->pSettings->pClipList[i]->xVSS.uiBeginCutPercent =
   2180                     0;
   2181             }
   2182 
   2183             /**
   2184             * UTF conversion: convert into the customer format, before being used*/
   2185             pDecodedPath = xVSS_context->pSettings->pClipList[i]->pFile;
   2186 
   2187             if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
   2188                 != M4OSA_NULL && xVSS_context->
   2189                 UTFConversionContext.pTempOutConversionBuffer
   2190                 != M4OSA_NULL )
   2191             {
   2192                 err = M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void
   2193                     *)xVSS_context->pSettings->pClipList[i]->pFile,
   2194                     (M4OSA_Void *)xVSS_context->
   2195                     UTFConversionContext.pTempOutConversionBuffer,
   2196                     &length);
   2197 
   2198                 if( err != M4NO_ERROR )
   2199                 {
   2200                     M4OSA_TRACE1_1(
   2201                         "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   2202                         err);
   2203                     /* Free Send command */
   2204                     M4xVSS_freeCommand(xVSS_context);
   2205                     return err;
   2206                 }
   2207                 pDecodedPath =
   2208                     xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
   2209             }
   2210             /**
   2211             * End of the UTF conversion, use the converted file path*/
   2212             err = M4xVSS_internalGetProperties(xVSS_context, pDecodedPath,
   2213                 &fileProperties);
   2214 
   2215             if( err != M4NO_ERROR )
   2216             {
   2217                 M4xVSS_freeCommand(xVSS_context);
   2218                 M4OSA_TRACE1_1(
   2219                     "M4xVSS_sendCommand: M4xVSS_internalGetProperties returned 0x%x",
   2220                     err);
   2221                 /* TODO: Translate error code of MCS to an xVSS error code */
   2222                 return err;
   2223             }
   2224 
   2225             /* Parse MCS params chained list to know if input file has already been converted */
   2226             if( xVSS_context->pMCSparamsList != M4OSA_NULL )
   2227             {
   2228                 M4OSA_UInt32 pCmpResult = 0;
   2229 
   2230                 pParams = xVSS_context->pMCSparamsList;
   2231                 /* We parse all MCS Param chained list */
   2232                 while( pParams != M4OSA_NULL )
   2233                 {
   2234 
   2235                     /**
   2236                     * UTF conversion: convert into UTF8, before being used*/
   2237                     pDecodedPath = pParams->pFileIn;
   2238 
   2239                     if( xVSS_context->UTFConversionContext.pConvToUTF8Fct
   2240                         != M4OSA_NULL && xVSS_context->
   2241                         UTFConversionContext.pTempOutConversionBuffer
   2242                         != M4OSA_NULL )
   2243                     {
   2244                         err = M4xVSS_internalConvertToUTF8(xVSS_context,
   2245                             (M4OSA_Void *)pParams->pFileIn,
   2246                             (M4OSA_Void *)xVSS_context->
   2247                             UTFConversionContext.
   2248                             pTempOutConversionBuffer, &length);
   2249 
   2250                         if( err != M4NO_ERROR )
   2251                         {
   2252                             M4OSA_TRACE1_1(
   2253                                 "M4xVSS_SendCommand: M4xVSS_internalConvertToUTF8 returns err:\
   2254                                  0x%x", err);
   2255                             /* Free Send command */
   2256                             M4xVSS_freeCommand(xVSS_context);
   2257                             return err;
   2258                         }
   2259                         pDecodedPath = xVSS_context->
   2260                             UTFConversionContext.pTempOutConversionBuffer;
   2261                     }
   2262 
   2263                     /**
   2264                     * End of the UTF conversion, use the converted file path*/
   2265                     pCmpResult = strcmp((const char *)pSettings->pClipList[i]->pFile,
   2266                         (const char *)pDecodedPath);
   2267 
   2268                     /* If input filenames are the same, and if this is not a BGM, we can reuse
   2269                     the transcoded file */
   2270                     if( pCmpResult == 0 && pParams->isBGM == M4OSA_FALSE
   2271                         && pParams->BeginCutTime
   2272                         == pSettings->pClipList[i]->uiBeginCutTime
   2273                         && (pParams->EndCutTime
   2274                         == pSettings->pClipList[i]->uiEndCutTime
   2275                         || pParams->EndCutTime
   2276                         == pSettings->pClipList[i]->uiBeginCutTime
   2277                         + pSettings->pClipList[i]->xVSS.uiDuration)
   2278                         && pSettings->pClipList[i]->xVSS.MediaRendering
   2279                         == pParams->MediaRendering )
   2280                     {
   2281                         if( pSettings->xVSS.pBGMtrack != M4OSA_NULL )
   2282                         {
   2283                             if( pSettings->xVSS.pBGMtrack->uiAddVolume == 100
   2284                                 || (pParams->OutputAudioFormat
   2285                                 == M4VIDEOEDITING_kNullAudio
   2286                                 && fileProperties.AudioStreamType
   2287                                 == pSettings->xVSS.outputAudioFormat)
   2288                                 || pParams->OutputAudioFormat
   2289                                 == pSettings->xVSS.outputAudioFormat
   2290                                 || fileProperties.AudioStreamType
   2291                                 == M4VIDEOEDITING_kNoneAudio )
   2292                             {
   2293                                 /* Replace 3GP filename with transcoded 3GP filename */
   2294                                 goto replace3GP_3GP;
   2295                             }
   2296                         }
   2297                         else if( ( pParams->OutputAudioFormat
   2298                             == M4VIDEOEDITING_kNullAudio
   2299                             && fileProperties.AudioStreamType
   2300                             == pSettings->xVSS.outputAudioFormat)
   2301                             || pParams->OutputAudioFormat
   2302                             == pSettings->xVSS.outputAudioFormat
   2303                             || fileProperties.AudioStreamType
   2304                             == M4VIDEOEDITING_kNoneAudio )
   2305                         {
   2306                             /* Replace 3GP filename with transcoded 3GP filename */
   2307                             goto replace3GP_3GP;
   2308                         }
   2309                     }
   2310 
   2311                     /* We need to update this variable, in case some 3GP files have been added
   2312                     between two */
   2313                     /* calls to M4xVSS_sendCommand */
   2314                     pMCS_last = pParams;
   2315                     pParams = pParams->pNext;
   2316                 }
   2317             }
   2318 
   2319             /* If we have percentage information let's use it... */
   2320             if( xVSS_context->pSettings->pClipList[i]->xVSS.uiEndCutPercent != 0
   2321                 || xVSS_context->pSettings->pClipList[i]->xVSS.uiBeginCutPercent
   2322                 != 0 )
   2323             {
   2324                 /* If percentage information are not correct and if duration field is not filled */
   2325                 if( ( xVSS_context->pSettings->pClipList[i]->xVSS.
   2326                     uiEndCutPercent
   2327                     <= xVSS_context->pSettings->pClipList[i]->xVSS.
   2328                     uiBeginCutPercent)
   2329                     && xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration
   2330                     == 0 )
   2331                 {
   2332                     M4OSA_TRACE1_0(
   2333                         "M4xVSS_sendCommand: Bad percentage for begin and end cut time !");
   2334                     M4xVSS_freeCommand(xVSS_context);
   2335                     return M4ERR_PARAMETER;
   2336                 }
   2337 
   2338                 /* We transform the percentage into absolute time */
   2339                 xVSS_context->pSettings->pClipList[i]->uiBeginCutTime
   2340                     = (M4OSA_UInt32)(
   2341                     xVSS_context->pSettings->pClipList[i]->xVSS.
   2342                     uiBeginCutPercent
   2343                     * fileProperties.uiClipDuration / 100);
   2344                 xVSS_context->pSettings->pClipList[i]->uiEndCutTime
   2345                     = (M4OSA_UInt32)(
   2346                     xVSS_context->pSettings->pClipList[i]->xVSS.
   2347                     uiEndCutPercent
   2348                     * fileProperties.uiClipDuration / 100);
   2349             }
   2350             /* ...Otherwise, we use absolute time. */
   2351             else
   2352             {
   2353                 /* If endCutTime == 0, it means all the file is taken. Let's change to the file
   2354                 duration, to accurate preview. */
   2355                 if( xVSS_context->pSettings->pClipList[i]->uiEndCutTime == 0
   2356                     || xVSS_context->pSettings->pClipList[i]->uiEndCutTime
   2357                     > fileProperties.uiClipDuration )
   2358                 {
   2359                     xVSS_context->pSettings->pClipList[i]->uiEndCutTime =
   2360                         fileProperties.uiClipDuration;
   2361                 }
   2362             }
   2363 
   2364             /* If duration field is filled, it has priority on other fields on EndCutTime,
   2365              so let's use it */
   2366             if( xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration != 0 )
   2367             {
   2368                 xVSS_context->pSettings->pClipList[i]->uiEndCutTime =
   2369                     xVSS_context->pSettings->pClipList[i]->uiBeginCutTime
   2370                     +xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration;
   2371 
   2372                 if( xVSS_context->pSettings->pClipList[i]->uiEndCutTime
   2373                     > fileProperties.uiClipDuration )
   2374                 {
   2375                     xVSS_context->pSettings->pClipList[i]->uiEndCutTime =
   2376                         fileProperties.uiClipDuration;
   2377                 }
   2378             }
   2379 
   2380             /* If output video format is not set, we take video format of the first 3GP video */
   2381             if( xVSS_context->pSettings->xVSS.outputVideoFormat
   2382                 == M4VIDEOEDITING_kNoneVideo )
   2383             {
   2384                 //xVSS_context->pSettings->xVSS.outputVideoFormat = fileProperties.VideoStreamType;
   2385                 //M4OSA_TRACE2_1("Output video format is not set, set it to current clip: %d",
   2386                 // xVSS_context->pSettings->xVSS.outputVideoFormat);
   2387                 M4OSA_TRACE1_0(
   2388                     "Output video format is not set, an error parameter is returned.");
   2389                 M4xVSS_freeCommand(xVSS_context);
   2390                 return M4ERR_PARAMETER;
   2391             }
   2392 
   2393             if( xVSS_context->pSettings->xVSS.outputAudioFormat
   2394                 == M4VIDEOEDITING_kNoneAudio )
   2395             {
   2396                 //xVSS_context->pSettings->xVSS.outputAudioFormat = fileProperties.AudioStreamType;
   2397                 M4OSA_TRACE2_1(
   2398                     "Output audio format is not set -> remove audio track of clip: %d",
   2399                     i);
   2400             }
   2401 
   2402             if( fileProperties.uiNbChannels == 1 )
   2403             {
   2404                 bAudioMono = M4OSA_TRUE;
   2405             }
   2406             else
   2407             {
   2408                 bAudioMono = M4OSA_FALSE;
   2409             }
   2410 
   2411             if( fileProperties.AudioStreamType
   2412                 != xVSS_context->pSettings->xVSS.outputAudioFormat
   2413                 || (fileProperties.AudioStreamType == M4VIDEOEDITING_kAAC
   2414                 && (fileProperties.uiSamplingFrequency != samplingFreq
   2415                 || bAudioMono
   2416                 != xVSS_context->pSettings->xVSS.bAudioMono)) )
   2417             {
   2418                 audioIsDifferent = M4OSA_TRUE;
   2419                 /* If we want to replace audio, there is no need to transcode audio */
   2420                 if( pSettings->xVSS.pBGMtrack != M4OSA_NULL )
   2421                 {
   2422                     /* temp fix :PT volume not herad in the second clip */
   2423                     if( /*(pSettings->xVSS.pBGMtrack->uiAddVolume == 100
   2424                         && xVSS_context->pSettings->xVSS.outputFileSize == 0)
   2425                         ||*/
   2426                         fileProperties.AudioStreamType
   2427                         == M4VIDEOEDITING_kNoneAudio ) /*11/12/2008 CR 3283 VAL for the MMS
   2428                         use case, we need to transcode except the media without audio*/
   2429                     {
   2430                         audioIsDifferent = M4OSA_FALSE;
   2431                     }
   2432                 }
   2433                 else if( fileProperties.AudioStreamType
   2434                     == M4VIDEOEDITING_kNoneAudio )
   2435                 {
   2436                     audioIsDifferent = M4OSA_FALSE;
   2437                 }
   2438             }
   2439             /* Here check the clip video profile and level, if it exceeds
   2440              * the profile and level of export file, then the file needs
   2441              * to be transcoded(do not do compress domain trim).
   2442              * Also for MPEG4 fomart, always do transcoding since HW encoder
   2443              * may use different time scale value than the input clip*/
   2444            if ((fileProperties.uiVideoProfile >
   2445                      xVSS_context->pSettings->xVSS.outputVideoProfile) ||
   2446                 (fileProperties.uiVideoLevel >
   2447                      xVSS_context->pSettings->xVSS.outputVideoLevel) ||
   2448                 (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)) {
   2449                /* Set bTranscodingRequired to TRUE to indicate the video will be
   2450                 * transcoded in MCS. */
   2451                xVSS_context->pSettings->pClipList[i]->bTranscodingRequired =
   2452                    M4OSA_TRUE;
   2453                videoIsDifferent = M4OSA_TRUE;
   2454            }
   2455 
   2456             if( videoIsDifferent == M4OSA_TRUE || audioIsDifferent == M4OSA_TRUE)
   2457             {
   2458                 M4OSA_Char out_3gp[M4XVSS_MAX_PATH_LEN];
   2459                 M4OSA_Char out_3gp_tmp[M4XVSS_MAX_PATH_LEN];
   2460 
   2461                 /* Construct output temporary 3GP filename */
   2462                 err = M4OSA_chrSPrintf(out_3gp, M4XVSS_MAX_PATH_LEN - 1, (M4OSA_Char *)"%svid%d.3gp",
   2463                     xVSS_context->pTempPath, xVSS_context->tempFileIndex);
   2464 
   2465                 if( err != M4NO_ERROR )
   2466                 {
   2467                     M4OSA_TRACE1_1("Error in M4OSA_chrSPrintf: 0x%x", err);
   2468                     return err;
   2469                 }
   2470 
   2471 #ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE
   2472 
   2473                 err = M4OSA_chrSPrintf(out_3gp_tmp, M4XVSS_MAX_PATH_LEN - 1, "%svid%d.tmp",
   2474                     xVSS_context->pTempPath, xVSS_context->tempFileIndex);
   2475 
   2476                 if( err != M4NO_ERROR )
   2477                 {
   2478                     M4OSA_TRACE1_1("Error in M4OSA_chrSPrintf: 0x%x", err);
   2479                     return err;
   2480                 }
   2481 
   2482 #endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/
   2483 
   2484                 xVSS_context->tempFileIndex++;
   2485 
   2486                 pParams =
   2487                     (M4xVSS_MCS_params *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_MCS_params),
   2488                     M4VS, (M4OSA_Char *)"Element of MCS Params (for 3GP)");
   2489 
   2490                 if( pParams == M4OSA_NULL )
   2491                 {
   2492                     M4OSA_TRACE1_0(
   2493                         "M4xVSS_sendCommand: Problem when allocating one element MCS Params");
   2494                     /*FB: to avoid leaks when there is an error in the send command*/
   2495                     /* Free Send command */
   2496                     M4xVSS_freeCommand(xVSS_context);
   2497                     /**/
   2498                     return M4ERR_ALLOC;
   2499                 }
   2500                 pParams->MediaRendering = M4xVSS_kResizing;
   2501                 pParams->videoclipnumber = i; // Indicates video clip index
   2502 
   2503                 if( xVSS_context->pMCSparamsList
   2504                     == M4OSA_NULL ) /* Means it is the first element of the list */
   2505                 {
   2506                     /* Initialize the xVSS context with the first element of the list */
   2507                     xVSS_context->pMCSparamsList = pParams;
   2508                 }
   2509                 else
   2510                 {
   2511                     /* Update next pointer of the previous last element of the chain */
   2512                     pMCS_last->pNext = pParams;
   2513                 }
   2514 
   2515                 /* Save this element in case of other file to convert */
   2516                 pMCS_last = pParams;
   2517 
   2518                 /* Fill the last M4xVSS_MCS_params element */
   2519                 pParams->InputFileType = M4VIDEOEDITING_kFileType_3GPP;
   2520                 pParams->OutputFileType = M4VIDEOEDITING_kFileType_3GPP;
   2521 
   2522                 pParams->OutputVideoTimescale = xVSS_context->targetedTimescale;
   2523 
   2524                 /* We do not need to reencode video if its parameters do not differ */
   2525                 /* from output settings parameters */
   2526                 if( videoIsDifferent == M4OSA_TRUE )
   2527                 {
   2528                     pParams->OutputVideoFormat =
   2529                         xVSS_context->pSettings->xVSS.outputVideoFormat;
   2530                     pParams->outputVideoProfile =
   2531                         xVSS_context->pSettings->xVSS.outputVideoProfile;
   2532                     pParams->outputVideoLevel =
   2533                         xVSS_context->pSettings->xVSS.outputVideoLevel;
   2534                     pParams->OutputVideoFrameRate =
   2535                         xVSS_context->pSettings->videoFrameRate;
   2536                     pParams->OutputVideoFrameSize =
   2537                         xVSS_context->pSettings->xVSS.outputVideoSize;
   2538 
   2539                     /*FB: VAL CR P4ME00003076
   2540                     The output video bitrate is now directly given by the user in the edition
   2541                     settings structure If the bitrate given by the user is irrelevant
   2542                     (the MCS minimum and maximum video bitrate are used),
   2543                     the output video bitrate is hardcoded according to the output video size*/
   2544                     if( xVSS_context->pSettings->xVSS.outputVideoBitrate
   2545                         >= M4VIDEOEDITING_k16_KBPS
   2546                         && xVSS_context->pSettings->xVSS.outputVideoBitrate
   2547                         <= M4VIDEOEDITING_k8_MBPS ) /*+ New Encoder bitrates */
   2548                     {
   2549                         pParams->OutputVideoBitrate =
   2550                             xVSS_context->pSettings->xVSS.outputVideoBitrate;
   2551                     }
   2552                     else
   2553                     {
   2554                         switch( xVSS_context->pSettings->xVSS.outputVideoSize )
   2555                         {
   2556                             case M4VIDEOEDITING_kSQCIF:
   2557                                 pParams->OutputVideoBitrate =
   2558                                     M4VIDEOEDITING_k48_KBPS;
   2559                                 break;
   2560 
   2561                             case M4VIDEOEDITING_kQQVGA:
   2562                                 pParams->OutputVideoBitrate =
   2563                                     M4VIDEOEDITING_k64_KBPS;
   2564                                 break;
   2565 
   2566                             case M4VIDEOEDITING_kQCIF:
   2567                                 pParams->OutputVideoBitrate =
   2568                                     M4VIDEOEDITING_k128_KBPS;
   2569                                 break;
   2570 
   2571                             case M4VIDEOEDITING_kQVGA:
   2572                                 pParams->OutputVideoBitrate =
   2573                                     M4VIDEOEDITING_k384_KBPS;
   2574                                 break;
   2575 
   2576                             case M4VIDEOEDITING_kCIF:
   2577                                 pParams->OutputVideoBitrate =
   2578                                     M4VIDEOEDITING_k384_KBPS;
   2579                                 break;
   2580 
   2581                             case M4VIDEOEDITING_kVGA:
   2582                                 pParams->OutputVideoBitrate =
   2583                                     M4VIDEOEDITING_k512_KBPS;
   2584                                 break;
   2585 
   2586                             default: /* Should not happen !! */
   2587                                 pParams->OutputVideoBitrate =
   2588                                     M4VIDEOEDITING_k64_KBPS;
   2589                                 break;
   2590                         }
   2591                     }
   2592                 }
   2593                 else
   2594                 {
   2595                     pParams->outputVideoProfile =
   2596                         xVSS_context->pSettings->xVSS.outputVideoProfile;
   2597                     pParams->outputVideoLevel =
   2598                         xVSS_context->pSettings->xVSS.outputVideoLevel;
   2599                     pParams->OutputVideoFormat = M4VIDEOEDITING_kNullVideo;
   2600                     pParams->OutputVideoFrameRate =
   2601                         M4VIDEOEDITING_k15_FPS; /* Must be set, otherwise, MCS returns an error */
   2602                 }
   2603 
   2604                 if( audioIsDifferent == M4OSA_TRUE )
   2605                 {
   2606                     pParams->OutputAudioFormat =
   2607                         xVSS_context->pSettings->xVSS.outputAudioFormat;
   2608 
   2609                     switch( xVSS_context->pSettings->xVSS.outputAudioFormat )
   2610                     {
   2611                         case M4VIDEOEDITING_kNoneAudio:
   2612                             break;
   2613 
   2614                         case M4VIDEOEDITING_kAMR_NB:
   2615                             pParams->OutputAudioBitrate =
   2616                                 M4VIDEOEDITING_k12_2_KBPS;
   2617                             pParams->bAudioMono = M4OSA_TRUE;
   2618                             pParams->OutputAudioSamplingFrequency =
   2619                                 M4VIDEOEDITING_kDefault_ASF;
   2620                             break;
   2621 
   2622                         case M4VIDEOEDITING_kAAC:
   2623                             {
   2624                                 /*FB: VAL CR P4ME00003076
   2625                                 The output audio bitrate in the AAC case is now directly given by
   2626                                 the user in the edition settings structure
   2627                                 If the bitrate given by the user is irrelevant or undefined
   2628                                 (the MCS minimum and maximum audio bitrate are used),
   2629                                 the output audio bitrate is hard coded according to the output
   2630                                 audio sampling frequency*/
   2631 
   2632                                 /*Check if the audio bitrate is correctly defined*/
   2633 
   2634                                 /*Mono
   2635                                 MCS values for AAC Mono are min: 16kbps and max: 192 kbps*/
   2636                                 if( xVSS_context->pSettings->xVSS.outputAudioBitrate
   2637                                     >= M4VIDEOEDITING_k16_KBPS
   2638                                     && xVSS_context->pSettings->
   2639                                     xVSS.outputAudioBitrate
   2640                                     <= M4VIDEOEDITING_k192_KBPS
   2641                                     && xVSS_context->pSettings->xVSS.bAudioMono
   2642                                     == M4OSA_TRUE )
   2643                                 {
   2644                                     pParams->OutputAudioBitrate =
   2645                                         xVSS_context->pSettings->
   2646                                         xVSS.outputAudioBitrate;
   2647                                 }
   2648                                 /*Stereo
   2649                                 MCS values for AAC Mono are min: 32kbps and max: 192 kbps*/
   2650                                 else if( xVSS_context->pSettings->
   2651                                     xVSS.outputAudioBitrate
   2652                                     >= M4VIDEOEDITING_k32_KBPS
   2653                                     && xVSS_context->pSettings->
   2654                                     xVSS.outputAudioBitrate
   2655                                     <= M4VIDEOEDITING_k192_KBPS
   2656                                     && xVSS_context->pSettings->xVSS.bAudioMono
   2657                                     == M4OSA_FALSE )
   2658                                 {
   2659                                     pParams->OutputAudioBitrate =
   2660                                         xVSS_context->pSettings->
   2661                                         xVSS.outputAudioBitrate;
   2662                                 }
   2663 
   2664                                 /*The audio bitrate is hard coded according to the output audio
   2665                                  sampling frequency*/
   2666                                 else
   2667                                 {
   2668                                     switch( xVSS_context->pSettings->
   2669                                         xVSS.outputAudioSamplFreq )
   2670                                     {
   2671                                         case M4VIDEOEDITING_k16000_ASF:
   2672                                             pParams->OutputAudioBitrate =
   2673                                                 M4VIDEOEDITING_k24_KBPS;
   2674                                             break;
   2675 
   2676                                         case M4VIDEOEDITING_k22050_ASF:
   2677                                         case M4VIDEOEDITING_k24000_ASF:
   2678                                             pParams->OutputAudioBitrate =
   2679                                                 M4VIDEOEDITING_k32_KBPS;
   2680                                             break;
   2681 
   2682                                         case M4VIDEOEDITING_k32000_ASF:
   2683                                             pParams->OutputAudioBitrate =
   2684                                                 M4VIDEOEDITING_k48_KBPS;
   2685                                             break;
   2686 
   2687                                         case M4VIDEOEDITING_k44100_ASF:
   2688                                         case M4VIDEOEDITING_k48000_ASF:
   2689                                             pParams->OutputAudioBitrate =
   2690                                                 M4VIDEOEDITING_k64_KBPS;
   2691                                             break;
   2692 
   2693                                         default:
   2694                                             pParams->OutputAudioBitrate =
   2695                                                 M4VIDEOEDITING_k64_KBPS;
   2696                                             break;
   2697                                     }
   2698 
   2699                                     if( xVSS_context->pSettings->xVSS.bAudioMono
   2700                                         == M4OSA_FALSE )
   2701                                     {
   2702                                         /* Output bitrate have to be doubled */
   2703                                         pParams->OutputAudioBitrate +=
   2704                                             pParams->OutputAudioBitrate;
   2705                                     }
   2706                                 }
   2707 
   2708                                 pParams->bAudioMono =
   2709                                     xVSS_context->pSettings->xVSS.bAudioMono;
   2710 
   2711                                 if( xVSS_context->pSettings->
   2712                                     xVSS.outputAudioSamplFreq
   2713                                     == M4VIDEOEDITING_k8000_ASF )
   2714                                 {
   2715                                     /* Prevent from unallowed sampling frequencies */
   2716                                     pParams->OutputAudioSamplingFrequency =
   2717                                         M4VIDEOEDITING_kDefault_ASF;
   2718                                 }
   2719                                 else
   2720                                 {
   2721                                     pParams->OutputAudioSamplingFrequency =
   2722                                         xVSS_context->pSettings->
   2723                                         xVSS.outputAudioSamplFreq;
   2724                                 }
   2725                                 break;
   2726                             }
   2727 
   2728                         default: /* Should not happen !! */
   2729                             pParams->OutputAudioFormat = M4VIDEOEDITING_kAMR_NB;
   2730                             pParams->OutputAudioBitrate =
   2731                                 M4VIDEOEDITING_k12_2_KBPS;
   2732                             pParams->bAudioMono = M4OSA_TRUE;
   2733                             pParams->OutputAudioSamplingFrequency =
   2734                                 M4VIDEOEDITING_kDefault_ASF;
   2735                             break;
   2736                         }
   2737                 }
   2738                 else
   2739                 {
   2740                     pParams->OutputAudioFormat = M4VIDEOEDITING_kNullAudio;
   2741                 }
   2742 
   2743                 /**
   2744                 * UTF conversion: convert into the customer format, before being used*/
   2745                 pDecodedPath = xVSS_context->pSettings->pClipList[i]->pFile;
   2746                 length = strlen(pDecodedPath);
   2747 
   2748                 if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
   2749                     != M4OSA_NULL && xVSS_context->
   2750                     UTFConversionContext.pTempOutConversionBuffer
   2751                     != M4OSA_NULL )
   2752                 {
   2753                     err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   2754                         (M4OSA_Void *)xVSS_context->pSettings->
   2755                         pClipList[i]->pFile,
   2756                         (M4OSA_Void *)xVSS_context->
   2757                         UTFConversionContext.pTempOutConversionBuffer,
   2758                         &length);
   2759 
   2760                     if( err != M4NO_ERROR )
   2761                     {
   2762                         M4OSA_TRACE1_1(
   2763                             "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   2764                             err);
   2765                         /* Free Send command */
   2766                         M4xVSS_freeCommand(xVSS_context);
   2767                         return err;
   2768                     }
   2769                     pDecodedPath = xVSS_context->
   2770                         UTFConversionContext.pTempOutConversionBuffer;
   2771                 }
   2772 
   2773                 /**
   2774                 * End of the UTF conversion, use the converted file path*/
   2775                 pParams->pFileIn =
   2776                     (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS,
   2777                     (M4OSA_Char *)"MCS 3GP Params: file in");
   2778 
   2779                 if( pParams->pFileIn == M4OSA_NULL )
   2780                 {
   2781                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   2782                     /*FB: to avoid leaks when there is an error in the send command*/
   2783                     /* Free Send command */
   2784                     M4xVSS_freeCommand(xVSS_context);
   2785                     /**/
   2786                     return M4ERR_ALLOC;
   2787                 }
   2788                 memcpy((void *)pParams->pFileIn, (void *)pDecodedPath,
   2789                     (length + 1)); /* Copy input file path */
   2790 
   2791                 /**
   2792                 * UTF conversion: convert into the customer format, before being used*/
   2793                 pDecodedPath = out_3gp;
   2794                 length = strlen(pDecodedPath);
   2795 
   2796                 if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
   2797                     != M4OSA_NULL && xVSS_context->
   2798                     UTFConversionContext.pTempOutConversionBuffer
   2799                     != M4OSA_NULL )
   2800                 {
   2801                     err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   2802                         (M4OSA_Void *)out_3gp, (M4OSA_Void *)xVSS_context->
   2803                         UTFConversionContext.pTempOutConversionBuffer,
   2804                         &length);
   2805 
   2806                     if( err != M4NO_ERROR )
   2807                     {
   2808                         M4OSA_TRACE1_1(
   2809                             "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   2810                             err);
   2811                         /* Free Send command */
   2812                         M4xVSS_freeCommand(xVSS_context);
   2813                         return err;
   2814                     }
   2815                     pDecodedPath = xVSS_context->
   2816                         UTFConversionContext.pTempOutConversionBuffer;
   2817                 }
   2818 
   2819                 /**
   2820                 * End of the UTF conversion, use the converted file path*/
   2821                 pParams->pFileOut =
   2822                     (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS,
   2823                     (M4OSA_Char *)"MCS 3GP Params: file out");
   2824 
   2825                 if( pParams->pFileOut == M4OSA_NULL )
   2826                 {
   2827                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   2828                     /*FB: to avoid leaks when there is an error in the send command*/
   2829                     /* Free Send command */
   2830                     M4xVSS_freeCommand(xVSS_context);
   2831                     /**/
   2832                     return M4ERR_ALLOC;
   2833                 }
   2834                 memcpy((void *)pParams->pFileOut, (void *)pDecodedPath,
   2835                     (length + 1)); /* Copy output file path */
   2836 
   2837 #ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE
   2838                 /**
   2839                 * UTF conversion: convert into the customer format, before being used*/
   2840 
   2841                 pDecodedPath = out_3gp_tmp;
   2842                 length = strlen(pDecodedPath);
   2843 
   2844                 if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
   2845                     != M4OSA_NULL && xVSS_context->
   2846                     UTFConversionContext.pTempOutConversionBuffer
   2847                     != M4OSA_NULL )
   2848                 {
   2849                     err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   2850                         (M4OSA_Void *)out_3gp_tmp,
   2851                         (M4OSA_Void *)xVSS_context->
   2852                         UTFConversionContext.pTempOutConversionBuffer,
   2853                         &length);
   2854 
   2855                     if( err != M4NO_ERROR )
   2856                     {
   2857                         M4OSA_TRACE1_1(
   2858                             "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   2859                             err);
   2860                         /* Free Send command */
   2861                         M4xVSS_freeCommand(xVSS_context);
   2862                         return err;
   2863                     }
   2864                     pDecodedPath = xVSS_context->
   2865                         UTFConversionContext.pTempOutConversionBuffer;
   2866                 }
   2867 
   2868                 /**
   2869                 * End of the UTF conversion, use the converted file path*/
   2870                 pParams->pFileTemp =
   2871                     (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS,
   2872                     (M4OSA_Char *)"MCS 3GP Params: file temp");
   2873 
   2874                 if( pParams->pFileTemp == M4OSA_NULL )
   2875                 {
   2876                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   2877                     /*FB: to avoid leaks when there is an error in the send command*/
   2878                     /* Free Send command */
   2879                     M4xVSS_freeCommand(xVSS_context);
   2880                     /**/
   2881                     return M4ERR_ALLOC;
   2882                 }
   2883                 memcpy((void *)pParams->pFileTemp, (void *)pDecodedPath,
   2884                     (length + 1)); /* Copy temporary file path */
   2885 
   2886 #else
   2887 
   2888                 pParams->pFileTemp = M4OSA_NULL;
   2889 
   2890 #endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/
   2891 
   2892                 /*FB 2008/10/20 keep media aspect ratio, add media rendering parameter*/
   2893 
   2894                 if( xVSS_context->pSettings->pClipList[i]->xVSS.MediaRendering
   2895                     == M4xVSS_kCropping
   2896                     || xVSS_context->pSettings->pClipList[i]->xVSS.
   2897                     MediaRendering == M4xVSS_kBlackBorders
   2898                     || xVSS_context->pSettings->pClipList[i]->xVSS.
   2899                     MediaRendering == M4xVSS_kResizing )
   2900                 {
   2901                     pParams->MediaRendering =
   2902                         xVSS_context->pSettings->pClipList[i]->xVSS.
   2903                         MediaRendering;
   2904                 }
   2905 
   2906                 /*FB: transcoding per parts*/
   2907                 pParams->BeginCutTime =
   2908                     xVSS_context->pSettings->pClipList[i]->uiBeginCutTime;
   2909                 pParams->EndCutTime =
   2910                     xVSS_context->pSettings->pClipList[i]->uiEndCutTime;
   2911 
   2912                 pParams->pNext = M4OSA_NULL;
   2913                 pParams->isBGM = M4OSA_FALSE;
   2914                 pParams->isCreated = M4OSA_FALSE;
   2915                 xVSS_context->nbStepTotal++;
   2916                 bIsTranscoding = M4OSA_TRUE;
   2917 
   2918 replace3GP_3GP:
   2919                 /* Update total duration */
   2920                 totalDuration +=
   2921                     xVSS_context->pSettings->pClipList[i]->uiEndCutTime
   2922                     - xVSS_context->pSettings->pClipList[i]->uiBeginCutTime;
   2923 
   2924                 /* Replacing in VSS structure the original 3GP file by the transcoded 3GP file */
   2925                 xVSS_context->pSettings->pClipList[i]->FileType =
   2926                     M4VIDEOEDITING_kFileType_3GPP;
   2927 
   2928                 if( xVSS_context->pSettings->pClipList[i]->pFile != M4OSA_NULL )
   2929                 {
   2930                     free(xVSS_context->pSettings->pClipList[i]->pFile);
   2931                     xVSS_context->pSettings->pClipList[i]->pFile = M4OSA_NULL;
   2932                 }
   2933 
   2934                 /**
   2935                 * UTF conversion: convert into the customer format, before being used*/
   2936                 pDecodedPath = pParams->pFileOut;
   2937 
   2938                 if( xVSS_context->UTFConversionContext.pConvToUTF8Fct
   2939                     != M4OSA_NULL && xVSS_context->
   2940                     UTFConversionContext.pTempOutConversionBuffer
   2941                     != M4OSA_NULL )
   2942                 {
   2943                     err = M4xVSS_internalConvertToUTF8(xVSS_context,
   2944                         (M4OSA_Void *)pParams->pFileOut,
   2945                         (M4OSA_Void *)xVSS_context->
   2946                         UTFConversionContext.pTempOutConversionBuffer,
   2947                         &length);
   2948 
   2949                     if( err != M4NO_ERROR )
   2950                     {
   2951                         M4OSA_TRACE1_1(
   2952                             "M4xVSS_SendCommand: M4xVSS_internalConvertToUTF8 returns err: 0x%x",
   2953                             err);
   2954                         /* Free Send command */
   2955                         M4xVSS_freeCommand(xVSS_context);
   2956                         return err;
   2957                     }
   2958                     pDecodedPath = xVSS_context->
   2959                         UTFConversionContext.pTempOutConversionBuffer;
   2960                 }
   2961                 else
   2962                 {
   2963                     length = strlen(pDecodedPath);
   2964                 }
   2965                 /**
   2966                 * End of the UTF conversion, use the converted file path*/
   2967                 xVSS_context->pSettings->pClipList[i]->pFile = M4OSA_32bitAlignedMalloc(
   2968                     (length + 1),
   2969                     M4VS, (M4OSA_Char *)"xVSS file path of 3gp to 3gp");
   2970 
   2971                 if( xVSS_context->pSettings->pClipList[i]->pFile == M4OSA_NULL )
   2972                 {
   2973                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   2974                     /*FB: to avoid leaks when there is an error in the send command*/
   2975                     /* Free Send command */
   2976                     M4xVSS_freeCommand(xVSS_context);
   2977                     /**/
   2978                     return M4ERR_ALLOC;
   2979                 }
   2980                 memcpy((void *)xVSS_context->pSettings->pClipList[i]->pFile,
   2981                     (void *)pDecodedPath, (length + 1));
   2982                 /*FB: add file path size because of UTF 16 conversion*/
   2983                 xVSS_context->pSettings->pClipList[i]->filePathSize = length+1;
   2984 
   2985                 /* We define master clip as first 3GP input clip */
   2986                 /*if(xVSS_context->pSettings->uiMasterClip == 0 && fileProperties.
   2987                 AudioStreamType != M4VIDEOEDITING_kNoneAudio)
   2988                 {
   2989                 xVSS_context->pSettings->uiMasterClip = i;
   2990                 }*/
   2991             }
   2992             else
   2993             {
   2994                 /* Update total duration */
   2995                 totalDuration +=
   2996                     xVSS_context->pSettings->pClipList[i]->uiEndCutTime
   2997                     - xVSS_context->pSettings->pClipList[i]->uiBeginCutTime;
   2998             }
   2999             /* We define master clip as first 3GP input clip */
   3000             if( masterClip == -1
   3001                 && fileProperties.AudioStreamType != M4VIDEOEDITING_kNoneAudio )
   3002             {
   3003                 masterClip = i;
   3004                 xVSS_context->pSettings->uiMasterClip = i;
   3005             }
   3006 
   3007         }
   3008         /**************************
   3009         Other input file type case
   3010         ***************************/
   3011         else
   3012         {
   3013             M4OSA_TRACE1_0("Bad file type as input clip");
   3014             /*FB: to avoid leaks when there is an error in the send command*/
   3015             /* Free Send command */
   3016             M4xVSS_freeCommand(xVSS_context);
   3017             /**/
   3018             return M4ERR_PARAMETER;
   3019         }
   3020     }
   3021 
   3022     /*********************************************************
   3023     * Parse all effects to make some adjustment for framing, *
   3024     * text and to transform relative time into absolute time *
   3025     **********************************************************/
   3026     for ( j = 0; j < xVSS_context->pSettings->nbEffects; j++ )
   3027     {
   3028         /* Copy effect to "local" structure */
   3029         memcpy((void *) &(xVSS_context->pSettings->Effects[j]),
   3030             (void *) &(pSettings->Effects[j]),
   3031             sizeof(M4VSS3GPP_EffectSettings));
   3032 
   3033         /* Prevent from bad initializing of effect percentage time */
   3034         if( xVSS_context->pSettings->Effects[j].xVSS.uiDurationPercent > 100
   3035             || xVSS_context->pSettings->Effects[j].xVSS.uiStartPercent > 100 )
   3036         {
   3037             /* These percentage time have probably not been initialized */
   3038             /* Let's not use them by setting them to 0 */
   3039             xVSS_context->pSettings->Effects[j].xVSS.uiDurationPercent = 0;
   3040             xVSS_context->pSettings->Effects[j].xVSS.uiStartPercent = 0;
   3041         }
   3042 
   3043         /* If we have percentage information let's use it... Otherwise, we use absolute time. */
   3044         if( xVSS_context->pSettings->Effects[j].xVSS.uiDurationPercent != 0 )
   3045         {
   3046             xVSS_context->pSettings->
   3047                 Effects[j].uiStartTime = (M4OSA_UInt32)(totalDuration
   3048                 * xVSS_context->pSettings->Effects[j].xVSS.uiStartPercent
   3049                 / 100);
   3050             /* The percentage of effect duration is based on the duration of the clip -
   3051             start time */
   3052             xVSS_context->pSettings->
   3053                 Effects[j].uiDuration = (M4OSA_UInt32)(totalDuration
   3054                 * xVSS_context->pSettings->Effects[j].xVSS.uiDurationPercent
   3055                 / 100);
   3056         }
   3057 
   3058         /* If there is a framing effect, we need to allocate framing effect structure */
   3059         if( xVSS_context->pSettings->Effects[j].VideoEffectType
   3060             == M4xVSS_kVideoEffectType_Framing )
   3061         {
   3062 #ifdef DECODE_GIF_ON_SAVING
   3063 
   3064             M4xVSS_FramingContext *framingCtx;
   3065             /*UTF conversion support*/
   3066             M4OSA_Void *pDecodedPath = M4OSA_NULL;
   3067 
   3068 #else
   3069 
   3070             M4xVSS_FramingStruct *framingCtx;
   3071 
   3072 #endif /*DECODE_GIF_ON_SAVING*/
   3073 
   3074             M4OSA_Char *pExt2 = M4OSA_NULL;
   3075             M4VIFI_ImagePlane *pPlane =
   3076                 xVSS_context->pSettings->Effects[j].xVSS.pFramingBuffer;
   3077             M4OSA_Int32 result1, result2;
   3078 
   3079             /* Copy framing file path */
   3080             if( pSettings->Effects[j].xVSS.pFramingFilePath != M4OSA_NULL )
   3081             {
   3082                 xVSS_context->pSettings->
   3083                     Effects[j].xVSS.pFramingFilePath = M4OSA_32bitAlignedMalloc(
   3084                     strlen(pSettings->Effects[j].xVSS.pFramingFilePath)
   3085                     + 1, M4VS, (M4OSA_Char *)"Local Framing file path");
   3086 
   3087                 if( xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath
   3088                     == M4OSA_NULL )
   3089                 {
   3090                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3091                     /*FB: to avoid leaks when there is an error in the send command*/
   3092                     /* Free Send command */
   3093                     M4xVSS_freeCommand(xVSS_context);
   3094                     /**/
   3095                     return M4ERR_ALLOC;
   3096                 }
   3097                 memcpy((void *)xVSS_context->pSettings->
   3098                     Effects[j].xVSS.pFramingFilePath,
   3099                     (void *)pSettings->
   3100                     Effects[j].xVSS.pFramingFilePath, strlen(
   3101                     pSettings->Effects[j].xVSS.pFramingFilePath) + 1);
   3102 
   3103                 pExt2 =
   3104                     xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath;
   3105             }
   3106 
   3107 #ifdef DECODE_GIF_ON_SAVING
   3108 
   3109             framingCtx = (M4xVSS_FramingContext
   3110                 *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingContext),
   3111                 M4VS, (M4OSA_Char *)"Context of the framing effect");
   3112 
   3113             if( framingCtx == M4OSA_NULL )
   3114             {
   3115                 M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3116                 /*FB: to avoid leaks when there is an error in the send command*/
   3117                 /* Free Send command */
   3118                 M4xVSS_freeCommand(xVSS_context);
   3119                 /**/
   3120                 return M4ERR_ALLOC;
   3121             }
   3122             framingCtx->aFramingCtx = M4OSA_NULL;
   3123             framingCtx->aFramingCtx_last = M4OSA_NULL;
   3124             framingCtx->pSPSContext = M4OSA_NULL;
   3125             framingCtx->outputVideoSize =
   3126                 xVSS_context->pSettings->xVSS.outputVideoSize;
   3127             framingCtx->topleft_x =
   3128                 xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
   3129             framingCtx->topleft_y =
   3130                 xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
   3131             framingCtx->bEffectResize =
   3132                 xVSS_context->pSettings->Effects[j].xVSS.bResize;
   3133             framingCtx->pEffectFilePath =
   3134                 xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath;
   3135             framingCtx->pFileReadPtr = xVSS_context->pFileReadPtr;
   3136             framingCtx->pFileWritePtr = xVSS_context->pFileWritePtr;
   3137             framingCtx->effectDuration =
   3138                 xVSS_context->pSettings->Effects[j].uiDuration;
   3139             framingCtx->b_IsFileGif = M4OSA_FALSE;
   3140             framingCtx->alphaBlendingStruct = M4OSA_NULL;
   3141             framingCtx->b_animated = M4OSA_FALSE;
   3142 
   3143             /* Output ratio for the effect is stored in uiFiftiesOutFrameRate parameters of the
   3144             extended xVSS effects structure */
   3145             if( xVSS_context->pSettings->Effects[j].xVSS.uiFiftiesOutFrameRate
   3146                 != 0 )
   3147             {
   3148                 framingCtx->frameDurationRatio =
   3149                     (M4OSA_Float)(( xVSS_context->pSettings->
   3150                     Effects[j].xVSS.uiFiftiesOutFrameRate) / 1000.0);
   3151             }
   3152             else
   3153             {
   3154                 framingCtx->frameDurationRatio = 1.0;
   3155             }
   3156 
   3157             /*Alpha blending*/
   3158             /*Check if the alpha blending parameters are corrects*/
   3159             if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime > 100 )
   3160             {
   3161                 pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime = 0;
   3162             }
   3163 
   3164             if( pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime > 100 )
   3165             {
   3166                 pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime = 0;
   3167             }
   3168 
   3169             if( pSettings->Effects[j].xVSS.uialphaBlendingEnd > 100 )
   3170             {
   3171                 pSettings->Effects[j].xVSS.uialphaBlendingEnd = 100;
   3172             }
   3173 
   3174             if( pSettings->Effects[j].xVSS.uialphaBlendingMiddle > 100 )
   3175             {
   3176                 pSettings->Effects[j].xVSS.uialphaBlendingMiddle = 100;
   3177             }
   3178 
   3179             if( pSettings->Effects[j].xVSS.uialphaBlendingStart > 100 )
   3180             {
   3181                 pSettings->Effects[j].xVSS.uialphaBlendingStart = 100;
   3182             }
   3183 
   3184             if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime > 0
   3185                 || pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime > 0 )
   3186             {
   3187                 /*Allocate the alpha blending structure*/
   3188                 framingCtx->alphaBlendingStruct =
   3189                     (M4xVSS_internalEffectsAlphaBlending *)M4OSA_32bitAlignedMalloc(
   3190                     sizeof(M4xVSS_internalEffectsAlphaBlending),
   3191                     M4VS, (M4OSA_Char *)"alpha blending structure");
   3192 
   3193                 if( framingCtx->alphaBlendingStruct == M4OSA_NULL )
   3194                 {
   3195                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3196                     M4xVSS_freeCommand(xVSS_context);
   3197                     return M4ERR_ALLOC;
   3198                 }
   3199                 /*Fill the alpha blending structure*/
   3200                 framingCtx->alphaBlendingStruct->m_fadeInTime =
   3201                     pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime;
   3202                 framingCtx->alphaBlendingStruct->m_fadeOutTime =
   3203                     pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime;
   3204                 framingCtx->alphaBlendingStruct->m_end =
   3205                     pSettings->Effects[j].xVSS.uialphaBlendingEnd;
   3206                 framingCtx->alphaBlendingStruct->m_middle =
   3207                     pSettings->Effects[j].xVSS.uialphaBlendingMiddle;
   3208                 framingCtx->alphaBlendingStruct->m_start =
   3209                     pSettings->Effects[j].xVSS.uialphaBlendingStart;
   3210 
   3211                 if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime
   3212                     + pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime
   3213                         > 100 )
   3214                 {
   3215                     framingCtx->alphaBlendingStruct->m_fadeOutTime =
   3216                         100 - framingCtx->alphaBlendingStruct->m_fadeInTime;
   3217                 }
   3218             }
   3219 
   3220             /**
   3221             * UTF conversion: convert into the customer format, before being used*/
   3222             pDecodedPath =
   3223                 xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath;
   3224             length = strlen(pDecodedPath);
   3225 
   3226             if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
   3227                 != M4OSA_NULL && xVSS_context->
   3228                 UTFConversionContext.pTempOutConversionBuffer
   3229                 != M4OSA_NULL )
   3230             {
   3231                 err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   3232                     (M4OSA_Void *)xVSS_context->pSettings->
   3233                     Effects[j].xVSS.pFramingFilePath,
   3234                     (M4OSA_Void *)xVSS_context->
   3235                     UTFConversionContext.pTempOutConversionBuffer,
   3236                     &length);
   3237 
   3238                 if( err != M4NO_ERROR )
   3239                 {
   3240                     M4OSA_TRACE1_1(
   3241                         "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   3242                         err);
   3243                     /* Free Send command */
   3244                     M4xVSS_freeCommand(xVSS_context);
   3245                     return err;
   3246                 }
   3247                 pDecodedPath =
   3248                     xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
   3249             }
   3250 
   3251             /**
   3252             * End of the UTF conversion, use the converted file path*/
   3253             framingCtx->pEffectFilePath = M4OSA_32bitAlignedMalloc(length + 1, M4VS,
   3254                 (M4OSA_Char *)"Local Framing file path");
   3255 
   3256             if( framingCtx->pEffectFilePath == M4OSA_NULL )
   3257             {
   3258                 M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3259                 /*FB: to avoid leaks when there is an error in the send command*/
   3260                 /* Free Send command */
   3261                 M4xVSS_freeCommand(xVSS_context);
   3262                 /**/
   3263                 return M4ERR_ALLOC;
   3264             }
   3265             memcpy((void *)framingCtx->pEffectFilePath,
   3266                 (void *)pDecodedPath, length + 1);
   3267 
   3268             /* Save framing structure associated with corresponding effect */
   3269             xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
   3270                 framingCtx;
   3271 
   3272 #else
   3273 
   3274             framingCtx = (M4xVSS_FramingStruct
   3275                 *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct),
   3276                 M4VS, (M4OSA_Char *)"Context of the framing effect");
   3277 
   3278             if( framingCtx == M4OSA_NULL )
   3279             {
   3280                 M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3281                 /*FB: to avoid leaks when there is an error in the send command*/
   3282                 /* Free Send command */
   3283                 M4xVSS_freeCommand(xVSS_context);
   3284                 /**/
   3285                 return M4ERR_ALLOC;
   3286             }
   3287 
   3288             framingCtx->topleft_x =
   3289                 xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
   3290             framingCtx->topleft_y =
   3291                 xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
   3292 
   3293             /* BugFix 1.2.0: Leak when decoding error */
   3294             framingCtx->FramingRgb = M4OSA_NULL;
   3295             framingCtx->FramingYuv = M4OSA_NULL;
   3296             framingCtx->pNext = framingCtx;
   3297             /* Save framing structure associated with corresponding effect */
   3298             xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
   3299                 framingCtx;
   3300 
   3301 #endif /*DECODE_GIF_ON_SAVING*/
   3302 
   3303             if( pExt2 != M4OSA_NULL )
   3304             {
   3305                 /* Decode the image associated to the effect, and fill framing structure */
   3306                 pExt2 += (strlen((const char *)pExt2) - 4);
   3307 
   3308                 result1 = strcmp((const char *)pExt2,(const char *)".rgb");
   3309                 result2 = strcmp((const char *)pExt2,(const char *)".RGB");
   3310 
   3311                 if( 0 == result1 || 0 == result2 )
   3312                 {
   3313 #ifdef DECODE_GIF_ON_SAVING
   3314 
   3315                     framingCtx->aFramingCtx =
   3316                         (M4xVSS_FramingStruct
   3317                         *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct),
   3318                         M4VS,
   3319                         (M4OSA_Char
   3320                         *)
   3321                         "M4xVSS_internalDecodeGIF: Context of the framing effect");
   3322 
   3323                     if( framingCtx->aFramingCtx == M4OSA_NULL )
   3324                     {
   3325                         M4OSA_TRACE1_0(
   3326                             "Allocation error in M4xVSS_SendCommand");
   3327                         /* TODO: Translate error code of SPS to an xVSS error code */
   3328                         M4xVSS_freeCommand(xVSS_context);
   3329                         return M4ERR_ALLOC;
   3330                     }
   3331                     framingCtx->aFramingCtx->pCurrent =
   3332                         M4OSA_NULL; /* Only used by the first element of the chain */
   3333                     framingCtx->aFramingCtx->previousClipTime = -1;
   3334                     framingCtx->aFramingCtx->FramingYuv = M4OSA_NULL;
   3335                     framingCtx->aFramingCtx->FramingRgb = M4OSA_NULL;
   3336                     framingCtx->aFramingCtx->topleft_x =
   3337                         xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
   3338                     framingCtx->aFramingCtx->topleft_y =
   3339                         xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
   3340                     /*To support ARGB8888 : get the width and height */
   3341 
   3342                     framingCtx->aFramingCtx->width =
   3343                         xVSS_context->pSettings->Effects[j].xVSS.width;
   3344                     framingCtx->aFramingCtx->height =
   3345                         xVSS_context->pSettings->Effects[j].xVSS.height;
   3346                     M4OSA_TRACE1_1("FRAMMING BEFORE M4xVSS_SendCommand  %d",
   3347                         framingCtx->aFramingCtx->width);
   3348                     M4OSA_TRACE1_1("FRAMMING BEFORE M4xVSS_SendCommand  %d",
   3349                         framingCtx->aFramingCtx->height);
   3350 
   3351 #endif
   3352 
   3353                     err = M4xVSS_internalConvertARGB888toYUV420_FrammingEffect(
   3354                         xVSS_context,
   3355                         &(xVSS_context->pSettings->Effects[j]),
   3356                         framingCtx->aFramingCtx,xVSS_context->pSettings->xVSS.outputVideoSize);
   3357                     M4OSA_TRACE3_1("FRAMING WIDTH BEFORE M4xVSS_SendCommand  %d",
   3358                         framingCtx->aFramingCtx->width);
   3359                     M4OSA_TRACE3_1("FRAMING HEIGHT BEFORE M4xVSS_SendCommand  %d",
   3360                         framingCtx->aFramingCtx->height);
   3361 
   3362                     if( err != M4NO_ERROR )
   3363                     {
   3364                         M4OSA_TRACE1_1(
   3365                             "M4xVSS_SendCommand: M4xVSS_internalDecodePNG returned 0x%x",
   3366                             err);
   3367                         /* TODO: Translate error code of SPS to an xVSS error code */
   3368                         M4xVSS_freeCommand(xVSS_context);
   3369                         return err;
   3370                     }
   3371                 }
   3372                 else
   3373                 {
   3374                     M4OSA_TRACE1_1(
   3375                         "M4xVSS_SendCommand: Not supported still picture format 0x%x",
   3376                         err);
   3377                     /*FB: to avoid leaks when there is an error in the send command*/
   3378                     /* Free Send command */
   3379                     M4xVSS_freeCommand(xVSS_context);
   3380                     /**/
   3381                     return M4ERR_PARAMETER;
   3382                 }
   3383             }
   3384             else if( pPlane != M4OSA_NULL )
   3385             {
   3386 #ifdef DECODE_GIF_ON_SAVING
   3387 
   3388                 framingCtx->aFramingCtx = (M4xVSS_FramingStruct
   3389                     *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct),
   3390                     M4VS, (M4OSA_Char *)"Context of the framing effect");
   3391 
   3392                 if( framingCtx->aFramingCtx == M4OSA_NULL )
   3393                 {
   3394                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3395                     /*FB: to avoid leaks when there is an error in the send command*/
   3396                     /* Free Send command */
   3397                     M4xVSS_freeCommand(xVSS_context);
   3398                     /**/
   3399                     return M4ERR_ALLOC;
   3400                 }
   3401 
   3402                 framingCtx->aFramingCtx->topleft_x =
   3403                     xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
   3404                 framingCtx->aFramingCtx->topleft_y =
   3405                     xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
   3406 
   3407                 /* BugFix 1.2.0: Leak when decoding error */
   3408                 framingCtx->aFramingCtx->FramingRgb = M4OSA_NULL;
   3409                 framingCtx->aFramingCtx->FramingYuv = M4OSA_NULL;
   3410                 framingCtx->aFramingCtx->pNext = framingCtx->aFramingCtx;
   3411                 framingCtx->aFramingCtx->pCurrent = framingCtx->aFramingCtx;
   3412                 framingCtx->aFramingCtx->duration = 0;
   3413                 framingCtx->aFramingCtx->previousClipTime = -1;
   3414                 framingCtx->aFramingCtx->FramingRgb =
   3415                     xVSS_context->pSettings->Effects[j].xVSS.pFramingBuffer;
   3416                 /* Force input RGB buffer to even size to avoid errors in YUV conversion */
   3417                 framingCtx->aFramingCtx->FramingRgb->u_width =
   3418                     framingCtx->aFramingCtx->FramingRgb->u_width & ~1;
   3419                 framingCtx->aFramingCtx->FramingRgb->u_height =
   3420                     framingCtx->aFramingCtx->FramingRgb->u_height & ~1;
   3421                 /* Input RGB plane is provided, let's convert it to YUV420, and update framing
   3422                 structure  */
   3423                 err = M4xVSS_internalConvertRGBtoYUV(framingCtx->aFramingCtx);
   3424 
   3425 #else
   3426 
   3427                 framingCtx->FramingRgb =
   3428                     xVSS_context->pSettings->Effects[j].xVSS.pFramingBuffer;
   3429                 /* Force input RGB buffer to even size to avoid errors in YUV conversion */
   3430                 framingCtx->FramingRgb.u_width =
   3431                     framingCtx->FramingRgb.u_width & ~1;
   3432                 framingCtx->FramingRgb.u_height =
   3433                     framingCtx->FramingRgb.u_height & ~1;
   3434                 /* Input RGB plane is provided, let's convert it to YUV420, and update framing
   3435                  structure  */
   3436                 err = M4xVSS_internalConvertRGBtoYUV(framingCtx);
   3437 
   3438 #endif
   3439 
   3440                 if( err != M4NO_ERROR )
   3441                 {
   3442                     M4OSA_TRACE1_1(
   3443                         "M4xVSS_sendCommand: error when converting RGB to YUV: 0w%x",
   3444                         err);
   3445                     /*FB: to avoid leaks when there is an error in the send command*/
   3446                     /* Free Send command */
   3447                     M4xVSS_freeCommand(xVSS_context);
   3448                     /**/
   3449                     return err;
   3450                 }
   3451             }
   3452             else
   3453             {
   3454                 M4OSA_TRACE1_0(
   3455                     "M4xVSS_sendCommand: No input image/plane provided for framing effect.");
   3456                 /*FB: to avoid leaks when there is an error in the send command*/
   3457                 /* Free Send command */
   3458                 M4xVSS_freeCommand(xVSS_context);
   3459                 /**/
   3460                 return M4ERR_PARAMETER;
   3461             }
   3462         }
   3463         /* CR: Add text handling with external text interface */
   3464         /* If effect type is text, we call external text function to get RGB 565 buffer */
   3465         if( xVSS_context->pSettings->Effects[j].VideoEffectType
   3466             == M4xVSS_kVideoEffectType_Text )
   3467         {
   3468             /* Call the font engine function pointer to get RGB565 buffer */
   3469             /* We transform text effect into framing effect from buffer */
   3470             if( xVSS_context->pSettings->xVSS.pTextRenderingFct != M4OSA_NULL )
   3471             {
   3472                 /*FB: add UTF convertion for text buffer*/
   3473                 M4OSA_Void *pDecodedPath = M4OSA_NULL;
   3474 #ifdef DECODE_GIF_ON_SAVING
   3475 
   3476                 M4xVSS_FramingContext *framingCtx;
   3477 
   3478 #else
   3479 
   3480                 M4xVSS_FramingStruct *framingCtx;
   3481 
   3482 #endif /*DECODE_GIF_ON_SAVING*/
   3483 
   3484 #ifdef DECODE_GIF_ON_SAVING
   3485 
   3486                 framingCtx = (M4xVSS_FramingContext
   3487                     *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingContext),
   3488                     M4VS, (M4OSA_Char *)"Context of the framing effect");
   3489 
   3490                 if( framingCtx == M4OSA_NULL )
   3491                 {
   3492                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3493                     /*FB: to avoid leaks when there is an error in the send command*/
   3494                     /* Free Send command */
   3495                     M4xVSS_freeCommand(xVSS_context);
   3496                     /**/
   3497                     return M4ERR_ALLOC;
   3498                 }
   3499                 framingCtx->aFramingCtx = M4OSA_NULL;
   3500                 framingCtx->aFramingCtx_last = M4OSA_NULL;
   3501                 framingCtx->pSPSContext = M4OSA_NULL;
   3502                 framingCtx->outputVideoSize =
   3503                     xVSS_context->pSettings->xVSS.outputVideoSize;
   3504                 framingCtx->topleft_x =
   3505                     xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
   3506                 framingCtx->topleft_y =
   3507                     xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
   3508                 framingCtx->bEffectResize =
   3509                     xVSS_context->pSettings->Effects[j].xVSS.bResize;
   3510                 framingCtx->pEffectFilePath =
   3511                     xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath;
   3512                 framingCtx->pFileReadPtr = xVSS_context->pFileReadPtr;
   3513                 framingCtx->pFileWritePtr = xVSS_context->pFileWritePtr;
   3514                 framingCtx->effectDuration =
   3515                     xVSS_context->pSettings->Effects[j].uiDuration;
   3516                 framingCtx->b_IsFileGif = M4OSA_FALSE;
   3517                 framingCtx->b_animated = M4OSA_FALSE;
   3518                 framingCtx->alphaBlendingStruct = M4OSA_NULL;
   3519 
   3520                 /* Save framing structure associated with corresponding effect */
   3521                 xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
   3522                     framingCtx;
   3523 
   3524                 framingCtx->aFramingCtx = (M4xVSS_FramingStruct
   3525                     *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct),
   3526                     M4VS, (M4OSA_Char *)"Context of the framing effect");
   3527 
   3528                 if( framingCtx->aFramingCtx == M4OSA_NULL )
   3529                 {
   3530                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3531                     /*FB: to avoid leaks when there is an error in the send command*/
   3532                     /* Free Send command */
   3533                     M4xVSS_freeCommand(xVSS_context);
   3534                     /**/
   3535                     return M4ERR_ALLOC;
   3536                 }
   3537 
   3538                 framingCtx->aFramingCtx->topleft_x =
   3539                     xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
   3540                 framingCtx->aFramingCtx->topleft_y =
   3541                     xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
   3542 
   3543                 /* BugFix 1.2.0: Leak when decoding error */
   3544                 framingCtx->aFramingCtx->FramingRgb = M4OSA_NULL;
   3545                 framingCtx->aFramingCtx->FramingYuv = M4OSA_NULL;
   3546                 framingCtx->aFramingCtx->pNext = framingCtx->aFramingCtx;
   3547                 framingCtx->aFramingCtx->pCurrent = framingCtx->aFramingCtx;
   3548                 framingCtx->aFramingCtx->duration = 0;
   3549                 framingCtx->aFramingCtx->previousClipTime = -1;
   3550 
   3551                 /*Alpha blending*/
   3552                 /*Check if the alpha blending parameters are corrects*/
   3553                 if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime > 100 )
   3554                 {
   3555                     pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime = 0;
   3556                 }
   3557 
   3558                 if( pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime > 100 )
   3559                 {
   3560                     pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime = 0;
   3561                 }
   3562 
   3563                 if( pSettings->Effects[j].xVSS.uialphaBlendingEnd > 100 )
   3564                 {
   3565                     pSettings->Effects[j].xVSS.uialphaBlendingEnd = 100;
   3566                 }
   3567 
   3568                 if( pSettings->Effects[j].xVSS.uialphaBlendingMiddle > 100 )
   3569                 {
   3570                     pSettings->Effects[j].xVSS.uialphaBlendingMiddle = 100;
   3571                 }
   3572 
   3573                 if( pSettings->Effects[j].xVSS.uialphaBlendingStart > 100 )
   3574                 {
   3575                     pSettings->Effects[j].xVSS.uialphaBlendingStart = 100;
   3576                 }
   3577 
   3578                 if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime > 0
   3579                     || pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime
   3580                     > 0 )
   3581                 {
   3582                     /*Allocate the alpha blending structure*/
   3583                     framingCtx->alphaBlendingStruct =
   3584                         (M4xVSS_internalEffectsAlphaBlending *)M4OSA_32bitAlignedMalloc(
   3585                         sizeof(M4xVSS_internalEffectsAlphaBlending),
   3586                         M4VS, (M4OSA_Char *)"alpha blending structure");
   3587 
   3588                     if( framingCtx->alphaBlendingStruct == M4OSA_NULL )
   3589                     {
   3590                         M4OSA_TRACE1_0(
   3591                             "Allocation error in M4xVSS_SendCommand");
   3592                         M4xVSS_freeCommand(xVSS_context);
   3593                         return M4ERR_ALLOC;
   3594                     }
   3595                     /*Fill the alpha blending structure*/
   3596                     framingCtx->alphaBlendingStruct->m_fadeInTime =
   3597                         pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime;
   3598                     framingCtx->alphaBlendingStruct->m_fadeOutTime =
   3599                         pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime;
   3600                     framingCtx->alphaBlendingStruct->m_end =
   3601                         pSettings->Effects[j].xVSS.uialphaBlendingEnd;
   3602                     framingCtx->alphaBlendingStruct->m_middle =
   3603                         pSettings->Effects[j].xVSS.uialphaBlendingMiddle;
   3604                     framingCtx->alphaBlendingStruct->m_start =
   3605                         pSettings->Effects[j].xVSS.uialphaBlendingStart;
   3606 
   3607                     if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime
   3608                         + pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime
   3609                             > 100 )
   3610                     {
   3611                         framingCtx->alphaBlendingStruct->m_fadeOutTime =
   3612                             100 - framingCtx->alphaBlendingStruct->m_fadeInTime;
   3613                     }
   3614                 }
   3615 #else
   3616 
   3617                 framingCtx = (M4xVSS_FramingStruct
   3618                     *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct),
   3619                     M4VS, (M4OSA_Char
   3620                     *)"Context of the framing effect (for text)");
   3621 
   3622                 if( framingCtx == M4OSA_NULL )
   3623                 {
   3624                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3625                     /*FB: to avoid leaks when there is an error in the send command*/
   3626                     /* Free Send command */
   3627                     M4xVSS_freeCommand(xVSS_context);
   3628                     /**/
   3629                     return M4ERR_ALLOC;
   3630                 }
   3631 
   3632                 framingCtx->topleft_x =
   3633                     xVSS_context->pSettings->Effects[j].xVSS.topleft_x;
   3634                 framingCtx->topleft_y =
   3635                     xVSS_context->pSettings->Effects[j].xVSS.topleft_y;
   3636                 framingCtx->FramingRgb = M4OSA_NULL;
   3637 
   3638                 /* BugFix 1.2.0: Leak when decoding error */
   3639                 framingCtx->FramingYuv = M4OSA_NULL;
   3640                 framingCtx->pNext = framingCtx;
   3641 
   3642 #endif
   3643                 /* Save framing structure associated with corresponding effect */
   3644 
   3645                 xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
   3646                     framingCtx;
   3647 
   3648                 /* FB: changes for Video Artist: memcopy pTextBuffer so that it can be changed
   3649                 after a complete analysis*/
   3650                 if( pSettings->Effects[j].xVSS.pTextBuffer == M4OSA_NULL )
   3651                 {
   3652                     M4OSA_TRACE1_0("M4xVSS_SendCommand: pTextBuffer is null");
   3653                     M4xVSS_freeCommand(xVSS_context);
   3654                     return M4ERR_PARAMETER;
   3655                 }
   3656 
   3657                 /*Convert text buffer into customer format before being used*/
   3658                 /**
   3659                 * UTF conversion: convert into the customer format, before being used*/
   3660                 pDecodedPath = pSettings->Effects[j].xVSS.pTextBuffer;
   3661                 xVSS_context->pSettings->Effects[j].xVSS.textBufferSize =
   3662                     pSettings->Effects[j].xVSS.textBufferSize;
   3663 
   3664                 if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
   3665                     != M4OSA_NULL && xVSS_context->
   3666                     UTFConversionContext.pTempOutConversionBuffer
   3667                     != M4OSA_NULL )
   3668                 {
   3669                     err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   3670                         (M4OSA_Void *)pSettings->
   3671                         Effects[j].xVSS.pTextBuffer,
   3672                         (M4OSA_Void *)xVSS_context->
   3673                         UTFConversionContext.pTempOutConversionBuffer,
   3674                         &length);
   3675 
   3676                     if( err != M4NO_ERROR )
   3677                     {
   3678                         M4OSA_TRACE1_1(
   3679                             "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   3680                             err);
   3681                         /* Free Send command */
   3682                         M4xVSS_freeCommand(xVSS_context);
   3683                         return err;
   3684                     }
   3685                     pDecodedPath = xVSS_context->
   3686                         UTFConversionContext.pTempOutConversionBuffer;
   3687                     xVSS_context->pSettings->Effects[j].xVSS.textBufferSize =
   3688                         length;
   3689                 }
   3690                 /**
   3691                 * End of the UTF conversion, use the converted file path*/
   3692 
   3693                 xVSS_context->pSettings->
   3694                     Effects[j].xVSS.pTextBuffer = M4OSA_32bitAlignedMalloc(
   3695                     xVSS_context->pSettings->Effects[j].xVSS.textBufferSize + 1,
   3696                     M4VS, (M4OSA_Char *)"Local text buffer effect");
   3697 
   3698                 //xVSS_context->pSettings->Effects[j].xVSS.pTextBuffer =
   3699                 // M4OSA_32bitAlignedMalloc(strlen(pSettings->Effects[j].xVSS.pTextBuffer)+1,
   3700                 // M4VS, "Local text buffer effect");
   3701                 if( xVSS_context->pSettings->Effects[j].xVSS.pTextBuffer
   3702                     == M4OSA_NULL )
   3703                 {
   3704                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3705                     /*FB: to avoid leaks when there is an error in the send command*/
   3706                     /* Free Send command */
   3707                     M4xVSS_freeCommand(xVSS_context);
   3708                     /**/
   3709                     return M4ERR_ALLOC;
   3710                 }
   3711 
   3712                 if( pSettings->Effects[j].xVSS.pTextBuffer != M4OSA_NULL )
   3713                 {
   3714                     //memcpy((M4OSA_MemAddr8)xVSS_context->pSettings->Effects[j]
   3715                     //.xVSS.pTextBuffer, (M4OSA_MemAddr8)pSettings->Effects[j].xVSS.pTextBuffer,
   3716                     // strlen(pSettings->Effects[j].xVSS.pTextBuffer)+1);
   3717                     memcpy((void *)xVSS_context->pSettings->
   3718                         Effects[j].xVSS.pTextBuffer,
   3719                         (void *)pDecodedPath, xVSS_context->pSettings->
   3720                         Effects[j].xVSS.textBufferSize + 1);
   3721                 }
   3722 
   3723                 /*Allocate the text RGB buffer*/
   3724                 framingCtx->aFramingCtx->FramingRgb =
   3725                     (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(sizeof(M4VIFI_ImagePlane),
   3726                     M4VS,
   3727                     (M4OSA_Char *)"RGB structure for the text effect");
   3728 
   3729                 if( framingCtx->aFramingCtx->FramingRgb == M4OSA_NULL )
   3730                 {
   3731                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3732                     /*FB: to avoid leaks when there is an error in the send command*/
   3733                     /* Free Send command */
   3734                     M4xVSS_freeCommand(xVSS_context);
   3735                     /**/
   3736                     return M4ERR_ALLOC;
   3737                 }
   3738 
   3739                 if( xVSS_context->pSettings->Effects[j].xVSS.uiTextBufferWidth
   3740                     == 0 || xVSS_context->pSettings->
   3741                     Effects[j].xVSS.uiTextBufferHeight == 0 )
   3742                 {
   3743                     M4OSA_TRACE1_0(
   3744                         "M4xVSS_SendCommand: text plane width and height are not defined");
   3745                     /*FB: to avoid leaks when there is an error in the send command*/
   3746                     /* Free Send command */
   3747                     M4xVSS_freeCommand(xVSS_context);
   3748                     /**/
   3749                     return M4ERR_PARAMETER;
   3750                 }
   3751                 /* Allocate input RGB text buffer and force it to even size to avoid errors in
   3752                  YUV conversion */
   3753                 framingCtx->aFramingCtx->FramingRgb->u_width =
   3754                     xVSS_context->pSettings->
   3755                     Effects[j].xVSS.uiTextBufferWidth & ~1;
   3756                 framingCtx->aFramingCtx->FramingRgb->u_height =
   3757                     xVSS_context->pSettings->
   3758                     Effects[j].xVSS.uiTextBufferHeight & ~1;
   3759                 framingCtx->aFramingCtx->FramingRgb->u_stride =
   3760                     2 * framingCtx->aFramingCtx->FramingRgb->u_width;
   3761                 framingCtx->aFramingCtx->FramingRgb->u_topleft = 0;
   3762                 framingCtx->aFramingCtx->FramingRgb->pac_data =
   3763                     (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(
   3764                     framingCtx->aFramingCtx->FramingRgb->u_height
   3765                     * framingCtx->aFramingCtx->FramingRgb->u_stride,
   3766                     M4VS, (M4OSA_Char *)"Text RGB plane->pac_data");
   3767 
   3768                 if( framingCtx->aFramingCtx->FramingRgb->pac_data
   3769                     == M4OSA_NULL )
   3770                 {
   3771                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3772                     /*FB: to avoid leaks when there is an error in the send command*/
   3773                     /* Free Send command */
   3774                     M4xVSS_freeCommand(xVSS_context);
   3775                     /**/
   3776                     return M4ERR_ALLOC;
   3777                 }
   3778 
   3779 #ifdef DECODE_GIF_ON_SAVING
   3780                 /**/
   3781                 /* Call text rendering function */
   3782 
   3783                 err = xVSS_context->pSettings->xVSS.pTextRenderingFct(
   3784                     xVSS_context->pSettings->Effects[j].xVSS.pRenderingData,
   3785                     xVSS_context->pSettings->
   3786                     Effects[j].xVSS.pTextBuffer,
   3787                     xVSS_context->pSettings->
   3788                     Effects[j].xVSS.textBufferSize,
   3789                     &(framingCtx->aFramingCtx->FramingRgb));
   3790 
   3791                 if( err != M4NO_ERROR )
   3792                 {
   3793                     M4OSA_TRACE1_0("Text rendering external function failed\n");
   3794                     M4xVSS_freeCommand(xVSS_context);
   3795                     return err;
   3796                 }
   3797 
   3798                 /* Check that RGB buffer is set */
   3799                 if( framingCtx->aFramingCtx->FramingRgb == M4OSA_NULL )
   3800                 {
   3801                     M4OSA_TRACE1_0(
   3802                         "Text rendering function did not set RGB buffer correctly !");
   3803                     M4xVSS_freeCommand(xVSS_context);
   3804                     return M4ERR_PARAMETER;
   3805                 }
   3806 
   3807                 /* Convert RGB plane to YUV420 and update framing structure */
   3808                 err = M4xVSS_internalConvertRGBtoYUV(framingCtx->aFramingCtx);
   3809 
   3810                 if( err != M4NO_ERROR )
   3811                 {
   3812                     M4OSA_TRACE1_1(
   3813                         "M4xVSS_sendCommand: error when converting RGB to YUV: 0w%x",
   3814                         err);
   3815                     M4xVSS_freeCommand(xVSS_context);
   3816                     return err;
   3817                 }
   3818 
   3819 #else
   3820                 /**/
   3821                 /* Call text rendering function */
   3822 
   3823                 err = xVSS_context->pSettings->xVSS.pTextRenderingFct(
   3824                     xVSS_context->pSettings->Effects[j].xVSS.pRenderingData,
   3825                     xVSS_context->pSettings->
   3826                     Effects[j].xVSS.pTextBuffer,
   3827                     xVSS_context->pSettings->
   3828                     Effects[j].xVSS.textBufferSize,
   3829                     &(framingCtx->FramingRgb));
   3830 
   3831                 if( err != M4NO_ERROR )
   3832                 {
   3833                     M4OSA_TRACE1_0("Text rendering external function failed\n");
   3834                     M4xVSS_freeCommand(xVSS_context);
   3835                     return err;
   3836                 }
   3837 
   3838                 /* Check that RGB buffer is set */
   3839                 if( framingCtx->FramingRgb == M4OSA_NULL )
   3840                 {
   3841                     M4OSA_TRACE1_0(
   3842                         "Text rendering function did not set RGB buffer correctly !");
   3843                     M4xVSS_freeCommand(xVSS_context);
   3844                     return M4ERR_PARAMETER;
   3845                 }
   3846 
   3847                 /* Convert RGB plane to YUV420 and update framing structure */
   3848                 err = M4xVSS_internalConvertRGBtoYUV(framingCtx);
   3849 
   3850                 if( err != M4NO_ERROR )
   3851                 {
   3852                     M4OSA_TRACE1_1(
   3853                         "M4xVSS_sendCommand: error when converting RGB to YUV: 0w%x",
   3854                         err);
   3855                     M4xVSS_freeCommand(xVSS_context);
   3856                     return err;
   3857                 }
   3858 
   3859 #endif /*DECODE_GIF_ON_SAVING*/
   3860 
   3861                 /* Change internally effect type from "text" to framing */
   3862 
   3863                 xVSS_context->pSettings->Effects[j].VideoEffectType =
   3864                     M4xVSS_kVideoEffectType_Framing;
   3865                 xVSS_context->pSettings->Effects[j].xVSS.bResize = M4OSA_FALSE;
   3866             }
   3867             else
   3868             {
   3869                 M4OSA_TRACE1_0(
   3870                     "M4xVSS_sendCommand: No text rendering function set !!");
   3871                 M4xVSS_freeCommand(xVSS_context);
   3872                 return M4ERR_PARAMETER;
   3873             }
   3874         }
   3875 
   3876         /* Allocate the structure to store the data needed by the Fifties effect */
   3877         else if( xVSS_context->pSettings->Effects[j].VideoEffectType
   3878             == M4xVSS_kVideoEffectType_Fifties )
   3879         {
   3880             M4xVSS_FiftiesStruct *fiftiesCtx;
   3881 
   3882             /* Check the expected frame rate for the fifties effect (must be above 0) */
   3883             if( 0 == xVSS_context->pSettings->
   3884                 Effects[j].xVSS.uiFiftiesOutFrameRate )
   3885             {
   3886                 M4OSA_TRACE1_0(
   3887                     "The frame rate for the fifties effect must be greater than 0 !");
   3888                 M4xVSS_freeCommand(xVSS_context);
   3889                 return M4ERR_PARAMETER;
   3890             }
   3891 
   3892             fiftiesCtx = (M4xVSS_FiftiesStruct
   3893                 *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FiftiesStruct),
   3894                 M4VS, (M4OSA_Char *)"Context of the fifties effect");
   3895 
   3896             if( fiftiesCtx == M4OSA_NULL )
   3897             {
   3898                 M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3899                 /* Free Send command */
   3900                 M4xVSS_freeCommand(xVSS_context);
   3901                 return M4ERR_ALLOC;
   3902             }
   3903 
   3904             fiftiesCtx->previousClipTime = -1;
   3905             fiftiesCtx->fiftiesEffectDuration = 1000 / xVSS_context->pSettings->
   3906                 Effects[j].xVSS.uiFiftiesOutFrameRate;
   3907             fiftiesCtx->shiftRandomValue = 0;
   3908             fiftiesCtx->stripeRandomValue = 0;
   3909 
   3910             /* Save the structure associated with corresponding effect */
   3911             xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
   3912                 fiftiesCtx;
   3913         }
   3914 
   3915         /* Allocate the structure to store the data needed by the Color effect */
   3916         else if( xVSS_context->pSettings->Effects[j].VideoEffectType
   3917             == M4xVSS_kVideoEffectType_ColorRGB16
   3918             || xVSS_context->pSettings->Effects[j].VideoEffectType
   3919             == M4xVSS_kVideoEffectType_BlackAndWhite
   3920             || xVSS_context->pSettings->Effects[j].VideoEffectType
   3921             == M4xVSS_kVideoEffectType_Pink
   3922             || xVSS_context->pSettings->Effects[j].VideoEffectType
   3923             == M4xVSS_kVideoEffectType_Green
   3924             || xVSS_context->pSettings->Effects[j].VideoEffectType
   3925             == M4xVSS_kVideoEffectType_Sepia
   3926             || xVSS_context->pSettings->Effects[j].VideoEffectType
   3927             == M4xVSS_kVideoEffectType_Negative
   3928             || xVSS_context->pSettings->Effects[j].VideoEffectType
   3929             == M4xVSS_kVideoEffectType_Gradient )
   3930         {
   3931             M4xVSS_ColorStruct *ColorCtx;
   3932 
   3933             ColorCtx =
   3934                 (M4xVSS_ColorStruct *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_ColorStruct),
   3935                 M4VS, (M4OSA_Char *)"Context of the color effect");
   3936 
   3937             if( ColorCtx == M4OSA_NULL )
   3938             {
   3939                 M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   3940                 /* Free Send command */
   3941                 M4xVSS_freeCommand(xVSS_context);
   3942                 return M4ERR_ALLOC;
   3943             }
   3944 
   3945             ColorCtx->colorEffectType =
   3946                 xVSS_context->pSettings->Effects[j].VideoEffectType;
   3947 
   3948             if( xVSS_context->pSettings->Effects[j].VideoEffectType
   3949                 == M4xVSS_kVideoEffectType_ColorRGB16
   3950                 || xVSS_context->pSettings->Effects[j].VideoEffectType
   3951                 == M4xVSS_kVideoEffectType_Gradient )
   3952             {
   3953                 ColorCtx->rgb16ColorData =
   3954                     xVSS_context->pSettings->Effects[j].xVSS.uiRgb16InputColor;
   3955             }
   3956             else
   3957             {
   3958                 ColorCtx->rgb16ColorData = 0;
   3959             }
   3960 
   3961             /* Save the structure associated with corresponding effect */
   3962             xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt =
   3963                 ColorCtx;
   3964         }
   3965     }
   3966 
   3967     /**********************************
   3968     Background music registering
   3969     **********************************/
   3970     if( pSettings->xVSS.pBGMtrack != M4OSA_NULL && isNewBGM == M4OSA_TRUE )
   3971     {
   3972 #ifdef PREVIEW_ENABLED
   3973 
   3974         M4xVSS_MCS_params *pParams;
   3975         M4OSA_Char *out_pcm;
   3976         /*UTF conversion support*/
   3977         M4OSA_Void *pDecodedPath = M4OSA_NULL;
   3978 
   3979 #endif
   3980 
   3981         /* We save output file pointer, because we will need to use it when saving audio mixed
   3982          file (last save step) */
   3983 
   3984         xVSS_context->pOutputFile = xVSS_context->pSettings->pOutputFile;
   3985         xVSS_context->pTemporaryFile = xVSS_context->pSettings->pTemporaryFile;
   3986 
   3987         /* If a previous BGM has already been registered, delete it */
   3988         /* Here can be implemented test to know if the same BGM is registered */
   3989         if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL )
   3990         {
   3991             if( xVSS_context->pSettings->xVSS.pBGMtrack->pFile != M4OSA_NULL )
   3992             {
   3993                 free(xVSS_context->pSettings->xVSS.pBGMtrack->
   3994                     pFile);
   3995                 xVSS_context->pSettings->xVSS.pBGMtrack->pFile = M4OSA_NULL;
   3996             }
   3997             free(xVSS_context->pSettings->xVSS.pBGMtrack);
   3998             xVSS_context->pSettings->xVSS.pBGMtrack = M4OSA_NULL;
   3999         }
   4000 
   4001         /* Allocate BGM */
   4002         xVSS_context->pSettings->xVSS.pBGMtrack =
   4003             (M4xVSS_BGMSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_BGMSettings), M4VS,
   4004             (M4OSA_Char *)"xVSS_context->pSettings->xVSS.pBGMtrack");
   4005 
   4006         if( xVSS_context->pSettings->xVSS.pBGMtrack == M4OSA_NULL )
   4007         {
   4008             M4xVSS_freeCommand(xVSS_context);
   4009             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   4010             return M4ERR_ALLOC;
   4011         }
   4012 
   4013         /* Copy input structure to our structure */
   4014         memcpy((void *)xVSS_context->pSettings->xVSS.pBGMtrack,
   4015             (void *)pSettings->xVSS.pBGMtrack,
   4016             sizeof(M4xVSS_BGMSettings));
   4017         /* Allocate file name, and copy file name buffer to our structure */
   4018         xVSS_context->pSettings->xVSS.pBGMtrack->pFile =
   4019             M4OSA_32bitAlignedMalloc((strlen(pSettings->xVSS.pBGMtrack->pFile)
   4020             + 1), M4VS, (M4OSA_Char *)"xVSS BGM file path");
   4021 
   4022         if( xVSS_context->pSettings->xVSS.pBGMtrack->pFile == M4OSA_NULL )
   4023         {
   4024             M4xVSS_freeCommand(xVSS_context);
   4025             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   4026             return M4ERR_ALLOC;
   4027         }
   4028         memcpy((void *)xVSS_context->pSettings->xVSS.pBGMtrack->pFile,
   4029             (void *)pSettings->xVSS.pBGMtrack->pFile,
   4030             strlen(pSettings->xVSS.pBGMtrack->pFile) + 1);
   4031 
   4032 #ifdef PREVIEW_ENABLED
   4033         /* Decode BGM track to pcm output file */
   4034 
   4035         pParams =
   4036             (M4xVSS_MCS_params *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_MCS_params), M4VS,
   4037             (M4OSA_Char *)"Element of MCS Params (for BGM)");
   4038 
   4039         if( pParams == M4OSA_NULL )
   4040         {
   4041             M4xVSS_freeCommand(xVSS_context);
   4042             M4OSA_TRACE1_0(
   4043                 "M4xVSS_sendCommand: Problem when allocating one element MCS Params");
   4044             return M4ERR_ALLOC;
   4045         }
   4046 
   4047         /* Initialize the pointers in case of problem (PR 2273) */
   4048         pParams->pFileIn = M4OSA_NULL;
   4049         pParams->pFileOut = M4OSA_NULL;
   4050         pParams->pFileTemp = M4OSA_NULL;
   4051         pParams->pNext = M4OSA_NULL;
   4052         pParams->BeginCutTime = 0;
   4053         pParams->EndCutTime = 0;
   4054 
   4055         if( xVSS_context->pMCSparamsList
   4056             == M4OSA_NULL ) /* Means it is the first element of the list */
   4057         {
   4058             /* Initialize the xVSS context with the first element of the list */
   4059             xVSS_context->pMCSparamsList = pParams;
   4060 
   4061         }
   4062         else
   4063         {
   4064             M4xVSS_MCS_params *pParams_temp = xVSS_context->pMCSparamsList;
   4065             M4xVSS_MCS_params *pParams_prev = M4OSA_NULL;
   4066 
   4067             /* Parse MCS params chained list to find and delete BGM element */
   4068             while( pParams_temp != M4OSA_NULL )
   4069             {
   4070                 if( pParams_temp->isBGM == M4OSA_TRUE )
   4071                 {
   4072                     /* Remove this element */
   4073                     if( pParams_temp->pFileIn != M4OSA_NULL )
   4074                     {
   4075                         free(pParams_temp->pFileIn);
   4076                         pParams_temp->pFileIn = M4OSA_NULL;
   4077                     }
   4078 
   4079                     if( pParams_temp->pFileOut != M4OSA_NULL )
   4080                     {
   4081                         /* Remove PCM temporary file */
   4082                         remove((const char *)pParams_temp->pFileOut);
   4083                         free(pParams_temp->pFileOut);
   4084                         pParams_temp->pFileOut = M4OSA_NULL;
   4085                     }
   4086                     /* Chain previous element with next element = remove BGM chained
   4087                          list element */
   4088                     if( pParams_prev != M4OSA_NULL )
   4089                     {
   4090                         pParams_prev->pNext = pParams_temp->pNext;
   4091                     }
   4092                     /* If current pointer is the first of the chained list and next pointer of
   4093                     the chained list is NULL */
   4094                     /* it means that there was only one element in the list */
   4095                     /* => we put the context variable to NULL to reaffect the first chained list
   4096                      element */
   4097                     if( pParams_temp == xVSS_context->pMCSparamsList
   4098                         && pParams_temp->pNext == M4OSA_NULL )
   4099                     {
   4100                         xVSS_context->pMCSparamsList = M4OSA_NULL;
   4101                     }
   4102                     /* In that case, BGM pointer is the first one, but there are others elements
   4103                      after it */
   4104                     /* So, we need to change first chained list element */
   4105                     else if( pParams_temp->pNext != M4OSA_NULL
   4106                         && pParams_prev == M4OSA_NULL )
   4107                     {
   4108                         xVSS_context->pMCSparamsList = pParams_temp->pNext;
   4109                     }
   4110 
   4111                     if( pParams_temp->pNext != M4OSA_NULL )
   4112                     {
   4113                         pParams_prev = pParams_temp->pNext;
   4114                         free(pParams_temp);
   4115                         pParams_temp = M4OSA_NULL;
   4116                         pParams_temp = pParams_prev;
   4117                     }
   4118                     else
   4119                     {
   4120                         free(pParams_temp);
   4121                         pParams_temp = M4OSA_NULL;
   4122                     }
   4123                 }
   4124                 else
   4125                 {
   4126                     pParams_prev = pParams_temp;
   4127                     pParams_temp = pParams_temp->pNext;
   4128                 }
   4129             }
   4130             /* We need to initialize the last element of the chained list to be able to add new
   4131              BGM element */
   4132             pMCS_last = pParams_prev;
   4133 
   4134             if( xVSS_context->pMCSparamsList == M4OSA_NULL )
   4135             {
   4136                 /* In that case, it means that there was only one element in the chained list */
   4137                 /* So, we need to save the new params*/
   4138                 xVSS_context->pMCSparamsList = pParams;
   4139             }
   4140             else
   4141             {
   4142                 /* Update next pointer of the previous last element of the chain */
   4143                 pMCS_last->pNext = pParams;
   4144             }
   4145 
   4146         }
   4147 
   4148         /* Fill the last M4xVSS_MCS_params element */
   4149         pParams->InputFileType =
   4150             xVSS_context->pSettings->xVSS.pBGMtrack->FileType;
   4151         pParams->OutputFileType = M4VIDEOEDITING_kFileType_PCM;
   4152         pParams->OutputVideoFormat = M4VIDEOEDITING_kNoneVideo;
   4153         pParams->OutputVideoFrameSize = M4VIDEOEDITING_kQCIF;
   4154         pParams->OutputVideoFrameRate = M4VIDEOEDITING_k15_FPS;
   4155 
   4156         if( xVSS_context->pSettings->xVSS.outputAudioFormat
   4157             == M4VIDEOEDITING_kAAC )
   4158         {
   4159             pParams->OutputAudioFormat = M4VIDEOEDITING_kAAC;
   4160             pParams->OutputAudioSamplingFrequency = M4VIDEOEDITING_kDefault_ASF;
   4161 
   4162             /*FB: VAL CR P4ME00003076
   4163             The output audio bitrate in the AAC case is now directly given by the user*/
   4164             /*Check if the audio bitrate is correctly defined*/
   4165             /*Mono
   4166             MCS values for AAC Mono are min: 16kbps and max: 192 kbps*/
   4167             if( xVSS_context->pSettings->xVSS.outputAudioBitrate
   4168                 >= M4VIDEOEDITING_k16_KBPS
   4169                 && xVSS_context->pSettings->xVSS.outputAudioBitrate
   4170                 <= M4VIDEOEDITING_k192_KBPS
   4171                 && xVSS_context->pSettings->xVSS.bAudioMono == M4OSA_TRUE )
   4172             {
   4173                 pParams->OutputAudioBitrate =
   4174                     xVSS_context->pSettings->xVSS.outputAudioBitrate;
   4175             }
   4176             /*Stereo
   4177             MCS values for AAC Mono are min: 32kbps and max: 192 kbps*/
   4178             else if( xVSS_context->pSettings->xVSS.outputAudioBitrate
   4179                 >= M4VIDEOEDITING_k32_KBPS
   4180                 && xVSS_context->pSettings->xVSS.outputAudioBitrate
   4181                 <= M4VIDEOEDITING_k192_KBPS
   4182                 && xVSS_context->pSettings->xVSS.bAudioMono == M4OSA_FALSE )
   4183             {
   4184                 pParams->OutputAudioBitrate =
   4185                     xVSS_context->pSettings->xVSS.outputAudioBitrate;
   4186             }
   4187             else
   4188             {
   4189                 pParams->OutputAudioBitrate = M4VIDEOEDITING_k32_KBPS;
   4190             }
   4191             pParams->bAudioMono = xVSS_context->pSettings->xVSS.bAudioMono;
   4192         }
   4193         else
   4194         {
   4195             pParams->OutputAudioFormat = M4VIDEOEDITING_kAMR_NB;
   4196             pParams->OutputAudioSamplingFrequency = M4VIDEOEDITING_kDefault_ASF;
   4197             pParams->OutputAudioBitrate = M4VIDEOEDITING_k12_2_KBPS;
   4198             pParams->bAudioMono = M4OSA_TRUE;
   4199         }
   4200         pParams->OutputVideoBitrate = M4VIDEOEDITING_kUndefinedBitrate;
   4201 
   4202         /* Prepare output filename */
   4203         /* 21 is the size of "preview_16000_2.pcm" + \0 */
   4204         out_pcm =
   4205             (M4OSA_Char *)M4OSA_32bitAlignedMalloc(strlen(xVSS_context->pTempPath)
   4206             + 21, M4VS, (M4OSA_Char *)"Temp char* for pcmPreviewFile");
   4207 
   4208         if( out_pcm == M4OSA_NULL )
   4209         {
   4210             M4xVSS_freeCommand(xVSS_context);
   4211             M4OSA_TRACE1_0("Allocation error in M4xVSS_Init");
   4212             return M4ERR_ALLOC;
   4213         }
   4214 
   4215         /* Copy temporary path to final preview path string */
   4216         M4OSA_chrNCopy(out_pcm, xVSS_context->pTempPath,
   4217             strlen(xVSS_context->pTempPath) + 1);
   4218 
   4219         /* Depending of the output sample frequency and nb of channels, we construct preview
   4220         output filename */
   4221         if( xVSS_context->pSettings->xVSS.outputAudioFormat
   4222             == M4VIDEOEDITING_kAAC )
   4223         {
   4224             /* Construct output temporary PCM filename */
   4225             if( xVSS_context->pSettings->xVSS.bAudioMono == M4OSA_TRUE )
   4226             {
   4227                 strncat((char *)out_pcm, (const char *)"preview_16000_1.pcm\0",
   4228                     20);
   4229             }
   4230             else
   4231             {
   4232                 strncat((char *)out_pcm, (const char *)"preview_16000_2.pcm\0",
   4233                     20);
   4234             }
   4235         }
   4236         else if( xVSS_context->pSettings->xVSS.outputAudioFormat
   4237             == M4VIDEOEDITING_kAMR_NB )
   4238         {
   4239             /* Construct output temporary PCM filename */
   4240             strncat((char *)out_pcm, (const char *)"preview_08000_1.pcm\0", 20);
   4241         }
   4242         else
   4243         {
   4244             if( out_pcm != M4OSA_NULL )
   4245             {
   4246                 free(out_pcm);
   4247                 out_pcm = M4OSA_NULL;
   4248             }
   4249             M4xVSS_freeCommand(xVSS_context);
   4250             M4OSA_TRACE1_0("Bad audio output format \n");
   4251             return M4ERR_PARAMETER;
   4252         }
   4253 
   4254         xVSS_context->pcmPreviewFile = out_pcm;
   4255 
   4256         /**
   4257         * UTF conversion: convert into the customer format, before being used*/
   4258         pDecodedPath = out_pcm;
   4259         length = strlen(pDecodedPath);
   4260 
   4261         if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
   4262             && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
   4263             != M4OSA_NULL )
   4264         {
   4265             err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   4266                 (M4OSA_Void *)out_pcm, (M4OSA_Void *)xVSS_context->
   4267                 UTFConversionContext.pTempOutConversionBuffer, &length);
   4268 
   4269             if( err != M4NO_ERROR )
   4270             {
   4271                 M4OSA_TRACE1_1(
   4272                     "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   4273                     err);
   4274                 /* Free Send command */
   4275                 M4xVSS_freeCommand(xVSS_context);
   4276                 return err;
   4277             }
   4278             pDecodedPath =
   4279                 xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
   4280         }
   4281 
   4282         /**
   4283         * End of the UTF conversion, use the converted file path*/
   4284         xVSS_context->pcmPreviewFile =
   4285             (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS,
   4286             (M4OSA_Char *)"pcmPreviewFile");
   4287 
   4288         if( xVSS_context->pcmPreviewFile == M4OSA_NULL )
   4289         {
   4290             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   4291             free(out_pcm);
   4292             out_pcm = M4OSA_NULL;
   4293             /*FB: to avoid leaks when there is an error in the send command*/
   4294             /* Free Send command */
   4295             M4xVSS_freeCommand(xVSS_context);
   4296             /**/
   4297             return M4ERR_ALLOC;
   4298         }
   4299         memcpy((void *)xVSS_context->pcmPreviewFile, (void *)pDecodedPath, length + 1);
   4300 
   4301         /* Free temporary output filename */
   4302         if( out_pcm != M4OSA_NULL )
   4303         {
   4304             free(out_pcm);
   4305             out_pcm = M4OSA_NULL;
   4306         }
   4307 
   4308         pParams->pFileOut = M4OSA_32bitAlignedMalloc((length + 1), M4VS,
   4309             (M4OSA_Char *)"MCS BGM Params: file out");
   4310 
   4311         if( pParams->pFileOut == M4OSA_NULL )
   4312         {
   4313             M4xVSS_freeCommand(xVSS_context);
   4314             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   4315             return M4ERR_ALLOC;
   4316         }
   4317         pParams->pFileTemp = M4OSA_NULL;
   4318 
   4319         memcpy((void *)pParams->pFileOut,(void *) xVSS_context->pcmPreviewFile,
   4320             (length + 1)); /* Copy output file path */
   4321 
   4322         /**
   4323         * UTF conversion: convert into the customer format, before being used*/
   4324 
   4325         pDecodedPath = xVSS_context->pSettings->xVSS.pBGMtrack->pFile;
   4326         length = strlen(pDecodedPath);
   4327 
   4328         if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
   4329             && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
   4330             != M4OSA_NULL )
   4331         {
   4332             err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   4333                 (M4OSA_Void *)xVSS_context->pSettings->xVSS.pBGMtrack->
   4334                 pFile, (M4OSA_Void *)xVSS_context->
   4335                 UTFConversionContext.pTempOutConversionBuffer, &length);
   4336 
   4337             if( err != M4NO_ERROR )
   4338             {
   4339                 M4OSA_TRACE1_1(
   4340                     "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   4341                     err);
   4342                 /* Free Send command */
   4343                 M4xVSS_freeCommand(xVSS_context);
   4344                 return err;
   4345             }
   4346             pDecodedPath =
   4347                 xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
   4348         }
   4349 
   4350         /**
   4351         * End of the UTF conversion, use the converted file path*/
   4352         pParams->pFileIn = (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS,
   4353             (M4OSA_Char *)"MCS BGM Params: file in");
   4354 
   4355         if( pParams->pFileIn == M4OSA_NULL )
   4356         {
   4357             M4xVSS_freeCommand(xVSS_context);
   4358             M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand");
   4359             return M4ERR_ALLOC;
   4360         }
   4361         memcpy((void *)pParams->pFileIn, (void *)pDecodedPath,
   4362             (length + 1)); /* Copy input file path */
   4363 
   4364         pParams->isBGM = M4OSA_TRUE;
   4365         pParams->isCreated = M4OSA_FALSE;
   4366         xVSS_context->nbStepTotal++;
   4367         bIsTranscoding = M4OSA_TRUE;
   4368 #endif /* PREVIEW_ENABLED */
   4369 
   4370     }
   4371     else if( pSettings->xVSS.pBGMtrack != M4OSA_NULL
   4372         && isNewBGM == M4OSA_FALSE )
   4373     {
   4374 #ifdef PREVIEW_ENABLED
   4375         /* BGM is the same as previously, no need to redecode audio */
   4376         /* Need to update MCS params chained list, to signal M4xVSS_step function to skip
   4377         BGM decoding */
   4378 
   4379         M4xVSS_MCS_params *pParams_temp = xVSS_context->pMCSparamsList;
   4380         M4xVSS_MCS_params *pParams_prev = M4OSA_NULL;
   4381 
   4382 #endif /* PREVIEW_ENABLED */
   4383         /* We save output file pointer, because we will need to use it when saving audio
   4384          mixed file (last save step) */
   4385 
   4386         xVSS_context->pOutputFile = xVSS_context->pSettings->pOutputFile;
   4387         xVSS_context->pTemporaryFile = xVSS_context->pSettings->pTemporaryFile;
   4388 
   4389         /* Re-write BGM settings in case they have changed between two sendCommand */
   4390         xVSS_context->pSettings->xVSS.pBGMtrack->uiAddCts =
   4391             pSettings->xVSS.pBGMtrack->uiAddCts;
   4392         xVSS_context->pSettings->xVSS.pBGMtrack->uiAddVolume =
   4393             pSettings->xVSS.pBGMtrack->uiAddVolume;
   4394         xVSS_context->pSettings->xVSS.pBGMtrack->uiBeginLoop =
   4395             pSettings->xVSS.pBGMtrack->uiBeginLoop;
   4396         xVSS_context->pSettings->xVSS.pBGMtrack->uiEndLoop =
   4397             pSettings->xVSS.pBGMtrack->uiEndLoop;
   4398 
   4399 #ifdef PREVIEW_ENABLED
   4400         /* Parse MCS params chained list to find and delete BGM element */
   4401 
   4402         while( pParams_temp != M4OSA_NULL )
   4403         {
   4404             if( pParams_temp->isBGM == M4OSA_TRUE )
   4405             {
   4406                 pParams_temp->isCreated = M4OSA_TRUE;
   4407                 break;
   4408             }
   4409             pParams_prev = pParams_temp;
   4410             pParams_temp = pParams_temp->pNext;
   4411         }
   4412 
   4413 #endif /* PREVIEW_ENABLED */
   4414 
   4415         M4OSA_TRACE2_0("M4xVSS_SendCommand has been recalled, BGM is the same");
   4416     }
   4417     else
   4418     {
   4419         M4OSA_TRACE1_0("No BGM in this xVSS command");
   4420 
   4421         if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL )
   4422         {
   4423 #ifdef PREVIEW_ENABLED
   4424             /* Need to remove MCS previous params chained list */
   4425 
   4426             M4xVSS_MCS_params *pParams_temp = xVSS_context->pMCSparamsList;
   4427             M4xVSS_MCS_params *pParams_prev = M4OSA_NULL;
   4428 
   4429             /* Parse MCS params chained list to find and delete BGM element */
   4430             while( pParams_temp != M4OSA_NULL )
   4431             {
   4432                 if( pParams_temp->isBGM == M4OSA_TRUE )
   4433                 {
   4434                     /* Remove this element */
   4435                     if( pParams_temp->pFileIn != M4OSA_NULL )
   4436                     {
   4437                         free(pParams_temp->pFileIn);
   4438                         pParams_temp->pFileIn = M4OSA_NULL;
   4439                     }
   4440 
   4441                     if( pParams_temp->pFileOut != M4OSA_NULL )
   4442                     {
   4443                         free(pParams_temp->pFileOut);
   4444                         pParams_temp->pFileOut = M4OSA_NULL;
   4445                     }
   4446                     /* Chain previous element with next element */
   4447                     if( pParams_prev != M4OSA_NULL )
   4448                     {
   4449                         pParams_prev->pNext = pParams_temp->pNext;
   4450                     }
   4451                     /* If current pointer is the first of the chained list and next pointer
   4452                      of the chained list is NULL */
   4453                     /* it means that there was only one element in the list */
   4454                     /* => we put the context variable to NULL */
   4455                     if( pParams_temp == xVSS_context->pMCSparamsList
   4456                         && pParams_temp->pNext == M4OSA_NULL )
   4457                     {
   4458                         free(pParams_temp);
   4459                         xVSS_context->pMCSparamsList = M4OSA_NULL;
   4460                     }
   4461                     /* In that case, BGM pointer is the first one, but there are others
   4462                      elements after it */
   4463                     /* So, we need to change first chained list element */
   4464                     else if( pParams_temp->pNext != M4OSA_NULL )
   4465                     {
   4466                         xVSS_context->pMCSparamsList = pParams_temp->pNext;
   4467                         free(pParams_temp);
   4468                         pParams_temp = M4OSA_NULL;
   4469                     }
   4470                     /* In all other cases, nothing else to do except freeing the chained
   4471                     list element */
   4472                     else
   4473                     {
   4474                         free(pParams_temp);
   4475                         pParams_temp = M4OSA_NULL;
   4476                     }
   4477                     break;
   4478                 }
   4479                 pParams_prev = pParams_temp;
   4480                 pParams_temp = pParams_temp->pNext;
   4481             }
   4482 
   4483 #endif /* PREVIEW_ENABLED */
   4484             /* Here, we unallocate all BGM components and put xVSS_context->pSettings->
   4485             xVSS.pBGMtrack to NULL */
   4486 
   4487             if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL )
   4488             {
   4489                 if( xVSS_context->pSettings->xVSS.pBGMtrack->pFile
   4490                     != M4OSA_NULL )
   4491                 {
   4492                     free(xVSS_context->pSettings->xVSS.pBGMtrack->pFile);
   4493                     xVSS_context->pSettings->xVSS.pBGMtrack->pFile = M4OSA_NULL;
   4494                 }
   4495                 free(xVSS_context->pSettings->xVSS.pBGMtrack);
   4496                 xVSS_context->pSettings->xVSS.pBGMtrack = M4OSA_NULL;
   4497             }
   4498         }
   4499     }
   4500 
   4501     /* Changed to be able to mix with video only files -> in case no master clip is found
   4502     (i.e only JPG input or video only input) */
   4503     /* and if there is a BGM, we force the added volume to 100 (i.e replace audio) */
   4504 
   4505     if( masterClip == -1
   4506         && xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL )
   4507     {
   4508         /* In that case, it means that no input 3GP file has a video track.
   4509         Therefore, if a mixing is asked, it will fail. Thus, we force replace audio. */
   4510         xVSS_context->pSettings->xVSS.pBGMtrack->uiAddVolume = 100;
   4511     }
   4512 
   4513     /* Save clip number to know if a M4xVSS_sendCommand has already been called */
   4514     xVSS_context->previousClipNumber = xVSS_context->pSettings->uiClipNumber;
   4515 
   4516     /* Change state */
   4517     xVSS_context->m_state = M4xVSS_kStateAnalyzing;
   4518 
   4519     /* In case of MMS use case, we compute here the max video bitrate */
   4520     /* In case of too low bitrate, a specific warning is returned */
   4521     if( xVSS_context->pSettings->xVSS.outputFileSize != 0 && totalDuration > 0 )
   4522     {
   4523         M4OSA_UInt32 targetedBitrate = 0;
   4524         M4VIDEOEDITING_ClipProperties fileProperties;
   4525         M4OSA_Double ratio;
   4526 
   4527         if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL )
   4528         {
   4529             if( xVSS_context->pSettings->xVSS.pBGMtrack->uiAddVolume
   4530                 == 100 ) /* We are in "replace audio mode, need to check the filetype */
   4531             {
   4532                 if( xVSS_context->pSettings->xVSS.pBGMtrack->FileType
   4533                     == M4VIDEOEDITING_kFileType_3GPP )
   4534                 {
   4535                     M4OSA_Void *pDecodedPath;
   4536                     /**
   4537                     * UTF conversion: convert into the customer format, before being used*/
   4538                     pDecodedPath =
   4539                         xVSS_context->pSettings->xVSS.pBGMtrack->pFile;
   4540                     length = strlen(pDecodedPath);
   4541 
   4542                     if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
   4543                         != M4OSA_NULL && xVSS_context->
   4544                         UTFConversionContext.pTempOutConversionBuffer
   4545                         != M4OSA_NULL )
   4546                     {
   4547                         err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   4548                             (M4OSA_Void *)xVSS_context->pSettings->
   4549                             xVSS.pBGMtrack->pFile,
   4550                             (M4OSA_Void *)xVSS_context->
   4551                             UTFConversionContext.
   4552                             pTempOutConversionBuffer, &length);
   4553 
   4554                         if( err != M4NO_ERROR )
   4555                         {
   4556                             M4OSA_TRACE1_1("M4xVSS_SendCommand: \
   4557                                 M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   4558                                 err);
   4559                             /* Free Send command */
   4560                             M4xVSS_freeCommand(xVSS_context);
   4561                             return err;
   4562                         }
   4563                         pDecodedPath = xVSS_context->
   4564                             UTFConversionContext.pTempOutConversionBuffer;
   4565                     }
   4566 
   4567                     /**
   4568                     * End of the UTF conversion, use the converted file path*/
   4569                     err =
   4570                         M4xVSS_internalGetProperties(xVSS_context, pDecodedPath,
   4571                         &fileProperties);
   4572 
   4573                     /* Get the properties of the BGM track */
   4574                     /*err = M4xVSS_internalGetProperties(xVSS_context, xVSS_context->pSettings->
   4575                     xVSS.pBGMtrack->pFile, &fileProperties);*/
   4576                     if( err != M4NO_ERROR )
   4577                     {
   4578                         M4OSA_TRACE1_1(
   4579                             "M4xVSS_sendCommand: M4xVSS_internalGetProperties returned an error:\
   4580                              0x%x", err);
   4581                         return err;
   4582                     }
   4583 
   4584                     if( fileProperties.AudioStreamType
   4585                         != M4VIDEOEDITING_kAMR_NB )
   4586                     {
   4587                         M4OSA_TRACE1_0(
   4588                             "M4xVSS_sendCommand: Impossible to use MMS mode with BGM != AMR-NB");
   4589                         return M4ERR_PARAMETER;
   4590                     }
   4591                 }
   4592                 else if( xVSS_context->pSettings->xVSS.pBGMtrack->FileType
   4593                     != M4VIDEOEDITING_kFileType_AMR
   4594                     && xVSS_context->pSettings->xVSS.pBGMtrack->FileType
   4595                     != M4VIDEOEDITING_kFileType_MP3 )
   4596                 {
   4597                     M4OSA_TRACE1_0("M4xVSS_sendCommand: Bad input BGM file");
   4598                     return M4ERR_PARAMETER;
   4599                 }
   4600             }
   4601         }
   4602 
   4603         /* Compute targeted bitrate, with 8% margin (moov) */
   4604         if( totalDuration > 1000 )
   4605         {
   4606             targetedBitrate =
   4607                 (M4OSA_UInt32)(( xVSS_context->pSettings->xVSS.outputFileSize
   4608                 * 8 * 0.84) / (totalDuration / 1000));
   4609         }
   4610         else
   4611         {
   4612             targetedBitrate = 0;
   4613         }
   4614 
   4615         /* Remove audio bitrate */
   4616         if( targetedBitrate >= 12200 )
   4617         {
   4618             targetedBitrate -= 12200; /* Only AMR is supported in MMS case */
   4619         }
   4620         else
   4621         {
   4622             targetedBitrate = 0;
   4623         }
   4624 
   4625         /* Compute an indicator of "complexity" depending on nb of sequences and total duration */
   4626         /* The highest is the number of sequences, the more there are some I frames */
   4627         /* In that case, it is necessary to reduce the target bitrate */
   4628         ratio =
   4629             (M4OSA_Double)((M4OSA_Double)(xVSS_context->pSettings->uiClipNumber
   4630             * 100000) / (M4OSA_Double)(totalDuration));
   4631         M4OSA_TRACE2_3(
   4632             "Ratio clip_nb/duration = %f\nTargeted bitrate = %d\nTotal duration: %d",
   4633             (M4OSA_Double)((M4OSA_Double)(xVSS_context->pSettings->uiClipNumber
   4634             * 100000) / (M4OSA_Double)(totalDuration)),
   4635             targetedBitrate, totalDuration);
   4636 
   4637         if( ratio > 50 && ratio <= 75 )
   4638         {
   4639             /* It means that there is a potential risk of having a higher file size
   4640             than specified */
   4641             targetedBitrate -= (M4OSA_UInt32)(targetedBitrate * 0.1);
   4642             M4OSA_TRACE2_2(
   4643                 "New bitrate1 !!\nRatio clip_nb/duration = %f\nTargeted bitrate = %d",
   4644                 ratio, targetedBitrate);
   4645         }
   4646         else if( ratio > 75 )
   4647         {
   4648             targetedBitrate -= (M4OSA_UInt32)(targetedBitrate * 0.15);
   4649             M4OSA_TRACE2_2(
   4650                 "New bitrate2 !!\nRatio clip_nb/duration = %f\nTargeted bitrate = %d",
   4651                 ratio, targetedBitrate);
   4652         }
   4653 
   4654         /*CR 3283 MMS use case for VAL:
   4655         Decrease the output file size to keep a margin of 5%
   4656         The writer will stop when the targeted output file size will be reached*/
   4657         xVSS_context->pSettings->xVSS.outputFileSize -=
   4658             (M4OSA_UInt32)(xVSS_context->pSettings->xVSS.outputFileSize * 0.05);
   4659 
   4660         switch( xVSS_context->pSettings->xVSS.outputVideoSize )
   4661         {
   4662             case M4VIDEOEDITING_kSQCIF:
   4663                 if( targetedBitrate < 32000 )
   4664                 {
   4665                     xVSS_context->targetedBitrate = 32000;
   4666                     return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED;
   4667                 }
   4668                 break;
   4669 
   4670             case M4VIDEOEDITING_kQQVGA:
   4671                 if( targetedBitrate < 32000 )              /*48000)*/
   4672                 {
   4673                     xVSS_context->targetedBitrate = 32000; /*48000;*/
   4674                     return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED;
   4675                 }
   4676                 break;
   4677 
   4678             case M4VIDEOEDITING_kQCIF:
   4679                 if( targetedBitrate < 48000 )              /*64000)*/
   4680                 {
   4681                     xVSS_context->targetedBitrate = 48000; /*64000;*/
   4682                     return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED;
   4683                 }
   4684                 break;
   4685 
   4686             case M4VIDEOEDITING_kQVGA:
   4687                 if( targetedBitrate < 64000 )              /*128000)*/
   4688                 {
   4689                     xVSS_context->targetedBitrate = 64000; /*128000;*/
   4690                     return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED;
   4691                 }
   4692                 break;
   4693 
   4694             case M4VIDEOEDITING_kCIF:
   4695                 if( targetedBitrate < 128000 )
   4696                 {
   4697                     xVSS_context->targetedBitrate = 128000;
   4698                     return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED;
   4699                 }
   4700                 break;
   4701 
   4702             case M4VIDEOEDITING_kVGA:
   4703                 if( targetedBitrate < 192000 )
   4704                 {
   4705                     xVSS_context->targetedBitrate = 192000;
   4706                     return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED;
   4707                 }
   4708                 break;
   4709 
   4710             default:
   4711                 /* Cannot happen */
   4712                 M4OSA_TRACE1_0(
   4713                     "M4xVSS_sendCommand: Error in output fileSize !");
   4714                 return M4ERR_PARAMETER;
   4715                 break;
   4716         }
   4717         xVSS_context->targetedBitrate = (M4OSA_UInt32)targetedBitrate;
   4718     }
   4719 
   4720     if( bIsTranscoding )
   4721     {
   4722         return M4VSS3GPP_WAR_TRANSCODING_NECESSARY;
   4723     }
   4724     else
   4725     {
   4726         return M4NO_ERROR;
   4727     }
   4728 }
   4729 
   4730 /**
   4731  ******************************************************************************
   4732  * prototype    M4OSA_ERR M4xVSS_SaveStart(M4OSA_Context pContext, M4OSA_Char* pFilePath)
   4733  * @brief        This function prepare the save
   4734  * @note        The xVSS create 3GP edited final file
   4735  *                This function must be called once M4xVSS_Step has returned
   4736  *                M4VSS3GPP_WAR_ANALYZING_DONE
   4737  *                After this function, the user must call M4xVSS_Step until
   4738  *                it returns another error than M4NO_ERROR.
   4739  *
   4740  * @param    pContext            (IN) Pointer on the xVSS edit context
   4741  * @param    pFilePath            (IN) If the user wants to provide a different
   4742  *                                output filename, else can be NULL (allocated by the user)
   4743  * @return    M4NO_ERROR:            No error
   4744  * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
   4745  * @return    M4ERR_ALLOC:        Memory allocation has failed
   4746  * @return    M4ERR_STATE:        This function cannot not be called at this time
   4747  ******************************************************************************
   4748  */
   4749 M4OSA_ERR M4xVSS_SaveStart( M4OSA_Context pContext, M4OSA_Void *pFilePath,
   4750                            M4OSA_UInt32 filePathSize )
   4751 {
   4752     M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
   4753     M4OSA_ERR err;
   4754 
   4755     /*Add for UTF conversion: copy the pSettings structure into a new pCurrentEditSettings*/
   4756     M4VSS3GPP_EditSettings *pEditSavingSettings = M4OSA_NULL;
   4757     M4OSA_UInt8 i, j;
   4758     M4OSA_UInt32 offset = 0;
   4759     M4OSA_UInt8 nbEffects = 0;
   4760     /*only for UTF conversion support*/
   4761     M4OSA_Void *pDecodedPath = M4OSA_NULL;
   4762     M4OSA_UInt32 length = 0;
   4763     /**/
   4764 
   4765     /* Check state */
   4766     if( xVSS_context->m_state != M4xVSS_kStateOpened )
   4767     {
   4768         M4OSA_TRACE1_1(
   4769             "Bad state when calling M4xVSS_SaveStart function! State is %d",
   4770             xVSS_context->m_state);
   4771         return M4ERR_STATE;
   4772     }
   4773 
   4774     /* RC: to temporary handle changing of output filepath */
   4775     /* TO BE CHANGED CLEANLY WITH A MALLOC/MEMCPY !!!! */
   4776     if( pFilePath != M4OSA_NULL )
   4777     {
   4778         if( xVSS_context->pSettings->pOutputFile != M4OSA_NULL )
   4779         {
   4780             /*it means that pOutputFile has been allocated in M4xVSS_sendCommand()*/
   4781             free(xVSS_context->pSettings->pOutputFile);
   4782             xVSS_context->pSettings->pOutputFile = M4OSA_NULL;
   4783             xVSS_context->pSettings->uiOutputPathSize = 0;
   4784         }
   4785 
   4786         pDecodedPath = pFilePath;
   4787         /*As all inputs of the xVSS are in UTF8, convert the output file path into the customer
   4788          format*/
   4789         if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
   4790             && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
   4791             != M4OSA_NULL )
   4792         {
   4793             err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   4794                 (M4OSA_Void *)pFilePath, (M4OSA_Void *)xVSS_context->
   4795                 UTFConversionContext.pTempOutConversionBuffer, &length);
   4796 
   4797             if( err != M4NO_ERROR )
   4798             {
   4799                 M4OSA_TRACE1_1(
   4800                     "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   4801                     err);
   4802                 return err;
   4803             }
   4804             pDecodedPath =
   4805                 xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
   4806             filePathSize = length;
   4807         }
   4808 
   4809         xVSS_context->pOutputFile =
   4810             (M4OSA_Void *)M4OSA_32bitAlignedMalloc(filePathSize + 1, M4VS,
   4811             (M4OSA_Char *)"M4xVSS_SaveStart: output file");
   4812 
   4813         if( xVSS_context->pOutputFile == M4OSA_NULL )
   4814         {
   4815             M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   4816             return M4ERR_ALLOC;
   4817         }
   4818         memcpy((void *)xVSS_context->pOutputFile, (void *)pDecodedPath, filePathSize + 1);
   4819         xVSS_context->pOutputFile[filePathSize] = '\0';
   4820         xVSS_context->pSettings->pOutputFile = xVSS_context->pOutputFile;
   4821         xVSS_context->pSettings->uiOutputPathSize = filePathSize;
   4822     }
   4823 
   4824     /**
   4825     ***/
   4826 
   4827     /*FB: Add for UTF conversion: copy the pSettings structure into a new pCurrentEditSettings*/
   4828     /*It is the same principle as in the PreviewStart()*/
   4829     pEditSavingSettings =
   4830         (M4VSS3GPP_EditSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_EditSettings),
   4831         M4VS, (M4OSA_Char *)"Saving, copy of VSS structure");
   4832 
   4833     if( pEditSavingSettings == M4OSA_NULL )
   4834     {
   4835         M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   4836 
   4837         if( xVSS_context->pOutputFile != M4OSA_NULL )
   4838         {
   4839             free(xVSS_context->pOutputFile);
   4840             xVSS_context->pOutputFile = M4OSA_NULL;
   4841         }
   4842         return M4ERR_ALLOC;
   4843     }
   4844 
   4845     /* Copy settings from input structure */
   4846     memcpy((void *) &(pEditSavingSettings->xVSS),
   4847         (void *) &(xVSS_context->pSettings->xVSS),
   4848         sizeof(M4xVSS_EditSettings));
   4849 
   4850     /* Initialize pEditSavingSettings structure */
   4851     pEditSavingSettings->xVSS.pBGMtrack = M4OSA_NULL;
   4852 
   4853     pEditSavingSettings->videoFrameRate =
   4854         xVSS_context->pSettings->videoFrameRate;
   4855     pEditSavingSettings->uiClipNumber = xVSS_context->pSettings->uiClipNumber;
   4856     pEditSavingSettings->uiMasterClip =
   4857         xVSS_context->pSettings->uiMasterClip; /* VSS2.0 mandatory parameter */
   4858 
   4859     /* Allocate savingSettings.pClipList/pTransitions structure */
   4860     pEditSavingSettings->pClipList = (M4VSS3GPP_ClipSettings *
   4861         * )M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_ClipSettings *)
   4862         *pEditSavingSettings->uiClipNumber,
   4863         M4VS, (M4OSA_Char *)"xVSS, saving , copy of pClipList");
   4864 
   4865     if( pEditSavingSettings->pClipList == M4OSA_NULL )
   4866     {
   4867         M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   4868 
   4869         if( xVSS_context->pOutputFile != M4OSA_NULL )
   4870         {
   4871             free(xVSS_context->pOutputFile);
   4872             xVSS_context->pOutputFile = M4OSA_NULL;
   4873         }
   4874         return M4ERR_ALLOC;
   4875     }
   4876 
   4877     if( pEditSavingSettings->uiClipNumber > 1 )
   4878     {
   4879         pEditSavingSettings->pTransitionList = (M4VSS3GPP_TransitionSettings *
   4880             * )M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings *)
   4881             *(pEditSavingSettings->uiClipNumber - 1),
   4882             M4VS, (M4OSA_Char *)"xVSS, saving, copy of pTransitionList");
   4883 
   4884         if( pEditSavingSettings->pTransitionList == M4OSA_NULL )
   4885         {
   4886             M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   4887 
   4888             if( xVSS_context->pOutputFile != M4OSA_NULL )
   4889             {
   4890                 free(xVSS_context->pOutputFile);
   4891                 xVSS_context->pOutputFile = M4OSA_NULL;
   4892             }
   4893             return M4ERR_ALLOC;
   4894         }
   4895     }
   4896     else
   4897     {
   4898         pEditSavingSettings->pTransitionList = M4OSA_NULL;
   4899     }
   4900 
   4901     for ( i = 0; i < pEditSavingSettings->uiClipNumber; i++ )
   4902     {
   4903         pEditSavingSettings->pClipList[i] = (M4VSS3GPP_ClipSettings
   4904             *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_ClipSettings),
   4905             M4VS, (M4OSA_Char *)"saving clip settings");
   4906 
   4907         if( pEditSavingSettings->pClipList[i] == M4OSA_NULL )
   4908         {
   4909             M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   4910 
   4911             if( xVSS_context->pOutputFile != M4OSA_NULL )
   4912             {
   4913                 free(xVSS_context->pOutputFile);
   4914                 xVSS_context->pOutputFile = M4OSA_NULL;
   4915             }
   4916             return M4ERR_ALLOC;
   4917         }
   4918 
   4919         if( i < pEditSavingSettings->uiClipNumber
   4920             - 1 ) /* Because there is 1 less transition than clip number */
   4921         {
   4922             pEditSavingSettings->pTransitionList[i] =
   4923                 (M4VSS3GPP_TransitionSettings
   4924                 *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings),
   4925                 M4VS, (M4OSA_Char *)"saving transition settings");
   4926 
   4927             if( pEditSavingSettings->pTransitionList[i] == M4OSA_NULL )
   4928             {
   4929                 M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   4930 
   4931                 if( xVSS_context->pOutputFile != M4OSA_NULL )
   4932                 {
   4933                     free(xVSS_context->pOutputFile);
   4934                     xVSS_context->pOutputFile = M4OSA_NULL;
   4935                 }
   4936                 return M4ERR_ALLOC;
   4937             }
   4938         }
   4939     }
   4940 
   4941     for ( i = 0; i < xVSS_context->pSettings->uiClipNumber; i++ )
   4942     {
   4943         // Add MP4 file support
   4944 
   4945         if( ( xVSS_context->pSettings->pClipList[i]->FileType
   4946             == M4VIDEOEDITING_kFileType_3GPP)
   4947             || (xVSS_context->pSettings->pClipList[i]->FileType
   4948             == M4VIDEOEDITING_kFileType_MP4)
   4949             || (xVSS_context->pSettings->pClipList[i]->FileType
   4950             == M4VIDEOEDITING_kFileType_M4V)
   4951             || (xVSS_context->pSettings->pClipList[i]->FileType
   4952             == M4VIDEOEDITING_kFileType_ARGB8888))
   4953 
   4954         {
   4955             /* Copy data from given structure to our saving structure */
   4956             M4xVSS_DuplicateClipSettings(pEditSavingSettings->pClipList[i],
   4957                 xVSS_context->pSettings->pClipList[i],
   4958                 M4OSA_FALSE /* remove effects */);
   4959 
   4960             /**
   4961             * UTF conversion: convert into the customer format, before being used*/
   4962             pDecodedPath = pEditSavingSettings->pClipList[i]->pFile;
   4963             length = strlen(pDecodedPath);
   4964 
   4965             if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct
   4966                 != M4OSA_NULL && xVSS_context->
   4967                 UTFConversionContext.pTempOutConversionBuffer
   4968                 != M4OSA_NULL )
   4969             {
   4970                 err =
   4971                     M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void
   4972                     *)pEditSavingSettings->pClipList[i]->pFile,
   4973                     (M4OSA_Void *)xVSS_context->
   4974                     UTFConversionContext.pTempOutConversionBuffer,
   4975                     &length);
   4976 
   4977                 if( err != M4NO_ERROR )
   4978                 {
   4979                     M4OSA_TRACE1_1(
   4980                         "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   4981                         err);
   4982 
   4983                     if( xVSS_context->pOutputFile != M4OSA_NULL )
   4984                     {
   4985                         free(xVSS_context->pOutputFile);
   4986                         xVSS_context->pOutputFile = M4OSA_NULL;
   4987                     }
   4988                     return err;
   4989                 }
   4990                 pDecodedPath = xVSS_context->
   4991                     UTFConversionContext.pTempOutConversionBuffer;
   4992 
   4993                 /**
   4994                 * End of the UTF conversion, use the converted file path*/
   4995                 free(
   4996                     pEditSavingSettings->pClipList[i]->pFile);
   4997                 pEditSavingSettings->pClipList[i]->pFile = (M4OSA_Void
   4998                     *)M4OSA_32bitAlignedMalloc((length + 1),
   4999                     M4VS, (M4OSA_Char *)"saving transition settings");
   5000 
   5001                 if( pEditSavingSettings->pClipList[i]->pFile == M4OSA_NULL )
   5002                 {
   5003                     M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   5004 
   5005                     if( xVSS_context->pOutputFile != M4OSA_NULL )
   5006                     {
   5007                         free(xVSS_context->pOutputFile);
   5008                         xVSS_context->pOutputFile = M4OSA_NULL;
   5009                     }
   5010                     return M4ERR_ALLOC;
   5011                 }
   5012                 memcpy((void *)pEditSavingSettings->pClipList[i]->pFile,
   5013                     (void *)pDecodedPath, length + 1);
   5014             }
   5015             /*FB: add file path size because of UTF 16 conversion*/
   5016             pEditSavingSettings->pClipList[i]->filePathSize = length+1;
   5017 
   5018             if( i
   5019                 < xVSS_context->pSettings->uiClipNumber
   5020                 - 1 ) /* Because there is 1 less transition than clip number */
   5021             {
   5022                 memcpy(
   5023                     (void *)pEditSavingSettings->pTransitionList[i],
   5024                     (void *)xVSS_context->pSettings->
   5025                     pTransitionList[i],
   5026                     sizeof(M4VSS3GPP_TransitionSettings));
   5027             }
   5028         }
   5029         else
   5030         {
   5031             M4OSA_TRACE1_0(
   5032                 "M4xVSS_SaveStart: Error when parsing xVSS_context->pSettings->pClipList[i]:\
   5033                  Bad file type");
   5034 
   5035             if( xVSS_context->pOutputFile != M4OSA_NULL )
   5036             {
   5037                 free(xVSS_context->pOutputFile);
   5038                 xVSS_context->pOutputFile = M4OSA_NULL;
   5039             }
   5040             return M4ERR_PARAMETER;
   5041         }
   5042     }
   5043 
   5044     /* Count the number of video effects, used to know how much memory is needed to allocate*/
   5045     /* FB 2008/10/15: removed : not compatible with M4VSS3GPP_kVideoEffectType_None
   5046     for(j=0;j<xVSS_context->pSettings->nbEffects;j++)
   5047     {
   5048     if(xVSS_context->pSettings->Effects[j].VideoEffectType != M4VSS3GPP_kVideoEffectType_None)
   5049     {
   5050     nbEffects++;
   5051     }
   5052     }*/
   5053     nbEffects = xVSS_context->pSettings->nbEffects;
   5054 
   5055     /* Allocate effects saving structure with correct number of effects */
   5056     if( nbEffects != 0 )
   5057     {
   5058         pEditSavingSettings->Effects =
   5059             (M4VSS3GPP_EffectSettings *)M4OSA_32bitAlignedMalloc(nbEffects
   5060             * sizeof(M4VSS3GPP_EffectSettings), M4VS, (M4OSA_Char
   5061             *)"Saving settings, effects table of structure settings");
   5062 
   5063         if( pEditSavingSettings->Effects == M4OSA_NULL )
   5064         {
   5065             M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   5066 
   5067             if( xVSS_context->pOutputFile != M4OSA_NULL )
   5068             {
   5069                 free(xVSS_context->pOutputFile);
   5070                 xVSS_context->pOutputFile = M4OSA_NULL;
   5071             }
   5072             return M4ERR_ALLOC;
   5073         }
   5074 
   5075         /* Just copy effect structure to saving structure, as effects time are now */
   5076         /* relative to output clip time*/
   5077         memcpy((void *)pEditSavingSettings->Effects,
   5078             (void *)xVSS_context->pSettings->Effects,
   5079             nbEffects * sizeof(M4VSS3GPP_EffectSettings));
   5080     }
   5081     else
   5082     {
   5083         pEditSavingSettings->Effects = M4OSA_NULL;
   5084         pEditSavingSettings->nbEffects = 0;
   5085     }
   5086     pEditSavingSettings->nbEffects = nbEffects;
   5087 
   5088     if( pFilePath != M4OSA_NULL )
   5089     {
   5090         pEditSavingSettings->pOutputFile = pFilePath;
   5091     }
   5092 
   5093     /* Save pointer of saving video editor to use in step function */
   5094     xVSS_context->pCurrentEditSettings = pEditSavingSettings;
   5095 
   5096     /* Change output file name to temporary output file name, because final file will be
   5097      generated by audio mixer */
   5098     if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL )
   5099     {
   5100 
   5101         M4OSA_Char out_3gp[M4XVSS_MAX_PATH_LEN];
   5102         M4OSA_Char out_3gp_tmp[M4XVSS_MAX_PATH_LEN];
   5103 
   5104         /**/
   5105         pEditSavingSettings->xVSS.pBGMtrack =
   5106             (M4xVSS_BGMSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_BGMSettings), M4VS,
   5107             (M4OSA_Char
   5108             *)"Saving settings, effects table of structure settings");
   5109 
   5110         if( pEditSavingSettings->xVSS.pBGMtrack == M4OSA_NULL )
   5111         {
   5112             M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   5113 
   5114             if( xVSS_context->pOutputFile != M4OSA_NULL )
   5115             {
   5116                 free(xVSS_context->pOutputFile);
   5117                 xVSS_context->pOutputFile = M4OSA_NULL;
   5118             }
   5119             return M4ERR_ALLOC;
   5120         }
   5121 
   5122         /* Just copy effect structure to saving structure, as effects time are now */
   5123         /* relative to output clip time*/
   5124         memcpy((void *)pEditSavingSettings->xVSS.pBGMtrack,
   5125             (void *)xVSS_context->pSettings->xVSS.pBGMtrack,
   5126             sizeof(M4xVSS_BGMSettings));
   5127 
   5128         /* Allocate file name, and copy file name buffer to our structure */
   5129         pEditSavingSettings->xVSS.pBGMtrack->pFile = M4OSA_32bitAlignedMalloc(
   5130             (strlen(xVSS_context->pSettings->xVSS.pBGMtrack->pFile)
   5131             + 1),
   5132             M4VS, (M4OSA_Char *)"Saving struct xVSS BGM file path");
   5133 
   5134         if( pEditSavingSettings->xVSS.pBGMtrack->pFile == M4OSA_NULL )
   5135         {
   5136             M4xVSS_freeCommand(xVSS_context);
   5137             M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   5138 
   5139             if( xVSS_context->pOutputFile != M4OSA_NULL )
   5140             {
   5141                 free(xVSS_context->pOutputFile);
   5142                 xVSS_context->pOutputFile = M4OSA_NULL;
   5143             }
   5144             return M4ERR_ALLOC;
   5145         }
   5146         memcpy((void *)pEditSavingSettings->xVSS.pBGMtrack->pFile,
   5147             (void *)xVSS_context->pSettings->xVSS.pBGMtrack->pFile,
   5148             strlen(xVSS_context->pSettings->xVSS.pBGMtrack->pFile)
   5149             + 1);
   5150 
   5151         /*Copy BGM track file path*/
   5152 
   5153         /**
   5154         * UTF conversion*/
   5155         if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
   5156             && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
   5157             != M4OSA_NULL )
   5158         {
   5159             err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   5160                 (M4OSA_Void *)pEditSavingSettings->xVSS.pBGMtrack->pFile,
   5161                 (M4OSA_Void *)xVSS_context->
   5162                 UTFConversionContext.pTempOutConversionBuffer, &length);
   5163 
   5164             if( err != M4NO_ERROR )
   5165             {
   5166                 M4OSA_TRACE1_1(
   5167                     "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   5168                     err);
   5169 
   5170                 if( xVSS_context->pOutputFile != M4OSA_NULL )
   5171                 {
   5172                     free(xVSS_context->pOutputFile);
   5173                     xVSS_context->pOutputFile = M4OSA_NULL;
   5174                 }
   5175                 return err;
   5176             }
   5177             pDecodedPath =
   5178                 xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
   5179 
   5180             free(pEditSavingSettings->xVSS.pBGMtrack->pFile);
   5181             pEditSavingSettings->xVSS.pBGMtrack->pFile =
   5182                 (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS, (M4OSA_Char
   5183                 *)"M4xVSS_SaveStart: Temp filename in case of BGM");
   5184 
   5185             if( pEditSavingSettings->xVSS.pBGMtrack->pFile == M4OSA_NULL )
   5186             {
   5187                 M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   5188 
   5189                 if( xVSS_context->pOutputFile != M4OSA_NULL )
   5190                 {
   5191                     free(xVSS_context->pOutputFile);
   5192                     xVSS_context->pOutputFile = M4OSA_NULL;
   5193                 }
   5194                 return M4ERR_ALLOC;
   5195             }
   5196             memcpy((void *)pEditSavingSettings->xVSS.pBGMtrack->pFile,
   5197                 (void *)pDecodedPath, length + 1);
   5198         }
   5199 
   5200         /**/
   5201 
   5202         M4OSA_chrNCopy(out_3gp, xVSS_context->pTempPath, M4XVSS_MAX_PATH_LEN - 1);
   5203         M4OSA_chrNCopy(out_3gp_tmp, xVSS_context->pTempPath, M4XVSS_MAX_PATH_LEN - 1);
   5204 
   5205         /* Construct output temporary 3GP filename */
   5206         strncat((char *)out_3gp, (const char *)"savetemp.3gp\0", 13);
   5207         strncat((char *)out_3gp_tmp, (const char *)"savetemp.tmp\0", 13);
   5208 
   5209         /**
   5210         * UTF conversion: convert into the customer format, before being used*/
   5211         pDecodedPath = out_3gp;
   5212         length = strlen(pDecodedPath);
   5213 
   5214         if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
   5215             && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
   5216             != M4OSA_NULL )
   5217         {
   5218             err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   5219                 (M4OSA_Void *)out_3gp, (M4OSA_Void *)xVSS_context->
   5220                 UTFConversionContext.pTempOutConversionBuffer, &length);
   5221 
   5222             if( err != M4NO_ERROR )
   5223             {
   5224                 M4OSA_TRACE1_1(
   5225                     "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   5226                     err);
   5227 
   5228                 if( xVSS_context->pOutputFile != M4OSA_NULL )
   5229                 {
   5230                     free(xVSS_context->pOutputFile);
   5231                     xVSS_context->pOutputFile = M4OSA_NULL;
   5232                 }
   5233                 return err;
   5234             }
   5235             pDecodedPath =
   5236                 xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
   5237         }
   5238 
   5239         /**
   5240         * End of the UTF conversion, use the converted file path*/
   5241         xVSS_context->pCurrentEditSettings->pOutputFile =
   5242             (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS,
   5243             (M4OSA_Char *)"M4xVSS_SaveStart: Temp filename in case of BGM");
   5244 
   5245         if( xVSS_context->pCurrentEditSettings->pOutputFile == M4OSA_NULL )
   5246         {
   5247             M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   5248 
   5249             if( xVSS_context->pOutputFile != M4OSA_NULL )
   5250             {
   5251                 free(xVSS_context->pOutputFile);
   5252                 xVSS_context->pOutputFile = M4OSA_NULL;
   5253             }
   5254             return M4ERR_ALLOC;
   5255         }
   5256         memcpy((void *)xVSS_context->pCurrentEditSettings->pOutputFile,
   5257             (void *)pDecodedPath, length + 1);
   5258         xVSS_context->pCurrentEditSettings->uiOutputPathSize = length + 1;
   5259 
   5260         /**
   5261         * UTF conversion: convert into the customer format, before being used*/
   5262         pDecodedPath = out_3gp_tmp;
   5263         length = strlen(pDecodedPath);
   5264 
   5265         if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL
   5266             && xVSS_context->UTFConversionContext.pTempOutConversionBuffer
   5267             != M4OSA_NULL )
   5268         {
   5269             err = M4xVSS_internalConvertFromUTF8(xVSS_context,
   5270                 (M4OSA_Void *)out_3gp_tmp, (M4OSA_Void *)xVSS_context->
   5271                 UTFConversionContext.pTempOutConversionBuffer, &length);
   5272 
   5273             if( err != M4NO_ERROR )
   5274             {
   5275                 M4OSA_TRACE1_1(
   5276                     "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x",
   5277                     err);
   5278 
   5279                 if( xVSS_context->pOutputFile != M4OSA_NULL )
   5280                 {
   5281                     free(xVSS_context->pOutputFile);
   5282                     xVSS_context->pOutputFile = M4OSA_NULL;
   5283                 }
   5284                 return err;
   5285             }
   5286             pDecodedPath =
   5287                 xVSS_context->UTFConversionContext.pTempOutConversionBuffer;
   5288         }
   5289 
   5290         /**
   5291         * End of the UTF conversion, use the converted file path*/
   5292         xVSS_context->pCurrentEditSettings->pTemporaryFile =
   5293             (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS,
   5294             (M4OSA_Char *)"M4xVSS_SaveStart: Temporary file");
   5295 
   5296         if( xVSS_context->pCurrentEditSettings->pTemporaryFile == M4OSA_NULL )
   5297         {
   5298             M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart");
   5299 
   5300             if( xVSS_context->pOutputFile != M4OSA_NULL )
   5301             {
   5302                 free(xVSS_context->pOutputFile);
   5303                 xVSS_context->pOutputFile = M4OSA_NULL;
   5304             }
   5305             return M4ERR_ALLOC;
   5306         }
   5307         memcpy((void *)xVSS_context->pCurrentEditSettings->pTemporaryFile,
   5308             (void *)pDecodedPath, length + 1);
   5309 
   5310         /* Put nb of step for progression monitoring to 2, because audio mixing is needed */
   5311         xVSS_context->nbStepTotal = 2;
   5312     }
   5313     else
   5314     {
   5315         xVSS_context->pCurrentEditSettings->pOutputFile =
   5316             xVSS_context->pOutputFile;
   5317         xVSS_context->pCurrentEditSettings->pTemporaryFile = M4OSA_NULL;
   5318 
   5319         /* Put nb of step for progression monitoring to 1, because no audio mixing is needed */
   5320         xVSS_context->nbStepTotal = 1;
   5321     }
   5322 
   5323     /**
   5324     ***/
   5325 
   5326     err = M4xVSS_internalGenerateEditedFile(xVSS_context);
   5327 
   5328     if( err != M4NO_ERROR )
   5329     {
   5330         M4OSA_TRACE1_1(
   5331             "M4xVSS_SaveStart: M4xVSS_internalGenerateEditedFile returned an error: 0x%x",
   5332             err);
   5333 
   5334         /**/
   5335         if( xVSS_context->pCurrentEditSettings->pOutputFile != M4OSA_NULL
   5336             && xVSS_context->pSettings->xVSS.pBGMtrack == M4OSA_NULL )
   5337         {
   5338             free(xVSS_context->pCurrentEditSettings->
   5339                 pOutputFile);
   5340             xVSS_context->pCurrentEditSettings->pOutputFile = M4OSA_NULL;
   5341             xVSS_context->pOutputFile = M4OSA_NULL;
   5342         }
   5343 
   5344         if( xVSS_context->pCurrentEditSettings->pTemporaryFile != M4OSA_NULL
   5345             && xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL )
   5346         {
   5347             free(xVSS_context->pCurrentEditSettings->
   5348                 pTemporaryFile);
   5349             xVSS_context->pCurrentEditSettings->pTemporaryFile = M4OSA_NULL;
   5350         }
   5351 
   5352         if( xVSS_context->pOutputFile != M4OSA_NULL )
   5353         {
   5354             free(xVSS_context->pOutputFile);
   5355             xVSS_context->pOutputFile = M4OSA_NULL;
   5356         }
   5357         /* TODO: Translate error code of VSS to an xVSS error code */
   5358         return err;
   5359     }
   5360 
   5361     /* Reinitialize current step number for progression monitoring */
   5362     xVSS_context->currentStep = 0;
   5363 
   5364     /* Change xVSS state */
   5365     xVSS_context->m_state = M4xVSS_kStateSaving;
   5366 
   5367     return M4NO_ERROR;
   5368 }
   5369 
   5370 /**
   5371  ******************************************************************************
   5372  * prototype    M4OSA_ERR M4xVSS_SaveStop(M4OSA_Context pContext)
   5373  * @brief        This function unallocate save ressources and change xVSS
   5374  *                internal state.
   5375  * @note        This function must be called once M4xVSS_Step has returned
   5376  *                M4VSS3GPP_WAR_SAVING_DONE
   5377  *
   5378  * @param    pContext            (IN) Pointer on the xVSS edit context
   5379  * @return    M4NO_ERROR:            No error
   5380  * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
   5381  * @return    M4ERR_STATE:        This function cannot not be called at this time
   5382  ******************************************************************************
   5383  */
   5384 M4OSA_ERR M4xVSS_SaveStop( M4OSA_Context pContext )
   5385 {
   5386     M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
   5387     M4OSA_ERR err = M4NO_ERROR;
   5388 
   5389     /* Check state */
   5390     if( xVSS_context->m_state != M4xVSS_kStateSaving )
   5391     {
   5392         M4OSA_TRACE1_1(
   5393             "Bad state when calling M4xVSS_SaveStop function! State is %d",
   5394             xVSS_context->m_state);
   5395         return M4ERR_STATE;
   5396     }
   5397 
   5398     /* Free saving structures */
   5399     M4xVSS_internalFreeSaving(xVSS_context);
   5400 
   5401     if( xVSS_context->pOutputFile != M4OSA_NULL )
   5402     {
   5403         free(xVSS_context->pOutputFile);
   5404         xVSS_context->pOutputFile = M4OSA_NULL;
   5405     }
   5406 
   5407     /* Change xVSS state */
   5408     xVSS_context->m_state = M4xVSS_kStateSaved;
   5409 
   5410     return M4NO_ERROR;
   5411 }
   5412 
   5413 /**
   5414  ******************************************************************************
   5415  * prototype    M4OSA_ERR M4xVSS_Step(M4OSA_Context pContext, M4OSA_UInt8 *pProgress)
   5416  * @brief        This function executes differents tasks, depending of xVSS
   5417  *                internal state.
   5418  * @note        This function:
   5419  *                    - analyses editing structure if called after M4xVSS_SendCommand
   5420  *                    - generates preview file if called after M4xVSS_PreviewStart
   5421  *                    - generates final edited file if called after M4xVSS_SaveStart
   5422  *
   5423  * @param    pContext                        (IN) Pointer on the xVSS edit context
   5424  * @param    pProgress                        (IN/OUT) Pointer on an integer giving a
   5425  *                                            progress indication (between 0-100)
   5426  * @return    M4NO_ERROR:                        No error, the user must call M4xVSS_Step again
   5427  * @return    M4ERR_PARAMETER:                At least one parameter is M4OSA_NULL
   5428  * @return    M4ERR_STATE:                    This function cannot not be called at this time
   5429  * @return    M4VSS3GPP_WAR_PREVIEW_READY:    Preview file is generated
   5430  * @return    M4VSS3GPP_WAR_SAVING_DONE:        Final edited file is generated
   5431  * @return    M4VSS3GPP_WAR_ANALYZING_DONE:    Analyse is done
   5432  ******************************************************************************
   5433  */
   5434 M4OSA_ERR M4xVSS_Step( M4OSA_Context pContext, M4OSA_UInt8 *pProgress )
   5435 {
   5436     M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
   5437     M4VSS3GPP_EditContext pVssCtxt = xVSS_context->pCurrentEditContext;
   5438     M4VSS3GPP_AudioMixingContext pAudioMixingCtxt =
   5439         xVSS_context->pAudioMixContext;
   5440     M4OSA_ERR err = M4NO_ERROR;
   5441     M4OSA_UInt8 uiProgress = 0;
   5442 
   5443     switch( xVSS_context->m_state )
   5444     {
   5445         case M4xVSS_kStateSaving:
   5446         //case M4xVSS_kStateGeneratingPreview:
   5447             {
   5448                 if( xVSS_context->editingStep
   5449                     == M4xVSS_kMicroStateEditing ) /* VSS -> creating effects, transitions ... */
   5450                 {
   5451                     /* RC: to delete unecessary temp files on the fly */
   5452                     M4VSS3GPP_InternalEditContext *pVSSContext =
   5453                         (M4VSS3GPP_InternalEditContext *)pVssCtxt;
   5454 
   5455                     err = M4VSS3GPP_editStep(pVssCtxt, &uiProgress);
   5456 
   5457                     if( ( err != M4NO_ERROR) && (err != M4VSS3GPP_WAR_EDITING_DONE)
   5458                         && (err != M4VSS3GPP_WAR_SWITCH_CLIP) )
   5459                     {
   5460                         M4OSA_TRACE1_1(
   5461                             "M4xVSS_Step: M4VSS3GPP_editStep returned 0x%x\n", err);
   5462                         M4VSS3GPP_editCleanUp(pVssCtxt);
   5463                         /* TODO ? : Translate error code of VSS to an xVSS error code ? */
   5464                         xVSS_context->pCurrentEditContext = M4OSA_NULL;
   5465                         return err;
   5466                     }
   5467 
   5468                     /* RC: to delete unecessary temp files on the fly */
   5469                     if( err == M4VSS3GPP_WAR_SWITCH_CLIP )
   5470                     {
   5471 #ifndef DO_NOT_REMOVE_TEMP_FILES
   5472                         /* It means we can delete the temporary file */
   5473                         /* First step, check the temp file is not use somewhere else after */
   5474 
   5475                         M4OSA_UInt32 i;
   5476                         M4OSA_Int32 cmpResult = -1;
   5477 
   5478                         for ( i = pVSSContext->uiCurrentClip;
   5479                             i < pVSSContext->uiClipNumber; i++ )
   5480                         {
   5481                             if( pVSSContext->pClipList[pVSSContext->uiCurrentClip
   5482                                 - 1].filePathSize
   5483                                 == pVSSContext->pClipList[i].filePathSize )
   5484                             {
   5485                                 cmpResult = memcmp((void *)pVSSContext->
   5486                                     pClipList[pVSSContext->uiCurrentClip
   5487                                     - 1].pFile, (void *)pVSSContext->pClipList[i].pFile,
   5488                                     pVSSContext->
   5489                                     pClipList[pVSSContext->uiCurrentClip
   5490                                     - 1].filePathSize);
   5491 
   5492                                 if( cmpResult == 0 )
   5493                                 {
   5494                                     /* It means we found a corresponding file, we do not delete
   5495                                     this temporary file */
   5496                                     break;
   5497                                 }
   5498                             }
   5499                         }
   5500 
   5501                         if( cmpResult != 0 )
   5502                         {
   5503                             M4OSA_UInt32 ConvertedSize = 0;
   5504                             M4OSA_Char *toto;
   5505                             M4OSA_Char *pTmpStr;
   5506 
   5507                             /* Convert result in UTF8 to check if we can delete it or not */
   5508                             if( xVSS_context->UTFConversionContext.pConvToUTF8Fct
   5509                                 != M4OSA_NULL && xVSS_context->
   5510                                 UTFConversionContext.
   5511                                 pTempOutConversionBuffer != M4OSA_NULL )
   5512                             {
   5513                                 M4xVSS_internalConvertToUTF8(xVSS_context,
   5514                                     (M4OSA_Void *)pVSSContext->
   5515                                     pClipList[pVSSContext->uiCurrentClip
   5516                                     - 1].pFile, (M4OSA_Void *)xVSS_context->
   5517                                     UTFConversionContext.
   5518                                     pTempOutConversionBuffer, &ConvertedSize);
   5519                                 toto = (M4OSA_Char *)strstr((const char *)xVSS_context->
   5520                                     UTFConversionContext.
   5521                                     pTempOutConversionBuffer,
   5522                                     (const char *)xVSS_context->pTempPath);
   5523                                 pTmpStr =
   5524                                     xVSS_context->UTFConversionContext.
   5525                                     pTempOutConversionBuffer;
   5526                             }
   5527                             else
   5528                             {
   5529                                 toto = (M4OSA_Char *)strstr((const char *)pVSSContext->
   5530                                     pClipList[pVSSContext->uiCurrentClip
   5531                                     - 1].pFile, (const char *)xVSS_context->pTempPath);
   5532                                 pTmpStr = pVSSContext->
   5533                                     pClipList[pVSSContext->uiCurrentClip
   5534                                     - 1].pFile;
   5535                             }
   5536 
   5537                             if( toto != M4OSA_NULL )
   5538                             {
   5539                                 /* As temporary files can be imgXXX.3gp or vidXXX.3gp */
   5540                                 pTmpStr +=
   5541                                     (strlen((const char *)pTmpStr)
   5542                                     - 10); /* Because temporary files have a length at most of
   5543                                     10 bytes */
   5544                                 toto = (M4OSA_Char *)strstr((const char *)pTmpStr,
   5545                                     (const char *)"img");
   5546 
   5547                                 if( toto != M4OSA_NULL )
   5548                                 {
   5549                                     toto = (M4OSA_Char *)strstr((const char *)pTmpStr,
   5550                                         (const char *)"vid");
   5551                                 }
   5552 
   5553                                 if( err
   5554                                     == M4NO_ERROR ) /* It means the file is a temporary file, we
   5555                                     can delete it */
   5556                                 {
   5557                                     remove((const char *)pVSSContext->
   5558                                         pClipList[pVSSContext->uiCurrentClip
   5559                                         - 1].pFile);
   5560                                 }
   5561                             }
   5562                         }
   5563 
   5564 #endif /* DO_NOT_REMOVE_TEMP_FILES*/
   5565                         /* */
   5566 
   5567                         err = M4NO_ERROR;
   5568                     }
   5569 
   5570                     if( err == M4VSS3GPP_WAR_EDITING_DONE )
   5571                     {
   5572                         xVSS_context->currentStep++;
   5573                         /* P4ME00003276: When a step is complete, increment currentStep and reset
   5574                         uiProgress unless progress would be wrong */
   5575                         uiProgress = 0;
   5576                         err = M4xVSS_internalCloseEditedFile(xVSS_context);
   5577                         /* Fix for  blrnxpsw#234---> */
   5578                         if( err != M4NO_ERROR )
   5579                         {
   5580                             if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) )
   5581                             {
   5582                                 err = M4xVSSERR_NO_MORE_SPACE;
   5583                             }
   5584                             M4OSA_TRACE1_1(
   5585                                 "M4xVSS_internalCloseEditedFile returned an error: 0x%x",
   5586                                 err);
   5587                             return err;
   5588                         }
   5589                         /*<---- Fix for  blrnxpsw#234 */
   5590                         if( xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack
   5591                             != M4OSA_NULL )
   5592                         {
   5593                             xVSS_context->editingStep =
   5594                                 M4xVSS_kMicroStateAudioMixing;
   5595                             /* Open Audio mixing component */
   5596                             err = M4xVSS_internalGenerateAudioMixFile(xVSS_context);
   5597 
   5598                             if( err != M4NO_ERROR )
   5599                             {
   5600                                 M4OSA_TRACE1_1(
   5601                                     "M4xVSS_internalGenerateAudioMixFile returned an error: 0x%x",
   5602                                     err);
   5603                                 /* TODO ? : Translate error code of VSS to an xVSS error code */
   5604                                 return err;
   5605                             }
   5606                             err = M4NO_ERROR;
   5607                             goto end_step;
   5608                         }
   5609                         else
   5610                         {
   5611 
   5612                             err = M4VSS3GPP_WAR_SAVING_DONE;
   5613                             goto end_step;
   5614 
   5615                         }
   5616                     }
   5617                 }
   5618                 else if( xVSS_context->editingStep
   5619                     == M4xVSS_kMicroStateAudioMixing ) /* Audio mixing: mix/replace audio track
   5620                     with given BGM */
   5621                 {
   5622                     err = M4VSS3GPP_audioMixingStep(pAudioMixingCtxt, &uiProgress);
   5623 
   5624                     if( ( err != M4NO_ERROR)
   5625                         && (err != M4VSS3GPP_WAR_END_OF_AUDIO_MIXING) )
   5626                     {
   5627                         M4OSA_TRACE1_1(
   5628                             "M4VSS3GPP_audioMixingMain: M4VSS3GPP_audioMixingStep returned 0x%x\n",
   5629                             err);
   5630                         /* TODO ? : Translate error code of VSS to an xVSS error code */
   5631                         return err;
   5632                     }
   5633 
   5634                     if( err == M4VSS3GPP_WAR_END_OF_AUDIO_MIXING )
   5635                     {
   5636                         xVSS_context->currentStep++;
   5637                         /* P4ME00003276: When a step is complete, increment currentStep and reset
   5638                         uiProgress unless progress would be wrong */
   5639                         uiProgress = 0;
   5640                         err = M4xVSS_internalCloseAudioMixedFile(xVSS_context);
   5641 
   5642                         if( err != M4NO_ERROR )
   5643                         {
   5644                             M4OSA_TRACE1_1(
   5645                                 "M4xVSS_internalCloseAudioMixedFile returned an error: 0x%x",
   5646                                 err);
   5647                             /* TODO ? : Translate error code of VSS to an xVSS error code */
   5648                             return err;
   5649                         }
   5650 
   5651                             err = M4VSS3GPP_WAR_SAVING_DONE;
   5652                             goto end_step;
   5653 
   5654                     }
   5655                 }
   5656                 else
   5657                 {
   5658                     M4OSA_TRACE1_0("Bad state in step function !");
   5659                     return M4ERR_STATE;
   5660                 }
   5661             }
   5662             break;
   5663 
   5664         case M4xVSS_kStateAnalyzing:
   5665             {
   5666                 if( xVSS_context->analyseStep
   5667                     == M4xVSS_kMicroStateAnalysePto3GPP ) /* Pto3GPP, analysing input parameters */
   5668                 {
   5669                     if( xVSS_context->pPTo3GPPcurrentParams == M4OSA_NULL
   5670                         && xVSS_context->pPTo3GPPparamsList != M4OSA_NULL )
   5671                     {
   5672                         xVSS_context->pPTo3GPPcurrentParams =
   5673                             xVSS_context->
   5674                             pPTo3GPPparamsList; /* Current Pto3GPP Parameter is the first element
   5675                             of the list */
   5676                     }
   5677                     else if( xVSS_context->pPTo3GPPcurrentParams != M4OSA_NULL
   5678                         && xVSS_context->pPTo3GPPparamsList != M4OSA_NULL )
   5679                     {
   5680                         xVSS_context->pPTo3GPPcurrentParams =
   5681                             xVSS_context->pPTo3GPPcurrentParams->
   5682                             pNext; /* Current Pto3GPP Parameter is the next element of the list */
   5683 
   5684                         if( xVSS_context->pPTo3GPPcurrentParams
   5685                             == M4OSA_NULL ) /* It means there is no next image to convert */
   5686                         {
   5687                             /* We step to MCS phase */
   5688                             xVSS_context->analyseStep =
   5689                                 M4xVSS_kMicroStateAnalyzeMCS;
   5690                             err = M4NO_ERROR;
   5691                             goto end_step;
   5692                         }
   5693                     }
   5694                     else if( xVSS_context->pPTo3GPPparamsList == M4OSA_NULL )
   5695                     {
   5696                         xVSS_context->analyseStep =
   5697                             M4xVSS_kMicroStateAnalyzeMCS; /* Change Analyzing micro state to
   5698                              MCS phase */
   5699                         err = M4NO_ERROR;
   5700                         goto end_step;
   5701                     }
   5702 
   5703                     /* Check if this file has to be converted or not */
   5704                     /* If not, we just return M4NO_ERROR, and go to next file */
   5705                     if( xVSS_context->pPTo3GPPcurrentParams->isCreated
   5706                         == M4OSA_FALSE )
   5707                     {
   5708                         /* Opening Pto3GPP */
   5709                         err = M4xVSS_internalStartConvertPictureTo3gp(xVSS_context);
   5710 
   5711                         if( err != M4NO_ERROR )
   5712                         {
   5713                             M4OSA_TRACE1_1("M4xVSS_Step: M4xVSS_internalStartConvertPictureTo3gp \
   5714                             returned error: 0x%x",
   5715                                 err)
   5716                                 /* TODO ? : Translate error code of VSS to an xVSS error code */
   5717                                 return err;
   5718                         }
   5719                         xVSS_context->analyseStep =
   5720                             M4xVSS_kMicroStateConvertPto3GPP;
   5721                     }
   5722                 }
   5723                 else if( xVSS_context->analyseStep
   5724                     == M4xVSS_kMicroStateConvertPto3GPP ) /* Pto3GPP, converting */
   5725                 {
   5726                     err = M4PTO3GPP_Step(xVSS_context->pM4PTO3GPP_Ctxt);
   5727                     /* update progress bar */
   5728                     if(xVSS_context->pCallBackCtxt->m_NbImage > 1)
   5729                     {
   5730                         uiProgress = (xVSS_context->pCallBackCtxt->m_ImageCounter * 100) / (xVSS_context->pCallBackCtxt->m_NbImage -1);
   5731                     }
   5732 
   5733                     if( ( err != M4NO_ERROR) && (err
   5734                         != ((M4OSA_UInt32)M4PTO3GPP_WAR_END_OF_PROCESSING)) )
   5735                     {
   5736                         /* TO BE CHECKED NO LEAKS  !!!!! */
   5737                         M4OSA_TRACE1_1(
   5738                             "M4xVSS_Step: M4PTO3GPP_Step returned 0x%x\n", err);
   5739                         /* TODO ? : Translate error code of VSS to an xVSS error code */
   5740                         return err;
   5741                     }
   5742                     else if( err
   5743                         == ((M4OSA_UInt32)M4PTO3GPP_WAR_END_OF_PROCESSING) )
   5744                     {
   5745                         xVSS_context->currentStep++;
   5746                         /* P4ME00003276: When a step is complete, increment currentStep and reset
   5747                          uiProgress unless progress would be wrong */
   5748                         uiProgress = 0;
   5749                         xVSS_context->analyseStep =
   5750                             M4xVSS_kMicroStateAnalysePto3GPP; /* We go back to analyze parameters
   5751                             to see if there is a next file to convert */
   5752                         /* RC !!!!!!!! */
   5753                         xVSS_context->pPTo3GPPcurrentParams->isCreated =
   5754                             M4OSA_TRUE; /* To avoid reconverting it if another SendCommand is
   5755                             called */
   5756                         err = M4xVSS_internalStopConvertPictureTo3gp(xVSS_context);
   5757                         /*SS:blrnxpsw#  234 */
   5758                         if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) )
   5759                         {
   5760                             err = M4xVSSERR_NO_MORE_SPACE;
   5761                         }
   5762 
   5763                         if( err != M4NO_ERROR )
   5764                         {
   5765                             M4OSA_TRACE1_1("M4xVSS_Step:\
   5766                                            M4xVSS_internalStopConvertPictureTo3gp returned 0x%x",
   5767                                             err);
   5768                             /* TODO ? : Translate error code of VSS to an xVSS error code */
   5769                             return err;
   5770                         }
   5771                     }
   5772                 }
   5773                 else if( xVSS_context->analyseStep
   5774                     ==
   5775                     M4xVSS_kMicroStateAnalyzeMCS ) /* MCS: analyzing input parameters */
   5776                 {
   5777                     if( xVSS_context->pMCScurrentParams == M4OSA_NULL \
   5778                         && xVSS_context->pMCSparamsList != M4OSA_NULL )
   5779                     {
   5780                         xVSS_context->pMCScurrentParams = xVSS_context->
   5781                             pMCSparamsList; /* Current MCS Parameter is the first
   5782                                             element of the list */
   5783                     }
   5784                     else if( xVSS_context->pMCScurrentParams != M4OSA_NULL \
   5785                         && xVSS_context->pMCSparamsList != M4OSA_NULL )
   5786                     {
   5787                         xVSS_context->pMCScurrentParams =
   5788                             xVSS_context->pMCScurrentParams->
   5789                             pNext; /* Current MCS Parameter
   5790                                    is the next element of the list */
   5791 
   5792                         if( xVSS_context->pMCScurrentParams == M4OSA_NULL )
   5793                             /* It means there is no next image to convert */
   5794                         {
   5795                             xVSS_context->analyseStep =
   5796                                 M4xVSS_kMicroStateAnalysePto3GPP; /* Reinit Analyzing micro state */
   5797                             xVSS_context->m_state =
   5798                                 M4xVSS_kStateOpened; /* Change xVSS state */
   5799                             err = M4VSS3GPP_WAR_ANALYZING_DONE;
   5800                             goto end_step; /* End of Analysis */
   5801                         }
   5802                     }
   5803                     else if( xVSS_context->pMCSparamsList == M4OSA_NULL )
   5804                     {
   5805                         xVSS_context->analyseStep =
   5806                             M4xVSS_kMicroStateAnalysePto3GPP; /* Reinit Analyzing micro state */
   5807                         xVSS_context->m_state =
   5808                             M4xVSS_kStateOpened; /* Change xVSS state */
   5809                         err = M4VSS3GPP_WAR_ANALYZING_DONE;
   5810                         goto end_step;                        /* End of Analysis */
   5811                     }
   5812 
   5813                     /* Check if this file has to be transcoded or not */
   5814                     /* If not, we just return M4NO_ERROR, and go to next file */
   5815                     if( xVSS_context->pMCScurrentParams->isCreated == M4OSA_FALSE )
   5816                     {
   5817                         /* Opening MCS */
   5818                         M4OSA_UInt32 rotationDegree = 0;
   5819                         err = M4xVSS_internalStartTranscoding(xVSS_context, &rotationDegree);
   5820 
   5821                         if( err != M4NO_ERROR )
   5822                         {
   5823                             M4OSA_TRACE1_1("M4xVSS_Step: M4xVSS_internalStartTranscoding returned\
   5824                                  error: 0x%x", err);
   5825                             return err;
   5826                         }
   5827                         int32_t index = xVSS_context->pMCScurrentParams->videoclipnumber;
   5828 
   5829                         /* The cuts are done in the MCS, so we need to replace
   5830                            the beginCutTime and endCutTime to keep the entire video*/
   5831                         xVSS_context->pSettings->pClipList[index]->uiBeginCutTime = 0;
   5832                         xVSS_context->pSettings->pClipList[index]->uiEndCutTime = 0;
   5833 
   5834 
   5835                         M4OSA_TRACE1_1("M4xVSS_Step: \
   5836                             M4xVSS_internalStartTranscoding returned \
   5837                                 success; MCS context: 0x%x",
   5838                                  xVSS_context->pMCS_Ctxt);
   5839                         xVSS_context->analyseStep =
   5840                             M4xVSS_kMicroStateTranscodeMCS;
   5841 
   5842                         // Retain rotation info of trimmed / transcoded file
   5843                         xVSS_context->pSettings->pClipList[index]->\
   5844                             ClipProperties.videoRotationDegrees = rotationDegree;
   5845                     }
   5846                 }
   5847                 else if( xVSS_context->analyseStep
   5848                     == M4xVSS_kMicroStateTranscodeMCS )
   5849                     /* MCS: transcoding file */
   5850                 {
   5851                     err = M4MCS_step(xVSS_context->pMCS_Ctxt, &uiProgress);
   5852                     /*SS:blrnxpsw#  234 */
   5853                     if( err == ((M4OSA_UInt32)M4MCS_ERR_NOMORE_SPACE) )
   5854                     {
   5855                         err = M4xVSSERR_NO_MORE_SPACE;
   5856                     }
   5857 
   5858                     if( ( err != M4NO_ERROR)
   5859                         && (err != M4MCS_WAR_TRANSCODING_DONE) )
   5860                     {
   5861                         /* TO BE CHECKED NO LEAKS  !!!!! */
   5862                         M4OSA_TRACE1_1("M4xVSS_Step: M4MCS_step returned 0x%x\n",
   5863                             err);
   5864                         /* TODO ? : Translate error code of MCS to an xVSS error code ? */
   5865                         return err;
   5866                     }
   5867                     else if( err == M4MCS_WAR_TRANSCODING_DONE )
   5868                     {
   5869                         xVSS_context->currentStep++;
   5870                         /* P4ME00003276: When a step is complete, increment currentStep and reset
   5871                         uiProgress unless progress would be wrong */
   5872                         uiProgress = 0;
   5873                         xVSS_context->analyseStep =
   5874                             M4xVSS_kMicroStateAnalyzeMCS; /* We go back to
   5875                                                           analyze parameters to see if there is
   5876                                                            a next file to transcode */
   5877                         /* RC !!!!!!!!!*/
   5878                         xVSS_context->pMCScurrentParams->isCreated =
   5879                             M4OSA_TRUE; /* To avoid
   5880                                         reconverting it if another SendCommand is called */
   5881                         err = M4xVSS_internalStopTranscoding(xVSS_context);
   5882 
   5883                         if( err != M4NO_ERROR )
   5884                         {
   5885                             M4OSA_TRACE1_1("M4xVSS_Step:\
   5886                                            M4xVSS_internalStopTranscoding returned 0x%x", err);
   5887                             /* TODO ? : Translate error code of MCS to an xVSS error code ? */
   5888                             return err;
   5889                         }
   5890                     }
   5891                 }
   5892                 else
   5893                 {
   5894                     M4OSA_TRACE1_0("Bad micro state in analyzing state")
   5895                         return M4ERR_STATE;
   5896                 }
   5897             }
   5898             break;
   5899 
   5900         default:
   5901             M4OSA_TRACE1_1(
   5902                 "Bad state when calling M4xVSS_Step function! State is %d",
   5903                 xVSS_context->m_state);
   5904             return M4ERR_STATE;
   5905     }
   5906 
   5907 end_step:
   5908     /* Compute progression */
   5909     if( xVSS_context->nbStepTotal != 0 )
   5910     {
   5911         *pProgress = (M4OSA_UInt8)(( ( xVSS_context->currentStep * 100) \
   5912             / (xVSS_context->nbStepTotal))
   5913             + (uiProgress / (xVSS_context->nbStepTotal)));
   5914 
   5915         if( *pProgress > 100 )
   5916         {
   5917             *pProgress = 100;
   5918         }
   5919     }
   5920     else
   5921     {
   5922         *pProgress = 100;
   5923     }
   5924 
   5925     return err;
   5926 }
   5927 
   5928 /**
   5929  ******************************************************************************
   5930  * prototype    M4OSA_ERR M4xVSS_CloseCommand(M4OSA_Context pContext)
   5931  * @brief        This function deletes current editing profile, unallocate
   5932  *                ressources and change xVSS internal state.
   5933  * @note        After this function, the user can call a new M4xVSS_SendCommand
   5934  *
   5935  * @param    pContext            (IN) Pointer on the xVSS edit context
   5936  * @return    M4NO_ERROR:            No error
   5937  * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
   5938  * @return    M4ERR_STATE:        This function cannot not be called at this time
   5939  ******************************************************************************
   5940  */
   5941 M4OSA_ERR M4xVSS_CloseCommand( M4OSA_Context pContext )
   5942 {
   5943     M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
   5944     M4OSA_ERR err = M4NO_ERROR;
   5945 
   5946     /* Check state */
   5947     /* Depending of the state, differents things have to be done */
   5948     switch( xVSS_context->m_state )
   5949     {
   5950         case M4xVSS_kStateOpened:
   5951             /* Nothing to do here */
   5952             err = M4xVSS_internalFreeSaving(xVSS_context);
   5953             break;
   5954 
   5955         case M4xVSS_kStateSaving:
   5956             {
   5957                 if( xVSS_context->editingStep == M4xVSS_kMicroStateEditing )
   5958                 {
   5959                     err = M4xVSS_internalCloseEditedFile(xVSS_context);
   5960 
   5961                     if( err != M4NO_ERROR )
   5962                     {
   5963                         /* Fix for blrnxpsw#234---->*/
   5964                         if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) )
   5965                         {
   5966                             err = M4xVSSERR_NO_MORE_SPACE;
   5967                         }
   5968                         M4OSA_TRACE1_1("M4xVSS_CloseCommand:\
   5969                                        M4xVSS_internalCloseEditedFile returned an error: 0x%x",
   5970                                         err);
   5971                         /* we are retaining error here and returning error  in the end of the
   5972                         function  as to aviod memory leak*/
   5973                         //return err;
   5974                     }
   5975                 }
   5976                 else if( xVSS_context->editingStep
   5977                     == M4xVSS_kMicroStateAudioMixing )
   5978                 {
   5979                     err = M4xVSS_internalCloseAudioMixedFile(xVSS_context);
   5980 
   5981                     if( err != M4NO_ERROR )
   5982                     {
   5983                         /* Fix for blrnxpsw#234---->*/
   5984                         if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) )
   5985                         {
   5986                             err = M4xVSSERR_NO_MORE_SPACE;
   5987                         }
   5988                         M4OSA_TRACE1_1("M4xVSS_CloseCommand: \
   5989                                 M4xVSS_internalCloseAudioMixedFile returned an error: 0x%x", err);
   5990                         /* we are retaining error here and returning error  in the end of
   5991                         the function  as to aviod memory leak*/
   5992                         //return err;
   5993                         /* <----Fix for blrnxpsw#234*/
   5994                     }
   5995                 }
   5996                 err = M4xVSS_internalFreeSaving(xVSS_context);
   5997                 /* We free this pointer only if a BGM track is present, because in that case,
   5998                 this pointer owns to us */
   5999                 if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL ) {
   6000                     /*if(M4OSA_NULL != xVSS_context->pSettings->pOutputFile)
   6001                     {
   6002                     free(xVSS_context->pSettings->pOutputFile);
   6003                     xVSS_context->pSettings->pOutputFile = M4OSA_NULL;
   6004                     }*/
   6005                     /*if(M4OSA_NULL != xVSS_context->pSettings->pTemporaryFile)
   6006                     {
   6007                     free(xVSS_context->pSettings->pTemporaryFile);
   6008                     xVSS_context->pSettings->pTemporaryFile = M4OSA_NULL;
   6009                     }*/
   6010                 }
   6011             }
   6012             break;
   6013 
   6014         case M4xVSS_kStateSaved:
   6015             break;
   6016 
   6017         case M4xVSS_kStateAnalyzing:
   6018             {
   6019                 if( xVSS_context->analyseStep == M4xVSS_kMicroStateConvertPto3GPP )
   6020                 {
   6021                     /* Free Pto3GPP module */
   6022                     err = M4xVSS_internalStopConvertPictureTo3gp(xVSS_context);
   6023                     /* Fix for blrnxpsw#234---->*/
   6024                     if( err != M4NO_ERROR )
   6025                     {
   6026                         if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) )
   6027                         {
   6028                             err = M4xVSSERR_NO_MORE_SPACE;
   6029                         }
   6030                         M4OSA_TRACE1_1("M4xVSS_Step: \
   6031                                        M4xVSS_internalStopConvertPictureTo3gp returned 0x%x", err);
   6032                         /* we are retaining error here and returning error  in the end of the
   6033                         function  as to aviod memory leak*/
   6034                         //return err;
   6035                     }
   6036                     /* <-----Fix for blrnxpsw#234>*/
   6037                 }
   6038                 else if( xVSS_context->analyseStep
   6039                     == M4xVSS_kMicroStateTranscodeMCS )
   6040                 {
   6041                     /* Free MCS module */
   6042                     err = M4MCS_abort(xVSS_context->pMCS_Ctxt);
   6043                     /* Fix for blrnxpsw#234---->*/
   6044                     if( err != M4NO_ERROR )
   6045                     {
   6046                         if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) )
   6047                         {
   6048                             err = M4xVSSERR_NO_MORE_SPACE;
   6049                         }
   6050                         M4OSA_TRACE1_1("M4xVSS_Step: M4MCS_abort returned 0x%x",
   6051                             err);
   6052                         /* we are retaining error here and returning error  in the end of the
   6053                         function  as to aviod memory leak*/
   6054                         //return err;
   6055                     }
   6056                     /* <---Fix for blrnxpsw#234*/
   6057                 }
   6058             }
   6059             break;
   6060 
   6061         default:
   6062             M4OSA_TRACE1_1(
   6063                 "Bad state when calling M4xVSS_CloseCommand function! State is %d",
   6064                 xVSS_context->m_state);
   6065             return M4ERR_STATE;
   6066     }
   6067 
   6068     /* Free Send command */
   6069     M4xVSS_freeCommand(xVSS_context);
   6070 
   6071     xVSS_context->m_state = M4xVSS_kStateInitialized; /* Change xVSS state */
   6072 
   6073     return err;
   6074 }
   6075 
   6076 /**
   6077  ******************************************************************************
   6078  * prototype    M4OSA_ERR M4xVSS_CleanUp(M4OSA_Context pContext)
   6079  * @brief        This function deletes all xVSS ressources
   6080  * @note        This function must be called after M4xVSS_CloseCommand.
   6081  *
   6082  * @param    pContext            (IN) Pointer on the xVSS edit context
   6083  * @return    M4NO_ERROR:            No error
   6084  * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
   6085  * @return    M4ERR_STATE:        This function cannot not be called at this time
   6086  ******************************************************************************
   6087  */
   6088 M4OSA_ERR M4xVSS_CleanUp( M4OSA_Context pContext )
   6089 {
   6090     M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
   6091     M4OSA_TRACE3_0("M4xVSS_CleanUp:entering");
   6092 
   6093     /* Check state */
   6094     if( xVSS_context->m_state != M4xVSS_kStateInitialized )
   6095     {
   6096         M4OSA_TRACE1_1(\
   6097             "Bad state when calling M4xVSS_CleanUp function! State is %d",\
   6098             xVSS_context->m_state);
   6099         return M4ERR_STATE;
   6100     }
   6101 
   6102     /**
   6103     * UTF conversion: free temporary buffer*/
   6104     if( xVSS_context->UTFConversionContext.pTempOutConversionBuffer
   6105         != M4OSA_NULL )
   6106     {
   6107         free(xVSS_context->
   6108             UTFConversionContext.pTempOutConversionBuffer);
   6109         xVSS_context->UTFConversionContext.pTempOutConversionBuffer =
   6110             M4OSA_NULL;
   6111     }
   6112 
   6113     free(xVSS_context->pTempPath);
   6114     xVSS_context->pTempPath = M4OSA_NULL;
   6115 
   6116     free(xVSS_context->pSettings);
   6117     xVSS_context->pSettings = M4OSA_NULL;
   6118 
   6119     free(xVSS_context);
   6120     xVSS_context = M4OSA_NULL;
   6121     M4OSA_TRACE3_0("M4xVSS_CleanUp:leaving ");
   6122 
   6123     return M4NO_ERROR;
   6124 }
   6125 
   6126 /**
   6127  ******************************************************************************
   6128  * prototype    M4xVSS_GetVersion(M4_VersionInfo *pVersion)
   6129  * @brief        This function get the version of the Video Studio 2.1
   6130  *
   6131  * @param    pVersion            (IN) Pointer on the version info struct
   6132  * @return    M4NO_ERROR:            No error
   6133  * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
   6134  ******************************************************************************
   6135  */
   6136 M4OSA_ERR M4xVSS_GetVersion( M4_VersionInfo *pVersion )
   6137 {
   6138     /* Just used for a grep in code */
   6139     /* CHANGE_VERSION_HERE */
   6140     static const M4OSA_Char cVersion[26] = "NXPSW_VideoStudio21_1_3_0";
   6141 
   6142     if( M4OSA_NULL == pVersion )
   6143     {
   6144         return M4ERR_PARAMETER;
   6145     }
   6146 
   6147     pVersion->m_major = M4_xVSS_MAJOR;
   6148     pVersion->m_minor = M4_xVSS_MINOR;
   6149     pVersion->m_revision = M4_xVSS_REVISION;
   6150     pVersion->m_structSize = sizeof(M4_VersionInfo);
   6151 
   6152     return M4NO_ERROR;
   6153 }
   6154 
   6155 /**
   6156  ******************************************************************************
   6157  * M4OSA_ERR M4xVSS_CreateClipSettings()
   6158  * @brief    Allows filling a clip settings structure with default values
   6159  *
   6160  * @note    WARNING: pClipSettings->Effects[ ] will be allocated in this function.
   6161  *                   pClipSettings->pFile      will be allocated in this function.
   6162  *
   6163  * @param    pClipSettings        (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
   6164  * @param   pFile               (IN) Clip file name
   6165  * @param   filePathSize        (IN) Size of the clip path (needed for the UTF16 conversion)
   6166  * @param    nbEffects           (IN) Nb of effect settings to allocate
   6167  * @return    M4NO_ERROR:            No error
   6168  * @return    M4ERR_PARAMETER:    pClipSettings is M4OSA_NULL (debug only)
   6169  ******************************************************************************
   6170  */
   6171 M4OSA_ERR M4xVSS_CreateClipSettings( M4VSS3GPP_ClipSettings *pClipSettings,
   6172                                     M4OSA_Void *pFile, M4OSA_UInt32 filePathSize,
   6173                                      M4OSA_UInt8 nbEffects )
   6174 {
   6175     M4OSA_ERR err = M4NO_ERROR;
   6176 
   6177     M4OSA_TRACE3_1("M4xVSS_CreateClipSettings called with pClipSettings=0x%p",
   6178         pClipSettings);
   6179 
   6180     /**
   6181     *    Check input parameter */
   6182     M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettings), M4ERR_PARAMETER,
   6183         "M4xVSS_CreateClipSettings: pClipSettings is NULL");
   6184 
   6185     /* Create inherited VSS3GPP stuff */
   6186     /*err = M4VSS3GPP_editCreateClipSettings(pClipSettings, pFile,nbEffects);*/
   6187     /*FB: add clip path size (needed for UTF 16 conversion)*/
   6188     err = M4VSS3GPP_editCreateClipSettings(pClipSettings, pFile, filePathSize,
   6189         nbEffects);
   6190 
   6191     if( M4NO_ERROR != err )
   6192     {
   6193         M4OSA_TRACE1_1("M4xVSS_CreateClipSettings :\
   6194                        ERROR in M4VSS3GPP_editCreateClipSettings = 0x%x", err);
   6195         return err;
   6196     }
   6197 
   6198     /* Set the clip settings to default */
   6199     pClipSettings->xVSS.uiBeginCutPercent = 0;
   6200     pClipSettings->xVSS.uiEndCutPercent = 0;
   6201     pClipSettings->xVSS.uiDuration = 0;
   6202     pClipSettings->xVSS.isPanZoom = M4OSA_FALSE;
   6203     pClipSettings->xVSS.PanZoomTopleftXa = 0;
   6204     pClipSettings->xVSS.PanZoomTopleftYa = 0;
   6205     pClipSettings->xVSS.PanZoomTopleftXb = 0;
   6206     pClipSettings->xVSS.PanZoomTopleftYb = 0;
   6207     pClipSettings->xVSS.PanZoomXa = 0;
   6208     pClipSettings->xVSS.PanZoomXb = 0;
   6209 
   6210     /**
   6211     * Return with no error */
   6212     M4OSA_TRACE3_0("M4xVSS_CreateClipSettings(): returning M4NO_ERROR");
   6213 
   6214     return M4NO_ERROR;
   6215 }
   6216 
   6217 /**
   6218  ******************************************************************************
   6219  * M4OSA_ERR M4xVSS_DuplicateClipSettings()
   6220  * @brief    Duplicates a clip settings structure, performing allocations if required
   6221  *
   6222  * @param    pClipSettingsDest    (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
   6223  * @param    pClipSettingsOrig    (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
   6224  * @param   bCopyEffects        (IN) Flag to know if we have to duplicate effects
   6225  * @return    M4NO_ERROR:            No error
   6226  * @return    M4ERR_PARAMETER:    pClipSettings is M4OSA_NULL (debug only)
   6227  ******************************************************************************
   6228  */
   6229 M4OSA_ERR M4xVSS_DuplicateClipSettings( M4VSS3GPP_ClipSettings
   6230                                        *pClipSettingsDest,
   6231                                        M4VSS3GPP_ClipSettings *pClipSettingsOrig,
   6232                                         M4OSA_Bool bCopyEffects )
   6233 {
   6234     M4OSA_ERR err = M4NO_ERROR;
   6235 
   6236     M4OSA_TRACE3_2(
   6237         "M4xVSS_DuplicateClipSettings called with dest=0x%p src=0x%p",
   6238         pClipSettingsDest, pClipSettingsOrig);
   6239 
   6240     /* Check input parameter */
   6241     M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettingsDest), M4ERR_PARAMETER,
   6242         "M4xVSS_DuplicateClipSettings: pClipSettingsDest is NULL");
   6243     M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettingsOrig), M4ERR_PARAMETER,
   6244         "M4xVSS_DuplicateClipSettings: pClipSettingsOrig is NULL");
   6245 
   6246     /* Call inherited VSS3GPP duplication */
   6247     err = M4VSS3GPP_editDuplicateClipSettings(pClipSettingsDest,
   6248         pClipSettingsOrig, bCopyEffects);
   6249 
   6250     if( M4NO_ERROR != err )
   6251     {
   6252         M4OSA_TRACE1_1("M4xVSS_CreateClipSettings :\
   6253                        ERROR in M4VSS3GPP_editDuplicateClipSettings = 0x%x", err);
   6254         return err;
   6255     }
   6256 
   6257     /* Return with no error */
   6258     M4OSA_TRACE3_0("M4xVSS_DuplicateClipSettings(): returning M4NO_ERROR");
   6259 
   6260     return M4NO_ERROR;
   6261 }
   6262 
   6263 /**
   6264  ******************************************************************************
   6265  * M4OSA_ERR M4xVSS_FreeClipSettings()
   6266  * @brief    Free the pointers allocated in the ClipSetting structure (pFile, Effects, ...).
   6267  *
   6268  * @param    pClipSettings        (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
   6269  * @return    M4NO_ERROR:            No error
   6270  * @return    M4ERR_PARAMETER:    pClipSettings is M4OSA_NULL (debug only)
   6271  ******************************************************************************
   6272  */
   6273 M4OSA_ERR M4xVSS_FreeClipSettings( M4VSS3GPP_ClipSettings *pClipSettings )
   6274 {
   6275     /**
   6276     *    Check input parameter */
   6277     M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettings), M4ERR_PARAMETER,
   6278         "M4xVSS_FreeClipSettings: pClipSettings is NULL");
   6279 
   6280     /* Free inherited VSS3GPP stuff */
   6281     M4VSS3GPP_editFreeClipSettings(pClipSettings);
   6282 
   6283     return M4NO_ERROR;
   6284 }
   6285 
   6286 /**
   6287  ******************************************************************************
   6288  * prototype    M4OSA_ERR M4xVSS_getMCSContext(M4OSA_Context pContext, M4OSA_Context* mcsContext)
   6289  * @brief        This function returns the MCS context within the xVSS internal context
   6290  * @note        This function must be called only after VSS state has moved to analyzing state or
   6291  * beyond
   6292  *
   6293  * @param    pContext            (IN) Pointer on the xVSS edit context
   6294  * @param    mcsContext        (OUT) Pointer to pointer of mcs context to return
   6295  * @return    M4NO_ERROR:        No error
   6296  * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
   6297  * @return    M4ERR_STATE:        This function cannot not be called at this time
   6298  ******************************************************************************
   6299  */
   6300 M4OSA_ERR M4xVSS_getMCSContext( M4OSA_Context pContext,
   6301                                M4OSA_Context *mcsContext )
   6302 {
   6303     M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
   6304     M4OSA_ERR err = M4NO_ERROR;
   6305 
   6306     /**
   6307     *    Check input parameter */
   6308     M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
   6309         "M4xVSS_getMCSContext: pContext is NULL");
   6310 
   6311     if( xVSS_context->m_state == M4xVSS_kStateInitialized )
   6312     {
   6313         M4OSA_TRACE1_1("M4xVSS_getMCSContext: Bad state! State is %d",\
   6314             xVSS_context->m_state);
   6315         return M4ERR_STATE;
   6316     }
   6317 
   6318     *mcsContext = xVSS_context->pMCS_Ctxt;
   6319 
   6320     return err;
   6321 }
   6322 
   6323 /**
   6324  ******************************************************************************
   6325  * prototype    M4OSA_ERR M4xVSS_getVSS3GPPContext(M4OSA_Context pContext,
   6326  *                                                   M4OSA_Context* mcsContext)
   6327  * @brief        This function returns the VSS3GPP context within the xVSS internal context
   6328  * @note        This function must be called only after VSS state has moved to Generating preview
   6329  *              or beyond
   6330  * @param    pContext            (IN) Pointer on the xVSS edit context
   6331  * @param    vss3gppContext        (OUT) Pointer to pointer of vss3gpp context to return
   6332  * @return    M4NO_ERROR:        No error
   6333  * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
   6334  * @return    M4ERR_STATE:        This function cannot not be called at this time
   6335  ******************************************************************************
   6336  */
   6337 M4OSA_ERR M4xVSS_getVSS3GPPContext( M4OSA_Context pContext,
   6338                                    M4OSA_Context *vss3gppContext )
   6339 {
   6340     M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext;
   6341     M4OSA_ERR err = M4NO_ERROR;
   6342 
   6343     /**
   6344     *    Check input parameter */
   6345     M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
   6346         "M4xVSS_getVSS3GPPContext: pContext is NULL");
   6347 
   6348     if( xVSS_context->m_state < M4xVSS_kStateSaving )
   6349     {
   6350         M4OSA_TRACE1_1("M4xVSS_getVSS3GPPContext: Bad state! State is %d",\
   6351             xVSS_context->m_state);
   6352         return M4ERR_STATE;
   6353     }
   6354 
   6355     *vss3gppContext = xVSS_context->pCurrentEditContext;
   6356 
   6357     return err;
   6358 }
   6359 
   6360 M4OSA_ERR M4xVSS_getVideoDecoderCapabilities(M4DECODER_VideoDecoders **decoders) {
   6361     M4OSA_ERR err = M4NO_ERROR;
   6362 
   6363     // Call the decoder api directly
   6364     // to get all the video decoder capablities.
   6365     err = VideoEditorVideoDecoder_getVideoDecodersAndCapabilities(decoders);
   6366     return err;
   6367 }
   6368