VideoEditorPreviewController.cpp revision cf98ede08f87a50481269da5025946109956f8d3
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 M4xVSS_kVideoEffectType_BlackAndWhite:
1286efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            effect = VIDEO_EFFECT_BLACKANDWHITE;
1287efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            break;
1288efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1289efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        case M4xVSS_kVideoEffectType_Pink:
1290efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            effect = VIDEO_EFFECT_PINK;
1291efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            break;
1292efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1293efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        case M4xVSS_kVideoEffectType_Green:
1294efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            effect = VIDEO_EFFECT_GREEN;
1295efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            break;
1296efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1297efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        case M4xVSS_kVideoEffectType_Sepia:
1298efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            effect = VIDEO_EFFECT_SEPIA;
1299efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            break;
1300efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1301efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        case M4xVSS_kVideoEffectType_Negative:
1302efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            effect = VIDEO_EFFECT_NEGATIVE;
1303efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            break;
1304efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1305efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        case M4xVSS_kVideoEffectType_Framing:
1306efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            effect = VIDEO_EFFECT_FRAMING;
1307efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            break;
1308efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1309efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        case M4xVSS_kVideoEffectType_Fifties:
1310efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            effect = VIDEO_EFFECT_FIFTIES;
1311efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            break;
1312efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1313efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        case M4xVSS_kVideoEffectType_ColorRGB16:
1314efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            effect = VIDEO_EFFECT_COLOR_RGB16;
1315efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            break;
1316efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1317efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        case M4xVSS_kVideoEffectType_Gradient:
1318efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            effect = VIDEO_EFFECT_GRADIENT;
1319efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            break;
1320efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1321efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        default:
1322efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            effect = VIDEO_EFFECT_NONE;
1323efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            break;
1324efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
1325efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1326efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if(enable == M4OSA_TRUE) {
1327efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        // If already set, then no need to set again
1328efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        if(!(mCurrentVideoEffect & effect))
1329efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            mCurrentVideoEffect |= effect;
1330efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            if(effect == VIDEO_EFFECT_FIFTIES) {
1331efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang                mIsFiftiesEffectStarted = true;
1332efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            }
1333efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
1334efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    else  {
1335efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        // Reset only if already set
1336efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        if(mCurrentVideoEffect & effect)
1337efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            mCurrentVideoEffect &= ~effect;
1338efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
1339efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1340efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return;
1341efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
1342efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1343efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1344efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::applyVideoEffect(
1345efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,
1346efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_UInt32 videoHeight, M4OSA_UInt32 timeMs, M4OSA_Void* outPtr) {
1347efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1348efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
1349efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    vePostProcessParams postProcessParams;
1350efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1351efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.vidBuffer = (M4VIFI_UInt8*)dataPtr;
1352efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.videoWidth = videoWidth;
1353efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.videoHeight = videoHeight;
1354efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.timeMs = timeMs;
1355efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.timeOffset = 0; //Since timeMS already takes care of offset in this case
1356efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.effectsSettings = mEffectsSettings;
1357efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.numberEffects = mNumberEffects;
1358efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.outVideoWidth = mOutputVideoWidth;
1359efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.outVideoHeight = mOutputVideoHeight;
1360efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.currentVideoEffect = mCurrentVideoEffect;
1361efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.renderingMode = mRenderingMode;
1362efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if(mIsFiftiesEffectStarted == M4OSA_TRUE) {
1363efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        postProcessParams.isFiftiesEffectStarted = M4OSA_TRUE;
1364efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        mIsFiftiesEffectStarted = M4OSA_FALSE;
1365efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
1366efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    else {
1367efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang       postProcessParams.isFiftiesEffectStarted = M4OSA_FALSE;
1368efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
1369efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    //postProcessParams.renderer = mTarget;
1370efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.overlayFrameRGBBuffer = NULL;
1371efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    postProcessParams.overlayFrameYUVBuffer = NULL;
1372efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1373efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mTarget->getBufferYV12(&(postProcessParams.pOutBuffer), &(postProcessParams.outBufferStride));
1374efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1375efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    err = applyEffectsAndRenderingMode(&postProcessParams, videoWidth, videoHeight);
1376efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return err;
1377efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
1378efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1379cf98ede08f87a50481269da5025946109956f8d3Hong Tengstatus_t VideoEditorPreviewController::setPreviewFrameRenderingMode(
1380efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4xVSS_MediaRendering mode, M4VIDEOEDITING_VideoFrameSize outputVideoSize) {
1381efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1382efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("setMediaRenderingMode: outputVideoSize = %d", outputVideoSize);
1383efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mRenderingMode = mode;
1384efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1385cf98ede08f87a50481269da5025946109956f8d3Hong Teng    status_t err = OK;
1386cf98ede08f87a50481269da5025946109956f8d3Hong Teng    /* get the video width and height by resolution */
1387cf98ede08f87a50481269da5025946109956f8d3Hong Teng    err = getVideoSizeByResolution(outputVideoSize,
1388cf98ede08f87a50481269da5025946109956f8d3Hong Teng              &mOutputVideoWidth, &mOutputVideoHeight);
1389efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1390cf98ede08f87a50481269da5025946109956f8d3Hong Teng    return err;
1391efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
1392efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1393efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung ChangM4OSA_ERR VideoEditorPreviewController::doImageRenderingMode(
1394efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,
1395efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_UInt32 videoHeight, M4OSA_Void* outPtr) {
1396efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1397efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_ERR err = M4NO_ERROR;
1398efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4VIFI_ImagePlane planeIn[3], planeOut[3];
1399efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4VIFI_UInt8 *inBuffer = M4OSA_NULL;
1400efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0;
1401efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1402efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    //frameSize = (videoWidth*videoHeight*3) >> 1;
1403efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    inBuffer = (M4OSA_UInt8 *)dataPtr;
1404efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1405efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    // In plane
1406efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    prepareYUV420ImagePlane(planeIn, videoWidth,
1407efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang      videoHeight, (M4VIFI_UInt8 *)inBuffer, videoWidth, videoHeight);
1408efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1409efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    outputBufferWidth = mOutputVideoWidth;
1410efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    outputBufferHeight = mOutputVideoHeight;
1411efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1412efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    // Out plane
1413efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    uint8_t* outBuffer;
1414efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    size_t outBufferStride = 0;
1415efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1416efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    LOGV("doMediaRendering CALL getBuffer()");
1417efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    mTarget->getBufferYV12(&outBuffer, &outBufferStride);
1418efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1419efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    // Set the output YUV420 plane to be compatible with YV12 format
1420efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    //In YV12 format, sizes must be even
1421efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_UInt32 yv12PlaneWidth = ((mOutputVideoWidth +1)>>1)<<1;
1422efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    M4OSA_UInt32 yv12PlaneHeight = ((mOutputVideoHeight+1)>>1)<<1;
1423efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1424efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight,
1425efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang     (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer);
1426efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1427efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    err = applyRenderingMode(planeIn, planeOut, mRenderingMode);
1428efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    if(err != M4NO_ERROR) {
1429efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        LOGE("doImageRenderingMode: applyRenderingMode returned err=0x%x", (unsigned int)err);
1430efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    }
1431efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    return err;
1432efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang}
1433efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
1434efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} //namespace android
1435