Make line-ending consistent (unix style).

Change-Id: Id837b042952ff5d97907591f337b2222cff2c8a9
diff --git a/libvideoeditor/lvpp/VideoEditorPreviewController.cpp b/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
index 09b9bfb..ee1dc60 100755
--- a/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
+++ b/libvideoeditor/lvpp/VideoEditorPreviewController.cpp
@@ -1,1509 +1,1509 @@
-/*

- * Copyright (C) 2011 The Android Open Source Project

- *

- * Licensed under the Apache License, Version 2.0 (the "License");

- * you may not use this file except in compliance with the License.

- * You may obtain a copy of the License at

- *

- *      http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing, software

- * distributed under the License is distributed on an "AS IS" BASIS,

- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- * See the License for the specific language governing permissions and

- * limitations under the License.

- */

-

-#define LOG_NDEBUG 1

-#define LOG_TAG "VideoEditorPreviewController"

-#include "VideoEditorPreviewController.h"

-

-namespace android {

-

-#define PREVIEW_THREAD_STACK_SIZE                           (65536)

-

-VideoEditorPreviewController::VideoEditorPreviewController()

-    : mCurrentPlayer(0),

-      mThreadContext(NULL),

-      mPlayerState(VePlayerIdle),

-      mPrepareReqest(M4OSA_FALSE),

-      mClipList(NULL),

-      mNumberClipsInStoryBoard(0),

-      mNumberClipsToPreview(0),

-      mStartingClipIndex(0),

-      mPreviewLooping(M4OSA_FALSE),

-      mCallBackAfterFrameCnt(0),

-      mEffectsSettings(NULL),

-      mNumberEffects(0),

-      mCurrentClipNumber(-1),

-      mClipTotalDuration(0),

-      mCurrentVideoEffect(VIDEO_EFFECT_NONE),

-      mBackgroundAudioSetting(NULL),

-      mAudioMixPCMFileHandle(NULL),

-      mTarget(NULL),

-      mJniCookie(NULL),

-      mJniCallback(NULL),

-      mCurrentPlayedDuration(0),

-      mCurrentClipDuration(0),

-      mVideoStoryBoardTimeMsUptoFirstPreviewClip(0),

-      mOverlayState(OVERLAY_CLEAR),

-      mActivePlayerIndex(0),

-      mOutputVideoWidth(0),

-      mOutputVideoHeight(0),

-      bStopThreadInProgress(false),

-      mSemThreadWait(NULL) {

-    LOGV("VideoEditorPreviewController");

-    mRenderingMode = M4xVSS_kBlackBorders;

-    mIsFiftiesEffectStarted = false;

-

-    for (int i=0; i<NBPLAYER_INSTANCES; i++) {

-        mVePlayer[i] = NULL;

-    }

-}

-

-VideoEditorPreviewController::~VideoEditorPreviewController() {

-    M4OSA_UInt32 i = 0;

-    M4OSA_ERR err = M4NO_ERROR;

-    LOGV("~VideoEditorPreviewController");

-

-    // Stop the thread if its still running

-    if(mThreadContext != NULL) {

-        err = M4OSA_threadSyncStop(mThreadContext);

-        if(err != M4NO_ERROR) {

-            LOGV("~VideoEditorPreviewController: error 0x%x \

-            in trying to stop thread", err);

-            // Continue even if error

-        }

-

-        err = M4OSA_threadSyncClose(mThreadContext);

-        if(err != M4NO_ERROR) {

-            LOGE("~VideoEditorPreviewController: error 0x%x \

-            in trying to close thread", (unsigned int) err);

-            // Continue even if error

-        }

-

-        mThreadContext = NULL;

-    }

-

-    for (int playerInst=0; playerInst<NBPLAYER_INSTANCES;

-         playerInst++) {

-        if(mVePlayer[playerInst] != NULL) {

-            LOGV("clearing mVePlayer %d", playerInst);

-            mVePlayer[playerInst].clear();

-        }

-    }

-

-    if(mClipList != NULL) {

-        // Clean up

-        for(i=0;i<mNumberClipsInStoryBoard;i++)

-        {

-            if(mClipList[i]->pFile != NULL) {

-                free(mClipList[i]->pFile);

-                mClipList[i]->pFile = NULL;

-            }

-

-            free(mClipList[i]);

-        }

-        free(mClipList);

-        mClipList = NULL;

-    }

-

-    if(mEffectsSettings) {

-        for(i=0;i<mNumberEffects;i++) {

-            if(mEffectsSettings[i].xVSS.pFramingBuffer != NULL) {

-                free(mEffectsSettings[i].xVSS.pFramingBuffer->pac_data);

-

-                free(mEffectsSettings[i].xVSS.pFramingBuffer);

-

-                mEffectsSettings[i].xVSS.pFramingBuffer = NULL;

-            }

-        }

-        free(mEffectsSettings);

-        mEffectsSettings = NULL;

-    }

-

-    if (mAudioMixPCMFileHandle) {

-        err = M4OSA_fileReadClose (mAudioMixPCMFileHandle);

-        mAudioMixPCMFileHandle = M4OSA_NULL;

-    }

-

-    if (mBackgroundAudioSetting != NULL) {

-        free(mBackgroundAudioSetting);

-        mBackgroundAudioSetting = NULL;

-    }

-

-    if(mTarget != NULL) {

-        delete mTarget;

-        mTarget = NULL;

-    }

-

-    mOverlayState = OVERLAY_CLEAR;

-

-    LOGV("~VideoEditorPreviewController returns");

-}

-

-M4OSA_ERR VideoEditorPreviewController::loadEditSettings(

-    M4VSS3GPP_EditSettings* pSettings,M4xVSS_AudioMixingSettings* bgmSettings) {

-

-    M4OSA_UInt32 i = 0, iClipDuration = 0, rgbSize = 0;

-    M4VIFI_UInt8 *tmp = NULL;

-    M4OSA_ERR err = M4NO_ERROR;

-

-    LOGV("loadEditSettings");

-    LOGV("loadEditSettings Channels = %d, sampling Freq %d",

-          bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency  );

-          bgmSettings->uiSamplingFrequency = 32000;

-

-    LOGV("loadEditSettings Channels = %d, sampling Freq %d",

-          bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency  );

-    Mutex::Autolock autoLock(mLock);

-

-    // Clean up any previous Edit settings before loading new ones

-    mCurrentVideoEffect = VIDEO_EFFECT_NONE;

-

-    if(mAudioMixPCMFileHandle) {

-        err = M4OSA_fileReadClose (mAudioMixPCMFileHandle);

-        mAudioMixPCMFileHandle = M4OSA_NULL;

-    }

-

-    if(mBackgroundAudioSetting != NULL) {

-        free(mBackgroundAudioSetting);

-        mBackgroundAudioSetting = NULL;

-    }

-

-    if(mClipList != NULL) {

-        // Clean up

-        for(i=0;i<mNumberClipsInStoryBoard;i++)

-        {

-            if(mClipList[i]->pFile != NULL) {

-                free(mClipList[i]->pFile);

-                mClipList[i]->pFile = NULL;

-            }

-

-            free(mClipList[i]);

-        }

-        free(mClipList);

-        mClipList = NULL;

-    }

-

-    if(mEffectsSettings) {

-        for(i=0;i<mNumberEffects;i++) {

-            if(mEffectsSettings[i].xVSS.pFramingBuffer != NULL) {

-                free(mEffectsSettings[i].xVSS.pFramingBuffer->pac_data);

-

-                free(mEffectsSettings[i].xVSS.pFramingBuffer);

-

-                mEffectsSettings[i].xVSS.pFramingBuffer = NULL;

-            }

-        }

-        free(mEffectsSettings);

-        mEffectsSettings = NULL;

-    }

-

-    if(mClipList == NULL) {

-        mNumberClipsInStoryBoard = pSettings->uiClipNumber;

-        LOGV("loadEditSettings: # of Clips = %d", mNumberClipsInStoryBoard);

-

-        mClipList = (M4VSS3GPP_ClipSettings**)M4OSA_32bitAlignedMalloc(

-         sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber, M4VS,

-         (M4OSA_Char*)"LvPP, copy of pClipList");

-

-        if(NULL == mClipList) {

-            LOGE("loadEditSettings: Malloc error");

-            return M4ERR_ALLOC;

-        }

-        memset((void *)mClipList,0,

-         sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber);

-

-        for(i=0;i<pSettings->uiClipNumber;i++) {

-

-            // Allocate current clip

-            mClipList[i] =

-             (M4VSS3GPP_ClipSettings*)M4OSA_32bitAlignedMalloc(

-              sizeof(M4VSS3GPP_ClipSettings),M4VS,(M4OSA_Char*)"clip settings");

-

-            if(mClipList[i] == NULL) {

-

-                LOGE("loadEditSettings: Allocation error for mClipList[%d]", (int)i);

-                return M4ERR_ALLOC;

-            }

-            // Copy plain structure

-            memcpy((void *)mClipList[i],

-             (void *)pSettings->pClipList[i],

-             sizeof(M4VSS3GPP_ClipSettings));

-

-            if(NULL != pSettings->pClipList[i]->pFile) {

-                mClipList[i]->pFile = (M4OSA_Char*)M4OSA_32bitAlignedMalloc(

-                pSettings->pClipList[i]->filePathSize, M4VS,

-                (M4OSA_Char*)"pClipSettingsDest->pFile");

-

-                if(NULL == mClipList[i]->pFile)

-                {

-                    LOGE("loadEditSettings : ERROR allocating filename");

-                    return M4ERR_ALLOC;

-                }

-

-                memcpy((void *)mClipList[i]->pFile,

-                 (void *)pSettings->pClipList[i]->pFile,

-                 pSettings->pClipList[i]->filePathSize);

-            }

-            else {

-                LOGE("NULL file path");

-                return M4ERR_PARAMETER;

-            }

-

-            // Calculate total duration of all clips

-            iClipDuration = pSettings->pClipList[i]->uiEndCutTime -

-             pSettings->pClipList[i]->uiBeginCutTime;

-

-            mClipTotalDuration = mClipTotalDuration+iClipDuration;

-        }

-    }

-

-    if(mEffectsSettings == NULL) {

-        mNumberEffects = pSettings->nbEffects;

-        LOGV("loadEditSettings: mNumberEffects = %d", mNumberEffects);

-

-        if(mNumberEffects != 0) {

-            mEffectsSettings = (M4VSS3GPP_EffectSettings*)M4OSA_32bitAlignedMalloc(

-             mNumberEffects*sizeof(M4VSS3GPP_EffectSettings),

-             M4VS, (M4OSA_Char*)"effects settings");

-

-            if(mEffectsSettings == NULL) {

-                LOGE("loadEffectsSettings: Allocation error");

-                return M4ERR_ALLOC;

-            }

-

-            memset((void *)mEffectsSettings,0,

-             mNumberEffects*sizeof(M4VSS3GPP_EffectSettings));

-

-            for(i=0;i<mNumberEffects;i++) {

-

-                mEffectsSettings[i].xVSS.pFramingFilePath = NULL;

-                mEffectsSettings[i].xVSS.pFramingBuffer = NULL;

-                mEffectsSettings[i].xVSS.pTextBuffer = NULL;

-

-                memcpy((void *)&(mEffectsSettings[i]),

-                 (void *)&(pSettings->Effects[i]),

-                 sizeof(M4VSS3GPP_EffectSettings));

-

-                if(pSettings->Effects[i].VideoEffectType ==

-                 (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) {

-                    // Allocate the pFraming RGB buffer

-                    mEffectsSettings[i].xVSS.pFramingBuffer =

-                    (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(sizeof(M4VIFI_ImagePlane),

-                     M4VS, (M4OSA_Char*)"lvpp framing buffer");

-

-                    if(mEffectsSettings[i].xVSS.pFramingBuffer == NULL) {

-                        LOGE("loadEffectsSettings:Alloc error for pFramingBuf");

-                        free(mEffectsSettings);

-                        mEffectsSettings = NULL;

-                        return M4ERR_ALLOC;

-                    }

-

-                    // Allocate the pac_data (RGB)

-                    if(pSettings->Effects[i].xVSS.rgbType == M4VSS3GPP_kRGB565){

-                        rgbSize =

-                         pSettings->Effects[i].xVSS.pFramingBuffer->u_width *

-                         pSettings->Effects[i].xVSS.pFramingBuffer->u_height*2;

-                    }

-                    else if(

-                     pSettings->Effects[i].xVSS.rgbType == M4VSS3GPP_kRGB888) {

-                        rgbSize =

-                         pSettings->Effects[i].xVSS.pFramingBuffer->u_width *

-                         pSettings->Effects[i].xVSS.pFramingBuffer->u_height*3;

-                    }

-                    else {

-                        LOGE("loadEffectsSettings: wrong RGB type");

-                        free(mEffectsSettings);

-                        mEffectsSettings = NULL;

-                        return M4ERR_PARAMETER;

-                    }

-

-                    tmp = (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(rgbSize, M4VS,

-                     (M4OSA_Char*)"framing buffer pac_data");

-

-                    if(tmp == NULL) {

-                        LOGE("loadEffectsSettings:Alloc error pFramingBuf pac");

-                        free(mEffectsSettings);

-                        mEffectsSettings = NULL;

-                        free(mEffectsSettings[i].xVSS.pFramingBuffer);

-

-                        mEffectsSettings[i].xVSS.pFramingBuffer = NULL;

-                        return M4ERR_ALLOC;

-                    }

-                    /* Initialize the pFramingBuffer*/

-                    mEffectsSettings[i].xVSS.pFramingBuffer->pac_data = tmp;

-                    mEffectsSettings[i].xVSS.pFramingBuffer->u_height =

-                     pSettings->Effects[i].xVSS.pFramingBuffer->u_height;

-

-                    mEffectsSettings[i].xVSS.pFramingBuffer->u_width =

-                     pSettings->Effects[i].xVSS.pFramingBuffer->u_width;

-

-                    mEffectsSettings[i].xVSS.pFramingBuffer->u_stride =

-                     pSettings->Effects[i].xVSS.pFramingBuffer->u_stride;

-

-                    mEffectsSettings[i].xVSS.pFramingBuffer->u_topleft =

-                     pSettings->Effects[i].xVSS.pFramingBuffer->u_topleft;

-

-                    mEffectsSettings[i].xVSS.uialphaBlendingStart =

-                     pSettings->Effects[i].xVSS.uialphaBlendingStart;

-

-                    mEffectsSettings[i].xVSS.uialphaBlendingMiddle =

-                     pSettings->Effects[i].xVSS.uialphaBlendingMiddle;

-

-                    mEffectsSettings[i].xVSS.uialphaBlendingEnd =

-                     pSettings->Effects[i].xVSS.uialphaBlendingEnd;

-

-                    mEffectsSettings[i].xVSS.uialphaBlendingFadeInTime =

-                     pSettings->Effects[i].xVSS.uialphaBlendingFadeInTime;

-                    mEffectsSettings[i].xVSS.uialphaBlendingFadeOutTime =

-                     pSettings->Effects[i].xVSS.uialphaBlendingFadeOutTime;

-

-                    // Copy the pFraming data

-                    memcpy((void *)

-                    mEffectsSettings[i].xVSS.pFramingBuffer->pac_data,

-                    (void *)pSettings->Effects[i].xVSS.pFramingBuffer->pac_data,

-                    rgbSize);

-

-                    mEffectsSettings[i].xVSS.rgbType =

-                     pSettings->Effects[i].xVSS.rgbType;

-                }

-            }

-        }

-    }

-

-    if (mBackgroundAudioSetting == NULL) {

-

-        mBackgroundAudioSetting = (M4xVSS_AudioMixingSettings*)M4OSA_32bitAlignedMalloc(

-        sizeof(M4xVSS_AudioMixingSettings), M4VS,

-        (M4OSA_Char*)"LvPP, copy of bgmSettings");

-

-        if(NULL == mBackgroundAudioSetting) {

-            LOGE("loadEditSettings: mBackgroundAudioSetting Malloc failed");

-            return M4ERR_ALLOC;

-        }

-

-        memset((void *)mBackgroundAudioSetting, 0,sizeof(M4xVSS_AudioMixingSettings*));

-        memcpy((void *)mBackgroundAudioSetting, (void *)bgmSettings, sizeof(M4xVSS_AudioMixingSettings));

-

-        if ( mBackgroundAudioSetting->pFile != M4OSA_NULL ) {

-

-            mBackgroundAudioSetting->pFile = (M4OSA_Void*) bgmSettings->pPCMFilePath;

-            mBackgroundAudioSetting->uiNbChannels = 2;

-            mBackgroundAudioSetting->uiSamplingFrequency = 32000;

-        }

-

-        // Open the BG file

-        if ( mBackgroundAudioSetting->pFile != M4OSA_NULL ) {

-            err = M4OSA_fileReadOpen(&mAudioMixPCMFileHandle,

-             mBackgroundAudioSetting->pFile, M4OSA_kFileRead);

-

-            if (err != M4NO_ERROR) {

-                LOGE("loadEditSettings: mBackgroundAudio PCM File open failed");

-                return M4ERR_PARAMETER;

-            }

-        }

-    }

-

-    mOutputVideoSize = pSettings->xVSS.outputVideoSize;

-    mFrameStr.pBuffer = M4OSA_NULL;

-    return M4NO_ERROR;

-}

-

-M4OSA_ERR VideoEditorPreviewController::setSurface(const sp<Surface> &surface) {

-    LOGV("setSurface");

-    Mutex::Autolock autoLock(mLock);

-

-    mSurface = surface;

-    return M4NO_ERROR;

-}

-

-M4OSA_ERR VideoEditorPreviewController::startPreview(

-    M4OSA_UInt32 fromMS, M4OSA_Int32 toMs, M4OSA_UInt16 callBackAfterFrameCount,

-    M4OSA_Bool loop) {

-

-    M4OSA_ERR err = M4NO_ERROR;

-    M4OSA_UInt32 i = 0, iIncrementedDuration = 0;

-    LOGV("startPreview");

-

-    if(fromMS > (M4OSA_UInt32)toMs) {

-        LOGE("startPreview: fromMS > toMs");

-        return M4ERR_PARAMETER;

-    }

-

-    if(toMs == 0) {

-        LOGE("startPreview: toMs is 0");

-        return M4ERR_PARAMETER;

-    }

-

-    // If already started, then stop preview first

-    for(int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {

-        if(mVePlayer[playerInst] != NULL) {

-            LOGV("startPreview: stopping previously started preview playback");

-            stopPreview();

-            break;

-        }

-    }

-

-    // If renderPreview was called previously, then delete Renderer object first

-    if(mTarget != NULL) {

-        LOGV("startPreview: delete previous PreviewRenderer");

-        delete mTarget;

-        mTarget = NULL;

-    }

-

-    // Create Audio player to be used for entire

-    // storyboard duration

-    mVEAudioSink = new VideoEditorPlayer::VeAudioOutput();

-    mVEAudioPlayer = new VideoEditorAudioPlayer(mVEAudioSink);

-    mVEAudioPlayer->setAudioMixSettings(mBackgroundAudioSetting);

-    mVEAudioPlayer->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle);

-

-    LOGV("startPreview: loop = %d", loop);

-    mPreviewLooping = loop;

-

-    LOGV("startPreview: callBackAfterFrameCount = %d", callBackAfterFrameCount);

-    mCallBackAfterFrameCnt = callBackAfterFrameCount;

-

-    for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {

-        mVePlayer[playerInst] = new VideoEditorPlayer();

-        if(mVePlayer[playerInst] == NULL) {

-            LOGE("startPreview:Error creating VideoEditorPlayer %d",playerInst);

-            return M4ERR_ALLOC;

-        }

-        LOGV("startPreview: object created");

-

-        mVePlayer[playerInst]->setNotifyCallback(this,(notify_callback_f)notify);

-        LOGV("startPreview: notify callback set");

-

-        mVePlayer[playerInst]->loadEffectsSettings(mEffectsSettings,

-         mNumberEffects);

-        LOGV("startPreview: effects settings loaded");

-

-        mVePlayer[playerInst]->loadAudioMixSettings(mBackgroundAudioSetting);

-        LOGV("startPreview: AudioMixSettings settings loaded");

-

-        mVePlayer[playerInst]->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle);

-        LOGV("startPreview: AudioMixPCMFileHandle set");

-

-        mVePlayer[playerInst]->setProgressCallbackInterval(

-         mCallBackAfterFrameCnt);

-        LOGV("startPreview: setProgressCallBackInterval");

-    }

-

-    mPlayerState = VePlayerIdle;

-    mPrepareReqest = M4OSA_FALSE;

-

-    if(fromMS == 0) {

-        mCurrentClipNumber = -1;

-        // Save original value

-        mFirstPreviewClipBeginTime = mClipList[0]->uiBeginCutTime;

-        mVideoStoryBoardTimeMsUptoFirstPreviewClip = 0;

-    }

-    else {

-        LOGV("startPreview: fromMS=%d", fromMS);

-        if(fromMS >= mClipTotalDuration) {

-            LOGE("startPreview: fromMS >= mClipTotalDuration");

-            return M4ERR_PARAMETER;

-        }

-        for(i=0;i<mNumberClipsInStoryBoard;i++) {

-            if(fromMS < (iIncrementedDuration + (mClipList[i]->uiEndCutTime -

-             mClipList[i]->uiBeginCutTime))) {

-                // Set to 1 index below,

-                // as threadProcess first increments the clip index

-                // and then processes clip in thread loop

-                mCurrentClipNumber = i-1;

-                LOGV("startPreview:mCurrentClipNumber = %d fromMS=%d",i,fromMS);

-

-                // Save original value

-                mFirstPreviewClipBeginTime = mClipList[i]->uiBeginCutTime;

-

-                // Set correct begin time to start playback

-                if((fromMS+mClipList[i]->uiBeginCutTime) >

-                (iIncrementedDuration+mClipList[i]->uiBeginCutTime)) {

-

-                    mClipList[i]->uiBeginCutTime =

-                     mClipList[i]->uiBeginCutTime +

-                     (fromMS - iIncrementedDuration);

-                }

-                break;

-            }

-            else {

-                iIncrementedDuration = iIncrementedDuration +

-                 (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime);

-            }

-        }

-        mVideoStoryBoardTimeMsUptoFirstPreviewClip = iIncrementedDuration;

-    }

-

-    for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {

-        mVePlayer[playerInst]->setAudioMixStoryBoardParam(fromMS,

-         mFirstPreviewClipBeginTime,

-         mClipList[i]->ClipProperties.uiClipAudioVolumePercentage);

-

-        LOGV("startPreview:setAudioMixStoryBoardSkimTimeStamp set %d cuttime \

-         %d", fromMS, mFirstPreviewClipBeginTime);

-    }

-

-    mStartingClipIndex = mCurrentClipNumber+1;

-

-    // Start playing with player instance 0

-    mCurrentPlayer = 0;

-    mActivePlayerIndex = 0;

-

-    if(toMs == -1) {

-        LOGV("startPreview: Preview till end of storyboard");

-        mNumberClipsToPreview = mNumberClipsInStoryBoard;

-        // Save original value

-        mLastPreviewClipEndTime =

-         mClipList[mNumberClipsToPreview-1]->uiEndCutTime;

-    }

-    else {

-        LOGV("startPreview: toMs=%d", toMs);

-        if((M4OSA_UInt32)toMs > mClipTotalDuration) {

-            LOGE("startPreview: toMs > mClipTotalDuration");

-            return M4ERR_PARAMETER;

-        }

-

-        iIncrementedDuration = 0;

-

-        for(i=0;i<mNumberClipsInStoryBoard;i++) {

-            if((M4OSA_UInt32)toMs <= (iIncrementedDuration +

-             (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime))) {

-                // Save original value

-                mLastPreviewClipEndTime = mClipList[i]->uiEndCutTime;

-                // Set the end cut time of clip index i to toMs

-                mClipList[i]->uiEndCutTime = toMs;

-

-                // Number of clips to be previewed is from index 0 to i

-                // increment by 1 as i starts from 0

-                mNumberClipsToPreview = i+1;

-                break;

-            }

-            else {

-                iIncrementedDuration = iIncrementedDuration +

-                 (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime);

-            }

-        }

-    }

-

-    // Open the thread semaphore

-    M4OSA_semaphoreOpen(&mSemThreadWait, 1);

-

-    // Open the preview process thread

-    err = M4OSA_threadSyncOpen(&mThreadContext, (M4OSA_ThreadDoIt)threadProc);

-    if (M4NO_ERROR != err) {

-        LOGE("VideoEditorPreviewController:M4OSA_threadSyncOpen error %d", (int) err);

-        return err;

-    }

-

-    // Set the stacksize

-    err = M4OSA_threadSyncSetOption(mThreadContext, M4OSA_ThreadStackSize,

-     (M4OSA_DataOption)PREVIEW_THREAD_STACK_SIZE);

-

-    if (M4NO_ERROR != err) {

-        LOGE("VideoEditorPreviewController: threadSyncSetOption error %d", (int) err);

-        M4OSA_threadSyncClose(mThreadContext);

-        mThreadContext = NULL;

-        return err;

-    }

-

-     // Start the thread

-     err = M4OSA_threadSyncStart(mThreadContext, (M4OSA_Void*)this);

-     if (M4NO_ERROR != err) {

-        LOGE("VideoEditorPreviewController: threadSyncStart error %d", (int) err);

-        M4OSA_threadSyncClose(mThreadContext);

-        mThreadContext = NULL;

-        return err;

-    }

-    bStopThreadInProgress = false;

-

-    LOGV("startPreview: process thread started");

-    return M4NO_ERROR;

-}

-

-M4OSA_UInt32 VideoEditorPreviewController::stopPreview() {

-    M4OSA_ERR err = M4NO_ERROR;

-    uint32_t lastRenderedFrameTimeMs = 0;

-    LOGV("stopPreview");

-

-    // Stop the thread

-    if(mThreadContext != NULL) {

-        bStopThreadInProgress = true;

-        {

-            Mutex::Autolock autoLock(mLockSem);

-            if (mSemThreadWait != NULL) {

-                err = M4OSA_semaphorePost(mSemThreadWait);

-            }

-        }

-

-        err = M4OSA_threadSyncStop(mThreadContext);

-        if(err != M4NO_ERROR) {

-            LOGV("stopPreview: error 0x%x in trying to stop thread", err);

-            // Continue even if error

-        }

-

-        err = M4OSA_threadSyncClose(mThreadContext);

-        if(err != M4NO_ERROR) {

-            LOGE("stopPreview: error 0x%x in trying to close thread", (unsigned int)err);

-            // Continue even if error

-        }

-

-        mThreadContext = NULL;

-    }

-

-    // Close the semaphore first

-    {

-        Mutex::Autolock autoLock(mLockSem);

-        if(mSemThreadWait != NULL) {

-            err = M4OSA_semaphoreClose(mSemThreadWait);

-            LOGV("stopPreview: close semaphore returns 0x%x", err);

-            mSemThreadWait = NULL;

-        }

-    }

-

-    for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {

-        if(mVePlayer[playerInst] != NULL) {

-            if(mVePlayer[playerInst]->isPlaying()) {

-                LOGV("stop the player first");

-                mVePlayer[playerInst]->stop();

-            }

-            if (playerInst == mActivePlayerIndex) {

-                // Return the last rendered frame time stamp

-                mVePlayer[mActivePlayerIndex]->getLastRenderedTimeMs(&lastRenderedFrameTimeMs);

-            }

+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_NDEBUG 1
+#define LOG_TAG "VideoEditorPreviewController"
+#include "VideoEditorPreviewController.h"
+
+namespace android {
+
+#define PREVIEW_THREAD_STACK_SIZE                           (65536)
+
+VideoEditorPreviewController::VideoEditorPreviewController()
+    : mCurrentPlayer(0),
+      mThreadContext(NULL),
+      mPlayerState(VePlayerIdle),
+      mPrepareReqest(M4OSA_FALSE),
+      mClipList(NULL),
+      mNumberClipsInStoryBoard(0),
+      mNumberClipsToPreview(0),
+      mStartingClipIndex(0),
+      mPreviewLooping(M4OSA_FALSE),
+      mCallBackAfterFrameCnt(0),
+      mEffectsSettings(NULL),
+      mNumberEffects(0),
+      mCurrentClipNumber(-1),
+      mClipTotalDuration(0),
+      mCurrentVideoEffect(VIDEO_EFFECT_NONE),
+      mBackgroundAudioSetting(NULL),
+      mAudioMixPCMFileHandle(NULL),
+      mTarget(NULL),
+      mJniCookie(NULL),
+      mJniCallback(NULL),
+      mCurrentPlayedDuration(0),
+      mCurrentClipDuration(0),
+      mVideoStoryBoardTimeMsUptoFirstPreviewClip(0),
+      mOverlayState(OVERLAY_CLEAR),
+      mActivePlayerIndex(0),
+      mOutputVideoWidth(0),
+      mOutputVideoHeight(0),
+      bStopThreadInProgress(false),
+      mSemThreadWait(NULL) {
+    LOGV("VideoEditorPreviewController");
+    mRenderingMode = M4xVSS_kBlackBorders;
+    mIsFiftiesEffectStarted = false;
+
+    for (int i=0; i<NBPLAYER_INSTANCES; i++) {
+        mVePlayer[i] = NULL;
+    }
+}
+
+VideoEditorPreviewController::~VideoEditorPreviewController() {
+    M4OSA_UInt32 i = 0;
+    M4OSA_ERR err = M4NO_ERROR;
+    LOGV("~VideoEditorPreviewController");
+
+    // Stop the thread if its still running
+    if(mThreadContext != NULL) {
+        err = M4OSA_threadSyncStop(mThreadContext);
+        if(err != M4NO_ERROR) {
+            LOGV("~VideoEditorPreviewController: error 0x%x \
+            in trying to stop thread", err);
+            // Continue even if error
+        }
+
+        err = M4OSA_threadSyncClose(mThreadContext);
+        if(err != M4NO_ERROR) {
+            LOGE("~VideoEditorPreviewController: error 0x%x \
+            in trying to close thread", (unsigned int) err);
+            // Continue even if error
+        }
+
+        mThreadContext = NULL;
+    }
+
+    for (int playerInst=0; playerInst<NBPLAYER_INSTANCES;
+         playerInst++) {
+        if(mVePlayer[playerInst] != NULL) {
+            LOGV("clearing mVePlayer %d", playerInst);
+            mVePlayer[playerInst].clear();
+        }
+    }
+
+    if(mClipList != NULL) {
+        // Clean up
+        for(i=0;i<mNumberClipsInStoryBoard;i++)
+        {
+            if(mClipList[i]->pFile != NULL) {
+                free(mClipList[i]->pFile);
+                mClipList[i]->pFile = NULL;
+            }
+
+            free(mClipList[i]);
+        }
+        free(mClipList);
+        mClipList = NULL;
+    }
+
+    if(mEffectsSettings) {
+        for(i=0;i<mNumberEffects;i++) {
+            if(mEffectsSettings[i].xVSS.pFramingBuffer != NULL) {
+                free(mEffectsSettings[i].xVSS.pFramingBuffer->pac_data);
+
+                free(mEffectsSettings[i].xVSS.pFramingBuffer);
+
+                mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
+            }
+        }
+        free(mEffectsSettings);
+        mEffectsSettings = NULL;
+    }
+
+    if (mAudioMixPCMFileHandle) {
+        err = M4OSA_fileReadClose (mAudioMixPCMFileHandle);
+        mAudioMixPCMFileHandle = M4OSA_NULL;
+    }
+
+    if (mBackgroundAudioSetting != NULL) {
+        free(mBackgroundAudioSetting);
+        mBackgroundAudioSetting = NULL;
+    }
+
+    if(mTarget != NULL) {
+        delete mTarget;
+        mTarget = NULL;
+    }
+
+    mOverlayState = OVERLAY_CLEAR;
+
+    LOGV("~VideoEditorPreviewController returns");
+}
+
+M4OSA_ERR VideoEditorPreviewController::loadEditSettings(
+    M4VSS3GPP_EditSettings* pSettings,M4xVSS_AudioMixingSettings* bgmSettings) {
+
+    M4OSA_UInt32 i = 0, iClipDuration = 0, rgbSize = 0;
+    M4VIFI_UInt8 *tmp = NULL;
+    M4OSA_ERR err = M4NO_ERROR;
+
+    LOGV("loadEditSettings");
+    LOGV("loadEditSettings Channels = %d, sampling Freq %d",
+          bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency  );
+          bgmSettings->uiSamplingFrequency = 32000;
+
+    LOGV("loadEditSettings Channels = %d, sampling Freq %d",
+          bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency  );
+    Mutex::Autolock autoLock(mLock);
+
+    // Clean up any previous Edit settings before loading new ones
+    mCurrentVideoEffect = VIDEO_EFFECT_NONE;
+
+    if(mAudioMixPCMFileHandle) {
+        err = M4OSA_fileReadClose (mAudioMixPCMFileHandle);
+        mAudioMixPCMFileHandle = M4OSA_NULL;
+    }
+
+    if(mBackgroundAudioSetting != NULL) {
+        free(mBackgroundAudioSetting);
+        mBackgroundAudioSetting = NULL;
+    }
+
+    if(mClipList != NULL) {
+        // Clean up
+        for(i=0;i<mNumberClipsInStoryBoard;i++)
+        {
+            if(mClipList[i]->pFile != NULL) {
+                free(mClipList[i]->pFile);
+                mClipList[i]->pFile = NULL;
+            }
+
+            free(mClipList[i]);
+        }
+        free(mClipList);
+        mClipList = NULL;
+    }
+
+    if(mEffectsSettings) {
+        for(i=0;i<mNumberEffects;i++) {
+            if(mEffectsSettings[i].xVSS.pFramingBuffer != NULL) {
+                free(mEffectsSettings[i].xVSS.pFramingBuffer->pac_data);
+
+                free(mEffectsSettings[i].xVSS.pFramingBuffer);
+
+                mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
+            }
+        }
+        free(mEffectsSettings);
+        mEffectsSettings = NULL;
+    }
+
+    if(mClipList == NULL) {
+        mNumberClipsInStoryBoard = pSettings->uiClipNumber;
+        LOGV("loadEditSettings: # of Clips = %d", mNumberClipsInStoryBoard);
+
+        mClipList = (M4VSS3GPP_ClipSettings**)M4OSA_32bitAlignedMalloc(
+         sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber, M4VS,
+         (M4OSA_Char*)"LvPP, copy of pClipList");
+
+        if(NULL == mClipList) {
+            LOGE("loadEditSettings: Malloc error");
+            return M4ERR_ALLOC;
+        }
+        memset((void *)mClipList,0,
+         sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber);
+
+        for(i=0;i<pSettings->uiClipNumber;i++) {
+
+            // Allocate current clip
+            mClipList[i] =
+             (M4VSS3GPP_ClipSettings*)M4OSA_32bitAlignedMalloc(
+              sizeof(M4VSS3GPP_ClipSettings),M4VS,(M4OSA_Char*)"clip settings");
+
+            if(mClipList[i] == NULL) {
+
+                LOGE("loadEditSettings: Allocation error for mClipList[%d]", (int)i);
+                return M4ERR_ALLOC;
+            }
+            // Copy plain structure
+            memcpy((void *)mClipList[i],
+             (void *)pSettings->pClipList[i],
+             sizeof(M4VSS3GPP_ClipSettings));
+
+            if(NULL != pSettings->pClipList[i]->pFile) {
+                mClipList[i]->pFile = (M4OSA_Char*)M4OSA_32bitAlignedMalloc(
+                pSettings->pClipList[i]->filePathSize, M4VS,
+                (M4OSA_Char*)"pClipSettingsDest->pFile");
+
+                if(NULL == mClipList[i]->pFile)
+                {
+                    LOGE("loadEditSettings : ERROR allocating filename");
+                    return M4ERR_ALLOC;
+                }
+
+                memcpy((void *)mClipList[i]->pFile,
+                 (void *)pSettings->pClipList[i]->pFile,
+                 pSettings->pClipList[i]->filePathSize);
+            }
+            else {
+                LOGE("NULL file path");
+                return M4ERR_PARAMETER;
+            }
+
+            // Calculate total duration of all clips
+            iClipDuration = pSettings->pClipList[i]->uiEndCutTime -
+             pSettings->pClipList[i]->uiBeginCutTime;
+
+            mClipTotalDuration = mClipTotalDuration+iClipDuration;
+        }
+    }
+
+    if(mEffectsSettings == NULL) {
+        mNumberEffects = pSettings->nbEffects;
+        LOGV("loadEditSettings: mNumberEffects = %d", mNumberEffects);
+
+        if(mNumberEffects != 0) {
+            mEffectsSettings = (M4VSS3GPP_EffectSettings*)M4OSA_32bitAlignedMalloc(
+             mNumberEffects*sizeof(M4VSS3GPP_EffectSettings),
+             M4VS, (M4OSA_Char*)"effects settings");
+
+            if(mEffectsSettings == NULL) {
+                LOGE("loadEffectsSettings: Allocation error");
+                return M4ERR_ALLOC;
+            }
+
+            memset((void *)mEffectsSettings,0,
+             mNumberEffects*sizeof(M4VSS3GPP_EffectSettings));
+
+            for(i=0;i<mNumberEffects;i++) {
+
+                mEffectsSettings[i].xVSS.pFramingFilePath = NULL;
+                mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
+                mEffectsSettings[i].xVSS.pTextBuffer = NULL;
+
+                memcpy((void *)&(mEffectsSettings[i]),
+                 (void *)&(pSettings->Effects[i]),
+                 sizeof(M4VSS3GPP_EffectSettings));
+
+                if(pSettings->Effects[i].VideoEffectType ==
+                 (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) {
+                    // Allocate the pFraming RGB buffer
+                    mEffectsSettings[i].xVSS.pFramingBuffer =
+                    (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(sizeof(M4VIFI_ImagePlane),
+                     M4VS, (M4OSA_Char*)"lvpp framing buffer");
+
+                    if(mEffectsSettings[i].xVSS.pFramingBuffer == NULL) {
+                        LOGE("loadEffectsSettings:Alloc error for pFramingBuf");
+                        free(mEffectsSettings);
+                        mEffectsSettings = NULL;
+                        return M4ERR_ALLOC;
+                    }
+
+                    // Allocate the pac_data (RGB)
+                    if(pSettings->Effects[i].xVSS.rgbType == M4VSS3GPP_kRGB565){
+                        rgbSize =
+                         pSettings->Effects[i].xVSS.pFramingBuffer->u_width *
+                         pSettings->Effects[i].xVSS.pFramingBuffer->u_height*2;
+                    }
+                    else if(
+                     pSettings->Effects[i].xVSS.rgbType == M4VSS3GPP_kRGB888) {
+                        rgbSize =
+                         pSettings->Effects[i].xVSS.pFramingBuffer->u_width *
+                         pSettings->Effects[i].xVSS.pFramingBuffer->u_height*3;
+                    }
+                    else {
+                        LOGE("loadEffectsSettings: wrong RGB type");
+                        free(mEffectsSettings);
+                        mEffectsSettings = NULL;
+                        return M4ERR_PARAMETER;
+                    }
+
+                    tmp = (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(rgbSize, M4VS,
+                     (M4OSA_Char*)"framing buffer pac_data");
+
+                    if(tmp == NULL) {
+                        LOGE("loadEffectsSettings:Alloc error pFramingBuf pac");
+                        free(mEffectsSettings);
+                        mEffectsSettings = NULL;
+                        free(mEffectsSettings[i].xVSS.pFramingBuffer);
+
+                        mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
+                        return M4ERR_ALLOC;
+                    }
+                    /* Initialize the pFramingBuffer*/
+                    mEffectsSettings[i].xVSS.pFramingBuffer->pac_data = tmp;
+                    mEffectsSettings[i].xVSS.pFramingBuffer->u_height =
+                     pSettings->Effects[i].xVSS.pFramingBuffer->u_height;
+
+                    mEffectsSettings[i].xVSS.pFramingBuffer->u_width =
+                     pSettings->Effects[i].xVSS.pFramingBuffer->u_width;
+
+                    mEffectsSettings[i].xVSS.pFramingBuffer->u_stride =
+                     pSettings->Effects[i].xVSS.pFramingBuffer->u_stride;
+
+                    mEffectsSettings[i].xVSS.pFramingBuffer->u_topleft =
+                     pSettings->Effects[i].xVSS.pFramingBuffer->u_topleft;
+
+                    mEffectsSettings[i].xVSS.uialphaBlendingStart =
+                     pSettings->Effects[i].xVSS.uialphaBlendingStart;
+
+                    mEffectsSettings[i].xVSS.uialphaBlendingMiddle =
+                     pSettings->Effects[i].xVSS.uialphaBlendingMiddle;
+
+                    mEffectsSettings[i].xVSS.uialphaBlendingEnd =
+                     pSettings->Effects[i].xVSS.uialphaBlendingEnd;
+
+                    mEffectsSettings[i].xVSS.uialphaBlendingFadeInTime =
+                     pSettings->Effects[i].xVSS.uialphaBlendingFadeInTime;
+                    mEffectsSettings[i].xVSS.uialphaBlendingFadeOutTime =
+                     pSettings->Effects[i].xVSS.uialphaBlendingFadeOutTime;
+
+                    // Copy the pFraming data
+                    memcpy((void *)
+                    mEffectsSettings[i].xVSS.pFramingBuffer->pac_data,
+                    (void *)pSettings->Effects[i].xVSS.pFramingBuffer->pac_data,
+                    rgbSize);
+
+                    mEffectsSettings[i].xVSS.rgbType =
+                     pSettings->Effects[i].xVSS.rgbType;
+                }
+            }
+        }
+    }
+
+    if (mBackgroundAudioSetting == NULL) {
+
+        mBackgroundAudioSetting = (M4xVSS_AudioMixingSettings*)M4OSA_32bitAlignedMalloc(
+        sizeof(M4xVSS_AudioMixingSettings), M4VS,
+        (M4OSA_Char*)"LvPP, copy of bgmSettings");
+
+        if(NULL == mBackgroundAudioSetting) {
+            LOGE("loadEditSettings: mBackgroundAudioSetting Malloc failed");
+            return M4ERR_ALLOC;
+        }
+
+        memset((void *)mBackgroundAudioSetting, 0,sizeof(M4xVSS_AudioMixingSettings*));
+        memcpy((void *)mBackgroundAudioSetting, (void *)bgmSettings, sizeof(M4xVSS_AudioMixingSettings));
+
+        if ( mBackgroundAudioSetting->pFile != M4OSA_NULL ) {
+
+            mBackgroundAudioSetting->pFile = (M4OSA_Void*) bgmSettings->pPCMFilePath;
+            mBackgroundAudioSetting->uiNbChannels = 2;
+            mBackgroundAudioSetting->uiSamplingFrequency = 32000;
+        }
+
+        // Open the BG file
+        if ( mBackgroundAudioSetting->pFile != M4OSA_NULL ) {
+            err = M4OSA_fileReadOpen(&mAudioMixPCMFileHandle,
+             mBackgroundAudioSetting->pFile, M4OSA_kFileRead);
+
+            if (err != M4NO_ERROR) {
+                LOGE("loadEditSettings: mBackgroundAudio PCM File open failed");
+                return M4ERR_PARAMETER;
+            }
+        }
+    }
+
+    mOutputVideoSize = pSettings->xVSS.outputVideoSize;
+    mFrameStr.pBuffer = M4OSA_NULL;
+    return M4NO_ERROR;
+}
+
+M4OSA_ERR VideoEditorPreviewController::setSurface(const sp<Surface> &surface) {
+    LOGV("setSurface");
+    Mutex::Autolock autoLock(mLock);
+
+    mSurface = surface;
+    return M4NO_ERROR;
+}
+
+M4OSA_ERR VideoEditorPreviewController::startPreview(
+    M4OSA_UInt32 fromMS, M4OSA_Int32 toMs, M4OSA_UInt16 callBackAfterFrameCount,
+    M4OSA_Bool loop) {
+
+    M4OSA_ERR err = M4NO_ERROR;
+    M4OSA_UInt32 i = 0, iIncrementedDuration = 0;
+    LOGV("startPreview");
+
+    if(fromMS > (M4OSA_UInt32)toMs) {
+        LOGE("startPreview: fromMS > toMs");
+        return M4ERR_PARAMETER;
+    }
+
+    if(toMs == 0) {
+        LOGE("startPreview: toMs is 0");
+        return M4ERR_PARAMETER;
+    }
+
+    // If already started, then stop preview first
+    for(int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
+        if(mVePlayer[playerInst] != NULL) {
+            LOGV("startPreview: stopping previously started preview playback");
+            stopPreview();
+            break;
+        }
+    }
+
+    // If renderPreview was called previously, then delete Renderer object first
+    if(mTarget != NULL) {
+        LOGV("startPreview: delete previous PreviewRenderer");
+        delete mTarget;
+        mTarget = NULL;
+    }
+
+    // Create Audio player to be used for entire
+    // storyboard duration
+    mVEAudioSink = new VideoEditorPlayer::VeAudioOutput();
+    mVEAudioPlayer = new VideoEditorAudioPlayer(mVEAudioSink);
+    mVEAudioPlayer->setAudioMixSettings(mBackgroundAudioSetting);
+    mVEAudioPlayer->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle);
+
+    LOGV("startPreview: loop = %d", loop);
+    mPreviewLooping = loop;
+
+    LOGV("startPreview: callBackAfterFrameCount = %d", callBackAfterFrameCount);
+    mCallBackAfterFrameCnt = callBackAfterFrameCount;
+
+    for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
+        mVePlayer[playerInst] = new VideoEditorPlayer();
+        if(mVePlayer[playerInst] == NULL) {
+            LOGE("startPreview:Error creating VideoEditorPlayer %d",playerInst);
+            return M4ERR_ALLOC;
+        }
+        LOGV("startPreview: object created");
+
+        mVePlayer[playerInst]->setNotifyCallback(this,(notify_callback_f)notify);
+        LOGV("startPreview: notify callback set");
+
+        mVePlayer[playerInst]->loadEffectsSettings(mEffectsSettings,
+         mNumberEffects);
+        LOGV("startPreview: effects settings loaded");
+
+        mVePlayer[playerInst]->loadAudioMixSettings(mBackgroundAudioSetting);
+        LOGV("startPreview: AudioMixSettings settings loaded");
+
+        mVePlayer[playerInst]->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle);
+        LOGV("startPreview: AudioMixPCMFileHandle set");
+
+        mVePlayer[playerInst]->setProgressCallbackInterval(
+         mCallBackAfterFrameCnt);
+        LOGV("startPreview: setProgressCallBackInterval");
+    }
+
+    mPlayerState = VePlayerIdle;
+    mPrepareReqest = M4OSA_FALSE;
+
+    if(fromMS == 0) {
+        mCurrentClipNumber = -1;
+        // Save original value
+        mFirstPreviewClipBeginTime = mClipList[0]->uiBeginCutTime;
+        mVideoStoryBoardTimeMsUptoFirstPreviewClip = 0;
+    }
+    else {
+        LOGV("startPreview: fromMS=%d", fromMS);
+        if(fromMS >= mClipTotalDuration) {
+            LOGE("startPreview: fromMS >= mClipTotalDuration");
+            return M4ERR_PARAMETER;
+        }
+        for(i=0;i<mNumberClipsInStoryBoard;i++) {
+            if(fromMS < (iIncrementedDuration + (mClipList[i]->uiEndCutTime -
+             mClipList[i]->uiBeginCutTime))) {
+                // Set to 1 index below,
+                // as threadProcess first increments the clip index
+                // and then processes clip in thread loop
+                mCurrentClipNumber = i-1;
+                LOGV("startPreview:mCurrentClipNumber = %d fromMS=%d",i,fromMS);
+
+                // Save original value
+                mFirstPreviewClipBeginTime = mClipList[i]->uiBeginCutTime;
+
+                // Set correct begin time to start playback
+                if((fromMS+mClipList[i]->uiBeginCutTime) >
+                (iIncrementedDuration+mClipList[i]->uiBeginCutTime)) {
+
+                    mClipList[i]->uiBeginCutTime =
+                     mClipList[i]->uiBeginCutTime +
+                     (fromMS - iIncrementedDuration);
+                }
+                break;
+            }
+            else {
+                iIncrementedDuration = iIncrementedDuration +
+                 (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime);
+            }
+        }
+        mVideoStoryBoardTimeMsUptoFirstPreviewClip = iIncrementedDuration;
+    }
+
+    for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
+        mVePlayer[playerInst]->setAudioMixStoryBoardParam(fromMS,
+         mFirstPreviewClipBeginTime,
+         mClipList[i]->ClipProperties.uiClipAudioVolumePercentage);
+
+        LOGV("startPreview:setAudioMixStoryBoardSkimTimeStamp set %d cuttime \
+         %d", fromMS, mFirstPreviewClipBeginTime);
+    }
+
+    mStartingClipIndex = mCurrentClipNumber+1;
+
+    // Start playing with player instance 0
+    mCurrentPlayer = 0;
+    mActivePlayerIndex = 0;
+
+    if(toMs == -1) {
+        LOGV("startPreview: Preview till end of storyboard");
+        mNumberClipsToPreview = mNumberClipsInStoryBoard;
+        // Save original value
+        mLastPreviewClipEndTime =
+         mClipList[mNumberClipsToPreview-1]->uiEndCutTime;
+    }
+    else {
+        LOGV("startPreview: toMs=%d", toMs);
+        if((M4OSA_UInt32)toMs > mClipTotalDuration) {
+            LOGE("startPreview: toMs > mClipTotalDuration");
+            return M4ERR_PARAMETER;
+        }
+
+        iIncrementedDuration = 0;
+
+        for(i=0;i<mNumberClipsInStoryBoard;i++) {
+            if((M4OSA_UInt32)toMs <= (iIncrementedDuration +
+             (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime))) {
+                // Save original value
+                mLastPreviewClipEndTime = mClipList[i]->uiEndCutTime;
+                // Set the end cut time of clip index i to toMs
+                mClipList[i]->uiEndCutTime = toMs;
+
+                // Number of clips to be previewed is from index 0 to i
+                // increment by 1 as i starts from 0
+                mNumberClipsToPreview = i+1;
+                break;
+            }
+            else {
+                iIncrementedDuration = iIncrementedDuration +
+                 (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime);
+            }
+        }
+    }
+
+    // Open the thread semaphore
+    M4OSA_semaphoreOpen(&mSemThreadWait, 1);
+
+    // Open the preview process thread
+    err = M4OSA_threadSyncOpen(&mThreadContext, (M4OSA_ThreadDoIt)threadProc);
+    if (M4NO_ERROR != err) {
+        LOGE("VideoEditorPreviewController:M4OSA_threadSyncOpen error %d", (int) err);
+        return err;
+    }
+
+    // Set the stacksize
+    err = M4OSA_threadSyncSetOption(mThreadContext, M4OSA_ThreadStackSize,
+     (M4OSA_DataOption)PREVIEW_THREAD_STACK_SIZE);
+
+    if (M4NO_ERROR != err) {
+        LOGE("VideoEditorPreviewController: threadSyncSetOption error %d", (int) err);
+        M4OSA_threadSyncClose(mThreadContext);
+        mThreadContext = NULL;
+        return err;
+    }
+
+     // Start the thread
+     err = M4OSA_threadSyncStart(mThreadContext, (M4OSA_Void*)this);
+     if (M4NO_ERROR != err) {
+        LOGE("VideoEditorPreviewController: threadSyncStart error %d", (int) err);
+        M4OSA_threadSyncClose(mThreadContext);
+        mThreadContext = NULL;
+        return err;
+    }
+    bStopThreadInProgress = false;
+
+    LOGV("startPreview: process thread started");
+    return M4NO_ERROR;
+}
+
+M4OSA_UInt32 VideoEditorPreviewController::stopPreview() {
+    M4OSA_ERR err = M4NO_ERROR;
+    uint32_t lastRenderedFrameTimeMs = 0;
+    LOGV("stopPreview");
+
+    // Stop the thread
+    if(mThreadContext != NULL) {
+        bStopThreadInProgress = true;
+        {
+            Mutex::Autolock autoLock(mLockSem);
+            if (mSemThreadWait != NULL) {
+                err = M4OSA_semaphorePost(mSemThreadWait);
+            }
+        }
+
+        err = M4OSA_threadSyncStop(mThreadContext);
+        if(err != M4NO_ERROR) {
+            LOGV("stopPreview: error 0x%x in trying to stop thread", err);
+            // Continue even if error
+        }
+
+        err = M4OSA_threadSyncClose(mThreadContext);
+        if(err != M4NO_ERROR) {
+            LOGE("stopPreview: error 0x%x in trying to close thread", (unsigned int)err);
+            // Continue even if error
+        }
+
+        mThreadContext = NULL;
+    }
+
+    // Close the semaphore first
+    {
+        Mutex::Autolock autoLock(mLockSem);
+        if(mSemThreadWait != NULL) {
+            err = M4OSA_semaphoreClose(mSemThreadWait);
+            LOGV("stopPreview: close semaphore returns 0x%x", err);
+            mSemThreadWait = NULL;
+        }
+    }
+
+    for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
+        if(mVePlayer[playerInst] != NULL) {
+            if(mVePlayer[playerInst]->isPlaying()) {
+                LOGV("stop the player first");
+                mVePlayer[playerInst]->stop();
+            }
+            if (playerInst == mActivePlayerIndex) {
+                // Return the last rendered frame time stamp
+                mVePlayer[mActivePlayerIndex]->getLastRenderedTimeMs(&lastRenderedFrameTimeMs);
+            }
 
             //This is used to syncronize onStreamDone() in PreviewPlayer and
-            //stopPreview() in PreviewController

+            //stopPreview() in PreviewController
             sp<VideoEditorPlayer> temp = mVePlayer[playerInst];
             temp->acquireLock();
             LOGV("stopPreview: clearing mVePlayer");
             mVePlayer[playerInst].clear();
-            mVePlayer[playerInst] = NULL;

+            mVePlayer[playerInst] = NULL;
             temp->releaseLock();
-        }

-    }

-    LOGV("stopPreview: clear audioSink and audioPlayer");

-    mVEAudioSink.clear();

-    if (mVEAudioPlayer) {

-        delete mVEAudioPlayer;

-        mVEAudioPlayer = NULL;

-    }

-

-    // If image file playing, then free the buffer pointer

-    if(mFrameStr.pBuffer != M4OSA_NULL) {

-        free(mFrameStr.pBuffer);

-        mFrameStr.pBuffer = M4OSA_NULL;

-    }

-

-    // Reset original begin cuttime of first previewed clip*/

-    mClipList[mStartingClipIndex]->uiBeginCutTime = mFirstPreviewClipBeginTime;

-    // Reset original end cuttime of last previewed clip*/

-    mClipList[mNumberClipsToPreview-1]->uiEndCutTime = mLastPreviewClipEndTime;

-

-    mPlayerState = VePlayerIdle;

-    mPrepareReqest = M4OSA_FALSE;

-

-    mCurrentPlayedDuration = 0;

-    mCurrentClipDuration = 0;

-    mRenderingMode = M4xVSS_kBlackBorders;

-    mOutputVideoWidth = 0;

-    mOutputVideoHeight = 0;

-

-    LOGV("stopPreview() lastRenderedFrameTimeMs %ld", lastRenderedFrameTimeMs);

-    return lastRenderedFrameTimeMs;

-}

-

-M4OSA_ERR VideoEditorPreviewController::clearSurface(

-    const sp<Surface> &surface, VideoEditor_renderPreviewFrameStr* pFrameInfo) {

-

-    M4OSA_ERR err = M4NO_ERROR;

-    VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo;

-    M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0;

-    M4VIFI_ImagePlane planeOut[3];

-    LOGV("Inside preview clear frame");

-

-    Mutex::Autolock autoLock(mLock);

-

-    // Delete previous renderer instance

-    if(mTarget != NULL) {

-        delete mTarget;

-        mTarget = NULL;

-    }

-

-    outputBufferWidth = pFrameStr->uiFrameWidth;

-    outputBufferHeight = pFrameStr->uiFrameHeight;

-

-    // Initialize the renderer

-    if(mTarget == NULL) {

-

-        mTarget = PreviewRenderer::CreatePreviewRenderer(

-            OMX_COLOR_FormatYUV420Planar, surface, outputBufferWidth, outputBufferHeight,

-            outputBufferWidth, outputBufferHeight, 0);

-

-        if(mTarget == NULL) {

-            LOGE("renderPreviewFrame: cannot create PreviewRenderer");

-            return M4ERR_ALLOC;

-        }

-    }

-

-    // Out plane

-    uint8_t* outBuffer;

-    size_t outBufferStride = 0;

-

-    LOGV("doMediaRendering CALL getBuffer()");

-    mTarget->getBufferYV12(&outBuffer, &outBufferStride);

-

-    // Set the output YUV420 plane to be compatible with YV12 format

-    //In YV12 format, sizes must be even

-    M4OSA_UInt32 yv12PlaneWidth = ((outputBufferWidth +1)>>1)<<1;

-    M4OSA_UInt32 yv12PlaneHeight = ((outputBufferHeight+1)>>1)<<1;

-

-    prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight,

-     (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer);

-

-    /* Fill the surface with black frame */

-    memset((void *)planeOut[0].pac_data,0x00,planeOut[0].u_width *

-                            planeOut[0].u_height * 1.5);

-    memset((void *)planeOut[1].pac_data,128,planeOut[1].u_width *

-                            planeOut[1].u_height);

-    memset((void *)planeOut[2].pac_data,128,planeOut[2].u_width *

-                             planeOut[2].u_height);

-

-    mTarget->renderYV12();

-    return err;

-}

-

-M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(

-            const sp<Surface> &surface,

-            VideoEditor_renderPreviewFrameStr* pFrameInfo,

-            VideoEditorCurretEditInfo *pCurrEditInfo) {

-

-    M4OSA_ERR err = M4NO_ERROR;

-    M4OSA_UInt32 i = 0, iIncrementedDuration = 0, tnTimeMs=0, framesize =0;

-    VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo;

-    M4VIFI_UInt8 *pixelArray = NULL;

-    Mutex::Autolock autoLock(mLock);

-

-    if (pCurrEditInfo != NULL) {

-        pCurrEditInfo->overlaySettingsIndex = -1;

-    }

-    // Delete previous renderer instance

-    if(mTarget != NULL) {

-        delete mTarget;

-        mTarget = NULL;

-    }

-

-    if(mOutputVideoWidth == 0) {

-        mOutputVideoWidth = pFrameStr->uiFrameWidth;

-    }

-

-    if(mOutputVideoHeight == 0) {

-        mOutputVideoHeight = pFrameStr->uiFrameHeight;

-    }

-

-    // Initialize the renderer

-    if(mTarget == NULL) {

-        /*mTarget = new PreviewRenderer(

-            OMX_COLOR_FormatYUV420Planar, surface, mOutputVideoWidth, mOutputVideoHeight,

-            mOutputVideoWidth, mOutputVideoHeight, 0);*/

-

-         mTarget = PreviewRenderer::CreatePreviewRenderer(

-            OMX_COLOR_FormatYUV420Planar, surface, mOutputVideoWidth, mOutputVideoHeight,

-            mOutputVideoWidth, mOutputVideoHeight, 0);

-

-        if(mTarget == NULL) {

-            LOGE("renderPreviewFrame: cannot create PreviewRenderer");

-            return M4ERR_ALLOC;

-        }

-    }

-

-    pixelArray = NULL;

-

-    // Postprocessing (apply video effect)

-    if(pFrameStr->bApplyEffect == M4OSA_TRUE) {

-

-        for(i=0;i<mNumberEffects;i++) {

-            // First check if effect starttime matches the clip being previewed

-            if((mEffectsSettings[i].uiStartTime < pFrameStr->clipBeginCutTime)

-             ||(mEffectsSettings[i].uiStartTime >= pFrameStr->clipEndCutTime)) {

-                // This effect doesn't belong to this clip, check next one

-                continue;

-            }

-            if((mEffectsSettings[i].uiStartTime <= pFrameStr->timeMs) &&

-            ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >=

-             pFrameStr->timeMs) && (mEffectsSettings[i].uiDuration != 0)) {

-                setVideoEffectType(mEffectsSettings[i].VideoEffectType, TRUE);

-            }

-            else {

-                setVideoEffectType(mEffectsSettings[i].VideoEffectType, FALSE);

-            }

-        }

-

-        //Provide the overlay Update indication when there is an overlay effect

-        if (mCurrentVideoEffect & VIDEO_EFFECT_FRAMING) {

-            M4OSA_UInt32 index;

-            mCurrentVideoEffect &= ~VIDEO_EFFECT_FRAMING; //never apply framing here.

-

-            // Find the effect in effectSettings array

-            for (index = 0; index < mNumberEffects; index++) {

-                if(mEffectsSettings[index].VideoEffectType ==

-                    (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) {

-

-                    if((mEffectsSettings[index].uiStartTime <= pFrameInfo->timeMs) &&

-                        ((mEffectsSettings[index].uiStartTime+

-                        mEffectsSettings[index].uiDuration) >= pFrameInfo->timeMs))

-                    {

-                        break;

-                    }

-                }

-            }

-            if ((index < mNumberEffects) && (pCurrEditInfo != NULL)) {

-                pCurrEditInfo->overlaySettingsIndex = index;

-                LOGV("Framing index = %d", index);

-            } else {

-                LOGV("No framing effects found");

-            }

-        }

-

-        if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) {

-            err = applyVideoEffect((M4OSA_Void *)pFrameStr->pBuffer,

-             OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,

-             pFrameStr->uiFrameHeight, pFrameStr->timeMs,

-             (M4OSA_Void *)pixelArray);

-

-            if(err != M4NO_ERROR) {

-                LOGE("renderPreviewFrame: applyVideoEffect error 0x%x", (unsigned int)err);

-                delete mTarget;

-                mTarget = NULL;

-                free(pixelArray);

-                pixelArray = NULL;

-                return err;

-           }

-           mCurrentVideoEffect = VIDEO_EFFECT_NONE;

-        }

-        else {

-            // Apply the rendering mode

-            err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer,

-             OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,

-             pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray);

-

-            if(err != M4NO_ERROR) {

-                LOGE("renderPreviewFrame:doImageRenderingMode error 0x%x", (unsigned int)err);

-                delete mTarget;

-                mTarget = NULL;

-                free(pixelArray);

-                pixelArray = NULL;

-                return err;

-            }

-        }

-    }

-    else {

-        // Apply the rendering mode

-        err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer,

-         OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,

-         pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray);

-

-        if(err != M4NO_ERROR) {

-            LOGE("renderPreviewFrame: doImageRenderingMode error 0x%x", (unsigned int)err);

-            delete mTarget;

-            mTarget = NULL;

-            free(pixelArray);

-            pixelArray = NULL;

-            return err;

-        }

-    }

-

-    mTarget->renderYV12();

-    return err;

-}

-

-M4OSA_Void VideoEditorPreviewController::setJniCallback(void* cookie,

-    jni_progress_callback_fct callbackFct) {

-    //LOGV("setJniCallback");

-    mJniCookie = cookie;

-    mJniCallback = callbackFct;

-}

-

-M4OSA_ERR VideoEditorPreviewController::preparePlayer(

-    void* param, int playerInstance, int index) {

-

-    M4OSA_ERR err = M4NO_ERROR;

-    VideoEditorPreviewController *pController =

-     (VideoEditorPreviewController *)param;

-

-    LOGV("preparePlayer: instance %d file %d", playerInstance, index);

-

-    pController->mVePlayer[playerInstance]->setDataSource(

-    (const char *)pController->mClipList[index]->pFile, NULL);

-    LOGV("preparePlayer: setDataSource instance %s",

-     (const char *)pController->mClipList[index]->pFile);

-

-    pController->mVePlayer[playerInstance]->setVideoSurface(

-     pController->mSurface);

-    LOGV("preparePlayer: setVideoSurface");

-

-    pController->mVePlayer[playerInstance]->setMediaRenderingMode(

-     pController->mClipList[index]->xVSS.MediaRendering,

-     pController->mOutputVideoSize);

-    LOGV("preparePlayer: setMediaRenderingMode");

-

-    if((M4OSA_UInt32)index == pController->mStartingClipIndex) {

-        pController->mVePlayer[playerInstance]->setPlaybackBeginTime(

-        pController->mFirstPreviewClipBeginTime);

-    }

-    else {

-        pController->mVePlayer[playerInstance]->setPlaybackBeginTime(

-        pController->mClipList[index]->uiBeginCutTime);

-    }

-    LOGV("preparePlayer: setPlaybackBeginTime(%d)",

-     pController->mClipList[index]->uiBeginCutTime);

-

-    pController->mVePlayer[playerInstance]->setPlaybackEndTime(

-     pController->mClipList[index]->uiEndCutTime);

-    LOGV("preparePlayer: setPlaybackEndTime(%d)",

-     pController->mClipList[index]->uiEndCutTime);

-

-    if(pController->mClipList[index]->FileType == M4VIDEOEDITING_kFileType_ARGB8888) {

-        pController->mVePlayer[playerInstance]->setImageClipProperties(

-                 pController->mClipList[index]->ClipProperties.uiVideoWidth,

-                 pController->mClipList[index]->ClipProperties.uiVideoHeight);

-        LOGV("preparePlayer: setImageClipProperties");

-    }

-

-    pController->mVePlayer[playerInstance]->prepare();

-    LOGV("preparePlayer: prepared");

-

-    if(pController->mClipList[index]->uiBeginCutTime > 0) {

-        pController->mVePlayer[playerInstance]->seekTo(

-         pController->mClipList[index]->uiBeginCutTime);

-

-        LOGV("preparePlayer: seekTo(%d)",

-         pController->mClipList[index]->uiBeginCutTime);

-    }

-    pController->mVePlayer[pController->mCurrentPlayer]->setAudioPlayer(pController->mVEAudioPlayer);

-

-    pController->mVePlayer[playerInstance]->readFirstVideoFrame();

-    LOGV("preparePlayer: readFirstVideoFrame of clip");

-

-    return err;

-}

-

-M4OSA_ERR VideoEditorPreviewController::threadProc(M4OSA_Void* param) {

-    M4OSA_ERR err = M4NO_ERROR;

-    M4OSA_Int32 index = 0;

-    VideoEditorPreviewController *pController =

-     (VideoEditorPreviewController *)param;

-

-    LOGV("inside threadProc");

-    if(pController->mPlayerState == VePlayerIdle) {

-        (pController->mCurrentClipNumber)++;

-

-        LOGV("threadProc: playing file index %d total clips %d",

-         pController->mCurrentClipNumber, pController->mNumberClipsToPreview);

-

-        if((M4OSA_UInt32)pController->mCurrentClipNumber >=

-         pController->mNumberClipsToPreview) {

-

-            LOGV("All clips previewed");

-

-            pController->mCurrentPlayedDuration = 0;

-            pController->mCurrentClipDuration = 0;

-            pController->mCurrentPlayer = 0;

-

-            if(pController->mPreviewLooping == M4OSA_TRUE) {

-                pController->mCurrentClipNumber =

-                 pController->mStartingClipIndex;

-

-                LOGV("Preview looping TRUE, restarting from clip index %d",

-                 pController->mCurrentClipNumber);

-

-                // Reset the story board timestamp inside the player

-                for (int playerInst=0; playerInst<NBPLAYER_INSTANCES;

-                 playerInst++) {

-                    pController->mVePlayer[playerInst]->resetJniCallbackTimeStamp();

-                }

-            }

-            else {

-                M4OSA_UInt32 endArgs = 0;

-                if(pController->mJniCallback != NULL) {

-                    pController->mJniCallback(

-                     pController->mJniCookie, MSG_TYPE_PREVIEW_END, &endArgs);

-                }

-                pController->mPlayerState = VePlayerAutoStop;

-

-                // Reset original begin cuttime of first previewed clip

-                pController->mClipList[pController->mStartingClipIndex]->uiBeginCutTime =

-                 pController->mFirstPreviewClipBeginTime;

-                // Reset original end cuttime of last previewed clip

-                pController->mClipList[pController->mNumberClipsToPreview-1]->uiEndCutTime =

-                 pController->mLastPreviewClipEndTime;

-

-                // Return a warning to M4OSA thread handler

-                // so that thread is moved from executing state to open state

-                return M4WAR_NO_MORE_STREAM;

-            }

-        }

-

-        index=pController->mCurrentClipNumber;

-        if((M4OSA_UInt32)pController->mCurrentClipNumber == pController->mStartingClipIndex) {

-            pController->mCurrentPlayedDuration +=

-             pController->mVideoStoryBoardTimeMsUptoFirstPreviewClip;

-

-            pController->mCurrentClipDuration =

-             pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime

-              - pController->mFirstPreviewClipBeginTime;

-

-            preparePlayer((void*)pController, pController->mCurrentPlayer, index);

-        }

-        else {

-            pController->mCurrentPlayedDuration +=

-             pController->mCurrentClipDuration;

-

-            pController->mCurrentClipDuration =

-             pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime -

-             pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;

-        }

-

-        pController->mVePlayer[pController->mCurrentPlayer]->setStoryboardStartTime(

-         pController->mCurrentPlayedDuration);

-        LOGV("threadProc: setStoryboardStartTime");

-

-        // Set the next clip duration for Audio mix here

-        if((M4OSA_UInt32)pController->mCurrentClipNumber != pController->mStartingClipIndex) {

-

-            pController->mVePlayer[pController->mCurrentPlayer]->setAudioMixStoryBoardParam(

-             pController->mCurrentPlayedDuration,

-             pController->mClipList[index]->uiBeginCutTime,

-             pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage);

-

-            LOGV("threadProc: setAudioMixStoryBoardParam fromMS %d \

-             ClipBeginTime %d", pController->mCurrentPlayedDuration +

-             pController->mClipList[index]->uiBeginCutTime,

-             pController->mClipList[index]->uiBeginCutTime,

-             pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage);

-        }

-        // Capture the active player being used

-        pController->mActivePlayerIndex = pController->mCurrentPlayer;

-

-        pController->mVePlayer[pController->mCurrentPlayer]->start();

-        LOGV("threadProc: started");

-

-        pController->mPlayerState = VePlayerBusy;

-

-    } else if(pController->mPlayerState == VePlayerAutoStop) {

-        LOGV("Preview completed..auto stop the player");

-    } else if ((pController->mPlayerState == VePlayerBusy) && (pController->mPrepareReqest)) {

-        // Prepare the player here

-        pController->mPrepareReqest = M4OSA_FALSE;

-        preparePlayer((void*)pController, pController->mCurrentPlayer,

-            pController->mCurrentClipNumber+1);

-        if (pController->mSemThreadWait != NULL) {

-            err = M4OSA_semaphoreWait(pController->mSemThreadWait,

-                M4OSA_WAIT_FOREVER);

-        }

-    } else {

-        if (!pController->bStopThreadInProgress) {

-            LOGV("threadProc: state busy...wait for sem");

-            if (pController->mSemThreadWait != NULL) {

-                err = M4OSA_semaphoreWait(pController->mSemThreadWait,

-                 M4OSA_WAIT_FOREVER);

-             }

-        }

-        LOGV("threadProc: sem wait returned err = 0x%x", err);

+        }
     }
-

-    //Always return M4NO_ERROR to ensure the thread keeps running

-    return M4NO_ERROR;

-}

-

-void VideoEditorPreviewController::notify(

-    void* cookie, int msg, int ext1, int ext2)

-{

-    VideoEditorPreviewController *pController =

-     (VideoEditorPreviewController *)cookie;

-

-    M4OSA_ERR err = M4NO_ERROR;

-    uint32_t clipDuration = 0;

-    switch (msg) {

-        case MEDIA_NOP: // interface test message

-            LOGV("MEDIA_NOP");

-            break;

-        case MEDIA_PREPARED:

-            LOGV("MEDIA_PREPARED");

-            break;

-        case MEDIA_PLAYBACK_COMPLETE:

-        {

-            LOGV("notify:MEDIA_PLAYBACK_COMPLETE");

-            pController->mPlayerState = VePlayerIdle;

-

-            //send progress callback with last frame timestamp

-            if((M4OSA_UInt32)pController->mCurrentClipNumber ==

-             pController->mStartingClipIndex) {

-                clipDuration =

-                 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime

-                  - pController->mFirstPreviewClipBeginTime;

-            }

-            else {

-                clipDuration =

-                 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime

-                  - pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;

-            }

-

-            M4OSA_UInt32 playedDuration = clipDuration+pController->mCurrentPlayedDuration;

-            pController->mJniCallback(

-                 pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION,

-                 &playedDuration);

-

-            if ((pController->mOverlayState == OVERLAY_UPDATE) &&

-                ((M4OSA_UInt32)pController->mCurrentClipNumber !=

-                (pController->mNumberClipsToPreview-1))) {

-                VideoEditorCurretEditInfo *pEditInfo =

-                    (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo),

-                    M4VS, (M4OSA_Char*)"Current Edit info");

-                pEditInfo->overlaySettingsIndex = ext2;

-                pEditInfo->clipIndex = pController->mCurrentClipNumber;

-                pController->mOverlayState == OVERLAY_CLEAR;

-                if (pController->mJniCallback != NULL) {

-                        pController->mJniCallback(pController->mJniCookie,

-                            MSG_TYPE_OVERLAY_CLEAR, pEditInfo);

-                }

-                free(pEditInfo);

-            }

-            {

-                Mutex::Autolock autoLock(pController->mLockSem);

-                if (pController->mSemThreadWait != NULL) {

+    LOGV("stopPreview: clear audioSink and audioPlayer");
+    mVEAudioSink.clear();
+    if (mVEAudioPlayer) {
+        delete mVEAudioPlayer;
+        mVEAudioPlayer = NULL;
+    }
+
+    // If image file playing, then free the buffer pointer
+    if(mFrameStr.pBuffer != M4OSA_NULL) {
+        free(mFrameStr.pBuffer);
+        mFrameStr.pBuffer = M4OSA_NULL;
+    }
+
+    // Reset original begin cuttime of first previewed clip*/
+    mClipList[mStartingClipIndex]->uiBeginCutTime = mFirstPreviewClipBeginTime;
+    // Reset original end cuttime of last previewed clip*/
+    mClipList[mNumberClipsToPreview-1]->uiEndCutTime = mLastPreviewClipEndTime;
+
+    mPlayerState = VePlayerIdle;
+    mPrepareReqest = M4OSA_FALSE;
+
+    mCurrentPlayedDuration = 0;
+    mCurrentClipDuration = 0;
+    mRenderingMode = M4xVSS_kBlackBorders;
+    mOutputVideoWidth = 0;
+    mOutputVideoHeight = 0;
+
+    LOGV("stopPreview() lastRenderedFrameTimeMs %ld", lastRenderedFrameTimeMs);
+    return lastRenderedFrameTimeMs;
+}
+
+M4OSA_ERR VideoEditorPreviewController::clearSurface(
+    const sp<Surface> &surface, VideoEditor_renderPreviewFrameStr* pFrameInfo) {
+
+    M4OSA_ERR err = M4NO_ERROR;
+    VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo;
+    M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0;
+    M4VIFI_ImagePlane planeOut[3];
+    LOGV("Inside preview clear frame");
+
+    Mutex::Autolock autoLock(mLock);
+
+    // Delete previous renderer instance
+    if(mTarget != NULL) {
+        delete mTarget;
+        mTarget = NULL;
+    }
+
+    outputBufferWidth = pFrameStr->uiFrameWidth;
+    outputBufferHeight = pFrameStr->uiFrameHeight;
+
+    // Initialize the renderer
+    if(mTarget == NULL) {
+
+        mTarget = PreviewRenderer::CreatePreviewRenderer(
+            OMX_COLOR_FormatYUV420Planar, surface, outputBufferWidth, outputBufferHeight,
+            outputBufferWidth, outputBufferHeight, 0);
+
+        if(mTarget == NULL) {
+            LOGE("renderPreviewFrame: cannot create PreviewRenderer");
+            return M4ERR_ALLOC;
+        }
+    }
+
+    // Out plane
+    uint8_t* outBuffer;
+    size_t outBufferStride = 0;
+
+    LOGV("doMediaRendering CALL getBuffer()");
+    mTarget->getBufferYV12(&outBuffer, &outBufferStride);
+
+    // Set the output YUV420 plane to be compatible with YV12 format
+    //In YV12 format, sizes must be even
+    M4OSA_UInt32 yv12PlaneWidth = ((outputBufferWidth +1)>>1)<<1;
+    M4OSA_UInt32 yv12PlaneHeight = ((outputBufferHeight+1)>>1)<<1;
+
+    prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight,
+     (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer);
+
+    /* Fill the surface with black frame */
+    memset((void *)planeOut[0].pac_data,0x00,planeOut[0].u_width *
+                            planeOut[0].u_height * 1.5);
+    memset((void *)planeOut[1].pac_data,128,planeOut[1].u_width *
+                            planeOut[1].u_height);
+    memset((void *)planeOut[2].pac_data,128,planeOut[2].u_width *
+                             planeOut[2].u_height);
+
+    mTarget->renderYV12();
+    return err;
+}
+
+M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(
+            const sp<Surface> &surface,
+            VideoEditor_renderPreviewFrameStr* pFrameInfo,
+            VideoEditorCurretEditInfo *pCurrEditInfo) {
+
+    M4OSA_ERR err = M4NO_ERROR;
+    M4OSA_UInt32 i = 0, iIncrementedDuration = 0, tnTimeMs=0, framesize =0;
+    VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo;
+    M4VIFI_UInt8 *pixelArray = NULL;
+    Mutex::Autolock autoLock(mLock);
+
+    if (pCurrEditInfo != NULL) {
+        pCurrEditInfo->overlaySettingsIndex = -1;
+    }
+    // Delete previous renderer instance
+    if(mTarget != NULL) {
+        delete mTarget;
+        mTarget = NULL;
+    }
+
+    if(mOutputVideoWidth == 0) {
+        mOutputVideoWidth = pFrameStr->uiFrameWidth;
+    }
+
+    if(mOutputVideoHeight == 0) {
+        mOutputVideoHeight = pFrameStr->uiFrameHeight;
+    }
+
+    // Initialize the renderer
+    if(mTarget == NULL) {
+        /*mTarget = new PreviewRenderer(
+            OMX_COLOR_FormatYUV420Planar, surface, mOutputVideoWidth, mOutputVideoHeight,
+            mOutputVideoWidth, mOutputVideoHeight, 0);*/
+
+         mTarget = PreviewRenderer::CreatePreviewRenderer(
+            OMX_COLOR_FormatYUV420Planar, surface, mOutputVideoWidth, mOutputVideoHeight,
+            mOutputVideoWidth, mOutputVideoHeight, 0);
+
+        if(mTarget == NULL) {
+            LOGE("renderPreviewFrame: cannot create PreviewRenderer");
+            return M4ERR_ALLOC;
+        }
+    }
+
+    pixelArray = NULL;
+
+    // Postprocessing (apply video effect)
+    if(pFrameStr->bApplyEffect == M4OSA_TRUE) {
+
+        for(i=0;i<mNumberEffects;i++) {
+            // First check if effect starttime matches the clip being previewed
+            if((mEffectsSettings[i].uiStartTime < pFrameStr->clipBeginCutTime)
+             ||(mEffectsSettings[i].uiStartTime >= pFrameStr->clipEndCutTime)) {
+                // This effect doesn't belong to this clip, check next one
+                continue;
+            }
+            if((mEffectsSettings[i].uiStartTime <= pFrameStr->timeMs) &&
+            ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >=
+             pFrameStr->timeMs) && (mEffectsSettings[i].uiDuration != 0)) {
+                setVideoEffectType(mEffectsSettings[i].VideoEffectType, TRUE);
+            }
+            else {
+                setVideoEffectType(mEffectsSettings[i].VideoEffectType, FALSE);
+            }
+        }
+
+        //Provide the overlay Update indication when there is an overlay effect
+        if (mCurrentVideoEffect & VIDEO_EFFECT_FRAMING) {
+            M4OSA_UInt32 index;
+            mCurrentVideoEffect &= ~VIDEO_EFFECT_FRAMING; //never apply framing here.
+
+            // Find the effect in effectSettings array
+            for (index = 0; index < mNumberEffects; index++) {
+                if(mEffectsSettings[index].VideoEffectType ==
+                    (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) {
+
+                    if((mEffectsSettings[index].uiStartTime <= pFrameInfo->timeMs) &&
+                        ((mEffectsSettings[index].uiStartTime+
+                        mEffectsSettings[index].uiDuration) >= pFrameInfo->timeMs))
+                    {
+                        break;
+                    }
+                }
+            }
+            if ((index < mNumberEffects) && (pCurrEditInfo != NULL)) {
+                pCurrEditInfo->overlaySettingsIndex = index;
+                LOGV("Framing index = %d", index);
+            } else {
+                LOGV("No framing effects found");
+            }
+        }
+
+        if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) {
+            err = applyVideoEffect((M4OSA_Void *)pFrameStr->pBuffer,
+             OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
+             pFrameStr->uiFrameHeight, pFrameStr->timeMs,
+             (M4OSA_Void *)pixelArray);
+
+            if(err != M4NO_ERROR) {
+                LOGE("renderPreviewFrame: applyVideoEffect error 0x%x", (unsigned int)err);
+                delete mTarget;
+                mTarget = NULL;
+                free(pixelArray);
+                pixelArray = NULL;
+                return err;
+           }
+           mCurrentVideoEffect = VIDEO_EFFECT_NONE;
+        }
+        else {
+            // Apply the rendering mode
+            err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer,
+             OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
+             pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray);
+
+            if(err != M4NO_ERROR) {
+                LOGE("renderPreviewFrame:doImageRenderingMode error 0x%x", (unsigned int)err);
+                delete mTarget;
+                mTarget = NULL;
+                free(pixelArray);
+                pixelArray = NULL;
+                return err;
+            }
+        }
+    }
+    else {
+        // Apply the rendering mode
+        err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer,
+         OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
+         pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray);
+
+        if(err != M4NO_ERROR) {
+            LOGE("renderPreviewFrame: doImageRenderingMode error 0x%x", (unsigned int)err);
+            delete mTarget;
+            mTarget = NULL;
+            free(pixelArray);
+            pixelArray = NULL;
+            return err;
+        }
+    }
+
+    mTarget->renderYV12();
+    return err;
+}
+
+M4OSA_Void VideoEditorPreviewController::setJniCallback(void* cookie,
+    jni_progress_callback_fct callbackFct) {
+    //LOGV("setJniCallback");
+    mJniCookie = cookie;
+    mJniCallback = callbackFct;
+}
+
+M4OSA_ERR VideoEditorPreviewController::preparePlayer(
+    void* param, int playerInstance, int index) {
+
+    M4OSA_ERR err = M4NO_ERROR;
+    VideoEditorPreviewController *pController =
+     (VideoEditorPreviewController *)param;
+
+    LOGV("preparePlayer: instance %d file %d", playerInstance, index);
+
+    pController->mVePlayer[playerInstance]->setDataSource(
+    (const char *)pController->mClipList[index]->pFile, NULL);
+    LOGV("preparePlayer: setDataSource instance %s",
+     (const char *)pController->mClipList[index]->pFile);
+
+    pController->mVePlayer[playerInstance]->setVideoSurface(
+     pController->mSurface);
+    LOGV("preparePlayer: setVideoSurface");
+
+    pController->mVePlayer[playerInstance]->setMediaRenderingMode(
+     pController->mClipList[index]->xVSS.MediaRendering,
+     pController->mOutputVideoSize);
+    LOGV("preparePlayer: setMediaRenderingMode");
+
+    if((M4OSA_UInt32)index == pController->mStartingClipIndex) {
+        pController->mVePlayer[playerInstance]->setPlaybackBeginTime(
+        pController->mFirstPreviewClipBeginTime);
+    }
+    else {
+        pController->mVePlayer[playerInstance]->setPlaybackBeginTime(
+        pController->mClipList[index]->uiBeginCutTime);
+    }
+    LOGV("preparePlayer: setPlaybackBeginTime(%d)",
+     pController->mClipList[index]->uiBeginCutTime);
+
+    pController->mVePlayer[playerInstance]->setPlaybackEndTime(
+     pController->mClipList[index]->uiEndCutTime);
+    LOGV("preparePlayer: setPlaybackEndTime(%d)",
+     pController->mClipList[index]->uiEndCutTime);
+
+    if(pController->mClipList[index]->FileType == M4VIDEOEDITING_kFileType_ARGB8888) {
+        pController->mVePlayer[playerInstance]->setImageClipProperties(
+                 pController->mClipList[index]->ClipProperties.uiVideoWidth,
+                 pController->mClipList[index]->ClipProperties.uiVideoHeight);
+        LOGV("preparePlayer: setImageClipProperties");
+    }
+
+    pController->mVePlayer[playerInstance]->prepare();
+    LOGV("preparePlayer: prepared");
+
+    if(pController->mClipList[index]->uiBeginCutTime > 0) {
+        pController->mVePlayer[playerInstance]->seekTo(
+         pController->mClipList[index]->uiBeginCutTime);
+
+        LOGV("preparePlayer: seekTo(%d)",
+         pController->mClipList[index]->uiBeginCutTime);
+    }
+    pController->mVePlayer[pController->mCurrentPlayer]->setAudioPlayer(pController->mVEAudioPlayer);
+
+    pController->mVePlayer[playerInstance]->readFirstVideoFrame();
+    LOGV("preparePlayer: readFirstVideoFrame of clip");
+
+    return err;
+}
+
+M4OSA_ERR VideoEditorPreviewController::threadProc(M4OSA_Void* param) {
+    M4OSA_ERR err = M4NO_ERROR;
+    M4OSA_Int32 index = 0;
+    VideoEditorPreviewController *pController =
+     (VideoEditorPreviewController *)param;
+
+    LOGV("inside threadProc");
+    if(pController->mPlayerState == VePlayerIdle) {
+        (pController->mCurrentClipNumber)++;
+
+        LOGV("threadProc: playing file index %d total clips %d",
+         pController->mCurrentClipNumber, pController->mNumberClipsToPreview);
+
+        if((M4OSA_UInt32)pController->mCurrentClipNumber >=
+         pController->mNumberClipsToPreview) {
+
+            LOGV("All clips previewed");
+
+            pController->mCurrentPlayedDuration = 0;
+            pController->mCurrentClipDuration = 0;
+            pController->mCurrentPlayer = 0;
+
+            if(pController->mPreviewLooping == M4OSA_TRUE) {
+                pController->mCurrentClipNumber =
+                 pController->mStartingClipIndex;
+
+                LOGV("Preview looping TRUE, restarting from clip index %d",
+                 pController->mCurrentClipNumber);
+
+                // Reset the story board timestamp inside the player
+                for (int playerInst=0; playerInst<NBPLAYER_INSTANCES;
+                 playerInst++) {
+                    pController->mVePlayer[playerInst]->resetJniCallbackTimeStamp();
+                }
+            }
+            else {
+                M4OSA_UInt32 endArgs = 0;
+                if(pController->mJniCallback != NULL) {
+                    pController->mJniCallback(
+                     pController->mJniCookie, MSG_TYPE_PREVIEW_END, &endArgs);
+                }
+                pController->mPlayerState = VePlayerAutoStop;
+
+                // Reset original begin cuttime of first previewed clip
+                pController->mClipList[pController->mStartingClipIndex]->uiBeginCutTime =
+                 pController->mFirstPreviewClipBeginTime;
+                // Reset original end cuttime of last previewed clip
+                pController->mClipList[pController->mNumberClipsToPreview-1]->uiEndCutTime =
+                 pController->mLastPreviewClipEndTime;
+
+                // Return a warning to M4OSA thread handler
+                // so that thread is moved from executing state to open state
+                return M4WAR_NO_MORE_STREAM;
+            }
+        }
+
+        index=pController->mCurrentClipNumber;
+        if((M4OSA_UInt32)pController->mCurrentClipNumber == pController->mStartingClipIndex) {
+            pController->mCurrentPlayedDuration +=
+             pController->mVideoStoryBoardTimeMsUptoFirstPreviewClip;
+
+            pController->mCurrentClipDuration =
+             pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
+              - pController->mFirstPreviewClipBeginTime;
+
+            preparePlayer((void*)pController, pController->mCurrentPlayer, index);
+        }
+        else {
+            pController->mCurrentPlayedDuration +=
+             pController->mCurrentClipDuration;
+
+            pController->mCurrentClipDuration =
+             pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime -
+             pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;
+        }
+
+        pController->mVePlayer[pController->mCurrentPlayer]->setStoryboardStartTime(
+         pController->mCurrentPlayedDuration);
+        LOGV("threadProc: setStoryboardStartTime");
+
+        // Set the next clip duration for Audio mix here
+        if((M4OSA_UInt32)pController->mCurrentClipNumber != pController->mStartingClipIndex) {
+
+            pController->mVePlayer[pController->mCurrentPlayer]->setAudioMixStoryBoardParam(
+             pController->mCurrentPlayedDuration,
+             pController->mClipList[index]->uiBeginCutTime,
+             pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage);
+
+            LOGV("threadProc: setAudioMixStoryBoardParam fromMS %d \
+             ClipBeginTime %d", pController->mCurrentPlayedDuration +
+             pController->mClipList[index]->uiBeginCutTime,
+             pController->mClipList[index]->uiBeginCutTime,
+             pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage);
+        }
+        // Capture the active player being used
+        pController->mActivePlayerIndex = pController->mCurrentPlayer;
+
+        pController->mVePlayer[pController->mCurrentPlayer]->start();
+        LOGV("threadProc: started");
+
+        pController->mPlayerState = VePlayerBusy;
+
+    } else if(pController->mPlayerState == VePlayerAutoStop) {
+        LOGV("Preview completed..auto stop the player");
+    } else if ((pController->mPlayerState == VePlayerBusy) && (pController->mPrepareReqest)) {
+        // Prepare the player here
+        pController->mPrepareReqest = M4OSA_FALSE;
+        preparePlayer((void*)pController, pController->mCurrentPlayer,
+            pController->mCurrentClipNumber+1);
+        if (pController->mSemThreadWait != NULL) {
+            err = M4OSA_semaphoreWait(pController->mSemThreadWait,
+                M4OSA_WAIT_FOREVER);
+        }
+    } else {
+        if (!pController->bStopThreadInProgress) {
+            LOGV("threadProc: state busy...wait for sem");
+            if (pController->mSemThreadWait != NULL) {
+                err = M4OSA_semaphoreWait(pController->mSemThreadWait,
+                 M4OSA_WAIT_FOREVER);
+             }
+        }
+        LOGV("threadProc: sem wait returned err = 0x%x", err);
+    }
+
+    //Always return M4NO_ERROR to ensure the thread keeps running
+    return M4NO_ERROR;
+}
+
+void VideoEditorPreviewController::notify(
+    void* cookie, int msg, int ext1, int ext2)
+{
+    VideoEditorPreviewController *pController =
+     (VideoEditorPreviewController *)cookie;
+
+    M4OSA_ERR err = M4NO_ERROR;
+    uint32_t clipDuration = 0;
+    switch (msg) {
+        case MEDIA_NOP: // interface test message
+            LOGV("MEDIA_NOP");
+            break;
+        case MEDIA_PREPARED:
+            LOGV("MEDIA_PREPARED");
+            break;
+        case MEDIA_PLAYBACK_COMPLETE:
+        {
+            LOGV("notify:MEDIA_PLAYBACK_COMPLETE");
+            pController->mPlayerState = VePlayerIdle;
+
+            //send progress callback with last frame timestamp
+            if((M4OSA_UInt32)pController->mCurrentClipNumber ==
+             pController->mStartingClipIndex) {
+                clipDuration =
+                 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
+                  - pController->mFirstPreviewClipBeginTime;
+            }
+            else {
+                clipDuration =
+                 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
+                  - pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;
+            }
+
+            M4OSA_UInt32 playedDuration = clipDuration+pController->mCurrentPlayedDuration;
+            pController->mJniCallback(
+                 pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION,
+                 &playedDuration);
+
+            if ((pController->mOverlayState == OVERLAY_UPDATE) &&
+                ((M4OSA_UInt32)pController->mCurrentClipNumber !=
+                (pController->mNumberClipsToPreview-1))) {
+                VideoEditorCurretEditInfo *pEditInfo =
+                    (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo),
+                    M4VS, (M4OSA_Char*)"Current Edit info");
+                pEditInfo->overlaySettingsIndex = ext2;
+                pEditInfo->clipIndex = pController->mCurrentClipNumber;
+                pController->mOverlayState == OVERLAY_CLEAR;
+                if (pController->mJniCallback != NULL) {
+                        pController->mJniCallback(pController->mJniCookie,
+                            MSG_TYPE_OVERLAY_CLEAR, pEditInfo);
+                }
+                free(pEditInfo);
+            }
+            {
+                Mutex::Autolock autoLock(pController->mLockSem);
+                if (pController->mSemThreadWait != NULL) {
                     M4OSA_semaphorePost(pController->mSemThreadWait);
                     return;
-                }

-            }

-

-            break;

-        }

-        case MEDIA_ERROR:

-        {

-            int err_val = ext1;

-          // Always log errors.

-          // ext1: Media framework error code.

-          // ext2: Implementation dependant error code.

-            LOGE("MEDIA_ERROR; error (%d, %d)", ext1, ext2);

-            if(pController->mJniCallback != NULL) {

-                pController->mJniCallback(pController->mJniCookie,

-                 MSG_TYPE_PLAYER_ERROR, &err_val);

-            }

-            break;

-        }

-        case MEDIA_INFO:

-        {

-            int info_val = ext2;

-            // ext1: Media framework error code.

-            // ext2: Implementation dependant error code.

-            //LOGW("MEDIA_INFO; info/warning (%d, %d)", ext1, ext2);

-            if(pController->mJniCallback != NULL) {

-                pController->mJniCallback(pController->mJniCookie,

-                 MSG_TYPE_PROGRESS_INDICATION, &info_val);

-            }

-            break;

-        }

-        case MEDIA_SEEK_COMPLETE:

-            LOGV("MEDIA_SEEK_COMPLETE; Received seek complete");

-            break;

-        case MEDIA_BUFFERING_UPDATE:

-            LOGV("MEDIA_BUFFERING_UPDATE; buffering %d", ext1);

-            break;

-        case MEDIA_SET_VIDEO_SIZE:

-            LOGV("MEDIA_SET_VIDEO_SIZE; New video size %d x %d", ext1, ext2);

-            break;

-        case 0xAAAAAAAA:

-            LOGV("VIDEO PLAYBACK ALMOST over, prepare next player");

-            // Select next player and prepare it

-            // If there is a clip after this one

-            if ((M4OSA_UInt32)(pController->mCurrentClipNumber+1) <

-             pController->mNumberClipsToPreview) {

-                pController->mPrepareReqest = M4OSA_TRUE;

-                pController->mCurrentPlayer++;

-                if (pController->mCurrentPlayer >= NBPLAYER_INSTANCES) {

-                    pController->mCurrentPlayer = 0;

-                }

-                // Prepare the first clip to be played

-                {

-                    Mutex::Autolock autoLock(pController->mLockSem);

-                    if (pController->mSemThreadWait != NULL) {

-                        M4OSA_semaphorePost(pController->mSemThreadWait);

-                    }

-                }

-            }

-            break;

-        case 0xBBBBBBBB:

-        {

-            LOGV("VIDEO PLAYBACK, Update Overlay");

-            int overlayIndex = ext2;

-            VideoEditorCurretEditInfo *pEditInfo =

-                    (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo),

-                    M4VS, (M4OSA_Char*)"Current Edit info");

-            //ext1 = 1; start the overlay display

-            //     = 2; Clear the overlay.

-            pEditInfo->overlaySettingsIndex = ext2;

-            pEditInfo->clipIndex = pController->mCurrentClipNumber;

-            LOGV("pController->mCurrentClipNumber = %d",pController->mCurrentClipNumber);

-            if (pController->mJniCallback != NULL) {

-                if (ext1 == 1) {

-                    pController->mOverlayState = OVERLAY_UPDATE;

-                    pController->mJniCallback(pController->mJniCookie,

-                        MSG_TYPE_OVERLAY_UPDATE, pEditInfo);

-                } else {

-                    pController->mOverlayState = OVERLAY_CLEAR;

-                    pController->mJniCallback(pController->mJniCookie,

-                        MSG_TYPE_OVERLAY_CLEAR, pEditInfo);

-                }

-            }

-            free(pEditInfo);

-            break;

-        }

-        default:

-            LOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);

-            break;

-    }

-}

-

-void VideoEditorPreviewController::setVideoEffectType(

-    M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) {

-

-    M4OSA_UInt32 effect = VIDEO_EFFECT_NONE;

-

-    // map M4VSS3GPP_VideoEffectType to local enum

-    switch(type) {

-        case M4VSS3GPP_kVideoEffectType_FadeFromBlack:

-            effect = VIDEO_EFFECT_FADEFROMBLACK;

-            break;

-

-        case M4VSS3GPP_kVideoEffectType_FadeToBlack:

-            effect = VIDEO_EFFECT_FADETOBLACK;

-            break;

-

-        case M4VSS3GPP_kVideoEffectType_CurtainOpening:

-            effect = VIDEO_EFFECT_CURTAINOPEN;

-            break;

-

-        case M4VSS3GPP_kVideoEffectType_CurtainClosing:

-            effect = VIDEO_EFFECT_CURTAINCLOSE;

-            break;

-

-        case M4xVSS_kVideoEffectType_BlackAndWhite:

-            effect = VIDEO_EFFECT_BLACKANDWHITE;

-            break;

-

-        case M4xVSS_kVideoEffectType_Pink:

-            effect = VIDEO_EFFECT_PINK;

-            break;

-

-        case M4xVSS_kVideoEffectType_Green:

-            effect = VIDEO_EFFECT_GREEN;

-            break;

-

-        case M4xVSS_kVideoEffectType_Sepia:

-            effect = VIDEO_EFFECT_SEPIA;

-            break;

-

-        case M4xVSS_kVideoEffectType_Negative:

-            effect = VIDEO_EFFECT_NEGATIVE;

-            break;

-

-        case M4xVSS_kVideoEffectType_Framing:

-            effect = VIDEO_EFFECT_FRAMING;

-            break;

-

-        case M4xVSS_kVideoEffectType_Fifties:

-            effect = VIDEO_EFFECT_FIFTIES;

-            break;

-

-        case M4xVSS_kVideoEffectType_ColorRGB16:

-            effect = VIDEO_EFFECT_COLOR_RGB16;

-            break;

-

-        case M4xVSS_kVideoEffectType_Gradient:

-            effect = VIDEO_EFFECT_GRADIENT;

-            break;

-

-        default:

-            effect = VIDEO_EFFECT_NONE;

-            break;

-    }

-

-    if(enable == M4OSA_TRUE) {

-        // If already set, then no need to set again

-        if(!(mCurrentVideoEffect & effect))

-            mCurrentVideoEffect |= effect;

-            if(effect == VIDEO_EFFECT_FIFTIES) {

-                mIsFiftiesEffectStarted = true;

-            }

-    }

-    else  {

-        // Reset only if already set

-        if(mCurrentVideoEffect & effect)

-            mCurrentVideoEffect &= ~effect;

-    }

-

-    return;

-}

-

-

-M4OSA_ERR VideoEditorPreviewController::applyVideoEffect(

-    M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,

-    M4OSA_UInt32 videoHeight, M4OSA_UInt32 timeMs, M4OSA_Void* outPtr) {

-

-    M4OSA_ERR err = M4NO_ERROR;

-    vePostProcessParams postProcessParams;

-

-    postProcessParams.vidBuffer = (M4VIFI_UInt8*)dataPtr;

-    postProcessParams.videoWidth = videoWidth;

-    postProcessParams.videoHeight = videoHeight;

-    postProcessParams.timeMs = timeMs;

-    postProcessParams.timeOffset = 0; //Since timeMS already takes care of offset in this case

-    postProcessParams.effectsSettings = mEffectsSettings;

-    postProcessParams.numberEffects = mNumberEffects;

-    postProcessParams.outVideoWidth = mOutputVideoWidth;

-    postProcessParams.outVideoHeight = mOutputVideoHeight;

-    postProcessParams.currentVideoEffect = mCurrentVideoEffect;

-    postProcessParams.renderingMode = mRenderingMode;

-    if(mIsFiftiesEffectStarted == M4OSA_TRUE) {

-        postProcessParams.isFiftiesEffectStarted = M4OSA_TRUE;

-        mIsFiftiesEffectStarted = M4OSA_FALSE;

-    }

-    else {

-       postProcessParams.isFiftiesEffectStarted = M4OSA_FALSE;

-    }

-    //postProcessParams.renderer = mTarget;

-    postProcessParams.overlayFrameRGBBuffer = NULL;

-    postProcessParams.overlayFrameYUVBuffer = NULL;

-

-    mTarget->getBufferYV12(&(postProcessParams.pOutBuffer), &(postProcessParams.outBufferStride));

-

-    err = applyEffectsAndRenderingMode(&postProcessParams, videoWidth, videoHeight);

-    return err;

-}

-

-M4OSA_ERR VideoEditorPreviewController::setPreviewFrameRenderingMode(

-    M4xVSS_MediaRendering mode, M4VIDEOEDITING_VideoFrameSize outputVideoSize) {

-

-    LOGV("setMediaRenderingMode: outputVideoSize = %d", outputVideoSize);

-    mRenderingMode = mode;

-

-    switch(outputVideoSize) {

-        case M4VIDEOEDITING_kSQCIF:

-            mOutputVideoWidth = 128;

-            mOutputVideoHeight = 96;

-            break;

-

-        case M4VIDEOEDITING_kQQVGA:

-            mOutputVideoWidth = 160;

-            mOutputVideoHeight = 120;

-            break;

-

-        case M4VIDEOEDITING_kQCIF:

-            mOutputVideoWidth = 176;

-            mOutputVideoHeight = 144;

-            break;

-

-        case M4VIDEOEDITING_kQVGA:

-            mOutputVideoWidth = 320;

-            mOutputVideoHeight = 240;

-            break;

-

-        case M4VIDEOEDITING_kCIF:

-            mOutputVideoWidth = 352;

-            mOutputVideoHeight = 288;

-            break;

-

-        case M4VIDEOEDITING_kVGA:

-            mOutputVideoWidth = 640;

-            mOutputVideoHeight = 480;

-            break;

-

-        case M4VIDEOEDITING_kWVGA:

-            mOutputVideoWidth = 800;

-            mOutputVideoHeight = 480;

-            break;

-

-        case M4VIDEOEDITING_kNTSC:

-            mOutputVideoWidth = 720;

-            mOutputVideoHeight = 480;

-            break;

-

-        case M4VIDEOEDITING_k640_360:

-            mOutputVideoWidth = 640;

-            mOutputVideoHeight = 360;

-            break;

-

-        case M4VIDEOEDITING_k854_480:

-            mOutputVideoWidth = 854;

-            mOutputVideoHeight = 480;

-            break;

-

-        case M4VIDEOEDITING_kHD1280:

-            mOutputVideoWidth = 1280;

-            mOutputVideoHeight = 720;

-            break;

-

-        case M4VIDEOEDITING_kHD1080:

-            mOutputVideoWidth = 1080;

-            mOutputVideoHeight = 720;

-            break;

-

-        case M4VIDEOEDITING_kHD960:

-            mOutputVideoWidth = 960;

-            mOutputVideoHeight = 720;

-            break;

-

-        default:

-            mOutputVideoWidth = 0;

-            mOutputVideoHeight = 0;

-            break;

-    }

-

-    return OK;

-}

-

-M4OSA_ERR VideoEditorPreviewController::doImageRenderingMode(

-    M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,

-    M4OSA_UInt32 videoHeight, M4OSA_Void* outPtr) {

-

-    M4OSA_ERR err = M4NO_ERROR;

-    M4VIFI_ImagePlane planeIn[3], planeOut[3];

-    M4VIFI_UInt8 *inBuffer = M4OSA_NULL;

-    M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0;

-

-    //frameSize = (videoWidth*videoHeight*3) >> 1;

-    inBuffer = (M4OSA_UInt8 *)dataPtr;

-

-    // In plane

-    prepareYUV420ImagePlane(planeIn, videoWidth,

-      videoHeight, (M4VIFI_UInt8 *)inBuffer, videoWidth, videoHeight);

-

-    outputBufferWidth = mOutputVideoWidth;

-    outputBufferHeight = mOutputVideoHeight;

-

-    // Out plane

-    uint8_t* outBuffer;

-    size_t outBufferStride = 0;

-

-    LOGV("doMediaRendering CALL getBuffer()");

-    mTarget->getBufferYV12(&outBuffer, &outBufferStride);

-

-    // Set the output YUV420 plane to be compatible with YV12 format

-    //In YV12 format, sizes must be even

-    M4OSA_UInt32 yv12PlaneWidth = ((mOutputVideoWidth +1)>>1)<<1;

-    M4OSA_UInt32 yv12PlaneHeight = ((mOutputVideoHeight+1)>>1)<<1;

-

-    prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight,

-     (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer);

-

-    err = applyRenderingMode(planeIn, planeOut, mRenderingMode);

-    if(err != M4NO_ERROR) {

-        LOGE("doImageRenderingMode: applyRenderingMode returned err=0x%x", (unsigned int)err);

-    }

-    return err;

-}

-

-} //namespace android

