1efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang/* 2efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * Copyright (C) 2011 The Android Open Source Project 3efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * 4efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * you may not use this file except in compliance with the License. 6efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * You may obtain a copy of the License at 7efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * 8efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * http://www.apache.org/licenses/LICENSE-2.0 9efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * 10efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * Unless required by applicable law or agreed to in writing, software 11efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS, 12efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * See the License for the specific language governing permissions and 14efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * limitations under the License. 15efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang */ 16efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 17efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#define LOG_NDEBUG 1 18efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#define LOG_TAG "VideoEditorPreviewController" 19efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include "VideoEditorPreviewController.h" 20efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 21efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changnamespace android { 22efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 23efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#define PREVIEW_THREAD_STACK_SIZE (65536) 24efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 25efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangVideoEditorPreviewController::VideoEditorPreviewController() 26efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang : mCurrentPlayer(0), 27efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mThreadContext(NULL), 28efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayerState(VePlayerIdle), 29efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPrepareReqest(M4OSA_FALSE), 30efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList(NULL), 31efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberClipsInStoryBoard(0), 32efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberClipsToPreview(0), 33efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mStartingClipIndex(0), 34efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPreviewLooping(M4OSA_FALSE), 35efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCallBackAfterFrameCnt(0), 36efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings(NULL), 37efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberEffects(0), 38efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentClipNumber(-1), 39efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipTotalDuration(0), 40efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentVideoEffect(VIDEO_EFFECT_NONE), 41efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mBackgroundAudioSetting(NULL), 42efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mAudioMixPCMFileHandle(NULL), 43efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget(NULL), 44efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mJniCookie(NULL), 45efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mJniCallback(NULL), 46efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentPlayedDuration(0), 47efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentClipDuration(0), 48efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVideoStoryBoardTimeMsUptoFirstPreviewClip(0), 49efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOverlayState(OVERLAY_CLEAR), 50efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mActivePlayerIndex(0), 51efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth(0), 52efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight(0), 53efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang bStopThreadInProgress(false), 54efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mSemThreadWait(NULL) { 55efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("VideoEditorPreviewController"); 56efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mRenderingMode = M4xVSS_kBlackBorders; 57efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mIsFiftiesEffectStarted = false; 58efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 59efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for (int i=0; i<NBPLAYER_INSTANCES; i++) { 60efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[i] = NULL; 61efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 62efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 63efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 64efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangVideoEditorPreviewController::~VideoEditorPreviewController() { 65efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 i = 0; 66efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 67efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("~VideoEditorPreviewController"); 68efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 69efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Stop the thread if its still running 70efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mThreadContext != NULL) { 71efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_threadSyncStop(mThreadContext); 72efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 73efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("~VideoEditorPreviewController: error 0x%x \ 74efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang in trying to stop thread", err); 75efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Continue even if error 76efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 77efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 78efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_threadSyncClose(mThreadContext); 79efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 80efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("~VideoEditorPreviewController: error 0x%x \ 81efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang in trying to close thread", (unsigned int) err); 82efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Continue even if error 83efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 84efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 85efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mThreadContext = NULL; 86efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 87efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 88efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; 89efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang playerInst++) { 90efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mVePlayer[playerInst] != NULL) { 91efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("clearing mVePlayer %d", playerInst); 92efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst].clear(); 93efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 94efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 95efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 96efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mClipList != NULL) { 97efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Clean up 98efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(i=0;i<mNumberClipsInStoryBoard;i++) 99efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 100efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mClipList[i]->pFile != NULL) { 101efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mClipList[i]->pFile); 102efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->pFile = NULL; 103efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 104efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 105efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mClipList[i]); 106efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 107efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mClipList); 108efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList = NULL; 109efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 110efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 111efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mEffectsSettings) { 112efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(i=0;i<mNumberEffects;i++) { 113efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mEffectsSettings[i].xVSS.pFramingBuffer != NULL) { 114efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mEffectsSettings[i].xVSS.pFramingBuffer->pac_data); 115efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 116efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mEffectsSettings[i].xVSS.pFramingBuffer); 117efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 118efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pFramingBuffer = NULL; 119efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 120efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 121efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mEffectsSettings); 122efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings = NULL; 123efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 124efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 125efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mAudioMixPCMFileHandle) { 126efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_fileReadClose (mAudioMixPCMFileHandle); 127efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mAudioMixPCMFileHandle = M4OSA_NULL; 128efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 129efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 130efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mBackgroundAudioSetting != NULL) { 131efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mBackgroundAudioSetting); 132efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mBackgroundAudioSetting = NULL; 133efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 134efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 135efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget != NULL) { 136efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTarget; 137efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = NULL; 138efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 139efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 140efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOverlayState = OVERLAY_CLEAR; 141efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 142efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("~VideoEditorPreviewController returns"); 143efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 144efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 145efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::loadEditSettings( 146efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VSS3GPP_EditSettings* pSettings,M4xVSS_AudioMixingSettings* bgmSettings) { 147efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 148efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 i = 0, iClipDuration = 0, rgbSize = 0; 149efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VIFI_UInt8 *tmp = NULL; 150efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 151efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 152efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("loadEditSettings"); 153efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("loadEditSettings Channels = %d, sampling Freq %d", 154efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency ); 155efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang bgmSettings->uiSamplingFrequency = 32000; 156efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 157efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("loadEditSettings Channels = %d, sampling Freq %d", 158efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency ); 159efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(mLock); 160efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 161efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Clean up any previous Edit settings before loading new ones 162efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentVideoEffect = VIDEO_EFFECT_NONE; 163efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 164efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mAudioMixPCMFileHandle) { 165efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_fileReadClose (mAudioMixPCMFileHandle); 166efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mAudioMixPCMFileHandle = M4OSA_NULL; 167efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 168efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 169efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mBackgroundAudioSetting != NULL) { 170efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mBackgroundAudioSetting); 171efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mBackgroundAudioSetting = NULL; 172efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 173efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 174efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mClipList != NULL) { 175efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Clean up 176efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(i=0;i<mNumberClipsInStoryBoard;i++) 177efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 178efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mClipList[i]->pFile != NULL) { 179efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mClipList[i]->pFile); 180efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->pFile = NULL; 181efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 182efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 183efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mClipList[i]); 184efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 185efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mClipList); 186efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList = NULL; 187efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 188efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 189efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mEffectsSettings) { 190efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(i=0;i<mNumberEffects;i++) { 191efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mEffectsSettings[i].xVSS.pFramingBuffer != NULL) { 192efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mEffectsSettings[i].xVSS.pFramingBuffer->pac_data); 193efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 194efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mEffectsSettings[i].xVSS.pFramingBuffer); 195efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 196efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pFramingBuffer = NULL; 197efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 198efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 199efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mEffectsSettings); 200efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings = NULL; 201efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 202efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 203efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mClipList == NULL) { 204efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberClipsInStoryBoard = pSettings->uiClipNumber; 205efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("loadEditSettings: # of Clips = %d", mNumberClipsInStoryBoard); 206efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 207efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList = (M4VSS3GPP_ClipSettings**)M4OSA_32bitAlignedMalloc( 208efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber, M4VS, 209efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4OSA_Char*)"LvPP, copy of pClipList"); 210efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 211efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(NULL == mClipList) { 212efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("loadEditSettings: Malloc error"); 213efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 214efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 215efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memset((void *)mClipList,0, 216efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber); 217efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 218efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(i=0;i<pSettings->uiClipNumber;i++) { 219efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 220efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Allocate current clip 221efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i] = 222efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4VSS3GPP_ClipSettings*)M4OSA_32bitAlignedMalloc( 223efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang sizeof(M4VSS3GPP_ClipSettings),M4VS,(M4OSA_Char*)"clip settings"); 224efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 225efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mClipList[i] == NULL) { 226efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 227efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("loadEditSettings: Allocation error for mClipList[%d]", (int)i); 228efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 229efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 230efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Copy plain structure 231efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memcpy((void *)mClipList[i], 232efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (void *)pSettings->pClipList[i], 233efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang sizeof(M4VSS3GPP_ClipSettings)); 234efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 235efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(NULL != pSettings->pClipList[i]->pFile) { 236efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->pFile = (M4OSA_Char*)M4OSA_32bitAlignedMalloc( 237efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->pClipList[i]->filePathSize, M4VS, 238efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4OSA_Char*)"pClipSettingsDest->pFile"); 239efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 240efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(NULL == mClipList[i]->pFile) 241efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 242efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("loadEditSettings : ERROR allocating filename"); 243efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 244efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 245efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 246efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memcpy((void *)mClipList[i]->pFile, 247efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (void *)pSettings->pClipList[i]->pFile, 248efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->pClipList[i]->filePathSize); 249efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 250efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 251efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("NULL file path"); 252efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_PARAMETER; 253efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 254efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 255efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Calculate total duration of all clips 256efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang iClipDuration = pSettings->pClipList[i]->uiEndCutTime - 257efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->pClipList[i]->uiBeginCutTime; 258efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 259efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipTotalDuration = mClipTotalDuration+iClipDuration; 260efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 261efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 262efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 263efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mEffectsSettings == NULL) { 264efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberEffects = pSettings->nbEffects; 265efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("loadEditSettings: mNumberEffects = %d", mNumberEffects); 266efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 267efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mNumberEffects != 0) { 268efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings = (M4VSS3GPP_EffectSettings*)M4OSA_32bitAlignedMalloc( 269efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberEffects*sizeof(M4VSS3GPP_EffectSettings), 270efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VS, (M4OSA_Char*)"effects settings"); 271efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 272efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mEffectsSettings == NULL) { 273efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("loadEffectsSettings: Allocation error"); 274efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 275efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 276efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 277efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memset((void *)mEffectsSettings,0, 278efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberEffects*sizeof(M4VSS3GPP_EffectSettings)); 279efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 280efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(i=0;i<mNumberEffects;i++) { 281efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 282efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pFramingFilePath = NULL; 283efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pFramingBuffer = NULL; 284efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pTextBuffer = NULL; 285efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 286efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memcpy((void *)&(mEffectsSettings[i]), 287efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (void *)&(pSettings->Effects[i]), 288efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang sizeof(M4VSS3GPP_EffectSettings)); 289efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 290efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pSettings->Effects[i].VideoEffectType == 291efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) { 292efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Allocate the pFraming RGB buffer 293efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pFramingBuffer = 294efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(sizeof(M4VIFI_ImagePlane), 295efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VS, (M4OSA_Char*)"lvpp framing buffer"); 296efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 297efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mEffectsSettings[i].xVSS.pFramingBuffer == NULL) { 298efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("loadEffectsSettings:Alloc error for pFramingBuf"); 299efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mEffectsSettings); 300efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings = NULL; 301efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 302efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 303efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 304efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Allocate the pac_data (RGB) 305efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pSettings->Effects[i].xVSS.rgbType == M4VSS3GPP_kRGB565){ 306efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang rgbSize = 307efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.pFramingBuffer->u_width * 308efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.pFramingBuffer->u_height*2; 309efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 310efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else if( 311efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.rgbType == M4VSS3GPP_kRGB888) { 312efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang rgbSize = 313efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.pFramingBuffer->u_width * 314efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.pFramingBuffer->u_height*3; 315efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 316efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 317efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("loadEffectsSettings: wrong RGB type"); 318efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mEffectsSettings); 319efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings = NULL; 320efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_PARAMETER; 321efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 322efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 323efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang tmp = (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(rgbSize, M4VS, 324efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4OSA_Char*)"framing buffer pac_data"); 325efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 326efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(tmp == NULL) { 327efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("loadEffectsSettings:Alloc error pFramingBuf pac"); 328efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mEffectsSettings); 329efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings = NULL; 330efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mEffectsSettings[i].xVSS.pFramingBuffer); 331efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 332efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pFramingBuffer = NULL; 333efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 334efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 335efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang /* Initialize the pFramingBuffer*/ 336efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pFramingBuffer->pac_data = tmp; 337efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pFramingBuffer->u_height = 338efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.pFramingBuffer->u_height; 339efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 340efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pFramingBuffer->u_width = 341efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.pFramingBuffer->u_width; 342efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 343efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pFramingBuffer->u_stride = 344efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.pFramingBuffer->u_stride; 345efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 346efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pFramingBuffer->u_topleft = 347efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.pFramingBuffer->u_topleft; 348efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 349efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.uialphaBlendingStart = 350efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.uialphaBlendingStart; 351efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 352efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.uialphaBlendingMiddle = 353efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.uialphaBlendingMiddle; 354efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 355efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.uialphaBlendingEnd = 356efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.uialphaBlendingEnd; 357efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 358efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.uialphaBlendingFadeInTime = 359efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.uialphaBlendingFadeInTime; 360efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.uialphaBlendingFadeOutTime = 361efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.uialphaBlendingFadeOutTime; 362efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 363efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Copy the pFraming data 364efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memcpy((void *) 365efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.pFramingBuffer->pac_data, 366efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (void *)pSettings->Effects[i].xVSS.pFramingBuffer->pac_data, 367efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang rgbSize); 368efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 369efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[i].xVSS.rgbType = 370efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pSettings->Effects[i].xVSS.rgbType; 371efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 372efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 373efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 374efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 375efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 376efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mBackgroundAudioSetting == NULL) { 377efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 378efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mBackgroundAudioSetting = (M4xVSS_AudioMixingSettings*)M4OSA_32bitAlignedMalloc( 379efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang sizeof(M4xVSS_AudioMixingSettings), M4VS, 380efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4OSA_Char*)"LvPP, copy of bgmSettings"); 381efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 382efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(NULL == mBackgroundAudioSetting) { 383efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("loadEditSettings: mBackgroundAudioSetting Malloc failed"); 384efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 385efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 386efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 387efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memset((void *)mBackgroundAudioSetting, 0,sizeof(M4xVSS_AudioMixingSettings*)); 388efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memcpy((void *)mBackgroundAudioSetting, (void *)bgmSettings, sizeof(M4xVSS_AudioMixingSettings)); 389efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 390efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if ( mBackgroundAudioSetting->pFile != M4OSA_NULL ) { 391efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 392efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mBackgroundAudioSetting->pFile = (M4OSA_Void*) bgmSettings->pPCMFilePath; 393efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mBackgroundAudioSetting->uiNbChannels = 2; 394efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mBackgroundAudioSetting->uiSamplingFrequency = 32000; 395efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 396efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 397efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Open the BG file 398efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if ( mBackgroundAudioSetting->pFile != M4OSA_NULL ) { 399efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_fileReadOpen(&mAudioMixPCMFileHandle, 400efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mBackgroundAudioSetting->pFile, M4OSA_kFileRead); 401efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 402efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (err != M4NO_ERROR) { 403efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("loadEditSettings: mBackgroundAudio PCM File open failed"); 404efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_PARAMETER; 405efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 406efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 407efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 408efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 409efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoSize = pSettings->xVSS.outputVideoSize; 410efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mFrameStr.pBuffer = M4OSA_NULL; 411efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4NO_ERROR; 412efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 413efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 414efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::setSurface(const sp<Surface> &surface) { 415efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setSurface"); 416efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(mLock); 417efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 418efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mSurface = surface; 419efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4NO_ERROR; 420efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 421efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 422efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::startPreview( 423efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 fromMS, M4OSA_Int32 toMs, M4OSA_UInt16 callBackAfterFrameCount, 424efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_Bool loop) { 425efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 426efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 427efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 i = 0, iIncrementedDuration = 0; 428efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview"); 429efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 430efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(fromMS > (M4OSA_UInt32)toMs) { 431efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("startPreview: fromMS > toMs"); 432efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_PARAMETER; 433efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 434efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 435efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(toMs == 0) { 436efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("startPreview: toMs is 0"); 437efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_PARAMETER; 438efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 439efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 440efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // If already started, then stop preview first 441efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) { 442efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mVePlayer[playerInst] != NULL) { 443efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: stopping previously started preview playback"); 444efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang stopPreview(); 445efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 446efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 447efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 448efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 449efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // If renderPreview was called previously, then delete Renderer object first 450efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget != NULL) { 451efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: delete previous PreviewRenderer"); 452efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTarget; 453efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = NULL; 454efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 455efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 456efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Create Audio player to be used for entire 457efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // storyboard duration 458efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVEAudioSink = new VideoEditorPlayer::VeAudioOutput(); 459efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVEAudioPlayer = new VideoEditorAudioPlayer(mVEAudioSink); 460efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVEAudioPlayer->setAudioMixSettings(mBackgroundAudioSetting); 461efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVEAudioPlayer->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle); 462efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 4639133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang // Create Video Renderer to be used for the entire storyboard duration. 4649133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang uint32_t width, height; 4659133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang getVideoSizeByResolution(mOutputVideoSize, &width, &height); 4669133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang mNativeWindowRenderer = new NativeWindowRenderer(mSurface, width, height); 4679133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang 468efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: loop = %d", loop); 469efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPreviewLooping = loop; 470efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 471efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: callBackAfterFrameCount = %d", callBackAfterFrameCount); 472efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCallBackAfterFrameCnt = callBackAfterFrameCount; 473efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 474efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) { 4759133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang mVePlayer[playerInst] = new VideoEditorPlayer(mNativeWindowRenderer); 476efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mVePlayer[playerInst] == NULL) { 477efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("startPreview:Error creating VideoEditorPlayer %d",playerInst); 478efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 479efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 480efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: object created"); 481efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 482efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->setNotifyCallback(this,(notify_callback_f)notify); 483efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: notify callback set"); 484efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 485efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->loadEffectsSettings(mEffectsSettings, 486efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberEffects); 487efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: effects settings loaded"); 488efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 489efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->loadAudioMixSettings(mBackgroundAudioSetting); 490efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: AudioMixSettings settings loaded"); 491efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 492efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle); 493efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: AudioMixPCMFileHandle set"); 494efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 495efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->setProgressCallbackInterval( 496efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCallBackAfterFrameCnt); 497efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: setProgressCallBackInterval"); 498efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 499efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 500efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayerState = VePlayerIdle; 501efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPrepareReqest = M4OSA_FALSE; 502efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 503efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(fromMS == 0) { 504efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentClipNumber = -1; 505efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Save original value 506efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mFirstPreviewClipBeginTime = mClipList[0]->uiBeginCutTime; 507efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVideoStoryBoardTimeMsUptoFirstPreviewClip = 0; 508efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 509efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 510efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: fromMS=%d", fromMS); 511efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(fromMS >= mClipTotalDuration) { 512efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("startPreview: fromMS >= mClipTotalDuration"); 513efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_PARAMETER; 514efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 515efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(i=0;i<mNumberClipsInStoryBoard;i++) { 516efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(fromMS < (iIncrementedDuration + (mClipList[i]->uiEndCutTime - 517efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->uiBeginCutTime))) { 518efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set to 1 index below, 519efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // as threadProcess first increments the clip index 520efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // and then processes clip in thread loop 521efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentClipNumber = i-1; 5225694fb4b48eef9364473c34f0e013dc4baf576e6Chih-Chung Chang LOGD("startPreview:mCurrentClipNumber = %d fromMS=%d",i,fromMS); 523efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 524efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Save original value 525efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mFirstPreviewClipBeginTime = mClipList[i]->uiBeginCutTime; 526efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 527efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set correct begin time to start playback 528efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((fromMS+mClipList[i]->uiBeginCutTime) > 529efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (iIncrementedDuration+mClipList[i]->uiBeginCutTime)) { 530efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 531efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->uiBeginCutTime = 532efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->uiBeginCutTime + 533efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (fromMS - iIncrementedDuration); 534efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 535efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 536efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 537efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 538efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang iIncrementedDuration = iIncrementedDuration + 539efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime); 540efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 541efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 542efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVideoStoryBoardTimeMsUptoFirstPreviewClip = iIncrementedDuration; 543efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 544efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 545efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) { 546efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->setAudioMixStoryBoardParam(fromMS, 547efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mFirstPreviewClipBeginTime, 548efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->ClipProperties.uiClipAudioVolumePercentage); 549efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 550efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview:setAudioMixStoryBoardSkimTimeStamp set %d cuttime \ 551efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang %d", fromMS, mFirstPreviewClipBeginTime); 552efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 553efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 554efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mStartingClipIndex = mCurrentClipNumber+1; 555efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 556efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Start playing with player instance 0 557efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentPlayer = 0; 558efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mActivePlayerIndex = 0; 559efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 560efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(toMs == -1) { 561efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: Preview till end of storyboard"); 562efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberClipsToPreview = mNumberClipsInStoryBoard; 563efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Save original value 564efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mLastPreviewClipEndTime = 565efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[mNumberClipsToPreview-1]->uiEndCutTime; 566efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 567efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 568efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: toMs=%d", toMs); 569efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)toMs > mClipTotalDuration) { 570efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("startPreview: toMs > mClipTotalDuration"); 571efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_PARAMETER; 572efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 573efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 574efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang iIncrementedDuration = 0; 575efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 576efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(i=0;i<mNumberClipsInStoryBoard;i++) { 577efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)toMs <= (iIncrementedDuration + 578efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime))) { 579efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Save original value 580efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mLastPreviewClipEndTime = mClipList[i]->uiEndCutTime; 581efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set the end cut time of clip index i to toMs 582efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->uiEndCutTime = toMs; 583efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 584efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Number of clips to be previewed is from index 0 to i 585efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // increment by 1 as i starts from 0 586efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberClipsToPreview = i+1; 587efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 588efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 589efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 590efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang iIncrementedDuration = iIncrementedDuration + 591efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime); 592efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 593efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 594efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 595efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 596efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Open the thread semaphore 597efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_semaphoreOpen(&mSemThreadWait, 1); 598efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 599efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Open the preview process thread 600efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_threadSyncOpen(&mThreadContext, (M4OSA_ThreadDoIt)threadProc); 601efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (M4NO_ERROR != err) { 602efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("VideoEditorPreviewController:M4OSA_threadSyncOpen error %d", (int) err); 603efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 604efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 605efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 606efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set the stacksize 607efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_threadSyncSetOption(mThreadContext, M4OSA_ThreadStackSize, 608efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4OSA_DataOption)PREVIEW_THREAD_STACK_SIZE); 609efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 610efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (M4NO_ERROR != err) { 611efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("VideoEditorPreviewController: threadSyncSetOption error %d", (int) err); 612efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_threadSyncClose(mThreadContext); 613efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mThreadContext = NULL; 614efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 615efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 616efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 617efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Start the thread 618efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_threadSyncStart(mThreadContext, (M4OSA_Void*)this); 619efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (M4NO_ERROR != err) { 620efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("VideoEditorPreviewController: threadSyncStart error %d", (int) err); 621efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_threadSyncClose(mThreadContext); 622efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mThreadContext = NULL; 623efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 624efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 625efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang bStopThreadInProgress = false; 626efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 627efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: process thread started"); 628efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4NO_ERROR; 629efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 630efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 631efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_UInt32 VideoEditorPreviewController::stopPreview() { 632efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 633efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang uint32_t lastRenderedFrameTimeMs = 0; 634efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stopPreview"); 635efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 636efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Stop the thread 637efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mThreadContext != NULL) { 638efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang bStopThreadInProgress = true; 639efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 640efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(mLockSem); 641efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mSemThreadWait != NULL) { 642efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_semaphorePost(mSemThreadWait); 643efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 644efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 645efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 646efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_threadSyncStop(mThreadContext); 647efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 648efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stopPreview: error 0x%x in trying to stop thread", err); 649efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Continue even if error 650efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 651efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 652efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_threadSyncClose(mThreadContext); 653efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 654efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("stopPreview: error 0x%x in trying to close thread", (unsigned int)err); 655efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Continue even if error 656efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 657efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 658efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mThreadContext = NULL; 659efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 660efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 661efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Close the semaphore first 662efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 663efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(mLockSem); 664efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mSemThreadWait != NULL) { 665efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_semaphoreClose(mSemThreadWait); 666efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stopPreview: close semaphore returns 0x%x", err); 667efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mSemThreadWait = NULL; 668efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 669efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 670efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 671efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) { 672efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mVePlayer[playerInst] != NULL) { 673efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mVePlayer[playerInst]->isPlaying()) { 674efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stop the player first"); 675efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->stop(); 676efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 677efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (playerInst == mActivePlayerIndex) { 678efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Return the last rendered frame time stamp 679efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[mActivePlayerIndex]->getLastRenderedTimeMs(&lastRenderedFrameTimeMs); 680efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 6812d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla 6822d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla //This is used to syncronize onStreamDone() in PreviewPlayer and 683efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //stopPreview() in PreviewController 6842d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla sp<VideoEditorPlayer> temp = mVePlayer[playerInst]; 6852d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla temp->acquireLock(); 6862d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla LOGV("stopPreview: clearing mVePlayer"); 6872d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla mVePlayer[playerInst].clear(); 688efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst] = NULL; 6892d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla temp->releaseLock(); 690efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 691efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 692efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stopPreview: clear audioSink and audioPlayer"); 693efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVEAudioSink.clear(); 694efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mVEAudioPlayer) { 695efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mVEAudioPlayer; 696efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVEAudioPlayer = NULL; 6972d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla } 698efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 6999133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang delete mNativeWindowRenderer; 7009133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang mNativeWindowRenderer = NULL; 7019133a10ed22acc8b2154ab187f301945bf51a1f9Chih-Chung Chang 702efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // If image file playing, then free the buffer pointer 703efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mFrameStr.pBuffer != M4OSA_NULL) { 704efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mFrameStr.pBuffer); 705efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mFrameStr.pBuffer = M4OSA_NULL; 706efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 707efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 708efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Reset original begin cuttime of first previewed clip*/ 709efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[mStartingClipIndex]->uiBeginCutTime = mFirstPreviewClipBeginTime; 710efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Reset original end cuttime of last previewed clip*/ 711efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[mNumberClipsToPreview-1]->uiEndCutTime = mLastPreviewClipEndTime; 712efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 713efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayerState = VePlayerIdle; 714efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPrepareReqest = M4OSA_FALSE; 715efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 716efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentPlayedDuration = 0; 717efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentClipDuration = 0; 718efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mRenderingMode = M4xVSS_kBlackBorders; 719efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 0; 720efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 0; 721efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 722efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stopPreview() lastRenderedFrameTimeMs %ld", lastRenderedFrameTimeMs); 723efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return lastRenderedFrameTimeMs; 724efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 725efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 726efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::clearSurface( 727efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang const sp<Surface> &surface, VideoEditor_renderPreviewFrameStr* pFrameInfo) { 728efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 729efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 730efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo; 731efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0; 732efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VIFI_ImagePlane planeOut[3]; 733efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("Inside preview clear frame"); 734efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 735efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(mLock); 736efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 737efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Delete previous renderer instance 738efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget != NULL) { 739efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTarget; 740efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = NULL; 741efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 742efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 743efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang outputBufferWidth = pFrameStr->uiFrameWidth; 744efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang outputBufferHeight = pFrameStr->uiFrameHeight; 745efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 746efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Initialize the renderer 747efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget == NULL) { 748efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 749efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = PreviewRenderer::CreatePreviewRenderer( 750b8893f89c05bd9848d8d870d2c5963ea4ad315c3Chih-Chung Chang surface, 751b8893f89c05bd9848d8d870d2c5963ea4ad315c3Chih-Chung Chang outputBufferWidth, outputBufferHeight); 752efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 753efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget == NULL) { 754efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("renderPreviewFrame: cannot create PreviewRenderer"); 755efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 756efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 757efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 758efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 759efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Out plane 760efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang uint8_t* outBuffer; 761efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang size_t outBufferStride = 0; 762efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 763efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("doMediaRendering CALL getBuffer()"); 764efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget->getBufferYV12(&outBuffer, &outBufferStride); 765efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 766efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set the output YUV420 plane to be compatible with YV12 format 767efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //In YV12 format, sizes must be even 768efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 yv12PlaneWidth = ((outputBufferWidth +1)>>1)<<1; 769efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 yv12PlaneHeight = ((outputBufferHeight+1)>>1)<<1; 770efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 771efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight, 772efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer); 773efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 774efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang /* Fill the surface with black frame */ 775efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memset((void *)planeOut[0].pac_data,0x00,planeOut[0].u_width * 776efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang planeOut[0].u_height * 1.5); 777efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memset((void *)planeOut[1].pac_data,128,planeOut[1].u_width * 778efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang planeOut[1].u_height); 779efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memset((void *)planeOut[2].pac_data,128,planeOut[2].u_width * 780efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang planeOut[2].u_height); 781efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 782efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget->renderYV12(); 783efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 784efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 785efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 786efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::renderPreviewFrame( 787efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang const sp<Surface> &surface, 788efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditor_renderPreviewFrameStr* pFrameInfo, 789efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditorCurretEditInfo *pCurrEditInfo) { 790efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 791efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 792efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 i = 0, iIncrementedDuration = 0, tnTimeMs=0, framesize =0; 793efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo; 794efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VIFI_UInt8 *pixelArray = NULL; 795efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(mLock); 796efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 797efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pCurrEditInfo != NULL) { 798efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pCurrEditInfo->overlaySettingsIndex = -1; 799efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 800efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Delete previous renderer instance 801efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget != NULL) { 802efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTarget; 803efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = NULL; 804efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 805efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 806efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mOutputVideoWidth == 0) { 807efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = pFrameStr->uiFrameWidth; 808efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 809efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 810efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mOutputVideoHeight == 0) { 811efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = pFrameStr->uiFrameHeight; 812efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 813efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 814efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Initialize the renderer 815efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget == NULL) { 816efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = PreviewRenderer::CreatePreviewRenderer( 817b8893f89c05bd9848d8d870d2c5963ea4ad315c3Chih-Chung Chang surface, 818b8893f89c05bd9848d8d870d2c5963ea4ad315c3Chih-Chung Chang mOutputVideoWidth, mOutputVideoHeight); 819efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 820efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget == NULL) { 821efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("renderPreviewFrame: cannot create PreviewRenderer"); 822efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 823efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 824efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 825efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 826efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pixelArray = NULL; 827efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 82816757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury // Apply rotation if required 82916757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury if (pFrameStr->videoRotationDegree != 0) { 83016757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury err = applyVideoRotation((M4OSA_Void *)pFrameStr->pBuffer, 83116757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury pFrameStr->uiFrameWidth, pFrameStr->uiFrameHeight, 83216757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury pFrameStr->videoRotationDegree); 83316757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury if (M4NO_ERROR != err) { 83416757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury LOGE("renderPreviewFrame: cannot rotate video, err 0x%x", (unsigned int)err); 83516757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury delete mTarget; 83616757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury mTarget = NULL; 83716757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury return err; 83816757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury } else { 83916757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury // Video rotation done. 84016757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury // Swap width and height if 90 or 270 degrees 84116757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury if (pFrameStr->videoRotationDegree != 180) { 84216757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury int32_t temp = pFrameStr->uiFrameWidth; 84316757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury pFrameStr->uiFrameWidth = pFrameStr->uiFrameHeight; 84416757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury pFrameStr->uiFrameHeight = temp; 84516757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury } 84616757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury } 84716757d256453f0c765c13ca9d97ca89fc5565420Rajneesh Chowdury } 848efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Postprocessing (apply video effect) 849efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pFrameStr->bApplyEffect == M4OSA_TRUE) { 850efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 851efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(i=0;i<mNumberEffects;i++) { 852efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // First check if effect starttime matches the clip being previewed 853efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((mEffectsSettings[i].uiStartTime < pFrameStr->clipBeginCutTime) 854efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang ||(mEffectsSettings[i].uiStartTime >= pFrameStr->clipEndCutTime)) { 855efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // This effect doesn't belong to this clip, check next one 856efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang continue; 857efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 858efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((mEffectsSettings[i].uiStartTime <= pFrameStr->timeMs) && 859efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >= 860efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pFrameStr->timeMs) && (mEffectsSettings[i].uiDuration != 0)) { 861efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang setVideoEffectType(mEffectsSettings[i].VideoEffectType, TRUE); 862efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 863efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 864efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang setVideoEffectType(mEffectsSettings[i].VideoEffectType, FALSE); 865efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 866efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 867efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 868efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //Provide the overlay Update indication when there is an overlay effect 869efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mCurrentVideoEffect & VIDEO_EFFECT_FRAMING) { 870efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 index; 871efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentVideoEffect &= ~VIDEO_EFFECT_FRAMING; //never apply framing here. 872efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 873efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Find the effect in effectSettings array 874efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for (index = 0; index < mNumberEffects; index++) { 875efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mEffectsSettings[index].VideoEffectType == 876efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) { 877efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 878efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((mEffectsSettings[index].uiStartTime <= pFrameInfo->timeMs) && 879efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang ((mEffectsSettings[index].uiStartTime+ 880efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[index].uiDuration) >= pFrameInfo->timeMs)) 881efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 882efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 883efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 884efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 885efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 886efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if ((index < mNumberEffects) && (pCurrEditInfo != NULL)) { 887efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pCurrEditInfo->overlaySettingsIndex = index; 888efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("Framing index = %d", index); 889efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } else { 890efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("No framing effects found"); 891efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 892efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 893efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 894efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) { 895efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = applyVideoEffect((M4OSA_Void *)pFrameStr->pBuffer, 896efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth, 897efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pFrameStr->uiFrameHeight, pFrameStr->timeMs, 898efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4OSA_Void *)pixelArray); 899efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 900efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 901efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("renderPreviewFrame: applyVideoEffect error 0x%x", (unsigned int)err); 902efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTarget; 903efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = NULL; 904efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(pixelArray); 905efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pixelArray = NULL; 906efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 907efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 908efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentVideoEffect = VIDEO_EFFECT_NONE; 909efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 910efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 911efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Apply the rendering mode 912efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer, 913efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth, 914efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray); 915efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 916efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 917efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("renderPreviewFrame:doImageRenderingMode error 0x%x", (unsigned int)err); 918efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTarget; 919efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = NULL; 920efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(pixelArray); 921efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pixelArray = NULL; 922efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 923efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 924efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 925efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 926efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 927efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Apply the rendering mode 928efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer, 929efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth, 930efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray); 931efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 932efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 933efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("renderPreviewFrame: doImageRenderingMode error 0x%x", (unsigned int)err); 934efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTarget; 935efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = NULL; 936efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(pixelArray); 937efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pixelArray = NULL; 938efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 939efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 940efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 941efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 942efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget->renderYV12(); 943efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 944efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 945efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 946efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_Void VideoEditorPreviewController::setJniCallback(void* cookie, 947efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang jni_progress_callback_fct callbackFct) { 948efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //LOGV("setJniCallback"); 949efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mJniCookie = cookie; 950efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mJniCallback = callbackFct; 951efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 952efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 953efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::preparePlayer( 954efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang void* param, int playerInstance, int index) { 955efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 956efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 957efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditorPreviewController *pController = 958efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (VideoEditorPreviewController *)param; 959efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 960efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: instance %d file %d", playerInstance, index); 961efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 962efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setDataSource( 963efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (const char *)pController->mClipList[index]->pFile, NULL); 964efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: setDataSource instance %s", 965efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (const char *)pController->mClipList[index]->pFile); 966efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 967efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setVideoSurface( 968efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mSurface); 969efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: setVideoSurface"); 970efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 971efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setMediaRenderingMode( 972efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->xVSS.MediaRendering, 973efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mOutputVideoSize); 974efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: setMediaRenderingMode"); 975efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 976efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)index == pController->mStartingClipIndex) { 977efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setPlaybackBeginTime( 978efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mFirstPreviewClipBeginTime); 979efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 980efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 981efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setPlaybackBeginTime( 982efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime); 983efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 984efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: setPlaybackBeginTime(%d)", 985efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime); 986efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 987efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setPlaybackEndTime( 988efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiEndCutTime); 989efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: setPlaybackEndTime(%d)", 990efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiEndCutTime); 991efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 992efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mClipList[index]->FileType == M4VIDEOEDITING_kFileType_ARGB8888) { 993efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setImageClipProperties( 994efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->ClipProperties.uiVideoWidth, 995efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->ClipProperties.uiVideoHeight); 996efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: setImageClipProperties"); 997efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 998efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 999efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->prepare(); 1000efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: prepared"); 1001efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1002efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mClipList[index]->uiBeginCutTime > 0) { 1003efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->seekTo( 1004efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime); 1005efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1006efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: seekTo(%d)", 1007efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime); 1008efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1009efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[pController->mCurrentPlayer]->setAudioPlayer(pController->mVEAudioPlayer); 1010efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1011efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->readFirstVideoFrame(); 1012efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: readFirstVideoFrame of clip"); 1013efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1014efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 1015efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1016efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1017efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::threadProc(M4OSA_Void* param) { 1018efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 1019efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_Int32 index = 0; 1020efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditorPreviewController *pController = 1021efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (VideoEditorPreviewController *)param; 1022efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1023efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("inside threadProc"); 1024efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mPlayerState == VePlayerIdle) { 1025efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (pController->mCurrentClipNumber)++; 1026efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 10275694fb4b48eef9364473c34f0e013dc4baf576e6Chih-Chung Chang LOGD("threadProc: playing file index %d total clips %d", 1028efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipNumber, pController->mNumberClipsToPreview); 1029efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1030efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)pController->mCurrentClipNumber >= 1031efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mNumberClipsToPreview) { 1032efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 10335694fb4b48eef9364473c34f0e013dc4baf576e6Chih-Chung Chang LOGD("All clips previewed"); 1034efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1035efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayedDuration = 0; 1036efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipDuration = 0; 1037efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayer = 0; 1038efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1039efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mPreviewLooping == M4OSA_TRUE) { 1040efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipNumber = 1041efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mStartingClipIndex; 1042efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 10435694fb4b48eef9364473c34f0e013dc4baf576e6Chih-Chung Chang LOGD("Preview looping TRUE, restarting from clip index %d", 1044efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipNumber); 1045efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1046efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Reset the story board timestamp inside the player 1047efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; 1048efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang playerInst++) { 1049efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInst]->resetJniCallbackTimeStamp(); 1050efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1051efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1052efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 1053efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 endArgs = 0; 1054efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mJniCallback != NULL) { 1055efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback( 1056efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCookie, MSG_TYPE_PREVIEW_END, &endArgs); 1057efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1058efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mPlayerState = VePlayerAutoStop; 1059efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1060efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Reset original begin cuttime of first previewed clip 1061efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mStartingClipIndex]->uiBeginCutTime = 1062efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mFirstPreviewClipBeginTime; 1063efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Reset original end cuttime of last previewed clip 1064efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mNumberClipsToPreview-1]->uiEndCutTime = 1065efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mLastPreviewClipEndTime; 1066efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1067efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Return a warning to M4OSA thread handler 1068efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // so that thread is moved from executing state to open state 1069efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4WAR_NO_MORE_STREAM; 1070efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1071efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1072efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1073efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang index=pController->mCurrentClipNumber; 1074efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)pController->mCurrentClipNumber == pController->mStartingClipIndex) { 1075efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayedDuration += 1076efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVideoStoryBoardTimeMsUptoFirstPreviewClip; 1077efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1078efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipDuration = 1079efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime 1080efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang - pController->mFirstPreviewClipBeginTime; 1081efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1082efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang preparePlayer((void*)pController, pController->mCurrentPlayer, index); 1083efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1084efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 1085efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayedDuration += 1086efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipDuration; 1087efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1088efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipDuration = 1089efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime - 1090efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime; 1091efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1092efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1093efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[pController->mCurrentPlayer]->setStoryboardStartTime( 1094efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayedDuration); 1095efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("threadProc: setStoryboardStartTime"); 1096efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1097efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set the next clip duration for Audio mix here 1098efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)pController->mCurrentClipNumber != pController->mStartingClipIndex) { 1099efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1100efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[pController->mCurrentPlayer]->setAudioMixStoryBoardParam( 1101efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayedDuration, 1102efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime, 1103efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage); 1104efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1105efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("threadProc: setAudioMixStoryBoardParam fromMS %d \ 1106efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang ClipBeginTime %d", pController->mCurrentPlayedDuration + 1107efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime, 1108efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime, 1109efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage); 1110efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1111efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Capture the active player being used 1112efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mActivePlayerIndex = pController->mCurrentPlayer; 1113efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1114efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[pController->mCurrentPlayer]->start(); 1115efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("threadProc: started"); 1116efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1117efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mPlayerState = VePlayerBusy; 1118efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1119efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } else if(pController->mPlayerState == VePlayerAutoStop) { 1120efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("Preview completed..auto stop the player"); 1121efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } else if ((pController->mPlayerState == VePlayerBusy) && (pController->mPrepareReqest)) { 1122efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Prepare the player here 1123efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mPrepareReqest = M4OSA_FALSE; 1124efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang preparePlayer((void*)pController, pController->mCurrentPlayer, 1125efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipNumber+1); 1126efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mSemThreadWait != NULL) { 1127efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_semaphoreWait(pController->mSemThreadWait, 1128efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_WAIT_FOREVER); 1129efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1130efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } else { 1131efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (!pController->bStopThreadInProgress) { 1132efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("threadProc: state busy...wait for sem"); 1133efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mSemThreadWait != NULL) { 1134efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_semaphoreWait(pController->mSemThreadWait, 1135efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_WAIT_FOREVER); 1136efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1137efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1138efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("threadProc: sem wait returned err = 0x%x", err); 1139efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1140efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1141efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //Always return M4NO_ERROR to ensure the thread keeps running 1142efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4NO_ERROR; 1143efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1144efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1145efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPreviewController::notify( 1146efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang void* cookie, int msg, int ext1, int ext2) 1147efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang{ 1148efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditorPreviewController *pController = 1149efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (VideoEditorPreviewController *)cookie; 1150efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1151efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 1152efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang uint32_t clipDuration = 0; 1153efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang switch (msg) { 1154efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_NOP: // interface test message 1155efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("MEDIA_NOP"); 1156efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1157efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_PREPARED: 1158efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("MEDIA_PREPARED"); 1159efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1160efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_PLAYBACK_COMPLETE: 1161efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 11625694fb4b48eef9364473c34f0e013dc4baf576e6Chih-Chung Chang LOGD("notify:MEDIA_PLAYBACK_COMPLETE, mCurrentClipNumber = %d", 11635694fb4b48eef9364473c34f0e013dc4baf576e6Chih-Chung Chang pController->mCurrentClipNumber); 1164efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mPlayerState = VePlayerIdle; 1165efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1166efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //send progress callback with last frame timestamp 1167efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)pController->mCurrentClipNumber == 1168efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mStartingClipIndex) { 1169efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang clipDuration = 1170efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime 1171efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang - pController->mFirstPreviewClipBeginTime; 1172efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1173efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 1174efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang clipDuration = 1175efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime 1176efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang - pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime; 1177efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1178efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1179efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 playedDuration = clipDuration+pController->mCurrentPlayedDuration; 1180efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback( 1181efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION, 1182efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang &playedDuration); 1183efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1184efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if ((pController->mOverlayState == OVERLAY_UPDATE) && 1185efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang ((M4OSA_UInt32)pController->mCurrentClipNumber != 1186efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (pController->mNumberClipsToPreview-1))) { 1187efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditorCurretEditInfo *pEditInfo = 1188efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo), 1189efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VS, (M4OSA_Char*)"Current Edit info"); 1190efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pEditInfo->overlaySettingsIndex = ext2; 1191efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pEditInfo->clipIndex = pController->mCurrentClipNumber; 1192efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mOverlayState == OVERLAY_CLEAR; 1193efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mJniCallback != NULL) { 1194efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback(pController->mJniCookie, 1195efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang MSG_TYPE_OVERLAY_CLEAR, pEditInfo); 1196efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1197efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(pEditInfo); 1198efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1199efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 1200efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(pController->mLockSem); 1201efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mSemThreadWait != NULL) { 12022d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla M4OSA_semaphorePost(pController->mSemThreadWait); 12032d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla return; 1204efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1205efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1206efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1207efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1208efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1209efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_ERROR: 1210efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 1211efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int err_val = ext1; 1212efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Always log errors. 1213efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // ext1: Media framework error code. 1214efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // ext2: Implementation dependant error code. 1215efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("MEDIA_ERROR; error (%d, %d)", ext1, ext2); 1216efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mJniCallback != NULL) { 1217efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback(pController->mJniCookie, 1218efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang MSG_TYPE_PLAYER_ERROR, &err_val); 1219efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1220efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1221efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1222efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_INFO: 1223efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 1224efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int info_val = ext2; 1225efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // ext1: Media framework error code. 1226efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // ext2: Implementation dependant error code. 1227efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //LOGW("MEDIA_INFO; info/warning (%d, %d)", ext1, ext2); 1228efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mJniCallback != NULL) { 1229efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback(pController->mJniCookie, 1230efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang MSG_TYPE_PROGRESS_INDICATION, &info_val); 1231efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1232efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1233efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1234efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_SEEK_COMPLETE: 1235efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("MEDIA_SEEK_COMPLETE; Received seek complete"); 1236efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1237efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_BUFFERING_UPDATE: 1238efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("MEDIA_BUFFERING_UPDATE; buffering %d", ext1); 1239efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1240efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_SET_VIDEO_SIZE: 1241efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("MEDIA_SET_VIDEO_SIZE; New video size %d x %d", ext1, ext2); 1242efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1243efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case 0xAAAAAAAA: 1244efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("VIDEO PLAYBACK ALMOST over, prepare next player"); 1245efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Select next player and prepare it 1246efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // If there is a clip after this one 1247efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if ((M4OSA_UInt32)(pController->mCurrentClipNumber+1) < 1248efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mNumberClipsToPreview) { 1249efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mPrepareReqest = M4OSA_TRUE; 1250efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayer++; 1251efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mCurrentPlayer >= NBPLAYER_INSTANCES) { 1252efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayer = 0; 1253efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1254efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Prepare the first clip to be played 1255efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 1256efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(pController->mLockSem); 1257efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mSemThreadWait != NULL) { 1258efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_semaphorePost(pController->mSemThreadWait); 1259efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1260efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1261efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1262efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1263efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case 0xBBBBBBBB: 1264efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 1265efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("VIDEO PLAYBACK, Update Overlay"); 1266efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int overlayIndex = ext2; 1267efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditorCurretEditInfo *pEditInfo = 1268efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo), 1269efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VS, (M4OSA_Char*)"Current Edit info"); 1270efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //ext1 = 1; start the overlay display 1271efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // = 2; Clear the overlay. 1272efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pEditInfo->overlaySettingsIndex = ext2; 1273efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pEditInfo->clipIndex = pController->mCurrentClipNumber; 1274efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("pController->mCurrentClipNumber = %d",pController->mCurrentClipNumber); 1275efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mJniCallback != NULL) { 1276efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (ext1 == 1) { 1277efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mOverlayState = OVERLAY_UPDATE; 1278efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback(pController->mJniCookie, 1279efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang MSG_TYPE_OVERLAY_UPDATE, pEditInfo); 1280efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } else { 1281efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mOverlayState = OVERLAY_CLEAR; 1282efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback(pController->mJniCookie, 1283efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang MSG_TYPE_OVERLAY_CLEAR, pEditInfo); 1284efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1285efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1286efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(pEditInfo); 1287efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1288efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1289efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang default: 1290efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2); 1291efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1292efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1293efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1294efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1295efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPreviewController::setVideoEffectType( 1296efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) { 1297efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1298efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 effect = VIDEO_EFFECT_NONE; 1299efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1300efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // map M4VSS3GPP_VideoEffectType to local enum 1301efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang switch(type) { 1302efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VSS3GPP_kVideoEffectType_FadeFromBlack: 1303efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_FADEFROMBLACK; 1304efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1305efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1306efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VSS3GPP_kVideoEffectType_FadeToBlack: 1307efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_FADETOBLACK; 1308efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1309efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1310efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_BlackAndWhite: 1311efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_BLACKANDWHITE; 1312efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1313efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1314efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Pink: 1315efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_PINK; 1316efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1317efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1318efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Green: 1319efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_GREEN; 1320efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1321efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1322efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Sepia: 1323efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_SEPIA; 1324efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1325efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1326efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Negative: 1327efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_NEGATIVE; 1328efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1329efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1330efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Framing: 1331efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_FRAMING; 1332efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1333efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1334efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Fifties: 1335efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_FIFTIES; 1336efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1337efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1338efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_ColorRGB16: 1339efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_COLOR_RGB16; 1340efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1341efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1342efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Gradient: 1343efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_GRADIENT; 1344efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1345efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1346efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang default: 1347efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_NONE; 1348efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1349efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1350efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1351efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(enable == M4OSA_TRUE) { 1352efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // If already set, then no need to set again 1353efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(!(mCurrentVideoEffect & effect)) 1354efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentVideoEffect |= effect; 1355efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(effect == VIDEO_EFFECT_FIFTIES) { 1356efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mIsFiftiesEffectStarted = true; 1357efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1358efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1359efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 1360efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Reset only if already set 1361efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mCurrentVideoEffect & effect) 1362efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentVideoEffect &= ~effect; 1363efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1364efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1365efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return; 1366efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1367efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1368efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1369efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::applyVideoEffect( 1370efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth, 1371efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 videoHeight, M4OSA_UInt32 timeMs, M4OSA_Void* outPtr) { 1372efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1373efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 1374efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang vePostProcessParams postProcessParams; 1375efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1376efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.vidBuffer = (M4VIFI_UInt8*)dataPtr; 1377efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.videoWidth = videoWidth; 1378efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.videoHeight = videoHeight; 1379efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.timeMs = timeMs; 1380efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.timeOffset = 0; //Since timeMS already takes care of offset in this case 1381efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.effectsSettings = mEffectsSettings; 1382efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.numberEffects = mNumberEffects; 1383efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.outVideoWidth = mOutputVideoWidth; 1384efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.outVideoHeight = mOutputVideoHeight; 1385efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.currentVideoEffect = mCurrentVideoEffect; 1386efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.renderingMode = mRenderingMode; 1387efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mIsFiftiesEffectStarted == M4OSA_TRUE) { 1388efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.isFiftiesEffectStarted = M4OSA_TRUE; 1389efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mIsFiftiesEffectStarted = M4OSA_FALSE; 1390efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1391efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 1392efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.isFiftiesEffectStarted = M4OSA_FALSE; 1393efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1394efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //postProcessParams.renderer = mTarget; 1395efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.overlayFrameRGBBuffer = NULL; 1396efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.overlayFrameYUVBuffer = NULL; 1397efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1398efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget->getBufferYV12(&(postProcessParams.pOutBuffer), &(postProcessParams.outBufferStride)); 1399efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1400efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = applyEffectsAndRenderingMode(&postProcessParams, videoWidth, videoHeight); 1401efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 1402efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1403efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1404cf98ede08f87a50481269da5025946109956f8d3Hong Tengstatus_t VideoEditorPreviewController::setPreviewFrameRenderingMode( 1405efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4xVSS_MediaRendering mode, M4VIDEOEDITING_VideoFrameSize outputVideoSize) { 1406efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1407efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setMediaRenderingMode: outputVideoSize = %d", outputVideoSize); 1408efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mRenderingMode = mode; 1409efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1410cf98ede08f87a50481269da5025946109956f8d3Hong Teng status_t err = OK; 1411cf98ede08f87a50481269da5025946109956f8d3Hong Teng /* get the video width and height by resolution */ 1412cf98ede08f87a50481269da5025946109956f8d3Hong Teng err = getVideoSizeByResolution(outputVideoSize, 1413cf98ede08f87a50481269da5025946109956f8d3Hong Teng &mOutputVideoWidth, &mOutputVideoHeight); 1414efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1415cf98ede08f87a50481269da5025946109956f8d3Hong Teng return err; 1416efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1417efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1418efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::doImageRenderingMode( 1419efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth, 1420efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 videoHeight, M4OSA_Void* outPtr) { 1421efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1422efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 1423efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VIFI_ImagePlane planeIn[3], planeOut[3]; 1424efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VIFI_UInt8 *inBuffer = M4OSA_NULL; 1425efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0; 1426efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1427efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //frameSize = (videoWidth*videoHeight*3) >> 1; 1428efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang inBuffer = (M4OSA_UInt8 *)dataPtr; 1429efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1430efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // In plane 1431efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang prepareYUV420ImagePlane(planeIn, videoWidth, 1432efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang videoHeight, (M4VIFI_UInt8 *)inBuffer, videoWidth, videoHeight); 1433efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1434efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang outputBufferWidth = mOutputVideoWidth; 1435efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang outputBufferHeight = mOutputVideoHeight; 1436efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1437efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Out plane 1438efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang uint8_t* outBuffer; 1439efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang size_t outBufferStride = 0; 1440efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1441efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("doMediaRendering CALL getBuffer()"); 1442efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget->getBufferYV12(&outBuffer, &outBufferStride); 1443efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1444efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set the output YUV420 plane to be compatible with YV12 format 1445efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //In YV12 format, sizes must be even 1446efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 yv12PlaneWidth = ((mOutputVideoWidth +1)>>1)<<1; 1447efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 yv12PlaneHeight = ((mOutputVideoHeight+1)>>1)<<1; 1448efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1449efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight, 1450efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer); 1451efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1452efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = applyRenderingMode(planeIn, planeOut, mRenderingMode); 1453efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 1454efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("doImageRenderingMode: applyRenderingMode returned err=0x%x", (unsigned int)err); 1455efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1456efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 1457efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1458efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1459efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} //namespace android 1460