blob: c9da6b0d5c46481d10a6b5a739a5eef4e29f3a58 [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) {
102 M4OSA_free((M4OSA_MemAddr32)mClipList[i]->pFile);
103 mClipList[i]->pFile = NULL;
104 }
105
106 M4OSA_free((M4OSA_MemAddr32)mClipList[i]);
107 }
108 M4OSA_free((M4OSA_MemAddr32)mClipList);
109 mClipList = NULL;
110 }
111
112 if(mEffectsSettings) {
113 for(i=0;i<mNumberEffects;i++) {
114 if(mEffectsSettings[i].xVSS.pFramingBuffer != NULL) {
115 M4OSA_free(
116 (M4OSA_MemAddr32)mEffectsSettings[i].xVSS.pFramingBuffer->pac_data);
117
118 M4OSA_free(
119 (M4OSA_MemAddr32)mEffectsSettings[i].xVSS.pFramingBuffer);
120
121 mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
122 }
123 }
124 M4OSA_free((M4OSA_MemAddr32)mEffectsSettings);
125 mEffectsSettings = NULL;
126 }
127
Dheeraj Sharmaeab39fb2011-01-27 19:31:28 -0800128 if (mAudioMixPCMFileHandle) {
129 err = M4OSA_fileReadClose (mAudioMixPCMFileHandle);
130 mAudioMixPCMFileHandle = M4OSA_NULL;
131 }
132
Santosh Madhavab4ce81da2011-02-09 19:20:17 -0800133 if (mBackgroundAudioSetting != NULL) {
134 M4OSA_free((M4OSA_MemAddr32)mBackgroundAudioSetting);
135 mBackgroundAudioSetting = NULL;
136 }
137
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800138 if(mTarget != NULL) {
139 delete mTarget;
140 mTarget = NULL;
141 }
142
Dheeraj Sharma4f4efef2011-02-10 16:55:37 -0800143 mOverlayState = OVERLAY_CLEAR;
144
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800145 LOGV("~VideoEditorPreviewController returns");
146}
147
148M4OSA_ERR VideoEditorPreviewController::loadEditSettings(
149 M4VSS3GPP_EditSettings* pSettings,M4xVSS_AudioMixingSettings* bgmSettings) {
150
151 M4OSA_UInt32 i = 0, iClipDuration = 0, rgbSize = 0;
152 M4VIFI_UInt8 *tmp = NULL;
153 M4OSA_ERR err = M4NO_ERROR;
154
155 LOGV("loadEditSettings");
156 LOGV("loadEditSettings Channels = %d, sampling Freq %d",
157 bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency );
158 bgmSettings->uiSamplingFrequency = 32000;
159
160 LOGV("loadEditSettings Channels = %d, sampling Freq %d",
161 bgmSettings->uiNbChannels, bgmSettings->uiSamplingFrequency );
162 Mutex::Autolock autoLock(mLock);
163
164 // Clean up any previous Edit settings before loading new ones
165 mCurrentVideoEffect = VIDEO_EFFECT_NONE;
166
167 if(mAudioMixPCMFileHandle) {
168 err = M4OSA_fileReadClose (mAudioMixPCMFileHandle);
169 mAudioMixPCMFileHandle = M4OSA_NULL;
170 }
171
172 if(mBackgroundAudioSetting != NULL) {
173 M4OSA_free((M4OSA_MemAddr32)mBackgroundAudioSetting);
174 mBackgroundAudioSetting = NULL;
175 }
176
177 if(mClipList != NULL) {
178 // Clean up
179 for(i=0;i<mNumberClipsInStoryBoard;i++)
180 {
181 if(mClipList[i]->pFile != NULL) {
182 M4OSA_free((M4OSA_MemAddr32)mClipList[i]->pFile);
183 mClipList[i]->pFile = NULL;
184 }
185
186 M4OSA_free((M4OSA_MemAddr32)mClipList[i]);
187 }
188 M4OSA_free((M4OSA_MemAddr32)mClipList);
189 mClipList = NULL;
190 }
191
192 if(mEffectsSettings) {
193 for(i=0;i<mNumberEffects;i++) {
194 if(mEffectsSettings[i].xVSS.pFramingBuffer != NULL) {
195 M4OSA_free(
196 (M4OSA_MemAddr32)mEffectsSettings[i].xVSS.pFramingBuffer->pac_data);
197
198 M4OSA_free(
199 (M4OSA_MemAddr32)mEffectsSettings[i].xVSS.pFramingBuffer);
200
201 mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
202 }
203 }
204 M4OSA_free((M4OSA_MemAddr32)mEffectsSettings);
205 mEffectsSettings = NULL;
206 }
207
208 if(mClipList == NULL) {
209 mNumberClipsInStoryBoard = pSettings->uiClipNumber;
210 LOGV("loadEditSettings: # of Clips = %d", mNumberClipsInStoryBoard);
211
212 mClipList = (M4VSS3GPP_ClipSettings**)M4OSA_malloc(
213 sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber, M4VS,
214 (M4OSA_Char*)"LvPP, copy of pClipList");
215
216 if(NULL == mClipList) {
217 LOGE("loadEditSettings: Malloc error");
218 return M4ERR_ALLOC;
219 }
220 M4OSA_memset((M4OSA_MemAddr8)mClipList,
221 sizeof(M4VSS3GPP_ClipSettings*)*pSettings->uiClipNumber, 0);
222
223 for(i=0;i<pSettings->uiClipNumber;i++) {
224
225 // Allocate current clip
226 mClipList[i] =
227 (M4VSS3GPP_ClipSettings*)M4OSA_malloc(
228 sizeof(M4VSS3GPP_ClipSettings),M4VS,(M4OSA_Char*)"clip settings");
229
230 if(mClipList[i] == NULL) {
231
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800232 LOGE("loadEditSettings: Allocation error for mClipList[%d]", (int)i);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800233 return M4ERR_ALLOC;
234 }
235 // Copy plain structure
236 M4OSA_memcpy((M4OSA_MemAddr8)mClipList[i],
237 (M4OSA_MemAddr8)pSettings->pClipList[i],
238 sizeof(M4VSS3GPP_ClipSettings));
239
240 if(NULL != pSettings->pClipList[i]->pFile) {
241 mClipList[i]->pFile = (M4OSA_Char*)M4OSA_malloc(
242 pSettings->pClipList[i]->filePathSize, M4VS,
243 (M4OSA_Char*)"pClipSettingsDest->pFile");
244
245 if(NULL == mClipList[i]->pFile)
246 {
247 LOGE("loadEditSettings : ERROR allocating filename");
248 return M4ERR_ALLOC;
249 }
250
251 M4OSA_memcpy((M4OSA_MemAddr8)mClipList[i]->pFile,
252 (M4OSA_MemAddr8)pSettings->pClipList[i]->pFile,
253 pSettings->pClipList[i]->filePathSize);
254 }
255 else {
256 LOGE("NULL file path");
257 return M4ERR_PARAMETER;
258 }
259
260 // Calculate total duration of all clips
261 iClipDuration = pSettings->pClipList[i]->uiEndCutTime -
262 pSettings->pClipList[i]->uiBeginCutTime;
263
264 mClipTotalDuration = mClipTotalDuration+iClipDuration;
265 }
266 }
267
268 if(mEffectsSettings == NULL) {
269 mNumberEffects = pSettings->nbEffects;
270 LOGV("loadEditSettings: mNumberEffects = %d", mNumberEffects);
271
272 if(mNumberEffects != 0) {
273 mEffectsSettings = (M4VSS3GPP_EffectSettings*)M4OSA_malloc(
274 mNumberEffects*sizeof(M4VSS3GPP_EffectSettings),
275 M4VS, (M4OSA_Char*)"effects settings");
276
277 if(mEffectsSettings == NULL) {
278 LOGE("loadEffectsSettings: Allocation error");
279 return M4ERR_ALLOC;
280 }
281
282 M4OSA_memset((M4OSA_MemAddr8)mEffectsSettings,
283 mNumberEffects*sizeof(M4VSS3GPP_EffectSettings), 0);
284
285 for(i=0;i<mNumberEffects;i++) {
286
287 mEffectsSettings[i].xVSS.pFramingFilePath = NULL;
288 mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
289 mEffectsSettings[i].xVSS.pTextBuffer = NULL;
290
291 M4OSA_memcpy((M4OSA_MemAddr8)&(mEffectsSettings[i]),
292 (M4OSA_MemAddr8)&(pSettings->Effects[i]),
293 sizeof(M4VSS3GPP_EffectSettings));
294
295 if(pSettings->Effects[i].VideoEffectType ==
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800296 (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800297 // Allocate the pFraming RGB buffer
298 mEffectsSettings[i].xVSS.pFramingBuffer =
299 (M4VIFI_ImagePlane *)M4OSA_malloc(sizeof(M4VIFI_ImagePlane),
300 M4VS, (M4OSA_Char*)"lvpp framing buffer");
301
302 if(mEffectsSettings[i].xVSS.pFramingBuffer == NULL) {
303 LOGE("loadEffectsSettings:Alloc error for pFramingBuf");
304 M4OSA_free((M4OSA_MemAddr32)mEffectsSettings);
305 mEffectsSettings = NULL;
306 return M4ERR_ALLOC;
307 }
308
309 // Allocate the pac_data (RGB)
310 if(pSettings->Effects[i].xVSS.rgbType == M4VSS3GPP_kRGB565){
311 rgbSize =
312 pSettings->Effects[i].xVSS.pFramingBuffer->u_width *
313 pSettings->Effects[i].xVSS.pFramingBuffer->u_height*2;
314 }
315 else if(
316 pSettings->Effects[i].xVSS.rgbType == M4VSS3GPP_kRGB888) {
317 rgbSize =
318 pSettings->Effects[i].xVSS.pFramingBuffer->u_width *
319 pSettings->Effects[i].xVSS.pFramingBuffer->u_height*3;
320 }
321 else {
322 LOGE("loadEffectsSettings: wrong RGB type");
323 M4OSA_free((M4OSA_MemAddr32)mEffectsSettings);
324 mEffectsSettings = NULL;
325 return M4ERR_PARAMETER;
326 }
327
328 tmp = (M4VIFI_UInt8 *)M4OSA_malloc(rgbSize, M4VS,
329 (M4OSA_Char*)"framing buffer pac_data");
330
331 if(tmp == NULL) {
332 LOGE("loadEffectsSettings:Alloc error pFramingBuf pac");
333 M4OSA_free((M4OSA_MemAddr32)mEffectsSettings);
334 mEffectsSettings = NULL;
335 M4OSA_free(
336 (M4OSA_MemAddr32)mEffectsSettings[i].xVSS.pFramingBuffer);
337
338 mEffectsSettings[i].xVSS.pFramingBuffer = NULL;
339 return M4ERR_ALLOC;
340 }
341 /* Initialize the pFramingBuffer*/
342 mEffectsSettings[i].xVSS.pFramingBuffer->pac_data = tmp;
343 mEffectsSettings[i].xVSS.pFramingBuffer->u_height =
344 pSettings->Effects[i].xVSS.pFramingBuffer->u_height;
345
346 mEffectsSettings[i].xVSS.pFramingBuffer->u_width =
347 pSettings->Effects[i].xVSS.pFramingBuffer->u_width;
348
349 mEffectsSettings[i].xVSS.pFramingBuffer->u_stride =
350 pSettings->Effects[i].xVSS.pFramingBuffer->u_stride;
351
352 mEffectsSettings[i].xVSS.pFramingBuffer->u_topleft =
353 pSettings->Effects[i].xVSS.pFramingBuffer->u_topleft;
354
355 mEffectsSettings[i].xVSS.uialphaBlendingStart =
356 pSettings->Effects[i].xVSS.uialphaBlendingStart;
357
358 mEffectsSettings[i].xVSS.uialphaBlendingMiddle =
359 pSettings->Effects[i].xVSS.uialphaBlendingMiddle;
360
361 mEffectsSettings[i].xVSS.uialphaBlendingEnd =
362 pSettings->Effects[i].xVSS.uialphaBlendingEnd;
363
364 mEffectsSettings[i].xVSS.uialphaBlendingFadeInTime =
365 pSettings->Effects[i].xVSS.uialphaBlendingFadeInTime;
366 mEffectsSettings[i].xVSS.uialphaBlendingFadeOutTime =
367 pSettings->Effects[i].xVSS.uialphaBlendingFadeOutTime;
368
369 // Copy the pFraming data
370 M4OSA_memcpy((M4OSA_MemAddr8)
371 mEffectsSettings[i].xVSS.pFramingBuffer->pac_data,
372 (M4OSA_MemAddr8)pSettings->Effects[i].xVSS.pFramingBuffer->pac_data,
373 rgbSize);
374
375 mEffectsSettings[i].xVSS.rgbType =
376 pSettings->Effects[i].xVSS.rgbType;
377 }
378 }
379 }
380 }
381
382 if (mBackgroundAudioSetting == NULL) {
383
384 mBackgroundAudioSetting = (M4xVSS_AudioMixingSettings*)M4OSA_malloc(
385 sizeof(M4xVSS_AudioMixingSettings), M4VS,
386 (M4OSA_Char*)"LvPP, copy of bgmSettings");
387
388 if(NULL == mBackgroundAudioSetting) {
389 LOGE("loadEditSettings: mBackgroundAudioSetting Malloc failed");
390 return M4ERR_ALLOC;
391 }
392
393 M4OSA_memset((M4OSA_MemAddr8)mBackgroundAudioSetting, sizeof(M4xVSS_AudioMixingSettings*), 0);
394 M4OSA_memcpy((M4OSA_MemAddr8)mBackgroundAudioSetting, (M4OSA_MemAddr8)bgmSettings, sizeof(M4xVSS_AudioMixingSettings));
395
396 if ( mBackgroundAudioSetting->pFile != M4OSA_NULL ) {
397
398 mBackgroundAudioSetting->pFile = (M4OSA_Void*) bgmSettings->pPCMFilePath;
399 mBackgroundAudioSetting->uiNbChannels = 2;
400 mBackgroundAudioSetting->uiSamplingFrequency = 32000;
401 }
402
403 // Open the BG file
404 if ( mBackgroundAudioSetting->pFile != M4OSA_NULL ) {
405 err = M4OSA_fileReadOpen(&mAudioMixPCMFileHandle,
406 mBackgroundAudioSetting->pFile, M4OSA_kFileRead);
407
408 if (err != M4NO_ERROR) {
409 LOGE("loadEditSettings: mBackgroundAudio PCM File open failed");
410 return M4ERR_PARAMETER;
411 }
412 }
413 }
414
415 mOutputVideoSize = pSettings->xVSS.outputVideoSize;
416 mFrameStr.pBuffer = M4OSA_NULL;
417 return M4NO_ERROR;
418}
419
420M4OSA_ERR VideoEditorPreviewController::setSurface(const sp<Surface> &surface) {
421 LOGV("setSurface");
422 Mutex::Autolock autoLock(mLock);
423
424 mSurface = surface;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800425 return M4NO_ERROR;
426}
427
428M4OSA_ERR VideoEditorPreviewController::startPreview(
429 M4OSA_UInt32 fromMS, M4OSA_Int32 toMs, M4OSA_UInt16 callBackAfterFrameCount,
430 M4OSA_Bool loop) {
431
432 M4OSA_ERR err = M4NO_ERROR;
433 M4OSA_UInt32 i = 0, iIncrementedDuration = 0;
434 LOGV("startPreview");
435
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800436 if(fromMS > (M4OSA_UInt32)toMs) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800437 LOGE("startPreview: fromMS > toMs");
438 return M4ERR_PARAMETER;
439 }
440
441 if(toMs == 0) {
442 LOGE("startPreview: toMs is 0");
443 return M4ERR_PARAMETER;
444 }
445
446 // If already started, then stop preview first
447 for(int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
448 if(mVePlayer[playerInst] != NULL) {
449 LOGV("startPreview: stopping previously started preview playback");
450 stopPreview();
451 break;
452 }
453 }
454
455 // If renderPreview was called previously, then delete Renderer object first
456 if(mTarget != NULL) {
457 LOGV("startPreview: delete previous PreviewRenderer");
458 delete mTarget;
459 mTarget = NULL;
460 }
461
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800462 // Create Audio player to be used for entire
463 // storyboard duration
464 mVEAudioSink = new VideoEditorPlayer::VeAudioOutput();
465 mVEAudioPlayer = new VideoEditorAudioPlayer(mVEAudioSink);
466 mVEAudioPlayer->setAudioMixSettings(mBackgroundAudioSetting);
467 mVEAudioPlayer->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle);
468
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800469 LOGV("startPreview: loop = %d", loop);
470 mPreviewLooping = loop;
471
472 LOGV("startPreview: callBackAfterFrameCount = %d", callBackAfterFrameCount);
473 mCallBackAfterFrameCnt = callBackAfterFrameCount;
474
475 for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
476 mVePlayer[playerInst] = new VideoEditorPlayer();
477 if(mVePlayer[playerInst] == NULL) {
478 LOGE("startPreview:Error creating VideoEditorPlayer %d",playerInst);
479 return M4ERR_ALLOC;
480 }
481 LOGV("startPreview: object created");
482
483 mVePlayer[playerInst]->setNotifyCallback(this,(notify_callback_f)notify);
484 LOGV("startPreview: notify callback set");
485
486 mVePlayer[playerInst]->loadEffectsSettings(mEffectsSettings,
487 mNumberEffects);
488 LOGV("startPreview: effects settings loaded");
489
490 mVePlayer[playerInst]->loadAudioMixSettings(mBackgroundAudioSetting);
491 LOGV("startPreview: AudioMixSettings settings loaded");
492
493 mVePlayer[playerInst]->setAudioMixPCMFileHandle(mAudioMixPCMFileHandle);
494 LOGV("startPreview: AudioMixPCMFileHandle set");
495
496 mVePlayer[playerInst]->setProgressCallbackInterval(
497 mCallBackAfterFrameCnt);
498 LOGV("startPreview: setProgressCallBackInterval");
499 }
500
501 mPlayerState = VePlayerIdle;
Dharmaray Kundargi3c48e412011-01-27 18:22:56 -0800502 mPrepareReqest = M4OSA_FALSE;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800503
504 if(fromMS == 0) {
505 mCurrentClipNumber = -1;
506 // Save original value
507 mFirstPreviewClipBeginTime = mClipList[0]->uiBeginCutTime;
508 mVideoStoryBoardTimeMsUptoFirstPreviewClip = 0;
509 }
510 else {
511 LOGV("startPreview: fromMS=%d", fromMS);
512 if(fromMS >= mClipTotalDuration) {
513 LOGE("startPreview: fromMS >= mClipTotalDuration");
514 return M4ERR_PARAMETER;
515 }
516 for(i=0;i<mNumberClipsInStoryBoard;i++) {
517 if(fromMS < (iIncrementedDuration + (mClipList[i]->uiEndCutTime -
518 mClipList[i]->uiBeginCutTime))) {
519 // Set to 1 index below,
520 // as threadProcess first increments the clip index
521 // and then processes clip in thread loop
522 mCurrentClipNumber = i-1;
523 LOGV("startPreview:mCurrentClipNumber = %d fromMS=%d",i,fromMS);
524
525 // Save original value
526 mFirstPreviewClipBeginTime = mClipList[i]->uiBeginCutTime;
527
528 // Set correct begin time to start playback
529 if((fromMS+mClipList[i]->uiBeginCutTime) >
530 (iIncrementedDuration+mClipList[i]->uiBeginCutTime)) {
531
532 mClipList[i]->uiBeginCutTime =
533 mClipList[i]->uiBeginCutTime +
534 (fromMS - iIncrementedDuration);
535 }
536 break;
537 }
538 else {
539 iIncrementedDuration = iIncrementedDuration +
540 (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime);
541 }
542 }
543 mVideoStoryBoardTimeMsUptoFirstPreviewClip = iIncrementedDuration;
544 }
545
546 for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
547 mVePlayer[playerInst]->setAudioMixStoryBoardParam(fromMS,
548 mFirstPreviewClipBeginTime,
549 mClipList[i]->ClipProperties.uiClipAudioVolumePercentage);
550
551 LOGV("startPreview:setAudioMixStoryBoardSkimTimeStamp set %d cuttime \
552 %d", fromMS, mFirstPreviewClipBeginTime);
553 }
554
555 mStartingClipIndex = mCurrentClipNumber+1;
556
557 // Start playing with player instance 0
558 mCurrentPlayer = 0;
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -0800559 mActivePlayerIndex = 0;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800560
561 if(toMs == -1) {
562 LOGV("startPreview: Preview till end of storyboard");
563 mNumberClipsToPreview = mNumberClipsInStoryBoard;
564 // Save original value
565 mLastPreviewClipEndTime =
566 mClipList[mNumberClipsToPreview-1]->uiEndCutTime;
567 }
568 else {
569 LOGV("startPreview: toMs=%d", toMs);
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800570 if((M4OSA_UInt32)toMs > mClipTotalDuration) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800571 LOGE("startPreview: toMs > mClipTotalDuration");
572 return M4ERR_PARAMETER;
573 }
574
575 iIncrementedDuration = 0;
576
577 for(i=0;i<mNumberClipsInStoryBoard;i++) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800578 if((M4OSA_UInt32)toMs <= (iIncrementedDuration +
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800579 (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime))) {
580 // Save original value
581 mLastPreviewClipEndTime = mClipList[i]->uiEndCutTime;
582 // Set the end cut time of clip index i to toMs
583 mClipList[i]->uiEndCutTime = toMs;
584
585 // Number of clips to be previewed is from index 0 to i
586 // increment by 1 as i starts from 0
587 mNumberClipsToPreview = i+1;
588 break;
589 }
590 else {
591 iIncrementedDuration = iIncrementedDuration +
592 (mClipList[i]->uiEndCutTime - mClipList[i]->uiBeginCutTime);
593 }
594 }
595 }
596
597 // Open the thread semaphore
598 M4OSA_semaphoreOpen(&mSemThreadWait, 1);
599
600 // Open the preview process thread
601 err = M4OSA_threadSyncOpen(&mThreadContext, (M4OSA_ThreadDoIt)threadProc);
602 if (M4NO_ERROR != err) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800603 LOGE("VideoEditorPreviewController:M4OSA_threadSyncOpen error %d", (int) err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800604 return err;
605 }
606
607 // Set the stacksize
608 err = M4OSA_threadSyncSetOption(mThreadContext, M4OSA_ThreadStackSize,
609 (M4OSA_DataOption)PREVIEW_THREAD_STACK_SIZE);
610
611 if (M4NO_ERROR != err) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800612 LOGE("VideoEditorPreviewController: threadSyncSetOption error %d", (int) err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800613 M4OSA_threadSyncClose(mThreadContext);
614 mThreadContext = NULL;
615 return err;
616 }
617
618 // Start the thread
619 err = M4OSA_threadSyncStart(mThreadContext, (M4OSA_Void*)this);
620 if (M4NO_ERROR != err) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800621 LOGE("VideoEditorPreviewController: threadSyncStart error %d", (int) err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800622 M4OSA_threadSyncClose(mThreadContext);
623 mThreadContext = NULL;
624 return err;
625 }
626 bStopThreadInProgress = false;
627
628 LOGV("startPreview: process thread started");
629 return M4NO_ERROR;
630}
631
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -0800632M4OSA_UInt32 VideoEditorPreviewController::stopPreview() {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800633 M4OSA_ERR err = M4NO_ERROR;
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -0800634 uint32_t lastRenderedFrameTimeMs = 0;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800635 LOGV("stopPreview");
636
637 // Stop the thread
638 if(mThreadContext != NULL) {
639 bStopThreadInProgress = true;
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -0800640 {
641 Mutex::Autolock autoLock(mLockSem);
642 if (mSemThreadWait != NULL) {
643 err = M4OSA_semaphorePost(mSemThreadWait);
644 }
645 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800646
647 err = M4OSA_threadSyncStop(mThreadContext);
648 if(err != M4NO_ERROR) {
649 LOGV("stopPreview: error 0x%x in trying to stop thread", err);
650 // Continue even if error
651 }
652
653 err = M4OSA_threadSyncClose(mThreadContext);
654 if(err != M4NO_ERROR) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800655 LOGE("stopPreview: error 0x%x in trying to close thread", (unsigned int)err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800656 // Continue even if error
657 }
658
659 mThreadContext = NULL;
660 }
661
662 // Close the semaphore first
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -0800663 {
664 Mutex::Autolock autoLock(mLockSem);
665 if(mSemThreadWait != NULL) {
666 err = M4OSA_semaphoreClose(mSemThreadWait);
667 LOGV("stopPreview: close semaphore returns 0x%x", err);
668 mSemThreadWait = NULL;
669 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800670 }
671
672 for (int playerInst=0; playerInst<NBPLAYER_INSTANCES; playerInst++) {
673 if(mVePlayer[playerInst] != NULL) {
674 if(mVePlayer[playerInst]->isPlaying()) {
675 LOGV("stop the player first");
676 mVePlayer[playerInst]->stop();
677 }
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -0800678 if (playerInst == mActivePlayerIndex) {
679 // Return the last rendered frame time stamp
680 mVePlayer[mActivePlayerIndex]->getLastRenderedTimeMs(&lastRenderedFrameTimeMs);
681 }
Raghavender Pallafa31daf2011-03-18 22:32:51 -0700682
683 //This is used to syncronize onStreamDone() in PreviewPlayer and
684 //stopPreview() in PreviewController
685 sp<VideoEditorPlayer> temp = mVePlayer[playerInst];
686 temp->acquireLock();
687 LOGV("stopPreview: clearing mVePlayer");
688 mVePlayer[playerInst].clear();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800689 mVePlayer[playerInst] = NULL;
Raghavender Pallafa31daf2011-03-18 22:32:51 -0700690 temp->releaseLock();
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800691 }
692 }
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800693 LOGV("stopPreview: clear audioSink and audioPlayer");
694 mVEAudioSink.clear();
695 if (mVEAudioPlayer) {
696 delete mVEAudioPlayer;
697 mVEAudioPlayer = NULL;
698 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800699
700 // If image file playing, then free the buffer pointer
701 if(mFrameStr.pBuffer != M4OSA_NULL) {
702 M4OSA_free((M4OSA_MemAddr32)mFrameStr.pBuffer);
703 mFrameStr.pBuffer = M4OSA_NULL;
704 }
705
706 // Reset original begin cuttime of first previewed clip*/
707 mClipList[mStartingClipIndex]->uiBeginCutTime = mFirstPreviewClipBeginTime;
708 // Reset original end cuttime of last previewed clip*/
709 mClipList[mNumberClipsToPreview-1]->uiEndCutTime = mLastPreviewClipEndTime;
710
711 mPlayerState = VePlayerIdle;
Dharmaray Kundargi3c48e412011-01-27 18:22:56 -0800712 mPrepareReqest = M4OSA_FALSE;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800713
714 mCurrentPlayedDuration = 0;
715 mCurrentClipDuration = 0;
716 mRenderingMode = M4xVSS_kBlackBorders;
717 mOutputVideoWidth = 0;
718 mOutputVideoHeight = 0;
719
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -0800720 LOGV("stopPreview() lastRenderedFrameTimeMs %ld", lastRenderedFrameTimeMs);
721 return lastRenderedFrameTimeMs;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800722}
723
Dheeraj Sharma9ec356a2011-01-24 15:02:18 -0800724M4OSA_ERR VideoEditorPreviewController::clearSurface(
725 const sp<Surface> &surface, VideoEditor_renderPreviewFrameStr* pFrameInfo) {
726
727 M4OSA_ERR err = M4NO_ERROR;
728 VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo;
729 M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0;
730 M4VIFI_ImagePlane planeOut[3];
731 LOGV("Inside preview clear frame");
732
733 Mutex::Autolock autoLock(mLock);
734
Dheeraj Sharma9ec356a2011-01-24 15:02:18 -0800735 // Delete previous renderer instance
736 if(mTarget != NULL) {
737 delete mTarget;
738 mTarget = NULL;
739 }
740
Dheeraj Sharmaf892b562011-01-31 18:05:50 -0800741 outputBufferWidth = pFrameStr->uiFrameWidth;
742 outputBufferHeight = pFrameStr->uiFrameHeight;
Dheeraj Sharma9ec356a2011-01-24 15:02:18 -0800743
744 // Initialize the renderer
745 if(mTarget == NULL) {
Santosh Madhavabfece172011-02-03 16:59:47 -0800746
747 mTarget = PreviewRenderer::CreatePreviewRenderer(
Dheeraj Sharmaf892b562011-01-31 18:05:50 -0800748 OMX_COLOR_FormatYUV420Planar, surface, outputBufferWidth, outputBufferHeight,
749 outputBufferWidth, outputBufferHeight, 0);
Santosh Madhavabfece172011-02-03 16:59:47 -0800750
Dheeraj Sharma9ec356a2011-01-24 15:02:18 -0800751 if(mTarget == NULL) {
752 LOGE("renderPreviewFrame: cannot create PreviewRenderer");
753 return M4ERR_ALLOC;
754 }
755 }
756
757 // Out plane
758 uint8_t* outBuffer;
759 size_t outBufferStride = 0;
760
761 LOGV("doMediaRendering CALL getBuffer()");
762 mTarget->getBufferYV12(&outBuffer, &outBufferStride);
763
764 // Set the output YUV420 plane to be compatible with YV12 format
765 //In YV12 format, sizes must be even
Dheeraj Sharmaf892b562011-01-31 18:05:50 -0800766 M4OSA_UInt32 yv12PlaneWidth = ((outputBufferWidth +1)>>1)<<1;
767 M4OSA_UInt32 yv12PlaneHeight = ((outputBufferHeight+1)>>1)<<1;
Dheeraj Sharma9ec356a2011-01-24 15:02:18 -0800768
769 prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight,
770 (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer);
771
772 /* Fill the surface with black frame */
773 M4OSA_memset((M4OSA_MemAddr8)planeOut[0].pac_data,planeOut[0].u_width *
774 planeOut[0].u_height * 1.5,0x00);
775 M4OSA_memset((M4OSA_MemAddr8)planeOut[1].pac_data,planeOut[1].u_width *
776 planeOut[1].u_height,128);
777 M4OSA_memset((M4OSA_MemAddr8)planeOut[2].pac_data,planeOut[2].u_width *
778 planeOut[2].u_height,128);
779
780 mTarget->renderYV12();
781 return err;
782}
783
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800784M4OSA_ERR VideoEditorPreviewController::renderPreviewFrame(
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800785 const sp<Surface> &surface,
786 VideoEditor_renderPreviewFrameStr* pFrameInfo,
787 VideoEditorCurretEditInfo *pCurrEditInfo) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800788
789 M4OSA_ERR err = M4NO_ERROR;
790 M4OSA_UInt32 i = 0, iIncrementedDuration = 0, tnTimeMs=0, framesize =0;
791 VideoEditor_renderPreviewFrameStr* pFrameStr = pFrameInfo;
792 M4VIFI_UInt8 *pixelArray = NULL;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800793 Mutex::Autolock autoLock(mLock);
794
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800795 if (pCurrEditInfo != NULL) {
796 pCurrEditInfo->overlaySettingsIndex = -1;
797 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800798 // Delete previous renderer instance
799 if(mTarget != NULL) {
800 delete mTarget;
801 mTarget = NULL;
802 }
803
804 if(mOutputVideoWidth == 0) {
805 mOutputVideoWidth = pFrameStr->uiFrameWidth;
806 }
Dharmaray Kundargid01ef562011-01-26 21:11:00 -0800807
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800808 if(mOutputVideoHeight == 0) {
809 mOutputVideoHeight = pFrameStr->uiFrameHeight;
810 }
811
812 // Initialize the renderer
813 if(mTarget == NULL) {
Santosh Madhavabfece172011-02-03 16:59:47 -0800814 /*mTarget = new PreviewRenderer(
815 OMX_COLOR_FormatYUV420Planar, surface, mOutputVideoWidth, mOutputVideoHeight,
816 mOutputVideoWidth, mOutputVideoHeight, 0);*/
817
818 mTarget = PreviewRenderer::CreatePreviewRenderer(
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800819 OMX_COLOR_FormatYUV420Planar, surface, mOutputVideoWidth, mOutputVideoHeight,
820 mOutputVideoWidth, mOutputVideoHeight, 0);
Santosh Madhavabfece172011-02-03 16:59:47 -0800821
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800822 if(mTarget == NULL) {
823 LOGE("renderPreviewFrame: cannot create PreviewRenderer");
824 return M4ERR_ALLOC;
825 }
826 }
827
828 pixelArray = NULL;
829
830 // Postprocessing (apply video effect)
831 if(pFrameStr->bApplyEffect == M4OSA_TRUE) {
832
833 for(i=0;i<mNumberEffects;i++) {
834 // First check if effect starttime matches the clip being previewed
835 if((mEffectsSettings[i].uiStartTime < pFrameStr->clipBeginCutTime)
836 ||(mEffectsSettings[i].uiStartTime >= pFrameStr->clipEndCutTime)) {
837 // This effect doesn't belong to this clip, check next one
838 continue;
839 }
840 if((mEffectsSettings[i].uiStartTime <= pFrameStr->timeMs) &&
841 ((mEffectsSettings[i].uiStartTime+mEffectsSettings[i].uiDuration) >=
842 pFrameStr->timeMs) && (mEffectsSettings[i].uiDuration != 0)) {
843 setVideoEffectType(mEffectsSettings[i].VideoEffectType, TRUE);
844 }
845 else {
846 setVideoEffectType(mEffectsSettings[i].VideoEffectType, FALSE);
847 }
848 }
849
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800850 //Provide the overlay Update indication when there is an overlay effect
Dharmaray Kundargid01ef562011-01-26 21:11:00 -0800851 if (mCurrentVideoEffect & VIDEO_EFFECT_FRAMING) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800852 M4OSA_UInt32 index;
Dharmaray Kundargid01ef562011-01-26 21:11:00 -0800853 mCurrentVideoEffect &= ~VIDEO_EFFECT_FRAMING; //never apply framing here.
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800854
855 // Find the effect in effectSettings array
856 for (index = 0; index < mNumberEffects; index++) {
857 if(mEffectsSettings[index].VideoEffectType ==
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800858 (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) {
Dharmaray Kundargie6c07502011-01-21 16:58:31 -0800859
860 if((mEffectsSettings[index].uiStartTime <= pFrameInfo->timeMs) &&
861 ((mEffectsSettings[index].uiStartTime+
862 mEffectsSettings[index].uiDuration) >= pFrameInfo->timeMs))
863 {
864 break;
865 }
866 }
867 }
868 if ((index < mNumberEffects) && (pCurrEditInfo != NULL)) {
869 pCurrEditInfo->overlaySettingsIndex = index;
870 LOGV("Framing index = %d", index);
871 } else {
872 LOGV("No framing effects found");
873 }
874 }
875
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800876 if(mCurrentVideoEffect != VIDEO_EFFECT_NONE) {
877 err = applyVideoEffect((M4OSA_Void *)pFrameStr->pBuffer,
878 OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
879 pFrameStr->uiFrameHeight, pFrameStr->timeMs,
880 (M4OSA_Void *)pixelArray);
881
882 if(err != M4NO_ERROR) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800883 LOGE("renderPreviewFrame: applyVideoEffect error 0x%x", (unsigned int)err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800884 delete mTarget;
885 mTarget = NULL;
886 M4OSA_free((M4OSA_MemAddr32)pixelArray);
887 pixelArray = NULL;
888 return err;
889 }
890 mCurrentVideoEffect = VIDEO_EFFECT_NONE;
891 }
892 else {
893 // Apply the rendering mode
894 err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer,
895 OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
896 pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray);
897
898 if(err != M4NO_ERROR) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800899 LOGE("renderPreviewFrame:doImageRenderingMode error 0x%x", (unsigned int)err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800900 delete mTarget;
901 mTarget = NULL;
902 M4OSA_free((M4OSA_MemAddr32)pixelArray);
903 pixelArray = NULL;
904 return err;
905 }
906 }
907 }
908 else {
909 // Apply the rendering mode
910 err = doImageRenderingMode((M4OSA_Void *)pFrameStr->pBuffer,
911 OMX_COLOR_FormatYUV420Planar, pFrameStr->uiFrameWidth,
912 pFrameStr->uiFrameHeight, (M4OSA_Void *)pixelArray);
913
914 if(err != M4NO_ERROR) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800915 LOGE("renderPreviewFrame: doImageRenderingMode error 0x%x", (unsigned int)err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800916 delete mTarget;
917 mTarget = NULL;
918 M4OSA_free((M4OSA_MemAddr32)pixelArray);
919 pixelArray = NULL;
920 return err;
921 }
922 }
923
924 mTarget->renderYV12();
925 return err;
926}
927
928M4OSA_Void VideoEditorPreviewController::setJniCallback(void* cookie,
929 jni_progress_callback_fct callbackFct) {
930 //LOGV("setJniCallback");
931 mJniCookie = cookie;
932 mJniCallback = callbackFct;
933}
934
935M4OSA_ERR VideoEditorPreviewController::preparePlayer(
936 void* param, int playerInstance, int index) {
937
938 M4OSA_ERR err = M4NO_ERROR;
939 VideoEditorPreviewController *pController =
940 (VideoEditorPreviewController *)param;
941
942 LOGV("preparePlayer: instance %d file %d", playerInstance, index);
943
944 pController->mVePlayer[playerInstance]->setDataSource(
945 (const char *)pController->mClipList[index]->pFile, NULL);
946 LOGV("preparePlayer: setDataSource instance %s",
947 (const char *)pController->mClipList[index]->pFile);
948
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800949 pController->mVePlayer[playerInstance]->setVideoSurface(
950 pController->mSurface);
951 LOGV("preparePlayer: setVideoSurface");
952
953 pController->mVePlayer[playerInstance]->setMediaRenderingMode(
954 pController->mClipList[index]->xVSS.MediaRendering,
955 pController->mOutputVideoSize);
956 LOGV("preparePlayer: setMediaRenderingMode");
957
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -0800958 if((M4OSA_UInt32)index == pController->mStartingClipIndex) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800959 pController->mVePlayer[playerInstance]->setPlaybackBeginTime(
960 pController->mFirstPreviewClipBeginTime);
961 }
962 else {
963 pController->mVePlayer[playerInstance]->setPlaybackBeginTime(
964 pController->mClipList[index]->uiBeginCutTime);
965 }
966 LOGV("preparePlayer: setPlaybackBeginTime(%d)",
967 pController->mClipList[index]->uiBeginCutTime);
968
969 pController->mVePlayer[playerInstance]->setPlaybackEndTime(
970 pController->mClipList[index]->uiEndCutTime);
971 LOGV("preparePlayer: setPlaybackEndTime(%d)",
972 pController->mClipList[index]->uiEndCutTime);
973
974 if(pController->mClipList[index]->FileType == M4VIDEOEDITING_kFileType_ARGB8888) {
975 pController->mVePlayer[playerInstance]->setImageClipProperties(
976 pController->mClipList[index]->ClipProperties.uiVideoWidth,
977 pController->mClipList[index]->ClipProperties.uiVideoHeight);
978 LOGV("preparePlayer: setImageClipProperties");
979 }
980
981 pController->mVePlayer[playerInstance]->prepare();
982 LOGV("preparePlayer: prepared");
983
984 if(pController->mClipList[index]->uiBeginCutTime > 0) {
985 pController->mVePlayer[playerInstance]->seekTo(
986 pController->mClipList[index]->uiBeginCutTime);
987
988 LOGV("preparePlayer: seekTo(%d)",
989 pController->mClipList[index]->uiBeginCutTime);
990 }
Rajneesh Chowdury1c97d9a2011-02-21 15:43:33 -0800991 pController->mVePlayer[pController->mCurrentPlayer]->setAudioPlayer(pController->mVEAudioPlayer);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -0800992
993 pController->mVePlayer[playerInstance]->readFirstVideoFrame();
994 LOGV("preparePlayer: readFirstVideoFrame of clip");
995
996 return err;
997}
998
999M4OSA_ERR VideoEditorPreviewController::threadProc(M4OSA_Void* param) {
1000 M4OSA_ERR err = M4NO_ERROR;
1001 M4OSA_Int32 index = 0;
1002 VideoEditorPreviewController *pController =
1003 (VideoEditorPreviewController *)param;
1004
1005 LOGV("inside threadProc");
1006 if(pController->mPlayerState == VePlayerIdle) {
1007 (pController->mCurrentClipNumber)++;
1008
1009 LOGV("threadProc: playing file index %d total clips %d",
1010 pController->mCurrentClipNumber, pController->mNumberClipsToPreview);
1011
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001012 if((M4OSA_UInt32)pController->mCurrentClipNumber >=
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001013 pController->mNumberClipsToPreview) {
1014
1015 LOGV("All clips previewed");
1016
1017 pController->mCurrentPlayedDuration = 0;
1018 pController->mCurrentClipDuration = 0;
1019 pController->mCurrentPlayer = 0;
1020
1021 if(pController->mPreviewLooping == M4OSA_TRUE) {
1022 pController->mCurrentClipNumber =
1023 pController->mStartingClipIndex;
1024
1025 LOGV("Preview looping TRUE, restarting from clip index %d",
1026 pController->mCurrentClipNumber);
1027
1028 // Reset the story board timestamp inside the player
1029 for (int playerInst=0; playerInst<NBPLAYER_INSTANCES;
1030 playerInst++) {
1031 pController->mVePlayer[playerInst]->resetJniCallbackTimeStamp();
1032 }
1033 }
1034 else {
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001035 M4OSA_UInt32 endArgs = 0;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001036 if(pController->mJniCallback != NULL) {
1037 pController->mJniCallback(
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001038 pController->mJniCookie, MSG_TYPE_PREVIEW_END, &endArgs);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001039 }
1040 pController->mPlayerState = VePlayerAutoStop;
1041
1042 // Reset original begin cuttime of first previewed clip
1043 pController->mClipList[pController->mStartingClipIndex]->uiBeginCutTime =
1044 pController->mFirstPreviewClipBeginTime;
1045 // Reset original end cuttime of last previewed clip
1046 pController->mClipList[pController->mNumberClipsToPreview-1]->uiEndCutTime =
1047 pController->mLastPreviewClipEndTime;
1048
1049 // Return a warning to M4OSA thread handler
1050 // so that thread is moved from executing state to open state
1051 return M4WAR_NO_MORE_STREAM;
1052 }
1053 }
1054
1055 index=pController->mCurrentClipNumber;
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001056 if((M4OSA_UInt32)pController->mCurrentClipNumber == pController->mStartingClipIndex) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001057 pController->mCurrentPlayedDuration +=
1058 pController->mVideoStoryBoardTimeMsUptoFirstPreviewClip;
1059
1060 pController->mCurrentClipDuration =
1061 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
1062 - pController->mFirstPreviewClipBeginTime;
1063
1064 preparePlayer((void*)pController, pController->mCurrentPlayer, index);
1065 }
1066 else {
1067 pController->mCurrentPlayedDuration +=
1068 pController->mCurrentClipDuration;
1069
1070 pController->mCurrentClipDuration =
1071 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime -
1072 pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;
1073 }
1074
1075 pController->mVePlayer[pController->mCurrentPlayer]->setStoryboardStartTime(
1076 pController->mCurrentPlayedDuration);
1077 LOGV("threadProc: setStoryboardStartTime");
1078
1079 // Set the next clip duration for Audio mix here
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001080 if((M4OSA_UInt32)pController->mCurrentClipNumber != pController->mStartingClipIndex) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001081
1082 pController->mVePlayer[pController->mCurrentPlayer]->setAudioMixStoryBoardParam(
1083 pController->mCurrentPlayedDuration,
1084 pController->mClipList[index]->uiBeginCutTime,
1085 pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage);
1086
1087 LOGV("threadProc: setAudioMixStoryBoardParam fromMS %d \
1088 ClipBeginTime %d", pController->mCurrentPlayedDuration +
1089 pController->mClipList[index]->uiBeginCutTime,
1090 pController->mClipList[index]->uiBeginCutTime,
1091 pController->mClipList[index]->ClipProperties.uiClipAudioVolumePercentage);
1092 }
Santosh Madhavab2d6e0f2011-02-16 22:24:42 -08001093 // Capture the active player being used
1094 pController->mActivePlayerIndex = pController->mCurrentPlayer;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001095
1096 pController->mVePlayer[pController->mCurrentPlayer]->start();
1097 LOGV("threadProc: started");
1098
1099 pController->mPlayerState = VePlayerBusy;
1100
Dharmaray Kundargi3c48e412011-01-27 18:22:56 -08001101 } else if(pController->mPlayerState == VePlayerAutoStop) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001102 LOGV("Preview completed..auto stop the player");
Dharmaray Kundargi3c48e412011-01-27 18:22:56 -08001103 } else if ((pController->mPlayerState == VePlayerBusy) && (pController->mPrepareReqest)) {
1104 // Prepare the player here
1105 pController->mPrepareReqest = M4OSA_FALSE;
1106 preparePlayer((void*)pController, pController->mCurrentPlayer,
1107 pController->mCurrentClipNumber+1);
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -08001108 if (pController->mSemThreadWait != NULL) {
1109 err = M4OSA_semaphoreWait(pController->mSemThreadWait,
1110 M4OSA_WAIT_FOREVER);
1111 }
Dharmaray Kundargi3c48e412011-01-27 18:22:56 -08001112 } else {
1113 if (!pController->bStopThreadInProgress) {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001114 LOGV("threadProc: state busy...wait for sem");
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -08001115 if (pController->mSemThreadWait != NULL) {
1116 err = M4OSA_semaphoreWait(pController->mSemThreadWait,
1117 M4OSA_WAIT_FOREVER);
1118 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001119 }
1120 LOGV("threadProc: sem wait returned err = 0x%x", err);
Raghavender Pallafa31daf2011-03-18 22:32:51 -07001121 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001122
1123 //Always return M4NO_ERROR to ensure the thread keeps running
1124 return M4NO_ERROR;
1125}
1126
1127void VideoEditorPreviewController::notify(
1128 void* cookie, int msg, int ext1, int ext2)
1129{
1130 VideoEditorPreviewController *pController =
1131 (VideoEditorPreviewController *)cookie;
1132
1133 M4OSA_ERR err = M4NO_ERROR;
1134 uint32_t clipDuration = 0;
1135 switch (msg) {
1136 case MEDIA_NOP: // interface test message
1137 LOGV("MEDIA_NOP");
1138 break;
1139 case MEDIA_PREPARED:
1140 LOGV("MEDIA_PREPARED");
1141 break;
1142 case MEDIA_PLAYBACK_COMPLETE:
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001143 {
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001144 LOGV("notify:MEDIA_PLAYBACK_COMPLETE");
1145 pController->mPlayerState = VePlayerIdle;
1146
1147 //send progress callback with last frame timestamp
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001148 if((M4OSA_UInt32)pController->mCurrentClipNumber ==
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001149 pController->mStartingClipIndex) {
1150 clipDuration =
1151 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
1152 - pController->mFirstPreviewClipBeginTime;
1153 }
1154 else {
1155 clipDuration =
1156 pController->mClipList[pController->mCurrentClipNumber]->uiEndCutTime
1157 - pController->mClipList[pController->mCurrentClipNumber]->uiBeginCutTime;
1158 }
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001159
1160 M4OSA_UInt32 playedDuration = clipDuration+pController->mCurrentPlayedDuration;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001161 pController->mJniCallback(
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001162 pController->mJniCookie, MSG_TYPE_PROGRESS_INDICATION,
1163 &playedDuration);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001164
Dheeraj Sharma4f4efef2011-02-10 16:55:37 -08001165 if ((pController->mOverlayState == OVERLAY_UPDATE) &&
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001166 ((M4OSA_UInt32)pController->mCurrentClipNumber !=
Dheeraj Sharma4f4efef2011-02-10 16:55:37 -08001167 (pController->mNumberClipsToPreview-1))) {
1168 VideoEditorCurretEditInfo *pEditInfo =
1169 (VideoEditorCurretEditInfo*)M4OSA_malloc(sizeof(VideoEditorCurretEditInfo),
1170 M4VS, (M4OSA_Char*)"Current Edit info");
1171 pEditInfo->overlaySettingsIndex = ext2;
1172 pEditInfo->clipIndex = pController->mCurrentClipNumber;
1173 pController->mOverlayState == OVERLAY_CLEAR;
1174 if (pController->mJniCallback != NULL) {
1175 pController->mJniCallback(pController->mJniCookie,
1176 MSG_TYPE_OVERLAY_CLEAR, pEditInfo);
1177 }
1178 M4OSA_free((M4OSA_MemAddr32)pEditInfo);
1179 }
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -08001180 {
1181 Mutex::Autolock autoLock(pController->mLockSem);
1182 if (pController->mSemThreadWait != NULL) {
Raghavender Pallafa31daf2011-03-18 22:32:51 -07001183 M4OSA_semaphorePost(pController->mSemThreadWait);
1184 return;
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -08001185 }
1186 }
1187
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001188 break;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001189 }
1190 case MEDIA_ERROR:
1191 {
1192 int err_val = ext1;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001193 // Always log errors.
1194 // ext1: Media framework error code.
1195 // ext2: Implementation dependant error code.
1196 LOGE("MEDIA_ERROR; error (%d, %d)", ext1, ext2);
1197 if(pController->mJniCallback != NULL) {
1198 pController->mJniCallback(pController->mJniCookie,
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001199 MSG_TYPE_PLAYER_ERROR, &err_val);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001200 }
1201 break;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001202 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001203 case MEDIA_INFO:
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001204 {
1205 int info_val = ext2;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001206 // ext1: Media framework error code.
1207 // ext2: Implementation dependant error code.
1208 //LOGW("MEDIA_INFO; info/warning (%d, %d)", ext1, ext2);
1209 if(pController->mJniCallback != NULL) {
1210 pController->mJniCallback(pController->mJniCookie,
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001211 MSG_TYPE_PROGRESS_INDICATION, &info_val);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001212 }
1213 break;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001214 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001215 case MEDIA_SEEK_COMPLETE:
1216 LOGV("MEDIA_SEEK_COMPLETE; Received seek complete");
1217 break;
1218 case MEDIA_BUFFERING_UPDATE:
1219 LOGV("MEDIA_BUFFERING_UPDATE; buffering %d", ext1);
1220 break;
1221 case MEDIA_SET_VIDEO_SIZE:
1222 LOGV("MEDIA_SET_VIDEO_SIZE; New video size %d x %d", ext1, ext2);
1223 break;
1224 case 0xAAAAAAAA:
1225 LOGV("VIDEO PLAYBACK ALMOST over, prepare next player");
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001226 // Select next player and prepare it
1227 // If there is a clip after this one
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001228 if ((M4OSA_UInt32)(pController->mCurrentClipNumber+1) <
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001229 pController->mNumberClipsToPreview) {
Dharmaray Kundargi53c567c2011-01-29 18:52:50 -08001230 pController->mPrepareReqest = M4OSA_TRUE;
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001231 pController->mCurrentPlayer++;
1232 if (pController->mCurrentPlayer >= NBPLAYER_INSTANCES) {
1233 pController->mCurrentPlayer = 0;
1234 }
1235 // Prepare the first clip to be played
Rajneesh Chowdury1e2469c2011-03-01 21:15:25 -08001236 {
1237 Mutex::Autolock autoLock(pController->mLockSem);
1238 if (pController->mSemThreadWait != NULL) {
1239 M4OSA_semaphorePost(pController->mSemThreadWait);
1240 }
1241 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001242 }
1243 break;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001244 case 0xBBBBBBBB:
1245 {
1246 LOGV("VIDEO PLAYBACK, Update Overlay");
1247 int overlayIndex = ext2;
1248 VideoEditorCurretEditInfo *pEditInfo =
1249 (VideoEditorCurretEditInfo*)M4OSA_malloc(sizeof(VideoEditorCurretEditInfo),
1250 M4VS, (M4OSA_Char*)"Current Edit info");
1251 //ext1 = 1; start the overlay display
1252 // = 2; Clear the overlay.
1253 pEditInfo->overlaySettingsIndex = ext2;
1254 pEditInfo->clipIndex = pController->mCurrentClipNumber;
1255 LOGV("pController->mCurrentClipNumber = %d",pController->mCurrentClipNumber);
1256 if (pController->mJniCallback != NULL) {
1257 if (ext1 == 1) {
Dheeraj Sharma4f4efef2011-02-10 16:55:37 -08001258 pController->mOverlayState = OVERLAY_UPDATE;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001259 pController->mJniCallback(pController->mJniCookie,
1260 MSG_TYPE_OVERLAY_UPDATE, pEditInfo);
1261 } else {
Dheeraj Sharma4f4efef2011-02-10 16:55:37 -08001262 pController->mOverlayState = OVERLAY_CLEAR;
Dharmaray Kundargie6c07502011-01-21 16:58:31 -08001263 pController->mJniCallback(pController->mJniCookie,
1264 MSG_TYPE_OVERLAY_CLEAR, pEditInfo);
1265 }
1266 }
1267 M4OSA_free((M4OSA_MemAddr32)pEditInfo);
1268 break;
1269 }
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001270 default:
1271 LOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2);
1272 break;
1273 }
1274}
1275
1276void VideoEditorPreviewController::setVideoEffectType(
1277 M4VSS3GPP_VideoEffectType type, M4OSA_Bool enable) {
1278
1279 M4OSA_UInt32 effect = VIDEO_EFFECT_NONE;
1280
1281 // map M4VSS3GPP_VideoEffectType to local enum
1282 switch(type) {
1283 case M4VSS3GPP_kVideoEffectType_FadeFromBlack:
1284 effect = VIDEO_EFFECT_FADEFROMBLACK;
1285 break;
1286
1287 case M4VSS3GPP_kVideoEffectType_FadeToBlack:
1288 effect = VIDEO_EFFECT_FADETOBLACK;
1289 break;
1290
1291 case M4VSS3GPP_kVideoEffectType_CurtainOpening:
1292 effect = VIDEO_EFFECT_CURTAINOPEN;
1293 break;
1294
1295 case M4VSS3GPP_kVideoEffectType_CurtainClosing:
1296 effect = VIDEO_EFFECT_CURTAINCLOSE;
1297 break;
1298
1299 case M4xVSS_kVideoEffectType_BlackAndWhite:
1300 effect = VIDEO_EFFECT_BLACKANDWHITE;
1301 break;
1302
1303 case M4xVSS_kVideoEffectType_Pink:
1304 effect = VIDEO_EFFECT_PINK;
1305 break;
1306
1307 case M4xVSS_kVideoEffectType_Green:
1308 effect = VIDEO_EFFECT_GREEN;
1309 break;
1310
1311 case M4xVSS_kVideoEffectType_Sepia:
1312 effect = VIDEO_EFFECT_SEPIA;
1313 break;
1314
1315 case M4xVSS_kVideoEffectType_Negative:
1316 effect = VIDEO_EFFECT_NEGATIVE;
1317 break;
1318
1319 case M4xVSS_kVideoEffectType_Framing:
1320 effect = VIDEO_EFFECT_FRAMING;
1321 break;
1322
1323 case M4xVSS_kVideoEffectType_Fifties:
1324 effect = VIDEO_EFFECT_FIFTIES;
1325 break;
1326
1327 case M4xVSS_kVideoEffectType_ColorRGB16:
1328 effect = VIDEO_EFFECT_COLOR_RGB16;
1329 break;
1330
1331 case M4xVSS_kVideoEffectType_Gradient:
1332 effect = VIDEO_EFFECT_GRADIENT;
1333 break;
1334
1335 default:
1336 effect = VIDEO_EFFECT_NONE;
1337 break;
1338 }
1339
1340 if(enable == M4OSA_TRUE) {
1341 // If already set, then no need to set again
1342 if(!(mCurrentVideoEffect & effect))
1343 mCurrentVideoEffect |= effect;
1344 if(effect == VIDEO_EFFECT_FIFTIES) {
1345 mIsFiftiesEffectStarted = true;
1346 }
1347 }
1348 else {
1349 // Reset only if already set
1350 if(mCurrentVideoEffect & effect)
1351 mCurrentVideoEffect &= ~effect;
1352 }
1353
1354 return;
1355}
1356
1357
1358M4OSA_ERR VideoEditorPreviewController::applyVideoEffect(
1359 M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,
1360 M4OSA_UInt32 videoHeight, M4OSA_UInt32 timeMs, M4OSA_Void* outPtr) {
1361
1362 M4OSA_ERR err = M4NO_ERROR;
1363 vePostProcessParams postProcessParams;
1364
1365 postProcessParams.vidBuffer = (M4VIFI_UInt8*)dataPtr;
1366 postProcessParams.videoWidth = videoWidth;
1367 postProcessParams.videoHeight = videoHeight;
1368 postProcessParams.timeMs = timeMs;
1369 postProcessParams.timeOffset = 0; //Since timeMS already takes care of offset in this case
1370 postProcessParams.effectsSettings = mEffectsSettings;
1371 postProcessParams.numberEffects = mNumberEffects;
1372 postProcessParams.outVideoWidth = mOutputVideoWidth;
1373 postProcessParams.outVideoHeight = mOutputVideoHeight;
1374 postProcessParams.currentVideoEffect = mCurrentVideoEffect;
1375 postProcessParams.renderingMode = mRenderingMode;
1376 if(mIsFiftiesEffectStarted == M4OSA_TRUE) {
1377 postProcessParams.isFiftiesEffectStarted = M4OSA_TRUE;
1378 mIsFiftiesEffectStarted = M4OSA_FALSE;
1379 }
1380 else {
1381 postProcessParams.isFiftiesEffectStarted = M4OSA_FALSE;
1382 }
1383 //postProcessParams.renderer = mTarget;
1384 postProcessParams.overlayFrameRGBBuffer = NULL;
1385 postProcessParams.overlayFrameYUVBuffer = NULL;
1386
1387 mTarget->getBufferYV12(&(postProcessParams.pOutBuffer), &(postProcessParams.outBufferStride));
1388
Dharmaray Kundargid01ef562011-01-26 21:11:00 -08001389 err = applyEffectsAndRenderingMode(&postProcessParams, videoWidth, videoHeight);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001390 return err;
1391}
1392
1393M4OSA_ERR VideoEditorPreviewController::setPreviewFrameRenderingMode(
1394 M4xVSS_MediaRendering mode, M4VIDEOEDITING_VideoFrameSize outputVideoSize) {
1395
Dharmaray Kundargid01ef562011-01-26 21:11:00 -08001396 LOGV("setMediaRenderingMode: outputVideoSize = %d", outputVideoSize);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001397 mRenderingMode = mode;
1398
1399 switch(outputVideoSize) {
1400 case M4VIDEOEDITING_kSQCIF:
1401 mOutputVideoWidth = 128;
1402 mOutputVideoHeight = 96;
1403 break;
1404
1405 case M4VIDEOEDITING_kQQVGA:
1406 mOutputVideoWidth = 160;
1407 mOutputVideoHeight = 120;
1408 break;
1409
1410 case M4VIDEOEDITING_kQCIF:
1411 mOutputVideoWidth = 176;
1412 mOutputVideoHeight = 144;
1413 break;
1414
1415 case M4VIDEOEDITING_kQVGA:
1416 mOutputVideoWidth = 320;
1417 mOutputVideoHeight = 240;
1418 break;
1419
1420 case M4VIDEOEDITING_kCIF:
1421 mOutputVideoWidth = 352;
1422 mOutputVideoHeight = 288;
1423 break;
1424
1425 case M4VIDEOEDITING_kVGA:
1426 mOutputVideoWidth = 640;
1427 mOutputVideoHeight = 480;
1428 break;
1429
1430 case M4VIDEOEDITING_kWVGA:
1431 mOutputVideoWidth = 800;
1432 mOutputVideoHeight = 480;
1433 break;
1434
1435 case M4VIDEOEDITING_kNTSC:
1436 mOutputVideoWidth = 720;
1437 mOutputVideoHeight = 480;
1438 break;
1439
1440 case M4VIDEOEDITING_k640_360:
1441 mOutputVideoWidth = 640;
1442 mOutputVideoHeight = 360;
1443 break;
1444
1445 case M4VIDEOEDITING_k854_480:
1446 mOutputVideoWidth = 854;
1447 mOutputVideoHeight = 480;
1448 break;
1449
1450 case M4VIDEOEDITING_kHD1280:
1451 mOutputVideoWidth = 1280;
1452 mOutputVideoHeight = 720;
1453 break;
1454
1455 case M4VIDEOEDITING_kHD1080:
1456 mOutputVideoWidth = 1080;
1457 mOutputVideoHeight = 720;
1458 break;
1459
1460 case M4VIDEOEDITING_kHD960:
1461 mOutputVideoWidth = 960;
1462 mOutputVideoHeight = 720;
1463 break;
1464
1465 default:
1466 mOutputVideoWidth = 0;
1467 mOutputVideoHeight = 0;
1468 break;
1469 }
1470
1471 return OK;
1472}
1473
1474M4OSA_ERR VideoEditorPreviewController::doImageRenderingMode(
1475 M4OSA_Void * dataPtr, M4OSA_UInt32 colorFormat, M4OSA_UInt32 videoWidth,
1476 M4OSA_UInt32 videoHeight, M4OSA_Void* outPtr) {
1477
1478 M4OSA_ERR err = M4NO_ERROR;
1479 M4VIFI_ImagePlane planeIn[3], planeOut[3];
1480 M4VIFI_UInt8 *inBuffer = M4OSA_NULL;
1481 M4OSA_UInt32 outputBufferWidth =0, outputBufferHeight=0;
1482
1483 //frameSize = (videoWidth*videoHeight*3) >> 1;
1484 inBuffer = (M4OSA_UInt8 *)dataPtr;
1485
1486 // In plane
1487 prepareYUV420ImagePlane(planeIn, videoWidth,
Dharmaray Kundargi35cb2de2011-01-19 19:09:27 -08001488 videoHeight, (M4VIFI_UInt8 *)inBuffer, videoWidth, videoHeight);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001489
1490 outputBufferWidth = mOutputVideoWidth;
1491 outputBufferHeight = mOutputVideoHeight;
1492
1493 // Out plane
1494 uint8_t* outBuffer;
1495 size_t outBufferStride = 0;
1496
1497 LOGV("doMediaRendering CALL getBuffer()");
1498 mTarget->getBufferYV12(&outBuffer, &outBufferStride);
1499
1500 // Set the output YUV420 plane to be compatible with YV12 format
1501 //In YV12 format, sizes must be even
1502 M4OSA_UInt32 yv12PlaneWidth = ((mOutputVideoWidth +1)>>1)<<1;
1503 M4OSA_UInt32 yv12PlaneHeight = ((mOutputVideoHeight+1)>>1)<<1;
1504
1505 prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight,
1506 (M4OSA_UInt32)outBufferStride, (M4VIFI_UInt8 *)outBuffer);
1507
1508 err = applyRenderingMode(planeIn, planeOut, mRenderingMode);
1509 if(err != M4NO_ERROR) {
Basavapatna Dattaguru100d0182011-03-04 09:48:24 -08001510 LOGE("doImageRenderingMode: applyRenderingMode returned err=0x%x", (unsigned int)err);
Dharmaray Kundargi643290d2011-01-16 16:02:42 -08001511 }
1512 return err;
1513}
1514
1515} //namespace android