19969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*
29969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Copyright (C) 2011 The Android Open Source Project
39969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
49969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License");
59969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * you may not use this file except in compliance with the License.
69969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * You may obtain a copy of the License at
79969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
89969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *      http://www.apache.org/licenses/LICENSE-2.0
99969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software
119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS,
129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * See the License for the specific language governing permissions and
149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * limitations under the License.
159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */
169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
173d2d40ac83acbda8c161cae675c372595efd640eJames Dong// #define LOG_NDEBUG 0
183d2d40ac83acbda8c161cae675c372595efd640eJames Dong#define LOG_TAG "PreviewController"
193d2d40ac83acbda8c161cae675c372595efd640eJames Dong#include <utils/Log.h>
203d2d40ac83acbda8c161cae675c372595efd640eJames Dong
2190b6191067990a7a3ee947d7ce08c64f780f0de7Mathias Agopian#include <gui/Surface.h>
223d2d40ac83acbda8c161cae675c372595efd640eJames Dong
233d2d40ac83acbda8c161cae675c372595efd640eJames Dong#include "VideoEditorAudioPlayer.h"
243d2d40ac83acbda8c161cae675c372595efd640eJames Dong#include "PreviewRenderer.h"
253d2d40ac83acbda8c161cae675c372595efd640eJames Dong#include "M4OSA_Semaphore.h"
263d2d40ac83acbda8c161cae675c372595efd640eJames Dong#include "M4OSA_Thread.h"
279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "VideoEditorPreviewController.h"
289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changnamespace android {
309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangVideoEditorPreviewController::VideoEditorPreviewController()
339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    : mCurrentPlayer(0),
349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mThreadContext(NULL),
359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mPlayerState(VePlayerIdle),
369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mPrepareReqest(M4OSA_FALSE),
379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mClipList(NULL),
389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mNumberClipsInStoryBoard(0),
399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mNumberClipsToPreview(0),
409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mStartingClipIndex(0),
419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mPreviewLooping(M4OSA_FALSE),
429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mCallBackAfterFrameCnt(0),
439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mEffectsSettings(NULL),
449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mNumberEffects(0),
459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mCurrentClipNumber(-1),
469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mClipTotalDuration(0),
479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mCurrentVideoEffect(VIDEO_EFFECT_NONE),
489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mBackgroundAudioSetting(NULL),
499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mAudioMixPCMFileHandle(NULL),
509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mTarget(NULL),
519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mJniCookie(NULL),
529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mJniCallback(NULL),
539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mCurrentPlayedDuration(0),
549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mCurrentClipDuration(0),
559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mVideoStoryBoardTimeMsUptoFirstPreviewClip(0),
569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mOverlayState(OVERLAY_CLEAR),
579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mActivePlayerIndex(0),
589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mOutputVideoWidth(0),
599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mOutputVideoHeight(0),
609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      bStopThreadInProgress(false),
619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      mSemThreadWait(NULL) {
622703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("VideoEditorPreviewController");
639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mRenderingMode = M4xVSS_kBlackBorders;
649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mIsFiftiesEffectStarted = false;
659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
663d2d40ac83acbda8c161cae675c372595efd640eJames Dong    for (int i = 0; i < kTotalNumPlayerInstances; ++i) {
679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mVePlayer[i] = NULL;
689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangVideoEditorPreviewController::~VideoEditorPreviewController() {
723d2d40ac83acbda8c161cae675c372595efd640eJames Dong    ALOGV("~VideoEditorPreviewController");
739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 i = 0;
749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Stop the thread if its still running
779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mThreadContext != NULL) {
789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        err = M4OSA_threadSyncStop(mThreadContext);
799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(err != M4NO_ERROR) {
802703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("~VideoEditorPreviewController: error 0x%x \
819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            in trying to stop thread", err);
829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // Continue even if error
839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        err = M4OSA_threadSyncClose(mThreadContext);
869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(err != M4NO_ERROR) {
87f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("~VideoEditorPreviewController: error 0x%x \
889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            in trying to close thread", (unsigned int) err);
899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // Continue even if error
909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mThreadContext = NULL;
939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
953d2d40ac83acbda8c161cae675c372595efd640eJames Dong    for (int playerInst=0; playerInst<kTotalNumPlayerInstances;
969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         playerInst++) {
979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(mVePlayer[playerInst] != NULL) {
982703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("clearing mVePlayer %d", playerInst);
999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mVePlayer[playerInst].clear();
1009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
1019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
1029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mClipList != NULL) {
1049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Clean up
1059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        for(i=0;i<mNumberClipsInStoryBoard;i++)
1069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        {
1079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(mClipList[i]->pFile != NULL) {
1089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                free(mClipList[i]->pFile);
1099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mClipList[i]->pFile = NULL;
1109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
1119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            free(mClipList[i]);
1139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
1149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        free(mClipList);
1159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mClipList = NULL;
1169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
1179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mEffectsSettings) {
1199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        for(i=0;i<mNumberEffects;i++) {
1209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(mEffectsSettings[i].xVSS.pFramingBuffer != NULL) {
1219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                free(mEffectsSettings[i].xVSS.pFramingBuffer->pac_data);
1229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                free(mEffectsSettings[i].xVSS.pFramingBuffer);
1249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
1269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
1279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
1289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        free(mEffectsSettings);
1299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mEffectsSettings = NULL;
1309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
1319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mAudioMixPCMFileHandle) {
1339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        err = M4OSA_fileReadClose (mAudioMixPCMFileHandle);
1349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mAudioMixPCMFileHandle = M4OSA_NULL;
1359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
1369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mBackgroundAudioSetting != NULL) {
1389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        free(mBackgroundAudioSetting);
1399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mBackgroundAudioSetting = NULL;
1409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
1419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mTarget != NULL) {
1439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        delete mTarget;
1449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mTarget = NULL;
1459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
1469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mOverlayState = OVERLAY_CLEAR;
1489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1492703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("~VideoEditorPreviewController returns");
1509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
1519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR VideoEditorPreviewController::loadEditSettings(
1539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VSS3GPP_EditSettings* pSettings,M4xVSS_AudioMixingSettings* bgmSettings) {
1549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 i = 0, iClipDuration = 0, rgbSize = 0;
1569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_UInt8 *tmp = NULL;
1579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
1589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1592703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("loadEditSettings");
1602703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("loadEditSettings Channels = %d, sampling Freq %d",
1619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang          bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency  );
1629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang          bgmSettings->uiSamplingFrequency = 32000;
1639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1642703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("loadEditSettings Channels = %d, sampling Freq %d",
1659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang          bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency  );
1669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    Mutex::Autolock autoLock(mLock);
1679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Clean up any previous Edit settings before loading new ones
1699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mCurrentVideoEffect = VIDEO_EFFECT_NONE;
1709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mAudioMixPCMFileHandle) {
1729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        err = M4OSA_fileReadClose (mAudioMixPCMFileHandle);
1739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mAudioMixPCMFileHandle = M4OSA_NULL;
1749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
1759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mBackgroundAudioSetting != NULL) {
1779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        free(mBackgroundAudioSetting);
1789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mBackgroundAudioSetting = NULL;
1799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
1809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mClipList != NULL) {
1829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Clean up
1839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        for(i=0;i<mNumberClipsInStoryBoard;i++)
1849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        {
1859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(mClipList[i]->pFile != NULL) {
1869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                free(mClipList[i]->pFile);
1879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mClipList[i]->pFile = NULL;
1889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
1899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            free(mClipList[i]);
1919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
1929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        free(mClipList);
1939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mClipList = NULL;
1949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
1959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mEffectsSettings) {
1979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        for(i=0;i<mNumberEffects;i++) {
1989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(mEffectsSettings[i].xVSS.pFramingBuffer != NULL) {
1999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                free(mEffectsSettings[i].xVSS.pFramingBuffer->pac_data);
2009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                free(mEffectsSettings[i].xVSS.pFramingBuffer);
2029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
2049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
2059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
2069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        free(mEffectsSettings);
2079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mEffectsSettings = NULL;
2089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
2099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mClipList == NULL) {
2119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mNumberClipsInStoryBoard = pSettings->uiClipNumber;
2122703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("loadEditSettings: # of Clips = %d", mNumberClipsInStoryBoard);
2139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mClipList = (M4VSS3GPP_ClipSettings**)M4OSA_32bitAlignedMalloc(
2159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber, M4VS,
2169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         (M4OSA_Char*)"LvPP, copy of pClipList");
2179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(NULL == mClipList) {
219f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("loadEditSettings: Malloc error");
2209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            return M4ERR_ALLOC;
2219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
2229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        memset((void *)mClipList,0,
2239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber);
2249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        for(i=0;i<pSettings->uiClipNumber;i++) {
2269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // Allocate current clip
2289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mClipList[i] =
2299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             (M4VSS3GPP_ClipSettings*)M4OSA_32bitAlignedMalloc(
2309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang              sizeof(M4VSS3GPP_ClipSettings),M4VS,(M4OSA_Char*)"clip settings");
2319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(mClipList[i] == NULL) {
2339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
234f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                ALOGE("loadEditSettings: Allocation error for mClipList[%d]", (int)i);
2359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                return M4ERR_ALLOC;
2369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
2379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // Copy plain structure
2389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            memcpy((void *)mClipList[i],
2399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             (void *)pSettings->pClipList[i],
2409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             sizeof(M4VSS3GPP_ClipSettings));
2419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(NULL != pSettings->pClipList[i]->pFile) {
2439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mClipList[i]->pFile = (M4OSA_Char*)M4OSA_32bitAlignedMalloc(
2449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pSettings->pClipList[i]->filePathSize, M4VS,
2459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                (M4OSA_Char*)"pClipSettingsDest->pFile");
2469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                if(NULL == mClipList[i]->pFile)
2489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                {
249f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                    ALOGE("loadEditSettings : ERROR allocating filename");
2509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    return M4ERR_ALLOC;
2519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                }
2529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                memcpy((void *)mClipList[i]->pFile,
2549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 (void *)pSettings->pClipList[i]->pFile,
2559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 pSettings->pClipList[i]->filePathSize);
2569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
2579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            else {
258f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                ALOGE("NULL file path");
2599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                return M4ERR_PARAMETER;
2609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
2619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // Calculate total duration of all clips
2639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            iClipDuration = pSettings->pClipList[i]->uiEndCutTime -
2649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pSettings->pClipList[i]->uiBeginCutTime;
2659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mClipTotalDuration = mClipTotalDuration+iClipDuration;
2679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
2689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
2699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mEffectsSettings == NULL) {
2719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mNumberEffects = pSettings->nbEffects;
2722703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("loadEditSettings: mNumberEffects = %d", mNumberEffects);
2739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(mNumberEffects != 0) {
2759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mEffectsSettings = (M4VSS3GPP_EffectSettings*)M4OSA_32bitAlignedMalloc(
2769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             mNumberEffects*sizeof(M4VSS3GPP_EffectSettings),
2779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             M4VS, (M4OSA_Char*)"effects settings");
2789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(mEffectsSettings == NULL) {
280f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                ALOGE("loadEffectsSettings: Allocation error");
2819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                return M4ERR_ALLOC;
2829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
2839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            memset((void *)mEffectsSettings,0,
2859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             mNumberEffects*sizeof(M4VSS3GPP_EffectSettings));
2869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            for(i=0;i<mNumberEffects;i++) {
2889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mEffectsSettings[i].xVSS.pFramingFilePath = NULL;
2909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
2919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mEffectsSettings[i].xVSS.pTextBuffer = NULL;
2929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                memcpy((void *)&(mEffectsSettings[i]),
2949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 (void *)&(pSettings->Effects[i]),
2959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 sizeof(M4VSS3GPP_EffectSettings));
2969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                if(pSettings->Effects[i].VideoEffectType ==
2989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) {
2999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    // Allocate the pFraming RGB buffer
3009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.pFramingBuffer =
3019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(sizeof(M4VIFI_ImagePlane),
3029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     M4VS, (M4OSA_Char*)"lvpp framing buffer");
3039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    if(mEffectsSettings[i].xVSS.pFramingBuffer == NULL) {
305f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                        ALOGE("loadEffectsSettings:Alloc error for pFramingBuf");
3069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        free(mEffectsSettings);
3079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        mEffectsSettings = NULL;
3089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        return M4ERR_ALLOC;
3099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    }
3109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    // Allocate the pac_data (RGB)
3129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    if(pSettings->Effects[i].xVSS.rgbType == M4VSS3GPP_kRGB565){
3139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        rgbSize =
3149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                         pSettings->Effects[i].xVSS.pFramingBuffer->u_width *
3159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                         pSettings->Effects[i].xVSS.pFramingBuffer->u_height*2;
3169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    }
3179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    else if(
3189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     pSettings->Effects[i].xVSS.rgbType == M4VSS3GPP_kRGB888) {
3199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        rgbSize =
3209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                         pSettings->Effects[i].xVSS.pFramingBuffer->u_width *
3219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                         pSettings->Effects[i].xVSS.pFramingBuffer->u_height*3;
3229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    }
3239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    else {
324f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                        ALOGE("loadEffectsSettings: wrong RGB type");
3259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        free(mEffectsSettings);
3269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        mEffectsSettings = NULL;
3279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        return M4ERR_PARAMETER;
3289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    }
3299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    tmp = (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(rgbSize, M4VS,
3319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     (M4OSA_Char*)"framing buffer pac_data");
3329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    if(tmp == NULL) {
334f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                        ALOGE("loadEffectsSettings:Alloc error pFramingBuf pac");
3359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        free(mEffectsSettings);
3369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        mEffectsSettings = NULL;
3379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        free(mEffectsSettings[i].xVSS.pFramingBuffer);
3389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
3409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        return M4ERR_ALLOC;
3419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    }
3429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    /* Initialize the pFramingBuffer*/
3439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.pFramingBuffer->pac_data = tmp;
3449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.pFramingBuffer->u_height =
3459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     pSettings->Effects[i].xVSS.pFramingBuffer->u_height;
3469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.pFramingBuffer->u_width =
3489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     pSettings->Effects[i].xVSS.pFramingBuffer->u_width;
3499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.pFramingBuffer->u_stride =
3519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     pSettings->Effects[i].xVSS.pFramingBuffer->u_stride;
3529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.pFramingBuffer->u_topleft =
3549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     pSettings->Effects[i].xVSS.pFramingBuffer->u_topleft;
3559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.uialphaBlendingStart =
3579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     pSettings->Effects[i].xVSS.uialphaBlendingStart;
3589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.uialphaBlendingMiddle =
3609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     pSettings->Effects[i].xVSS.uialphaBlendingMiddle;
3619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.uialphaBlendingEnd =
3639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     pSettings->Effects[i].xVSS.uialphaBlendingEnd;
3649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.uialphaBlendingFadeInTime =
3669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     pSettings->Effects[i].xVSS.uialphaBlendingFadeInTime;
3679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.uialphaBlendingFadeOutTime =
3689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     pSettings->Effects[i].xVSS.uialphaBlendingFadeOutTime;
3699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    // Copy the pFraming data
3719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    memcpy((void *)
3729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.pFramingBuffer->pac_data,
3739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    (void *)pSettings->Effects[i].xVSS.pFramingBuffer->pac_data,
3749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    rgbSize);
3759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mEffectsSettings[i].xVSS.rgbType =
3779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     pSettings->Effects[i].xVSS.rgbType;
3789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                }
3799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
3809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
3819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
3829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mBackgroundAudioSetting == NULL) {
3849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mBackgroundAudioSetting = (M4xVSS_AudioMixingSettings*)M4OSA_32bitAlignedMalloc(
3869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        sizeof(M4xVSS_AudioMixingSettings), M4VS,
3879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        (M4OSA_Char*)"LvPP, copy of bgmSettings");
3889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(NULL == mBackgroundAudioSetting) {
390f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("loadEditSettings: mBackgroundAudioSetting Malloc failed");
3919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            return M4ERR_ALLOC;
3929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
3939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        memset((void *)mBackgroundAudioSetting, 0,sizeof(M4xVSS_AudioMixingSettings*));
3959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        memcpy((void *)mBackgroundAudioSetting, (void *)bgmSettings, sizeof(M4xVSS_AudioMixingSettings));
3969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if ( mBackgroundAudioSetting->pFile != M4OSA_NULL ) {
3989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mBackgroundAudioSetting->pFile = (M4OSA_Void*) bgmSettings->pPCMFilePath;
4009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mBackgroundAudioSetting->uiNbChannels = 2;
4019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mBackgroundAudioSetting->uiSamplingFrequency = 32000;
4029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
4039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Open the BG file
4059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if ( mBackgroundAudioSetting->pFile != M4OSA_NULL ) {
4069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            err = M4OSA_fileReadOpen(&mAudioMixPCMFileHandle,
4079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             mBackgroundAudioSetting->pFile, M4OSA_kFileRead);
4089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if (err != M4NO_ERROR) {
410f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                ALOGE("loadEditSettings: mBackgroundAudio PCM File open failed");
4119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                return M4ERR_PARAMETER;
4129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
4139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
4149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
4159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mOutputVideoSize = pSettings->xVSS.outputVideoSize;
4179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mFrameStr.pBuffer = M4OSA_NULL;
4189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return M4NO_ERROR;
4199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
4209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR VideoEditorPreviewController::setSurface(const sp<Surface> &surface) {
4222703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("setSurface");
4239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    Mutex::Autolock autoLock(mLock);
4249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mSurface = surface;
4269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return M4NO_ERROR;
4279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
4289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR VideoEditorPreviewController::startPreview(
4309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 fromMS, M4OSA_Int32 toMs, M4OSA_UInt16 callBackAfterFrameCount,
4319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Bool loop) {
4329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
4349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 i = 0, iIncrementedDuration = 0;
4352703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("startPreview");
4369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(fromMS > (M4OSA_UInt32)toMs) {
438f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block        ALOGE("startPreview: fromMS > toMs");
4399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return M4ERR_PARAMETER;
4409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
4419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(toMs == 0) {
443f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block        ALOGE("startPreview: toMs is 0");
4449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return M4ERR_PARAMETER;
4459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
4469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // If already started, then stop preview first
4483d2d40ac83acbda8c161cae675c372595efd640eJames Dong    for(int playerInst=0; playerInst<kTotalNumPlayerInstances; playerInst++) {
4499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(mVePlayer[playerInst] != NULL) {
4502703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("startPreview: stopping previously started preview playback");
4519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            stopPreview();
4529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
4539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
4549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
4559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // If renderPreview was called previously, then delete Renderer object first
4579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mTarget != NULL) {
4582703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("startPreview: delete previous PreviewRenderer");
4599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        delete mTarget;
4609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mTarget = NULL;
4619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
4629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Create Audio player to be used for entire
4649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // storyboard duration
4659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mVEAudioSink = new VideoEditorPlayer::VeAudioOutput();
4669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mVEAudioPlayer = new VideoEditorAudioPlayer(mVEAudioSink);
4679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mVEAudioPlayer->setAudioMixSettings(mBackgroundAudioSetting);
4689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mVEAudioPlayer->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle);
4699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
47043fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    // Create Video Renderer to be used for the entire storyboard duration.
47143fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    uint32_t width, height;
47243fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    getVideoSizeByResolution(mOutputVideoSize, &width, &height);
47343fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    mNativeWindowRenderer = new NativeWindowRenderer(mSurface, width, height);
47443fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang
4752703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("startPreview: loop = %d", loop);
4769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPreviewLooping = loop;
4779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4782703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("startPreview: callBackAfterFrameCount = %d", callBackAfterFrameCount);
4799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mCallBackAfterFrameCnt = callBackAfterFrameCount;
4809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4813d2d40ac83acbda8c161cae675c372595efd640eJames Dong    for (int playerInst=0; playerInst<kTotalNumPlayerInstances; playerInst++) {
48243fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang        mVePlayer[playerInst] = new VideoEditorPlayer(mNativeWindowRenderer);
4839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(mVePlayer[playerInst] == NULL) {
484f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("startPreview:Error creating VideoEditorPlayer %d",playerInst);
4859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            return M4ERR_ALLOC;
4869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
4872703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("startPreview: object created");
4889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mVePlayer[playerInst]->setNotifyCallback(this,(notify_callback_f)notify);
4902703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("startPreview: notify callback set");
4919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mVePlayer[playerInst]->loadEffectsSettings(mEffectsSettings,
4939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         mNumberEffects);
4942703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("startPreview: effects settings loaded");
4959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mVePlayer[playerInst]->loadAudioMixSettings(mBackgroundAudioSetting);
4972703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("startPreview: AudioMixSettings settings loaded");
4989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mVePlayer[playerInst]->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle);
5002703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("startPreview: AudioMixPCMFileHandle set");
5019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mVePlayer[playerInst]->setProgressCallbackInterval(
5039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         mCallBackAfterFrameCnt);
5042703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("startPreview: setProgressCallBackInterval");
5059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
5069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPlayerState = VePlayerIdle;
5089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPrepareReqest = M4OSA_FALSE;
5099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(fromMS == 0) {
5119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mCurrentClipNumber = -1;
5129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Save original value
5139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mFirstPreviewClipBeginTime = mClipList[0]->uiBeginCutTime;
5149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mVideoStoryBoardTimeMsUptoFirstPreviewClip = 0;
5159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
5169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    else {
5172703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("startPreview: fromMS=%d", fromMS);
5189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(fromMS >= mClipTotalDuration) {
519f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("startPreview: fromMS >= mClipTotalDuration");
5209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            return M4ERR_PARAMETER;
5219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
5229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        for(i=0;i<mNumberClipsInStoryBoard;i++) {
5239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(fromMS < (iIncrementedDuration + (mClipList[i]->uiEndCutTime -
5249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             mClipList[i]->uiBeginCutTime))) {
5259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Set to 1 index below,
5269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // as threadProcess first increments the clip index
5279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // and then processes clip in thread loop
5289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mCurrentClipNumber = i-1;
5294ca06b0a9af472cfd13f52841fc9d2e5a6558674Steve Block                ALOGD("startPreview:mCurrentClipNumber = %d fromMS=%d",i,fromMS);
5309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Save original value
5329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mFirstPreviewClipBeginTime = mClipList[i]->uiBeginCutTime;
5339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Set correct begin time to start playback
5359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                if((fromMS+mClipList[i]->uiBeginCutTime) >
5369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                (iIncrementedDuration+mClipList[i]->uiBeginCutTime)) {
5379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    mClipList[i]->uiBeginCutTime =
5399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     mClipList[i]->uiBeginCutTime +
5409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     (fromMS - iIncrementedDuration);
5419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                }
5429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                break;
5439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
5449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            else {
5459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                iIncrementedDuration = iIncrementedDuration +
5469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime);
5479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
5489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
5499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mVideoStoryBoardTimeMsUptoFirstPreviewClip = iIncrementedDuration;
5509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
5519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5523d2d40ac83acbda8c161cae675c372595efd640eJames Dong    for (int playerInst=0; playerInst<kTotalNumPlayerInstances; playerInst++) {
5539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mVePlayer[playerInst]->setAudioMixStoryBoardParam(fromMS,
5549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         mFirstPreviewClipBeginTime,
5559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         mClipList[i]->ClipProperties.uiClipAudioVolumePercentage);
5569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5572703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("startPreview:setAudioMixStoryBoardSkimTimeStamp set %d cuttime \
5589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         %d", fromMS, mFirstPreviewClipBeginTime);
5599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
5609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mStartingClipIndex = mCurrentClipNumber+1;
5629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Start playing with player instance 0
5649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mCurrentPlayer = 0;
5659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mActivePlayerIndex = 0;
5669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(toMs == -1) {
5682703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("startPreview: Preview till end of storyboard");
5699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mNumberClipsToPreview = mNumberClipsInStoryBoard;
5709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Save original value
5719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mLastPreviewClipEndTime =
5729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         mClipList[mNumberClipsToPreview-1]->uiEndCutTime;
5739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
5749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    else {
5752703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("startPreview: toMs=%d", toMs);
5769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if((M4OSA_UInt32)toMs > mClipTotalDuration) {
577f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("startPreview: toMs > mClipTotalDuration");
5789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            return M4ERR_PARAMETER;
5799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
5809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        iIncrementedDuration = 0;
5829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        for(i=0;i<mNumberClipsInStoryBoard;i++) {
5849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if((M4OSA_UInt32)toMs <= (iIncrementedDuration +
5859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime))) {
5869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Save original value
5879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mLastPreviewClipEndTime = mClipList[i]->uiEndCutTime;
5889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Set the end cut time of clip index i to toMs
5899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mClipList[i]->uiEndCutTime = toMs;
5909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Number of clips to be previewed is from index 0 to i
5929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // increment by 1 as i starts from 0
5939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mNumberClipsToPreview = i+1;
5949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                break;
5959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
5969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            else {
5979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                iIncrementedDuration = iIncrementedDuration +
5989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime);
5999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
6009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
6019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
6029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Open the thread semaphore
6049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_semaphoreOpen(&mSemThreadWait, 1);
6059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Open the preview process thread
6079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    err = M4OSA_threadSyncOpen(&mThreadContext, (M4OSA_ThreadDoIt)threadProc);
6089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (M4NO_ERROR != err) {
609f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block        ALOGE("VideoEditorPreviewController:M4OSA_threadSyncOpen error %d", (int) err);
6109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return err;
6119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
6129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Set the stacksize
6149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    err = M4OSA_threadSyncSetOption(mThreadContext, M4OSA_ThreadStackSize,
6153d2d40ac83acbda8c161cae675c372595efd640eJames Dong     (M4OSA_DataOption) kPreviewThreadStackSize);
6169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (M4NO_ERROR != err) {
618f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block        ALOGE("VideoEditorPreviewController: threadSyncSetOption error %d", (int) err);
6199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        M4OSA_threadSyncClose(mThreadContext);
6209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mThreadContext = NULL;
6219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return err;
6229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
6239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     // Start the thread
6259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     err = M4OSA_threadSyncStart(mThreadContext, (M4OSA_Void*)this);
6269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     if (M4NO_ERROR != err) {
627f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block        ALOGE("VideoEditorPreviewController: threadSyncStart error %d", (int) err);
6289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        M4OSA_threadSyncClose(mThreadContext);
6299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mThreadContext = NULL;
6309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        return err;
6319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
6329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    bStopThreadInProgress = false;
6339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6342703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("startPreview: process thread started");
6359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return M4NO_ERROR;
6369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
6379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_UInt32 VideoEditorPreviewController::stopPreview() {
6399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
6409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    uint32_t lastRenderedFrameTimeMs = 0;
6412703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("stopPreview");
6429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Stop the thread
6449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mThreadContext != NULL) {
6459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        bStopThreadInProgress = true;
6469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        {
6479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            Mutex::Autolock autoLock(mLockSem);
6489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if (mSemThreadWait != NULL) {
6499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                err = M4OSA_semaphorePost(mSemThreadWait);
6509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
6519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
6529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        err = M4OSA_threadSyncStop(mThreadContext);
6549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(err != M4NO_ERROR) {
6552703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("stopPreview: error 0x%x in trying to stop thread", err);
6569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // Continue even if error
6579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
6589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        err = M4OSA_threadSyncClose(mThreadContext);
6609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(err != M4NO_ERROR) {
661f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("stopPreview: error 0x%x in trying to close thread", (unsigned int)err);
6629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // Continue even if error
6639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
6649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mThreadContext = NULL;
6669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
6679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Close the semaphore first
6699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    {
6709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        Mutex::Autolock autoLock(mLockSem);
6719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(mSemThreadWait != NULL) {
6729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            err = M4OSA_semaphoreClose(mSemThreadWait);
6732703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("stopPreview: close semaphore returns 0x%x", err);
6749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mSemThreadWait = NULL;
6759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
6769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
6779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6783d2d40ac83acbda8c161cae675c372595efd640eJames Dong    for (int playerInst=0; playerInst<kTotalNumPlayerInstances; playerInst++) {
6799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(mVePlayer[playerInst] != NULL) {
6809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(mVePlayer[playerInst]->isPlaying()) {
6812703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("stop the player first");
6829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mVePlayer[playerInst]->stop();
6839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
6849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if (playerInst == mActivePlayerIndex) {
6859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Return the last rendered frame time stamp
6869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mVePlayer[mActivePlayerIndex]->getLastRenderedTimeMs(&lastRenderedFrameTimeMs);
6879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
688fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla
689fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla            //This is used to syncronize onStreamDone() in PreviewPlayer and
6909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            //stopPreview() in PreviewController
691fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla            sp<VideoEditorPlayer> temp = mVePlayer[playerInst];
692fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla            temp->acquireLock();
6932703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("stopPreview: clearing mVePlayer");
694fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla            mVePlayer[playerInst].clear();
6959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mVePlayer[playerInst] = NULL;
696fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla            temp->releaseLock();
6979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
6989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
6992703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("stopPreview: clear audioSink and audioPlayer");
7009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mVEAudioSink.clear();
7019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (mVEAudioPlayer) {
7029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        delete mVEAudioPlayer;
7039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mVEAudioPlayer = NULL;
704fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla    }
7059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
70643fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    delete mNativeWindowRenderer;
70743fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang    mNativeWindowRenderer = NULL;
70843fcc396614a587851e2b7c4cea2876ec58b8648Chih-Chung Chang
7099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // If image file playing, then free the buffer pointer
7109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mFrameStr.pBuffer != M4OSA_NULL) {
7119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        free(mFrameStr.pBuffer);
7129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mFrameStr.pBuffer = M4OSA_NULL;
7139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
7149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Reset original begin cuttime of first previewed clip*/
7169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mClipList[mStartingClipIndex]->uiBeginCutTime = mFirstPreviewClipBeginTime;
7179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Reset original end cuttime of last previewed clip*/
7189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mClipList[mNumberClipsToPreview-1]->uiEndCutTime = mLastPreviewClipEndTime;
7199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPlayerState = VePlayerIdle;
7219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mPrepareReqest = M4OSA_FALSE;
7229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mCurrentPlayedDuration = 0;
7249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mCurrentClipDuration = 0;
7259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mRenderingMode = M4xVSS_kBlackBorders;
7269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mOutputVideoWidth = 0;
7279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mOutputVideoHeight = 0;
7289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7292703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("stopPreview() lastRenderedFrameTimeMs %ld", lastRenderedFrameTimeMs);
7309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return lastRenderedFrameTimeMs;
7319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
7329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR VideoEditorPreviewController::clearSurface(
7349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    const sp<Surface> &surface, VideoEditor_renderPreviewFrameStr* pFrameInfo) {
7359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
7379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo;
7389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0;
7399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_ImagePlane planeOut[3];
7402703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("Inside preview clear frame");
7419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    Mutex::Autolock autoLock(mLock);
7439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Delete previous renderer instance
7459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mTarget != NULL) {
7469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        delete mTarget;
7479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mTarget = NULL;
7489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
7499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    outputBufferWidth = pFrameStr->uiFrameWidth;
7519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    outputBufferHeight = pFrameStr->uiFrameHeight;
7529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Initialize the renderer
7549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mTarget == NULL) {
7559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mTarget = PreviewRenderer::CreatePreviewRenderer(
75708b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang            surface,
75808b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang            outputBufferWidth, outputBufferHeight);
7599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(mTarget == NULL) {
761f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("renderPreviewFrame: cannot create PreviewRenderer");
7629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            return M4ERR_ALLOC;
7639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
7649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
7659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Out plane
7679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    uint8_t* outBuffer;
7689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    size_t outBufferStride = 0;
7699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7702703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("doMediaRendering CALL getBuffer()");
7719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mTarget->getBufferYV12(&outBuffer, &outBufferStride);
7729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Set the output YUV420 plane to be compatible with YV12 format
7749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    //In YV12 format, sizes must be even
7759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 yv12PlaneWidth = ((outputBufferWidth +1)>>1)<<1;
7769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 yv12PlaneHeight = ((outputBufferHeight+1)>>1)<<1;
7779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight,
7799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer);
7809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    /* Fill the surface with black frame */
7829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    memset((void *)planeOut[0].pac_data,0x00,planeOut[0].u_width *
7839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                            planeOut[0].u_height * 1.5);
7849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    memset((void *)planeOut[1].pac_data,128,planeOut[1].u_width *
7859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                            planeOut[1].u_height);
7869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    memset((void *)planeOut[2].pac_data,128,planeOut[2].u_width *
7879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                             planeOut[2].u_height);
7889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mTarget->renderYV12();
7909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return err;
7919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
7929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(
7949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            const sp<Surface> &surface,
7959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            VideoEditor_renderPreviewFrameStr* pFrameInfo,
7969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            VideoEditorCurretEditInfo *pCurrEditInfo) {
7979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
7999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 i = 0, iIncrementedDuration = 0, tnTimeMs=0, framesize =0;
8009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo;
8019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_UInt8 *pixelArray = NULL;
8029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    Mutex::Autolock autoLock(mLock);
8039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
8049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if (pCurrEditInfo != NULL) {
8059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pCurrEditInfo->overlaySettingsIndex = -1;
8069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
8079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Delete previous renderer instance
8089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mTarget != NULL) {
8099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        delete mTarget;
8109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mTarget = NULL;
8119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
8129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
8139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mOutputVideoWidth == 0) {
8149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mOutputVideoWidth = pFrameStr->uiFrameWidth;
8159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
8169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
8179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mOutputVideoHeight == 0) {
8189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mOutputVideoHeight = pFrameStr->uiFrameHeight;
8199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
8209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
8219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Initialize the renderer
8229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mTarget == NULL) {
8239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         mTarget = PreviewRenderer::CreatePreviewRenderer(
82408b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang            surface,
82508b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang            mOutputVideoWidth, mOutputVideoHeight);
8269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
8279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(mTarget == NULL) {
828f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("renderPreviewFrame: cannot create PreviewRenderer");
8299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            return M4ERR_ALLOC;
8309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
8319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
8329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
8339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    pixelArray = NULL;
8349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
835e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury    // Apply rotation if required
836e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury    if (pFrameStr->videoRotationDegree != 0) {
837e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury        err = applyVideoRotation((M4OSA_Void *)pFrameStr->pBuffer,
838e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury                  pFrameStr->uiFrameWidth, pFrameStr->uiFrameHeight,
839e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury                  pFrameStr->videoRotationDegree);
840e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury        if (M4NO_ERROR != err) {
841f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("renderPreviewFrame: cannot rotate video, err 0x%x", (unsigned int)err);
842e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury            delete mTarget;
843e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury            mTarget = NULL;
844e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury            return err;
845e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury        } else {
846e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury           // Video rotation done.
847e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury           // Swap width and height if 90 or 270 degrees
848e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury           if (pFrameStr->videoRotationDegree != 180) {
849e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury               int32_t temp = pFrameStr->uiFrameWidth;
850e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury               pFrameStr->uiFrameWidth = pFrameStr->uiFrameHeight;
851e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury               pFrameStr->uiFrameHeight = temp;
852e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury           }
853e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury        }
854e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury    }
8559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Postprocessing (apply video effect)
8569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(pFrameStr->bApplyEffect == M4OSA_TRUE) {
8579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
8589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        for(i=0;i<mNumberEffects;i++) {
8599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // First check if effect starttime matches the clip being previewed
8609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if((mEffectsSettings[i].uiStartTime < pFrameStr->clipBeginCutTime)
8619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             ||(mEffectsSettings[i].uiStartTime >= pFrameStr->clipEndCutTime)) {
8629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // This effect doesn't belong to this clip, check next one
8639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                continue;
8649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
8659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if((mEffectsSettings[i].uiStartTime <= pFrameStr->timeMs) &&
8669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >=
8679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pFrameStr->timeMs) && (mEffectsSettings[i].uiDuration != 0)) {
8689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                setVideoEffectType(mEffectsSettings[i].VideoEffectType, TRUE);
8699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
8709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            else {
8719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                setVideoEffectType(mEffectsSettings[i].VideoEffectType, FALSE);
8729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
8739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
8749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
8759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        //Provide the overlay Update indication when there is an overlay effect
8769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if (mCurrentVideoEffect & VIDEO_EFFECT_FRAMING) {
8779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            M4OSA_UInt32 index;
8789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mCurrentVideoEffect &= ~VIDEO_EFFECT_FRAMING; //never apply framing here.
8799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
8809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // Find the effect in effectSettings array
8819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            for (index = 0; index < mNumberEffects; index++) {
8829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                if(mEffectsSettings[index].VideoEffectType ==
8839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) {
8849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
8859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    if((mEffectsSettings[index].uiStartTime <= pFrameInfo->timeMs) &&
8869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        ((mEffectsSettings[index].uiStartTime+
8879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        mEffectsSettings[index].uiDuration) >= pFrameInfo->timeMs))
8889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    {
8899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        break;
8909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    }
8919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                }
8929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
8939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if ((index < mNumberEffects) && (pCurrEditInfo != NULL)) {
8949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pCurrEditInfo->overlaySettingsIndex = index;
8952703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("Framing index = %d", index);
8969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            } else {
8972703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("No framing effects found");
8989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
8999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
9009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) {
9029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            err = applyVideoEffect((M4OSA_Void *)pFrameStr->pBuffer,
9039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
9049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pFrameStr->uiFrameHeight, pFrameStr->timeMs,
9059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             (M4OSA_Void *)pixelArray);
9069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(err != M4NO_ERROR) {
908f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                ALOGE("renderPreviewFrame: applyVideoEffect error 0x%x", (unsigned int)err);
9099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                delete mTarget;
9109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mTarget = NULL;
9119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                free(pixelArray);
9129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pixelArray = NULL;
9139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                return err;
9149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang           }
9159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang           mCurrentVideoEffect = VIDEO_EFFECT_NONE;
9169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
9179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        else {
9189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // Apply the rendering mode
9199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer,
9209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
9219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray);
9229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(err != M4NO_ERROR) {
924f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                ALOGE("renderPreviewFrame:doImageRenderingMode error 0x%x", (unsigned int)err);
9259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                delete mTarget;
9269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mTarget = NULL;
9279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                free(pixelArray);
9289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pixelArray = NULL;
9299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                return err;
9309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
9319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
9329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
9339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    else {
9349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Apply the rendering mode
9359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer,
9369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
9379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray);
9389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(err != M4NO_ERROR) {
940f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("renderPreviewFrame: doImageRenderingMode error 0x%x", (unsigned int)err);
9419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            delete mTarget;
9429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mTarget = NULL;
9439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            free(pixelArray);
9449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pixelArray = NULL;
9459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            return err;
9469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
9479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
9489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mTarget->renderYV12();
9509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return err;
9519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
9529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Void VideoEditorPreviewController::setJniCallback(void* cookie,
9549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    jni_progress_callback_fct callbackFct) {
9552703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    //ALOGV("setJniCallback");
9569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mJniCookie = cookie;
9579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mJniCallback = callbackFct;
9589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
9599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR VideoEditorPreviewController::preparePlayer(
9619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    void* param, int playerInstance, int index) {
9629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
9649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditorPreviewController *pController =
9659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     (VideoEditorPreviewController *)param;
9669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9672703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("preparePlayer: instance %d file %d", playerInstance, index);
9689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
969daeb5b33861147fda0096f9c794be6f341d884c2James Dong    const char* fileName = (const char*) pController->mClipList[index]->pFile;
970daeb5b33861147fda0096f9c794be6f341d884c2James Dong    pController->mVePlayer[playerInstance]->setDataSource(fileName, NULL);
971daeb5b33861147fda0096f9c794be6f341d884c2James Dong
9722703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("preparePlayer: setDataSource instance %s",
9739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     (const char *)pController->mClipList[index]->pFile);
9749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    pController->mVePlayer[playerInstance]->setVideoSurface(
9769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     pController->mSurface);
9772703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("preparePlayer: setVideoSurface");
9789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    pController->mVePlayer[playerInstance]->setMediaRenderingMode(
9809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     pController->mClipList[index]->xVSS.MediaRendering,
9819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     pController->mOutputVideoSize);
9822703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("preparePlayer: setMediaRenderingMode");
9839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if((M4OSA_UInt32)index == pController->mStartingClipIndex) {
9859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pController->mVePlayer[playerInstance]->setPlaybackBeginTime(
9869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pController->mFirstPreviewClipBeginTime);
9879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
9889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    else {
9899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pController->mVePlayer[playerInstance]->setPlaybackBeginTime(
9909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pController->mClipList[index]->uiBeginCutTime);
9919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
9922703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("preparePlayer: setPlaybackBeginTime(%d)",
9939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     pController->mClipList[index]->uiBeginCutTime);
9949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
9959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    pController->mVePlayer[playerInstance]->setPlaybackEndTime(
9969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     pController->mClipList[index]->uiEndCutTime);
9972703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("preparePlayer: setPlaybackEndTime(%d)",
9989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     pController->mClipList[index]->uiEndCutTime);
9999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(pController->mClipList[index]->FileType == M4VIDEOEDITING_kFileType_ARGB8888) {
10019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pController->mVePlayer[playerInstance]->setImageClipProperties(
10029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 pController->mClipList[index]->ClipProperties.uiVideoWidth,
10039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 pController->mClipList[index]->ClipProperties.uiVideoHeight);
10042703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("preparePlayer: setImageClipProperties");
10059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
10069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    pController->mVePlayer[playerInstance]->prepare();
10082703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("preparePlayer: prepared");
10099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(pController->mClipList[index]->uiBeginCutTime > 0) {
10119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pController->mVePlayer[playerInstance]->seekTo(
10129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         pController->mClipList[index]->uiBeginCutTime);
10139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10142703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("preparePlayer: seekTo(%d)",
10159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         pController->mClipList[index]->uiBeginCutTime);
10169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
10179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    pController->mVePlayer[pController->mCurrentPlayer]->setAudioPlayer(pController->mVEAudioPlayer);
10189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    pController->mVePlayer[playerInstance]->readFirstVideoFrame();
10202703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("preparePlayer: readFirstVideoFrame of clip");
10219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return err;
10239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
10249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR VideoEditorPreviewController::threadProc(M4OSA_Void* param) {
10269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
10279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Int32 index = 0;
10289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditorPreviewController *pController =
10299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     (VideoEditorPreviewController *)param;
10309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10312703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("inside threadProc");
10329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(pController->mPlayerState == VePlayerIdle) {
10339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        (pController->mCurrentClipNumber)++;
10349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10354ca06b0a9af472cfd13f52841fc9d2e5a6558674Steve Block        ALOGD("threadProc: playing file index %d total clips %d",
10369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         pController->mCurrentClipNumber, pController->mNumberClipsToPreview);
10379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if((M4OSA_UInt32)pController->mCurrentClipNumber >=
10399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         pController->mNumberClipsToPreview) {
10409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10414ca06b0a9af472cfd13f52841fc9d2e5a6558674Steve Block            ALOGD("All clips previewed");
10429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pController->mCurrentPlayedDuration = 0;
10449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pController->mCurrentClipDuration = 0;
10459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pController->mCurrentPlayer = 0;
10469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(pController->mPreviewLooping == M4OSA_TRUE) {
10489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pController->mCurrentClipNumber =
10499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 pController->mStartingClipIndex;
10509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10514ca06b0a9af472cfd13f52841fc9d2e5a6558674Steve Block                ALOGD("Preview looping TRUE, restarting from clip index %d",
10529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 pController->mCurrentClipNumber);
10539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Reset the story board timestamp inside the player
10553d2d40ac83acbda8c161cae675c372595efd640eJames Dong                for (int playerInst=0; playerInst<kTotalNumPlayerInstances;
10569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 playerInst++) {
10579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    pController->mVePlayer[playerInst]->resetJniCallbackTimeStamp();
10589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                }
10599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
10609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            else {
10619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                M4OSA_UInt32 endArgs = 0;
10629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                if(pController->mJniCallback != NULL) {
10639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    pController->mJniCallback(
10649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                     pController->mJniCookie, MSG_TYPE_PREVIEW_END, &endArgs);
10659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                }
10669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pController->mPlayerState = VePlayerAutoStop;
10679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Reset original begin cuttime of first previewed clip
10699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pController->mClipList[pController->mStartingClipIndex]->uiBeginCutTime =
10709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 pController->mFirstPreviewClipBeginTime;
10719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Reset original end cuttime of last previewed clip
10729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pController->mClipList[pController->mNumberClipsToPreview-1]->uiEndCutTime =
10739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 pController->mLastPreviewClipEndTime;
10749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Return a warning to M4OSA thread handler
10769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // so that thread is moved from executing state to open state
10779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                return M4WAR_NO_MORE_STREAM;
10789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
10799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
10809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        index=pController->mCurrentClipNumber;
10829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if((M4OSA_UInt32)pController->mCurrentClipNumber == pController->mStartingClipIndex) {
10839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pController->mCurrentPlayedDuration +=
10849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mVideoStoryBoardTimeMsUptoFirstPreviewClip;
10859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pController->mCurrentClipDuration =
10879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
10889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang              - pController->mFirstPreviewClipBeginTime;
10899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            preparePlayer((void*)pController, pController->mCurrentPlayer, index);
10919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
10929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        else {
10939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pController->mCurrentPlayedDuration +=
10949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mCurrentClipDuration;
10959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
10969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pController->mCurrentClipDuration =
10979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime -
10989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;
10999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
11009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pController->mVePlayer[pController->mCurrentPlayer]->setStoryboardStartTime(
11029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang         pController->mCurrentPlayedDuration);
11032703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("threadProc: setStoryboardStartTime");
11049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Set the next clip duration for Audio mix here
11069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if((M4OSA_UInt32)pController->mCurrentClipNumber != pController->mStartingClipIndex) {
11079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pController->mVePlayer[pController->mCurrentPlayer]->setAudioMixStoryBoardParam(
11099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mCurrentPlayedDuration,
11109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mClipList[index]->uiBeginCutTime,
11119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage);
11129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11132703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("threadProc: setAudioMixStoryBoardParam fromMS %d \
11149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             ClipBeginTime %d", pController->mCurrentPlayedDuration +
11159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mClipList[index]->uiBeginCutTime,
11169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mClipList[index]->uiBeginCutTime,
11179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage);
11189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
11199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Capture the active player being used
11209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pController->mActivePlayerIndex = pController->mCurrentPlayer;
11219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pController->mVePlayer[pController->mCurrentPlayer]->start();
11232703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("threadProc: started");
11249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pController->mPlayerState = VePlayerBusy;
11269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if(pController->mPlayerState == VePlayerAutoStop) {
11282703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("Preview completed..auto stop the player");
11299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else if ((pController->mPlayerState == VePlayerBusy) && (pController->mPrepareReqest)) {
11309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Prepare the player here
11319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        pController->mPrepareReqest = M4OSA_FALSE;
11329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        preparePlayer((void*)pController, pController->mCurrentPlayer,
11339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pController->mCurrentClipNumber+1);
11349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if (pController->mSemThreadWait != NULL) {
11359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            err = M4OSA_semaphoreWait(pController->mSemThreadWait,
11369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                M4OSA_WAIT_FOREVER);
11379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
11389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    } else {
11399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if (!pController->bStopThreadInProgress) {
11402703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("threadProc: state busy...wait for sem");
11419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if (pController->mSemThreadWait != NULL) {
11429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                err = M4OSA_semaphoreWait(pController->mSemThreadWait,
11439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 M4OSA_WAIT_FOREVER);
11449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             }
11459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
11462703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block        ALOGV("threadProc: sem wait returned err = 0x%x", err);
11479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
11489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    //Always return M4NO_ERROR to ensure the thread keeps running
11509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return M4NO_ERROR;
11519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
11529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPreviewController::notify(
11549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    void* cookie, int msg, int ext1, int ext2)
11559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{
11569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    VideoEditorPreviewController *pController =
11579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     (VideoEditorPreviewController *)cookie;
11589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
11609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    uint32_t clipDuration = 0;
11619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    switch (msg) {
11629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case MEDIA_NOP: // interface test message
11632703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("MEDIA_NOP");
11649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
11659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case MEDIA_PREPARED:
11662703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("MEDIA_PREPARED");
11679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
11689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case MEDIA_PLAYBACK_COMPLETE:
11699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        {
11704ca06b0a9af472cfd13f52841fc9d2e5a6558674Steve Block            ALOGD("notify:MEDIA_PLAYBACK_COMPLETE, mCurrentClipNumber = %d",
1171d94b927cafef95db7de0c89b6ef8f246efc37c6cChih-Chung Chang                    pController->mCurrentClipNumber);
11729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pController->mPlayerState = VePlayerIdle;
11739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            //send progress callback with last frame timestamp
11759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if((M4OSA_UInt32)pController->mCurrentClipNumber ==
11769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mStartingClipIndex) {
11779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                clipDuration =
11789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
11799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                  - pController->mFirstPreviewClipBeginTime;
11809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
11819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            else {
11829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                clipDuration =
11839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
11849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                  - pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;
11859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
11869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            M4OSA_UInt32 playedDuration = clipDuration+pController->mCurrentPlayedDuration;
11889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pController->mJniCallback(
11899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION,
11909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 &playedDuration);
11919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
11929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if ((pController->mOverlayState == OVERLAY_UPDATE) &&
11939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                ((M4OSA_UInt32)pController->mCurrentClipNumber !=
11949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                (pController->mNumberClipsToPreview-1))) {
11959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                VideoEditorCurretEditInfo *pEditInfo =
11969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo),
11979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    M4VS, (M4OSA_Char*)"Current Edit info");
11989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pEditInfo->overlaySettingsIndex = ext2;
11999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pEditInfo->clipIndex = pController->mCurrentClipNumber;
12009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pController->mOverlayState == OVERLAY_CLEAR;
12019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                if (pController->mJniCallback != NULL) {
12029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        pController->mJniCallback(pController->mJniCookie,
12039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                            MSG_TYPE_OVERLAY_CLEAR, pEditInfo);
12049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                }
12059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                free(pEditInfo);
12069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
12079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            {
12089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                Mutex::Autolock autoLock(pController->mLockSem);
12099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                if (pController->mSemThreadWait != NULL) {
1210fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla                    M4OSA_semaphorePost(pController->mSemThreadWait);
1211fa31daff175709d2c58d61d1354daa9495696631Raghavender Palla                    return;
12129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                }
12139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
12149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
12159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
12169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
12179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case MEDIA_ERROR:
12189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        {
12199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            int err_val = ext1;
12209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang          // Always log errors.
12219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang          // ext1: Media framework error code.
12229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang          // ext2: Implementation dependant error code.
1223f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("MEDIA_ERROR; error (%d, %d)", ext1, ext2);
12249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(pController->mJniCallback != NULL) {
12259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pController->mJniCallback(pController->mJniCookie,
12269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 MSG_TYPE_PLAYER_ERROR, &err_val);
12279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
12289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
12299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
12309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case MEDIA_INFO:
12319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        {
12329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            int info_val = ext2;
12339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // ext1: Media framework error code.
12349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // ext2: Implementation dependant error code.
1235e70ff37034fdb93f65d34704aec400ec9123e55cSteve Block            //ALOGW("MEDIA_INFO; info/warning (%d, %d)", ext1, ext2);
12369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(pController->mJniCallback != NULL) {
12379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pController->mJniCallback(pController->mJniCookie,
12389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                 MSG_TYPE_PROGRESS_INDICATION, &info_val);
12399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
12409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
12419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
12429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case MEDIA_SEEK_COMPLETE:
12432703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("MEDIA_SEEK_COMPLETE; Received seek complete");
12449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
12459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case MEDIA_BUFFERING_UPDATE:
12462703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("MEDIA_BUFFERING_UPDATE; buffering %d", ext1);
12479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
12489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case MEDIA_SET_VIDEO_SIZE:
12492703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("MEDIA_SET_VIDEO_SIZE; New video size %d x %d", ext1, ext2);
12509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
12519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case 0xAAAAAAAA:
12522703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VIDEO PLAYBACK ALMOST over, prepare next player");
12539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // Select next player and prepare it
12549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            // If there is a clip after this one
12559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if ((M4OSA_UInt32)(pController->mCurrentClipNumber+1) <
12569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang             pController->mNumberClipsToPreview) {
12579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pController->mPrepareReqest = M4OSA_TRUE;
12589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                pController->mCurrentPlayer++;
12593d2d40ac83acbda8c161cae675c372595efd640eJames Dong                if (pController->mCurrentPlayer >= kTotalNumPlayerInstances) {
12609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    pController->mCurrentPlayer = 0;
12619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                }
12629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                // Prepare the first clip to be played
12639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                {
12649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    Mutex::Autolock autoLock(pController->mLockSem);
12659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    if (pController->mSemThreadWait != NULL) {
12669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        M4OSA_semaphorePost(pController->mSemThreadWait);
12679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    }
12689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                }
12699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
12709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
12719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case 0xBBBBBBBB:
12729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        {
12732703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("VIDEO PLAYBACK, Update Overlay");
12749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            int overlayIndex = ext2;
12759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            VideoEditorCurretEditInfo *pEditInfo =
12769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo),
12779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    M4VS, (M4OSA_Char*)"Current Edit info");
12789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            //ext1 = 1; start the overlay display
12799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            //     = 2; Clear the overlay.
12809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pEditInfo->overlaySettingsIndex = ext2;
12819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            pEditInfo->clipIndex = pController->mCurrentClipNumber;
12822703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("pController->mCurrentClipNumber = %d",pController->mCurrentClipNumber);
12839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if (pController->mJniCallback != NULL) {
12849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                if (ext1 == 1) {
12859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    pController->mOverlayState = OVERLAY_UPDATE;
12869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    pController->mJniCallback(pController->mJniCookie,
12879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        MSG_TYPE_OVERLAY_UPDATE, pEditInfo);
12889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                } else {
12899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    pController->mOverlayState = OVERLAY_CLEAR;
12909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                    pController->mJniCallback(pController->mJniCookie,
12919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                        MSG_TYPE_OVERLAY_CLEAR, pEditInfo);
12929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                }
12939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
12949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            free(pEditInfo);
12959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
12969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        }
12979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        default:
12982703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block            ALOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);
12999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
13019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
13029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid VideoEditorPreviewController::setVideoEffectType(
13049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) {
13059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 effect = VIDEO_EFFECT_NONE;
13079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // map M4VSS3GPP_VideoEffectType to local enum
13099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    switch(type) {
13109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case M4VSS3GPP_kVideoEffectType_FadeFromBlack:
13119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            effect = VIDEO_EFFECT_FADEFROMBLACK;
13129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case M4VSS3GPP_kVideoEffectType_FadeToBlack:
13159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            effect = VIDEO_EFFECT_FADETOBLACK;
13169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case M4xVSS_kVideoEffectType_BlackAndWhite:
13199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            effect = VIDEO_EFFECT_BLACKANDWHITE;
13209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case M4xVSS_kVideoEffectType_Pink:
13239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            effect = VIDEO_EFFECT_PINK;
13249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case M4xVSS_kVideoEffectType_Green:
13279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            effect = VIDEO_EFFECT_GREEN;
13289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case M4xVSS_kVideoEffectType_Sepia:
13319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            effect = VIDEO_EFFECT_SEPIA;
13329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case M4xVSS_kVideoEffectType_Negative:
13359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            effect = VIDEO_EFFECT_NEGATIVE;
13369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case M4xVSS_kVideoEffectType_Framing:
13399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            effect = VIDEO_EFFECT_FRAMING;
13409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case M4xVSS_kVideoEffectType_Fifties:
13439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            effect = VIDEO_EFFECT_FIFTIES;
13449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case M4xVSS_kVideoEffectType_ColorRGB16:
13479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            effect = VIDEO_EFFECT_COLOR_RGB16;
13489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        case M4xVSS_kVideoEffectType_Gradient:
13519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            effect = VIDEO_EFFECT_GRADIENT;
13529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        default:
13559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            effect = VIDEO_EFFECT_NONE;
13569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            break;
13579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
13589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(enable == M4OSA_TRUE) {
13609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // If already set, then no need to set again
13619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(!(mCurrentVideoEffect & effect))
13629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mCurrentVideoEffect |= effect;
13639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            if(effect == VIDEO_EFFECT_FIFTIES) {
13649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang                mIsFiftiesEffectStarted = true;
13659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            }
13669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
13679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    else  {
13689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        // Reset only if already set
13699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        if(mCurrentVideoEffect & effect)
13709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang            mCurrentVideoEffect &= ~effect;
13719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
13729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return;
13749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
13759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR VideoEditorPreviewController::applyVideoEffect(
13789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,
13799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 videoHeight, M4OSA_UInt32 timeMs, M4OSA_Void* outPtr) {
13809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
13829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    vePostProcessParams postProcessParams;
13839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
13849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.vidBuffer = (M4VIFI_UInt8*)dataPtr;
13859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.videoWidth = videoWidth;
13869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.videoHeight = videoHeight;
13879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.timeMs = timeMs;
13889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.timeOffset = 0; //Since timeMS already takes care of offset in this case
13899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.effectsSettings = mEffectsSettings;
13909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.numberEffects = mNumberEffects;
13919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.outVideoWidth = mOutputVideoWidth;
13929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.outVideoHeight = mOutputVideoHeight;
13939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.currentVideoEffect = mCurrentVideoEffect;
13949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.renderingMode = mRenderingMode;
13959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(mIsFiftiesEffectStarted == M4OSA_TRUE) {
13969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        postProcessParams.isFiftiesEffectStarted = M4OSA_TRUE;
13979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        mIsFiftiesEffectStarted = M4OSA_FALSE;
13989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
13999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    else {
14009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang       postProcessParams.isFiftiesEffectStarted = M4OSA_FALSE;
14019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
14029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    //postProcessParams.renderer = mTarget;
14039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.overlayFrameRGBBuffer = NULL;
14049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    postProcessParams.overlayFrameYUVBuffer = NULL;
14059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mTarget->getBufferYV12(&(postProcessParams.pOutBuffer), &(postProcessParams.outBufferStride));
14079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    err = applyEffectsAndRenderingMode(&postProcessParams, videoWidth, videoHeight);
14099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return err;
14109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
14119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14128806b706693c0992724f6603353af18aeb4a0f80Hong Tengstatus_t VideoEditorPreviewController::setPreviewFrameRenderingMode(
14139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4xVSS_MediaRendering mode, M4VIDEOEDITING_VideoFrameSize outputVideoSize) {
14149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14152703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("setMediaRenderingMode: outputVideoSize = %d", outputVideoSize);
14169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mRenderingMode = mode;
14179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14188806b706693c0992724f6603353af18aeb4a0f80Hong Teng    status_t err = OK;
14198806b706693c0992724f6603353af18aeb4a0f80Hong Teng    /* get the video width and height by resolution */
14208806b706693c0992724f6603353af18aeb4a0f80Hong Teng    err = getVideoSizeByResolution(outputVideoSize,
14218806b706693c0992724f6603353af18aeb4a0f80Hong Teng              &mOutputVideoWidth, &mOutputVideoHeight);
14229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14238806b706693c0992724f6603353af18aeb4a0f80Hong Teng    return err;
14249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
14259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR VideoEditorPreviewController::doImageRenderingMode(
14279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,
14289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 videoHeight, M4OSA_Void* outPtr) {
14299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
14319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_ImagePlane planeIn[3], planeOut[3];
14329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4VIFI_UInt8 *inBuffer = M4OSA_NULL;
14339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0;
14349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    //frameSize = (videoWidth*videoHeight*3) >> 1;
14369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    inBuffer = (M4OSA_UInt8 *)dataPtr;
14379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // In plane
14399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    prepareYUV420ImagePlane(planeIn, videoWidth,
14409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang      videoHeight, (M4VIFI_UInt8 *)inBuffer, videoWidth, videoHeight);
14419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    outputBufferWidth = mOutputVideoWidth;
14439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    outputBufferHeight = mOutputVideoHeight;
14449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Out plane
14469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    uint8_t* outBuffer;
14479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    size_t outBufferStride = 0;
14489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14492703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    ALOGV("doMediaRendering CALL getBuffer()");
14509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    mTarget->getBufferYV12(&outBuffer, &outBufferStride);
14519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    // Set the output YUV420 plane to be compatible with YV12 format
14539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    //In YV12 format, sizes must be even
14549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 yv12PlaneWidth = ((mOutputVideoWidth +1)>>1)<<1;
14559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    M4OSA_UInt32 yv12PlaneHeight = ((mOutputVideoHeight+1)>>1)<<1;
14569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight,
14589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang     (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer);
14599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    err = applyRenderingMode(planeIn, planeOut, mRenderingMode);
14619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    if(err != M4NO_ERROR) {
1462f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block        ALOGE("doImageRenderingMode: applyRenderingMode returned err=0x%x", (unsigned int)err);
14639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    }
14649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    return err;
14659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}
14669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
14679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} //namespace android
1468