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