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