+                }
+            }
+
+            break;
+        }
+        case MEDIA_ERROR:
+        {
+            int err_val = ext1;
+          // Always log errors.
+          // ext1: Media framework error code.
+          // ext2: Implementation dependant error code.
+            LOGE("MEDIA_ERROR; error (%d, %d)", ext1, ext2);
+            if(pController->mJniCallback != NULL) {
+                pController->mJniCallback(pController->mJniCookie,
+                 MSG_TYPE_PLAYER_ERROR, &err_val);
+            }
+            break;
+        }
+        case MEDIA_INFO:
+        {
+            int info_val = ext2;
+            // ext1: Media framework error code.
+            // ext2: Implementation dependant error code.
+            //LOGW("MEDIA_INFO; info/warning (%d, %d)", ext1, ext2);
+            if(pController->mJniCallback != NULL) {
+                pController->mJniCallback(pController->mJniCookie,
+                 MSG_TYPE_PROGRESS_INDICATION, &info_val);
+            }
+            break;
+        }
+        case MEDIA_SEEK_COMPLETE:
+            LOGV("MEDIA_SEEK_COMPLETE; Received seek complete");
+            break;
+        case MEDIA_BUFFERING_UPDATE:
+            LOGV("MEDIA_BUFFERING_UPDATE; buffering %d", ext1);
+            break;
+        case MEDIA_SET_VIDEO_SIZE:
+            LOGV("MEDIA_SET_VIDEO_SIZE; New video size %d x %d", ext1, ext2);
+            break;
+        case 0xAAAAAAAA:
+            LOGV("VIDEO PLAYBACK ALMOST over, prepare next player");
+            // Select next player and prepare it
+            // If there is a clip after this one
+            if ((M4OSA_UInt32)(pController->mCurrentClipNumber+1) <
+             pController->mNumberClipsToPreview) {
+                pController->mPrepareReqest = M4OSA_TRUE;
+                pController->mCurrentPlayer++;
+                if (pController->mCurrentPlayer >= NBPLAYER_INSTANCES) {
+                    pController->mCurrentPlayer = 0;
+                }
+                // Prepare the first clip to be played
+                {
+                    Mutex::Autolock autoLock(pController->mLockSem);
+                    if (pController->mSemThreadWait != NULL) {
+                        M4OSA_semaphorePost(pController->mSemThreadWait);
+                    }
+                }
+            }
+            break;
+        case 0xBBBBBBBB:
+        {
+            LOGV("VIDEO PLAYBACK, Update Overlay");
+            int overlayIndex = ext2;
+            VideoEditorCurretEditInfo *pEditInfo =
+                    (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo),
+                    M4VS, (M4OSA_Char*)"Current Edit info");
+            //ext1 = 1; start the overlay display
+            //     = 2; Clear the overlay.
+            pEditInfo->overlaySettingsIndex = ext2;
+            pEditInfo->clipIndex = pController->mCurrentClipNumber;
+            LOGV("pController->mCurrentClipNumber = %d",pController->mCurrentClipNumber);
+            if (pController->mJniCallback != NULL) {
+                if (ext1 == 1) {
+                    pController->mOverlayState = OVERLAY_UPDATE;
+                    pController->mJniCallback(pController->mJniCookie,
+                        MSG_TYPE_OVERLAY_UPDATE, pEditInfo);
+                } else {
+                    pController->mOverlayState = OVERLAY_CLEAR;
+                    pController->mJniCallback(pController->mJniCookie,
+                        MSG_TYPE_OVERLAY_CLEAR, pEditInfo);
+                }
+            }
+            free(pEditInfo);
+            break;
+        }
+        default:
+            LOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);
+            break;
+    }
+}
+
+void VideoEditorPreviewController::setVideoEffectType(
+    M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) {
+
+    M4OSA_UInt32 effect = VIDEO_EFFECT_NONE;
+
+    // map M4VSS3GPP_VideoEffectType to local enum
+    switch(type) {
+        case M4VSS3GPP_kVideoEffectType_FadeFromBlack:
+            effect = VIDEO_EFFECT_FADEFROMBLACK;
+            break;
+
+        case M4VSS3GPP_kVideoEffectType_FadeToBlack:
+            effect = VIDEO_EFFECT_FADETOBLACK;
+            break;
+
+        case M4VSS3GPP_kVideoEffectType_CurtainOpening:
+            effect = VIDEO_EFFECT_CURTAINOPEN;
+            break;
+
+        case M4VSS3GPP_kVideoEffectType_CurtainClosing:
+            effect = VIDEO_EFFECT_CURTAINCLOSE;
+            break;
+
+        case M4xVSS_kVideoEffectType_BlackAndWhite:
+            effect = VIDEO_EFFECT_BLACKANDWHITE;
+            break;
+
+        case M4xVSS_kVideoEffectType_Pink:
+            effect = VIDEO_EFFECT_PINK;
+            break;
+
+        case M4xVSS_kVideoEffectType_Green:
+            effect = VIDEO_EFFECT_GREEN;
+            break;
+
+        case M4xVSS_kVideoEffectType_Sepia:
+            effect = VIDEO_EFFECT_SEPIA;
+            break;
+
+        case M4xVSS_kVideoEffectType_Negative:
+            effect = VIDEO_EFFECT_NEGATIVE;
+            break;
+
+        case M4xVSS_kVideoEffectType_Framing:
+            effect = VIDEO_EFFECT_FRAMING;
+            break;
+
+        case M4xVSS_kVideoEffectType_Fifties:
+            effect = VIDEO_EFFECT_FIFTIES;
+            break;
+
+        case M4xVSS_kVideoEffectType_ColorRGB16:
+            effect = VIDEO_EFFECT_COLOR_RGB16;
+            break;
+
+        case M4xVSS_kVideoEffectType_Gradient:
+            effect = VIDEO_EFFECT_GRADIENT;
+            break;
+
+        default:
+            effect = VIDEO_EFFECT_NONE;
+            break;
+    }
+
+    if(enable == M4OSA_TRUE) {
+        // If already set, then no need to set again
+        if(!(mCurrentVideoEffect & effect))
+            mCurrentVideoEffect |= effect;
+            if(effect == VIDEO_EFFECT_FIFTIES) {
+                mIsFiftiesEffectStarted = true;
+            }
+    }
+    else  {
+        // Reset only if already set
+        if(mCurrentVideoEffect & effect)
+            mCurrentVideoEffect &= ~effect;
+    }
+
+    return;
+}
+
+
+M4OSA_ERR VideoEditorPreviewController::applyVideoEffect(
+    M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,
+    M4OSA_UInt32 videoHeight, M4OSA_UInt32 timeMs, M4OSA_Void* outPtr) {
+
+    M4OSA_ERR err = M4NO_ERROR;
+    vePostProcessParams postProcessParams;
+
+    postProcessParams.vidBuffer = (M4VIFI_UInt8*)dataPtr;
+    postProcessParams.videoWidth = videoWidth;
+    postProcessParams.videoHeight = videoHeight;
+    postProcessParams.timeMs = timeMs;
+    postProcessParams.timeOffset = 0; //Since timeMS already takes care of offset in this case
+    postProcessParams.effectsSettings = mEffectsSettings;
+    postProcessParams.numberEffects = mNumberEffects;
+    postProcessParams.outVideoWidth = mOutputVideoWidth;
+    postProcessParams.outVideoHeight = mOutputVideoHeight;
+    postProcessParams.currentVideoEffect = mCurrentVideoEffect;
+    postProcessParams.renderingMode = mRenderingMode;
+    if(mIsFiftiesEffectStarted == M4OSA_TRUE) {
+        postProcessParams.isFiftiesEffectStarted = M4OSA_TRUE;
+        mIsFiftiesEffectStarted = M4OSA_FALSE;
+    }
+    else {
+       postProcessParams.isFiftiesEffectStarted = M4OSA_FALSE;
+    }
+    //postProcessParams.renderer = mTarget;
+    postProcessParams.overlayFrameRGBBuffer = NULL;
+    postProcessParams.overlayFrameYUVBuffer = NULL;
+
+    mTarget->getBufferYV12(&(postProcessParams.pOutBuffer), &(postProcessParams.outBufferStride));
+
+    err = applyEffectsAndRenderingMode(&postProcessParams, videoWidth, videoHeight);
+    return err;
+}
+
+M4OSA_ERR VideoEditorPreviewController::setPreviewFrameRenderingMode(
+    M4xVSS_MediaRendering mode, M4VIDEOEDITING_VideoFrameSize outputVideoSize) {
+
+    LOGV("setMediaRenderingMode: outputVideoSize = %d", outputVideoSize);
+    mRenderingMode = mode;
+
+    switch(outputVideoSize) {
+        case M4VIDEOEDITING_kSQCIF:
+            mOutputVideoWidth = 128;
+            mOutputVideoHeight = 96;
+            break;
+
+        case M4VIDEOEDITING_kQQVGA:
+            mOutputVideoWidth = 160;
+            mOutputVideoHeight = 120;
+            break;
+
+        case M4VIDEOEDITING_kQCIF:
+            mOutputVideoWidth = 176;
+            mOutputVideoHeight = 144;
+            break;
+
+        case M4VIDEOEDITING_kQVGA:
+            mOutputVideoWidth = 320;
+            mOutputVideoHeight = 240;
+            break;
+
+        case M4VIDEOEDITING_kCIF:
+            mOutputVideoWidth = 352;
+            mOutputVideoHeight = 288;
+            break;
+
+        case M4VIDEOEDITING_kVGA:
+            mOutputVideoWidth = 640;
+            mOutputVideoHeight = 480;
+            break;
+
+        case M4VIDEOEDITING_kWVGA:
+            mOutputVideoWidth = 800;
+            mOutputVideoHeight = 480;
+            break;
+
+        case M4VIDEOEDITING_kNTSC:
+            mOutputVideoWidth = 720;
+            mOutputVideoHeight = 480;
+            break;
+
+        case M4VIDEOEDITING_k640_360:
+            mOutputVideoWidth = 640;
+            mOutputVideoHeight = 360;
+            break;
+
+        case M4VIDEOEDITING_k854_480:
+            mOutputVideoWidth = 854;
+            mOutputVideoHeight = 480;
+            break;
+
+        case M4VIDEOEDITING_kHD1280:
+            mOutputVideoWidth = 1280;
+            mOutputVideoHeight = 720;
+            break;
+
+        case M4VIDEOEDITING_kHD1080:
+            mOutputVideoWidth = 1080;
+            mOutputVideoHeight = 720;
+            break;
+
+        case M4VIDEOEDITING_kHD960:
+            mOutputVideoWidth = 960;
+            mOutputVideoHeight = 720;
+            break;
+
+        default:
+            mOutputVideoWidth = 0;
+            mOutputVideoHeight = 0;
+            break;
+    }
+
+    return OK;
+}
+
+M4OSA_ERR VideoEditorPreviewController::doImageRenderingMode(
+    M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,
+    M4OSA_UInt32 videoHeight, M4OSA_Void* outPtr) {
+
+    M4OSA_ERR err = M4NO_ERROR;
+    M4VIFI_ImagePlane planeIn[3], planeOut[3];
+    M4VIFI_UInt8 *inBuffer = M4OSA_NULL;
+    M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0;
+
+    //frameSize = (videoWidth*videoHeight*3) >> 1;
+    inBuffer = (M4OSA_UInt8 *)dataPtr;
+
+    // In plane
+    prepareYUV420ImagePlane(planeIn, videoWidth,
+      videoHeight, (M4VIFI_UInt8 *)inBuffer, videoWidth, videoHeight);
+
+    outputBufferWidth = mOutputVideoWidth;
+    outputBufferHeight = mOutputVideoHeight;
+
+    // Out plane
+    uint8_t* outBuffer;
+    size_t outBufferStride = 0;
+
+    LOGV("doMediaRendering CALL getBuffer()");
+    mTarget->getBufferYV12(&outBuffer, &outBufferStride);
+
+    // Set the output YUV420 plane to be compatible with YV12 format
+    //In YV12 format, sizes must be even
+    M4OSA_UInt32 yv12PlaneWidth = ((mOutputVideoWidth +1)>>1)<<1;
+    M4OSA_UInt32 yv12PlaneHeight = ((mOutputVideoHeight+1)>>1)<<1;
+
+    prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight,
+     (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer);
+
+    err = applyRenderingMode(planeIn, planeOut, mRenderingMode);
+    if(err != M4NO_ERROR) {
+        LOGE("doImageRenderingMode: applyRenderingMode returned err=0x%x", (unsigned int)err);
+    }
+    return err;
+}
+
+} //namespace android