VideoEditorPreviewController.cpp revision efa27232d6812a6c71682cc3d0041a39c2bd52ef
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 463efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: loop = %d", loop); 464efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPreviewLooping = loop; 465efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 466efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: callBackAfterFrameCount = %d", callBackAfterFrameCount); 467efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCallBackAfterFrameCnt = callBackAfterFrameCount; 468efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 469efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) { 470efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst] = new VideoEditorPlayer(); 471efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mVePlayer[playerInst] == NULL) { 472efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("startPreview:Error creating VideoEditorPlayer %d",playerInst); 473efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 474efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 475efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: object created"); 476efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 477efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->setNotifyCallback(this,(notify_callback_f)notify); 478efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: notify callback set"); 479efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 480efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->loadEffectsSettings(mEffectsSettings, 481efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberEffects); 482efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: effects settings loaded"); 483efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 484efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->loadAudioMixSettings(mBackgroundAudioSetting); 485efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: AudioMixSettings settings loaded"); 486efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 487efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle); 488efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: AudioMixPCMFileHandle set"); 489efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 490efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->setProgressCallbackInterval( 491efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCallBackAfterFrameCnt); 492efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: setProgressCallBackInterval"); 493efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 494efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 495efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayerState = VePlayerIdle; 496efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPrepareReqest = M4OSA_FALSE; 497efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 498efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(fromMS == 0) { 499efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentClipNumber = -1; 500efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Save original value 501efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mFirstPreviewClipBeginTime = mClipList[0]->uiBeginCutTime; 502efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVideoStoryBoardTimeMsUptoFirstPreviewClip = 0; 503efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 504efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 505efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: fromMS=%d", fromMS); 506efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(fromMS >= mClipTotalDuration) { 507efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("startPreview: fromMS >= mClipTotalDuration"); 508efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_PARAMETER; 509efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 510efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(i=0;i<mNumberClipsInStoryBoard;i++) { 511efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(fromMS < (iIncrementedDuration + (mClipList[i]->uiEndCutTime - 512efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->uiBeginCutTime))) { 513efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set to 1 index below, 514efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // as threadProcess first increments the clip index 515efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // and then processes clip in thread loop 516efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentClipNumber = i-1; 517efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview:mCurrentClipNumber = %d fromMS=%d",i,fromMS); 518efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 519efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Save original value 520efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mFirstPreviewClipBeginTime = mClipList[i]->uiBeginCutTime; 521efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 522efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set correct begin time to start playback 523efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((fromMS+mClipList[i]->uiBeginCutTime) > 524efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (iIncrementedDuration+mClipList[i]->uiBeginCutTime)) { 525efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 526efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->uiBeginCutTime = 527efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->uiBeginCutTime + 528efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (fromMS - iIncrementedDuration); 529efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 530efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 531efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 532efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 533efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang iIncrementedDuration = iIncrementedDuration + 534efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime); 535efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 536efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 537efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVideoStoryBoardTimeMsUptoFirstPreviewClip = iIncrementedDuration; 538efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 539efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 540efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) { 541efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->setAudioMixStoryBoardParam(fromMS, 542efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mFirstPreviewClipBeginTime, 543efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->ClipProperties.uiClipAudioVolumePercentage); 544efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 545efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview:setAudioMixStoryBoardSkimTimeStamp set %d cuttime \ 546efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang %d", fromMS, mFirstPreviewClipBeginTime); 547efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 548efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 549efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mStartingClipIndex = mCurrentClipNumber+1; 550efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 551efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Start playing with player instance 0 552efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentPlayer = 0; 553efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mActivePlayerIndex = 0; 554efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 555efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(toMs == -1) { 556efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: Preview till end of storyboard"); 557efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberClipsToPreview = mNumberClipsInStoryBoard; 558efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Save original value 559efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mLastPreviewClipEndTime = 560efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[mNumberClipsToPreview-1]->uiEndCutTime; 561efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 562efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 563efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: toMs=%d", toMs); 564efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)toMs > mClipTotalDuration) { 565efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("startPreview: toMs > mClipTotalDuration"); 566efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_PARAMETER; 567efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 568efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 569efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang iIncrementedDuration = 0; 570efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 571efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(i=0;i<mNumberClipsInStoryBoard;i++) { 572efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)toMs <= (iIncrementedDuration + 573efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime))) { 574efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Save original value 575efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mLastPreviewClipEndTime = mClipList[i]->uiEndCutTime; 576efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set the end cut time of clip index i to toMs 577efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[i]->uiEndCutTime = toMs; 578efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 579efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Number of clips to be previewed is from index 0 to i 580efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // increment by 1 as i starts from 0 581efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mNumberClipsToPreview = i+1; 582efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 583efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 584efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 585efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang iIncrementedDuration = iIncrementedDuration + 586efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime); 587efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 588efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 589efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 590efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 591efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Open the thread semaphore 592efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_semaphoreOpen(&mSemThreadWait, 1); 593efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 594efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Open the preview process thread 595efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_threadSyncOpen(&mThreadContext, (M4OSA_ThreadDoIt)threadProc); 596efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (M4NO_ERROR != err) { 597efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("VideoEditorPreviewController:M4OSA_threadSyncOpen error %d", (int) err); 598efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 599efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 600efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 601efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set the stacksize 602efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_threadSyncSetOption(mThreadContext, M4OSA_ThreadStackSize, 603efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4OSA_DataOption)PREVIEW_THREAD_STACK_SIZE); 604efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 605efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (M4NO_ERROR != err) { 606efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("VideoEditorPreviewController: threadSyncSetOption error %d", (int) err); 607efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_threadSyncClose(mThreadContext); 608efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mThreadContext = NULL; 609efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 610efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 611efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 612efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Start the thread 613efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_threadSyncStart(mThreadContext, (M4OSA_Void*)this); 614efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (M4NO_ERROR != err) { 615efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("VideoEditorPreviewController: threadSyncStart error %d", (int) err); 616efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_threadSyncClose(mThreadContext); 617efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mThreadContext = NULL; 618efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 619efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 620efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang bStopThreadInProgress = false; 621efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 622efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("startPreview: process thread started"); 623efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4NO_ERROR; 624efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 625efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 626efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_UInt32 VideoEditorPreviewController::stopPreview() { 627efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 628efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang uint32_t lastRenderedFrameTimeMs = 0; 629efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stopPreview"); 630efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 631efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Stop the thread 632efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mThreadContext != NULL) { 633efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang bStopThreadInProgress = true; 634efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 635efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(mLockSem); 636efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mSemThreadWait != NULL) { 637efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_semaphorePost(mSemThreadWait); 638efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 639efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 640efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 641efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_threadSyncStop(mThreadContext); 642efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 643efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stopPreview: error 0x%x in trying to stop thread", err); 644efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Continue even if error 645efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 646efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 647efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_threadSyncClose(mThreadContext); 648efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 649efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("stopPreview: error 0x%x in trying to close thread", (unsigned int)err); 650efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Continue even if error 651efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 652efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 653efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mThreadContext = NULL; 654efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 655efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 656efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Close the semaphore first 657efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 658efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(mLockSem); 659efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mSemThreadWait != NULL) { 660efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_semaphoreClose(mSemThreadWait); 661efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stopPreview: close semaphore returns 0x%x", err); 662efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mSemThreadWait = NULL; 663efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 664efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 665efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 666efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) { 667efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mVePlayer[playerInst] != NULL) { 668efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mVePlayer[playerInst]->isPlaying()) { 669efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stop the player first"); 670efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst]->stop(); 671efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 672efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (playerInst == mActivePlayerIndex) { 673efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Return the last rendered frame time stamp 674efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[mActivePlayerIndex]->getLastRenderedTimeMs(&lastRenderedFrameTimeMs); 675efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 6762d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla 6772d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla //This is used to syncronize onStreamDone() in PreviewPlayer and 678efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //stopPreview() in PreviewController 6792d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla sp<VideoEditorPlayer> temp = mVePlayer[playerInst]; 6802d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla temp->acquireLock(); 6812d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla LOGV("stopPreview: clearing mVePlayer"); 6822d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla mVePlayer[playerInst].clear(); 683efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVePlayer[playerInst] = NULL; 6842d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla temp->releaseLock(); 685efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 686efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 687efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stopPreview: clear audioSink and audioPlayer"); 688efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVEAudioSink.clear(); 689efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mVEAudioPlayer) { 690efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mVEAudioPlayer; 691efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mVEAudioPlayer = NULL; 6922d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla } 693efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 694efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // If image file playing, then free the buffer pointer 695efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mFrameStr.pBuffer != M4OSA_NULL) { 696efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(mFrameStr.pBuffer); 697efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mFrameStr.pBuffer = M4OSA_NULL; 698efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 699efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 700efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Reset original begin cuttime of first previewed clip*/ 701efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[mStartingClipIndex]->uiBeginCutTime = mFirstPreviewClipBeginTime; 702efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Reset original end cuttime of last previewed clip*/ 703efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mClipList[mNumberClipsToPreview-1]->uiEndCutTime = mLastPreviewClipEndTime; 704efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 705efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPlayerState = VePlayerIdle; 706efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mPrepareReqest = M4OSA_FALSE; 707efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 708efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentPlayedDuration = 0; 709efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentClipDuration = 0; 710efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mRenderingMode = M4xVSS_kBlackBorders; 711efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 0; 712efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 0; 713efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 714efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("stopPreview() lastRenderedFrameTimeMs %ld", lastRenderedFrameTimeMs); 715efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return lastRenderedFrameTimeMs; 716efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 717efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 718efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::clearSurface( 719efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang const sp<Surface> &surface, VideoEditor_renderPreviewFrameStr* pFrameInfo) { 720efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 721efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 722efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo; 723efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0; 724efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VIFI_ImagePlane planeOut[3]; 725efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("Inside preview clear frame"); 726efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 727efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(mLock); 728efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 729efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Delete previous renderer instance 730efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget != NULL) { 731efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTarget; 732efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = NULL; 733efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 734efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 735efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang outputBufferWidth = pFrameStr->uiFrameWidth; 736efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang outputBufferHeight = pFrameStr->uiFrameHeight; 737efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 738efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Initialize the renderer 739efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget == NULL) { 740efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 741efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = PreviewRenderer::CreatePreviewRenderer( 742efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang OMX_COLOR_FormatYUV420Planar, surface, outputBufferWidth, outputBufferHeight, 743efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang outputBufferWidth, outputBufferHeight, 0); 744efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 745efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget == NULL) { 746efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("renderPreviewFrame: cannot create PreviewRenderer"); 747efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 748efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 749efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 750efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 751efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Out plane 752efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang uint8_t* outBuffer; 753efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang size_t outBufferStride = 0; 754efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 755efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("doMediaRendering CALL getBuffer()"); 756efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget->getBufferYV12(&outBuffer, &outBufferStride); 757efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 758efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set the output YUV420 plane to be compatible with YV12 format 759efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //In YV12 format, sizes must be even 760efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 yv12PlaneWidth = ((outputBufferWidth +1)>>1)<<1; 761efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 yv12PlaneHeight = ((outputBufferHeight+1)>>1)<<1; 762efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 763efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight, 764efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer); 765efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 766efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang /* Fill the surface with black frame */ 767efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memset((void *)planeOut[0].pac_data,0x00,planeOut[0].u_width * 768efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang planeOut[0].u_height * 1.5); 769efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memset((void *)planeOut[1].pac_data,128,planeOut[1].u_width * 770efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang planeOut[1].u_height); 771efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang memset((void *)planeOut[2].pac_data,128,planeOut[2].u_width * 772efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang planeOut[2].u_height); 773efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 774efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget->renderYV12(); 775efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 776efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 777efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 778efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::renderPreviewFrame( 779efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang const sp<Surface> &surface, 780efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditor_renderPreviewFrameStr* pFrameInfo, 781efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditorCurretEditInfo *pCurrEditInfo) { 782efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 783efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 784efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 i = 0, iIncrementedDuration = 0, tnTimeMs=0, framesize =0; 785efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo; 786efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VIFI_UInt8 *pixelArray = NULL; 787efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(mLock); 788efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 789efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pCurrEditInfo != NULL) { 790efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pCurrEditInfo->overlaySettingsIndex = -1; 791efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 792efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Delete previous renderer instance 793efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget != NULL) { 794efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTarget; 795efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = NULL; 796efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 797efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 798efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mOutputVideoWidth == 0) { 799efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = pFrameStr->uiFrameWidth; 800efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 801efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 802efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mOutputVideoHeight == 0) { 803efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = pFrameStr->uiFrameHeight; 804efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 805efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 806efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Initialize the renderer 807efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget == NULL) { 808efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang /*mTarget = new PreviewRenderer( 809efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang OMX_COLOR_FormatYUV420Planar, surface, mOutputVideoWidth, mOutputVideoHeight, 810efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth, mOutputVideoHeight, 0);*/ 811efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 812efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = PreviewRenderer::CreatePreviewRenderer( 813efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang OMX_COLOR_FormatYUV420Planar, surface, mOutputVideoWidth, mOutputVideoHeight, 814efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth, mOutputVideoHeight, 0); 815efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 816efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mTarget == NULL) { 817efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("renderPreviewFrame: cannot create PreviewRenderer"); 818efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4ERR_ALLOC; 819efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 820efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 821efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 822efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pixelArray = NULL; 823efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 824efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Postprocessing (apply video effect) 825efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pFrameStr->bApplyEffect == M4OSA_TRUE) { 826efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 827efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for(i=0;i<mNumberEffects;i++) { 828efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // First check if effect starttime matches the clip being previewed 829efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((mEffectsSettings[i].uiStartTime < pFrameStr->clipBeginCutTime) 830efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang ||(mEffectsSettings[i].uiStartTime >= pFrameStr->clipEndCutTime)) { 831efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // This effect doesn't belong to this clip, check next one 832efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang continue; 833efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 834efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((mEffectsSettings[i].uiStartTime <= pFrameStr->timeMs) && 835efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >= 836efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pFrameStr->timeMs) && (mEffectsSettings[i].uiDuration != 0)) { 837efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang setVideoEffectType(mEffectsSettings[i].VideoEffectType, TRUE); 838efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 839efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 840efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang setVideoEffectType(mEffectsSettings[i].VideoEffectType, FALSE); 841efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 842efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 843efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 844efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //Provide the overlay Update indication when there is an overlay effect 845efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (mCurrentVideoEffect & VIDEO_EFFECT_FRAMING) { 846efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 index; 847efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentVideoEffect &= ~VIDEO_EFFECT_FRAMING; //never apply framing here. 848efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 849efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Find the effect in effectSettings array 850efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for (index = 0; index < mNumberEffects; index++) { 851efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mEffectsSettings[index].VideoEffectType == 852efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) { 853efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 854efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((mEffectsSettings[index].uiStartTime <= pFrameInfo->timeMs) && 855efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang ((mEffectsSettings[index].uiStartTime+ 856efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mEffectsSettings[index].uiDuration) >= pFrameInfo->timeMs)) 857efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 858efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 859efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 860efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 861efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 862efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if ((index < mNumberEffects) && (pCurrEditInfo != NULL)) { 863efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pCurrEditInfo->overlaySettingsIndex = index; 864efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("Framing index = %d", index); 865efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } else { 866efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("No framing effects found"); 867efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 868efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 869efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 870efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) { 871efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = applyVideoEffect((M4OSA_Void *)pFrameStr->pBuffer, 872efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth, 873efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pFrameStr->uiFrameHeight, pFrameStr->timeMs, 874efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4OSA_Void *)pixelArray); 875efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 876efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 877efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("renderPreviewFrame: applyVideoEffect error 0x%x", (unsigned int)err); 878efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTarget; 879efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = NULL; 880efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(pixelArray); 881efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pixelArray = NULL; 882efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 883efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 884efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentVideoEffect = VIDEO_EFFECT_NONE; 885efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 886efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 887efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Apply the rendering mode 888efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer, 889efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth, 890efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray); 891efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 892efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 893efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("renderPreviewFrame:doImageRenderingMode error 0x%x", (unsigned int)err); 894efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTarget; 895efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = NULL; 896efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(pixelArray); 897efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pixelArray = NULL; 898efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 899efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 900efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 901efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 902efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 903efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Apply the rendering mode 904efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer, 905efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth, 906efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray); 907efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 908efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 909efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("renderPreviewFrame: doImageRenderingMode error 0x%x", (unsigned int)err); 910efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang delete mTarget; 911efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget = NULL; 912efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(pixelArray); 913efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pixelArray = NULL; 914efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 915efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 916efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 917efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 918efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget->renderYV12(); 919efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 920efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 921efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 922efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_Void VideoEditorPreviewController::setJniCallback(void* cookie, 923efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang jni_progress_callback_fct callbackFct) { 924efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //LOGV("setJniCallback"); 925efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mJniCookie = cookie; 926efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mJniCallback = callbackFct; 927efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 928efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 929efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::preparePlayer( 930efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang void* param, int playerInstance, int index) { 931efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 932efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 933efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditorPreviewController *pController = 934efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (VideoEditorPreviewController *)param; 935efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 936efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: instance %d file %d", playerInstance, index); 937efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 938efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setDataSource( 939efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (const char *)pController->mClipList[index]->pFile, NULL); 940efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: setDataSource instance %s", 941efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (const char *)pController->mClipList[index]->pFile); 942efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 943efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setVideoSurface( 944efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mSurface); 945efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: setVideoSurface"); 946efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 947efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setMediaRenderingMode( 948efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->xVSS.MediaRendering, 949efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mOutputVideoSize); 950efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: setMediaRenderingMode"); 951efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 952efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)index == pController->mStartingClipIndex) { 953efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setPlaybackBeginTime( 954efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mFirstPreviewClipBeginTime); 955efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 956efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 957efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setPlaybackBeginTime( 958efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime); 959efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 960efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: setPlaybackBeginTime(%d)", 961efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime); 962efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 963efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setPlaybackEndTime( 964efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiEndCutTime); 965efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: setPlaybackEndTime(%d)", 966efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiEndCutTime); 967efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 968efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mClipList[index]->FileType == M4VIDEOEDITING_kFileType_ARGB8888) { 969efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->setImageClipProperties( 970efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->ClipProperties.uiVideoWidth, 971efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->ClipProperties.uiVideoHeight); 972efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: setImageClipProperties"); 973efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 974efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 975efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->prepare(); 976efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: prepared"); 977efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 978efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mClipList[index]->uiBeginCutTime > 0) { 979efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->seekTo( 980efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime); 981efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 982efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: seekTo(%d)", 983efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime); 984efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 985efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[pController->mCurrentPlayer]->setAudioPlayer(pController->mVEAudioPlayer); 986efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 987efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInstance]->readFirstVideoFrame(); 988efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("preparePlayer: readFirstVideoFrame of clip"); 989efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 990efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 991efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 992efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 993efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::threadProc(M4OSA_Void* param) { 994efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 995efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_Int32 index = 0; 996efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditorPreviewController *pController = 997efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (VideoEditorPreviewController *)param; 998efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 999efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("inside threadProc"); 1000efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mPlayerState == VePlayerIdle) { 1001efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (pController->mCurrentClipNumber)++; 1002efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1003efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("threadProc: playing file index %d total clips %d", 1004efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipNumber, pController->mNumberClipsToPreview); 1005efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1006efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)pController->mCurrentClipNumber >= 1007efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mNumberClipsToPreview) { 1008efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1009efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("All clips previewed"); 1010efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1011efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayedDuration = 0; 1012efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipDuration = 0; 1013efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayer = 0; 1014efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1015efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mPreviewLooping == M4OSA_TRUE) { 1016efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipNumber = 1017efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mStartingClipIndex; 1018efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1019efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("Preview looping TRUE, restarting from clip index %d", 1020efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipNumber); 1021efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1022efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Reset the story board timestamp inside the player 1023efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; 1024efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang playerInst++) { 1025efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[playerInst]->resetJniCallbackTimeStamp(); 1026efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1027efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1028efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 1029efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 endArgs = 0; 1030efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mJniCallback != NULL) { 1031efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback( 1032efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCookie, MSG_TYPE_PREVIEW_END, &endArgs); 1033efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1034efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mPlayerState = VePlayerAutoStop; 1035efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1036efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Reset original begin cuttime of first previewed clip 1037efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mStartingClipIndex]->uiBeginCutTime = 1038efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mFirstPreviewClipBeginTime; 1039efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Reset original end cuttime of last previewed clip 1040efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mNumberClipsToPreview-1]->uiEndCutTime = 1041efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mLastPreviewClipEndTime; 1042efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1043efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Return a warning to M4OSA thread handler 1044efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // so that thread is moved from executing state to open state 1045efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4WAR_NO_MORE_STREAM; 1046efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1047efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1048efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1049efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang index=pController->mCurrentClipNumber; 1050efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)pController->mCurrentClipNumber == pController->mStartingClipIndex) { 1051efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayedDuration += 1052efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVideoStoryBoardTimeMsUptoFirstPreviewClip; 1053efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1054efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipDuration = 1055efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime 1056efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang - pController->mFirstPreviewClipBeginTime; 1057efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1058efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang preparePlayer((void*)pController, pController->mCurrentPlayer, index); 1059efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1060efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 1061efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayedDuration += 1062efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipDuration; 1063efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1064efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipDuration = 1065efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime - 1066efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime; 1067efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1068efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1069efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[pController->mCurrentPlayer]->setStoryboardStartTime( 1070efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayedDuration); 1071efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("threadProc: setStoryboardStartTime"); 1072efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1073efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set the next clip duration for Audio mix here 1074efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)pController->mCurrentClipNumber != pController->mStartingClipIndex) { 1075efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1076efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[pController->mCurrentPlayer]->setAudioMixStoryBoardParam( 1077efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayedDuration, 1078efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime, 1079efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage); 1080efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1081efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("threadProc: setAudioMixStoryBoardParam fromMS %d \ 1082efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang ClipBeginTime %d", pController->mCurrentPlayedDuration + 1083efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime, 1084efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->uiBeginCutTime, 1085efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage); 1086efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1087efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Capture the active player being used 1088efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mActivePlayerIndex = pController->mCurrentPlayer; 1089efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1090efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mVePlayer[pController->mCurrentPlayer]->start(); 1091efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("threadProc: started"); 1092efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1093efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mPlayerState = VePlayerBusy; 1094efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1095efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } else if(pController->mPlayerState == VePlayerAutoStop) { 1096efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("Preview completed..auto stop the player"); 1097efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } else if ((pController->mPlayerState == VePlayerBusy) && (pController->mPrepareReqest)) { 1098efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Prepare the player here 1099efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mPrepareReqest = M4OSA_FALSE; 1100efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang preparePlayer((void*)pController, pController->mCurrentPlayer, 1101efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentClipNumber+1); 1102efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mSemThreadWait != NULL) { 1103efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_semaphoreWait(pController->mSemThreadWait, 1104efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_WAIT_FOREVER); 1105efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1106efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } else { 1107efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (!pController->bStopThreadInProgress) { 1108efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("threadProc: state busy...wait for sem"); 1109efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mSemThreadWait != NULL) { 1110efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = M4OSA_semaphoreWait(pController->mSemThreadWait, 1111efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_WAIT_FOREVER); 1112efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1113efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1114efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("threadProc: sem wait returned err = 0x%x", err); 1115efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1116efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1117efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //Always return M4NO_ERROR to ensure the thread keeps running 1118efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return M4NO_ERROR; 1119efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1120efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1121efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPreviewController::notify( 1122efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang void* cookie, int msg, int ext1, int ext2) 1123efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang{ 1124efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditorPreviewController *pController = 1125efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (VideoEditorPreviewController *)cookie; 1126efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1127efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 1128efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang uint32_t clipDuration = 0; 1129efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang switch (msg) { 1130efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_NOP: // interface test message 1131efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("MEDIA_NOP"); 1132efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1133efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_PREPARED: 1134efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("MEDIA_PREPARED"); 1135efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1136efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_PLAYBACK_COMPLETE: 1137efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 1138efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("notify:MEDIA_PLAYBACK_COMPLETE"); 1139efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mPlayerState = VePlayerIdle; 1140efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1141efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //send progress callback with last frame timestamp 1142efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if((M4OSA_UInt32)pController->mCurrentClipNumber == 1143efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mStartingClipIndex) { 1144efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang clipDuration = 1145efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime 1146efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang - pController->mFirstPreviewClipBeginTime; 1147efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1148efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 1149efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang clipDuration = 1150efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime 1151efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang - pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime; 1152efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1153efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1154efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 playedDuration = clipDuration+pController->mCurrentPlayedDuration; 1155efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback( 1156efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION, 1157efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang &playedDuration); 1158efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1159efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if ((pController->mOverlayState == OVERLAY_UPDATE) && 1160efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang ((M4OSA_UInt32)pController->mCurrentClipNumber != 1161efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (pController->mNumberClipsToPreview-1))) { 1162efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditorCurretEditInfo *pEditInfo = 1163efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo), 1164efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VS, (M4OSA_Char*)"Current Edit info"); 1165efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pEditInfo->overlaySettingsIndex = ext2; 1166efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pEditInfo->clipIndex = pController->mCurrentClipNumber; 1167efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mOverlayState == OVERLAY_CLEAR; 1168efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mJniCallback != NULL) { 1169efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback(pController->mJniCookie, 1170efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang MSG_TYPE_OVERLAY_CLEAR, pEditInfo); 1171efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1172efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(pEditInfo); 1173efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1174efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 1175efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(pController->mLockSem); 1176efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mSemThreadWait != NULL) { 11772d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla M4OSA_semaphorePost(pController->mSemThreadWait); 11782d44979102ca85d5c4ee68d0388ee2fe37c4ec1aRaghavender Palla return; 1179efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1180efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1181efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1182efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1183efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1184efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_ERROR: 1185efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 1186efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int err_val = ext1; 1187efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Always log errors. 1188efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // ext1: Media framework error code. 1189efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // ext2: Implementation dependant error code. 1190efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("MEDIA_ERROR; error (%d, %d)", ext1, ext2); 1191efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mJniCallback != NULL) { 1192efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback(pController->mJniCookie, 1193efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang MSG_TYPE_PLAYER_ERROR, &err_val); 1194efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1195efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1196efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1197efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_INFO: 1198efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 1199efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int info_val = ext2; 1200efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // ext1: Media framework error code. 1201efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // ext2: Implementation dependant error code. 1202efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //LOGW("MEDIA_INFO; info/warning (%d, %d)", ext1, ext2); 1203efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(pController->mJniCallback != NULL) { 1204efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback(pController->mJniCookie, 1205efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang MSG_TYPE_PROGRESS_INDICATION, &info_val); 1206efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1207efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1208efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1209efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_SEEK_COMPLETE: 1210efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("MEDIA_SEEK_COMPLETE; Received seek complete"); 1211efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1212efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_BUFFERING_UPDATE: 1213efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("MEDIA_BUFFERING_UPDATE; buffering %d", ext1); 1214efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1215efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case MEDIA_SET_VIDEO_SIZE: 1216efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("MEDIA_SET_VIDEO_SIZE; New video size %d x %d", ext1, ext2); 1217efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1218efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case 0xAAAAAAAA: 1219efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("VIDEO PLAYBACK ALMOST over, prepare next player"); 1220efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Select next player and prepare it 1221efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // If there is a clip after this one 1222efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if ((M4OSA_UInt32)(pController->mCurrentClipNumber+1) < 1223efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mNumberClipsToPreview) { 1224efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mPrepareReqest = M4OSA_TRUE; 1225efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayer++; 1226efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mCurrentPlayer >= NBPLAYER_INSTANCES) { 1227efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mCurrentPlayer = 0; 1228efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1229efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Prepare the first clip to be played 1230efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 1231efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang Mutex::Autolock autoLock(pController->mLockSem); 1232efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mSemThreadWait != NULL) { 1233efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_semaphorePost(pController->mSemThreadWait); 1234efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1235efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1236efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1237efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1238efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case 0xBBBBBBBB: 1239efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang { 1240efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("VIDEO PLAYBACK, Update Overlay"); 1241efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang int overlayIndex = ext2; 1242efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang VideoEditorCurretEditInfo *pEditInfo = 1243efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo), 1244efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VS, (M4OSA_Char*)"Current Edit info"); 1245efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //ext1 = 1; start the overlay display 1246efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // = 2; Clear the overlay. 1247efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pEditInfo->overlaySettingsIndex = ext2; 1248efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pEditInfo->clipIndex = pController->mCurrentClipNumber; 1249efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("pController->mCurrentClipNumber = %d",pController->mCurrentClipNumber); 1250efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (pController->mJniCallback != NULL) { 1251efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if (ext1 == 1) { 1252efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mOverlayState = OVERLAY_UPDATE; 1253efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback(pController->mJniCookie, 1254efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang MSG_TYPE_OVERLAY_UPDATE, pEditInfo); 1255efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } else { 1256efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mOverlayState = OVERLAY_CLEAR; 1257efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang pController->mJniCallback(pController->mJniCookie, 1258efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang MSG_TYPE_OVERLAY_CLEAR, pEditInfo); 1259efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1260efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1261efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang free(pEditInfo); 1262efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1263efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1264efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang default: 1265efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2); 1266efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1267efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1268efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1269efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1270efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changvoid VideoEditorPreviewController::setVideoEffectType( 1271efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) { 1272efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1273efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 effect = VIDEO_EFFECT_NONE; 1274efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1275efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // map M4VSS3GPP_VideoEffectType to local enum 1276efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang switch(type) { 1277efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VSS3GPP_kVideoEffectType_FadeFromBlack: 1278efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_FADEFROMBLACK; 1279efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1280efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1281efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VSS3GPP_kVideoEffectType_FadeToBlack: 1282efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_FADETOBLACK; 1283efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1284efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1285efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VSS3GPP_kVideoEffectType_CurtainOpening: 1286efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_CURTAINOPEN; 1287efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1288efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1289efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VSS3GPP_kVideoEffectType_CurtainClosing: 1290efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_CURTAINCLOSE; 1291efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1292efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1293efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_BlackAndWhite: 1294efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_BLACKANDWHITE; 1295efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1296efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1297efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Pink: 1298efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_PINK; 1299efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1300efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1301efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Green: 1302efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_GREEN; 1303efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1304efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1305efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Sepia: 1306efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_SEPIA; 1307efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1308efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1309efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Negative: 1310efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_NEGATIVE; 1311efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1312efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1313efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Framing: 1314efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_FRAMING; 1315efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1316efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1317efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Fifties: 1318efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_FIFTIES; 1319efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1320efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1321efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_ColorRGB16: 1322efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_COLOR_RGB16; 1323efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1324efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1325efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4xVSS_kVideoEffectType_Gradient: 1326efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_GRADIENT; 1327efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1328efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1329efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang default: 1330efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang effect = VIDEO_EFFECT_NONE; 1331efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1332efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1333efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1334efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(enable == M4OSA_TRUE) { 1335efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // If already set, then no need to set again 1336efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(!(mCurrentVideoEffect & effect)) 1337efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentVideoEffect |= effect; 1338efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(effect == VIDEO_EFFECT_FIFTIES) { 1339efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mIsFiftiesEffectStarted = true; 1340efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1341efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1342efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 1343efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Reset only if already set 1344efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mCurrentVideoEffect & effect) 1345efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mCurrentVideoEffect &= ~effect; 1346efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1347efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1348efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return; 1349efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1350efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1351efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1352efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::applyVideoEffect( 1353efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth, 1354efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 videoHeight, M4OSA_UInt32 timeMs, M4OSA_Void* outPtr) { 1355efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1356efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 1357efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang vePostProcessParams postProcessParams; 1358efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1359efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.vidBuffer = (M4VIFI_UInt8*)dataPtr; 1360efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.videoWidth = videoWidth; 1361efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.videoHeight = videoHeight; 1362efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.timeMs = timeMs; 1363efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.timeOffset = 0; //Since timeMS already takes care of offset in this case 1364efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.effectsSettings = mEffectsSettings; 1365efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.numberEffects = mNumberEffects; 1366efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.outVideoWidth = mOutputVideoWidth; 1367efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.outVideoHeight = mOutputVideoHeight; 1368efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.currentVideoEffect = mCurrentVideoEffect; 1369efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.renderingMode = mRenderingMode; 1370efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(mIsFiftiesEffectStarted == M4OSA_TRUE) { 1371efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.isFiftiesEffectStarted = M4OSA_TRUE; 1372efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mIsFiftiesEffectStarted = M4OSA_FALSE; 1373efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1374efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang else { 1375efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.isFiftiesEffectStarted = M4OSA_FALSE; 1376efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1377efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //postProcessParams.renderer = mTarget; 1378efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.overlayFrameRGBBuffer = NULL; 1379efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang postProcessParams.overlayFrameYUVBuffer = NULL; 1380efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1381efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget->getBufferYV12(&(postProcessParams.pOutBuffer), &(postProcessParams.outBufferStride)); 1382efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1383efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = applyEffectsAndRenderingMode(&postProcessParams, videoWidth, videoHeight); 1384efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 1385efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1386efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1387efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::setPreviewFrameRenderingMode( 1388efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4xVSS_MediaRendering mode, M4VIDEOEDITING_VideoFrameSize outputVideoSize) { 1389efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1390efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("setMediaRenderingMode: outputVideoSize = %d", outputVideoSize); 1391efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mRenderingMode = mode; 1392efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1393efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang switch(outputVideoSize) { 1394efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_kSQCIF: 1395efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 128; 1396efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 96; 1397efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1398efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1399efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_kQQVGA: 1400efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 160; 1401efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 120; 1402efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1403efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1404efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_kQCIF: 1405efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 176; 1406efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 144; 1407efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1408efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1409efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_kQVGA: 1410efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 320; 1411efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 240; 1412efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1413efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1414efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_kCIF: 1415efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 352; 1416efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 288; 1417efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1418efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1419efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_kVGA: 1420efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 640; 1421efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 480; 1422efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1423efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1424efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_kWVGA: 1425efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 800; 1426efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 480; 1427efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1428efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1429efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_kNTSC: 1430efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 720; 1431efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 480; 1432efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1433efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1434efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_k640_360: 1435efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 640; 1436efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 360; 1437efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1438efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1439efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_k854_480: 1440efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 854; 1441efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 480; 1442efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1443efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1444efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_kHD1280: 1445efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 1280; 1446efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 720; 1447efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1448efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1449efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_kHD1080: 1450efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 1080; 1451efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 720; 1452efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1453efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1454efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang case M4VIDEOEDITING_kHD960: 1455efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 960; 1456efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 720; 1457efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1458efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1459efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang default: 1460efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoWidth = 0; 1461efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mOutputVideoHeight = 0; 1462efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang break; 1463efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1464efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1465efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return OK; 1466efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1467efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1468efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::doImageRenderingMode( 1469efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth, 1470efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 videoHeight, M4OSA_Void* outPtr) { 1471efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1472efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 1473efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VIFI_ImagePlane planeIn[3], planeOut[3]; 1474efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4VIFI_UInt8 *inBuffer = M4OSA_NULL; 1475efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0; 1476efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1477efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //frameSize = (videoWidth*videoHeight*3) >> 1; 1478efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang inBuffer = (M4OSA_UInt8 *)dataPtr; 1479efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1480efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // In plane 1481efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang prepareYUV420ImagePlane(planeIn, videoWidth, 1482efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang videoHeight, (M4VIFI_UInt8 *)inBuffer, videoWidth, videoHeight); 1483efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1484efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang outputBufferWidth = mOutputVideoWidth; 1485efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang outputBufferHeight = mOutputVideoHeight; 1486efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1487efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Out plane 1488efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang uint8_t* outBuffer; 1489efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang size_t outBufferStride = 0; 1490efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1491efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGV("doMediaRendering CALL getBuffer()"); 1492efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang mTarget->getBufferYV12(&outBuffer, &outBufferStride); 1493efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1494efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang // Set the output YUV420 plane to be compatible with YV12 format 1495efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang //In YV12 format, sizes must be even 1496efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 yv12PlaneWidth = ((mOutputVideoWidth +1)>>1)<<1; 1497efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang M4OSA_UInt32 yv12PlaneHeight = ((mOutputVideoHeight+1)>>1)<<1; 1498efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1499efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight, 1500efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer); 1501efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1502efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang err = applyRenderingMode(planeIn, planeOut, mRenderingMode); 1503efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang if(err != M4NO_ERROR) { 1504efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang LOGE("doImageRenderingMode: applyRenderingMode returned err=0x%x", (unsigned int)err); 1505efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang } 1506efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang return err; 1507efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} 1508efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang 1509efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} //namespace android 1510