blob: b12d8fe8a848fca1d8df860885285a1f955ecb0b [file] [log] [blame]
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001/*
2 * Copyright (C) 2011 NXP Software
3 * Copyright (C) 2011 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#define LOG_NDEBUG 1
19#define LOG_TAG "VideoEditorPreviewController"
20#include "VideoEditorPreviewController.h"
21
22namespace android {
Dharmaray Kundargid01ef562011-01-26 21:11:00 -080023
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080024#define PREVIEW_THREAD_STACK_SIZE (65536)
25
26VideoEditorPreviewController::VideoEditorPreviewController()
27 : mCurrentPlayer(0),
28 mThreadContext(NULL),
29 mPlayerState(VePlayerIdle),
Dharmaray Kundargi3c48e412011-01-27 18:22:56 -080030 mPrepareReqest(M4OSA_FALSE),
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080031 mClipList(NULL),
32 mNumberClipsInStoryBoard(0),
33 mNumberClipsToPreview(0),
34 mStartingClipIndex(0),
35 mPreviewLooping(M4OSA_FALSE),
36 mCallBackAfterFrameCnt(0),
37 mEffectsSettings(NULL),
38 mNumberEffects(0),
39 mCurrentClipNumber(-1),
40 mClipTotalDuration(0),
41 mCurrentVideoEffect(VIDEO_EFFECT_NONE),
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -080042 mBackgroundAudioSetting(NULL),
43 mAudioMixPCMFileHandle(NULL),
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080044 mTarget(NULL),
45 mJniCookie(NULL),
46 mJniCallback(NULL),
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080047 mCurrentPlayedDuration(0),
48 mCurrentClipDuration(0),
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -080049 mVideoStoryBoardTimeMsUptoFirstPreviewClip(0),
50 mOverlayState(OVERLAY_CLEAR),
51 mActivePlayerIndex(0),
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080052 mOutputVideoWidth(0),
53 mOutputVideoHeight(0),
54 bStopThreadInProgress(false),
55 mSemThreadWait(NULL) {
56 LOGV("VideoEditorPreviewController");
57 mRenderingMode = M4xVSS_kBlackBorders;
58 mIsFiftiesEffectStarted = false;
59
60 for (int i=0; i<NBPLAYER_INSTANCES; i++) {
61 mVePlayer[i] = NULL;
62 }
63}
64
65VideoEditorPreviewController::~VideoEditorPreviewController() {
66 M4OSA_UInt32 i = 0;
67 M4OSA_ERR err = M4NO_ERROR;
68 LOGV("~VideoEditorPreviewController");
69
70 // Stop the thread if its still running
71 if(mThreadContext != NULL) {
72 err = M4OSA_threadSyncStop(mThreadContext);
73 if(err != M4NO_ERROR) {
74 LOGV("~VideoEditorPreviewController: error 0x%x \
75 in trying to stop thread", err);
76 // Continue even if error
77 }
78
79 err = M4OSA_threadSyncClose(mThreadContext);
80 if(err != M4NO_ERROR) {
81 LOGE("~VideoEditorPreviewController: error 0x%x \
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -080082 in trying to close thread", (unsigned int) err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -080083 // Continue even if error
84 }
85
86 mThreadContext = NULL;
87 }
88
89 for (int playerInst=0; playerInst<NBPLAYER_INSTANCES;
90 playerInst++) {
91 if(mVePlayer[playerInst] != NULL) {
92 LOGV("clearing mVePlayer %d", playerInst);
93 mVePlayer[playerInst].clear();
94 }
95 }
96
97 if(mClipList != NULL) {
98 // Clean up
99 for(i=0;i<mNumberClipsInStoryBoard;i++)
100 {
101 if(mClipList[i]->pFile != NULL) {
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700102 free(mClipList[i]->pFile);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800103 mClipList[i]->pFile = NULL;
104 }
105
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700106 free(mClipList[i]);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800107 }
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700108 free(mClipList);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800109 mClipList = NULL;
110 }
111
112 if(mEffectsSettings) {
113 for(i=0;i<mNumberEffects;i++) {
114 if(mEffectsSettings[i].xVSS.pFramingBuffer != NULL) {
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700115 free(mEffectsSettings[i].xVSS.pFramingBuffer->pac_data);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800116
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700117 free(mEffectsSettings[i].xVSS.pFramingBuffer);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800118
119 mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
120 }
121 }
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700122 free(mEffectsSettings);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800123 mEffectsSettings = NULL;
124 }
125
Dheeraj Sharmaeab39fb2011-01-27 19:31:28 -0800126 if (mAudioMixPCMFileHandle) {
127 err = M4OSA_fileReadClose (mAudioMixPCMFileHandle);
128 mAudioMixPCMFileHandle = M4OSA_NULL;
129 }
130
Santosh Madhavab4ce81da2011-02-09 19:20:17 -0800131 if (mBackgroundAudioSetting != NULL) {
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700132 free(mBackgroundAudioSetting);
Santosh Madhavab4ce81da2011-02-09 19:20:17 -0800133 mBackgroundAudioSetting = NULL;
134 }
135
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800136 if(mTarget != NULL) {
137 delete mTarget;
138 mTarget = NULL;
139 }
140
Dheeraj Sharma4f4efef2011-02-10 16:55:37 -0800141 mOverlayState = OVERLAY_CLEAR;
142
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800143 LOGV("~VideoEditorPreviewController returns");
144}
145
146M4OSA_ERR VideoEditorPreviewController::loadEditSettings(
147 M4VSS3GPP_EditSettings* pSettings,M4xVSS_AudioMixingSettings* bgmSettings) {
148
149 M4OSA_UInt32 i = 0, iClipDuration = 0, rgbSize = 0;
150 M4VIFI_UInt8 *tmp = NULL;
151 M4OSA_ERR err = M4NO_ERROR;
152
153 LOGV("loadEditSettings");
154 LOGV("loadEditSettings Channels = %d, sampling Freq %d",
155 bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency );
156 bgmSettings->uiSamplingFrequency = 32000;
157
158 LOGV("loadEditSettings Channels = %d, sampling Freq %d",
159 bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency );
160 Mutex::Autolock autoLock(mLock);
161
162 // Clean up any previous Edit settings before loading new ones
163 mCurrentVideoEffect = VIDEO_EFFECT_NONE;
164
165 if(mAudioMixPCMFileHandle) {
166 err = M4OSA_fileReadClose (mAudioMixPCMFileHandle);
167 mAudioMixPCMFileHandle = M4OSA_NULL;
168 }
169
170 if(mBackgroundAudioSetting != NULL) {
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700171 free(mBackgroundAudioSetting);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800172 mBackgroundAudioSetting = NULL;
173 }
174
175 if(mClipList != NULL) {
176 // Clean up
177 for(i=0;i<mNumberClipsInStoryBoard;i++)
178 {
179 if(mClipList[i]->pFile != NULL) {
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700180 free(mClipList[i]->pFile);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800181 mClipList[i]->pFile = NULL;
182 }
183
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700184 free(mClipList[i]);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800185 }
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700186 free(mClipList);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800187 mClipList = NULL;
188 }
189
190 if(mEffectsSettings) {
191 for(i=0;i<mNumberEffects;i++) {
192 if(mEffectsSettings[i].xVSS.pFramingBuffer != NULL) {
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700193 free(mEffectsSettings[i].xVSS.pFramingBuffer->pac_data);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800194
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700195 free(mEffectsSettings[i].xVSS.pFramingBuffer);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800196
197 mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
198 }
199 }
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700200 free(mEffectsSettings);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800201 mEffectsSettings = NULL;
202 }
203
204 if(mClipList == NULL) {
205 mNumberClipsInStoryBoard = pSettings->uiClipNumber;
206 LOGV("loadEditSettings: # of Clips = %d", mNumberClipsInStoryBoard);
207
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700208 mClipList = (M4VSS3GPP_ClipSettings**)M4OSA_32bitAlignedMalloc(
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800209 sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber, M4VS,
210 (M4OSA_Char*)"LvPP, copy of pClipList");
211
212 if(NULL == mClipList) {
213 LOGE("loadEditSettings: Malloc error");
214 return M4ERR_ALLOC;
215 }
Shyam Pallapothu32ed3f42011-04-20 21:00:48 -0700216 memset((void *)mClipList,0,
217 sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800218
219 for(i=0;i<pSettings->uiClipNumber;i++) {
220
221 // Allocate current clip
222 mClipList[i] =
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700223 (M4VSS3GPP_ClipSettings*)M4OSA_32bitAlignedMalloc(
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800224 sizeof(M4VSS3GPP_ClipSettings),M4VS,(M4OSA_Char*)"clip settings");
225
226 if(mClipList[i] == NULL) {
227
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800228 LOGE("loadEditSettings: Allocation error for mClipList[%d]", (int)i);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800229 return M4ERR_ALLOC;
230 }
231 // Copy plain structure
Shyam Pallapothu32ed3f42011-04-20 21:00:48 -0700232 memcpy((void *)mClipList[i],
233 (void *)pSettings->pClipList[i],
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800234 sizeof(M4VSS3GPP_ClipSettings));
235
236 if(NULL != pSettings->pClipList[i]->pFile) {
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700237 mClipList[i]->pFile = (M4OSA_Char*)M4OSA_32bitAlignedMalloc(
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800238 pSettings->pClipList[i]->filePathSize, M4VS,
239 (M4OSA_Char*)"pClipSettingsDest->pFile");
240
241 if(NULL == mClipList[i]->pFile)
242 {
243 LOGE("loadEditSettings : ERROR allocating filename");
244 return M4ERR_ALLOC;
245 }
246
Shyam Pallapothu32ed3f42011-04-20 21:00:48 -0700247 memcpy((void *)mClipList[i]->pFile,
248 (void *)pSettings->pClipList[i]->pFile,
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800249 pSettings->pClipList[i]->filePathSize);
250 }
251 else {
252 LOGE("NULL file path");
253 return M4ERR_PARAMETER;
254 }
255
256 // Calculate total duration of all clips
257 iClipDuration = pSettings->pClipList[i]->uiEndCutTime -
258 pSettings->pClipList[i]->uiBeginCutTime;
259
260 mClipTotalDuration = mClipTotalDuration+iClipDuration;
261 }
262 }
263
264 if(mEffectsSettings == NULL) {
265 mNumberEffects = pSettings->nbEffects;
266 LOGV("loadEditSettings: mNumberEffects = %d", mNumberEffects);
267
268 if(mNumberEffects != 0) {
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700269 mEffectsSettings = (M4VSS3GPP_EffectSettings*)M4OSA_32bitAlignedMalloc(
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800270 mNumberEffects*sizeof(M4VSS3GPP_EffectSettings),
271 M4VS, (M4OSA_Char*)"effects settings");
272
273 if(mEffectsSettings == NULL) {
274 LOGE("loadEffectsSettings: Allocation error");
275 return M4ERR_ALLOC;
276 }
277
Shyam Pallapothu32ed3f42011-04-20 21:00:48 -0700278 memset((void *)mEffectsSettings,0,
279 mNumberEffects*sizeof(M4VSS3GPP_EffectSettings));
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800280
281 for(i=0;i<mNumberEffects;i++) {
282
283 mEffectsSettings[i].xVSS.pFramingFilePath = NULL;
284 mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
285 mEffectsSettings[i].xVSS.pTextBuffer = NULL;
286
Shyam Pallapothu32ed3f42011-04-20 21:00:48 -0700287 memcpy((void *)&(mEffectsSettings[i]),
288 (void *)&(pSettings->Effects[i]),
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800289 sizeof(M4VSS3GPP_EffectSettings));
290
291 if(pSettings->Effects[i].VideoEffectType ==
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800292 (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800293 // Allocate the pFraming RGB buffer
294 mEffectsSettings[i].xVSS.pFramingBuffer =
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700295 (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(sizeof(M4VIFI_ImagePlane),
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800296 M4VS, (M4OSA_Char*)"lvpp framing buffer");
297
298 if(mEffectsSettings[i].xVSS.pFramingBuffer == NULL) {
299 LOGE("loadEffectsSettings:Alloc error for pFramingBuf");
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700300 free(mEffectsSettings);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800301 mEffectsSettings = NULL;
302 return M4ERR_ALLOC;
303 }
304
305 // Allocate the pac_data (RGB)
306 if(pSettings->Effects[i].xVSS.rgbType == M4VSS3GPP_kRGB565){
307 rgbSize =
308 pSettings->Effects[i].xVSS.pFramingBuffer->u_width *
309 pSettings->Effects[i].xVSS.pFramingBuffer->u_height*2;
310 }
311 else if(
312 pSettings->Effects[i].xVSS.rgbType == M4VSS3GPP_kRGB888) {
313 rgbSize =
314 pSettings->Effects[i].xVSS.pFramingBuffer->u_width *
315 pSettings->Effects[i].xVSS.pFramingBuffer->u_height*3;
316 }
317 else {
318 LOGE("loadEffectsSettings: wrong RGB type");
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700319 free(mEffectsSettings);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800320 mEffectsSettings = NULL;
321 return M4ERR_PARAMETER;
322 }
323
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700324 tmp = (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(rgbSize, M4VS,
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800325 (M4OSA_Char*)"framing buffer pac_data");
326
327 if(tmp == NULL) {
328 LOGE("loadEffectsSettings:Alloc error pFramingBuf pac");
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700329 free(mEffectsSettings);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800330 mEffectsSettings = NULL;
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700331 free(mEffectsSettings[i].xVSS.pFramingBuffer);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800332
333 mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
334 return M4ERR_ALLOC;
335 }
336 /* Initialize the pFramingBuffer*/
337 mEffectsSettings[i].xVSS.pFramingBuffer->pac_data = tmp;
338 mEffectsSettings[i].xVSS.pFramingBuffer->u_height =
339 pSettings->Effects[i].xVSS.pFramingBuffer->u_height;
340
341 mEffectsSettings[i].xVSS.pFramingBuffer->u_width =
342 pSettings->Effects[i].xVSS.pFramingBuffer->u_width;
343
344 mEffectsSettings[i].xVSS.pFramingBuffer->u_stride =
345 pSettings->Effects[i].xVSS.pFramingBuffer->u_stride;
346
347 mEffectsSettings[i].xVSS.pFramingBuffer->u_topleft =
348 pSettings->Effects[i].xVSS.pFramingBuffer->u_topleft;
349
350 mEffectsSettings[i].xVSS.uialphaBlendingStart =
351 pSettings->Effects[i].xVSS.uialphaBlendingStart;
352
353 mEffectsSettings[i].xVSS.uialphaBlendingMiddle =
354 pSettings->Effects[i].xVSS.uialphaBlendingMiddle;
355
356 mEffectsSettings[i].xVSS.uialphaBlendingEnd =
357 pSettings->Effects[i].xVSS.uialphaBlendingEnd;
358
359 mEffectsSettings[i].xVSS.uialphaBlendingFadeInTime =
360 pSettings->Effects[i].xVSS.uialphaBlendingFadeInTime;
361 mEffectsSettings[i].xVSS.uialphaBlendingFadeOutTime =
362 pSettings->Effects[i].xVSS.uialphaBlendingFadeOutTime;
363
364 // Copy the pFraming data
Shyam Pallapothu32ed3f42011-04-20 21:00:48 -0700365 memcpy((void *)
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800366 mEffectsSettings[i].xVSS.pFramingBuffer->pac_data,
Shyam Pallapothu32ed3f42011-04-20 21:00:48 -0700367 (void *)pSettings->Effects[i].xVSS.pFramingBuffer->pac_data,
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800368 rgbSize);
369
370 mEffectsSettings[i].xVSS.rgbType =
371 pSettings->Effects[i].xVSS.rgbType;
372 }
373 }
374 }
375 }
376
377 if (mBackgroundAudioSetting == NULL) {
378
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700379 mBackgroundAudioSetting = (M4xVSS_AudioMixingSettings*)M4OSA_32bitAlignedMalloc(
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800380 sizeof(M4xVSS_AudioMixingSettings), M4VS,
381 (M4OSA_Char*)"LvPP, copy of bgmSettings");
382
383 if(NULL == mBackgroundAudioSetting) {
384 LOGE("loadEditSettings: mBackgroundAudioSetting Malloc failed");
385 return M4ERR_ALLOC;
386 }
387
Shyam Pallapothu32ed3f42011-04-20 21:00:48 -0700388 memset((void *)mBackgroundAudioSetting, 0,sizeof(M4xVSS_AudioMixingSettings*));
389 memcpy((void *)mBackgroundAudioSetting, (void *)bgmSettings, sizeof(M4xVSS_AudioMixingSettings));
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800390
391 if ( mBackgroundAudioSetting->pFile != M4OSA_NULL ) {
392
393 mBackgroundAudioSetting->pFile = (M4OSA_Void*) bgmSettings->pPCMFilePath;
394 mBackgroundAudioSetting->uiNbChannels = 2;
395 mBackgroundAudioSetting->uiSamplingFrequency = 32000;
396 }
397
398 // Open the BG file
399 if ( mBackgroundAudioSetting->pFile != M4OSA_NULL ) {
400 err = M4OSA_fileReadOpen(&mAudioMixPCMFileHandle,
401 mBackgroundAudioSetting->pFile, M4OSA_kFileRead);
402
403 if (err != M4NO_ERROR) {
404 LOGE("loadEditSettings: mBackgroundAudio PCM File open failed");
405 return M4ERR_PARAMETER;
406 }
407 }
408 }
409
410 mOutputVideoSize = pSettings->xVSS.outputVideoSize;
411 mFrameStr.pBuffer = M4OSA_NULL;
412 return M4NO_ERROR;
413}
414
415M4OSA_ERR VideoEditorPreviewController::setSurface(const sp<Surface> &surface) {
416 LOGV("setSurface");
417 Mutex::Autolock autoLock(mLock);
418
419 mSurface = surface;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800420 return M4NO_ERROR;
421}
422
423M4OSA_ERR VideoEditorPreviewController::startPreview(
424 M4OSA_UInt32 fromMS, M4OSA_Int32 toMs, M4OSA_UInt16 callBackAfterFrameCount,
425 M4OSA_Bool loop) {
426
427 M4OSA_ERR err = M4NO_ERROR;
428 M4OSA_UInt32 i = 0, iIncrementedDuration = 0;
429 LOGV("startPreview");
430
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800431 if(fromMS > (M4OSA_UInt32)toMs) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800432 LOGE("startPreview: fromMS > toMs");
433 return M4ERR_PARAMETER;
434 }
435
436 if(toMs == 0) {
437 LOGE("startPreview: toMs is 0");
438 return M4ERR_PARAMETER;
439 }
440
441 // If already started, then stop preview first
442 for(int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
443 if(mVePlayer[playerInst] != NULL) {
444 LOGV("startPreview: stopping previously started preview playback");
445 stopPreview();
446 break;
447 }
448 }
449
450 // If renderPreview was called previously, then delete Renderer object first
451 if(mTarget != NULL) {
452 LOGV("startPreview: delete previous PreviewRenderer");
453 delete mTarget;
454 mTarget = NULL;
455 }
456
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800457 // Create Audio player to be used for entire
458 // storyboard duration
459 mVEAudioSink = new VideoEditorPlayer::VeAudioOutput();
460 mVEAudioPlayer = new VideoEditorAudioPlayer(mVEAudioSink);
461 mVEAudioPlayer->setAudioMixSettings(mBackgroundAudioSetting);
462 mVEAudioPlayer->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle);
463
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800464 LOGV("startPreview: loop = %d", loop);
465 mPreviewLooping = loop;
466
467 LOGV("startPreview: callBackAfterFrameCount = %d", callBackAfterFrameCount);
468 mCallBackAfterFrameCnt = callBackAfterFrameCount;
469
470 for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
471 mVePlayer[playerInst] = new VideoEditorPlayer();
472 if(mVePlayer[playerInst] == NULL) {
473 LOGE("startPreview:Error creating VideoEditorPlayer %d",playerInst);
474 return M4ERR_ALLOC;
475 }
476 LOGV("startPreview: object created");
477
478 mVePlayer[playerInst]->setNotifyCallback(this,(notify_callback_f)notify);
479 LOGV("startPreview: notify callback set");
480
481 mVePlayer[playerInst]->loadEffectsSettings(mEffectsSettings,
482 mNumberEffects);
483 LOGV("startPreview: effects settings loaded");
484
485 mVePlayer[playerInst]->loadAudioMixSettings(mBackgroundAudioSetting);
486 LOGV("startPreview: AudioMixSettings settings loaded");
487
488 mVePlayer[playerInst]->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle);
489 LOGV("startPreview: AudioMixPCMFileHandle set");
490
491 mVePlayer[playerInst]->setProgressCallbackInterval(
492 mCallBackAfterFrameCnt);
493 LOGV("startPreview: setProgressCallBackInterval");
494 }
495
496 mPlayerState = VePlayerIdle;
Dharmaray Kundargi3c48e412011-01-27 18:22:56 -0800497 mPrepareReqest = M4OSA_FALSE;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800498
499 if(fromMS == 0) {
500 mCurrentClipNumber = -1;
501 // Save original value
502 mFirstPreviewClipBeginTime = mClipList[0]->uiBeginCutTime;
503 mVideoStoryBoardTimeMsUptoFirstPreviewClip = 0;
504 }
505 else {
506 LOGV("startPreview: fromMS=%d", fromMS);
507 if(fromMS >= mClipTotalDuration) {
508 LOGE("startPreview: fromMS >= mClipTotalDuration");
509 return M4ERR_PARAMETER;
510 }
511 for(i=0;i<mNumberClipsInStoryBoard;i++) {
512 if(fromMS < (iIncrementedDuration + (mClipList[i]->uiEndCutTime -
513 mClipList[i]->uiBeginCutTime))) {
514 // Set to 1 index below,
515 // as threadProcess first increments the clip index
516 // and then processes clip in thread loop
517 mCurrentClipNumber = i-1;
518 LOGV("startPreview:mCurrentClipNumber = %d fromMS=%d",i,fromMS);
519
520 // Save original value
521 mFirstPreviewClipBeginTime = mClipList[i]->uiBeginCutTime;
522
523 // Set correct begin time to start playback
524 if((fromMS+mClipList[i]->uiBeginCutTime) >
525 (iIncrementedDuration+mClipList[i]->uiBeginCutTime)) {
526
527 mClipList[i]->uiBeginCutTime =
528 mClipList[i]->uiBeginCutTime +
529 (fromMS - iIncrementedDuration);
530 }
531 break;
532 }
533 else {
534 iIncrementedDuration = iIncrementedDuration +
535 (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime);
536 }
537 }
538 mVideoStoryBoardTimeMsUptoFirstPreviewClip = iIncrementedDuration;
539 }
540
541 for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
542 mVePlayer[playerInst]->setAudioMixStoryBoardParam(fromMS,
543 mFirstPreviewClipBeginTime,
544 mClipList[i]->ClipProperties.uiClipAudioVolumePercentage);
545
546 LOGV("startPreview:setAudioMixStoryBoardSkimTimeStamp set %d cuttime \
547 %d", fromMS, mFirstPreviewClipBeginTime);
548 }
549
550 mStartingClipIndex = mCurrentClipNumber+1;
551
552 // Start playing with player instance 0
553 mCurrentPlayer = 0;
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -0800554 mActivePlayerIndex = 0;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800555
556 if(toMs == -1) {
557 LOGV("startPreview: Preview till end of storyboard");
558 mNumberClipsToPreview = mNumberClipsInStoryBoard;
559 // Save original value
560 mLastPreviewClipEndTime =
561 mClipList[mNumberClipsToPreview-1]->uiEndCutTime;
562 }
563 else {
564 LOGV("startPreview: toMs=%d", toMs);
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800565 if((M4OSA_UInt32)toMs > mClipTotalDuration) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800566 LOGE("startPreview: toMs > mClipTotalDuration");
567 return M4ERR_PARAMETER;
568 }
569
570 iIncrementedDuration = 0;
571
572 for(i=0;i<mNumberClipsInStoryBoard;i++) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800573 if((M4OSA_UInt32)toMs <= (iIncrementedDuration +
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800574 (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime))) {
575 // Save original value
576 mLastPreviewClipEndTime = mClipList[i]->uiEndCutTime;
577 // Set the end cut time of clip index i to toMs
578 mClipList[i]->uiEndCutTime = toMs;
579
580 // Number of clips to be previewed is from index 0 to i
581 // increment by 1 as i starts from 0
582 mNumberClipsToPreview = i+1;
583 break;
584 }
585 else {
586 iIncrementedDuration = iIncrementedDuration +
587 (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime);
588 }
589 }
590 }
591
592 // Open the thread semaphore
593 M4OSA_semaphoreOpen(&mSemThreadWait, 1);
594
595 // Open the preview process thread
596 err = M4OSA_threadSyncOpen(&mThreadContext, (M4OSA_ThreadDoIt)threadProc);
597 if (M4NO_ERROR != err) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800598 LOGE("VideoEditorPreviewController:M4OSA_threadSyncOpen error %d", (int) err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800599 return err;
600 }
601
602 // Set the stacksize
603 err = M4OSA_threadSyncSetOption(mThreadContext, M4OSA_ThreadStackSize,
604 (M4OSA_DataOption)PREVIEW_THREAD_STACK_SIZE);
605
606 if (M4NO_ERROR != err) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800607 LOGE("VideoEditorPreviewController: threadSyncSetOption error %d", (int) err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800608 M4OSA_threadSyncClose(mThreadContext);
609 mThreadContext = NULL;
610 return err;
611 }
612
613 // Start the thread
614 err = M4OSA_threadSyncStart(mThreadContext, (M4OSA_Void*)this);
615 if (M4NO_ERROR != err) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800616 LOGE("VideoEditorPreviewController: threadSyncStart error %d", (int) err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800617 M4OSA_threadSyncClose(mThreadContext);
618 mThreadContext = NULL;
619 return err;
620 }
621 bStopThreadInProgress = false;
622
623 LOGV("startPreview: process thread started");
624 return M4NO_ERROR;
625}
626
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -0800627M4OSA_UInt32 VideoEditorPreviewController::stopPreview() {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800628 M4OSA_ERR err = M4NO_ERROR;
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -0800629 uint32_t lastRenderedFrameTimeMs = 0;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800630 LOGV("stopPreview");
631
632 // Stop the thread
633 if(mThreadContext != NULL) {
634 bStopThreadInProgress = true;
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -0800635 {
636 Mutex::Autolock autoLock(mLockSem);
637 if (mSemThreadWait != NULL) {
638 err = M4OSA_semaphorePost(mSemThreadWait);
639 }
640 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800641
642 err = M4OSA_threadSyncStop(mThreadContext);
643 if(err != M4NO_ERROR) {
644 LOGV("stopPreview: error 0x%x in trying to stop thread", err);
645 // Continue even if error
646 }
647
648 err = M4OSA_threadSyncClose(mThreadContext);
649 if(err != M4NO_ERROR) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800650 LOGE("stopPreview: error 0x%x in trying to close thread", (unsigned int)err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800651 // Continue even if error
652 }
653
654 mThreadContext = NULL;
655 }
656
657 // Close the semaphore first
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -0800658 {
659 Mutex::Autolock autoLock(mLockSem);
660 if(mSemThreadWait != NULL) {
661 err = M4OSA_semaphoreClose(mSemThreadWait);
662 LOGV("stopPreview: close semaphore returns 0x%x", err);
663 mSemThreadWait = NULL;
664 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800665 }
666
667 for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
668 if(mVePlayer[playerInst] != NULL) {
669 if(mVePlayer[playerInst]->isPlaying()) {
670 LOGV("stop the player first");
671 mVePlayer[playerInst]->stop();
672 }
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -0800673 if (playerInst == mActivePlayerIndex) {
674 // Return the last rendered frame time stamp
675 mVePlayer[mActivePlayerIndex]->getLastRenderedTimeMs(&lastRenderedFrameTimeMs);
676 }
Raghavender Pallafa31daf2011-03-18 22:32:51 -0700677
678 //This is used to syncronize onStreamDone() in PreviewPlayer and
679 //stopPreview() in PreviewController
680 sp<VideoEditorPlayer> temp = mVePlayer[playerInst];
681 temp->acquireLock();
682 LOGV("stopPreview: clearing mVePlayer");
683 mVePlayer[playerInst].clear();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800684 mVePlayer[playerInst] = NULL;
Raghavender Pallafa31daf2011-03-18 22:32:51 -0700685 temp->releaseLock();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800686 }
687 }
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800688 LOGV("stopPreview: clear audioSink and audioPlayer");
689 mVEAudioSink.clear();
690 if (mVEAudioPlayer) {
691 delete mVEAudioPlayer;
692 mVEAudioPlayer = NULL;
693 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800694
695 // If image file playing, then free the buffer pointer
696 if(mFrameStr.pBuffer != M4OSA_NULL) {
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700697 free(mFrameStr.pBuffer);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800698 mFrameStr.pBuffer = M4OSA_NULL;
699 }
700
701 // Reset original begin cuttime of first previewed clip*/
702 mClipList[mStartingClipIndex]->uiBeginCutTime = mFirstPreviewClipBeginTime;
703 // Reset original end cuttime of last previewed clip*/
704 mClipList[mNumberClipsToPreview-1]->uiEndCutTime = mLastPreviewClipEndTime;
705
706 mPlayerState = VePlayerIdle;
Dharmaray Kundargi3c48e412011-01-27 18:22:56 -0800707 mPrepareReqest = M4OSA_FALSE;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800708
709 mCurrentPlayedDuration = 0;
710 mCurrentClipDuration = 0;
711 mRenderingMode = M4xVSS_kBlackBorders;
712 mOutputVideoWidth = 0;
713 mOutputVideoHeight = 0;
714
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -0800715 LOGV("stopPreview() lastRenderedFrameTimeMs %ld", lastRenderedFrameTimeMs);
716 return lastRenderedFrameTimeMs;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800717}
718
Dheeraj Sharma9ec356a2011-01-24 15:02:18 -0800719M4OSA_ERR VideoEditorPreviewController::clearSurface(
720 const sp<Surface> &surface, VideoEditor_renderPreviewFrameStr* pFrameInfo) {
721
722 M4OSA_ERR err = M4NO_ERROR;
723 VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo;
724 M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0;
725 M4VIFI_ImagePlane planeOut[3];
726 LOGV("Inside preview clear frame");
727
728 Mutex::Autolock autoLock(mLock);
729
Dheeraj Sharma9ec356a2011-01-24 15:02:18 -0800730 // Delete previous renderer instance
731 if(mTarget != NULL) {
732 delete mTarget;
733 mTarget = NULL;
734 }
735
Dheeraj Sharmaf892b562011-01-31 18:05:50 -0800736 outputBufferWidth = pFrameStr->uiFrameWidth;
737 outputBufferHeight = pFrameStr->uiFrameHeight;
Dheeraj Sharma9ec356a2011-01-24 15:02:18 -0800738
739 // Initialize the renderer
740 if(mTarget == NULL) {
Santosh Madhavabfece172011-02-03 16:59:47 -0800741
742 mTarget = PreviewRenderer::CreatePreviewRenderer(
Dheeraj Sharmaf892b562011-01-31 18:05:50 -0800743 OMX_COLOR_FormatYUV420Planar, surface, outputBufferWidth, outputBufferHeight,
744 outputBufferWidth, outputBufferHeight, 0);
Santosh Madhavabfece172011-02-03 16:59:47 -0800745
Dheeraj Sharma9ec356a2011-01-24 15:02:18 -0800746 if(mTarget == NULL) {
747 LOGE("renderPreviewFrame: cannot create PreviewRenderer");
748 return M4ERR_ALLOC;
749 }
750 }
751
752 // Out plane
753 uint8_t* outBuffer;
754 size_t outBufferStride = 0;
755
756 LOGV("doMediaRendering CALL getBuffer()");
757 mTarget->getBufferYV12(&outBuffer, &outBufferStride);
758
759 // Set the output YUV420 plane to be compatible with YV12 format
760 //In YV12 format, sizes must be even
Dheeraj Sharmaf892b562011-01-31 18:05:50 -0800761 M4OSA_UInt32 yv12PlaneWidth = ((outputBufferWidth +1)>>1)<<1;
762 M4OSA_UInt32 yv12PlaneHeight = ((outputBufferHeight+1)>>1)<<1;
Dheeraj Sharma9ec356a2011-01-24 15:02:18 -0800763
764 prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight,
765 (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer);
766
767 /* Fill the surface with black frame */
Shyam Pallapothu32ed3f42011-04-20 21:00:48 -0700768 memset((void *)planeOut[0].pac_data,0x00,planeOut[0].u_width *
769 planeOut[0].u_height * 1.5);
770 memset((void *)planeOut[1].pac_data,128,planeOut[1].u_width *
771 planeOut[1].u_height);
772 memset((void *)planeOut[2].pac_data,128,planeOut[2].u_width *
773 planeOut[2].u_height);
Dheeraj Sharma9ec356a2011-01-24 15:02:18 -0800774
775 mTarget->renderYV12();
776 return err;
777}
778
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800779M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800780 const sp<Surface> &surface,
781 VideoEditor_renderPreviewFrameStr* pFrameInfo,
782 VideoEditorCurretEditInfo *pCurrEditInfo) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800783
784 M4OSA_ERR err = M4NO_ERROR;
785 M4OSA_UInt32 i = 0, iIncrementedDuration = 0, tnTimeMs=0, framesize =0;
786 VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo;
787 M4VIFI_UInt8 *pixelArray = NULL;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800788 Mutex::Autolock autoLock(mLock);
789
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800790 if (pCurrEditInfo != NULL) {
791 pCurrEditInfo->overlaySettingsIndex = -1;
792 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800793 // Delete previous renderer instance
794 if(mTarget != NULL) {
795 delete mTarget;
796 mTarget = NULL;
797 }
798
799 if(mOutputVideoWidth == 0) {
800 mOutputVideoWidth = pFrameStr->uiFrameWidth;
801 }
Dharmaray Kundargid01ef562011-01-26 21:11:00 -0800802
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800803 if(mOutputVideoHeight == 0) {
804 mOutputVideoHeight = pFrameStr->uiFrameHeight;
805 }
806
807 // Initialize the renderer
808 if(mTarget == NULL) {
Santosh Madhavabfece172011-02-03 16:59:47 -0800809 /*mTarget = new PreviewRenderer(
810 OMX_COLOR_FormatYUV420Planar, surface, mOutputVideoWidth, mOutputVideoHeight,
811 mOutputVideoWidth, mOutputVideoHeight, 0);*/
812
813 mTarget = PreviewRenderer::CreatePreviewRenderer(
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800814 OMX_COLOR_FormatYUV420Planar, surface, mOutputVideoWidth, mOutputVideoHeight,
815 mOutputVideoWidth, mOutputVideoHeight, 0);
Santosh Madhavabfece172011-02-03 16:59:47 -0800816
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800817 if(mTarget == NULL) {
818 LOGE("renderPreviewFrame: cannot create PreviewRenderer");
819 return M4ERR_ALLOC;
820 }
821 }
822
823 pixelArray = NULL;
824
825 // Postprocessing (apply video effect)
826 if(pFrameStr->bApplyEffect == M4OSA_TRUE) {
827
828 for(i=0;i<mNumberEffects;i++) {
829 // First check if effect starttime matches the clip being previewed
830 if((mEffectsSettings[i].uiStartTime < pFrameStr->clipBeginCutTime)
831 ||(mEffectsSettings[i].uiStartTime >= pFrameStr->clipEndCutTime)) {
832 // This effect doesn't belong to this clip, check next one
833 continue;
834 }
835 if((mEffectsSettings[i].uiStartTime <= pFrameStr->timeMs) &&
836 ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >=
837 pFrameStr->timeMs) && (mEffectsSettings[i].uiDuration != 0)) {
838 setVideoEffectType(mEffectsSettings[i].VideoEffectType, TRUE);
839 }
840 else {
841 setVideoEffectType(mEffectsSettings[i].VideoEffectType, FALSE);
842 }
843 }
844
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800845 //Provide the overlay Update indication when there is an overlay effect
Dharmaray Kundargid01ef562011-01-26 21:11:00 -0800846 if (mCurrentVideoEffect & VIDEO_EFFECT_FRAMING) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800847 M4OSA_UInt32 index;
Dharmaray Kundargid01ef562011-01-26 21:11:00 -0800848 mCurrentVideoEffect &= ~VIDEO_EFFECT_FRAMING; //never apply framing here.
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800849
850 // Find the effect in effectSettings array
851 for (index = 0; index < mNumberEffects; index++) {
852 if(mEffectsSettings[index].VideoEffectType ==
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800853 (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) {
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800854
855 if((mEffectsSettings[index].uiStartTime <= pFrameInfo->timeMs) &&
856 ((mEffectsSettings[index].uiStartTime+
857 mEffectsSettings[index].uiDuration) >= pFrameInfo->timeMs))
858 {
859 break;
860 }
861 }
862 }
863 if ((index < mNumberEffects) && (pCurrEditInfo != NULL)) {
864 pCurrEditInfo->overlaySettingsIndex = index;
865 LOGV("Framing index = %d", index);
866 } else {
867 LOGV("No framing effects found");
868 }
869 }
870
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800871 if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) {
872 err = applyVideoEffect((M4OSA_Void *)pFrameStr->pBuffer,
873 OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
874 pFrameStr->uiFrameHeight, pFrameStr->timeMs,
875 (M4OSA_Void *)pixelArray);
876
877 if(err != M4NO_ERROR) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800878 LOGE("renderPreviewFrame: applyVideoEffect error 0x%x", (unsigned int)err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800879 delete mTarget;
880 mTarget = NULL;
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700881 free(pixelArray);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800882 pixelArray = NULL;
883 return err;
884 }
885 mCurrentVideoEffect = VIDEO_EFFECT_NONE;
886 }
887 else {
888 // Apply the rendering mode
889 err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer,
890 OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
891 pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray);
892
893 if(err != M4NO_ERROR) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800894 LOGE("renderPreviewFrame:doImageRenderingMode error 0x%x", (unsigned int)err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800895 delete mTarget;
896 mTarget = NULL;
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700897 free(pixelArray);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800898 pixelArray = NULL;
899 return err;
900 }
901 }
902 }
903 else {
904 // Apply the rendering mode
905 err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer,
906 OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
907 pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray);
908
909 if(err != M4NO_ERROR) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800910 LOGE("renderPreviewFrame: doImageRenderingMode error 0x%x", (unsigned int)err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800911 delete mTarget;
912 mTarget = NULL;
Shyam Pallapothu694816d2011-04-21 09:48:41 -0700913 free(pixelArray);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800914 pixelArray = NULL;
915 return err;
916 }
917 }
918
919 mTarget->renderYV12();
920 return err;
921}
922
923M4OSA_Void VideoEditorPreviewController::setJniCallback(void* cookie,
924 jni_progress_callback_fct callbackFct) {
925 //LOGV("setJniCallback");
926 mJniCookie = cookie;
927 mJniCallback = callbackFct;
928}
929
930M4OSA_ERR VideoEditorPreviewController::preparePlayer(
931 void* param, int playerInstance, int index) {
932
933 M4OSA_ERR err = M4NO_ERROR;
934 VideoEditorPreviewController *pController =
935 (VideoEditorPreviewController *)param;
936
937 LOGV("preparePlayer: instance %d file %d", playerInstance, index);
938
939 pController->mVePlayer[playerInstance]->setDataSource(
940 (const char *)pController->mClipList[index]->pFile, NULL);
941 LOGV("preparePlayer: setDataSource instance %s",
942 (const char *)pController->mClipList[index]->pFile);
943
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800944 pController->mVePlayer[playerInstance]->setVideoSurface(
945 pController->mSurface);
946 LOGV("preparePlayer: setVideoSurface");
947
948 pController->mVePlayer[playerInstance]->setMediaRenderingMode(
949 pController->mClipList[index]->xVSS.MediaRendering,
950 pController->mOutputVideoSize);
951 LOGV("preparePlayer: setMediaRenderingMode");
952
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800953 if((M4OSA_UInt32)index == pController->mStartingClipIndex) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800954 pController->mVePlayer[playerInstance]->setPlaybackBeginTime(
955 pController->mFirstPreviewClipBeginTime);
956 }
957 else {
958 pController->mVePlayer[playerInstance]->setPlaybackBeginTime(
959 pController->mClipList[index]->uiBeginCutTime);
960 }
961 LOGV("preparePlayer: setPlaybackBeginTime(%d)",
962 pController->mClipList[index]->uiBeginCutTime);
963
964 pController->mVePlayer[playerInstance]->setPlaybackEndTime(
965 pController->mClipList[index]->uiEndCutTime);
966 LOGV("preparePlayer: setPlaybackEndTime(%d)",
967 pController->mClipList[index]->uiEndCutTime);
968
969 if(pController->mClipList[index]->FileType == M4VIDEOEDITING_kFileType_ARGB8888) {
970 pController->mVePlayer[playerInstance]->setImageClipProperties(
971 pController->mClipList[index]->ClipProperties.uiVideoWidth,
972 pController->mClipList[index]->ClipProperties.uiVideoHeight);
973 LOGV("preparePlayer: setImageClipProperties");
974 }
975
976 pController->mVePlayer[playerInstance]->prepare();
977 LOGV("preparePlayer: prepared");
978
979 if(pController->mClipList[index]->uiBeginCutTime > 0) {
980 pController->mVePlayer[playerInstance]->seekTo(
981 pController->mClipList[index]->uiBeginCutTime);
982
983 LOGV("preparePlayer: seekTo(%d)",
984 pController->mClipList[index]->uiBeginCutTime);
985 }
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800986 pController->mVePlayer[pController->mCurrentPlayer]->setAudioPlayer(pController->mVEAudioPlayer);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800987
988 pController->mVePlayer[playerInstance]->readFirstVideoFrame();
989 LOGV("preparePlayer: readFirstVideoFrame of clip");
990
991 return err;
992}
993
994M4OSA_ERR VideoEditorPreviewController::threadProc(M4OSA_Void* param) {
995 M4OSA_ERR err = M4NO_ERROR;
996 M4OSA_Int32 index = 0;
997 VideoEditorPreviewController *pController =
998 (VideoEditorPreviewController *)param;
999
1000 LOGV("inside threadProc");
1001 if(pController->mPlayerState == VePlayerIdle) {
1002 (pController->mCurrentClipNumber)++;
1003
1004 LOGV("threadProc: playing file index %d total clips %d",
1005 pController->mCurrentClipNumber, pController->mNumberClipsToPreview);
1006
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001007 if((M4OSA_UInt32)pController->mCurrentClipNumber >=
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001008 pController->mNumberClipsToPreview) {
1009
1010 LOGV("All clips previewed");
1011
1012 pController->mCurrentPlayedDuration = 0;
1013 pController->mCurrentClipDuration = 0;
1014 pController->mCurrentPlayer = 0;
1015
1016 if(pController->mPreviewLooping == M4OSA_TRUE) {
1017 pController->mCurrentClipNumber =
1018 pController->mStartingClipIndex;
1019
1020 LOGV("Preview looping TRUE, restarting from clip index %d",
1021 pController->mCurrentClipNumber);
1022
1023 // Reset the story board timestamp inside the player
1024 for (int playerInst=0; playerInst<NBPLAYER_INSTANCES;
1025 playerInst++) {
1026 pController->mVePlayer[playerInst]->resetJniCallbackTimeStamp();
1027 }
1028 }
1029 else {
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001030 M4OSA_UInt32 endArgs = 0;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001031 if(pController->mJniCallback != NULL) {
1032 pController->mJniCallback(
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001033 pController->mJniCookie, MSG_TYPE_PREVIEW_END, &endArgs);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001034 }
1035 pController->mPlayerState = VePlayerAutoStop;
1036
1037 // Reset original begin cuttime of first previewed clip
1038 pController->mClipList[pController->mStartingClipIndex]->uiBeginCutTime =
1039 pController->mFirstPreviewClipBeginTime;
1040 // Reset original end cuttime of last previewed clip
1041 pController->mClipList[pController->mNumberClipsToPreview-1]->uiEndCutTime =
1042 pController->mLastPreviewClipEndTime;
1043
1044 // Return a warning to M4OSA thread handler
1045 // so that thread is moved from executing state to open state
1046 return M4WAR_NO_MORE_STREAM;
1047 }
1048 }
1049
1050 index=pController->mCurrentClipNumber;
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001051 if((M4OSA_UInt32)pController->mCurrentClipNumber == pController->mStartingClipIndex) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001052 pController->mCurrentPlayedDuration +=
1053 pController->mVideoStoryBoardTimeMsUptoFirstPreviewClip;
1054
1055 pController->mCurrentClipDuration =
1056 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
1057 - pController->mFirstPreviewClipBeginTime;
1058
1059 preparePlayer((void*)pController, pController->mCurrentPlayer, index);
1060 }
1061 else {
1062 pController->mCurrentPlayedDuration +=
1063 pController->mCurrentClipDuration;
1064
1065 pController->mCurrentClipDuration =
1066 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime -
1067 pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;
1068 }
1069
1070 pController->mVePlayer[pController->mCurrentPlayer]->setStoryboardStartTime(
1071 pController->mCurrentPlayedDuration);
1072 LOGV("threadProc: setStoryboardStartTime");
1073
1074 // Set the next clip duration for Audio mix here
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001075 if((M4OSA_UInt32)pController->mCurrentClipNumber != pController->mStartingClipIndex) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001076
1077 pController->mVePlayer[pController->mCurrentPlayer]->setAudioMixStoryBoardParam(
1078 pController->mCurrentPlayedDuration,
1079 pController->mClipList[index]->uiBeginCutTime,
1080 pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage);
1081
1082 LOGV("threadProc: setAudioMixStoryBoardParam fromMS %d \
1083 ClipBeginTime %d", pController->mCurrentPlayedDuration +
1084 pController->mClipList[index]->uiBeginCutTime,
1085 pController->mClipList[index]->uiBeginCutTime,
1086 pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage);
1087 }
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -08001088 // Capture the active player being used
1089 pController->mActivePlayerIndex = pController->mCurrentPlayer;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001090
1091 pController->mVePlayer[pController->mCurrentPlayer]->start();
1092 LOGV("threadProc: started");
1093
1094 pController->mPlayerState = VePlayerBusy;
1095
Dharmaray Kundargi3c48e412011-01-27 18:22:56 -08001096 } else if(pController->mPlayerState == VePlayerAutoStop) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001097 LOGV("Preview completed..auto stop the player");
Dharmaray Kundargi3c48e412011-01-27 18:22:56 -08001098 } else if ((pController->mPlayerState == VePlayerBusy) && (pController->mPrepareReqest)) {
1099 // Prepare the player here
1100 pController->mPrepareReqest = M4OSA_FALSE;
1101 preparePlayer((void*)pController, pController->mCurrentPlayer,
1102 pController->mCurrentClipNumber+1);
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -08001103 if (pController->mSemThreadWait != NULL) {
1104 err = M4OSA_semaphoreWait(pController->mSemThreadWait,
1105 M4OSA_WAIT_FOREVER);
1106 }
Dharmaray Kundargi3c48e412011-01-27 18:22:56 -08001107 } else {
1108 if (!pController->bStopThreadInProgress) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001109 LOGV("threadProc: state busy...wait for sem");
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -08001110 if (pController->mSemThreadWait != NULL) {
1111 err = M4OSA_semaphoreWait(pController->mSemThreadWait,
1112 M4OSA_WAIT_FOREVER);
1113 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001114 }
1115 LOGV("threadProc: sem wait returned err = 0x%x", err);
Raghavender Pallafa31daf2011-03-18 22:32:51 -07001116 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001117
1118 //Always return M4NO_ERROR to ensure the thread keeps running
1119 return M4NO_ERROR;
1120}
1121
1122void VideoEditorPreviewController::notify(
1123 void* cookie, int msg, int ext1, int ext2)
1124{
1125 VideoEditorPreviewController *pController =
1126 (VideoEditorPreviewController *)cookie;
1127
1128 M4OSA_ERR err = M4NO_ERROR;
1129 uint32_t clipDuration = 0;
1130 switch (msg) {
1131 case MEDIA_NOP: // interface test message
1132 LOGV("MEDIA_NOP");
1133 break;
1134 case MEDIA_PREPARED:
1135 LOGV("MEDIA_PREPARED");
1136 break;
1137 case MEDIA_PLAYBACK_COMPLETE:
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001138 {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001139 LOGV("notify:MEDIA_PLAYBACK_COMPLETE");
1140 pController->mPlayerState = VePlayerIdle;
1141
1142 //send progress callback with last frame timestamp
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001143 if((M4OSA_UInt32)pController->mCurrentClipNumber ==
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001144 pController->mStartingClipIndex) {
1145 clipDuration =
1146 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
1147 - pController->mFirstPreviewClipBeginTime;
1148 }
1149 else {
1150 clipDuration =
1151 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
1152 - pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;
1153 }
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001154
1155 M4OSA_UInt32 playedDuration = clipDuration+pController->mCurrentPlayedDuration;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001156 pController->mJniCallback(
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001157 pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION,
1158 &playedDuration);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001159
Dheeraj Sharma4f4efef2011-02-10 16:55:37 -08001160 if ((pController->mOverlayState == OVERLAY_UPDATE) &&
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001161 ((M4OSA_UInt32)pController->mCurrentClipNumber !=
Dheeraj Sharma4f4efef2011-02-10 16:55:37 -08001162 (pController->mNumberClipsToPreview-1))) {
1163 VideoEditorCurretEditInfo *pEditInfo =
Shyam Pallapothu694816d2011-04-21 09:48:41 -07001164 (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo),
Dheeraj Sharma4f4efef2011-02-10 16:55:37 -08001165 M4VS, (M4OSA_Char*)"Current Edit info");
1166 pEditInfo->overlaySettingsIndex = ext2;
1167 pEditInfo->clipIndex = pController->mCurrentClipNumber;
1168 pController->mOverlayState == OVERLAY_CLEAR;
1169 if (pController->mJniCallback != NULL) {
1170 pController->mJniCallback(pController->mJniCookie,
1171 MSG_TYPE_OVERLAY_CLEAR, pEditInfo);
1172 }
Shyam Pallapothu694816d2011-04-21 09:48:41 -07001173 free(pEditInfo);
Dheeraj Sharma4f4efef2011-02-10 16:55:37 -08001174 }
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -08001175 {
1176 Mutex::Autolock autoLock(pController->mLockSem);
1177 if (pController->mSemThreadWait != NULL) {
Raghavender Pallafa31daf2011-03-18 22:32:51 -07001178 M4OSA_semaphorePost(pController->mSemThreadWait);
1179 return;
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -08001180 }
1181 }
1182
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001183 break;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001184 }
1185 case MEDIA_ERROR:
1186 {
1187 int err_val = ext1;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001188 // Always log errors.
1189 // ext1: Media framework error code.
1190 // ext2: Implementation dependant error code.
1191 LOGE("MEDIA_ERROR; error (%d, %d)", ext1, ext2);
1192 if(pController->mJniCallback != NULL) {
1193 pController->mJniCallback(pController->mJniCookie,
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001194 MSG_TYPE_PLAYER_ERROR, &err_val);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001195 }
1196 break;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001197 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001198 case MEDIA_INFO:
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001199 {
1200 int info_val = ext2;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001201 // ext1: Media framework error code.
1202 // ext2: Implementation dependant error code.
1203 //LOGW("MEDIA_INFO; info/warning (%d, %d)", ext1, ext2);
1204 if(pController->mJniCallback != NULL) {
1205 pController->mJniCallback(pController->mJniCookie,
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001206 MSG_TYPE_PROGRESS_INDICATION, &info_val);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001207 }
1208 break;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001209 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001210 case MEDIA_SEEK_COMPLETE:
1211 LOGV("MEDIA_SEEK_COMPLETE; Received seek complete");
1212 break;
1213 case MEDIA_BUFFERING_UPDATE:
1214 LOGV("MEDIA_BUFFERING_UPDATE; buffering %d", ext1);
1215 break;
1216 case MEDIA_SET_VIDEO_SIZE:
1217 LOGV("MEDIA_SET_VIDEO_SIZE; New video size %d x %d", ext1, ext2);
1218 break;
1219 case 0xAAAAAAAA:
1220 LOGV("VIDEO PLAYBACK ALMOST over, prepare next player");
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001221 // Select next player and prepare it
1222 // If there is a clip after this one
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001223 if ((M4OSA_UInt32)(pController->mCurrentClipNumber+1) <
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001224 pController->mNumberClipsToPreview) {
Dharmaray Kundargi53c567c2011-01-29 18:52:50 -08001225 pController->mPrepareReqest = M4OSA_TRUE;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001226 pController->mCurrentPlayer++;
1227 if (pController->mCurrentPlayer >= NBPLAYER_INSTANCES) {
1228 pController->mCurrentPlayer = 0;
1229 }
1230 // Prepare the first clip to be played
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -08001231 {
1232 Mutex::Autolock autoLock(pController->mLockSem);
1233 if (pController->mSemThreadWait != NULL) {
1234 M4OSA_semaphorePost(pController->mSemThreadWait);
1235 }
1236 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001237 }
1238 break;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001239 case 0xBBBBBBBB:
1240 {
1241 LOGV("VIDEO PLAYBACK, Update Overlay");
1242 int overlayIndex = ext2;
1243 VideoEditorCurretEditInfo *pEditInfo =
Shyam Pallapothu694816d2011-04-21 09:48:41 -07001244 (VideoEditorCurretEditInfo*)M4OSA_32bitAlignedMalloc(sizeof(VideoEditorCurretEditInfo),
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001245 M4VS, (M4OSA_Char*)"Current Edit info");
1246 //ext1 = 1; start the overlay display
1247 // = 2; Clear the overlay.
1248 pEditInfo->overlaySettingsIndex = ext2;
1249 pEditInfo->clipIndex = pController->mCurrentClipNumber;
1250 LOGV("pController->mCurrentClipNumber = %d",pController->mCurrentClipNumber);
1251 if (pController->mJniCallback != NULL) {
1252 if (ext1 == 1) {
Dheeraj Sharma4f4efef2011-02-10 16:55:37 -08001253 pController->mOverlayState = OVERLAY_UPDATE;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001254 pController->mJniCallback(pController->mJniCookie,
1255 MSG_TYPE_OVERLAY_UPDATE, pEditInfo);
1256 } else {
Dheeraj Sharma4f4efef2011-02-10 16:55:37 -08001257 pController->mOverlayState = OVERLAY_CLEAR;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001258 pController->mJniCallback(pController->mJniCookie,
1259 MSG_TYPE_OVERLAY_CLEAR, pEditInfo);
1260 }
1261 }
Shyam Pallapothu694816d2011-04-21 09:48:41 -07001262 free(pEditInfo);
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001263 break;
1264 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001265 default:
1266 LOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);
1267 break;
1268 }
1269}
1270
1271void VideoEditorPreviewController::setVideoEffectType(
1272 M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) {
1273
1274 M4OSA_UInt32 effect = VIDEO_EFFECT_NONE;
1275
1276 // map M4VSS3GPP_VideoEffectType to local enum
1277 switch(type) {
1278 case M4VSS3GPP_kVideoEffectType_FadeFromBlack:
1279 effect = VIDEO_EFFECT_FADEFROMBLACK;
1280 break;
1281
1282 case M4VSS3GPP_kVideoEffectType_FadeToBlack:
1283 effect = VIDEO_EFFECT_FADETOBLACK;
1284 break;
1285
1286 case M4VSS3GPP_kVideoEffectType_CurtainOpening:
1287 effect = VIDEO_EFFECT_CURTAINOPEN;
1288 break;
1289
1290 case M4VSS3GPP_kVideoEffectType_CurtainClosing:
1291 effect = VIDEO_EFFECT_CURTAINCLOSE;
1292 break;
1293
1294 case M4xVSS_kVideoEffectType_BlackAndWhite:
1295 effect = VIDEO_EFFECT_BLACKANDWHITE;
1296 break;
1297
1298 case M4xVSS_kVideoEffectType_Pink:
1299 effect = VIDEO_EFFECT_PINK;
1300 break;
1301
1302 case M4xVSS_kVideoEffectType_Green:
1303 effect = VIDEO_EFFECT_GREEN;
1304 break;
1305
1306 case M4xVSS_kVideoEffectType_Sepia:
1307 effect = VIDEO_EFFECT_SEPIA;
1308 break;
1309
1310 case M4xVSS_kVideoEffectType_Negative:
1311 effect = VIDEO_EFFECT_NEGATIVE;
1312 break;
1313
1314 case M4xVSS_kVideoEffectType_Framing:
1315 effect = VIDEO_EFFECT_FRAMING;
1316 break;
1317
1318 case M4xVSS_kVideoEffectType_Fifties:
1319 effect = VIDEO_EFFECT_FIFTIES;
1320 break;
1321
1322 case M4xVSS_kVideoEffectType_ColorRGB16:
1323 effect = VIDEO_EFFECT_COLOR_RGB16;
1324 break;
1325
1326 case M4xVSS_kVideoEffectType_Gradient:
1327 effect = VIDEO_EFFECT_GRADIENT;
1328 break;
1329
1330 default:
1331 effect = VIDEO_EFFECT_NONE;
1332 break;
1333 }
1334
1335 if(enable == M4OSA_TRUE) {
1336 // If already set, then no need to set again
1337 if(!(mCurrentVideoEffect & effect))
1338 mCurrentVideoEffect |= effect;
1339 if(effect == VIDEO_EFFECT_FIFTIES) {
1340 mIsFiftiesEffectStarted = true;
1341 }
1342 }
1343 else {
1344 // Reset only if already set
1345 if(mCurrentVideoEffect & effect)
1346 mCurrentVideoEffect &= ~effect;
1347 }
1348
1349 return;
1350}
1351
1352
1353M4OSA_ERR VideoEditorPreviewController::applyVideoEffect(
1354 M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,
1355 M4OSA_UInt32 videoHeight, M4OSA_UInt32 timeMs, M4OSA_Void* outPtr) {
1356
1357 M4OSA_ERR err = M4NO_ERROR;
1358 vePostProcessParams postProcessParams;
1359
1360 postProcessParams.vidBuffer = (M4VIFI_UInt8*)dataPtr;
1361 postProcessParams.videoWidth = videoWidth;
1362 postProcessParams.videoHeight = videoHeight;
1363 postProcessParams.timeMs = timeMs;
1364 postProcessParams.timeOffset = 0; //Since timeMS already takes care of offset in this case
1365 postProcessParams.effectsSettings = mEffectsSettings;
1366 postProcessParams.numberEffects = mNumberEffects;
1367 postProcessParams.outVideoWidth = mOutputVideoWidth;
1368 postProcessParams.outVideoHeight = mOutputVideoHeight;
1369 postProcessParams.currentVideoEffect = mCurrentVideoEffect;
1370 postProcessParams.renderingMode = mRenderingMode;
1371 if(mIsFiftiesEffectStarted == M4OSA_TRUE) {
1372 postProcessParams.isFiftiesEffectStarted = M4OSA_TRUE;
1373 mIsFiftiesEffectStarted = M4OSA_FALSE;
1374 }
1375 else {
1376 postProcessParams.isFiftiesEffectStarted = M4OSA_FALSE;
1377 }
1378 //postProcessParams.renderer = mTarget;
1379 postProcessParams.overlayFrameRGBBuffer = NULL;
1380 postProcessParams.overlayFrameYUVBuffer = NULL;
1381
1382 mTarget->getBufferYV12(&(postProcessParams.pOutBuffer), &(postProcessParams.outBufferStride));
1383
Dharmaray Kundargid01ef562011-01-26 21:11:00 -08001384 err = applyEffectsAndRenderingMode(&postProcessParams, videoWidth, videoHeight);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001385 return err;
1386}
1387
1388M4OSA_ERR VideoEditorPreviewController::setPreviewFrameRenderingMode(
1389 M4xVSS_MediaRendering mode, M4VIDEOEDITING_VideoFrameSize outputVideoSize) {
1390
Dharmaray Kundargid01ef562011-01-26 21:11:00 -08001391 LOGV("setMediaRenderingMode: outputVideoSize = %d", outputVideoSize);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001392 mRenderingMode = mode;
1393
1394 switch(outputVideoSize) {
1395 case M4VIDEOEDITING_kSQCIF:
1396 mOutputVideoWidth = 128;
1397 mOutputVideoHeight = 96;
1398 break;
1399
1400 case M4VIDEOEDITING_kQQVGA:
1401 mOutputVideoWidth = 160;
1402 mOutputVideoHeight = 120;
1403 break;
1404
1405 case M4VIDEOEDITING_kQCIF:
1406 mOutputVideoWidth = 176;
1407 mOutputVideoHeight = 144;
1408 break;
1409
1410 case M4VIDEOEDITING_kQVGA:
1411 mOutputVideoWidth = 320;
1412 mOutputVideoHeight = 240;
1413 break;
1414
1415 case M4VIDEOEDITING_kCIF:
1416 mOutputVideoWidth = 352;
1417 mOutputVideoHeight = 288;
1418 break;
1419
1420 case M4VIDEOEDITING_kVGA:
1421 mOutputVideoWidth = 640;
1422 mOutputVideoHeight = 480;
1423 break;
1424
1425 case M4VIDEOEDITING_kWVGA:
1426 mOutputVideoWidth = 800;
1427 mOutputVideoHeight = 480;
1428 break;
1429
1430 case M4VIDEOEDITING_kNTSC:
1431 mOutputVideoWidth = 720;
1432 mOutputVideoHeight = 480;
1433 break;
1434
1435 case M4VIDEOEDITING_k640_360:
1436 mOutputVideoWidth = 640;
1437 mOutputVideoHeight = 360;
1438 break;
1439
1440 case M4VIDEOEDITING_k854_480:
1441 mOutputVideoWidth = 854;
1442 mOutputVideoHeight = 480;
1443 break;
1444
1445 case M4VIDEOEDITING_kHD1280:
1446 mOutputVideoWidth = 1280;
1447 mOutputVideoHeight = 720;
1448 break;
1449
1450 case M4VIDEOEDITING_kHD1080:
1451 mOutputVideoWidth = 1080;
1452 mOutputVideoHeight = 720;
1453 break;
1454
1455 case M4VIDEOEDITING_kHD960:
1456 mOutputVideoWidth = 960;
1457 mOutputVideoHeight = 720;
1458 break;
1459
1460 default:
1461 mOutputVideoWidth = 0;
1462 mOutputVideoHeight = 0;
1463 break;
1464 }
1465
1466 return OK;
1467}
1468
1469M4OSA_ERR VideoEditorPreviewController::doImageRenderingMode(
1470 M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,
1471 M4OSA_UInt32 videoHeight, M4OSA_Void* outPtr) {
1472
1473 M4OSA_ERR err = M4NO_ERROR;
1474 M4VIFI_ImagePlane planeIn[3], planeOut[3];
1475 M4VIFI_UInt8 *inBuffer = M4OSA_NULL;
1476 M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0;
1477
1478 //frameSize = (videoWidth*videoHeight*3) >> 1;
1479 inBuffer = (M4OSA_UInt8 *)dataPtr;
1480
1481 // In plane
1482 prepareYUV420ImagePlane(planeIn, videoWidth,
Dharmaray Kundargi35cb2de2011-01-19 19:09:27 -08001483 videoHeight, (M4VIFI_UInt8 *)inBuffer, videoWidth, videoHeight);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001484
1485 outputBufferWidth = mOutputVideoWidth;
1486 outputBufferHeight = mOutputVideoHeight;
1487
1488 // Out plane
1489 uint8_t* outBuffer;
1490 size_t outBufferStride = 0;
1491
1492 LOGV("doMediaRendering CALL getBuffer()");
1493 mTarget->getBufferYV12(&outBuffer, &outBufferStride);
1494
1495 // Set the output YUV420 plane to be compatible with YV12 format
1496 //In YV12 format, sizes must be even
1497 M4OSA_UInt32 yv12PlaneWidth = ((mOutputVideoWidth +1)>>1)<<1;
1498 M4OSA_UInt32 yv12PlaneHeight = ((mOutputVideoHeight+1)>>1)<<1;
1499
1500 prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight,
1501 (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer);
1502
1503 err = applyRenderingMode(planeIn, planeOut, mRenderingMode);
1504 if(err != M4NO_ERROR) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001505 LOGE("doImageRenderingMode: applyRenderingMode returned err=0x%x", (unsigned int)err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001506 }
1507 return err;
1508}
1509
1510} //namespace android