VideoEditorMain.cpp revision cd196d3727db641e581d4223815367a5ca5d5637
1cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi/*
2cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
3cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi *
4cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
5cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi * you may not use this file except in compliance with the License.
6cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi * You may obtain a copy of the License at
7cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi *
8cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
9cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi *
10cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
11cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
12cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi * See the License for the specific language governing permissions and
14cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi * limitations under the License.
15cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi */
16cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
17cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <dlfcn.h>
18cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <stdio.h>
19cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <unistd.h>
20cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <utils/Log.h>
21cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <utils/threads.h>
22cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <VideoEditorClasses.h>
23cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <VideoEditorJava.h>
24cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <VideoEditorOsal.h>
25cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <VideoEditorLogging.h>
26cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <marker.h>
27cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <VideoEditorClasses.h>
28cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <VideoEditorThumbnailMain.h>
29cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4OSA_Debug.h>
30cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4xVSS_Internal.h>
31cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <surfaceflinger/Surface.h>
32cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <surfaceflinger/ISurface.h>
33cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include "VideoEditorPreviewController.h"
34cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
35cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include "VideoEditorMain.h"
36cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
37cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargiextern "C" {
38cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4OSA_Clock.h>
39cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4OSA_CharStar.h>
40cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4OSA_Error.h>
41cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4OSA_FileCommon.h>
42cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4OSA_FileReader.h>
43cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4OSA_FileWriter.h>
44cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4OSA_FileExtra.h>
45cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4OSA_Memory.h>
46cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4OSA_String.h>
47cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4OSA_Thread.h>
48cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4xVSS_API.h>
49cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4VSS3GPP_ErrorCodes.h>
50cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4MCS_API.h>
51cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4MCS_ErrorCodes.h>
52cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4MDP_API.h>
53cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4READER_Common.h>
54cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#include <M4WRITER_common.h>
55cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi};
56cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
57cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
58cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargiusing namespace android;
59cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
60cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#define THREAD_STACK_SIZE       (65536)
61cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
62cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#define VIDEOEDITOR_VERSION_MAJOR     0
63cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#define VIDEOEDITOR_VERSION_MINOR     0
64cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#define VIDEOEDITOR_VERSION_REVISION  1
65cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
66cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
67cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargitypedef enum
68cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
69cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditState_NOT_INITIALIZED,
70cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditState_INITIALIZED,
71cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditState_ANALYZING,
72cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditState_ANALYZING_ERROR,
73cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditState_OPENED,
74cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditState_SAVING,
75cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditState_SAVING_ERROR,
76cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditState_SAVED,
77cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditState_STOPPING
78cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi} ManualEditState;
79cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
80cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargitypedef struct
81cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
82cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    JavaVM*                        pVM;
83cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jobject                        engine;
84cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jmethodID                      onCompletionMethodId;
85cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jmethodID                      onErrorMethodId;
86cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jmethodID                      onWarningMethodId;
87cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jmethodID                      onProgressUpdateMethodId;
88cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jmethodID                      onPreviewProgressUpdateMethodId;
89cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4xVSS_InitParams              initParams;
90cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    void*                          pTextRendererHandle;
91cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4xVSS_getTextRgbBufferFct     pTextRendererFunction;
92cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Context                  engineContext;
93cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditState                state;
94cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4VSS3GPP_EditSettings*        pEditSettings;
95cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Context                  threadContext;
96cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR                      threadResult;
97cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt8                    threadProgress;
98cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VideoEditorPreviewController   *mPreviewController;
99cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4xVSS_AudioMixingSettings     *mAudioSettings;
100cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* Audio Graph changes */
101cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Context                   pAudioGraphMCSCtx;
102cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Bool                      bSkipState;
103cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jmethodID                       onAudioGraphProgressUpdateMethodId;
104cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    Mutex                           mLock;
105cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi} ManualEditContext;
106cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
107cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargiextern "C" M4OSA_ERR M4MCS_open_normalMode(
108cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4MCS_Context                       pContext,
109cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_Void*                         pFileIn,
110cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4VIDEOEDITING_FileType             InputFileType,
111cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_Void*                         pFileOut,
112cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_Void*                         pTempFile);
113cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
114cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic M4OSA_ERR videoEditor_toUTF8Fct(
115cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_Void*                         pBufferIn,
116cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt8*                        pBufferOut,
117cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt32*                       bufferOutSize);
118cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
119cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic M4OSA_ERR videoEditor_fromUTF8Fct(
120cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt8*                        pBufferIn,
121cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_Void*                         pBufferOut,
122cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt32*                       bufferOutSize);
123cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
124cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic M4OSA_ERR videoEditor_getTextRgbBufferFct(
125cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_Void*                         pRenderingData,
126cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_Void*                         pTextBuffer,
127cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt32                        textBufferSize,
128cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4VIFI_ImagePlane**                 pOutputPlane);
129cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
130cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void videoEditor_callOnProgressUpdate(
131cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                ManualEditContext*                  pContext,
132cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                int                                 task,
133cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                int                                 progress);
134cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
135cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void videoEditor_freeContext(
136cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
137cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                ManualEditContext**                 ppContext);
138cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
139cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic M4OSA_ERR videoEditor_threadProc(
140cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_Void*                         param);
141cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
142cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic jobject videoEditor_getVersion(
143cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
144cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz);
145cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
146cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void videoEditor_init(
147cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
148cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz,
149cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jstring                             tempPath,
150cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jstring                             textRendererPath);
151cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
152cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void videoEditor_loadSettings(
153cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
154cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz,
155cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             settings);
156cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
157cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void videoEditor_unloadSettings(
158cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
159cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz);
160cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
161cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
162cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void videoEditor_stopEncoding(
163cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
164cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz);
165cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
166cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void videoEditor_release(
167cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
168cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz);
169cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int videoEditor_getPixels(
170cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 JNIEnv*                  env,
171cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 jobject                  thiz,
172cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 jstring                  path,
173cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 jintArray                pixelArray,
174cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 M4OSA_UInt32             width,
175cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 M4OSA_UInt32             height,
176cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 M4OSA_UInt32             timeMS);
177cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int videoEditor_getPixelsList(
178cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     JNIEnv*                  env,
179cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     jobject                  thiz,
180cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     jstring                  path,
181cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     jintArray                pixelArray,
182cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     M4OSA_UInt32             width,
183cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     M4OSA_UInt32             height,
184cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     M4OSA_UInt32             deltatimeMS,
185cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     M4OSA_UInt32             noOfThumbnails,
186cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     M4OSA_UInt32             startTime,
187cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     M4OSA_UInt32             endTime);
188cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
189cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void
190cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_startPreview(
191cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                 pEnv,
192cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                 thiz,
193cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                 mSurface,
194cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jlong                   fromMs,
195cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jlong                   toMs,
196cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jint                    callbackInterval,
197cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jboolean                loop);
198cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
199cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void
200cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_populateSettings(
201cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                 pEnv,
202cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                 thiz,
203cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                 settings,
204cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                 object,
205cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                 audioSettingObject);
206cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
207cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void videoEditor_stopPreview(JNIEnv*  pEnv,
208cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                              jobject  thiz);
209cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
210cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic jobject
211cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_getProperties(
212cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
213cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz,
214cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jstring                             file);
215cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
216cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int videoEditor_renderPreviewFrame(JNIEnv* pEnv,
217cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jobject thiz,
218cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jobject    mSurface,
219cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jlong fromMs,
220cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jint  surfaceWidth,
221cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jint  surfaceHeight);
222cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
223cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int videoEditor_registerManualEditMethods(
224cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv);
225cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
226cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void jniPreviewProgressCallback(void* cookie, M4OSA_UInt32 msgType,
227cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                        M4OSA_UInt32 argc);
228cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
229cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int videoEditor_renderMediaItemPreviewFrame(JNIEnv* pEnv,
230cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jobject thiz,
231cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jobject mSurface,
232cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jstring filePath,
233cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jint frameWidth,
234cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jint frameHeight,
235cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jint surfaceWidth,
236cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jint surfaceHeight,
237cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jlong fromMs);
238cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
239cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int videoEditor_generateAudioWaveFormSync ( JNIEnv*     pEnv,
240cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                  jobject     thiz,
241cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                  jstring     pcmfilePath,
242cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                  jstring     outGraphfilePath,
243cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                  jint        frameDuration,
244cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                  jint        channels,
245cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                  jint        samplesCount);
246cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
247cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int videoEditor_generateAudioRawFile(JNIEnv* pEnv,
248cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jobject thiz,
249cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jstring infilePath,
250cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jstring pcmfilePath );
251cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
252cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargiM4OSA_ERR videoEditor_generateAudio(JNIEnv* pEnv,ManualEditContext* pContext,
253cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    M4OSA_Char* infilePath,
254cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    M4OSA_Char* pcmfilePath );
255cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
256cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int
257cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_generateClip(
258cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
259cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz,
260cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             settings);
261cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
262cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
263cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic JNINativeMethod gManualEditMethods[] = {
264cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"getVersion",               "()L"VERSION_CLASS_NAME";",
265cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (void *)videoEditor_getVersion      },
266cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"_init",                    "(Ljava/lang/String;Ljava/lang/String;)V",
267cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (void *)videoEditor_init    },
268cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"nativeStartPreview",       "(Landroid/view/Surface;JJIZ)V",
269cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (void *)videoEditor_startPreview    },
270cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"nativePopulateSettings",
271cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "(L"EDIT_SETTINGS_CLASS_NAME";L"PREVIEW_PROPERTIES_CLASS_NAME";L"
272cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            AUDIO_SETTINGS_CLASS_NAME";)V",
273cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (void *)videoEditor_populateSettings    },
274cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"nativeRenderPreviewFrame", "(Landroid/view/Surface;JII)I",
275cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (int *)videoEditor_renderPreviewFrame     },
276cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"nativeRenderMediaItemPreviewFrame",
277cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    "(Landroid/view/Surface;Ljava/lang/String;IIIIJ)I",
278cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        (int *)videoEditor_renderMediaItemPreviewFrame     },
279cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"nativeStopPreview",       "()V",
280cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (void *)videoEditor_stopPreview            },
281cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"stopEncoding",            "()V",
282cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (void *)videoEditor_stopEncoding         },
283cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"release",                 "()V",
284cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (void *)videoEditor_release            },
285cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"nativeGetPixels",         "(Ljava/lang/String;[IIIJ)I",
286cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (void*)videoEditor_getPixels               },
287cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"nativeGetPixelsList",     "(Ljava/lang/String;[IIIIIJJ)I",
288cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (void*)videoEditor_getPixelsList           },
289cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"getMediaProperties",
290cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    "(Ljava/lang/String;)Landroid/media/videoeditor/MediaArtistNativeHelper$Properties;",
291cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (void *)videoEditor_getProperties          },
292cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"nativeGenerateAudioGraph","(Ljava/lang/String;Ljava/lang/String;III)I",
293cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (int *)videoEditor_generateAudioWaveFormSync },
294cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"nativeGenerateRawAudio",  "(Ljava/lang/String;Ljava/lang/String;)I",
295cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (int *)videoEditor_generateAudioRawFile      },
296cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {"nativeGenerateClip",      "(L"EDIT_SETTINGS_CLASS_NAME";)I",
297cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (void *)videoEditor_generateClip  },
298cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi};
299cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
300cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi// temp file name of VSS out file
301cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#define TEMP_MCS_OUT_FILE_PATH "/tmpOut.3gp"
302cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
303cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargivoid
304cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargigetClipSetting(
305cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                                       pEnv,
306cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                                       object,
307cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4VSS3GPP_ClipSettings*                       pSettings)
308cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
309cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
310cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jfieldID fid;
311cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int field = 0;
312cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool needToBeLoaded = true;
313cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jclass clazz = pEnv->FindClass(PROPERTIES_CLASS_NAME);
314cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
315cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
316cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == clazz),
317cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
318cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
319cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    fid = pEnv->GetFieldID(clazz,"duration","I");
320cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pSettings->ClipProperties.uiClipDuration = pEnv->GetIntField(object,fid);
321cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_TRACE1_1("duration = %d",pSettings->ClipProperties.uiClipDuration);
322cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
323cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    fid = pEnv->GetFieldID(clazz,"videoFormat","I");
324cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pSettings->ClipProperties.VideoStreamType =
325cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4VIDEOEDITING_VideoFormat)pEnv->GetIntField(object,fid);
326cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_TRACE1_1("videoFormat = %d",pSettings->ClipProperties.VideoStreamType);
327cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
328cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    fid = pEnv->GetFieldID(clazz,"videoDuration","I");
329cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pSettings->ClipProperties.uiClipVideoDuration = pEnv->GetIntField(object,fid);
330cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_TRACE1_1("videoDuration = %d",
331cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    pSettings->ClipProperties.uiClipVideoDuration);
332cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
333cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    fid = pEnv->GetFieldID(clazz,"width","I");
334cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pSettings->ClipProperties.uiVideoWidth = pEnv->GetIntField(object,fid);
335cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_TRACE1_1("width = %d",pSettings->ClipProperties.uiVideoWidth);
336cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
337cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    fid = pEnv->GetFieldID(clazz,"height","I");
338cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pSettings->ClipProperties.uiVideoHeight = pEnv->GetIntField(object,fid);
339cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_TRACE1_1("height = %d",pSettings->ClipProperties.uiVideoHeight);
340cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
341cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    fid = pEnv->GetFieldID(clazz,"audioFormat","I");
342cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pSettings->ClipProperties.AudioStreamType =
343cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4VIDEOEDITING_AudioFormat)pEnv->GetIntField(object,fid);
344cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_TRACE1_1("audioFormat = %d",pSettings->ClipProperties.AudioStreamType);
345cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
346cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    fid = pEnv->GetFieldID(clazz,"audioDuration","I");
347cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pSettings->ClipProperties.uiClipAudioDuration = pEnv->GetIntField(object,fid);
348cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_TRACE1_1("audioDuration = %d",
349cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    pSettings->ClipProperties.uiClipAudioDuration);
350cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
351cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    fid = pEnv->GetFieldID(clazz,"audioBitrate","I");
352cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pSettings->ClipProperties.uiAudioBitrate = pEnv->GetIntField(object,fid);
353cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_TRACE1_1("audioBitrate = %d",pSettings->ClipProperties.uiAudioBitrate);
354cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
355cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    fid = pEnv->GetFieldID(clazz,"audioChannels","I");
356cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pSettings->ClipProperties.uiNbChannels = pEnv->GetIntField(object,fid);
357cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_TRACE1_1("audioChannels = %d",pSettings->ClipProperties.uiNbChannels);
358cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
359cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    fid = pEnv->GetFieldID(clazz,"audioSamplingFrequency","I");
360cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pSettings->ClipProperties.uiSamplingFrequency = pEnv->GetIntField(object,fid);
361cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_TRACE1_1("audioSamplingFrequency = %d",
362cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    pSettings->ClipProperties.uiSamplingFrequency);
363cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
364cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi   fid = pEnv->GetFieldID(clazz,"audioVolumeValue","I");
365cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi   pSettings->ClipProperties.uiClipAudioVolumePercentage =
366cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    pEnv->GetIntField(object,fid);
367cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi   M4OSA_TRACE1_1("audioVolumeValue = %d",
368cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    pSettings->ClipProperties.uiClipAudioVolumePercentage);
369cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
370cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
371cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void jniPreviewProgressCallback (void* cookie, M4OSA_UInt32 msgType,
372cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                        M4OSA_UInt32 argc)
373cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
374cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext *pContext = (ManualEditContext *)cookie;
375cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    JNIEnv*     pEnv = NULL;
376cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool        isFinished = false;
377cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int         currentMs = 0;
378cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int         error = M4NO_ERROR;
379cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
380cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Attach the current thread.
381cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext->pVM->AttachCurrentThread(&pEnv, NULL);
382cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    switch(msgType)
383cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
384cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        case MSG_TYPE_PROGRESS_INDICATION:
385cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            currentMs = argc;
386cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            break;
387cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        case MSG_TYPE_PLAYER_ERROR:
388cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            currentMs = -1;
389cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            error = argc;
390cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            break;
391cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        case MSG_TYPE_PREVIEW_END:
392cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            isFinished = true;
393cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            break;
394cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        default:
395cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            break;
396cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
397cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
398cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEnv->CallVoidMethod(pContext->engine,
399cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        pContext->onPreviewProgressUpdateMethodId,
400cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        currentMs,isFinished);
401cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
402cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Detach the current thread.
403cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext->pVM->DetachCurrentThread();
404cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
405cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
406cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void videoEditor_stopPreview(JNIEnv*  pEnv,
407cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                              jobject  thiz)
408cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
409cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext = M4OSA_NULL;
410cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool needToBeLoaded = true;
411cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
412cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext =
413cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (ManualEditContext*)videoEditClasses_getContext(&needToBeLoaded, pEnv, thiz);
414cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
415cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
416cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
417cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == pContext),
418cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
419cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext->mPreviewController->stopPreview();
420cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
421cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
422cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int videoEditor_renderPreviewFrame(JNIEnv* pEnv,
423cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jobject thiz,
424cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jobject    mSurface,
425cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jlong fromMs,
426cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jint surfaceWidth,
427cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    jint surfaceHeight )
428cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
429cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool needToBeLoaded = true;
430cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR result = M4NO_ERROR;
431cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32 timeMs = (M4OSA_UInt32)fromMs;
432cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32 i=0,tnTimeMs = 0, framesizeYuv =0;
433cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4VIFI_UInt8 *pixelArray = M4OSA_NULL;
434cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32    iCurrentClipIndex = 0, uiNumberOfClipsInStoryBoard =0,
435cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    uiClipDuration = 0, uiTotalClipDuration = 0,
436cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    iIncrementedDuration = 0;
437cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VideoEditor_renderPreviewFrameStr frameStr;
438cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Context tnContext = M4OSA_NULL;
439cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    const char* pMessage = NULL;
440cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4VIFI_ImagePlane *yuvPlane;
441cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
442cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO,
443cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "VIDEO_EDITOR", "surfaceWidth = %d",surfaceWidth);
444cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO,
445cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "VIDEO_EDITOR", "surfaceHeight = %d",surfaceHeight);
446cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext = M4OSA_NULL;
447cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
448cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext =
449cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (ManualEditContext*)videoEditClasses_getContext(&needToBeLoaded, pEnv, thiz);
450cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO,
451cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                "VIDEO_EDITOR","pContext = 0x%x",pContext);
452cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
453cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
454cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
455cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == pContext),
456cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
457cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
458cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
459cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
460cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 (M4OSA_NULL == pContext->mPreviewController),
461cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 "not initialized");
462cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
463cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Validate the mSurface parameter.
464cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalArgumentException(&needToBeLoaded, pEnv,
465cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                (NULL == mSurface),
466cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                "mSurface is null");
467cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jclass surfaceClass = pEnv->FindClass("android/view/Surface");
468cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
469cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == surfaceClass),
470cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
471cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
472cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jfieldID surface_native =
473cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pEnv->GetFieldID(surfaceClass, ANDROID_VIEW_SURFACE_JNI_ID, "I");
474cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
475cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == surface_native),
476cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
477cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
478cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    Surface* const p = (Surface*)pEnv->GetIntField(mSurface, surface_native);
479cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    sp<Surface> previewSurface = sp<Surface>(p);
480cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
481cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* Determine the total number of clips, total duration*/
482cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    uiNumberOfClipsInStoryBoard = pContext->pEditSettings->uiClipNumber;
483cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
484cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    for (i = 0; i < uiNumberOfClipsInStoryBoard; i++) {
485cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        uiClipDuration = pContext->pEditSettings->pClipList[i]->uiEndCutTime -
486cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->pEditSettings->pClipList[i]->uiBeginCutTime;
487cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        uiTotalClipDuration += uiClipDuration;
488cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
489cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
490cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* determine the clip whose thumbnail needs to be rendered*/
491cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (timeMs == 0) {
492cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        iCurrentClipIndex = 0;
493cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        i=0;
494cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    } else {
495cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
496cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "videoEditor_renderPreviewFrame() timeMs=%d", timeMs);
497cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
498cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (timeMs > uiTotalClipDuration) {
499cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
500cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                "videoEditor_renderPreviewFrame() timeMs > uiTotalClipDuration");
501cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pMessage = videoEditJava_getErrorName(M4ERR_PARAMETER);
502cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(pEnv, "java/lang/IllegalArgumentException", pMessage);
503cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            return -1;
504cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
505cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
506cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        for (i = 0; i < uiNumberOfClipsInStoryBoard; i++) {
507cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if (timeMs < (iIncrementedDuration +
508cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                          (pContext->pEditSettings->pClipList[i]->uiEndCutTime -
509cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                           pContext->pEditSettings->pClipList[i]->uiBeginCutTime)))
510cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            {
511cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                iCurrentClipIndex = i;
512cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
513cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    "videoEditor_renderPreviewFrame() iCurrentClipIndex=%d for timeMs=%d",
514cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    iCurrentClipIndex, timeMs);
515cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                break;
516cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
517cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            else {
518cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                iIncrementedDuration = iIncrementedDuration +
519cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    (pContext->pEditSettings->pClipList[i]->uiEndCutTime -
520cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    pContext->pEditSettings->pClipList[i]->uiBeginCutTime);
521cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
522cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
523cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
524cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* If timestamp is beyond story board duration, return*/
525cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (i >= uiNumberOfClipsInStoryBoard) {
526cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (timeMs == iIncrementedDuration) {
527cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            iCurrentClipIndex = i-1;
528cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        } else {
529cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi           return -1;
530cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
531cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
532cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
533cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /*+ Handle the image files here */
534cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi      if (pContext->pEditSettings->pClipList[iCurrentClipIndex]->FileType ==
535cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi          /*M4VIDEOEDITING_kFileType_JPG*/ M4VIDEOEDITING_kFileType_ARGB8888 ) {
536cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi          VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", " iCurrentClipIndex %d ", iCurrentClipIndex);
537cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi          VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
538cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                "  Height = %d",
539cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->pEditSettings->pClipList[iCurrentClipIndex]->ClipProperties.uiVideoHeight);
540cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
541cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi          VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
542cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                "  Width = %d",
543cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->pEditSettings->pClipList[iCurrentClipIndex]->ClipProperties.uiVideoWidth);
544cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
545cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi          LvGetImageThumbNail((const char *)pContext->pEditSettings->\
546cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi          pClipList[iCurrentClipIndex]->pFile,
547cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->pEditSettings->pClipList[iCurrentClipIndex]->ClipProperties.uiVideoHeight,
548cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->pEditSettings->pClipList[iCurrentClipIndex]->ClipProperties.uiVideoWidth,
549cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (M4OSA_Void **)&frameStr.pBuffer);
550cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    } else {
551cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        /* Handle 3gp/mp4 Clips here */
552cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        /* get thumbnail*/
553cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        result = ThumbnailOpen(&tnContext,
554cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (const M4OSA_Char*)pContext->pEditSettings->\
555cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pClipList[iCurrentClipIndex]->pFile, M4OSA_TRUE);
556cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (result != M4NO_ERROR || tnContext  == M4OSA_NULL) {
557cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            return -1;
558cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
559cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
560cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        /* timeMs is relative to storyboard; in this api it shud be relative to this clip */
561cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if ((i >= uiNumberOfClipsInStoryBoard) &&
562cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (timeMs == iIncrementedDuration)) {
563cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            tnTimeMs = pContext->pEditSettings->\
564cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pClipList[iCurrentClipIndex]->uiEndCutTime;
565cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        } else {
566cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            tnTimeMs = pContext->pEditSettings->\
567cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pClipList[iCurrentClipIndex]->uiBeginCutTime
568cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            + (timeMs - iIncrementedDuration);
569cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
570cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
571cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR",
572cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "video width = %d",pContext->pEditSettings->pClipList[iCurrentClipIndex]->\
573cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            ClipProperties.uiVideoWidth);
574cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR",
575cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "video height = %d",pContext->pEditSettings->pClipList[iCurrentClipIndex]->\
576cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            ClipProperties.uiVideoHeight);
577cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR",
578cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "current clip index = %d",iCurrentClipIndex);
579cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
580cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_UInt32 width = pContext->pEditSettings->pClipList[iCurrentClipIndex]->\
581cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            ClipProperties.uiVideoWidth;
582cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_UInt32 height = pContext->pEditSettings->pClipList[iCurrentClipIndex]->\
583cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            ClipProperties.uiVideoHeight;
584cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
585cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        framesizeYuv = width * height * 1.5;
586cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
587cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pixelArray = (M4VIFI_UInt8 *)M4OSA_malloc(framesizeYuv, M4VS,
588cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (M4OSA_Char*)"videoEditor pixelArray");
589cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pixelArray == M4OSA_NULL) {
590cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
591cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                "videoEditor_renderPreviewFrame() malloc error");
592cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            ThumbnailClose(tnContext);
593cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pMessage = videoEditJava_getErrorName(M4ERR_ALLOC);
594cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(pEnv, "java/lang/RuntimeException", pMessage);
595cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            return -1;
596cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
597cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
598cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        result = ThumbnailGetPixels16(tnContext, (M4OSA_Int16 *)pixelArray,
599cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->pEditSettings->pClipList[iCurrentClipIndex]->\
600cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            ClipProperties.uiVideoWidth,
601cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->pEditSettings->pClipList[iCurrentClipIndex]->\
602cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            ClipProperties.uiVideoHeight,
603cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            &tnTimeMs);
604cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (result != M4NO_ERROR) {
605cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_free((M4OSA_MemAddr32)pixelArray);
606cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            ThumbnailClose(tnContext);
607cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            return -1;
608cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
609cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
610cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        ThumbnailClose(tnContext);
611cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        tnContext = M4OSA_NULL;
612cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
613cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#ifdef DUMPTOFILE
614cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
615cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_Context fileContext;
616cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_Char* fileName = (M4OSA_Char*)"/mnt/sdcard/FirstRGB565.raw";
617cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_fileExtraDelete((const M4OSA_Char *)fileName);
618cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_fileWriteOpen(&fileContext, (M4OSA_Void*) fileName,\
619cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_kFileWrite|M4OSA_kFileCreate);
620cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_fileWriteData(fileContext, (M4OSA_MemAddr8) pixelArray,
621cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                framesizeYuv);
622cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_fileWriteClose(fileContext);
623cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
624cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#endif
625cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
626cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        /**
627cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        * Allocate output YUV planes
628cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        */
629cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane = (M4VIFI_ImagePlane*)M4OSA_malloc(3*sizeof(M4VIFI_ImagePlane), M4VS,
630cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (M4OSA_Char*)"videoEditor_renderPreviewFrame Output plane YUV");
631cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (yuvPlane == M4OSA_NULL) {
632cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
633cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                "videoEditor_renderPreviewFrame() malloc error for yuv plane");
634cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_free((M4OSA_MemAddr32)pixelArray);
635cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pMessage = videoEditJava_getErrorName(M4ERR_ALLOC);
636cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(pEnv, "java/lang/RuntimeException", pMessage);
637cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            return -1;
638cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
639cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
640cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[0].u_width = width;
641cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[0].u_height = height;
642cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[0].u_topleft = 0;
643cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[0].u_stride = width;
644cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[0].pac_data = (M4VIFI_UInt8*)pixelArray;
645cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
646cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[1].u_width = width>>1;
647cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[1].u_height = height>>1;
648cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[1].u_topleft = 0;
649cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[1].u_stride = width>>1;
650cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[1].pac_data = yuvPlane[0].pac_data
651cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    + yuvPlane[0].u_width * yuvPlane[0].u_height;
652cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[2].u_width = (width)>>1;
653cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[2].u_height = (height)>>1;
654cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[2].u_topleft = 0;
655cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[2].u_stride = (width)>>1;
656cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        yuvPlane[2].pac_data = yuvPlane[1].pac_data
657cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    + yuvPlane[1].u_width * yuvPlane[1].u_height;
658cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
659cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#ifdef DUMPTOFILE
660cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
661cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_Context fileContext;
662cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_Char* fileName = (M4OSA_Char*)"/mnt/sdcard/ConvertedYuv.yuv";
663cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_fileExtraDelete((const M4OSA_Char *)fileName);
664cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_fileWriteOpen(&fileContext, (M4OSA_Void*) fileName,\
665cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_kFileWrite|M4OSA_kFileCreate);
666cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_fileWriteData(fileContext,
667cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                (M4OSA_MemAddr8) yuvPlane[0].pac_data, framesizeYuv);
668cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_fileWriteClose(fileContext);
669cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
670cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#endif
671cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
672cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        /* Fill up the render structure*/
673cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        frameStr.pBuffer = (M4OSA_Void*)yuvPlane[0].pac_data;
674cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
675cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
676cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.timeMs = timeMs;    /* timestamp on storyboard*/
677cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.uiSurfaceWidth =
678cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->pEditSettings->pClipList[iCurrentClipIndex]->\
679cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        ClipProperties.uiVideoWidth;
680cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.uiSurfaceHeight =
681cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->pEditSettings->pClipList[iCurrentClipIndex]->\
682cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        ClipProperties.uiVideoHeight;
683cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.uiFrameWidth =
684cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->pEditSettings->pClipList[iCurrentClipIndex]->\
685cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        ClipProperties.uiVideoWidth;
686cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.uiFrameHeight =
687cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->pEditSettings->pClipList[iCurrentClipIndex]->\
688cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        ClipProperties.uiVideoHeight;
689cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pContext->pEditSettings->nbEffects > 0) {
690cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        frameStr.bApplyEffect = M4OSA_TRUE;
691cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    } else {
692cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        frameStr.bApplyEffect = M4OSA_FALSE;
693cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
694cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.clipBeginCutTime = iIncrementedDuration;
695cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.clipEndCutTime =
696cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        iIncrementedDuration +
697cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (pContext->pEditSettings->pClipList[iCurrentClipIndex]->uiEndCutTime -\
698cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->pEditSettings->pClipList[iCurrentClipIndex]->uiBeginCutTime);
699cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
700cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext->mPreviewController->setPreviewFrameRenderingMode(
701cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->pEditSettings->\
702cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pClipList[iCurrentClipIndex]->xVSS.MediaRendering,
703cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->pEditSettings->xVSS.outputVideoSize);
704cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
705cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = pContext->mPreviewController->renderPreviewFrame(previewSurface,
706cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                              &frameStr);
707cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,
708cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (M4NO_ERROR != result), result);
709cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
710cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pContext->pEditSettings->pClipList[iCurrentClipIndex]->FileType ==\
711cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi         /*M4VIDEOEDITING_kFileType_JPG */ M4VIDEOEDITING_kFileType_ARGB8888) {
712cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_free((M4OSA_MemAddr32)frameStr.pBuffer);
713cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    } else {
714cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_free((M4OSA_MemAddr32)yuvPlane[0].pac_data);
715cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_free((M4OSA_MemAddr32)yuvPlane);
716cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
717cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return tnTimeMs;
718cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
719cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
720cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int videoEditor_renderMediaItemPreviewFrame(JNIEnv* pEnv,
721cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jobject thiz,
722cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jobject mSurface,
723cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jstring filePath,
724cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jint    frameWidth,
725cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jint    frameHeight,
726cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jint    surfaceWidth,
727cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jint    surfaceHeight,
728cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    jlong   fromMs)
729cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
730cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool needToBeLoaded = true;
731cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR result = M4NO_ERROR;
732cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32 timeMs = (M4OSA_UInt32)fromMs;
733cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32 framesizeYuv =0;
734cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4VIFI_UInt8 *pixelArray = M4OSA_NULL;
735cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VideoEditor_renderPreviewFrameStr frameStr;
736cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Context tnContext = M4OSA_NULL;
737cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    const char* pMessage = NULL;
738cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4VIFI_ImagePlane yuvPlane[3], rgbPlane;
739cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
740cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext = M4OSA_NULL;
741cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
742cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext =
743cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (ManualEditContext*)videoEditClasses_getContext(&needToBeLoaded,
744cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                      pEnv, thiz);
745cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
746cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
747cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
748cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == pContext),
749cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
750cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
751cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
752cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
753cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 (M4OSA_NULL == pContext->mPreviewController),
754cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 "not initialized");
755cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
756cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Validate the mSurface parameter.
757cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalArgumentException(&needToBeLoaded, pEnv,
758cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                (NULL == mSurface),
759cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                "mSurface is null");
760cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jclass surfaceClass = pEnv->FindClass("android/view/Surface");
761cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
762cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == surfaceClass),
763cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
764cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
765cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jfieldID surface_native =
766cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pEnv->GetFieldID(surfaceClass, ANDROID_VIEW_SURFACE_JNI_ID, "I");
767cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
768cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == surface_native),
769cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
770cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
771cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    Surface* const p = (Surface*)pEnv->GetIntField(mSurface, surface_native);
772cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    sp<Surface> previewSurface = sp<Surface>(p);
773cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
774cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
775cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    const char *pString = pEnv->GetStringUTFChars(filePath, NULL);
776cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pString == M4OSA_NULL) {
777cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pEnv != NULL) {
778cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(pEnv, "java/lang/RuntimeException", "Input string null");
779cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
780cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
781cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
782cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "videoEditor_renderMediaItemPreviewFrame() timeMs=%d", timeMs);
783cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* get thumbnail*/
784cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = ThumbnailOpen(&tnContext,(const M4OSA_Char*)pString, M4OSA_TRUE);
785cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (result != M4NO_ERROR || tnContext  == M4OSA_NULL) {
786cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return timeMs;
787cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
788cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
789cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    framesizeYuv = ((frameWidth)*(frameHeight)*1.5);
790cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
791cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pixelArray = (M4VIFI_UInt8 *)M4OSA_malloc(framesizeYuv, M4VS,\
792cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_Char*)"videoEditor pixelArray");
793cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pixelArray == M4OSA_NULL) {
794cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
795cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "videoEditor_renderPreviewFrame() malloc error");
796cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        ThumbnailClose(tnContext);
797cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pMessage = videoEditJava_getErrorName(M4ERR_ALLOC);
798cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        jniThrowException(pEnv, "java/lang/RuntimeException", pMessage);
799cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return timeMs;
800cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
801cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
802cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = ThumbnailGetPixels16(tnContext, (M4OSA_Int16 *)pixelArray,
803cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                frameWidth,
804cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                frameHeight, &timeMs);
805cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (result != M4NO_ERROR) {
806cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_free((M4OSA_MemAddr32)pixelArray);
807cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        ThumbnailClose(tnContext);
808cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return fromMs;
809cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
810cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
811cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#ifdef DUMPTOFILESYSTEM
812cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
813cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_Context fileContext;
814cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_Char* fileName = (M4OSA_Char*)"/mnt/sdcard/FirstRGB565.rgb";
815cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_fileWriteOpen(&fileContext, (M4OSA_Void*) fileName,\
816cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_kFileWrite|M4OSA_kFileCreate);
817cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_fileWriteData(fileContext, (M4OSA_MemAddr8) pixelArray,
818cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                            framesizeRgb);
819cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_fileWriteClose(fileContext);
820cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
821cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#endif
822cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
823cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[0].pac_data = (M4VIFI_UInt8*)pixelArray;
824cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[0].u_height = frameHeight;
825cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[0].u_width = frameWidth;
826cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[0].u_stride = yuvPlane[0].u_width;
827cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[0].u_topleft = 0;
828cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
829cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[1].u_height = frameHeight/2;
830cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[1].u_width = frameWidth/2;
831cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[1].u_stride = yuvPlane[1].u_width;
832cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[1].u_topleft = 0;
833cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[1].pac_data = yuvPlane[0].pac_data
834cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                + yuvPlane[0].u_width*yuvPlane[0].u_height;
835cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
836cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[2].u_height = frameHeight/2;
837cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[2].u_width = frameWidth/2;
838cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[2].u_stride = yuvPlane[2].u_width;
839cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[2].u_topleft = 0;
840cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    yuvPlane[2].pac_data = yuvPlane[0].pac_data
841cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        + yuvPlane[0].u_width*yuvPlane[0].u_height + \
842cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (yuvPlane[0].u_width/2)*(yuvPlane[0].u_height/2);
843cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#ifdef DUMPTOFILESYSTEM
844cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
845cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_Context fileContext;
846cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_Char* fileName = (M4OSA_Char*)"/mnt/sdcard/ConvertedYuv.yuv";
847cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_fileWriteOpen(&fileContext, (M4OSA_Void*) fileName,\
848cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_kFileWrite|M4OSA_kFileCreate);
849cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_fileWriteData(fileContext, (M4OSA_MemAddr8) yuvPlane[0].pac_data,
850cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                            framesizeYuv);
851cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_fileWriteClose(fileContext);
852cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
853cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi#endif
854cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
855cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* Fill up the render structure*/
856cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.pBuffer = (M4OSA_Void*)yuvPlane[0].pac_data;
857cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.timeMs = timeMs;    /* timestamp on storyboard*/
858cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.uiSurfaceWidth = frameWidth;
859cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.uiSurfaceHeight = frameHeight;
860cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.uiFrameWidth = frameWidth;
861cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.uiFrameHeight = frameHeight;
862cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.bApplyEffect = M4OSA_FALSE;
863cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // clip begin cuttime and end cuttime set to 0
864cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // as its only required when effect needs to be applied while rendering
865cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.clipBeginCutTime = 0;
866cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    frameStr.clipEndCutTime = 0;
867cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
868cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /*  pContext->mPreviewController->setPreviewFrameRenderingMode(M4xVSS_kBlackBorders,
869cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    (M4VIDEOEDITING_VideoFrameSize)(M4VIDEOEDITING_kHD960+1));*/
870cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result
871cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    = pContext->mPreviewController->renderPreviewFrame(previewSurface,&frameStr);
872cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,
873cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                (M4NO_ERROR != result), result);
874cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
875cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* free the pixelArray and yuvPlane[0].pac_data */
876cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_free((M4OSA_MemAddr32)yuvPlane[0].pac_data);
877cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
878cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ThumbnailClose(tnContext);
879cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
880cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return timeMs;
881cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
882cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
883cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargiint videoEditor_generateAudioRawFile(   JNIEnv*     pEnv,
884cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                        jobject     thiz,
885cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                        jstring     infilePath,
886cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                        jstring     pcmfilePath)
887cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
888cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR result = M4NO_ERROR;
889cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool               loaded   = true;
890cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext = M4OSA_NULL;
891cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
892cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
893cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
894cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    const char *pInputFile = pEnv->GetStringUTFChars(infilePath, NULL);
895cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pInputFile == M4OSA_NULL) {
896cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pEnv != NULL) {
897cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(pEnv, "java/lang/RuntimeException", "Input string null");
898cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
899cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
900cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
901cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    const char *pStringOutPCMFilePath = pEnv->GetStringUTFChars(pcmfilePath, NULL);
902cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pStringOutPCMFilePath == M4OSA_NULL) {
903cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pEnv != NULL) {
904cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(pEnv, "java/lang/RuntimeException", "Input string null");
905cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
906cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
907cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
908cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO,
909cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "VIDEO_EDITOR", "videoEditor_generateAudioRawFile infilePath %s",
910cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pInputFile);
911cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO,
912cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "VIDEO_EDITOR", "videoEditor_generateAudioRawFile pcmfilePath %s",
913cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pStringOutPCMFilePath);
914cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
915cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext = (ManualEditContext*)videoEditClasses_getContext(&loaded, pEnv, thiz);
916cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
917cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = videoEditor_generateAudio( pEnv, pContext, (M4OSA_Char*)pInputFile,
918cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_Char*)pStringOutPCMFilePath);
919cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
920cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return result;
921cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
922cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
923cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargiM4OSA_ERR videoEditor_generateAudio(JNIEnv* pEnv,ManualEditContext* pContext,
924cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    M4OSA_Char* infilePath,
925cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    M4OSA_Char* pcmfilePath )
926cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
927cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool                            needToBeLoaded = true;
928cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR                       result = M4NO_ERROR;
929cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4MCS_Context                   mcsContext;
930cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Char*                     pInputFile = M4OSA_NULL;
931cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Char*                     pOutputFile = M4OSA_NULL;
932cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Char*                     pTempPath = M4OSA_NULL;
933cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4MCS_OutputParams*             pOutputParams = M4OSA_NULL;
934cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4MCS_EncodingParams*           pEncodingParams = M4OSA_NULL;
935cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Int32                     pInputFileType = 0;
936cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt8                     threadProgress = 0;
937cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Char*                     pTemp3gpFilePath = M4OSA_NULL;
938cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
939cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_generateAudio()");
940cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
941cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalArgumentException(&needToBeLoaded, pEnv,
942cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (NULL == pContext),
943cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "ManualEditContext is null");
944cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
945cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "M4MCS_init()");
946cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
947cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams = (M4MCS_OutputParams *)M4OSA_malloc(
948cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        sizeof(M4MCS_OutputParams),0x00,
949cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_Char *)"M4MCS_OutputParams");
950cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
951cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_NULL == pOutputParams),
952cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "not initialized");
953cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
954cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEncodingParams = (M4MCS_EncodingParams *)M4OSA_malloc(
955cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        sizeof(M4MCS_EncodingParams),0x00,
956cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_Char *)"M4MCS_EncodingParams");
957cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
958cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_NULL == pEncodingParams),
959cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "not initialized");
960cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Initialize the MCS library.
961cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = M4MCS_init(&mcsContext, pContext->initParams.pFileReadPtr,
962cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->initParams.pFileWritePtr);
963cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,\
964cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4NO_ERROR != result), result);
965cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
966cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_NULL == mcsContext),
967cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "not initialized");
968cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // generate the path for temp 3gp output file
969cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pTemp3gpFilePath = (M4OSA_Char*) M4OSA_malloc (
970cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_chrLength((M4OSA_Char*)pContext->initParams.pTempPath)
971cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        + M4OSA_chrLength ((M4OSA_Char*)TEMP_MCS_OUT_FILE_PATH)) , 0x0,
972cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_Char*) "Malloc for temp 3gp file");
973cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if ( pTemp3gpFilePath != M4OSA_NULL )
974cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
975cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_memset(pTemp3gpFilePath  ,
976cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_chrLength((M4OSA_Char*)pContext->initParams.pTempPath)
977cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            + M4OSA_chrLength((M4OSA_Char*)TEMP_MCS_OUT_FILE_PATH), 0);
978cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_chrNCat ( (M4OSA_Char*)pTemp3gpFilePath,
979cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (M4OSA_Char*)pContext->initParams.pTempPath  ,
980cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_chrLength ((M4OSA_Char*)pContext->initParams.pTempPath));
981cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_chrNCat ( pTemp3gpFilePath , (M4OSA_Char*)TEMP_MCS_OUT_FILE_PATH,
982cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_chrLength ((M4OSA_Char*)TEMP_MCS_OUT_FILE_PATH));
983cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
984cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
985cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pInputFile = (M4OSA_Char *) infilePath; //pContext->mAudioSettings->pFile;
986cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    //Delete this file later
987cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputFile = (M4OSA_Char *) pTemp3gpFilePath;
988cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Temp folder path for VSS use = ProjectPath
989cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pTempPath = (M4OSA_Char *) pContext->initParams.pTempPath;
990cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pInputFileType = (M4VIDEOEDITING_FileType)pContext->mAudioSettings->fileType;
991cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
992cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "TEMP_MCS_OUT_FILE_PATH len %d",
993cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_chrLength ((M4OSA_Char*)TEMP_MCS_OUT_FILE_PATH));
994cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "pTemp3gpFilePath %s",
995cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pOutputFile);
996cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
997cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "M4MCS_open()");
998cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
999cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = M4MCS_open(mcsContext, pInputFile,
1000cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4VIDEOEDITING_FileType)pInputFileType,
1001cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pOutputFile, pTempPath);
1002cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,
1003cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4NO_ERROR != result), result);
1004cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1005cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->OutputFileType
1006cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        = (M4VIDEOEDITING_FileType)M4VIDEOEDITING_kFileType_3GPP;
1007cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the video format.
1008cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->OutputVideoFormat =
1009cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4VIDEOEDITING_VideoFormat)M4VIDEOEDITING_kNoneVideo;//M4VIDEOEDITING_kNoneVideo;
1010cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the frame size.
1011cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->OutputVideoFrameSize
1012cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        = (M4VIDEOEDITING_VideoFrameSize)M4VIDEOEDITING_kQCIF;
1013cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the frame rate.
1014cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->OutputVideoFrameRate
1015cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        = (M4VIDEOEDITING_VideoFramerate)M4VIDEOEDITING_k5_FPS;
1016cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1017cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the audio format.
1018cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->OutputAudioFormat
1019cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        = (M4VIDEOEDITING_AudioFormat)M4VIDEOEDITING_kAAC;
1020cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the audio sampling frequency.
1021cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->OutputAudioSamplingFrequency =
1022cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4VIDEOEDITING_AudioSamplingFrequency)M4VIDEOEDITING_k32000_ASF;
1023cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the audio mono.
1024cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->bAudioMono = false;
1025cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the pcm file; null for now.
1026cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->pOutputPCMfile = (M4OSA_Char *)pcmfilePath;
1027cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    //(M4OSA_Char *)"/sdcard/Output/AudioPcm.pcm";
1028cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the audio sampling frequency.
1029cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->MediaRendering = (M4MCS_MediaRendering)M4MCS_kCropping;
1030cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // new params after integrating MCS 2.0
1031cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the number of audio effects; 0 for now.
1032cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->nbEffects = 0;
1033cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the audio effect; null for now.
1034cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->pEffects = NULL;
1035cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the audio effect; null for now.
1036cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->bDiscardExif = M4OSA_FALSE;
1037cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the audio effect; null for now.
1038cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pOutputParams->bAdjustOrientation = M4OSA_FALSE;
1039cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1040cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "M4MCS_setOutputParams()");
1041cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = M4MCS_setOutputParams(mcsContext, pOutputParams);
1042cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,
1043cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                        (M4NO_ERROR != result), result);
1044cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1045cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the video bitrate.
1046cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEncodingParams->OutputVideoBitrate =
1047cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    (M4VIDEOEDITING_Bitrate)M4VIDEOEDITING_kUndefinedBitrate;
1048cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the audio bitrate.
1049cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEncodingParams->OutputAudioBitrate
1050cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        = (M4VIDEOEDITING_Bitrate)M4VIDEOEDITING_k128_KBPS;
1051cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the end cut time in milliseconds.
1052cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEncodingParams->BeginCutTime = 0;
1053cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the end cut time in milliseconds.
1054cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEncodingParams->EndCutTime = 0;
1055cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the output file size in bytes.
1056cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEncodingParams->OutputFileSize = 0;
1057cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set video time scale.
1058cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEncodingParams->OutputVideoTimescale = 0;
1059cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1060cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
1061cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                            "M4MCS_setEncodingParams()");
1062cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = M4MCS_setEncodingParams(mcsContext, pEncodingParams);
1063cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,
1064cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4NO_ERROR != result), result);
1065cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1066cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
1067cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                            "M4MCS_checkParamsAndStart()");
1068cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = M4MCS_checkParamsAndStart(mcsContext);
1069cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,
1070cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4NO_ERROR != result), result);
1071cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1072cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "M4MCS_step()");
1073cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1074cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /*+ PROGRESS CB */
1075cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt8 curProgress = 0;
1076cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int         lastProgress = 0;
1077cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1078cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("LVME_generateAudio Current progress is =%d", curProgress);
1079cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEnv->CallVoidMethod(pContext->engine,
1080cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->onProgressUpdateMethodId, 1/*task status*/,
1081cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            curProgress/*progress*/);
1082cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    do {
1083cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        result = M4MCS_step(mcsContext, &curProgress);
1084cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1085cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (result != M4NO_ERROR) {
1086cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            LOGV("LVME_generateAudio M4MCS_step returned 0x%x",result);
1087cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1088cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if (result == M4MCS_WAR_TRANSCODING_DONE) {
1089cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                LOGV("LVME_generateAudio MCS process ended");
1090cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1091cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                // Send a progress notification.
1092cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                curProgress = 100;
1093cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pEnv->CallVoidMethod(pContext->engine,
1094cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    pContext->onProgressUpdateMethodId, 1/*task status*/,
1095cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    curProgress);
1096cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                LOGV("LVME_generateAudio Current progress is =%d", curProgress);
1097cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
1098cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        } else {
1099cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Send a progress notification if needed
1100cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if (curProgress != lastProgress) {
1101cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                lastProgress = curProgress;
1102cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pEnv->CallVoidMethod(pContext->engine,
1103cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    pContext->onProgressUpdateMethodId, 0/*task status*/,
1104cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    curProgress/*progress*/);
1105cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                LOGV("LVME_generateAudio Current progress is =%d",curProgress);
1106cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
1107cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1108cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    } while (result == M4NO_ERROR);
1109cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /*- PROGRESS CB */
1110cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1111cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,
1112cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4MCS_WAR_TRANSCODING_DONE != result), result);
1113cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1114cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "M4MCS_abort()");
1115cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = M4MCS_abort(mcsContext);
1116cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,
1117cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4NO_ERROR != result), result);
1118cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1119cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    //pContext->mAudioSettings->pFile = pOutputParams->pOutputPCMfile;
1120cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_fileExtraDelete((const M4OSA_Char *) pTemp3gpFilePath);
1121cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_generateAudio() EXIT ");
1122cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1123cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_free((M4OSA_MemAddr32)pTemp3gpFilePath);
1124cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_free((M4OSA_MemAddr32)pOutputParams);
1125cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_free((M4OSA_MemAddr32)pEncodingParams);
1126cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return result;
1127cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
1128cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1129cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int removeAlphafromRGB8888 (
1130cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        M4OSA_Char* pFramingFilePath,
1131cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        M4xVSS_FramingStruct *pFramingCtx)
1132cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
1133cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32 frameSize_argb = (pFramingCtx->width * pFramingCtx->height * 4); // aRGB data
1134cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Context lImageFileFp  = M4OSA_NULL;
1135cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
1136cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1137cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("removeAlphafromRGB8888: width %d", pFramingCtx->width);
1138cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1139cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt8 *pTmpData = (M4OSA_UInt8*) M4OSA_malloc(frameSize_argb, M4VS, (M4OSA_Char*)"Image argb data");
1140cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pTmpData == M4OSA_NULL) {
1141cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        LOGE("Failed to allocate memory for Image clip");
1142cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return M4ERR_ALLOC;
1143cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1144cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1145cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi       /** Read the argb data from the passed file. */
1146cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR lerr = M4OSA_fileReadOpen(&lImageFileFp, (M4OSA_Void *) pFramingFilePath, M4OSA_kFileRead);
1147cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1148cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1149cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if ((lerr != M4NO_ERROR) || (lImageFileFp == M4OSA_NULL))
1150cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1151cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        LOGE("removeAlphafromRGB8888: Can not open the file ");
1152cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_free((M4OSA_MemAddr32)pTmpData);
1153cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return M4ERR_FILE_NOT_FOUND;
1154cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1155cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1156cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1157cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    lerr = M4OSA_fileReadData(lImageFileFp, (M4OSA_MemAddr8)pTmpData, &frameSize_argb);
1158cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (lerr != M4NO_ERROR)
1159cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1160cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        LOGE("removeAlphafromRGB8888: can not read the data ");
1161cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_fileReadClose(lImageFileFp);
1162cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_free((M4OSA_MemAddr32)pTmpData);
1163cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return lerr;
1164cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1165cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_fileReadClose(lImageFileFp);
1166cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1167cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32 frameSize = (pFramingCtx->width * pFramingCtx->height * 3); //Size of RGB 888 data.
1168cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1169cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pFramingCtx->FramingRgb = (M4VIFI_ImagePlane*)M4OSA_malloc(
1170cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             sizeof(M4VIFI_ImagePlane), M4VS, (M4OSA_Char*)"Image clip RGB888 data");
1171cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pFramingCtx->FramingRgb->pac_data = (M4VIFI_UInt8*)M4OSA_malloc(
1172cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             frameSize, M4VS, (M4OSA_Char*)"Image clip RGB888 data");
1173cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1174cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pFramingCtx->FramingRgb == M4OSA_NULL)
1175cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1176cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        LOGE("Failed to allocate memory for Image clip");
1177cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_free((M4OSA_MemAddr32)pTmpData);
1178cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return M4ERR_ALLOC;
1179cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1180cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1181cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /** Remove the alpha channel */
1182cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    for (int i = 0, j = 0; i < frameSize_argb; i++) {
1183cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if ((i % 4) == 0) continue;
1184cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pFramingCtx->FramingRgb->pac_data[j] = pTmpData[i];
1185cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        j++;
1186cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1187cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_free((M4OSA_MemAddr32)pTmpData);
1188cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return M4NO_ERROR;
1189cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
1190cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1191cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void
1192cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_populateSettings(
1193cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                 pEnv,
1194cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                 thiz,
1195cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                 settings,
1196cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                 object,
1197cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                 audioSettingObject)
1198cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
1199cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
1200cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "videoEditor_populateSettings()");
1201cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1202cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool                needToBeLoaded  = true;
1203cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext*  pContext        = M4OSA_NULL;
1204cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR           result          = M4NO_ERROR;
1205cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jstring             str             = M4OSA_NULL;
1206cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jobjectArray        propertiesClipsArray           = M4OSA_NULL;
1207cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jobject             properties      = M4OSA_NULL;
1208cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jint*               bitmapArray     =  M4OSA_NULL;
1209cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jobjectArray        effectSettingsArray = M4OSA_NULL;
1210cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jobject             effectSettings  = M4OSA_NULL;
1211cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jintArray           pixelArray      = M4OSA_NULL;
1212cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int width = 0;
1213cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int height = 0;
1214cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int nbOverlays = 0;
1215cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int i,j = 0;
1216cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int *pOverlayIndex = M4OSA_NULL;
1217cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1218cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Add a code marker (the condition must always be true).
1219cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ADD_CODE_MARKER_FUN(NULL != pEnv)
1220cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1221cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Validate the settings parameter.
1222cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalArgumentException(&needToBeLoaded, pEnv,
1223cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                (NULL == settings),
1224cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                "settings is null");
1225cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
1226cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext =
1227cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (ManualEditContext*)videoEditClasses_getContext(&needToBeLoaded, pEnv, thiz);
1228cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1229cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
1230cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1231cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == pContext),
1232cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
1233cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
1234cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1235cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 (M4OSA_NULL == pContext->mPreviewController),
1236cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 "not initialized");
1237cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jclass mPreviewClipPropClazz = pEnv->FindClass(PREVIEW_PROPERTIES_CLASS_NAME);
1238cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1239cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     (M4OSA_NULL == mPreviewClipPropClazz),
1240cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     "not initialized");
1241cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1242cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jfieldID fid = pEnv->GetFieldID(mPreviewClipPropClazz,"clipProperties",
1243cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "[L"PROPERTIES_CLASS_NAME";"  );
1244cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1245cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     (M4OSA_NULL == fid),
1246cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     "not initialized");
1247cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1248cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    propertiesClipsArray = (jobjectArray)pEnv->GetObjectField(object, fid);
1249cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1250cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     (M4OSA_NULL == propertiesClipsArray),
1251cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     "not initialized");
1252cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1253cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jclass engineClass = pEnv->FindClass(MANUAL_EDIT_ENGINE_CLASS_NAME);
1254cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1255cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     (M4OSA_NULL == engineClass),
1256cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     "not initialized");
1257cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1258cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext->onPreviewProgressUpdateMethodId = pEnv->GetMethodID(engineClass,
1259cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "onPreviewProgressUpdate",     "(IZ)V");
1260cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check if the context is valid (required because the context is dereferenced).
1261cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (needToBeLoaded) {
1262cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Make sure that we are in a correct state.
1263cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1264cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                             (pContext->state != ManualEditState_INITIALIZED),
1265cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                             "settings already loaded");
1266cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Retrieve the edit settings.
1267cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pContext->pEditSettings != M4OSA_NULL) {
1268cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditClasses_freeEditSettings(&pContext->pEditSettings);
1269cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->pEditSettings = M4OSA_NULL;
1270cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1271cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditClasses_getEditSettings(&needToBeLoaded, pEnv,
1272cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            settings, &pContext->pEditSettings,false);
1273cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1274cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_TRACE1_0("videoEditorC_getEditSettings done");
1275cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1276cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if ( pContext->pEditSettings != NULL )
1277cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1278cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the edit settings could be retrieved.
1279cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        jclass mEditClazz = pEnv->FindClass(EDIT_SETTINGS_CLASS_NAME);
1280cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if(mEditClazz == M4OSA_NULL)
1281cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1282cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_TRACE1_0("cannot find object field for mEditClazz");
1283cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            return;
1284cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1285cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        jclass mEffectsClazz = pEnv->FindClass(EFFECT_SETTINGS_CLASS_NAME);
1286cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if(mEffectsClazz == M4OSA_NULL)
1287cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1288cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_TRACE1_0("cannot find object field for mEffectsClazz");
1289cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            return;
1290cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1291cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(mEditClazz,"effectSettingsArray", "[L"EFFECT_SETTINGS_CLASS_NAME";"  );
1292cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if(fid == M4OSA_NULL)
1293cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1294cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_TRACE1_0("cannot find field for effectSettingsArray Array");
1295cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            return;
1296cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1297cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        effectSettingsArray = (jobjectArray)pEnv->GetObjectField(settings, fid);
1298cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if(effectSettingsArray == M4OSA_NULL)
1299cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1300cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_TRACE1_0("cannot find object field for effectSettingsArray");
1301cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            return;
1302cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1303cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        i = 0;
1304cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        j = 0;
1305cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        //int overlayIndex[pContext->pEditSettings->nbEffects];
1306cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if ( pContext->pEditSettings->nbEffects )
1307cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1308cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pOverlayIndex
1309cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            = (int*) M4OSA_malloc(pContext->pEditSettings->nbEffects, 0,
1310cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                (M4OSA_Char*)"pOverlayIndex");
1311cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1312cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1313cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("no of effects = %d",pContext->pEditSettings->nbEffects);
1314cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        while (j < pContext->pEditSettings->nbEffects)
1315cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1316cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if (pContext->pEditSettings->Effects[j].xVSS.pFramingFilePath != M4OSA_NULL)
1317cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            {
1318cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pOverlayIndex[nbOverlays] = j;
1319cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                nbOverlays++;
1320cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4xVSS_FramingStruct *aFramingCtx = M4OSA_NULL;
1321cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                aFramingCtx
1322cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                = (M4xVSS_FramingStruct*)M4OSA_malloc(sizeof(M4xVSS_FramingStruct), M4VS,
1323cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                  (M4OSA_Char*)"M4xVSS_internalDecodeGIF: Context of the framing effect");
1324cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                if (aFramingCtx == M4OSA_NULL)
1325cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                {
1326cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    M4OSA_TRACE1_0("Allocation error in videoEditor_populateSettings");
1327cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                }
1328cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                aFramingCtx->pCurrent = M4OSA_NULL; /* Only used by the first element of the chain */
1329cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                aFramingCtx->previousClipTime = -1;
1330cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                aFramingCtx->FramingYuv = M4OSA_NULL;
1331cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                aFramingCtx->FramingRgb = M4OSA_NULL;
1332cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                aFramingCtx->topleft_x
1333cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    = pContext->pEditSettings->Effects[j].xVSS.topleft_x;
1334cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                aFramingCtx->topleft_y
1335cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    = pContext->pEditSettings->Effects[j].xVSS.topleft_y;
1336cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1337cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1338cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                 VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "OF u_width %d",
1339cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                        pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_width);
1340cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                 VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "OF u_height() %d",
1341cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                        pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_height);
1342cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                 VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "OF rgbType() %d",
1343cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                        pContext->pEditSettings->Effects[j].xVSS.rgbType);
1344cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1345cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                 aFramingCtx->width = pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_width;
1346cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                 aFramingCtx->height = pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_height;
1347cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1348cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1349cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                result = M4xVSS_internalConvertARGB888toYUV420_FrammingEffect(pContext->engineContext,
1350cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    &(pContext->pEditSettings->Effects[j]),aFramingCtx,
1351cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->pEditSettings->Effects[j].xVSS.framingScaledSize);
1352cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                if (result != M4NO_ERROR)
1353cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                {
1354cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    M4OSA_TRACE1_1("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect returned 0x%x", result);
1355cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                }
1356cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1357cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                //framing buffers are resized to fit the output video resolution.
1358cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_width =
1359cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    aFramingCtx->FramingRgb->u_width;
1360cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_height =
1361cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    aFramingCtx->FramingRgb->u_height;
1362cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1363cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1364cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "A framing Context aFramingCtx->width = %d",
1365cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    aFramingCtx->FramingRgb->u_width);
1366cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1367cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "A framing Context aFramingCtx->height = %d",
1368cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    aFramingCtx->FramingRgb->u_height);
1369cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1370cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1371cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                width = pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_width;
1372cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                height = pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_height;
1373cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1374cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_stride = width*3;
1375cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1376cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                //for RGB888
1377cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_topleft = 0;
1378cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1379cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->pac_data =
1380cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                    (M4VIFI_UInt8 *)M4OSA_malloc(width*height*3,
1381cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    0x00,(M4OSA_Char *)"pac_data buffer");
1382cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1383cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_memcpy((M4OSA_Int8 *)&pContext->pEditSettings->\
1384cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    Effects[j].xVSS.pFramingBuffer->\
1385cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    pac_data[0],(M4OSA_Int8 *)&aFramingCtx->FramingRgb->pac_data[0],(width*height*3));
1386cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1387cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                //As of now rgb type is always rgb888, can be changed in future for rgb 565
1388cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->pEditSettings->Effects[j].xVSS.rgbType =
1389cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                (M4VSS3GPP_RGBType)M4VSS3GPP_kRGB888; //M4VSS3GPP_kRGB565;
1390cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1391cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                if (aFramingCtx->FramingYuv != M4OSA_NULL )
1392cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                {
1393cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    if (aFramingCtx->FramingYuv->pac_data != M4OSA_NULL) {
1394cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        M4OSA_free((M4OSA_MemAddr32)aFramingCtx->FramingYuv->pac_data);
1395cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        aFramingCtx->FramingYuv->pac_data = M4OSA_NULL;
1396cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    }
1397cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                }
1398cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                if (aFramingCtx->FramingYuv != M4OSA_NULL) {
1399cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    M4OSA_free((M4OSA_MemAddr32)aFramingCtx->FramingYuv);
1400cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    aFramingCtx->FramingYuv = M4OSA_NULL;
1401cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                }
1402cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                if (aFramingCtx->FramingRgb->pac_data != M4OSA_NULL) {
1403cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    M4OSA_free((M4OSA_MemAddr32)aFramingCtx->FramingRgb->pac_data);
1404cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    aFramingCtx->FramingRgb->pac_data = M4OSA_NULL;
1405cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                }
1406cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                if (aFramingCtx->FramingRgb != M4OSA_NULL) {
1407cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    M4OSA_free((M4OSA_MemAddr32)aFramingCtx->FramingRgb);
1408cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    aFramingCtx->FramingRgb = M4OSA_NULL;
1409cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                }
1410cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                if (aFramingCtx != M4OSA_NULL) {
1411cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    M4OSA_free((M4OSA_MemAddr32)aFramingCtx);
1412cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    aFramingCtx = M4OSA_NULL;
1413cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                }
1414cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
1415cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            j++;
1416cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1417cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1418cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the edit settings could be retrieved.
1419cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("total clips are = %d",pContext->pEditSettings->uiClipNumber);
1420cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        for (i = 0; i < pContext->pEditSettings->uiClipNumber; i++) {
1421cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_TRACE1_1("clip no = %d",i);
1422cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            properties = pEnv->GetObjectArrayElement(propertiesClipsArray, i);
1423cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1424cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                (M4OSA_NULL == properties),
1425cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                "not initialized");
1426cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            getClipSetting(pEnv,properties, pContext->pEditSettings->pClipList[i]);
1427cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1428cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1429cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (needToBeLoaded) {
1430cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Log the edit settings.
1431cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            VIDEOEDIT_LOG_EDIT_SETTINGS(pContext->pEditSettings);
1432cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1433cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1434cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1435cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (audioSettingObject != M4OSA_NULL) {
1436cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        jclass audioSettingClazz = pEnv->FindClass(AUDIO_SETTINGS_CLASS_NAME);
1437cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1438cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                         (M4OSA_NULL == audioSettingClazz),
1439cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                         "not initialized");
1440cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1441cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1442cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     (M4OSA_NULL == pContext->mAudioSettings),
1443cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     "not initialized");
1444cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1445cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"bRemoveOriginal","Z");
1446cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->bRemoveOriginal = pEnv->GetIntField(audioSettingObject,fid);
1447cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("bRemoveOriginal = %d",pContext->mAudioSettings->bRemoveOriginal);
1448cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1449cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"channels","I");
1450cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->uiNbChannels = pEnv->GetIntField(audioSettingObject,fid);
1451cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("uiNbChannels = %d",pContext->mAudioSettings->uiNbChannels);
1452cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1453cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"Fs","I");
1454cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->uiSamplingFrequency = pEnv->GetIntField(audioSettingObject,fid);
1455cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("uiSamplingFrequency = %d",pContext->mAudioSettings->uiSamplingFrequency);
1456cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1457cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"ExtendedFs","I");
1458cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->uiExtendedSamplingFrequency =
1459cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi         pEnv->GetIntField(audioSettingObject,fid);
1460cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("uiExtendedSamplingFrequency = %d",
1461cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->uiExtendedSamplingFrequency);
1462cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1463cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"startMs","J");
1464cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->uiAddCts
1465cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            = pEnv->GetIntField(audioSettingObject,fid);
1466cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("uiAddCts = %d",pContext->mAudioSettings->uiAddCts);
1467cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1468cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"volume","I");
1469cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->uiAddVolume
1470cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            = pEnv->GetIntField(audioSettingObject,fid);
1471cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("uiAddVolume = %d",pContext->mAudioSettings->uiAddVolume);
1472cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1473cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"loop","Z");
1474cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->bLoop
1475cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            = pEnv->GetIntField(audioSettingObject,fid);
1476cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("bLoop = %d",pContext->mAudioSettings->bLoop);
1477cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1478cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"beginCutTime","J");
1479cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->beginCutMs
1480cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            = pEnv->GetIntField(audioSettingObject,fid);
1481cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("begin cut time = %d",pContext->mAudioSettings->beginCutMs);
1482cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1483cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"endCutTime","J");
1484cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->endCutMs
1485cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            = pEnv->GetIntField(audioSettingObject,fid);
1486cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("end cut time = %d",pContext->mAudioSettings->endCutMs);
1487cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1488cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"fileType","I");
1489cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->fileType
1490cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            = pEnv->GetIntField(audioSettingObject,fid);
1491cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("fileType = %d",pContext->mAudioSettings->fileType);
1492cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"pFile","Ljava/lang/String;");
1493cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        str = (jstring)pEnv->GetObjectField(audioSettingObject,fid);
1494cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->pFile
1495cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                = (M4OSA_Char*)pEnv->GetStringUTFChars(str, M4OSA_NULL);
1496cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("file name = %s",pContext->mAudioSettings->pFile);
1497cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEOEDITOR", "regenerateAudio() file name = %s",\
1498cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->pFile);
1499cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"pcmFilePath","Ljava/lang/String;");
1500cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        str = (jstring)pEnv->GetObjectField(audioSettingObject,fid);
1501cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->pPCMFilePath =
1502cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_Char*)pEnv->GetStringUTFChars(str, M4OSA_NULL);
1503cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEOEDITOR", "pPCMFilePath -- %s ",\
1504cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->pPCMFilePath);
1505cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(engineClass,"mRegenerateAudio","Z");
1506cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        bool regenerateAudio = pEnv->GetBooleanField(thiz,fid);
1507cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEOEDITOR", "regenerateAudio -- %d ",\
1508cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        regenerateAudio);
1509cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (regenerateAudio) {
1510cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_TRACE1_0("Calling Generate Audio now");
1511cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            result = videoEditor_generateAudio(pEnv,
1512cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        pContext,
1513cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        (M4OSA_Char*)pContext->mAudioSettings->pFile,
1514cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        (M4OSA_Char*)pContext->mAudioSettings->pPCMFilePath);
1515cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            regenerateAudio = false;
1516cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pEnv->SetBooleanField(thiz,fid,regenerateAudio);
1517cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1518cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEOEDITOR", "regenerateAudio()");
1519cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1520cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        /* Audio mix and duck */
1521cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"ducking_threshold","I");
1522cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->uiInDucking_threshold
1523cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            = pEnv->GetIntField(audioSettingObject,fid);
1524cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("ducking threshold = %d",
1525cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiInDucking_threshold);
1526cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1527cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"ducking_lowVolume","I");
1528cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->uiInDucking_lowVolume
1529cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            = pEnv->GetIntField(audioSettingObject,fid);
1530cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("ducking lowVolume = %d",
1531cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiInDucking_lowVolume);
1532cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1533cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        fid = pEnv->GetFieldID(audioSettingClazz,"bInDucking_enable","Z");
1534cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings->bInDucking_enable
1535cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            = pEnv->GetBooleanField(audioSettingObject,fid);
1536cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_TRACE1_1("ducking lowVolume = %d",
1537cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->bInDucking_enable);
1538cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    } else {
1539cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pContext->mAudioSettings != M4OSA_NULL) {
1540cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->pFile = M4OSA_NULL;
1541cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->bRemoveOriginal = 0;
1542cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiNbChannels = 0;
1543cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiSamplingFrequency = 0;
1544cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiExtendedSamplingFrequency = 0;
1545cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiAddCts = 0;
1546cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiAddVolume = 0;
1547cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->beginCutMs = 0;
1548cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->endCutMs = 0;
1549cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi               pContext->mAudioSettings->fileType = 0;
1550cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->bLoop = 0;
1551cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiInDucking_lowVolume  = 0;
1552cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->bInDucking_enable  = 0;
1553cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiBTChannelCount  = 0;
1554cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiInDucking_threshold = 0;
1555cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1556cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            fid = pEnv->GetFieldID(engineClass,"mRegenerateAudio","Z");
1557cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            bool regenerateAudio = pEnv->GetBooleanField(thiz,fid);
1558cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if(!regenerateAudio) {
1559cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                regenerateAudio = true;
1560cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pEnv->SetBooleanField(thiz,fid,regenerateAudio);
1561cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
1562cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1563cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1564cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pContext->pEditSettings != NULL )
1565cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1566cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        result = pContext->mPreviewController->loadEditSettings(pContext->pEditSettings,
1567cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mAudioSettings);
1568cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,
1569cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                            (M4NO_ERROR != result), result);
1570cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1571cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->mPreviewController->setJniCallback((void*)pContext,
1572cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi         (jni_progress_callback_fct)jniPreviewProgressCallback);
1573cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1574cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        j = 0;
1575cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        while (j < nbOverlays)
1576cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1577cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if (pContext->pEditSettings->Effects[pOverlayIndex[j]].xVSS.pFramingBuffer->pac_data != \
1578cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_NULL) {
1579cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_free((M4OSA_MemAddr32)pContext->pEditSettings->\
1580cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                Effects[pOverlayIndex[j]].xVSS.pFramingBuffer->pac_data);
1581cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->pEditSettings->\
1582cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                Effects[pOverlayIndex[j]].xVSS.pFramingBuffer->pac_data = M4OSA_NULL;
1583cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
1584cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if (pContext->pEditSettings->Effects[pOverlayIndex[j]].xVSS.pFramingBuffer != M4OSA_NULL) {
1585cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_free((M4OSA_MemAddr32)pContext->pEditSettings->\
1586cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                Effects[pOverlayIndex[j]].xVSS.pFramingBuffer);
1587cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->pEditSettings->Effects[pOverlayIndex[j]].xVSS.pFramingBuffer = M4OSA_NULL;
1588cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
1589cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            j++;
1590cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1591cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1592cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pOverlayIndex != M4OSA_NULL)
1593cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1594cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_free((M4OSA_MemAddr32)pOverlayIndex);
1595cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pOverlayIndex = M4OSA_NULL;
1596cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1597cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return;
1598cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
1599cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1600cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void
1601cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_startPreview(
1602cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                 pEnv,
1603cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                 thiz,
1604cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                 mSurface,
1605cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jlong                   fromMs,
1606cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jlong                   toMs,
1607cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jint                    callbackInterval,
1608cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jboolean                loop)
1609cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
1610cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool needToBeLoaded = true;
1611cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR result = M4NO_ERROR;
1612cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_startPreview()");
1613cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1614cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext = M4OSA_NULL;
1615cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
1616cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext = (ManualEditContext*)videoEditClasses_getContext(&needToBeLoaded, pEnv, thiz);
1617cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1618cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
1619cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1620cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == pContext),
1621cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
1622cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1623cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1624cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     (M4OSA_NULL == pContext->mAudioSettings),
1625cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     "not initialized");
1626cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
1627cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1628cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 (M4OSA_NULL == pContext->mPreviewController),
1629cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 "not initialized");
1630cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1631cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Validate the mSurface parameter.
1632cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalArgumentException(&needToBeLoaded, pEnv,
1633cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                (NULL == mSurface),
1634cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                "mSurface is null");
1635cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1636cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jclass surfaceClass = pEnv->FindClass("android/view/Surface");
1637cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1638cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == surfaceClass),
1639cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
1640cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    //jfieldID surface_native = pEnv->GetFieldID(surfaceClass, "mSurface", "I");
1641cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jfieldID surface_native
1642cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        = pEnv->GetFieldID(surfaceClass, ANDROID_VIEW_SURFACE_JNI_ID, "I");
1643cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1644cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
1645cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == surface_native),
1646cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
1647cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1648cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    Surface* const p = (Surface*)pEnv->GetIntField(mSurface, surface_native);
1649cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1650cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    sp<Surface> previewSurface = sp<Surface>(p);
1651cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1652cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result =  pContext->mPreviewController->setSurface(previewSurface);
1653cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,
1654cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4NO_ERROR != result), result);
1655cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "fromMs=%ld, toMs=%ld",
1656cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_UInt32)fromMs, (M4OSA_Int32)toMs);
1657cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1658cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = pContext->mPreviewController->startPreview((M4OSA_UInt32)fromMs,
1659cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                (M4OSA_Int32)toMs,
1660cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                (M4OSA_UInt16)callbackInterval,
1661cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                (M4OSA_Bool)loop);
1662cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv, (M4NO_ERROR != result), result);
1663cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
1664cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1665cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1666cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic jobject
1667cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_getProperties(
1668cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
1669cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz,
1670cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jstring                             file)
1671cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
1672cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jobject object = M4OSA_NULL;
1673cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    object = videoEditProp_getProperties(pEnv,thiz,file);
1674cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1675cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return object;
1676cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1677cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
1678cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int videoEditor_getPixels(
1679cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    JNIEnv*                     env,
1680cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    jobject                     thiz,
1681cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    jstring                     path,
1682cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    jintArray                   pixelArray,
1683cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    M4OSA_UInt32                width,
1684cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    M4OSA_UInt32                height,
1685cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    M4OSA_UInt32                timeMS)
1686cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
1687cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1688cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR       err = M4NO_ERROR;
1689cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Context   mContext = M4OSA_NULL;
1690cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jint*           m_dst32 = M4OSA_NULL;
1691cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1692cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1693cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Add a text marker (the condition must always be true).
1694cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ADD_TEXT_MARKER_FUN(NULL != env)
1695cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1696cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    const char *pString = env->GetStringUTFChars(path, NULL);
1697cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pString == M4OSA_NULL) {
1698cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (env != NULL) {
1699cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(env, "java/lang/RuntimeException", "Input string null");
1700cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1701cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return M4ERR_ALLOC;
1702cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1703cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1704cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    err = ThumbnailOpen(&mContext,(const M4OSA_Char*)pString, M4OSA_FALSE);
1705cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (err != M4NO_ERROR || mContext == M4OSA_NULL) {
1706cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pString != NULL) {
1707cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            env->ReleaseStringUTFChars(path, pString);
1708cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1709cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (env != NULL) {
1710cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(env, "java/lang/RuntimeException", "ThumbnailOpen failed");
1711cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1712cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1713cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1714cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    m_dst32 = env->GetIntArrayElements(pixelArray, NULL);
1715cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1716cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    err = ThumbnailGetPixels32(mContext, (M4OSA_Int32 *)m_dst32, width,height,&timeMS);
1717cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (err != M4NO_ERROR ) {
1718cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (env != NULL) {
1719cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(env, "java/lang/RuntimeException",\
1720cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                "ThumbnailGetPixels32 failed");
1721cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1722cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1723cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    env->ReleaseIntArrayElements(pixelArray, m_dst32, 0);
1724cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1725cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ThumbnailClose(mContext);
1726cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pString != NULL) {
1727cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        env->ReleaseStringUTFChars(path, pString);
1728cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1729cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1730cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return timeMS;
1731cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
1732cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1733cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int videoEditor_getPixelsList(
1734cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                     env,
1735cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                     thiz,
1736cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jstring                     path,
1737cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jintArray                 pixelArray,
1738cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt32             width,
1739cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt32             height,
1740cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt32             deltatimeMS,
1741cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt32            noOfThumbnails,
1742cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt32                startTime,
1743cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt32                endTime)
1744cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
1745cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1746cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR           err;
1747cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Context       mContext = M4OSA_NULL;
1748cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jint*               m_dst32;
1749cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32        timeMS = startTime;
1750cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int                 arrayOffset = 0;
1751cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1752cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1753cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1754cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Add a text marker (the condition must always be true).
1755cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ADD_TEXT_MARKER_FUN(NULL != env)
1756cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1757cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    const char *pString = env->GetStringUTFChars(path, NULL);
1758cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pString == M4OSA_NULL) {
1759cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (env != NULL) {
1760cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(env, "java/lang/RuntimeException", "Input string null");
1761cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1762cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return M4ERR_ALLOC;
1763cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1764cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1765cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    err = ThumbnailOpen(&mContext,(const M4OSA_Char*)pString, M4OSA_FALSE);
1766cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (err != M4NO_ERROR || mContext == M4OSA_NULL) {
1767cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (env != NULL) {
1768cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(env, "java/lang/RuntimeException", "ThumbnailOpen failed");
1769cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1770cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pString != NULL) {
1771cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            env->ReleaseStringUTFChars(path, pString);
1772cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1773cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return err;
1774cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1775cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1776cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    m_dst32 = env->GetIntArrayElements(pixelArray, NULL);
1777cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1778cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    do {
1779cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        err = ThumbnailGetPixels32(mContext, ((M4OSA_Int32 *)m_dst32 + arrayOffset),
1780cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            width,height,&timeMS);
1781cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (err != M4NO_ERROR ) {
1782cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if (env != NULL) {
1783cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jniThrowException(env, "java/lang/RuntimeException",\
1784cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    "ThumbnailGetPixels32 failed");
1785cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
1786cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            return err;
1787cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1788cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        timeMS += deltatimeMS;
1789cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        arrayOffset += (width * height * 4);
1790cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        noOfThumbnails--;
1791cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    } while(noOfThumbnails > 0);
1792cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1793cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    env->ReleaseIntArrayElements(pixelArray, m_dst32, 0);
1794cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1795cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ThumbnailClose(mContext);
1796cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pString != NULL) {
1797cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        env->ReleaseStringUTFChars(path, pString);
1798cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1799cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1800cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return err;
1801cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1802cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
1803cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1804cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic M4OSA_ERR
1805cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_toUTF8Fct(
1806cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_Void*                         pBufferIn,
1807cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt8*                        pBufferOut,
1808cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt32*                       bufferOutSize)
1809cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
1810cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR    result = M4NO_ERROR;
1811cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32 length = 0;
1812cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1813cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_toUTF8Fct()");
1814cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1815cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Determine the length of the input buffer.
1816cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (M4OSA_NULL != pBufferIn)
1817cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1818cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        length = M4OSA_chrLength((M4OSA_Char *)pBufferIn);
1819cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1820cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1821cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check if the output buffer is large enough to hold the input buffer.
1822cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if ((*bufferOutSize) > length)
1823cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1824cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the input buffer is not M4OSA_NULL.
1825cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (M4OSA_NULL != pBufferIn)
1826cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1827cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Copy the temp path, ignore the result.
1828cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_chrNCopy((M4OSA_Char *)pBufferOut, (M4OSA_Char *)pBufferIn, length);
1829cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1830cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        else
1831cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1832cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Set the output buffer to an empty string.
1833cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (*(M4OSA_Char *)pBufferOut) = 0;
1834cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1835cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1836cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else
1837cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1838cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // The buffer is too small.
1839cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        result = M4xVSSWAR_BUFFER_OUT_TOO_SMALL;
1840cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1841cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1842cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Return the buffer output size.
1843cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    (*bufferOutSize) = length + 1;
1844cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1845cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Return the result.
1846cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return(result);
1847cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
1848cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1849cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic M4OSA_ERR
1850cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_fromUTF8Fct(
1851cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt8*                        pBufferIn,
1852cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_Void*                         pBufferOut,
1853cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt32*                       bufferOutSize)
1854cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
1855cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR    result = M4NO_ERROR;
1856cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32 length = 0;
1857cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1858cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_fromUTF8Fct()");
1859cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1860cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Determine the length of the input buffer.
1861cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (M4OSA_NULL != pBufferIn)
1862cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1863cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        length = M4OSA_chrLength((M4OSA_Char *)pBufferIn);
1864cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1865cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1866cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check if the output buffer is large enough to hold the input buffer.
1867cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if ((*bufferOutSize) > length)
1868cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1869cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the input buffer is not M4OSA_NULL.
1870cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (M4OSA_NULL != pBufferIn)
1871cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1872cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Copy the temp path, ignore the result.
1873cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_chrNCopy((M4OSA_Char *)pBufferOut, (M4OSA_Char *)pBufferIn, length);
1874cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1875cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        else
1876cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1877cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Set the output buffer to an empty string.
1878cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (*(M4OSA_Char *)pBufferOut) = 0;
1879cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1880cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1881cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else
1882cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1883cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // The buffer is too small.
1884cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        result = M4xVSSWAR_BUFFER_OUT_TOO_SMALL;
1885cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1886cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1887cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Return the buffer output size.
1888cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    (*bufferOutSize) = length + 1;
1889cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1890cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Return the result.
1891cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return(result);
1892cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
1893cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1894cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic M4OSA_ERR
1895cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_getTextRgbBufferFct(
1896cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_Void*                         pRenderingData,
1897cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_Void*                         pTextBuffer,
1898cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4OSA_UInt32                        textBufferSize,
1899cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                M4VIFI_ImagePlane**                 pOutputPlane)
1900cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
1901cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR result = M4NO_ERROR;
1902cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1903cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_getTextRgbBufferFct()");
1904cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1905cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Return the result.
1906cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return(result);
1907cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
1908cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1909cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void
1910cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_callOnProgressUpdate(
1911cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                ManualEditContext*                  pContext,
1912cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                int                                 task,
1913cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                int                                 progress)
1914cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
1915cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    JNIEnv* pEnv = NULL;
1916cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1917cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1918cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Attach the current thread.
1919cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext->pVM->AttachCurrentThread(&pEnv, NULL);
1920cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1921cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1922cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Call the on completion callback.
1923cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEnv->CallVoidMethod(pContext->engine, pContext->onProgressUpdateMethodId,
1924cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi     videoEditJava_getEngineCToJava(task), progress);
1925cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1926cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1927cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Detach the current thread.
1928cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext->pVM->DetachCurrentThread();
1929cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
1930cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1931cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void
1932cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_freeContext(
1933cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
1934cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                ManualEditContext**                 ppContext)
1935cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
1936cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext = M4OSA_NULL;
1937cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1938cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_freeContext");
1939cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1940cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the context pointer.
1941cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext = (*ppContext);
1942cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1943cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check if the context was set.
1944cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (M4OSA_NULL != pContext)
1945cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
1946cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if a global reference to the engine object was set.
1947cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (NULL != pContext->engine)
1948cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1949cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Free the global reference.
1950cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pEnv->DeleteGlobalRef(pContext->engine);
1951cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->engine = NULL;
1952cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1953cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1954cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the temp path was set.
1955cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (M4OSA_NULL != pContext->initParams.pTempPath)
1956cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1957cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Free the memory allocated for the temp path.
1958cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditOsal_free(pContext->initParams.pTempPath);
1959cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->initParams.pTempPath = M4OSA_NULL;
1960cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1961cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1962cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the file writer was set.
1963cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (M4OSA_NULL != pContext->initParams.pFileWritePtr)
1964cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1965cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Free the memory allocated for the file writer.
1966cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditOsal_free(pContext->initParams.pFileWritePtr);
1967cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->initParams.pFileWritePtr = M4OSA_NULL;
1968cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1969cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1970cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the file reader was set.
1971cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (M4OSA_NULL != pContext->initParams.pFileReadPtr)
1972cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
1973cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Free the memory allocated for the file reader.
1974cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditOsal_free(pContext->initParams.pFileReadPtr);
1975cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->initParams.pFileReadPtr = M4OSA_NULL;
1976cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
1977cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1978cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Free the memory allocated for the context.
1979cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditOsal_free(pContext);
1980cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext = M4OSA_NULL;
1981cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1982cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Reset the context pointer.
1983cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (*ppContext) = M4OSA_NULL;
1984cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
1985cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
1986cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1987cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic jobject
1988cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_getVersion(
1989cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
1990cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz)
1991cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
1992cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool           isSuccessful          = true;
1993cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jobject        version         = NULL;
1994cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4_VersionInfo versionInfo     = {0, 0, 0, 0};
1995cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR      result          = M4NO_ERROR;
1996cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1997cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_getVersion()");
1998cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
1999cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    versionInfo.m_structSize = sizeof(versionInfo);
2000cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    versionInfo.m_major = VIDEOEDITOR_VERSION_MAJOR;
2001cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    versionInfo.m_minor = VIDEOEDITOR_VERSION_MINOR;
2002cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    versionInfo.m_revision = VIDEOEDITOR_VERSION_REVISION;
2003cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2004cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_getVersion() major %d,\
2005cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi     minor %d, revision %d", versionInfo.m_major, versionInfo.m_minor, versionInfo.m_revision);
2006cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2007cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Create a version object.
2008cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditClasses_createVersion(&isSuccessful, pEnv, &versionInfo, &version);
2009cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2010cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Return the version object.
2011cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return(version);
2012cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
2013cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2014cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void
2015cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_init(
2016cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
2017cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz,
2018cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jstring                             tempPath,
2019cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jstring                             libraryPath)
2020cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
2021cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool                  initialized            = true;
2022cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext*    pContext               = M4OSA_NULL;
2023cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VideoEditJava_EngineMethodIds methodIds              = {NULL};
2024cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Char*           pLibraryPath           = M4OSA_NULL;
2025cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Char*           pTextRendererPath      = M4OSA_NULL;
2026cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32          textRendererPathLength = 0;
2027cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR             result                 = M4NO_ERROR;
2028cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2029cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_init()");
2030cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2031cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Add a text marker (the condition must always be true).
2032cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ADD_TEXT_MARKER_FUN(NULL != pEnv)
2033cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2034cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
2035cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext = (ManualEditContext*)videoEditClasses_getContext(&initialized, pEnv, thiz);
2036cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2037cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the engine method ids.
2038cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_getEngineMethodIds(&initialized, pEnv, &methodIds);
2039cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2040cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Validate the tempPath parameter.
2041cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalArgumentException(&initialized, pEnv,
2042cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                (NULL == tempPath),
2043cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                "tempPath is null");
2044cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2045cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was not set already.
2046cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&initialized, pEnv,
2047cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL != pContext),
2048cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "already initialized");
2049cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2050cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check if the initialization succeeded (required because of dereferencing of psContext,
2051cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // and freeing when initialization fails).
2052cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (initialized)
2053cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
2054cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Allocate a new context.
2055cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext = new ManualEditContext;
2056cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2057cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the initialization succeeded (required because of dereferencing of psContext).
2058cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        //if (initialized)
2059cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pContext != NULL)
2060cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2061cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Set the state to not initialized.
2062cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->state = ManualEditState_NOT_INITIALIZED;
2063cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2064cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Allocate a file read pointer structure.
2065cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->initParams.pFileReadPtr =
2066cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             (M4OSA_FileReadPointer*)videoEditOsal_alloc(&initialized, pEnv,
2067cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi              sizeof(M4OSA_FileReadPointer), "FileReadPointer");
2068cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2069cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Allocate a file write pointer structure.
2070cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->initParams.pFileWritePtr =
2071cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             (M4OSA_FileWriterPointer*)videoEditOsal_alloc(&initialized, pEnv,
2072cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi              sizeof(M4OSA_FileWriterPointer), "FileWriterPointer");
2073cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2074cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Get the temp path.
2075cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_Char* tmpString =
2076cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                (M4OSA_Char *)videoEditJava_getString(&initialized, pEnv, tempPath,
2077cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                NULL, M4OSA_NULL);
2078cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->initParams.pTempPath = (M4OSA_Char *)
2079cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                 M4OSA_malloc(M4OSA_chrLength(tmpString) + 1, 0x0,
2080cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                 (M4OSA_Char *)"tempPath");
2081cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            //initialize the first char. so that strcat works.
2082cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_Char *ptmpChar = (M4OSA_Char*)pContext->initParams.pTempPath;
2083cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            ptmpChar[0] = 0x00;
2084cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_chrNCat((M4OSA_Char*)pContext->initParams.pTempPath, tmpString, M4OSA_chrLength(tmpString));
2085cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_chrNCat((M4OSA_Char*)pContext->initParams.pTempPath, (M4OSA_Char*)"/", 1);
2086cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_free((M4OSA_MemAddr32)tmpString);
2087cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2088cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2089cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the initialization succeeded
2090cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // (required because of dereferencing of pContext, pFileReadPtr and pFileWritePtr).
2091cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (initialized)
2092cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2093cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2094cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Initialize the OSAL file system function pointers.
2095cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditOsal_getFilePointers(pContext->initParams.pFileReadPtr ,
2096cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                          pContext->initParams.pFileWritePtr);
2097cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2098cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Set the UTF8 conversion functions.
2099cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->initParams.pConvToUTF8Fct   = videoEditor_toUTF8Fct;
2100cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->initParams.pConvFromUTF8Fct = videoEditor_fromUTF8Fct;
2101cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2102cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Set the callback method ids.
2103cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->onProgressUpdateMethodId = methodIds.onProgressUpdate;
2104cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2105cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Set the virtual machine.
2106cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pEnv->GetJavaVM(&(pContext->pVM));
2107cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2108cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Create a global reference to the engine object.
2109cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->engine = pEnv->NewGlobalRef(thiz);
2110cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2111cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Check if the global reference could be created.
2112cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditJava_checkAndThrowRuntimeException(&initialized, pEnv,
2113cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             (NULL == pContext->engine), M4NO_ERROR);
2114cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2115cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2116cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the initialization succeeded (required because of dereferencing of pContext).
2117cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (initialized)
2118cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2119cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Log the API call.
2120cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "M4xVSS_Init()");
2121cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2122cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Initialize the visual studio library.
2123cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            result = M4xVSS_Init(&pContext->engineContext, &pContext->initParams);
2124cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2125cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Log the result.
2126cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            VIDEOEDIT_LOG_RESULT(ANDROID_LOG_INFO, "VIDEO_EDITOR",
2127cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             videoEditOsal_getResultString(result));
2128cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2129cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Check if the library could be initialized.
2130cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditJava_checkAndThrowRuntimeException(&initialized, pEnv,
2131cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             (M4NO_ERROR != result), result);
2132cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2133cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2134cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if(initialized)
2135cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2136cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mPreviewController = new VideoEditorPreviewController();
2137cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditJava_checkAndThrowIllegalStateException(&initialized, pEnv,
2138cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 (M4OSA_NULL == pContext->mPreviewController),
2139cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 "not initialized");
2140cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings =
2141cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             (M4xVSS_AudioMixingSettings *)
2142cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             M4OSA_malloc(sizeof(M4xVSS_AudioMixingSettings),0x0,
2143cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             (M4OSA_Char *)"mAudioSettings");
2144cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditJava_checkAndThrowIllegalStateException(&initialized, pEnv,
2145cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     (M4OSA_NULL == pContext->mAudioSettings),
2146cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                     "not initialized");
2147cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->pFile = M4OSA_NULL;
2148cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->bRemoveOriginal = 0;
2149cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiNbChannels = 0;
2150cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiSamplingFrequency = 0;
2151cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiExtendedSamplingFrequency = 0;
2152cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiAddCts = 0;
2153cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiAddVolume = 0;
2154cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->beginCutMs = 0;
2155cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->endCutMs = 0;
2156cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->fileType = 0;
2157cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->bLoop = 0;
2158cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiInDucking_lowVolume  = 0;
2159cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->bInDucking_enable  = 0;
2160cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiBTChannelCount  = 0;
2161cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings->uiInDucking_threshold = 0;
2162cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2163cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the library could be initialized.
2164cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (initialized)
2165cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2166cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Set the state to initialized.
2167cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->state = ManualEditState_INITIALIZED;
2168cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2169cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2170cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Set the context.
2171cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditClasses_setContext(&initialized, pEnv, thiz, (void* )pContext);
2172cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pLibraryPath = M4OSA_NULL;
2173cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2174cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->pEditSettings = M4OSA_NULL;
2175cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Cleanup if anything went wrong during initialization.
2176cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (!initialized)
2177cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2178cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Free the context.
2179cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditor_freeContext(pEnv, &pContext);
2180cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2181cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2182cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
2183cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2184cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi/*+ PROGRESS CB */
2185cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic
2186cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargiM4OSA_ERR videoEditor_processClip(
2187cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                            JNIEnv*  pEnv,
2188cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                            jobject  thiz,
2189cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                            int      unuseditemID) {
2190cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2191cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool               loaded           = true;
2192cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext         = NULL;
2193cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt8        progress         = 0;
2194cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt8        progressBase     = 0;
2195cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt8        lastProgress     = 0;
2196cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR          result           = M4NO_ERROR;
2197cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2198cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
2199cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext = (ManualEditContext*)videoEditClasses_getContext(&loaded, pEnv, thiz);
2200cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2201cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
2202cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&loaded, pEnv,
2203cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == pContext),
2204cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
2205cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2206cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // We start in Analyzing state
2207cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext->state = ManualEditState_ANALYZING;
2208cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR          completionResult = M4VSS3GPP_WAR_ANALYZING_DONE;
2209cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditState    completionState  = ManualEditState_OPENED;
2210cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditState    errorState       = ManualEditState_ANALYZING_ERROR;
2211cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2212cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // While analyzing progress goes from 0 to 50
2213cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    progressBase     = 0;
2214cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2215cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Set the text rendering function.
2216cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (M4OSA_NULL != pContext->pTextRendererFunction)
2217cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
2218cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Use the text renderer function in the library.
2219cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->pEditSettings->xVSS.pTextRenderingFct = pContext->pTextRendererFunction;
2220cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2221cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else
2222cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
2223cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Use the internal text renderer function.
2224cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->pEditSettings->xVSS.pTextRenderingFct = videoEditor_getTextRgbBufferFct;
2225cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2226cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2227cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Send the command.
2228cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("videoEditor_processClip ITEM %d Calling M4xVSS_SendCommand()", unuseditemID);
2229cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = M4xVSS_SendCommand(pContext->engineContext, pContext->pEditSettings);
2230cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("videoEditor_processClip ITEM %d M4xVSS_SendCommand() returned 0x%x",
2231cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        unuseditemID, (unsigned int) result);
2232cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2233cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Remove warnings indications (we only care about errors here)
2234cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if ((result == M4VSS3GPP_WAR_TRANSCODING_NECESSARY)
2235cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        || (result == M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED)) {
2236cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        result = M4NO_ERROR;
2237cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2238cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2239cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Send the first progress indication (=0)
2240cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("VERY FIRST PROGRESS videoEditor_processClip ITEM %d Progress indication %d",
2241cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        unuseditemID, progress);
2242cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEnv->CallVoidMethod(pContext->engine, pContext->onProgressUpdateMethodId,
2243cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        unuseditemID, progress);
2244cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2245cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check if a task is being performed.
2246cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // ??? ADD STOPPING MECHANISM
2247cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("videoEditor_processClip Entering processing loop");
2248cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    while((result == M4NO_ERROR)
2249cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        &&(pContext->state!=ManualEditState_SAVED)
2250cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        &&(pContext->state!=ManualEditState_STOPPING)) {
2251cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2252cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Perform the next processing step.
2253cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            //LOGV("LVME_processClip Entering M4xVSS_Step()");
2254cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            result = M4xVSS_Step(pContext->engineContext, &progress);
2255cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            //LOGV("LVME_processClip M4xVSS_Step() returned 0x%x", (unsigned int)result);
2256cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2257cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Log the the 1 % .. 100 % progress after processing.
2258cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            progress = progressBase + progress/2;
2259cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if (progress != lastProgress)
2260cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            {
2261cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                // Send a progress notification.
2262cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                LOGV("videoEditor_processClip ITEM %d Progress indication %d",
2263cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    unuseditemID, progress);
2264cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pEnv->CallVoidMethod(pContext->engine,
2265cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    pContext->onProgressUpdateMethodId,
2266cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    unuseditemID, progress);
2267cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                lastProgress = progress;
2268cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
2269cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2270cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Check if processing has been completed.
2271cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if (result == completionResult)
2272cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            {
2273cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                // Set the state to the completions state.
2274cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->state = completionState;
2275cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                LOGV("videoEditor_processClip ITEM %d STATE changed to %d",
2276cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    unuseditemID, pContext->state);
2277cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2278cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                // Reset progress indication, as we switch to next state
2279cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                lastProgress = 0;
2280cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2281cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                // Reset error code, as we start a new round of processing
2282cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                result = M4NO_ERROR;
2283cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2284cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                // Check if we are analyzing input
2285cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                if (pContext->state == ManualEditState_OPENED) {
2286cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    // File is opened, we must start saving it
2287cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    LOGV("videoEditor_processClip Calling M4xVSS_SaveStart()");
2288cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    result = M4xVSS_SaveStart(pContext->engineContext,
2289cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        (M4OSA_Char*)pContext->pEditSettings->pOutputFile,
2290cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        (M4OSA_UInt32)pContext->pEditSettings->uiOutputPathSize);
2291cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    LOGV("videoEditor_processClip ITEM %d SaveStart() returned 0x%x",
2292cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        unuseditemID, (unsigned int) result);
2293cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2294cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    // Set the state to saving.
2295cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    pContext->state  = ManualEditState_SAVING;
2296cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    completionState  = ManualEditState_SAVED;
2297cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    completionResult = M4VSS3GPP_WAR_SAVING_DONE;
2298cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    errorState       = ManualEditState_SAVING_ERROR;
2299cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2300cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    // While saving progress goes from 50 to 100
2301cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    progressBase     = 50;
2302cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                }
2303cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                // Check if we encoding is ongoing
2304cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                else if (pContext->state == ManualEditState_SAVED) {
2305cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    if (progress != 100) {
2306cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        // Send a progress notification.
2307cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        progress = 100;
2308cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        LOGI("videoEditor_processClip ITEM %d Last progress indication %d",
2309cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                            unuseditemID, progress);
2310cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        pEnv->CallVoidMethod(pContext->engine,
2311cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                            pContext->onProgressUpdateMethodId,
2312cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                            unuseditemID, progress);
2313cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    }
2314cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2315cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    // Stop the encoding.
2316cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    LOGV("videoEditor_processClip Calling M4xVSS_SaveStop()");
2317cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    result = M4xVSS_SaveStop(pContext->engineContext);
2318cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    LOGV("videoEditor_processClip M4xVSS_SaveStop() returned 0x%x", result);
2319cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                }
2320cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                // Other states are unexpected
2321cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                else {
2322cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    result = M4ERR_STATE;
2323cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    LOGE("videoEditor_processClip ITEM %d State ERROR 0x%x",
2324cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                        unuseditemID, (unsigned int) result);
2325cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                }
2326cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
2327cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2328cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Check if an error occurred.
2329cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if (result != M4NO_ERROR)
2330cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            {
2331cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                // Set the state to the error state.
2332cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->state = errorState;
2333cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2334cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                // Log the result.
2335cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                LOGE("videoEditor_processClip ITEM %d Processing ERROR 0x%x",
2336cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    unuseditemID, (unsigned int) result);
2337cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
2338cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2339cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2340cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Return the error result
2341cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGE("videoEditor_processClip ITEM %d END 0x%x", unuseditemID, (unsigned int) result);
2342cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return result;
2343cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
2344cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi/*+ PROGRESS CB */
2345cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2346cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int
2347cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_generateClip(
2348cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
2349cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz,
2350cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             settings) {
2351cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool               loaded   = true;
2352cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext = M4OSA_NULL;
2353cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR          result   = M4NO_ERROR;
2354cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2355cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("videoEditor_generateClip START");
2356cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2357cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
2358cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext = (ManualEditContext*)videoEditClasses_getContext(&loaded, pEnv, thiz);
2359cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2360cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    Mutex::Autolock autoLock(pContext->mLock);
2361cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2362cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Validate the settings parameter.
2363cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalArgumentException(&loaded, pEnv,
2364cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                (NULL == settings),
2365cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                "settings is null");
2366cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2367cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
2368cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&loaded, pEnv,
2369cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == pContext),
2370cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
2371cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2372cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Load the clip settings
2373cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("videoEditor_generateClip Calling videoEditor_loadSettings");
2374cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditor_loadSettings(pEnv, thiz, settings);
2375cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("videoEditor_generateClip videoEditor_loadSettings returned");
2376cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2377cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Generate the clip
2378cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("videoEditor_generateClip Calling LVME_processClip");
2379cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = videoEditor_processClip(pEnv, thiz, 0 /*item id is unused*/);
2380cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("videoEditor_generateClip videoEditor_processClip returned 0x%x", result);
2381cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2382cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Free up memory (whatever the result)
2383cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditor_unloadSettings(pEnv, thiz);
2384cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    //LVME_release(pEnv, thiz);
2385cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2386cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("videoEditor_generateClip END 0x%x", (unsigned int) result);
2387cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return result;
2388cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
2389cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2390cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void
2391cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_loadSettings(
2392cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
2393cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz,
2394cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             settings)
2395cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
2396cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool               needToBeLoaded   = true;
2397cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext = M4OSA_NULL;
2398cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2399cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_loadSettings()");
2400cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2401cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Add a code marker (the condition must always be true).
2402cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ADD_CODE_MARKER_FUN(NULL != pEnv)
2403cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2404cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
2405cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext = (ManualEditContext*)videoEditClasses_getContext(&needToBeLoaded,
2406cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                                pEnv, thiz);
2407cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2408cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Validate the settings parameter.
2409cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalArgumentException(&needToBeLoaded, pEnv,
2410cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                (NULL == settings),
2411cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                "settings is null");
2412cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2413cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
2414cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
2415cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == pContext),
2416cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
2417cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2418cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check if the context is valid (required because the context is dereferenced).
2419cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (needToBeLoaded)
2420cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
2421cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Make sure that we are in a correct state.
2422cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
2423cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                             (pContext->state != ManualEditState_INITIALIZED),
2424cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                             "settings already loaded");
2425cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2426cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Retrieve the edit settings.
2427cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if(pContext->pEditSettings != M4OSA_NULL) {
2428cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditClasses_freeEditSettings(&pContext->pEditSettings);
2429cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->pEditSettings = M4OSA_NULL;
2430cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2431cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditClasses_getEditSettings(&needToBeLoaded, pEnv, settings,
2432cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            &pContext->pEditSettings,true);
2433cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2434cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2435cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check if the edit settings could be retrieved.
2436cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (needToBeLoaded)
2437cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
2438cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Log the edit settings.
2439cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "inside load settings");
2440cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_EDIT_SETTINGS(pContext->pEditSettings);
2441cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2442cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("videoEditor_loadSettings END");
2443cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
2444cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2445cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2446cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2447cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void
2448cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_unloadSettings(
2449cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
2450cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz)
2451cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
2452cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool               needToBeUnLoaded = true;
2453cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext = M4OSA_NULL;
2454cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR          result   = M4NO_ERROR;
2455cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2456cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_unloadSettings()");
2457cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2458cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
2459cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext = (ManualEditContext*)videoEditClasses_getContext(&needToBeUnLoaded, pEnv, thiz);
2460cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2461cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
2462cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&needToBeUnLoaded, pEnv,
2463cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == pContext),
2464cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
2465cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2466cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check if the context is valid (required because the context is dereferenced).
2467cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (needToBeUnLoaded)
2468cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
2469cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        LOGV("videoEditor_unloadSettings state %d", pContext->state);
2470cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Make sure that we are in a correct state.
2471cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditJava_checkAndThrowIllegalStateException(&needToBeUnLoaded, pEnv,
2472cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                     ((pContext->state != ManualEditState_ANALYZING      ) &&
2473cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                      (pContext->state != ManualEditState_ANALYZING_ERROR) &&
2474cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                      (pContext->state != ManualEditState_OPENED         ) &&
2475cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                      (pContext->state != ManualEditState_SAVING_ERROR   ) &&
2476cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                      (pContext->state != ManualEditState_SAVED          ) &&
2477cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                      (pContext->state != ManualEditState_STOPPING       ) ),
2478cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                     "videoEditor_unloadSettings no load settings in progress");
2479cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2480cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2481cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check if we are in a correct state.
2482cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (needToBeUnLoaded)
2483cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
2484cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the thread could be stopped.
2485cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (needToBeUnLoaded)
2486cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2487cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Close the command.
2488cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            LOGV("videoEditor_unloadSettings Calling M4xVSS_CloseCommand()");
2489cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            result = M4xVSS_CloseCommand(pContext->engineContext);
2490cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            LOGV("videoEditor_unloadSettings M4xVSS_CloseCommand() returned 0x%x",
2491cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                (unsigned int)result);
2492cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2493cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Check if the command could be closed.
2494cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditJava_checkAndThrowRuntimeException(&needToBeUnLoaded, pEnv,
2495cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             (M4NO_ERROR != result), result);
2496cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2497cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2498cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the command could be closed.
2499cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (needToBeUnLoaded)
2500cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2501cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Free the edit settings.
2502cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            //videoEditClasses_freeEditSettings(&pContext->pEditSettings);
2503cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2504cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Reset the thread result.
2505cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->threadResult = M4NO_ERROR;
2506cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2507cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Reset the thread progress.
2508cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->threadProgress = 0;
2509cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2510cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Set the state to initialized.
2511cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->state = ManualEditState_INITIALIZED;
2512cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2513cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2514cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
2515cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2516cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void
2517cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_stopEncoding(
2518cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
2519cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz)
2520cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
2521cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool               stopped  = true;
2522cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext = M4OSA_NULL;
2523cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR          result   = M4NO_ERROR;
2524cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2525cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    LOGV("videoEditor_stopEncoding START");
2526cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2527cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
2528cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext = (ManualEditContext*)videoEditClasses_getContext(&stopped, pEnv, thiz);
2529cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2530cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Change state and get Lock
2531cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // This will ensure the generateClip function exits
2532cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext->state = ManualEditState_STOPPING;
2533cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    Mutex::Autolock autoLock(pContext->mLock);
2534cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2535cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Make sure that the context was set.
2536cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&stopped, pEnv,
2537cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == pContext),
2538cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
2539cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2540cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (stopped) {
2541cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2542cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the command should be closed.
2543cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pContext->state != ManualEditState_INITIALIZED)
2544cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2545cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Close the command.
2546cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            LOGV("videoEditor_stopEncoding Calling M4xVSS_CloseCommand()");
2547cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            result = M4xVSS_CloseCommand(pContext->engineContext);
2548cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            LOGV("videoEditor_stopEncoding M4xVSS_CloseCommand() returned 0x%x",
2549cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                (unsigned int)result);
2550cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2551cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2552cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the command could be closed.
2553cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditJava_checkAndThrowRuntimeException(&stopped, pEnv,
2554cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (M4NO_ERROR != result), result);
2555cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2556cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Free the edit settings.
2557cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditClasses_freeEditSettings(&pContext->pEditSettings);
2558cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2559cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Set the state to initialized.
2560cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->state = ManualEditState_INITIALIZED;
2561cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2562cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2563cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
2564cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2565cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic void
2566cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_release(
2567cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv,
2568cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                jobject                             thiz)
2569cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
2570cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool               released = true;
2571cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext = M4OSA_NULL;
2572cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR          result   = M4NO_ERROR;
2573cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2574cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "videoEditor_release()");
2575cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2576cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Add a text marker (the condition must always be true).
2577cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ADD_TEXT_MARKER_FUN(NULL != pEnv)
2578cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2579cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Get the context.
2580cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext = (ManualEditContext*)videoEditClasses_getContext(&released, pEnv, thiz);
2581cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2582cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // If context is not set, return (we consider release already happened)
2583cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pContext == NULL) {
2584cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        LOGV("videoEditor_release Nothing to do, context is aleady NULL");
2585cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return;
2586cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2587cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2588cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2589cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check if the context is valid (required because the context is dereferenced).
2590cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (released)
2591cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
2592cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pContext->state != ManualEditState_INITIALIZED)
2593cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2594cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Change state and get Lock
2595cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // This will ensure the generateClip function exits if it is running
2596cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->state = ManualEditState_STOPPING;
2597cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            Mutex::Autolock autoLock(pContext->mLock);
2598cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2599cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2600cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Reset the context.
2601cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditClasses_setContext(&released, pEnv, thiz, (void *)M4OSA_NULL);
2602cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2603cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the command should be closed.
2604cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pContext->state != ManualEditState_INITIALIZED)
2605cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2606cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Close the command.
2607cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            LOGV("videoEditor_release Calling M4xVSS_CloseCommand() state =%d",
2608cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                pContext->state);
2609cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            result = M4xVSS_CloseCommand(pContext->engineContext);
2610cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            LOGV("videoEditor_release M4xVSS_CloseCommand() returned 0x%x",
2611cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                (unsigned int)result);
2612cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2613cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Check if the command could be closed.
2614cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditJava_checkAndThrowRuntimeException(&released, pEnv,
2615cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                (M4NO_ERROR != result), result);
2616cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2617cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2618cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Cleanup the engine.
2619cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        LOGV("videoEditor_release Calling M4xVSS_CleanUp()");
2620cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        result = M4xVSS_CleanUp(pContext->engineContext);
2621cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        LOGV("videoEditor_release M4xVSS_CleanUp() returned 0x%x", (unsigned int)result);
2622cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2623cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Check if the cleanup succeeded.
2624cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditJava_checkAndThrowRuntimeException(&released, pEnv,
2625cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            (M4NO_ERROR != result), result);
2626cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2627cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Free the edit settings.
2628cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditClasses_freeEditSettings(&pContext->pEditSettings);
2629cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext->pEditSettings = M4OSA_NULL;
2630cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2631cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2632cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if(pContext->mPreviewController != M4OSA_NULL)
2633cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2634cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            delete pContext->mPreviewController;
2635cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mPreviewController = M4OSA_NULL;
2636cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2637cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2638cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Free the context.
2639cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if(pContext->mAudioSettings != M4OSA_NULL)
2640cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2641cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_free((M4OSA_MemAddr32)pContext->mAudioSettings);
2642cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pContext->mAudioSettings = M4OSA_NULL;
2643cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2644cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        videoEditor_freeContext(pEnv, &pContext);
2645cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2646cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
2647cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2648cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int
2649cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargivideoEditor_registerManualEditMethods(
2650cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JNIEnv*                             pEnv)
2651cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
2652cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int result = -1;
2653cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2654cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
2655cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi     "videoEditor_registerManualEditMethods()");
2656cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2657cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Look up the engine class
2658cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jclass engineClazz = pEnv->FindClass(MANUAL_EDIT_ENGINE_CLASS_NAME);
2659cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2660cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Clear any resulting exceptions.
2661cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEnv->ExceptionClear();
2662cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2663cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check if the engine class was found.
2664cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (NULL != engineClazz)
2665cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
2666cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Register all the methods.
2667cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pEnv->RegisterNatives(engineClazz, gManualEditMethods,
2668cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                sizeof(gManualEditMethods) / sizeof(gManualEditMethods[0])) == JNI_OK)
2669cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2670cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Success.
2671cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            result = 0;
2672cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2673cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2674cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2675cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Return the result.
2676cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return(result);
2677cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
2678cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2679cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi/*******Audio Graph*******/
2680cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2681cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic M4OSA_UInt32 getDecibelSound(M4OSA_UInt32 value)
2682cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
2683cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int dbSound = 1;
2684cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2685cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (value == 0) return 0;
2686cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2687cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (value > 0x4000 && value <= 0x8000) // 32768
2688cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 90;
2689cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x2000 && value <= 0x4000) // 16384
2690cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 84;
2691cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x1000 && value <= 0x2000) // 8192
2692cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 78;
2693cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x0800 && value <= 0x1000) // 4028
2694cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 72;
2695cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x0400 && value <= 0x0800) // 2048
2696cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 66;
2697cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x0200 && value <= 0x0400) // 1024
2698cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 60;
2699cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x0100 && value <= 0x0200) // 512
2700cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 54;
2701cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x0080 && value <= 0x0100) // 256
2702cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 48;
2703cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x0040 && value <= 0x0080) // 128
2704cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 42;
2705cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x0020 && value <= 0x0040) // 64
2706cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 36;
2707cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x0010 && value <= 0x0020) // 32
2708cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 30;
2709cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x0008 && value <= 0x0010) //16
2710cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 24;
2711cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x0007 && value <= 0x0008) //8
2712cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 24;
2713cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x0003 && value <= 0x0007) // 4
2714cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 18;
2715cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x0001 && value <= 0x0003) //2
2716cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 12;
2717cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else if (value > 0x000 && value == 0x0001) // 1
2718cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 6;
2719cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    else
2720cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbSound = 0;
2721cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2722cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return dbSound;
2723cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
2724cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2725cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargitypedef struct
2726cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
2727cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt8      *m_dataAddress;
2728cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32    m_bufferSize;
2729cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi} M4AM_Buffer;
2730cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2731cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2732cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargiM4OSA_UInt8 logLookUp[256]{
2733cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi0,120,137,146,154,159,163,167,171,173,176,178,181,182,184,186,188,189,190,192,193,
2734cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi194,195,196,198,199,199,200,201,202,203,204,205,205,206,207,207,208,209,209,210,
2735cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi211,211,212,212,213,213,214,215,215,216,216,216,217,217,218,218,219,219,220,220,
2736cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi220,221,221,222,222,222,223,223,223,224,224,224,225,225,225,226,226,226,227,227,
2737cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi227,228,228,228,229,229,229,229,230,230,230,230,231,231,231,232,232,232,232,233,
2738cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi233,233,233,233,234,234,234,234,235,235,235,235,236,236,236,236,236,237,237,237,
2739cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi237,237,238,238,238,238,238,239,239,239,239,239,240,240,240,240,240,240,241,241,
2740cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi241,241,241,241,242,242,242,242,242,242,243,243,243,243,243,243,244,244,244,244,
2741cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi244,244,245,245,245,245,245,245,245,246,246,246,246,246,246,246,247,247,247,247,
2742cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi247,247,247,247,248,248,248,248,248,248,248,249,249,249,249,249,249,249,249,250,
2743cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi250,250,250,250,250,250,250,250,251,251,251,251,251,251,251,251,252,252,252,252,
2744cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi252,252,252,252,252,253,253,253,253,253,253,253,253,253,253,254,254,254,254,254,
2745cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi254,254,254,254,255,255,255,255,255,255,255,255,255,255,255};
2746cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2747cd196d3727db641e581d4223815367a5ca5d5637Dharmaray KundargiM4OSA_ERR M4MA_generateAudioGraphFile(JNIEnv* pEnv, M4OSA_Char* pInputFileURL,
2748cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                     M4OSA_Char* pOutFileURL,
2749cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                     M4OSA_UInt32 samplesPerValue,
2750cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                     M4OSA_UInt32 channels,
2751cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                     M4OSA_UInt32 frameDuration,
2752cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                     ManualEditContext* pContext)
2753cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
2754cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR           err;
2755cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Context       outFileHandle = M4OSA_NULL;
2756cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Context       inputFileHandle = M4OSA_NULL;
2757cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4AM_Buffer         bufferIn = {0, 0};
2758cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32        peakVolumeDbValue = 0;
2759cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32        samplesCountInBytes= 0 , numBytesToRead = 0, index = 0;
2760cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32        writeCount = 0, samplesCountBigEndian = 0, volumeValuesCount = 0;
2761cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Int32         seekPos = 0;
2762cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32        fileSize = 0;
2763cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32        totalBytesRead = 0;
2764cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_UInt32        prevProgress = 0;
2765cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool                threadStarted = true;
2766cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2767cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    int dbValue = 0;
2768cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_Int16 *ptr16 ;
2769cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2770cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jclass engineClass = pEnv->FindClass(MANUAL_EDIT_ENGINE_CLASS_NAME);
2771cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    videoEditJava_checkAndThrowIllegalStateException(&threadStarted, pEnv,
2772cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             (M4OSA_NULL == engineClass),
2773cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                             "not initialized");
2774cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2775cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* register the call back function pointer */
2776cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext->onAudioGraphProgressUpdateMethodId =
2777cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pEnv->GetMethodID(engineClass, "onAudioGraphExtractProgressUpdate", "(IZ)V");
2778cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2779cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2780cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* ENTER */
2781cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "ENTER - M4MA_generateAudioGraphFile");
2782cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR",
2783cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "Audio Graph samplesPerValue %d channels %d", samplesPerValue, channels);
2784cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2785cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /******************************************************************************
2786cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        OPEN INPUT AND OUTPUT FILES
2787cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    *******************************************************************************/
2788cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    err = M4OSA_fileReadOpen (&inputFileHandle, pInputFileURL, M4OSA_kFileRead);
2789cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (inputFileHandle == M4OSA_NULL) {
2790cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_ERROR(ANDROID_LOG_INFO, "VIDEO_EDITOR",
2791cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "M4MA_generateAudioGraphFile: Cannot open input file 0x%x", err);
2792cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return err;
2793cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2794cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2795cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* get the file size for progress */
2796cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    err = M4OSA_fileReadGetOption(inputFileHandle, M4OSA_kFileReadGetFileSize,
2797cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                (M4OSA_Void**)&fileSize);
2798cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if ( err != M4NO_ERROR) {
2799cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        //LVMEL_LOG_ERROR("M4MA_generateAudioGraphFile : File write failed \n");
2800cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        jniThrowException(pEnv, "java/lang/IOException", "file size get option failed");
2801cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        //return -1;
2802cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2803cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2804cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    err = M4OSA_fileWriteOpen (&outFileHandle,(M4OSA_Char*) pOutFileURL,
2805cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_kFileCreate | M4OSA_kFileWrite);
2806cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (outFileHandle == M4OSA_NULL) {
2807cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (inputFileHandle != NULL)
2808cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
2809cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4OSA_fileReadClose(inputFileHandle);
2810cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2811cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return err;
2812cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2813cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2814cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /******************************************************************************
2815cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        PROCESS THE SAMPLES
2816cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    *******************************************************************************/
2817cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    samplesCountInBytes = (samplesPerValue * sizeof(M4OSA_UInt16) * channels);
2818cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2819cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bufferIn.m_dataAddress = (M4OSA_UInt8*)M4OSA_malloc(samplesCountInBytes*sizeof(M4OSA_UInt16), 0,
2820cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    (M4OSA_Char*)"AudioGraph" );
2821cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if ( bufferIn.m_dataAddress != M4OSA_NULL) {
2822cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        bufferIn.m_bufferSize = samplesCountInBytes*sizeof(M4OSA_UInt16);
2823cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    } else {
2824cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_ERROR(ANDROID_LOG_INFO, "VIDEO_EDITOR",
2825cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "M4MA_generateAudioGraphFile: Malloc failed for bufferIn.m_dataAddress 0x%x",\
2826cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            M4ERR_ALLOC);
2827cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        return M4ERR_ALLOC;
2828cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2829cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* sample to be converted to BIG endian ; store the frame duration */
2830cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    samplesCountBigEndian = ((frameDuration>>24)&0xff) | // move byte 3 to byte 0
2831cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    ((frameDuration<<8)&0xff0000) | // move byte 1 to byte 2
2832cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    ((frameDuration>>8)&0xff00) | // move byte 2 to byte 1
2833cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    ((frameDuration<<24)&0xff000000); // byte 0 to byte 3
2834cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2835cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* write the samples per value supplied to out file */
2836cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    err = M4OSA_fileWriteData (outFileHandle, (M4OSA_MemAddr8)&samplesCountBigEndian,
2837cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        sizeof(M4OSA_UInt32) );
2838cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (err != M4NO_ERROR) {
2839cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        jniThrowException(pEnv, "java/lang/IOException", "file write failed");
2840cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2841cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2842cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2843cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* write UIn32 value 0 for no of values as place holder */
2844cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    samplesCountBigEndian = 0; /* reusing local var */
2845cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    err = M4OSA_fileWriteData (outFileHandle, (M4OSA_MemAddr8)&samplesCountBigEndian,
2846cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        sizeof(M4OSA_UInt32) );
2847cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (err != M4NO_ERROR) {
2848cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        jniThrowException(pEnv, "java/lang/IOException", "file write failed");
2849cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2850cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2851cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* loop until EOF */
2852cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    do
2853cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
2854cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        M4OSA_memset((M4OSA_MemAddr8)bufferIn.m_dataAddress,bufferIn.m_bufferSize, 0);
2855cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2856cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        numBytesToRead = samplesCountInBytes;
2857cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2858cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        err =  M4OSA_fileReadData(  inputFileHandle,
2859cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    (M4OSA_MemAddr8)bufferIn.m_dataAddress,
2860cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    &numBytesToRead );
2861cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2862cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (err != M4NO_ERROR) {
2863cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // if out value of bytes-read is 0, break
2864cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if ( numBytesToRead == 0) {
2865cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                VIDEOEDIT_LOG_ERROR(ANDROID_LOG_INFO, "VIDEO_EDITOR", "numBytesToRead 0x%x",\
2866cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                numBytesToRead);
2867cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                break; /* stop if file is empty or EOF */
2868cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
2869cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2870cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2871cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        ptr16 = (M4OSA_Int16*)bufferIn.m_dataAddress;
2872cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2873cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        peakVolumeDbValue = 0;
2874cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        index = 0;
2875cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2876cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // loop through half the lenght frame bytes read 'cause its 16 bits samples
2877cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        while (index < (numBytesToRead / 2)) {
2878cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            /* absolute values of 16 bit sample */
2879cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if (ptr16[index] < 0) {
2880cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                ptr16[index] = -(ptr16[index]);
2881cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
2882cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            peakVolumeDbValue = (peakVolumeDbValue > (M4OSA_UInt32)ptr16[index] ?\
2883cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             peakVolumeDbValue : (M4OSA_UInt32)ptr16[index]);
2884cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            index++;
2885cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2886cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2887cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // move 7 bits , ignore sign bit
2888cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbValue = (peakVolumeDbValue >> 7);
2889cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        dbValue = logLookUp[(M4OSA_UInt8)dbValue];
2890cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2891cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        err = M4OSA_fileWriteData (outFileHandle, (M4OSA_MemAddr8)&dbValue, sizeof(M4OSA_UInt8) );
2892cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (err != M4NO_ERROR) {
2893cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            VIDEOEDIT_LOG_ERROR(ANDROID_LOG_INFO, "VIDEO_EDITOR",
2894cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi             "M4MA_generateAudioGraphFile : File write failed");
2895cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            break;
2896cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2897cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2898cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        volumeValuesCount ++;
2899cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        totalBytesRead += numBytesToRead;
2900cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2901cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if ((((totalBytesRead*100)/fileSize)) != prevProgress) {
2902cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if ( (pContext->threadProgress != prevProgress) && (prevProgress != 0 )) {
2903cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                //pContext->threadProgress = prevProgress;
2904cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                //onWveformProgressUpdateMethodId(prevProgress, 0);
2905cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                //LVME_callAudioGraphOnProgressUpdate(pContext, 0, prevProgress);
2906cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            pEnv->CallVoidMethod(pContext->engine,
2907cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 pContext->onAudioGraphProgressUpdateMethodId,
2908cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                 prevProgress, 0);
2909cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "pContext->threadProgress %d",
2910cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                             prevProgress);
2911cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
2912cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2913cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        prevProgress = (((totalBytesRead*100)/fileSize));
2914cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2915cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    } while (numBytesToRead != 0);
2916cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2917cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_ERROR(ANDROID_LOG_INFO, "VIDEO_EDITOR", "loop 0x%x", volumeValuesCount);
2918cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2919cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* if some error occured in fwrite */
2920cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (numBytesToRead != 0) {
2921cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        //err = -1;
2922cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        jniThrowException(pEnv, "java/lang/IOException", "numBytesToRead != 0 ; file write failed");
2923cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2924cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2925cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* write the count in place holder after seek */
2926cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    seekPos = sizeof(M4OSA_UInt32);
2927cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    err = M4OSA_fileWriteSeek(outFileHandle, M4OSA_kFileSeekBeginning,
2928cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            &seekPos /* after samples per value */);
2929cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if ( err != M4NO_ERROR) {
2930cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        jniThrowException(pEnv, "java/lang/IOException", "file seek failed");
2931cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    } else {
2932cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        volumeValuesCount = ((volumeValuesCount>>24)&0xff) | // move byte 3 to byte 0
2933cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    ((volumeValuesCount<<8)&0xff0000) | // move byte 1 to byte 2
2934cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    ((volumeValuesCount>>8)&0xff00) |  // move byte 2 to byte 1
2935cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                    ((volumeValuesCount<<24)&0xff000000); // byte 0 to byte 3
2936cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2937cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        err = M4OSA_fileWriteData (outFileHandle, (M4OSA_MemAddr8)&volumeValuesCount,
2938cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                    sizeof(M4OSA_UInt32) );
2939cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if ( err != M4NO_ERROR) {
2940cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(pEnv, "java/lang/IOException", "file write failed");
2941cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2942cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2943cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2944cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /******************************************************************************
2945cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    CLOSE AND FREE ALLOCATIONS
2946cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    *******************************************************************************/
2947cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_free((M4OSA_MemAddr32)bufferIn.m_dataAddress);
2948cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_fileReadClose(inputFileHandle);
2949cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_fileWriteClose(outFileHandle);
2950cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* final finish callback */
2951cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pEnv->CallVoidMethod(pContext->engine, pContext->onAudioGraphProgressUpdateMethodId, 100, 0);
2952cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2953cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* EXIT */
2954cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "EXIT - M4MA_generateAudioGraphFile");
2955cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2956cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return err;
2957cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
2958cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2959cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargistatic int videoEditor_generateAudioWaveFormSync (JNIEnv*  pEnv, jobject thiz,
2960cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                  jstring pcmfilePath,
2961cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                  jstring outGraphfilePath,
2962cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                  jint frameDuration, jint channels,
2963cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                                                  jint samplesCount)
2964cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
2965cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    M4OSA_ERR result = M4NO_ERROR;
2966cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ManualEditContext* pContext = M4OSA_NULL;
2967cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool needToBeLoaded = true;
2968cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2969cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR",
2970cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "videoEditor_generateAudioWaveFormSync() ");
2971cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2972cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* Get the context. */
2973cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    pContext = (ManualEditContext*)videoEditClasses_getContext(&needToBeLoaded, pEnv, thiz);
2974cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pContext == M4OSA_NULL) {
2975cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR",
2976cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            "videoEditor_generateAudioWaveFormSync() - pContext is NULL ");
2977cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2978cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2979cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR",
2980cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "videoEditor_generateAudioWaveFormSync Retrieving pStringOutAudioGraphFile");
2981cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2982cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    const char *pPCMFilePath = pEnv->GetStringUTFChars(pcmfilePath, NULL);
2983cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pPCMFilePath == M4OSA_NULL) {
2984cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pEnv != NULL) {
2985cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(pEnv, "java/lang/RuntimeException",
2986cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                "Input string PCMFilePath is null");
2987cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2988cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2989cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2990cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    const char *pStringOutAudioGraphFile = pEnv->GetStringUTFChars(outGraphfilePath, NULL);
2991cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pStringOutAudioGraphFile == M4OSA_NULL) {
2992cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (pEnv != NULL) {
2993cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            jniThrowException(pEnv, "java/lang/RuntimeException",
2994cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                "Input string outGraphfilePath is null");
2995cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
2996cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
2997cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
2998cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR",
2999cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "videoEditor_generateAudioWaveFormSync Generate the waveform data %s %d %d %d",
3000cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pStringOutAudioGraphFile, frameDuration, channels, samplesCount);
3001cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
3002cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    /* Generate the waveform */
3003cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    result = M4MA_generateAudioGraphFile(pEnv, (M4OSA_Char*) pPCMFilePath,
3004cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_Char*) pStringOutAudioGraphFile,
3005cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_UInt32) samplesCount,
3006cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_UInt32) channels,
3007cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        (M4OSA_UInt32)frameDuration,
3008cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pContext);
3009cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
3010cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pStringOutAudioGraphFile != NULL) {
3011cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        pEnv->ReleaseStringUTFChars(outGraphfilePath, pStringOutAudioGraphFile);
3012cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
3013cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
3014cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
3015cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        "videoEditor_generateAudioWaveFormSync pContext->bSkipState ");
3016cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
3017cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return result;
3018cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
3019cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
3020cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi/******** End Audio Graph *******/
3021cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargijint JNI_OnLoad(
3022cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                JavaVM*                             pVm,
3023cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                void*                               pReserved)
3024cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi{
3025cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    void* pEnv         = NULL;
3026cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    bool  needToBeInitialized = true;
3027cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    jint  result      = -1;
3028cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
3029cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "JNI_OnLoad()");
3030cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
3031cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Add a text marker (the condition must always be true).
3032cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    ADD_TEXT_MARKER_FUN(NULL != pVm)
3033cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
3034cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Check the JNI version.
3035cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    if (pVm->GetEnv(&pEnv, JNI_VERSION_1_4) == JNI_OK)
3036cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    {
3037cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Add a code marker (the condition must always be true).
3038cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        ADD_CODE_MARKER_FUN(NULL != pEnv)
3039cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
3040cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        // Register the manual edit JNI methods.
3041cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        if (videoEditor_registerManualEditMethods((JNIEnv*)pEnv) == 0)
3042cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        {
3043cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            // Initialize the classes.
3044cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            videoEditClasses_init(&needToBeInitialized, (JNIEnv*)pEnv);
3045cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            if (needToBeInitialized)
3046cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            {
3047cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                // Success, return valid version number.
3048cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi                result = JNI_VERSION_1_4;
3049cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi            }
3050cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi        }
3051cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    }
3052cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
3053cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    // Return the result.
3054cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi    return(result);
3055cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi}
3056cd196d3727db641e581d4223815367a5ca5d5637Dharmaray Kundargi
3057