1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18#include <VideoEditorClasses.h>
19#include <VideoEditorJava.h>
20#include <VideoEditorLogging.h>
21#include <VideoEditorOsal.h>
22
23extern "C" {
24#include <M4OSA_Clock.h>
25#include <M4OSA_CharStar.h>
26#include <M4OSA_FileCommon.h>
27#include <M4OSA_FileReader.h>
28#include <M4OSA_FileWriter.h>
29#include <M4OSA_Memory.h>
30#include <M4OSA_Debug.h>
31#include <M4OSA_Thread.h>
32#include <M4VSS3GPP_API.h>
33#include <M4xVSS_API.h>
34#include <M4VSS3GPP_ErrorCodes.h>
35#include <M4MCS_ErrorCodes.h>
36#include <M4READER_Common.h>
37#include <M4WRITER_common.h>
38#include <M4DECODER_Common.h>
39};
40
41#define VIDEOEDIT_PROP_JAVA_RESULT_STRING_MAX                     (128)
42
43#define VIDEOEDIT_JAVA__RESULT_STRING_MAX                     (128)
44
45VIDEOEDIT_JAVA_DEFINE_CONSTANTS(AudioEffect)
46{
47    VIDEOEDIT_JAVA_CONSTANT_INIT("NONE",     M4VSS3GPP_kAudioEffectType_None),
48    VIDEOEDIT_JAVA_CONSTANT_INIT("FADE_IN",  M4VSS3GPP_kAudioEffectType_FadeIn),
49    VIDEOEDIT_JAVA_CONSTANT_INIT("FADE_OUT", M4VSS3GPP_kAudioEffectType_FadeOut)
50};
51
52VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(AudioEffect, AUDIO_EFFECT_CLASS_NAME, M4OSA_NULL, M4OSA_NULL)
53
54
55VIDEOEDIT_JAVA_DEFINE_CONSTANTS(AudioFormat)
56{
57    VIDEOEDIT_JAVA_CONSTANT_INIT("NO_AUDIO",          M4VIDEOEDITING_kNoneAudio),
58    VIDEOEDIT_JAVA_CONSTANT_INIT("AMR_NB",            M4VIDEOEDITING_kAMR_NB),
59    VIDEOEDIT_JAVA_CONSTANT_INIT("AAC",               M4VIDEOEDITING_kAAC),
60    VIDEOEDIT_JAVA_CONSTANT_INIT("AAC_PLUS",          M4VIDEOEDITING_kAACplus),
61    VIDEOEDIT_JAVA_CONSTANT_INIT("ENHANCED_AAC_PLUS", M4VIDEOEDITING_keAACplus),
62    VIDEOEDIT_JAVA_CONSTANT_INIT("MP3",               M4VIDEOEDITING_kMP3),
63    VIDEOEDIT_JAVA_CONSTANT_INIT("EVRC",              M4VIDEOEDITING_kEVRC),
64    VIDEOEDIT_JAVA_CONSTANT_INIT("PCM",               M4VIDEOEDITING_kPCM),
65    VIDEOEDIT_JAVA_CONSTANT_INIT("NULL_AUDIO",        M4VIDEOEDITING_kNullAudio),
66    VIDEOEDIT_JAVA_CONSTANT_INIT("UNSUPPORTED_AUDIO", M4VIDEOEDITING_kUnsupportedAudio)
67};
68
69VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(AudioFormat, AUDIO_FORMAT_CLASS_NAME, M4OSA_NULL, M4OSA_NULL)
70
71
72VIDEOEDIT_JAVA_DEFINE_CONSTANTS(AudioSamplingFrequency)
73{
74    VIDEOEDIT_JAVA_CONSTANT_INIT("FREQ_DEFAULT", M4VIDEOEDITING_kDefault_ASF),
75    VIDEOEDIT_JAVA_CONSTANT_INIT("FREQ_8000",    M4VIDEOEDITING_k8000_ASF),
76    VIDEOEDIT_JAVA_CONSTANT_INIT("FREQ_16000",   M4VIDEOEDITING_k16000_ASF),
77    VIDEOEDIT_JAVA_CONSTANT_INIT("FREQ_22050",   M4VIDEOEDITING_k22050_ASF),
78    VIDEOEDIT_JAVA_CONSTANT_INIT("FREQ_24000",   M4VIDEOEDITING_k24000_ASF),
79    VIDEOEDIT_JAVA_CONSTANT_INIT("FREQ_32000",   M4VIDEOEDITING_k32000_ASF),
80    VIDEOEDIT_JAVA_CONSTANT_INIT("FREQ_44100",   M4VIDEOEDITING_k44100_ASF),
81    VIDEOEDIT_JAVA_CONSTANT_INIT("FREQ_48000",   M4VIDEOEDITING_k48000_ASF)
82};
83
84VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(AudioSamplingFrequency,AUDIO_SAMPLING_FREQUENCY_CLASS_NAME,
85                                     M4OSA_NULL, M4OSA_NULL)
86
87
88VIDEOEDIT_JAVA_DEFINE_CONSTANTS(AudioTransition)
89{
90    VIDEOEDIT_JAVA_CONSTANT_INIT("NONE",       M4VSS3GPP_kAudioTransitionType_None),
91    VIDEOEDIT_JAVA_CONSTANT_INIT("CROSS_FADE", M4VSS3GPP_kAudioTransitionType_CrossFade)
92};
93
94VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(AudioTransition, AUDIO_TRANSITION_CLASS_NAME, M4OSA_NULL,
95                                     M4OSA_NULL)
96
97
98static const char*
99videoEditClasses_getUnknownBitrateString(int bitrate)
100{
101    static char string[VIDEOEDIT_JAVA__RESULT_STRING_MAX] = "";
102
103    M4OSA_chrSPrintf((M4OSA_Char *)string, sizeof(string) - 1, (M4OSA_Char*)"%d", bitrate);
104
105    // Return the bitrate string.
106    return(string);
107}
108
109VIDEOEDIT_JAVA_DEFINE_CONSTANTS(Bitrate)
110{
111    VIDEOEDIT_JAVA_CONSTANT_INIT("VARIABLE",     M4VIDEOEDITING_kVARIABLE_KBPS),
112    VIDEOEDIT_JAVA_CONSTANT_INIT("UNDEFINED",    M4VIDEOEDITING_kUndefinedBitrate),
113    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_9_2_KBPS",  M4VIDEOEDITING_k9_2_KBPS),
114    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_12_2_KBPS", M4VIDEOEDITING_k12_2_KBPS),
115    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_16_KBPS",   M4VIDEOEDITING_k16_KBPS),
116    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_24_KBPS",   M4VIDEOEDITING_k24_KBPS),
117    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_32_KBPS",   M4VIDEOEDITING_k32_KBPS),
118    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_48_KBPS",   M4VIDEOEDITING_k48_KBPS),
119    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_64_KBPS",   M4VIDEOEDITING_k64_KBPS),
120    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_96_KBPS",   M4VIDEOEDITING_k96_KBPS),
121    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_128_KBPS",  M4VIDEOEDITING_k128_KBPS),
122    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_192_KBPS",  M4VIDEOEDITING_k192_KBPS),
123    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_256_KBPS",  M4VIDEOEDITING_k256_KBPS),
124    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_288_KBPS",  M4VIDEOEDITING_k288_KBPS),
125    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_384_KBPS",  M4VIDEOEDITING_k384_KBPS),
126    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_512_KBPS",  M4VIDEOEDITING_k512_KBPS),
127    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_800_KBPS",  M4VIDEOEDITING_k800_KBPS),
128/*+ New Encoder bitrates */
129    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_2_MBPS",  M4VIDEOEDITING_k2_MBPS),
130    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_5_MBPS",  M4VIDEOEDITING_k5_MBPS),
131    VIDEOEDIT_JAVA_CONSTANT_INIT("BR_8_MBPS",  M4VIDEOEDITING_k8_MBPS)
132/*- New Encoder bitrates */
133};
134
135VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(Bitrate, BITRATE_CLASS_NAME,
136 videoEditClasses_getUnknownBitrateString, videoEditClasses_getUnknownBitrateString)
137
138
139VIDEOEDIT_JAVA_DEFINE_CONSTANTS(ClipType)
140{
141    VIDEOEDIT_JAVA_CONSTANT_INIT("THREE_GPP",   M4VIDEOEDITING_kFileType_3GPP),
142    VIDEOEDIT_JAVA_CONSTANT_INIT("MP4",         M4VIDEOEDITING_kFileType_MP4),
143    VIDEOEDIT_JAVA_CONSTANT_INIT("AMR",         M4VIDEOEDITING_kFileType_AMR),
144    VIDEOEDIT_JAVA_CONSTANT_INIT("MP3",         M4VIDEOEDITING_kFileType_MP3),
145    VIDEOEDIT_JAVA_CONSTANT_INIT("PCM",         M4VIDEOEDITING_kFileType_PCM),
146    VIDEOEDIT_JAVA_CONSTANT_INIT("JPG",         M4VIDEOEDITING_kFileType_JPG),
147    VIDEOEDIT_JAVA_CONSTANT_INIT("PNG",         M4VIDEOEDITING_kFileType_PNG),
148    VIDEOEDIT_JAVA_CONSTANT_INIT("M4V",         M4VIDEOEDITING_kFileType_M4V),
149    VIDEOEDIT_JAVA_CONSTANT_INIT("UNSUPPORTED", M4VIDEOEDITING_kFileType_Unsupported)
150};
151
152VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(ClipType, FILE_TYPE_CLASS_NAME, M4OSA_NULL, M4OSA_NULL)
153
154
155VIDEOEDIT_JAVA_DEFINE_CONSTANTS(Engine)
156{
157    VIDEOEDIT_JAVA_CONSTANT_INIT("TASK_LOADING_SETTINGS",    TASK_LOADING_SETTINGS),
158    VIDEOEDIT_JAVA_CONSTANT_INIT("TASK_ENCODING",            TASK_ENCODING)
159};
160
161VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(Engine, MANUAL_EDIT_ENGINE_CLASS_NAME, M4OSA_NULL,
162                                     M4OSA_NULL)
163
164
165static const char*
166videoEditClasses_getUnknownErrorName(int error)
167{
168    static char string[VIDEOEDIT_JAVA__RESULT_STRING_MAX] = "ERR_INTERNAL";
169
170    // Format the unknown error string.
171    M4OSA_chrSPrintf((M4OSA_Char *)string, sizeof(string) - 1, (M4OSA_Char*)"ERR_INTERNAL(%s)",
172                    videoEditOsal_getResultString(error));
173
174    // Return the error string.
175    return(string);
176}
177
178static const char*
179videoEditClasses_getUnknownErrorString(int error)
180{
181    // Return the result string.
182    return(videoEditOsal_getResultString(error));
183}
184
185VIDEOEDIT_JAVA_DEFINE_CONSTANTS(Error)
186{
187    // M4OSA_Clock.h
188    VIDEOEDIT_JAVA_CONSTANT_INIT("WAR_TIMESCALE_TOO_BIG",                   \
189          M4WAR_TIMESCALE_TOO_BIG                               ),
190    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_CLOCK_BAD_REF_YEAR",                  \
191          M4ERR_CLOCK_BAD_REF_YEAR                              ),
192    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_FILE_NOT_FOUND",                      \
193          M4ERR_FILE_NOT_FOUND                                  ),
194    VIDEOEDIT_JAVA_CONSTANT_INIT("WAR_TRANSCODING_NECESSARY",               \
195          M4VSS3GPP_WAR_TRANSCODING_NECESSARY                   ),
196    VIDEOEDIT_JAVA_CONSTANT_INIT("WAR_MAX_OUTPUT_SIZE_EXCEEDED",            \
197          M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED                   ),
198    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_BUFFER_OUT_TOO_SMALL",                \
199          M4xVSSWAR_BUFFER_OUT_TOO_SMALL                        ),
200    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_NOMORE_SPACE_FOR_FILE",               \
201          M4xVSSERR_NO_MORE_SPACE                               ),
202    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INVALID_FILE_TYPE",                   \
203          M4VSS3GPP_ERR_INVALID_FILE_TYPE                       ),
204    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INVALID_EFFECT_KIND",                 \
205          M4VSS3GPP_ERR_INVALID_EFFECT_KIND                     ),
206    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INVALID_VIDEO_EFFECT_TYPE",           \
207          M4VSS3GPP_ERR_INVALID_VIDEO_EFFECT_TYPE               ),
208    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INVALID_AUDIO_EFFECT_TYPE",           \
209          M4VSS3GPP_ERR_INVALID_AUDIO_EFFECT_TYPE               ),
210    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INVALID_VIDEO_TRANSITION_TYPE",       \
211          M4VSS3GPP_ERR_INVALID_VIDEO_TRANSITION_TYPE           ),
212    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INVALID_AUDIO_TRANSITION_TYPE",       \
213          M4VSS3GPP_ERR_INVALID_AUDIO_TRANSITION_TYPE           ),
214    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INVALID_VIDEO_ENCODING_FRAME_RATE",   \
215          M4VSS3GPP_ERR_INVALID_VIDEO_ENCODING_FRAME_RATE       ),
216    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_EXTERNAL_EFFECT_NULL",                \
217          M4VSS3GPP_ERR_EXTERNAL_EFFECT_NULL                    ),
218    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_EXTERNAL_TRANSITION_NULL",            \
219          M4VSS3GPP_ERR_EXTERNAL_TRANSITION_NULL                ),
220    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_BEGIN_CUT_LARGER_THAN_DURATION",      \
221          M4VSS3GPP_ERR_BEGIN_CUT_LARGER_THAN_DURATION          ),
222    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_BEGIN_CUT_LARGER_THAN_END_CUT",       \
223          M4VSS3GPP_ERR_BEGIN_CUT_LARGER_THAN_END_CUT           ),
224    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_OVERLAPPING_TRANSITIONS",             \
225         M4VSS3GPP_ERR_OVERLAPPING_TRANSITIONS                  ),
226#ifdef M4VSS3GPP_ERR_ANALYSIS_DATA_SIZE_TOO_SMALL
227    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_ANALYSIS_DATA_SIZE_TOO_SMALL",        \
228          M4VSS3GPP_ERR_ANALYSIS_DATA_SIZE_TOO_SMALL            ),
229#endif
230    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INVALID_3GPP_FILE",                     \
231        M4VSS3GPP_ERR_INVALID_3GPP_FILE                         ),
232    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT",        \
233        M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT            ),
234    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT",        \
235        M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT            ),
236    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_AMR_EDITING_UNSUPPORTED",               \
237        M4VSS3GPP_ERR_AMR_EDITING_UNSUPPORTED                   ),
238    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INPUT_VIDEO_AU_TOO_LARGE",              \
239        M4VSS3GPP_ERR_INPUT_VIDEO_AU_TOO_LARGE                  ),
240    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INPUT_AUDIO_AU_TOO_LARGE",              \
241        M4VSS3GPP_ERR_INPUT_AUDIO_AU_TOO_LARGE                  ),
242    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INPUT_AUDIO_CORRUPTED_AU",              \
243        M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU                  ),
244#ifdef M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AMR_AU
245    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INPUT_AUDIO_CORRUPTED_AU",              \
246        M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AMR_AU              ),
247#endif
248    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_ENCODER_ACCES_UNIT_ERROR",              \
249        M4VSS3GPP_ERR_ENCODER_ACCES_UNIT_ERROR                  ),
250    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT",      \
251        M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT          ),
252    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_EDITING_UNSUPPORTED_H263_PROFILE",      \
253        M4VSS3GPP_ERR_EDITING_UNSUPPORTED_H263_PROFILE          ),
254    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_EDITING_UNSUPPORTED_MPEG4_PROFILE",     \
255        M4VSS3GPP_ERR_EDITING_UNSUPPORTED_MPEG4_PROFILE         ),
256    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_EDITING_UNSUPPORTED_MPEG4_RVLC",        \
257        M4VSS3GPP_ERR_EDITING_UNSUPPORTED_MPEG4_RVLC            ),
258    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT",      \
259        M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT          ),
260    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_EDITING_NO_SUPPORTED_STREAM_IN_FILE",   \
261        M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_STREAM_IN_FILE       ),
262    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_EDITING_NO_SUPPORTED_VIDEO_STREAM_IN_FILE",\
263     M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_VIDEO_STREAM_IN_FILE),
264    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INVALID_CLIP_ANALYSIS_VERSION",        \
265         M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION            ),
266#ifdef M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_PLATFORM
267    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INVALID_CLIP_ANALYSIS_PLATFORM",       \
268        M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_PLATFORM            ),
269#endif
270    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INCOMPATIBLE_VIDEO_FORMAT",            \
271         M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_FORMAT                ),
272    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INCOMPATIBLE_VIDEO_FRAME_SIZE",        \
273         M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_FRAME_SIZE            ),
274    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INCOMPATIBLE_VIDEO_TIME_SCALE",        \
275         M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_TIME_SCALE            ),
276    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INCOMPATIBLE_VIDEO_DATA_PARTITIONING", \
277         M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_DATA_PARTITIONING     ),
278    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_UNSUPPORTED_MP3_ASSEMBLY",             \
279         M4VSS3GPP_ERR_UNSUPPORTED_MP3_ASSEMBLY                 ),
280    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_NO_SUPPORTED_STREAM_IN_FILE",          \
281         M4VSS3GPP_ERR_NO_SUPPORTED_STREAM_IN_FILE              ),
282    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_ADDVOLUME_EQUALS_ZERO",                \
283         M4VSS3GPP_ERR_ADDVOLUME_EQUALS_ZERO                    ),
284    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_ADDCTS_HIGHER_THAN_VIDEO_DURATION",    \
285         M4VSS3GPP_ERR_ADDCTS_HIGHER_THAN_VIDEO_DURATION        ),
286    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_UNDEFINED_AUDIO_TRACK_FILE_FORMAT",    \
287         M4VSS3GPP_ERR_UNDEFINED_AUDIO_TRACK_FILE_FORMAT        ),
288    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_UNSUPPORTED_ADDED_AUDIO_STREAM",       \
289         M4VSS3GPP_ERR_UNSUPPORTED_ADDED_AUDIO_STREAM           ),
290    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_AUDIO_MIXING_UNSUPPORTED",             \
291         M4VSS3GPP_ERR_AUDIO_MIXING_UNSUPPORTED                 ),
292#ifdef M4VSS3GPP_ERR_AUDIO_MIXING_MP3_UNSUPPORTED
293    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_AUDIO_MIXING_MP3_UNSUPPORTED",         \
294          M4VSS3GPP_ERR_AUDIO_MIXING_MP3_UNSUPPORTED            ),
295#endif
296    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_FEATURE_UNSUPPORTED_WITH_AUDIO_TRACK", \
297      M4VSS3GPP_ERR_FEATURE_UNSUPPORTED_WITH_AUDIO_TRACK        ),
298#ifdef M4VSS3GPP_ERR_FEATURE_UNSUPPORTED_WITH_AAC
299    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_FEATURE_UNSUPPORTED_WITH_AAC",         \
300       M4VSS3GPP_ERR_FEATURE_UNSUPPORTED_WITH_AAC               ),
301#endif
302    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_AUDIO_CANNOT_BE_MIXED",                \
303        M4VSS3GPP_ERR_AUDIO_CANNOT_BE_MIXED                     ),
304#ifdef M4VSS3GPP_ERR_ONLY_AMRNB_INPUT_CAN_BE_MIXED
305    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_ONLY_AMRNB_INPUT_CAN_BE_MIXED",        \
306         M4VSS3GPP_ERR_ONLY_AMRNB_INPUT_CAN_BE_MIXED            ),
307#endif
308#ifdef M4VSS3GPP_ERR_FEATURE_UNSUPPORTED_WITH_EVRC
309    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_FEATURE_UNSUPPORTED_WITH_EVRC",        \
310          M4VSS3GPP_ERR_FEATURE_UNSUPPORTED_WITH_EVRC           ),
311#endif
312    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_H263_PROFILE_NOT_SUPPORTED",           \
313          M4VSS3GPP_ERR_H263_PROFILE_NOT_SUPPORTED              ),
314    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_NO_SUPPORTED_VIDEO_STREAM_IN_FILE",    \
315          M4VSS3GPP_ERR_NO_SUPPORTED_VIDEO_STREAM_IN_FILE       ),
316    VIDEOEDIT_JAVA_CONSTANT_INIT("ERR_INTERNAL",                             \
317          M4NO_ERROR                                            ),
318};
319
320VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(Error, ERROR_CLASS_NAME,
321 videoEditClasses_getUnknownErrorName, videoEditClasses_getUnknownErrorString)
322
323
324VIDEOEDIT_JAVA_DEFINE_CONSTANTS(FileType)
325{
326    VIDEOEDIT_JAVA_CONSTANT_INIT("THREE_GPP",   VideoEditClasses_kFileType_3GPP),
327    VIDEOEDIT_JAVA_CONSTANT_INIT("MP4",         VideoEditClasses_kFileType_MP4),
328    VIDEOEDIT_JAVA_CONSTANT_INIT("AMR",         VideoEditClasses_kFileType_AMR),
329    VIDEOEDIT_JAVA_CONSTANT_INIT("MP3",         VideoEditClasses_kFileType_MP3),
330    VIDEOEDIT_JAVA_CONSTANT_INIT("PCM",         VideoEditClasses_kFileType_PCM),
331    VIDEOEDIT_JAVA_CONSTANT_INIT("JPG",         VideoEditClasses_kFileType_JPG),
332    VIDEOEDIT_JAVA_CONSTANT_INIT("GIF",         VideoEditClasses_kFileType_GIF),
333    VIDEOEDIT_JAVA_CONSTANT_INIT("PNG",         VideoEditClasses_kFileType_PNG),
334    VIDEOEDIT_JAVA_CONSTANT_INIT("M4V",         VideoEditClasses_kFileType_M4V),
335    VIDEOEDIT_JAVA_CONSTANT_INIT("UNSUPPORTED", VideoEditClasses_kFileType_Unsupported)
336};
337
338VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(FileType, FILE_TYPE_CLASS_NAME, M4OSA_NULL, M4OSA_NULL)
339
340
341VIDEOEDIT_JAVA_DEFINE_CONSTANTS(MediaRendering)
342{
343    VIDEOEDIT_JAVA_CONSTANT_INIT("RESIZING",      M4xVSS_kResizing),
344    VIDEOEDIT_JAVA_CONSTANT_INIT("CROPPING",      M4xVSS_kCropping),
345    VIDEOEDIT_JAVA_CONSTANT_INIT("BLACK_BORDERS", M4xVSS_kBlackBorders)
346};
347
348VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(MediaRendering, MEDIA_RENDERING_CLASS_NAME,
349 M4OSA_NULL, M4OSA_NULL)
350
351
352VIDEOEDIT_JAVA_DEFINE_CONSTANTS(SlideDirection)
353{
354    VIDEOEDIT_JAVA_CONSTANT_INIT("RIGHT_OUT_LEFT_IN", M4xVSS_SlideTransition_RightOutLeftIn),
355    VIDEOEDIT_JAVA_CONSTANT_INIT("LEFT_OUT_RIGTH_IN", M4xVSS_SlideTransition_LeftOutRightIn),
356    VIDEOEDIT_JAVA_CONSTANT_INIT("TOP_OUT_BOTTOM_IN", M4xVSS_SlideTransition_TopOutBottomIn),
357    VIDEOEDIT_JAVA_CONSTANT_INIT("BOTTOM_OUT_TOP_IN", M4xVSS_SlideTransition_BottomOutTopIn)
358};
359
360VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(SlideDirection, SLIDE_DIRECTION_CLASS_NAME,
361 M4OSA_NULL, M4OSA_NULL)
362
363
364VIDEOEDIT_JAVA_DEFINE_CONSTANTS(TransitionBehaviour)
365{
366    VIDEOEDIT_JAVA_CONSTANT_INIT("SPEED_UP",    M4VSS3GPP_TransitionBehaviour_SpeedUp),
367    VIDEOEDIT_JAVA_CONSTANT_INIT("LINEAR",      M4VSS3GPP_TransitionBehaviour_Linear),
368    VIDEOEDIT_JAVA_CONSTANT_INIT("SPEED_DOWN",  M4VSS3GPP_TransitionBehaviour_SpeedDown),
369    VIDEOEDIT_JAVA_CONSTANT_INIT("SLOW_MIDDLE", M4VSS3GPP_TransitionBehaviour_SlowMiddle),
370    VIDEOEDIT_JAVA_CONSTANT_INIT("FAST_MIDDLE", M4VSS3GPP_TransitionBehaviour_FastMiddle)
371};
372
373VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(TransitionBehaviour, TRANSITION_BEHAVIOUR_CLASS_NAME,
374 M4OSA_NULL, M4OSA_NULL)
375
376
377VIDEOEDIT_JAVA_DEFINE_CONSTANTS(VideoEffect)
378{
379    VIDEOEDIT_JAVA_CONSTANT_INIT("NONE",            M4VSS3GPP_kVideoEffectType_None),
380    VIDEOEDIT_JAVA_CONSTANT_INIT("FADE_FROM_BLACK", M4VSS3GPP_kVideoEffectType_FadeFromBlack),
381    VIDEOEDIT_JAVA_CONSTANT_INIT("FADE_TO_BLACK",   M4VSS3GPP_kVideoEffectType_FadeToBlack),
382    VIDEOEDIT_JAVA_CONSTANT_INIT("EXTERNAL",        M4VSS3GPP_kVideoEffectType_External),
383    VIDEOEDIT_JAVA_CONSTANT_INIT("BLACK_AND_WHITE", M4xVSS_kVideoEffectType_BlackAndWhite),
384    VIDEOEDIT_JAVA_CONSTANT_INIT("PINK",            M4xVSS_kVideoEffectType_Pink),
385    VIDEOEDIT_JAVA_CONSTANT_INIT("GREEN",           M4xVSS_kVideoEffectType_Green),
386    VIDEOEDIT_JAVA_CONSTANT_INIT("SEPIA",           M4xVSS_kVideoEffectType_Sepia),
387    VIDEOEDIT_JAVA_CONSTANT_INIT("NEGATIVE",        M4xVSS_kVideoEffectType_Negative),
388    VIDEOEDIT_JAVA_CONSTANT_INIT("FRAMING",         M4xVSS_kVideoEffectType_Framing),
389    VIDEOEDIT_JAVA_CONSTANT_INIT("TEXT",            M4xVSS_kVideoEffectType_Text),
390    VIDEOEDIT_JAVA_CONSTANT_INIT("ZOOM_IN",         M4xVSS_kVideoEffectType_ZoomIn),
391    VIDEOEDIT_JAVA_CONSTANT_INIT("ZOOM_OUT",        M4xVSS_kVideoEffectType_ZoomOut),
392    VIDEOEDIT_JAVA_CONSTANT_INIT("FIFTIES",         M4xVSS_kVideoEffectType_Fifties),
393    VIDEOEDIT_JAVA_CONSTANT_INIT("COLORRGB16",      M4xVSS_kVideoEffectType_ColorRGB16),
394    VIDEOEDIT_JAVA_CONSTANT_INIT("GRADIENT",        M4xVSS_kVideoEffectType_Gradient),
395};
396
397VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(VideoEffect, VIDEO_EFFECT_CLASS_NAME, M4OSA_NULL, M4OSA_NULL)
398
399
400VIDEOEDIT_JAVA_DEFINE_CONSTANTS(VideoFormat)
401{
402    VIDEOEDIT_JAVA_CONSTANT_INIT("NO_VIDEO",    M4VIDEOEDITING_kNoneVideo),
403    VIDEOEDIT_JAVA_CONSTANT_INIT("H263",        M4VIDEOEDITING_kH263),
404    VIDEOEDIT_JAVA_CONSTANT_INIT("MPEG4",       M4VIDEOEDITING_kMPEG4),
405    VIDEOEDIT_JAVA_CONSTANT_INIT("H264",        M4VIDEOEDITING_kH264),
406    VIDEOEDIT_JAVA_CONSTANT_INIT("NULL_VIDEO",  M4VIDEOEDITING_kNullVideo),
407    VIDEOEDIT_JAVA_CONSTANT_INIT("UNSUPPORTED", M4VIDEOEDITING_kUnsupportedVideo),
408};
409
410VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(VideoFormat, VIDEO_FORMAT_CLASS_NAME, M4OSA_NULL, M4OSA_NULL)
411
412
413VIDEOEDIT_JAVA_DEFINE_CONSTANTS(VideoFrameRate)
414{
415    VIDEOEDIT_JAVA_CONSTANT_INIT("FR_5_FPS",    M4VIDEOEDITING_k5_FPS),
416    VIDEOEDIT_JAVA_CONSTANT_INIT("FR_7_5_FPS",  M4VIDEOEDITING_k7_5_FPS),
417    VIDEOEDIT_JAVA_CONSTANT_INIT("FR_10_FPS",   M4VIDEOEDITING_k10_FPS),
418    VIDEOEDIT_JAVA_CONSTANT_INIT("FR_12_5_FPS", M4VIDEOEDITING_k12_5_FPS),
419    VIDEOEDIT_JAVA_CONSTANT_INIT("FR_15_FPS",   M4VIDEOEDITING_k15_FPS),
420    VIDEOEDIT_JAVA_CONSTANT_INIT("FR_20_FPS",   M4VIDEOEDITING_k20_FPS),
421    VIDEOEDIT_JAVA_CONSTANT_INIT("FR_25_FPS",   M4VIDEOEDITING_k25_FPS),
422    VIDEOEDIT_JAVA_CONSTANT_INIT("FR_30_FPS",   M4VIDEOEDITING_k30_FPS)
423};
424
425VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(VideoFrameRate, VIDEO_FRAME_RATE_CLASS_NAME,
426 M4OSA_NULL, M4OSA_NULL)
427
428
429VIDEOEDIT_JAVA_DEFINE_CONSTANTS(VideoFrameSize)
430{
431    VIDEOEDIT_JAVA_CONSTANT_INIT("SQCIF", M4VIDEOEDITING_kSQCIF),
432    VIDEOEDIT_JAVA_CONSTANT_INIT("QQVGA", M4VIDEOEDITING_kQQVGA),
433    VIDEOEDIT_JAVA_CONSTANT_INIT("QCIF",  M4VIDEOEDITING_kQCIF),
434    VIDEOEDIT_JAVA_CONSTANT_INIT("QVGA",  M4VIDEOEDITING_kQVGA),
435    VIDEOEDIT_JAVA_CONSTANT_INIT("CIF",   M4VIDEOEDITING_kCIF),
436    VIDEOEDIT_JAVA_CONSTANT_INIT("VGA",   M4VIDEOEDITING_kVGA),
437    VIDEOEDIT_JAVA_CONSTANT_INIT("WVGA", M4VIDEOEDITING_kWVGA),
438    VIDEOEDIT_JAVA_CONSTANT_INIT("NTSC", M4VIDEOEDITING_kNTSC),
439    VIDEOEDIT_JAVA_CONSTANT_INIT("nHD", M4VIDEOEDITING_k640_360),
440    VIDEOEDIT_JAVA_CONSTANT_INIT("WVGA16x9", M4VIDEOEDITING_k854_480),
441    VIDEOEDIT_JAVA_CONSTANT_INIT("V720p", M4VIDEOEDITING_k1280_720),
442    VIDEOEDIT_JAVA_CONSTANT_INIT("W720p", M4VIDEOEDITING_k1080_720),
443    VIDEOEDIT_JAVA_CONSTANT_INIT("S720p", M4VIDEOEDITING_k960_720),
444    VIDEOEDIT_JAVA_CONSTANT_INIT("V1080p", M4VIDEOEDITING_k1920_1080)
445};
446
447VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(VideoFrameSize, VIDEO_FRAME_SIZE_CLASS_NAME,
448 M4OSA_NULL, M4OSA_NULL)
449
450VIDEOEDIT_JAVA_DEFINE_CONSTANTS(VideoTransition)
451{
452    VIDEOEDIT_JAVA_CONSTANT_INIT("NONE",             M4VSS3GPP_kVideoTransitionType_None),
453    VIDEOEDIT_JAVA_CONSTANT_INIT("CROSS_FADE",       M4VSS3GPP_kVideoTransitionType_CrossFade),
454    VIDEOEDIT_JAVA_CONSTANT_INIT("EXTERNAL",         M4VSS3GPP_kVideoTransitionType_External),
455    VIDEOEDIT_JAVA_CONSTANT_INIT("ALPHA_MAGIC",      M4xVSS_kVideoTransitionType_AlphaMagic),
456    VIDEOEDIT_JAVA_CONSTANT_INIT("SLIDE_TRANSITION", M4xVSS_kVideoTransitionType_SlideTransition),
457    VIDEOEDIT_JAVA_CONSTANT_INIT("FADE_BLACK",       M4xVSS_kVideoTransitionType_FadeBlack)
458};
459
460VIDEOEDIT_JAVA_DEFINE_CONSTANT_CLASS(VideoTransition, VIDEO_TRANSITION_CLASS_NAME,
461                                     M4OSA_NULL, M4OSA_NULL)
462
463
464VIDEOEDIT_JAVA_DEFINE_FIELDS(AlphaMagic)
465{
466    VIDEOEDIT_JAVA_FIELD_INIT("file",            "Ljava/lang/String;"),
467    VIDEOEDIT_JAVA_FIELD_INIT("blendingPercent", "I"                 ),
468    VIDEOEDIT_JAVA_FIELD_INIT("invertRotation",  "Z"                 ),
469    VIDEOEDIT_JAVA_FIELD_INIT("rgbWidth",  "I"                 ),
470    VIDEOEDIT_JAVA_FIELD_INIT("rgbHeight",  "I"                 )
471};
472
473VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(AlphaMagic, ALPHA_MAGIC_SETTINGS_CLASS_NAME)
474
475VIDEOEDIT_JAVA_DEFINE_FIELDS(Properties)
476{
477    VIDEOEDIT_JAVA_FIELD_INIT("duration",               "I"),
478    VIDEOEDIT_JAVA_FIELD_INIT("fileType",               "I"),
479    VIDEOEDIT_JAVA_FIELD_INIT("videoFormat",            "I"),
480    VIDEOEDIT_JAVA_FIELD_INIT("videoDuration",          "I"),
481    VIDEOEDIT_JAVA_FIELD_INIT("videoBitrate",           "I"),
482    VIDEOEDIT_JAVA_FIELD_INIT("width",                  "I"),
483    VIDEOEDIT_JAVA_FIELD_INIT("height",                 "I"),
484    VIDEOEDIT_JAVA_FIELD_INIT("averageFrameRate",       "F"),
485    VIDEOEDIT_JAVA_FIELD_INIT("profile",                "I"),
486    VIDEOEDIT_JAVA_FIELD_INIT("level",                  "I"),
487    VIDEOEDIT_JAVA_FIELD_INIT("profileSupported",       "Z"),
488    VIDEOEDIT_JAVA_FIELD_INIT("levelSupported",         "Z"),
489    VIDEOEDIT_JAVA_FIELD_INIT("audioFormat",            "I"),
490    VIDEOEDIT_JAVA_FIELD_INIT("audioDuration",          "I"),
491    VIDEOEDIT_JAVA_FIELD_INIT("audioBitrate",           "I"),
492    VIDEOEDIT_JAVA_FIELD_INIT("audioChannels",          "I"),
493    VIDEOEDIT_JAVA_FIELD_INIT("audioSamplingFrequency", "I"),
494    VIDEOEDIT_JAVA_FIELD_INIT("videoRotation",          "I")
495};
496
497VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(Properties, PROPERTIES_CLASS_NAME)
498
499VIDEOEDIT_JAVA_DEFINE_FIELDS(BackgroundMusic)
500{
501    VIDEOEDIT_JAVA_FIELD_INIT("file",          "Ljava/lang/String;"),
502    VIDEOEDIT_JAVA_FIELD_INIT("fileType",      "I"                 ),
503    VIDEOEDIT_JAVA_FIELD_INIT("insertionTime", "J"                 ),
504    VIDEOEDIT_JAVA_FIELD_INIT("volumePercent", "I"                 ),
505    VIDEOEDIT_JAVA_FIELD_INIT("beginLoop",     "J"                 ),
506    VIDEOEDIT_JAVA_FIELD_INIT("endLoop",       "J"                 ),
507    VIDEOEDIT_JAVA_FIELD_INIT("enableDucking",   "Z"               ),
508    VIDEOEDIT_JAVA_FIELD_INIT("duckingThreshold","I"               ),
509    VIDEOEDIT_JAVA_FIELD_INIT("lowVolume",         "I"             ),
510    VIDEOEDIT_JAVA_FIELD_INIT("isLooping",         "Z"             )
511};
512
513VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(BackgroundMusic, BACKGROUND_MUSIC_SETTINGS_CLASS_NAME)
514
515/*
516VIDEOEDIT_JAVA_DEFINE_FIELDS(BestEditSettings)
517{
518    VIDEOEDIT_JAVA_FIELD_INIT("videoFormat",    "I"),
519    VIDEOEDIT_JAVA_FIELD_INIT("videoFrameSize", "I"),
520    VIDEOEDIT_JAVA_FIELD_INIT("audioFormat",    "I"),
521    VIDEOEDIT_JAVA_FIELD_INIT("audioChannels",  "I")
522};
523
524VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(BestEditSettings, BEST_EDIT_SETTINGS_CLASS_NAME)
525*/
526
527VIDEOEDIT_JAVA_DEFINE_FIELDS(ClipSettings)
528{
529    VIDEOEDIT_JAVA_FIELD_INIT("clipPath",             "Ljava/lang/String;"),
530    VIDEOEDIT_JAVA_FIELD_INIT("fileType",             "I"                 ),
531    VIDEOEDIT_JAVA_FIELD_INIT("beginCutTime",         "I"                 ),
532    VIDEOEDIT_JAVA_FIELD_INIT("endCutTime",           "I"                 ),
533    VIDEOEDIT_JAVA_FIELD_INIT("beginCutPercent",      "I"                 ),
534    VIDEOEDIT_JAVA_FIELD_INIT("endCutPercent",        "I"                 ),
535    VIDEOEDIT_JAVA_FIELD_INIT("panZoomEnabled",       "Z"                 ),
536    VIDEOEDIT_JAVA_FIELD_INIT("panZoomPercentStart",  "I"                 ),
537    VIDEOEDIT_JAVA_FIELD_INIT("panZoomTopLeftXStart", "I"                 ),
538    VIDEOEDIT_JAVA_FIELD_INIT("panZoomTopLeftYStart", "I"                 ),
539    VIDEOEDIT_JAVA_FIELD_INIT("panZoomPercentEnd",    "I"                 ),
540    VIDEOEDIT_JAVA_FIELD_INIT("panZoomTopLeftXEnd",   "I"                 ),
541    VIDEOEDIT_JAVA_FIELD_INIT("panZoomTopLeftYEnd",   "I"                 ),
542    VIDEOEDIT_JAVA_FIELD_INIT("mediaRendering",       "I"                 ),
543    VIDEOEDIT_JAVA_FIELD_INIT("rgbWidth",           "I"                 ),
544    VIDEOEDIT_JAVA_FIELD_INIT("rgbHeight",          "I"                 ),
545    VIDEOEDIT_JAVA_FIELD_INIT("rotationDegree",     "I"                 )
546};
547
548VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(ClipSettings, CLIP_SETTINGS_CLASS_NAME)
549
550
551VIDEOEDIT_JAVA_DEFINE_FIELDS(EditSettings)
552{
553    VIDEOEDIT_JAVA_FIELD_INIT("clipSettingsArray",       "[L"CLIP_SETTINGS_CLASS_NAME";"         ),
554    VIDEOEDIT_JAVA_FIELD_INIT("transitionSettingsArray", "[L"TRANSITION_SETTINGS_CLASS_NAME";"   ),
555    VIDEOEDIT_JAVA_FIELD_INIT("effectSettingsArray",     "[L"EFFECT_SETTINGS_CLASS_NAME";"       ),
556    VIDEOEDIT_JAVA_FIELD_INIT("videoFrameRate",          "I"                                     ),
557    VIDEOEDIT_JAVA_FIELD_INIT("outputFile",              "Ljava/lang/String;"                    ),
558    VIDEOEDIT_JAVA_FIELD_INIT("videoFrameSize",          "I"                                     ),
559    VIDEOEDIT_JAVA_FIELD_INIT("videoFormat",             "I"                                     ),
560    VIDEOEDIT_JAVA_FIELD_INIT("videoProfile",            "I"                                     ),
561    VIDEOEDIT_JAVA_FIELD_INIT("videoLevel",              "I"                                     ),
562    VIDEOEDIT_JAVA_FIELD_INIT("audioFormat",             "I"                                     ),
563    VIDEOEDIT_JAVA_FIELD_INIT("audioSamplingFreq",       "I"                                     ),
564    VIDEOEDIT_JAVA_FIELD_INIT("maxFileSize",             "I"                                     ),
565    VIDEOEDIT_JAVA_FIELD_INIT("audioChannels",           "I"                                     ),
566    VIDEOEDIT_JAVA_FIELD_INIT("videoBitrate",            "I"                                     ),
567    VIDEOEDIT_JAVA_FIELD_INIT("audioBitrate",            "I"                                     ),
568    VIDEOEDIT_JAVA_FIELD_INIT("backgroundMusicSettings",\
569    "L"BACKGROUND_MUSIC_SETTINGS_CLASS_NAME";"),
570    VIDEOEDIT_JAVA_FIELD_INIT("primaryTrackVolume",            "I"                               )
571};
572
573VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(EditSettings, EDIT_SETTINGS_CLASS_NAME)
574
575
576VIDEOEDIT_JAVA_DEFINE_FIELDS(EffectSettings)
577{
578    VIDEOEDIT_JAVA_FIELD_INIT("startTime",                       "I"                 ),
579    VIDEOEDIT_JAVA_FIELD_INIT("duration",                        "I"                 ),
580    VIDEOEDIT_JAVA_FIELD_INIT("videoEffectType",                 "I"                 ),
581    VIDEOEDIT_JAVA_FIELD_INIT("audioEffectType",                 "I"                 ),
582    VIDEOEDIT_JAVA_FIELD_INIT("startPercent",                    "I"                 ),
583    VIDEOEDIT_JAVA_FIELD_INIT("durationPercent",                 "I"                 ),
584    VIDEOEDIT_JAVA_FIELD_INIT("framingFile",                     "Ljava/lang/String;"),
585    VIDEOEDIT_JAVA_FIELD_INIT("framingBuffer",                   "[I"                ),
586    VIDEOEDIT_JAVA_FIELD_INIT("bitmapType",                      "I"                 ),
587    VIDEOEDIT_JAVA_FIELD_INIT("width",                           "I"                 ),
588    VIDEOEDIT_JAVA_FIELD_INIT("height",                          "I"                 ),
589    VIDEOEDIT_JAVA_FIELD_INIT("topLeftX",                        "I"                 ),
590    VIDEOEDIT_JAVA_FIELD_INIT("topLeftY",                        "I"                 ),
591    VIDEOEDIT_JAVA_FIELD_INIT("framingResize",                   "Z"                 ),
592    VIDEOEDIT_JAVA_FIELD_INIT("framingScaledSize",               "I"                 ),
593    VIDEOEDIT_JAVA_FIELD_INIT("text",                            "Ljava/lang/String;"),
594    VIDEOEDIT_JAVA_FIELD_INIT("textRenderingData",               "Ljava/lang/String;"),
595    VIDEOEDIT_JAVA_FIELD_INIT("textBufferWidth",                 "I"                 ),
596    VIDEOEDIT_JAVA_FIELD_INIT("textBufferHeight",                "I"                 ),
597    VIDEOEDIT_JAVA_FIELD_INIT("fiftiesFrameRate",                "I"                 ),
598    VIDEOEDIT_JAVA_FIELD_INIT("rgb16InputColor",                 "I"                 ),
599    VIDEOEDIT_JAVA_FIELD_INIT("alphaBlendingStartPercent",       "I"                 ),
600    VIDEOEDIT_JAVA_FIELD_INIT("alphaBlendingMiddlePercent",      "I"                 ),
601    VIDEOEDIT_JAVA_FIELD_INIT("alphaBlendingEndPercent",         "I"                 ),
602    VIDEOEDIT_JAVA_FIELD_INIT("alphaBlendingFadeInTimePercent",  "I"                 ),
603    VIDEOEDIT_JAVA_FIELD_INIT("alphaBlendingFadeOutTimePercent", "I"                 )
604};
605
606VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(EffectSettings, EFFECT_SETTINGS_CLASS_NAME)
607
608
609VIDEOEDIT_JAVA_DEFINE_FIELDS(Engine)
610{
611    VIDEOEDIT_JAVA_FIELD_INIT("mManualEditContext", "I")
612};
613
614VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(Engine, MANUAL_EDIT_ENGINE_CLASS_NAME)
615
616
617VIDEOEDIT_JAVA_DEFINE_FIELDS(SlideTransitionSettings)
618{
619    VIDEOEDIT_JAVA_FIELD_INIT("direction", "I")
620};
621
622VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(SlideTransitionSettings, SLIDE_TRANSITION_SETTINGS_CLASS_NAME)
623
624
625VIDEOEDIT_JAVA_DEFINE_FIELDS(TransitionSettings)
626{
627    VIDEOEDIT_JAVA_FIELD_INIT("duration",            "I"                                       ),
628    VIDEOEDIT_JAVA_FIELD_INIT("videoTransitionType", "I"                                       ),
629    VIDEOEDIT_JAVA_FIELD_INIT("audioTransitionType", "I"                                       ),
630    VIDEOEDIT_JAVA_FIELD_INIT("transitionBehaviour", "I"                                       ),
631    VIDEOEDIT_JAVA_FIELD_INIT("alphaSettings",       "L"ALPHA_MAGIC_SETTINGS_CLASS_NAME";"     ),
632    VIDEOEDIT_JAVA_FIELD_INIT("slideSettings",       "L"SLIDE_TRANSITION_SETTINGS_CLASS_NAME";")
633};
634
635VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(TransitionSettings, TRANSITION_SETTINGS_CLASS_NAME)
636
637
638VIDEOEDIT_JAVA_DEFINE_FIELDS(Version)
639{
640    VIDEOEDIT_JAVA_FIELD_INIT("major",    "I"),
641    VIDEOEDIT_JAVA_FIELD_INIT("minor",    "I"),
642    VIDEOEDIT_JAVA_FIELD_INIT("revision", "I")
643};
644
645VIDEOEDIT_JAVA_DEFINE_FIELD_CLASS(Version, VERSION_CLASS_NAME)
646
647
648VIDEOEDIT_JAVA_DEFINE_METHODS(Engine)
649{
650    VIDEOEDIT_JAVA_METHOD_INIT("onProgressUpdate", "(II)V")
651};
652
653VIDEOEDIT_JAVA_DEFINE_METHOD_CLASS(Engine, MANUAL_EDIT_ENGINE_CLASS_NAME)
654
655
656static const char*
657videoEditClasses_getBrandString(M4OSA_UInt32 brand)
658{
659    static char         brandString[11] = "0x00000000";
660           const char*  pBrandString    = M4OSA_NULL;
661           M4OSA_UInt8* pBrand          = (M4OSA_UInt8*)&brand;
662           M4OSA_UInt32 brandHost       = 0;
663
664    // Convert the brand from big endian to host.
665    brandHost =  pBrand[0];
666    brandHost =  brandHost << 8;
667    brandHost += pBrand[1];
668    brandHost =  brandHost << 8;
669    brandHost += pBrand[2];
670    brandHost =  brandHost << 8;
671    brandHost += pBrand[3];
672
673    switch (brandHost)
674    {
675    case M4VIDEOEDITING_BRAND_0000:
676        pBrandString = "0000";
677        break;
678    case M4VIDEOEDITING_BRAND_3G2A:
679        pBrandString = "3G2A";
680        break;
681    case M4VIDEOEDITING_BRAND_3GP4:
682        pBrandString = "3GP4";
683        break;
684    case M4VIDEOEDITING_BRAND_3GP5:
685        pBrandString = "3GP5";
686        break;
687    case M4VIDEOEDITING_BRAND_3GP6:
688        pBrandString = "3GP6";
689        break;
690    case M4VIDEOEDITING_BRAND_AVC1:
691        pBrandString = "AVC1";
692        break;
693    case M4VIDEOEDITING_BRAND_EMP:
694        pBrandString = "EMP";
695        break;
696    case M4VIDEOEDITING_BRAND_ISOM:
697        pBrandString = "ISOM";
698        break;
699    case M4VIDEOEDITING_BRAND_MP41:
700        pBrandString = "MP41";
701        break;
702    case M4VIDEOEDITING_BRAND_MP42:
703        pBrandString = "MP42";
704        break;
705    case M4VIDEOEDITING_BRAND_VFJ1:
706        pBrandString = "VFJ1";
707        break;
708    default:
709        M4OSA_chrSPrintf((M4OSA_Char *)brandString,
710                         sizeof(brandString) - 1,
711                         (M4OSA_Char*)"0x%08X", brandHost);
712        pBrandString = brandString;
713        break;
714    }
715
716    // Return the brand string.
717    return(pBrandString);
718}
719
720#ifdef VIDEOEDIT_LOGGING_ENABLED
721static void
722videoEditClasses_logFtypBox(
723                M4VIDEOEDITING_FtypBox*             pBox,
724                int                                 indentation)
725{
726    // Check if memory was allocated for the FtypBox.
727    if (M4OSA_NULL != pBox)
728    {
729        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
730                "%*c major_brand:        %s",    indentation, ' ',
731                 videoEditClasses_getBrandString(pBox->major_brand));
732        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
733                "%*c minor_version:      %08X",  indentation, ' ',
734                (unsigned int)pBox->minor_version);
735        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
736                "%*c nbCompatibleBrands: %u",    indentation, ' ',
737                (unsigned int)pBox->nbCompatibleBrands);
738        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
739                "%*c compatible_brands:", indentation, ' ');
740                indentation += VIDEOEDIT_LOG_INDENTATION;
741        for (int i = 0; (i < (int)pBox->nbCompatibleBrands) &&\
742         (i < M4VIDEOEDITING_MAX_COMPATIBLE_BRANDS); i++)
743        {
744            VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
745                    "%*c compatible_brand[%d]: %s",    indentation, ' ',
746                    i, videoEditClasses_getBrandString(pBox->compatible_brands[i]));
747        }
748        indentation -= VIDEOEDIT_LOG_INDENTATION;
749    }
750    else
751    {
752        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c <null>",
753                 indentation, ' ');
754    }
755}
756#endif
757
758
759void
760videoEditClasses_init(
761                bool*                               pResult,
762                JNIEnv*                             pEnv)
763{
764    // Check if the previous action succeeded.
765    if (*pResult)
766    {
767        // Log the function call.
768        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",\
769        "videoEditClasses_init()");
770
771        // Initialize the constants.
772        videoEditJava_initAudioEffectConstants(pResult, pEnv);
773        videoEditJava_initAudioFormatConstants(pResult, pEnv);
774        videoEditJava_initAudioSamplingFrequencyConstants(pResult, pEnv);
775        videoEditJava_initAudioTransitionConstants(pResult, pEnv);
776        videoEditJava_initBitrateConstants(pResult, pEnv);
777        videoEditJava_initClipTypeConstants(pResult, pEnv);
778        videoEditJava_initEngineConstants(pResult, pEnv);
779        videoEditJava_initErrorConstants(pResult, pEnv);
780        videoEditJava_initFileTypeConstants(pResult, pEnv);
781        videoEditJava_initMediaRenderingConstants(pResult, pEnv);
782        videoEditJava_initSlideDirectionConstants(pResult, pEnv);
783        videoEditJava_initTransitionBehaviourConstants(pResult, pEnv);
784        videoEditJava_initVideoEffectConstants(pResult, pEnv);
785        videoEditJava_initVideoFormatConstants(pResult, pEnv);
786        videoEditJava_initVideoFrameRateConstants(pResult, pEnv);
787        videoEditJava_initVideoFrameSizeConstants(pResult, pEnv);
788        videoEditJava_initVideoTransitionConstants(pResult, pEnv);
789
790        // Initialize the fields.
791        videoEditJava_initAlphaMagicFields(pResult, pEnv);
792        videoEditJava_initBackgroundMusicFields(pResult, pEnv);
793        videoEditJava_initClipSettingsFields(pResult, pEnv);
794        videoEditJava_initEditSettingsFields(pResult, pEnv);
795        videoEditJava_initEffectSettingsFields(pResult, pEnv);
796        videoEditJava_initEngineFields(pResult, pEnv);
797        videoEditJava_initSlideTransitionSettingsFields(pResult, pEnv);
798        videoEditJava_initTransitionSettingsFields(pResult, pEnv);
799        videoEditJava_initVersionFields(pResult, pEnv);
800        // Initialize the methods.
801        videoEditJava_initEngineMethods(pResult, pEnv);
802    }
803}
804
805void
806videoEditPropClass_init(
807                bool*                               pResult,
808                JNIEnv*                             pEnv)
809{
810    // Check if the previous action succeeded.
811    if (*pResult)
812    {
813        // Log the function call.
814        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",\
815            "videoEditPropClass_init()");
816
817        // Initialize the constants.
818        videoEditJava_initAudioFormatConstants(pResult, pEnv);
819        videoEditJava_initErrorConstants(pResult, pEnv);
820        videoEditJava_initFileTypeConstants(pResult, pEnv);
821        videoEditJava_initVideoFormatConstants(pResult, pEnv);
822
823        // Initialize the fields.
824        videoEditJava_initPropertiesFields(pResult, pEnv);
825    }
826}
827
828void
829videoEditClasses_getAlphaMagicSettings(
830                bool*                               pResult,
831                JNIEnv*                             pEnv,
832                jobject                             object,
833                M4xVSS_AlphaMagicSettings**         ppSettings)
834{
835    VideoEditJava_AlphaMagicFieldIds fieldIds;
836    M4xVSS_AlphaMagicSettings* pSettings = M4OSA_NULL;
837    memset(&fieldIds, 0, sizeof(VideoEditJava_AlphaMagicFieldIds));
838
839    // Check if the previous action succeeded.
840    if (*pResult)
841    {
842        // Log the function call.
843        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
844                   "videoEditClasses_getAlphaMagicSettings()");
845
846        // Retrieve the field ids.
847        videoEditJava_getAlphaMagicFieldIds(pResult, pEnv, &fieldIds);
848    }
849
850    // Only validate the AlphaMagicSettings if the fields could be located.
851    if (*pResult)
852    {
853        // Check if the clip is set.
854        videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
855                                                    (NULL == object),
856                                                    "alphaSettings is null");
857    }
858
859    // Only retrieve the AlphaMagicSettings if the fields could be located and validated.
860    if (*pResult)
861    {
862        // Allocate memory for the AlphaMagicSettings.
863        pSettings = (M4xVSS_AlphaMagicSettings*)videoEditOsal_alloc(pResult, pEnv,
864                sizeof(M4xVSS_AlphaMagicSettings), "AlphaMagicSettings");
865
866        // Check if memory could be allocated for the AlphaMagicSettings.
867        if (*pResult)
868        {
869            // Set the alpha magic file path (JPG file).
870            pSettings->pAlphaFilePath = (M4OSA_Char*)videoEditJava_getString(pResult, pEnv, object,
871                    fieldIds.file, M4OSA_NULL);
872
873            // Check if the alpha magic file path is valid.
874            videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
875                    (M4OSA_NULL == pSettings->pAlphaFilePath), "alphaSettings.file is null");
876        }
877
878        // Check if the alpha file path could be retrieved.
879        if (*pResult)
880        {
881            // Set the blending percentage between 0 and 100.
882            pSettings->blendingPercent = (M4OSA_UInt8)pEnv->GetIntField(object,
883                    fieldIds.blendingPercent);
884
885            // Set the direct effect or reverse.
886            pSettings->isreverse = (M4OSA_Bool)pEnv->GetBooleanField(object,
887                    fieldIds.invertRotation);
888
889            // Get the rgb width
890            pSettings->width = (M4OSA_UInt32) pEnv->GetIntField(object, fieldIds.rgbWidth );
891
892            pSettings->height = (M4OSA_UInt32) pEnv->GetIntField(object, fieldIds.rgbHeight );
893
894             VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
895                    "((((((((((path %s", pSettings->pAlphaFilePath);
896
897            VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
898                    "------- getAlphaMagicSettings width %d", pEnv->GetIntField(object,
899                    fieldIds.rgbWidth ));
900            VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
901                   "-------- getAlphaMagicSettings Height %d",
902                   pEnv->GetIntField(object, fieldIds.rgbHeight ));
903        }
904
905        // Check if settings could be set.
906        if (*pResult)
907        {
908            // Return the settings.
909            (*ppSettings) = pSettings;
910        }
911        else
912        {
913            // Free the settings.
914            videoEditClasses_freeAlphaMagicSettings(&pSettings);
915        }
916    }
917}
918
919void
920videoEditClasses_freeAlphaMagicSettings(
921                M4xVSS_AlphaMagicSettings**         ppSettings)
922{
923    // Check if memory was allocated for the AlphaMagicSettings.
924    if (M4OSA_NULL != (*ppSettings))
925    {
926        // Log the function call.
927        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
928                  "videoEditClasses_freeAlphaMagicSettings()");
929
930        // Free the alpha file path.
931        videoEditOsal_free((*ppSettings)->pAlphaFilePath);
932        (*ppSettings)->pAlphaFilePath = M4OSA_NULL;
933
934        // Free the settings structure.
935        videoEditOsal_free((*ppSettings));
936        (*ppSettings) = M4OSA_NULL;
937    }
938}
939
940#ifdef VIDEOEDIT_LOGGING_ENABLED
941void
942videoEditClasses_logAlphaMagicSettings(
943                M4xVSS_AlphaMagicSettings*          pSettings,
944                int                                 indentation)
945{
946    // Check if memory was allocated for the AlphaMagicSettings.
947    if (M4OSA_NULL != pSettings)
948    {
949        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
950             "%*c pAlphaFilePath:  %s",    indentation, ' ',
951            (M4OSA_NULL != pSettings->pAlphaFilePath) ? \
952            (char *)pSettings->pAlphaFilePath : "<null>");
953        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
954             "%*c blendingPercent: %u %%", indentation, ' ',
955            (unsigned int)pSettings->blendingPercent);
956        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
957            "%*c isreverse:       %s",    indentation, ' ',
958            pSettings->isreverse ? "true" : "false");
959    }
960    else
961    {
962        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
963            "%*c <null>", indentation, ' ');
964    }
965}
966#endif
967
968
969void
970videoEditClasses_getBackgroundMusicSettings(
971                bool*                               pResult,
972                JNIEnv*                             pEnv,
973                jobject                             object,
974                M4xVSS_BGMSettings**                ppSettings)
975{
976    VideoEditJava_BackgroundMusicFieldIds fieldIds;
977    M4xVSS_BGMSettings*           pSettings = M4OSA_NULL;
978    bool                          converted = true;
979    memset(&fieldIds, 0, sizeof(VideoEditJava_BackgroundMusicFieldIds));
980    // Check if the previous action succeeded.
981    if (*pResult)
982    {
983        // Log the function call.
984        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
985               "videoEditClasses_getBackgroundMusicSettings()");
986
987        // Retrieve the field ids.
988        videoEditJava_getBackgroundMusicFieldIds(pResult, pEnv, &fieldIds);
989    }
990
991    // Only retrieve the BackgroundMusicSettings if the fields could be located.
992    if (*pResult)
993    {
994        // Check if the object is valid.
995        if (NULL != object)
996        {
997            // Allocate memory for the BackgroundMusicSettings.
998            pSettings = (M4xVSS_BGMSettings*)videoEditOsal_alloc(pResult, pEnv,
999                sizeof(M4xVSS_BGMSettings), "BackgroundMusicSettings");
1000
1001            // Check if memory could be allocated for the BackgroundMusicSettings.
1002            if (*pResult)
1003            {
1004                // Set the input file path.
1005                pSettings->pFile = (M4OSA_Char*)videoEditJava_getString(pResult, pEnv, object,
1006                        fieldIds.file, M4OSA_NULL);
1007
1008                // Check if the input file path is valid.
1009                videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
1010                        (M4OSA_NULL == pSettings->pFile), "backgroundMusicSettings.file is null");
1011            }
1012
1013            // Check if the input file path could be retrieved.
1014            if (*pResult)
1015            {
1016                // Set the file type .3gp, .amr, .mp3.
1017                pSettings->FileType = M4VIDEOEDITING_kFileType_PCM;
1018                /*(M4VIDEOEDITING_FileType)videoEditJava_getClipTypeJavaToC(
1019                 &converted, pEnv->GetIntField(object, fieldIds.fileType));*/
1020
1021                // Check if the file type is valid.
1022                videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
1023                        !converted, "backgroundMusicSettings.fileType is invalid");
1024            }
1025
1026            // Check if the file type could be retrieved.
1027            if (*pResult)
1028            {
1029                // Set the time, in milliseconds, at which the added audio track is inserted.
1030                pSettings->uiAddCts = (M4OSA_UInt32)pEnv->GetLongField(object,
1031                        fieldIds.insertionTime);
1032
1033                // Set the volume, in percentage (0..100), of the added audio track.
1034                pSettings->uiAddVolume = (M4OSA_UInt32)pEnv->GetIntField(object,
1035                        fieldIds.volumePercent);
1036
1037                // Set the start time of the loop in milli seconds.
1038                pSettings->uiBeginLoop = (M4OSA_UInt32)pEnv->GetLongField(object,
1039                        fieldIds.beginLoop);
1040
1041                // Set the end time of the loop in milli seconds.
1042                pSettings->uiEndLoop = (M4OSA_UInt32)pEnv->GetLongField(object,
1043                        fieldIds.endLoop);
1044                // Set the end time of the loop in milli seconds.
1045                pSettings->b_DuckingNeedeed =
1046                        (M4OSA_Bool)pEnv->GetBooleanField(object, fieldIds.enableDucking);
1047
1048                // Set the end time of the loop in milli seconds.
1049                pSettings->InDucking_threshold =
1050                        (M4OSA_Int32)pEnv->GetIntField(object, fieldIds.duckingThreshold);
1051
1052                // Set the end time of the loop in milli seconds.
1053                pSettings->lowVolume =
1054                        (M4OSA_Float)(((M4OSA_Float)pEnv->GetIntField(object, fieldIds.lowVolume)));
1055
1056                // Set the end time of the loop in milli seconds.
1057                pSettings->bLoop = (M4OSA_Bool)pEnv->GetBooleanField(object, fieldIds.isLooping);
1058
1059                // Set sampling freq and channels
1060                pSettings->uiSamplingFrequency = M4VIDEOEDITING_k32000_ASF;
1061                pSettings->uiNumChannels = 2;
1062            }
1063
1064            // Check if settings could be set.
1065            if (*pResult)
1066            {
1067                // Return the settings.
1068                (*ppSettings) = pSettings;
1069            }
1070            else
1071            {
1072                // Free the settings.
1073                videoEditClasses_freeBackgroundMusicSettings(&pSettings);
1074            }
1075        }
1076    }
1077}
1078
1079void
1080videoEditClasses_freeBackgroundMusicSettings(
1081                M4xVSS_BGMSettings**                ppSettings)
1082{
1083    // Check if memory was allocated for the BackgroundMusicSettings.
1084    if (M4OSA_NULL != (*ppSettings))
1085    {
1086        // Log the function call.
1087        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1088         "videoEditClasses_freeBackgroundMusicSettings()");
1089
1090        // Free the input file path.
1091        videoEditOsal_free((*ppSettings)->pFile);
1092        (*ppSettings)->pFile = M4OSA_NULL;
1093
1094        // Free the settings structure.
1095        videoEditOsal_free((*ppSettings));
1096        (*ppSettings) = M4OSA_NULL;
1097    }
1098}
1099
1100#ifdef VIDEOEDIT_LOGGING_ENABLED
1101void
1102videoEditClasses_logBackgroundMusicSettings(
1103                M4xVSS_BGMSettings*                 pSettings,
1104                int                                 indentation)
1105{
1106    // Check if memory was allocated for the BackgroundMusicSettings.
1107    if (M4OSA_NULL != pSettings)
1108    {
1109        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c pFile:       %s",
1110            indentation, ' ',
1111            (M4OSA_NULL != pSettings->pFile) ? (char *)pSettings->pFile : "<null>");
1112        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1113            "%*c FileType:    %s",    indentation, ' ',
1114            videoEditJava_getClipTypeString(pSettings->FileType));
1115
1116        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c uiAddCts:    %u ms",
1117            indentation, ' ', (unsigned int)pSettings->uiAddCts);
1118        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c uiAddVolume: %u %%",
1119            indentation, ' ', (unsigned int)pSettings->uiAddVolume);
1120        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c uiBeginLoop: %u ms",
1121            indentation, ' ', (unsigned int)pSettings->uiBeginLoop);
1122        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c uiEndLoop:   %u ms",
1123            indentation, ' ', (unsigned int)pSettings->uiEndLoop);
1124        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c b_DuckingNeedeed:\
1125            %u ", indentation, ' ', (bool)pSettings->b_DuckingNeedeed);
1126        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c InDucking_threshold: \
1127            %u ms", indentation, ' ', (unsigned int)pSettings->InDucking_threshold);
1128        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c lowVolume:   %2.2f ",\
1129            indentation, ' ', (float)pSettings->lowVolume);
1130        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c bLoop:   %u ms",\
1131            indentation, ' ', (bool)pSettings->bLoop);
1132    }
1133    else
1134    {
1135        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c <null>",
1136            indentation, ' ');
1137    }
1138}
1139#endif
1140
1141#ifdef VIDEOEDIT_LOGGING_ENABLED
1142void
1143videoEditClasses_logClipProperties(
1144                M4VIDEOEDITING_ClipProperties*      pProperties,
1145                int                                 indentation)
1146{
1147    // Check if memory was allocated for the ClipProperties.
1148    if (M4OSA_NULL != pProperties)
1149    {
1150        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1151            "%*c bAnalysed:                        %s",       indentation, ' ',
1152            pProperties->bAnalysed ? "true" : "false");
1153        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1154            "%*c Version:                          %d.%d.%d", indentation, ' ',
1155            pProperties->Version[0], pProperties->Version[1], pProperties->Version[2]);
1156        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1157            "%*c uiClipDuration:                   %u",       indentation, ' ',
1158            (unsigned int)pProperties->uiClipDuration);
1159        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1160            "%*c FileType:                         %s",       indentation, ' ',
1161            videoEditJava_getClipTypeString(pProperties->FileType));
1162        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c ftyp:",
1163                                              indentation, ' ');
1164        videoEditClasses_logFtypBox(&pProperties->ftyp, indentation + VIDEOEDIT_LOG_INDENTATION);
1165
1166        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1167            "%*c VideoStreamType:                  %s",       indentation, ' ',
1168            videoEditJava_getVideoFormatString(pProperties->VideoStreamType));
1169        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1170            "%*c uiClipVideoDuration:              %u",       indentation, ' ',
1171            (unsigned int)pProperties->uiClipVideoDuration);
1172        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1173            "%*c uiVideoBitrate:                   %s",       indentation, ' ',
1174            videoEditJava_getBitrateString(pProperties->uiVideoBitrate));
1175        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1176            "%*c uiVideoMaxAuSize:                 %u",       indentation, ' ',
1177            (unsigned int)pProperties->uiVideoMaxAuSize);
1178        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1179            "%*c uiVideoWidth:                     %u",       indentation, ' ',
1180            (unsigned int)pProperties->uiVideoWidth);
1181        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1182            "%*c uiVideoHeight:                    %u",       indentation, ' ',
1183            (unsigned int)(unsigned int)pProperties->uiVideoHeight);
1184        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1185            "%*c uiVideoTimeScale:                 %u",       indentation, ' ',
1186            (unsigned int)pProperties->uiVideoTimeScale);
1187        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1188            "%*c fAverageFrameRate:                %.3f",     indentation, ' ',
1189            pProperties->fAverageFrameRate);
1190        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1191            "%*c bMPEG4dataPartition:              %s",       indentation, ' ',
1192            pProperties->bMPEG4dataPartition ? "true" : "false");
1193        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1194            "%*c bMPEG4rvlc:                       %s",       indentation, ' ',
1195            pProperties->bMPEG4rvlc ? "true" : "false");
1196        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1197            "%*c bMPEG4resynchMarker:              %s",       indentation, ' ',
1198            pProperties->bMPEG4resynchMarker ? "true" : "false");
1199        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1200            "%*c AudioStreamType:                  %s",       indentation, ' ',
1201            videoEditJava_getAudioFormatString(pProperties->AudioStreamType));
1202        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1203            "%*c uiClipAudioDuration:              %u",       indentation, ' ',
1204            (unsigned int)pProperties->uiClipAudioDuration);
1205        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1206            "%*c uiAudioBitrate:                   %s",       indentation, ' ',
1207            videoEditJava_getBitrateString(pProperties->uiAudioBitrate));
1208        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1209            "%*c uiAudioMaxAuSize:                 %u",       indentation, ' ',
1210            (unsigned int)pProperties->uiAudioMaxAuSize);
1211        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1212            "%*c uiNbChannels:                     %u",       indentation, ' ',
1213            (unsigned int)pProperties->uiNbChannels);
1214        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1215            "%*c uiSamplingFrequency:              %u",       indentation, ' ',
1216            (unsigned int)pProperties->uiSamplingFrequency);
1217        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1218            "%*c uiExtendedSamplingFrequency:      %u",       indentation, ' ',
1219            (unsigned int)pProperties->uiExtendedSamplingFrequency);
1220        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1221            "%*c uiDecodedPcmSize:                 %u",       indentation, ' ',
1222            (unsigned int)pProperties->uiDecodedPcmSize);
1223        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1224            "%*c bVideoIsEditable:                 %s",       indentation, ' ',
1225            pProperties->bVideoIsEditable ? "true" : "false");
1226        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1227            "%*c bAudioIsEditable:                 %s",       indentation, ' ',
1228            pProperties->bAudioIsEditable ? "true" : "false");
1229        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1230            "%*c bVideoIsCompatibleWithMasterClip: %s",       indentation, ' ',
1231            pProperties->bVideoIsCompatibleWithMasterClip ? "true" : "false");
1232        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1233            "%*c bAudioIsCompatibleWithMasterClip: %s",       indentation, ' ',
1234            pProperties->bAudioIsCompatibleWithMasterClip ? "true" : "false");
1235        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1236            "%*c uiClipAudioVolumePercentage:      %d",       indentation, ' ',
1237                        pProperties->uiClipAudioVolumePercentage);
1238    }
1239    else
1240    {
1241        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "%*c <null>",
1242            indentation, ' ');
1243    }
1244}
1245#endif
1246
1247void
1248videoEditClasses_getClipSettings(
1249                bool*                               pResult,
1250                JNIEnv*                             pEnv,
1251                jobject                             object,
1252                M4VSS3GPP_ClipSettings**            ppSettings)
1253{
1254
1255    VideoEditJava_ClipSettingsFieldIds fieldIds;
1256    M4VSS3GPP_ClipSettings*    pSettings = M4OSA_NULL;
1257    M4OSA_ERR                  result    = M4NO_ERROR;
1258    bool                       converted = true;
1259    memset(&fieldIds, 0, sizeof(VideoEditJava_ClipSettingsFieldIds));
1260    // Check if the previous action succeeded.
1261    if (*pResult)
1262    {
1263        // Log the function call.
1264        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1265            "videoEditClasses_getClipSettings()");
1266
1267        // Retrieve the field ids.
1268        videoEditJava_getClipSettingsFieldIds(pResult, pEnv, &fieldIds);
1269    }
1270
1271    // Only validate the ClipSettings if the fields could be located.
1272    if (*pResult)
1273    {
1274        // Check if the clip is set.
1275        videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
1276                                                    (NULL == object),
1277                                                    "clip is null");
1278    }
1279
1280    // Only retrieve the ClipSettings if the fields could be located and validated.
1281    if (*pResult)
1282    {
1283        // Allocate memory for the ClipSettings.
1284        pSettings = (M4VSS3GPP_ClipSettings *)videoEditOsal_alloc(pResult, pEnv,
1285            sizeof(M4VSS3GPP_ClipSettings), "ClipSettings");
1286
1287        // Check if memory could be allocated for the ClipSettings.
1288        if (*pResult)
1289        {
1290            // Log the API call.
1291            VIDEOEDIT_LOG_API(ANDROID_LOG_INFO, "VIDEO_EDITOR", "M4xVSS_CreateClipSettings()");
1292
1293            // Initialize the ClipSettings.
1294            result = M4xVSS_CreateClipSettings(pSettings, NULL, 0, 0);
1295
1296            // Log the result.
1297            VIDEOEDIT_LOG_RESULT(ANDROID_LOG_INFO, "VIDEO_EDITOR",
1298                videoEditOsal_getResultString(result));
1299
1300            // Check if the initialization succeeded.
1301            videoEditJava_checkAndThrowRuntimeException(pResult, pEnv,
1302                (M4NO_ERROR != result), result);
1303        }
1304
1305        // Check if the allocation and initialization succeeded
1306        //(required because pSettings is dereferenced).
1307        if (*pResult)
1308        {
1309            // Set the input file path.
1310            pSettings->pFile = (M4OSA_Char*)videoEditJava_getString(pResult, pEnv, object,
1311                fieldIds.clipPath, &pSettings->filePathSize);
1312
1313            // Check if the file path is valid.
1314            videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
1315                    (M4OSA_NULL == pSettings->pFile), "clip.clipPath is null");
1316        }
1317
1318        // Check if the input file could be retrieved.
1319        if (*pResult)
1320        {
1321            // Set the file type .3gp, .amr, .mp3.
1322            pSettings->FileType = (M4VIDEOEDITING_FileType)videoEditJava_getClipTypeJavaToC(
1323                                        &converted, pEnv->GetIntField(object, fieldIds.fileType));
1324
1325            if (( pSettings->FileType == M4VIDEOEDITING_kFileType_JPG) ||
1326                 ( pSettings->FileType == M4VIDEOEDITING_kFileType_PNG)) {
1327                 pSettings->FileType = M4VIDEOEDITING_kFileType_ARGB8888;
1328            }
1329
1330            // Check if the file type is valid.
1331            videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
1332                    !converted, "clip.fileType is invalid");
1333        }
1334
1335        // Check if the file type could be retrieved.
1336        if (*pResult)
1337        {
1338            // Set the begin cut time, in milliseconds.
1339            pSettings->uiBeginCutTime =
1340                (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.beginCutTime);
1341
1342            // Set the end cut time, in milliseconds.
1343            pSettings->uiEndCutTime = (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.endCutTime);
1344
1345            // Set the begin cut time, in percent of clip duration (only for 3GPP clip !).
1346            pSettings->xVSS.uiBeginCutPercent =
1347                (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.beginCutPercent);
1348
1349            // Set the end cut time, in percent of clip duration (only for 3GPP clip !).
1350            pSettings->xVSS.uiEndCutPercent =
1351                (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.endCutPercent);
1352
1353            // Set the duration of the clip, if different from 0,
1354            // has priority on uiEndCutTime or uiEndCutPercent.
1355            pSettings->xVSS.uiDuration = 0;
1356
1357            // Set whether or not the pan and zoom mode is enabled.
1358            pSettings->xVSS.isPanZoom =
1359                (M4OSA_Bool)pEnv->GetBooleanField(object, fieldIds.panZoomEnabled);
1360
1361            // Set the pan and zoom start zoom percentage.
1362            pSettings->xVSS.PanZoomXa        =
1363                (M4OSA_UInt16)pEnv->GetIntField(object, fieldIds.panZoomPercentStart);
1364
1365            // Set the pan and zoom start x.
1366            pSettings->xVSS.PanZoomTopleftXa =
1367                (M4OSA_UInt16)pEnv->GetIntField(object, fieldIds.panZoomTopLeftXStart);
1368
1369            // Set the pan and zoom start y.
1370            pSettings->xVSS.PanZoomTopleftYa =
1371                (M4OSA_UInt16)pEnv->GetIntField(object, fieldIds.panZoomTopLeftYStart);
1372
1373            // Set the pan and zoom end zoom percentage.
1374            pSettings->xVSS.PanZoomXb        =
1375                (M4OSA_UInt16)pEnv->GetIntField(object, fieldIds.panZoomPercentEnd);
1376
1377            // Set the pan and zoom end x.
1378            pSettings->xVSS.PanZoomTopleftXb =
1379                (M4OSA_UInt16)pEnv->GetIntField(object, fieldIds.panZoomTopLeftXEnd);
1380
1381            // Set the pan and zoom end y.
1382            pSettings->xVSS.PanZoomTopleftYb =
1383                (M4OSA_UInt16)pEnv->GetIntField(object, fieldIds.panZoomTopLeftYEnd);
1384
1385            // Set the media rendering mode, only used with JPEG to crop, resize,
1386            // or render black borders.
1387            pSettings->xVSS.MediaRendering =
1388                (M4xVSS_MediaRendering)videoEditJava_getMediaRenderingJavaToC(
1389                    &converted, pEnv->GetIntField(object,fieldIds.mediaRendering));
1390
1391            // Check if the media rendering is valid.
1392            videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, !converted,
1393                "clip.mediaRendering is invalid");
1394
1395             // Capture the rgb file width and height
1396            pSettings->ClipProperties.uiStillPicWidth =
1397                (M4OSA_UInt16)pEnv->GetIntField(object, fieldIds.rgbFileWidth);
1398            pSettings->ClipProperties.uiStillPicHeight  =
1399                (M4OSA_UInt16)pEnv->GetIntField(object, fieldIds.rgbFileHeight);
1400
1401            VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", \
1402                "getClipSettings-- rgbFileWidth %d ",
1403                pSettings->ClipProperties.uiStillPicWidth);
1404            VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", \
1405                "getClipSettings-- rgbFileHeight %d ",
1406                pSettings->ClipProperties.uiStillPicHeight);
1407
1408            // Set the video rotation degree
1409            pSettings->ClipProperties.videoRotationDegrees =
1410                (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.rotationDegree);
1411        }
1412
1413        // Check if settings could be set.
1414        if (*pResult)
1415        {
1416            // Return the settings.
1417            (*ppSettings) = pSettings;
1418        }
1419        else
1420        {
1421            // Free the settings.
1422            videoEditClasses_freeClipSettings(&pSettings);
1423        }
1424    }
1425}
1426
1427void
1428videoEditClasses_createClipSettings(
1429                bool*                               pResult,
1430                JNIEnv*                             pEnv,
1431                M4VSS3GPP_ClipSettings*             pSettings,
1432                jobject*                            pObject)
1433{
1434    VideoEditJava_ClipSettingsFieldIds fieldIds;
1435    jclass                     clazz    = NULL;
1436    jobject                    object   = NULL;
1437    memset(&fieldIds, 0, sizeof(VideoEditJava_ClipSettingsFieldIds));
1438
1439    // Check if the previous action succeeded.
1440    if (*pResult)
1441    {
1442        // Log the function call.
1443        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1444            "videoEditClasses_createClipSettings()");
1445
1446        // Retrieve the class.
1447        videoEditJava_getClipSettingsClass(pResult, pEnv, &clazz);
1448
1449        // Retrieve the field ids.
1450        videoEditJava_getClipSettingsFieldIds(pResult, pEnv, &fieldIds);
1451    }
1452
1453    // Only create an object if the class and fields could be located.
1454    if (*pResult)
1455    {
1456        // Allocate a new object.
1457        object = pEnv->AllocObject(clazz);
1458        if (NULL != object)
1459        {
1460            // Set the clipPath field.
1461            pEnv->SetObjectField(object, fieldIds.clipPath, NULL);
1462
1463            // Set the fileType field.
1464            pEnv->SetIntField(object, fieldIds.fileType, videoEditJava_getClipTypeCToJava(
1465                                                                    pSettings->FileType));
1466
1467            // Set the beginCutTime field.
1468            pEnv->SetIntField(object, fieldIds.beginCutTime, pSettings->uiBeginCutTime);
1469
1470            // Set the endCutTime field.
1471            pEnv->SetIntField(object, fieldIds.endCutTime, pSettings->uiEndCutTime);
1472
1473            // Set the beginCutPercent field.
1474            pEnv->SetIntField(object, fieldIds.beginCutPercent, pSettings->xVSS.uiBeginCutPercent);
1475
1476            // Set the endCutPercent field.
1477            pEnv->SetIntField(object, fieldIds.endCutPercent, pSettings->xVSS.uiEndCutPercent);
1478
1479            // Set the panZoomEnabled field.
1480            pEnv->SetBooleanField(object, fieldIds.panZoomEnabled, pSettings->xVSS.isPanZoom);
1481
1482            // Set the panZoomPercentStart field.
1483            pEnv->SetIntField(object, fieldIds.panZoomPercentStart,
1484                (1000 - pSettings->xVSS.PanZoomXa));
1485
1486            // Set the panZoomTopLeftXStart field.
1487            pEnv->SetIntField(object, fieldIds.panZoomTopLeftXStart,
1488                pSettings->xVSS.PanZoomTopleftXa);
1489
1490            // Set the panZoomTopLeftYStart field.
1491            pEnv->SetIntField(object, fieldIds.panZoomTopLeftYStart,
1492                pSettings->xVSS.PanZoomTopleftYa);
1493
1494            // Set the panZoomPercentEnd field.
1495            pEnv->SetIntField(object, fieldIds.panZoomPercentEnd,
1496                (1000 - pSettings->xVSS.PanZoomXb));
1497
1498            // Set the panZoomTopLeftXEnd field.
1499            pEnv->SetIntField(object, fieldIds.panZoomTopLeftXEnd,
1500                pSettings->xVSS.PanZoomTopleftXb);
1501
1502            // Set the panZoomTopLeftYEnd field.
1503            pEnv->SetIntField(object, fieldIds.panZoomTopLeftYEnd,
1504                pSettings->xVSS.PanZoomTopleftYb);
1505
1506            // Set the mediaRendering field.
1507            pEnv->SetIntField(object, fieldIds.mediaRendering,
1508                videoEditJava_getMediaRenderingCToJava(pSettings->xVSS.MediaRendering));
1509
1510            // Set the rgb file width and height
1511            pEnv->SetIntField(object, fieldIds.rgbFileWidth,
1512                pSettings->ClipProperties.uiStillPicWidth );
1513
1514            pEnv->SetIntField(object, fieldIds.rgbFileHeight,
1515                pSettings->ClipProperties.uiStillPicHeight );
1516
1517            VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1518                "rgbFileWeight %d rgbFileHeight %d ",
1519                pSettings->ClipProperties.uiStillPicWidth ,
1520                pSettings->ClipProperties.uiStillPicHeight);
1521
1522            // Set the video rotation
1523            pEnv->SetIntField(object, fieldIds.rotationDegree,
1524                pSettings->ClipProperties.videoRotationDegrees);
1525
1526            // Return the object.
1527            (*pObject) = object;
1528        }
1529    }
1530}
1531void
1532videoEditPropClass_createProperties(
1533                bool*                               pResult,
1534                JNIEnv*                             pEnv,
1535                VideoEditPropClass_Properties*      pProperties,
1536                jobject*                            pObject)
1537{
1538    VideoEditJava_PropertiesFieldIds fieldIds;
1539    jclass                   clazz    = NULL;
1540    jobject                  object   = NULL;
1541    memset(&fieldIds, 0, sizeof(VideoEditJava_PropertiesFieldIds));
1542    // Check if the previous action succeeded.
1543    if (*pResult)
1544    {
1545        // Log the function call.
1546        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
1547                "videoEditPropClass_createProperties()");
1548
1549        // Retrieve the class.
1550        videoEditJava_getPropertiesClass(pResult, pEnv, &clazz);
1551
1552        // Retrieve the field ids.
1553        videoEditJava_getPropertiesFieldIds(pResult, pEnv, &fieldIds);
1554    }
1555
1556    // Only create an object if the class and fields could be located.
1557    if (*pResult)
1558    {
1559        // Allocate a new object.
1560        object = pEnv->AllocObject(clazz);
1561        if (NULL != object)
1562        {
1563            // Set the duration field.
1564            pEnv->SetIntField(object, fieldIds.duration, pProperties->uiClipDuration);
1565
1566            // Set the fileType field.
1567            pEnv->SetIntField(object, fieldIds.fileType,
1568                videoEditJava_getFileTypeCToJava(pProperties->FileType));
1569
1570            // Set the videoFormat field.
1571            pEnv->SetIntField(object, fieldIds.videoFormat,
1572                videoEditJava_getVideoFormatCToJava(pProperties->VideoStreamType));
1573
1574            // Set the videoDuration field.
1575            pEnv->SetIntField(object, fieldIds.videoDuration, pProperties->uiClipVideoDuration);
1576
1577            // Set the videoBitrate field.
1578            pEnv->SetIntField(object, fieldIds.videoBitrate, pProperties->uiVideoBitrate);
1579
1580            // Set the width field.
1581            pEnv->SetIntField(object, fieldIds.width, pProperties->uiVideoWidth);
1582
1583            // Set the height field.
1584            pEnv->SetIntField(object, fieldIds.height, pProperties->uiVideoHeight);
1585
1586            // Set the averageFrameRate field.
1587            pEnv->SetFloatField(object, fieldIds.averageFrameRate, pProperties->fAverageFrameRate);
1588
1589            // Set the profile field.
1590            pEnv->SetIntField(object, fieldIds.profile,
1591                pProperties->uiVideoProfile);
1592
1593            // Set the level field.
1594            pEnv->SetIntField(object, fieldIds.level,
1595                pProperties->uiVideoLevel);
1596
1597            // Set whether profile supported
1598            pEnv->SetBooleanField(object, fieldIds.profileSupported,
1599                pProperties->bProfileSupported);
1600
1601            // Set whether level supported
1602            pEnv->SetBooleanField(object, fieldIds.levelSupported,
1603                pProperties->bLevelSupported);
1604
1605            // Set the audioFormat field.
1606            pEnv->SetIntField(object, fieldIds.audioFormat,
1607                videoEditJava_getAudioFormatCToJava(pProperties->AudioStreamType));
1608
1609            // Set the audioDuration field.
1610            pEnv->SetIntField(object, fieldIds.audioDuration, pProperties->uiClipAudioDuration);
1611
1612            // Set the audioBitrate field.
1613            pEnv->SetIntField(object, fieldIds.audioBitrate, pProperties->uiAudioBitrate);
1614
1615            // Set the audioChannels field.
1616            pEnv->SetIntField(object, fieldIds.audioChannels, pProperties->uiNbChannels);
1617
1618            // Set the audioSamplingFrequency field.
1619            pEnv->SetIntField(object, fieldIds.audioSamplingFrequency,
1620                pProperties->uiSamplingFrequency);
1621
1622            // Set the video rotation field.
1623            pEnv->SetIntField(object, fieldIds.videoRotation, pProperties->uiRotation);
1624
1625            // Return the object.
1626            (*pObject) = object;
1627        }
1628    }
1629}
1630
1631void
1632videoEditClasses_freeClipSettings(
1633                M4VSS3GPP_ClipSettings**            ppSettings)
1634{
1635    // Check if memory was allocated for the ClipSettings.
1636    if (M4OSA_NULL != (*ppSettings))
1637    {
1638        // Log the function call.
1639        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1640            "videoEditClasses_freeClipSettings()");
1641
1642        // Free the input file path.
1643        videoEditOsal_free((*ppSettings)->pFile);
1644        (*ppSettings)->pFile = M4OSA_NULL;
1645        (*ppSettings)->filePathSize = 0;
1646
1647        // Free the clip settings.
1648        M4xVSS_FreeClipSettings((*ppSettings));
1649
1650        // Free the settings structure.
1651        videoEditOsal_free((*ppSettings));
1652        (*ppSettings) = M4OSA_NULL;
1653    }
1654}
1655
1656#ifdef VIDEOEDIT_LOGGING_ENABLED
1657void
1658videoEditClasses_logClipSettings(
1659                M4VSS3GPP_ClipSettings*             pSettings,
1660                int                                 indentation)
1661{
1662    // Check if memory was allocated for the ClipSettings.
1663    if (M4OSA_NULL != pSettings)
1664    {
1665        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1666            "%*c pFile:           %s", indentation, ' ',
1667            (M4OSA_NULL != pSettings->pFile) ? (char*)pSettings->pFile : "<null>");
1668        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1669            "%*c FileType:        %s", indentation, ' ',
1670            videoEditJava_getClipTypeString(pSettings->FileType));
1671        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1672            "%*c filePathSize:    %u", indentation, ' ',
1673            (unsigned int)pSettings->filePathSize);
1674        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1675            "%*c ClipProperties:",  indentation, ' ');
1676        videoEditClasses_logClipProperties(&pSettings->ClipProperties,
1677            indentation + VIDEOEDIT_LOG_INDENTATION);
1678        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1679            "%*c uiBeginCutTime:    %u ms", indentation, ' ',
1680            (unsigned int)pSettings->uiBeginCutTime);
1681        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1682            "%*c uiEndCutTime:      %u ms", indentation, ' ',
1683            (unsigned int)pSettings->uiEndCutTime);
1684        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1685            "%*c uiBeginCutPercent: %u %%", indentation, ' ',
1686            (unsigned int)pSettings->xVSS.uiBeginCutPercent);
1687        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1688            "%*c uiEndCutPercent:   %u %%", indentation, ' ',
1689            (unsigned int)pSettings->xVSS.uiEndCutPercent);
1690        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1691            "%*c uiDuration:        %u ms", indentation, ' ',
1692            (unsigned int)pSettings->xVSS.uiDuration);
1693        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1694            "%*c isPanZoom:         %s",    indentation, ' ',
1695            pSettings->xVSS.isPanZoom ? "true" : "false");
1696        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1697            "%*c PanZoomXa:         %d ms", indentation, ' ',
1698            pSettings->xVSS.PanZoomXa);
1699        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1700            "%*c PanZoomTopleftXa:  %d ms", indentation, ' ',
1701            pSettings->xVSS.PanZoomTopleftXa);
1702        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1703            "%*c PanZoomTopleftYa:  %d ms", indentation, ' ',
1704            pSettings->xVSS.PanZoomTopleftYa);
1705        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1706            "%*c PanZoomXb:         %d ms", indentation, ' ',
1707            pSettings->xVSS.PanZoomXb);
1708        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1709            "%*c PanZoomTopleftXb:  %d ms", indentation, ' ',
1710            pSettings->xVSS.PanZoomTopleftXb);
1711        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1712            "%*c PanZoomTopleftYb:  %d ms", indentation, ' ',
1713            pSettings->xVSS.PanZoomTopleftYb);
1714        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1715            "%*c MediaRendering:    %s",    indentation, ' ',
1716            videoEditJava_getMediaRenderingString(pSettings->xVSS.MediaRendering));
1717    }
1718    else
1719    {
1720        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1721            "%*c <null>", indentation, ' ');
1722    }
1723}
1724#endif
1725
1726
1727void
1728videoEditClasses_getEditSettings(
1729                bool*                               pResult,
1730                JNIEnv*                             pEnv,
1731                jobject                             object,
1732                M4VSS3GPP_EditSettings**            ppSettings,
1733                bool                                flag)
1734{
1735    VideoEditJava_EditSettingsFieldIds fieldIds;
1736    jobjectArray               clipSettingsArray           = NULL;
1737    jsize                      clipSettingsArraySize       = 0;
1738    jobject                    clipSettings                = NULL;
1739    jobjectArray               transitionSettingsArray     = NULL;
1740    jsize                      transitionSettingsArraySize = 0;
1741    jobject                    transitionSettings          = NULL;
1742    jobjectArray               effectSettingsArray         = NULL;
1743    jsize                      effectSettingsArraySize     = 0;
1744    jobject                    effectSettings              = NULL;
1745    jobject                    backgroundMusicSettings     = NULL;
1746    int                        audioChannels               = 0;
1747    M4VSS3GPP_EditSettings*    pSettings                   = M4OSA_NULL;
1748    bool                       converted                   = true;
1749    memset(&fieldIds, 0, sizeof(VideoEditJava_EditSettingsFieldIds));
1750    // Check if the previous action succeeded.
1751    if (*pResult)
1752    {
1753        // Log the function call.
1754        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
1755                "videoEditClasses_getEditSettings()");
1756
1757        // Retrieve the field ids.
1758        videoEditJava_getEditSettingsFieldIds(pResult, pEnv, &fieldIds);
1759    }
1760
1761    // Only retrieve the EditSettings if the previous action succeeded.
1762    if (*pResult)
1763    {
1764        // Check if the object is valid.
1765        if (NULL != object)
1766        {
1767            // Retrieve the clipSettingsArray.
1768            videoEditJava_getArray(pResult, pEnv, object,
1769                           fieldIds.clipSettingsArray,
1770                           &clipSettingsArray,
1771                           &clipSettingsArraySize);
1772
1773            // Retrieve the transitionSettingsArray.
1774            videoEditJava_getArray(pResult, pEnv, object,
1775                           fieldIds.transitionSettingsArray,
1776                           &transitionSettingsArray,
1777                           &transitionSettingsArraySize);
1778
1779            // Retrieve the effectSettingsArray.
1780            videoEditJava_getArray(pResult, pEnv, object,
1781                           fieldIds.effectSettingsArray,
1782                           &effectSettingsArray,
1783                           &effectSettingsArraySize);
1784
1785            // Retrieve the backgroundMusicSettings.
1786            videoEditJava_getObject(pResult, pEnv, object, fieldIds.backgroundMusicSettings,
1787                    &backgroundMusicSettings);
1788
1789            // Check if the arrays and background music settings object could be retrieved.
1790            if (*pResult)
1791            {
1792                // Retrieve the number of channels.
1793                audioChannels = pEnv->GetIntField(object, fieldIds.audioChannels);
1794            }
1795        }
1796    }
1797
1798    // Only validate the EditSettings if the fields could be located.
1799    if (*pResult)
1800    {
1801        // Check if there is at least one clip.
1802        //videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
1803         //                                          (clipSettingsArraySize < 1),
1804         //                                          "there should be at least one clip");
1805        if(clipSettingsArraySize < 1) {
1806            return;
1807        }
1808        if(flag)
1809        {
1810            // Check if there are clips.
1811            if ((clipSettingsArraySize != 0) || (transitionSettingsArraySize != 0))
1812            {
1813                // The number of transitions must be equal to the number of clips - 1.
1814                videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
1815                         (clipSettingsArraySize != (transitionSettingsArraySize + 1)),
1816                         "the number of transitions should be equal to the number of clips - 1");
1817            }
1818        }
1819    }
1820
1821    // Only retrieve the EditSettings if the fields could be located.
1822    if (*pResult)
1823    {
1824        // Check if the object is valid.
1825        if (NULL != object)
1826        {
1827            // Allocate memory for the EditSettings.
1828            pSettings = (M4VSS3GPP_EditSettings*)videoEditOsal_alloc(pResult, pEnv,
1829                    sizeof(M4VSS3GPP_EditSettings), "EditSettings");
1830
1831            // Check if memory could be allocated for the EditSettings.
1832            if (*pResult)
1833            {
1834                // Set the number of clips that will be edited.
1835                pSettings->uiClipNumber = clipSettingsArraySize;
1836
1837                // Check if the clip settings array contains items.
1838                if (clipSettingsArraySize > 0)
1839                {
1840                    // Allocate memory for the clip settings array.
1841                    pSettings->pClipList = (M4VSS3GPP_ClipSettings **)videoEditOsal_alloc(pResult,
1842                                pEnv,
1843                                clipSettingsArraySize * sizeof(M4VSS3GPP_ClipSettings *),
1844                                "ClipSettingsArray");
1845                    if (*pResult)
1846                    {
1847                        // Loop over all clip settings objects.
1848                        for (int i = 0; ((*pResult) && (i < clipSettingsArraySize)); i++)
1849                        {
1850                            // Get the clip settings object.
1851                            clipSettings = pEnv->GetObjectArrayElement(clipSettingsArray, i);
1852
1853                            // Get the clip settings.
1854                            videoEditClasses_getClipSettings(pResult, pEnv, clipSettings,
1855                                &pSettings->pClipList[i]);
1856
1857                            // Free the local references to avoid memory leaks
1858                            pEnv->DeleteLocalRef(clipSettings);
1859                        }
1860                    }
1861                }
1862
1863                // Check if the transition settings array contains items.
1864                if (transitionSettingsArraySize > 0)
1865                {
1866                    // Allocate memory for the transition settings array.
1867                    pSettings->pTransitionList =
1868                            (M4VSS3GPP_TransitionSettings **)videoEditOsal_alloc(pResult,
1869                                pEnv, transitionSettingsArraySize * sizeof(M4VSS3GPP_TransitionSettings *),
1870                                "TransitionSettingsArray");
1871                    if (*pResult)
1872                    {
1873                        // Loop over all transition settings objects.
1874                        for (int i = 0; ((*pResult) && (i < transitionSettingsArraySize)); i++)
1875                        {
1876                            // Get the transition settings object.
1877                            transitionSettings =
1878                                    pEnv->GetObjectArrayElement(transitionSettingsArray, i);
1879
1880                            // Get the transition settings.
1881                            videoEditClasses_getTransitionSettings(pResult, pEnv,
1882                                    transitionSettings, &pSettings->pTransitionList[i]);
1883
1884                            // Free the local references to avoid memory leaks
1885                            pEnv->DeleteLocalRef(transitionSettings);
1886                        }
1887                    }
1888                }
1889
1890                // Check if the effect settings array contains items.
1891                if (effectSettingsArraySize > 0)
1892                {
1893                    // Allocate memory for the effect settings array.
1894                    pSettings->Effects = (M4VSS3GPP_EffectSettings*)videoEditOsal_alloc(pResult,
1895                                pEnv,
1896                                effectSettingsArraySize * sizeof(M4VSS3GPP_EffectSettings),
1897                                "EffectSettingsArray");
1898                    if (*pResult)
1899                    {
1900                        // Loop over all effect settings objects.
1901                        for (int i = 0; ((*pResult) && (i < effectSettingsArraySize)); i++)
1902                        {
1903                            // Get the effect settings object.
1904                            effectSettings = pEnv->GetObjectArrayElement(effectSettingsArray, i);
1905
1906                            // Get the effect settings.
1907                            videoEditClasses_getEffectSettings(pResult, pEnv, effectSettings,
1908                                    &pSettings->Effects[i]);
1909
1910                            // Free the local references to avoid memory leaks
1911                            pEnv->DeleteLocalRef(effectSettings);
1912                        }
1913                    }
1914                }
1915
1916                // Check if the clips, transitions and effects could be set.
1917                if (*pResult)
1918                {
1919                    // Set the number of effects in the clip.
1920                    pSettings->nbEffects = (M4OSA_UInt8)effectSettingsArraySize;
1921
1922                    // Set the frame rate of the output video.
1923                    pSettings->videoFrameRate =
1924                        (M4VIDEOEDITING_VideoFramerate)videoEditJava_getVideoFrameRateJavaToC(
1925                             &converted, pEnv->GetIntField(object, fieldIds.videoFrameRate));
1926
1927                    // Check if the frame rate is valid.
1928                    videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
1929                        !converted, "editSettings.videoFrameRate is invalid");
1930                }
1931
1932                // Check if the frame rate could be set.
1933                if (*pResult)
1934                {
1935                    // Set the path of the output file.
1936                    pSettings->pOutputFile = (M4OSA_Char*)videoEditJava_getString(pResult, pEnv,
1937                        object, fieldIds.outputFile, &pSettings->uiOutputPathSize);
1938                }
1939
1940                // Check if path of the output file could be set.
1941                if (*pResult)
1942                {
1943                    // Set the path of the temporary file produced when using
1944                    // the constant memory 3gp writer.
1945                    pSettings->pTemporaryFile = M4OSA_NULL;
1946
1947                    // Set the output video size.
1948                    pSettings->xVSS.outputVideoSize =
1949                        (M4VIDEOEDITING_VideoFrameSize)videoEditJava_getVideoFrameSizeJavaToC(
1950                                &converted, pEnv->GetIntField(object, fieldIds.videoFrameSize));
1951
1952                    // Check if the output video size is valid.
1953                    videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
1954                        !converted, "editSettings.videoFrameSize is invalid");
1955                }
1956
1957                // Check if the output video size could be set.
1958                if (*pResult)
1959                {
1960                    // Set the output video format.
1961                    pSettings->xVSS.outputVideoFormat =
1962                        (M4VIDEOEDITING_VideoFormat)videoEditJava_getVideoFormatJavaToC(
1963                               &converted, pEnv->GetIntField(object, fieldIds.videoFormat));
1964
1965                    // Check if the output video format is valid.
1966                    videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
1967                        !converted, "editSettings.videoFormat is invalid");
1968                }
1969
1970                // Check if the output video format could be set.
1971                if (*pResult)
1972                {
1973                    // Set the output audio format.
1974                    pSettings->xVSS.outputAudioFormat =
1975                            (M4VIDEOEDITING_AudioFormat)videoEditJava_getAudioFormatJavaToC(
1976                                  &converted, pEnv->GetIntField(object, fieldIds.audioFormat));
1977
1978                    // Check if the output audio format is valid.
1979                    videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
1980                            !converted, "editSettings.audioFormat is invalid");
1981                }
1982
1983                // Check if the output audio format could be set.
1984                if (*pResult)
1985                {
1986                    // Set the output audio sampling frequency when not replacing the audio,
1987                    // or replacing it with MP3 audio.
1988                    pSettings->xVSS.outputAudioSamplFreq =
1989                        (M4VIDEOEDITING_AudioSamplingFrequency)\
1990                            videoEditJava_getAudioSamplingFrequencyJavaToC(
1991                                &converted, pEnv->GetIntField(object, fieldIds.audioSamplingFreq));
1992
1993                    // Check if the output audio sampling frequency is valid.
1994                    videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
1995                            !converted, "editSettings.audioSamplingFreq is invalid");
1996                }
1997
1998                // Check if the output audio sampling frequency could be set.
1999                if (*pResult)
2000                {
2001                    // Check if the number of audio channels is valid.
2002                    videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
2003                        ((0 != audioChannels ) ||
2004                        ((M4VIDEOEDITING_kNoneAudio != pSettings->xVSS.outputAudioFormat) &&
2005                        (M4VIDEOEDITING_kNullAudio != pSettings->xVSS.outputAudioFormat) ) ) &&
2006                        (1 != audioChannels ) &&
2007                        (2 != audioChannels ),
2008                        "editSettings.audioChannels must be set to 0, 1 or 2");
2009                }
2010
2011                // Check if the number of audio channels is valid.
2012                if (*pResult)
2013                {
2014                    // Set the maximum output file size (MMS usecase).
2015                    pSettings->xVSS.outputFileSize = (M4OSA_UInt32)pEnv->GetIntField(object,
2016                            fieldIds.maxFileSize);
2017
2018                    // Whether or not the audio is mono, only valid for AAC.
2019                    pSettings->xVSS.bAudioMono = (M4OSA_Bool)(1 == audioChannels);
2020
2021                    // Set the output video bitrate.
2022                    pSettings->xVSS.outputVideoBitrate = (M4OSA_UInt32)pEnv->GetIntField(object,
2023                            fieldIds.videoBitrate);
2024
2025                    // Set the output video profile.
2026                    pSettings->xVSS.outputVideoProfile = (M4OSA_UInt32)pEnv->GetIntField(object,
2027                            fieldIds.videoProfile);
2028
2029                    // Set the output video level.
2030                    pSettings->xVSS.outputVideoLevel = (M4OSA_UInt32)pEnv->GetIntField(object,
2031                            fieldIds.videoLevel);
2032
2033                    // Set the output audio bitrate.
2034                    pSettings->xVSS.outputAudioBitrate = (M4OSA_UInt32)pEnv->GetIntField(object,
2035                            fieldIds.audioBitrate);
2036
2037                    // Set the background music settings.
2038                    videoEditClasses_getBackgroundMusicSettings(pResult, pEnv,
2039                            backgroundMusicSettings, &pSettings->xVSS.pBGMtrack);
2040
2041                    // Set the text rendering function (will be set elsewhere).
2042                    pSettings->xVSS.pTextRenderingFct = M4OSA_NULL;
2043                    pSettings->PTVolLevel =
2044                            (M4OSA_Float)pEnv->GetIntField(object, fieldIds.primaryTrackVolume);
2045                }
2046            }
2047
2048            // Check if settings could be set.
2049            if (*pResult)
2050            {
2051                // Return the settings.
2052                (*ppSettings) = pSettings;
2053            }
2054            else
2055            {
2056                // Free the settings.
2057                videoEditClasses_freeEditSettings(&pSettings);
2058            }
2059        }
2060    }
2061}
2062
2063void
2064videoEditClasses_freeEditSettings(
2065                M4VSS3GPP_EditSettings**            ppSettings)
2066{
2067    // Check if memory was allocated for the EditSettings.
2068    if (M4OSA_NULL != (*ppSettings))
2069    {
2070        // Log the function call.
2071        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2072                "videoEditClasses_freeEditSettings()");
2073
2074        // Free the background music settings.
2075        videoEditClasses_freeBackgroundMusicSettings(&(*ppSettings)->xVSS.pBGMtrack);
2076
2077        // Free the path of the output file.
2078        videoEditOsal_free((*ppSettings)->pOutputFile);
2079        (*ppSettings)->pOutputFile = M4OSA_NULL;
2080        (*ppSettings)->uiOutputPathSize = 0;
2081
2082        // Check if the EffectSettings should be freed.
2083        if (M4OSA_NULL != (*ppSettings)->Effects)
2084        {
2085            // Loop over all effect settings.
2086            for (int i = 0; i < (*ppSettings)->nbEffects; i++)
2087            {
2088                // Free the effect settings.
2089                videoEditClasses_freeEffectSettings(&(*ppSettings)->Effects[i]);
2090            }
2091
2092            // Free the memory for the effect settings array.
2093            videoEditOsal_free((*ppSettings)->Effects);
2094            (*ppSettings)->Effects = M4OSA_NULL;
2095        }
2096
2097        // Reset the number of effects in the clip.
2098        (*ppSettings)->nbEffects = 0;
2099
2100        // Check if there are clips.
2101        if (0 < (*ppSettings)->uiClipNumber)
2102        {
2103            // Check if the TransitionSettings should be freed.
2104            if (M4OSA_NULL != (*ppSettings)->pTransitionList)
2105            {
2106                // Loop over all transition settings.
2107                for (int i = 0; i < ((*ppSettings)->uiClipNumber - 1); i++)
2108                {
2109                    // Free the transition settings.
2110                    videoEditClasses_freeTransitionSettings(&(*ppSettings)->pTransitionList[i]);
2111                }
2112
2113                // Free the memory for the transition settings array.
2114                videoEditOsal_free((*ppSettings)->pTransitionList);
2115                (*ppSettings)->pTransitionList = M4OSA_NULL;
2116            }
2117
2118            // Check if the ClipSettings should be freed.
2119            if (M4OSA_NULL != (*ppSettings)->pClipList)
2120            {
2121                // Loop over all clip settings.
2122                for (int i = 0; i < (*ppSettings)->uiClipNumber; i++)
2123                {
2124                    // Free the clip settings.
2125                    videoEditClasses_freeClipSettings(&(*ppSettings)->pClipList[i]);
2126                }
2127
2128                // Free the memory for the clip settings array.
2129                videoEditOsal_free((*ppSettings)->pClipList);
2130                (*ppSettings)->pClipList = M4OSA_NULL;
2131            }
2132        }
2133
2134        // Reset the number of clips.
2135        (*ppSettings)->uiClipNumber = 0;
2136
2137        // Free the settings structure.
2138        videoEditOsal_free((*ppSettings));
2139        (*ppSettings) = M4OSA_NULL;
2140    }
2141}
2142
2143#ifdef VIDEOEDIT_LOGGING_ENABLED
2144void
2145videoEditClasses_logEditSettings(
2146                M4VSS3GPP_EditSettings*             pSettings,
2147                int                                 indentation)
2148{
2149    // Check if memory was allocated for the EditSettings.
2150    if (M4OSA_NULL != pSettings)
2151    {
2152        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2153            "%*c uiClipNumber:         %d", indentation, ' ',
2154            pSettings->uiClipNumber);
2155        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2156            "%*c uiMasterClip:         %d", indentation, ' ',
2157            pSettings->uiMasterClip);
2158        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2159            "%*c pClipList:            %s", indentation, ' ',
2160            (M4OSA_NULL != pSettings->pClipList) ? " " : "<null>");
2161        if (M4OSA_NULL != pSettings->pClipList)
2162        {
2163            indentation += VIDEOEDIT_LOG_INDENTATION;
2164            for (int i = 0; i < pSettings->uiClipNumber; i++)
2165            {
2166                VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2167                    "%*c pClipList[%d]:", indentation, ' ',
2168                    i);
2169                videoEditClasses_logClipSettings(pSettings->pClipList[i],
2170                    indentation + VIDEOEDIT_LOG_INDENTATION);
2171            }
2172            indentation -= VIDEOEDIT_LOG_INDENTATION;
2173        }
2174        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2175            "%*c pTransitionList:      %s", indentation, ' ',
2176            (M4OSA_NULL != pSettings->pTransitionList) ? " " : "<null>");
2177        if (M4OSA_NULL != pSettings->pTransitionList)
2178        {
2179            indentation += VIDEOEDIT_LOG_INDENTATION;
2180            for (int i = 0; i < (pSettings->uiClipNumber - 1); i++)
2181            {
2182                VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2183                    "%*c pTransitionList[%d]:", indentation, ' ', i);
2184                videoEditClasses_logTransitionSettings(pSettings->pTransitionList[i],
2185                    indentation + VIDEOEDIT_LOG_INDENTATION);
2186            }
2187            indentation -= VIDEOEDIT_LOG_INDENTATION;
2188        }
2189        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2190            "%*c Effects:              %s", indentation, ' ',
2191            (M4OSA_NULL != pSettings->Effects)   ? " " : "<null>");
2192        if (M4OSA_NULL != pSettings->Effects)
2193        {
2194            indentation += VIDEOEDIT_LOG_INDENTATION;
2195            for (int i = 0; i < pSettings->nbEffects; i++)
2196            {
2197                VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2198                    "%*c Effects[%d]:", indentation, ' ',  i);
2199                videoEditClasses_logEffectSettings(&pSettings->Effects[i],
2200                    indentation + VIDEOEDIT_LOG_INDENTATION);
2201            }
2202            indentation -= VIDEOEDIT_LOG_INDENTATION;
2203        }
2204        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2205            "%*c nbEffects:            %d", indentation, ' ',
2206            pSettings->nbEffects);
2207        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2208            "%*c videoFrameRate:       %s", indentation, ' ',
2209            videoEditJava_getVideoFrameRateString(pSettings->videoFrameRate));
2210        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2211            "%*c pOutputFile:          %s", indentation, ' ',
2212            (M4OSA_NULL != pSettings->pOutputFile) ? (char*)pSettings->pOutputFile : "<null>");
2213        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2214            "%*c uiOutputPathSize:     %u", indentation, ' ',
2215            (unsigned int)pSettings->uiOutputPathSize);
2216        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2217            "%*c pTemporaryFile:       %s", indentation, ' ',
2218            (M4OSA_NULL != pSettings->pTemporaryFile) ?\
2219             (char*)pSettings->pTemporaryFile : "<null>");
2220        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2221            "%*c outputVideoSize:      %s", indentation, ' ',
2222            videoEditJava_getVideoFrameSizeString(pSettings->xVSS.outputVideoSize));
2223        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2224            "%*c outputVideoFormat:    %s", indentation, ' ',
2225            videoEditJava_getVideoFormatString(pSettings->xVSS.outputVideoFormat));
2226        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2227            "%*c outputVideoProfile:    %u", indentation, ' ',
2228            videoEditJava_getVideoFormatString(pSettings->xVSS.outputVideoProfile));
2229        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2230            "%*c outputVideoLevel:    %u", indentation, ' ',
2231            videoEditJava_getVideoFormatString(pSettings->xVSS.outputVideoLevel));
2232        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2233            "%*c outputAudioFormat:    %s", indentation, ' ',
2234            videoEditJava_getAudioFormatString(pSettings->xVSS.outputAudioFormat));
2235        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2236            "%*c outputAudioSamplFreq: %s", indentation, ' ',
2237            videoEditJava_getAudioSamplingFrequencyString(pSettings->xVSS.outputAudioSamplFreq));
2238        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2239            "%*c outputFileSize:       %u", indentation, ' ',
2240            (unsigned int)pSettings->xVSS.outputFileSize);
2241        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2242            "%*c bAudioMono:           %s", indentation, ' ',
2243            pSettings->xVSS.bAudioMono ? "true" : "false");
2244        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2245            "%*c outputVideoBitrate:   %s", indentation, ' ',
2246            videoEditJava_getBitrateString(pSettings->xVSS.outputVideoBitrate));
2247        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2248            "%*c outputAudioBitrate:   %s", indentation, ' ',
2249            videoEditJava_getBitrateString(pSettings->xVSS.outputAudioBitrate));
2250        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2251            "%*c pBGMtrack:",               indentation, ' ');
2252        videoEditClasses_logBackgroundMusicSettings(pSettings->xVSS.pBGMtrack,
2253            indentation + VIDEOEDIT_LOG_INDENTATION);
2254        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2255            "%*c pTextRenderingFct:    %s", indentation, ' ',
2256            (M4OSA_NULL != pSettings->xVSS.pTextRenderingFct) ? "set" : "<null>");
2257        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2258            "%*c PTVolLevel:       %u", indentation, ' ',
2259            (unsigned int)pSettings->PTVolLevel);
2260    }
2261    else
2262    {
2263        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2264            "%*c <null>", indentation, ' ');
2265    }
2266}
2267#endif
2268
2269
2270void
2271videoEditClasses_getEffectSettings(
2272                bool*                               pResult,
2273                JNIEnv*                             pEnv,
2274                jobject                             object,
2275                M4VSS3GPP_EffectSettings*           pSettings)
2276{
2277
2278    VideoEditJava_EffectSettingsFieldIds fieldIds;
2279    bool                         converted = true;
2280    memset(&fieldIds, 0, sizeof(VideoEditJava_EffectSettingsFieldIds));
2281
2282    // Check if the previous action succeeded.
2283    if (*pResult)
2284    {
2285        // Log the function call.
2286        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2287         "videoEditClasses_getEffectSettings()");
2288
2289        // Retrieve the field ids.
2290        videoEditJava_getEffectSettingsFieldIds(pResult, pEnv, &fieldIds);
2291    }
2292
2293    // Only validate the EffectSettings if the fields could be located.
2294    if (*pResult)
2295    {
2296        // Check if the effect is set.
2297        videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
2298                                                    (NULL == object),
2299                                                    "effect is null");
2300    }
2301
2302    // Only retrieve the EffectSettings if the fields could be located and validated.
2303    if (*pResult)
2304    {
2305        // Set the start time in milliseconds.
2306        pSettings->uiStartTime = (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.startTime);
2307
2308        // Set the duration in milliseconds.
2309        pSettings->uiDuration = (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.duration);
2310
2311        // Set the video effect type, None, FadeIn, FadeOut, etc.
2312        pSettings->VideoEffectType =
2313                (M4VSS3GPP_VideoEffectType)videoEditJava_getVideoEffectJavaToC(
2314                              &converted, pEnv->GetIntField(object, fieldIds.videoEffectType));
2315
2316        // Check if the video effect type is valid.
2317        videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
2318                !converted, "effect.videoEffectType is invalid");
2319    }
2320
2321    // Check if the video effect type could be set.
2322    if (*pResult)
2323    {
2324        // Set the external effect function.
2325        pSettings->ExtVideoEffectFct = M4OSA_NULL;
2326
2327        // Set the context given to the external effect function.
2328        pSettings->pExtVideoEffectFctCtxt = M4OSA_NULL;
2329
2330        // Set the audio effect type, None, FadeIn, FadeOut.
2331        pSettings->AudioEffectType =
2332                (M4VSS3GPP_AudioEffectType)videoEditJava_getAudioEffectJavaToC(
2333                        &converted, pEnv->GetIntField(object, fieldIds.audioEffectType));
2334
2335        // Check if the audio effect type is valid.
2336        videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
2337                !converted, "effect.audioEffectType is invalid");
2338    }
2339
2340    // Check if the audio effect type could be set.
2341    if (*pResult)
2342    {
2343        // Set the start in percentage of the cut clip duration.
2344        pSettings->xVSS.uiStartPercent = (M4OSA_UInt32)pEnv->GetIntField(object,
2345                fieldIds.startPercent);
2346
2347        // Set the duration in percentage of the ((clip duration) - (effect starttime)).
2348        pSettings->xVSS.uiDurationPercent = (M4OSA_UInt32)pEnv->GetIntField(object,
2349                fieldIds.durationPercent);
2350
2351        // Set the framing file path (GIF/PNG file).
2352        pSettings->xVSS.pFramingFilePath = (M4OSA_Char*)videoEditJava_getString(pResult, pEnv,
2353                object, fieldIds.framingFile, M4OSA_NULL);
2354
2355        // Check if this is a framing effect.
2356        if (M4xVSS_kVideoEffectType_Framing == (M4xVSS_VideoEffectType)pSettings->VideoEffectType)
2357        {
2358            // Check if the framing file path is valid.
2359            videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
2360                    (M4OSA_NULL == pSettings->xVSS.pFramingFilePath), "effect.framingFile is null");
2361        }
2362    }
2363
2364    // Check if the framing file path could be retrieved.
2365    if (*pResult)
2366    {
2367        // Set the Framing RGB565 buffer.
2368        pSettings->xVSS.pFramingBuffer = M4OSA_NULL;
2369
2370        // Set the top-left X coordinate in the output picture
2371        // where the added frame will be displayed.
2372        pSettings->xVSS.topleft_x = (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.topLeftX);
2373
2374        // Set the top-left Y coordinate in the output picture
2375        // where the added frame will be displayed.
2376        pSettings->xVSS.topleft_y = (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.topLeftY);
2377
2378        // Set whether or not the framing image is resized to output video size.
2379        pSettings->xVSS.bResize =
2380                (M4OSA_Bool)pEnv->GetBooleanField(object, fieldIds.framingResize);
2381
2382        // Set the new size to which framing buffer needs to be resized to
2383        pSettings->xVSS.framingScaledSize =
2384                (M4VIDEOEDITING_VideoFrameSize)pEnv->GetIntField(object, fieldIds.framingScaledSize);
2385
2386        // Set the text buffer.
2387        pSettings->xVSS.pTextBuffer = (M4OSA_Char*)videoEditJava_getString(pResult, pEnv, object,
2388                fieldIds.text, &pSettings->xVSS.textBufferSize);
2389    }
2390
2391    // Check if the text buffer could be retrieved.
2392    if (*pResult)
2393    {
2394        // Set the data used by the font engine (size, color...).
2395        pSettings->xVSS.pRenderingData = (M4OSA_Char*)videoEditJava_getString(pResult, pEnv,
2396                object, fieldIds.textRenderingData, M4OSA_NULL);
2397    }
2398
2399    // Check if the text rendering data could be retrieved.
2400    if (*pResult)
2401    {
2402        // Set the text plane width.
2403        pSettings->xVSS.uiTextBufferWidth = (M4OSA_UInt32)pEnv->GetIntField(object,
2404                fieldIds.textBufferWidth);
2405
2406        // Set the text plane height.
2407        pSettings->xVSS.uiTextBufferHeight = (M4OSA_UInt32)pEnv->GetIntField(object,
2408                fieldIds.textBufferHeight);
2409
2410        // Set the processing rate of the effect added when using the Fifties effect.
2411        pSettings->xVSS.uiFiftiesOutFrameRate = (M4OSA_UInt32)pEnv->GetIntField(object,
2412                fieldIds.fiftiesFrameRate);
2413
2414        // Set the RGB16 input color of the effect added when using the rgb16 color effect.
2415        pSettings->xVSS.uiRgb16InputColor = (M4OSA_UInt16)pEnv->GetIntField(object,
2416                fieldIds.rgb16InputColor);
2417
2418        // Set the start percentage of Alpha blending.
2419        pSettings->xVSS.uialphaBlendingStart = (M4OSA_UInt8)pEnv->GetIntField(object,
2420                fieldIds.alphaBlendingStartPercent);
2421
2422        // Set the middle percentage of Alpha blending.
2423        pSettings->xVSS.uialphaBlendingMiddle = (M4OSA_UInt8)pEnv->GetIntField(object,
2424                fieldIds.alphaBlendingMiddlePercent);
2425
2426        // Set the end percentage of Alpha blending.
2427        pSettings->xVSS.uialphaBlendingEnd = (M4OSA_UInt8)pEnv->GetIntField(object,
2428                fieldIds.alphaBlendingEndPercent);
2429
2430        // Set the duration, in percentage of effect duration, of the FadeIn phase.
2431        pSettings->xVSS.uialphaBlendingFadeInTime = (M4OSA_UInt8)pEnv->GetIntField(object,
2432                fieldIds.alphaBlendingFadeInTimePercent);
2433
2434        // Set the duration, in percentage of effect duration, of the FadeOut phase.
2435        pSettings->xVSS.uialphaBlendingFadeOutTime = (M4OSA_UInt8)pEnv->GetIntField(object,
2436                fieldIds.alphaBlendingFadeOutTimePercent);
2437
2438        if (pSettings->xVSS.pFramingFilePath != M4OSA_NULL)
2439        {
2440            pSettings->xVSS.pFramingBuffer =
2441                (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(sizeof(M4VIFI_ImagePlane),
2442                0x00,(M4OSA_Char *)"framing buffer");
2443        }
2444
2445        if (pSettings->xVSS.pFramingBuffer != M4OSA_NULL)
2446        {
2447             // OverFrame height and width
2448            pSettings->xVSS.pFramingBuffer->u_width = pEnv->GetIntField(object,
2449             fieldIds.width);
2450
2451            pSettings->xVSS.pFramingBuffer->u_height = pEnv->GetIntField(object,
2452             fieldIds.height);
2453
2454            pSettings->xVSS.width = pSettings->xVSS.pFramingBuffer->u_width;
2455            pSettings->xVSS.height = pSettings->xVSS.pFramingBuffer->u_height;
2456            pSettings->xVSS.rgbType = M4VSS3GPP_kRGB565;
2457
2458            VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2459                    "pFramingBuffer u_width %d ", pSettings->xVSS.pFramingBuffer->u_width);
2460            VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2461                    "pFramingBuffer u_height %d", pSettings->xVSS.pFramingBuffer->u_height);
2462
2463        }
2464
2465        // Check if settings could be set.
2466        if (!(*pResult))
2467        {
2468            // Free the settings.
2469            videoEditClasses_freeEffectSettings(pSettings);
2470        }
2471    }
2472}
2473
2474void
2475videoEditClasses_freeEffectSettings(
2476                M4VSS3GPP_EffectSettings*           pSettings)
2477{
2478    // Check if memory was allocated for the EffectSettings.
2479    if (M4OSA_NULL != pSettings)
2480    {
2481        // Log the function call.
2482        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2483                "videoEditClasses_freeEffectSettings()");
2484
2485        // Free the data used by the font engine (size, color...).
2486        videoEditOsal_free(pSettings->xVSS.pRenderingData);
2487        pSettings->xVSS.pRenderingData = M4OSA_NULL;
2488
2489        // Free the text buffer.
2490        videoEditOsal_free(pSettings->xVSS.pTextBuffer);
2491        pSettings->xVSS.pTextBuffer = M4OSA_NULL;
2492        pSettings->xVSS.textBufferSize = 0;
2493
2494        // Free the framing file path.
2495        videoEditOsal_free(pSettings->xVSS.pFramingFilePath);
2496        pSettings->xVSS.pFramingFilePath = M4OSA_NULL;
2497    }
2498}
2499
2500#ifdef VIDEOEDIT_LOGGING_ENABLED
2501void
2502videoEditClasses_logEffectSettings(
2503                M4VSS3GPP_EffectSettings*           pSettings,
2504                int                                 indentation)
2505{
2506    // Check if memory was allocated for the EffectSettings.
2507    if (M4OSA_NULL != pSettings)
2508    {
2509        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2510            "%*c uiStartTime:                %u ms", indentation, ' ',
2511            (unsigned int)pSettings->uiStartTime);
2512        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2513            "%*c uiDuration:                 %u ms", indentation, ' ',
2514            (unsigned int)pSettings->uiDuration);
2515        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2516            "%*c VideoEffectType:            %s",    indentation, ' ',
2517            videoEditJava_getVideoEffectString(pSettings->VideoEffectType));
2518        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2519             "%*c ExtVideoEffectFct:          %s",    indentation, ' ',
2520            (M4OSA_NULL != pSettings->ExtVideoEffectFct) ? "set" : "<null>");
2521        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2522            "%*c pExtVideoEffectFctCtxt:     %s",    indentation, ' ',
2523            (M4OSA_NULL != pSettings->pExtVideoEffectFctCtxt) ? "set" : "<null>");
2524        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2525            "%*c AudioEffectType:            %s",    indentation, ' ',
2526            videoEditJava_getAudioEffectString(pSettings->AudioEffectType));
2527        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2528            "%*c uiStartPercent:             %u %%", indentation, ' ',
2529            (unsigned int)pSettings->xVSS.uiStartPercent);
2530        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2531            "%*c uiDurationPercent:          %u %%", indentation, ' ',
2532            (unsigned int)pSettings->xVSS.uiDurationPercent);
2533        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2534            "%*c pFramingFilePath:           %s",    indentation, ' ',
2535            (M4OSA_NULL != pSettings->xVSS.pFramingFilePath) ?\
2536             (char*)pSettings->xVSS.pFramingFilePath : "<null>");
2537        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2538            "%*c pFramingBuffer:             %s",    indentation, ' ',
2539            (M4OSA_NULL != pSettings->xVSS.pFramingBuffer) ? "set" : "<null>");
2540        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2541            "%*c topleft_x:                  %u",    indentation, ' ',
2542            (unsigned int)pSettings->xVSS.topleft_x);
2543        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2544            "%*c topleft_y:                  %u",    indentation, ' ',
2545            (unsigned int)pSettings->xVSS.topleft_y);
2546        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2547            "%*c bResize:                    %s",    indentation, ' ',
2548            pSettings->xVSS.bResize ? "true" : "false");
2549        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2550            "%*c pTextBuffer:                %s",    indentation, ' ',
2551            (M4OSA_NULL != pSettings->xVSS.pTextBuffer) ?\
2552             (char*)pSettings->xVSS.pTextBuffer : "<null>");
2553        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2554            "%*c textBufferSize:             %u",    indentation, ' ',
2555            (unsigned int)pSettings->xVSS.textBufferSize);
2556        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2557            "%*c pRenderingData:             %s",    indentation, ' ',
2558            (M4OSA_NULL != pSettings->xVSS.pRenderingData) ?\
2559             (char*)pSettings->xVSS.pRenderingData : "<null>");
2560        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2561            "%*c uiTextBufferWidth:          %u",    indentation, ' ',
2562            (unsigned int)pSettings->xVSS.uiTextBufferWidth);
2563        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2564             "%*c uiTextBufferHeight:         %u",    indentation, ' ',
2565            (unsigned int)pSettings->xVSS.uiTextBufferHeight);
2566        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2567            "%*c uiFiftiesOutFrameRate:      %u",    indentation, ' ',
2568            (unsigned int)pSettings->xVSS.uiFiftiesOutFrameRate);
2569        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2570            "%*c uiRgb16InputColor:          %d",    indentation, ' ',
2571            pSettings->xVSS.uiRgb16InputColor);
2572        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2573            "%*c uialphaBlendingStart:       %d %%", indentation, ' ',
2574            pSettings->xVSS.uialphaBlendingStart);
2575        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2576            "%*c uialphaBlendingMiddle:      %d %%", indentation, ' ',
2577            pSettings->xVSS.uialphaBlendingMiddle);
2578        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2579            "%*c uialphaBlendingEnd:         %d %%", indentation, ' ',
2580            pSettings->xVSS.uialphaBlendingEnd);
2581        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2582            "%*c uialphaBlendingFadeInTime:  %d %%", indentation, ' ',
2583            pSettings->xVSS.uialphaBlendingFadeInTime);
2584        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2585            "%*c uialphaBlendingFadeOutTime: %d %%", indentation, ' ',
2586            pSettings->xVSS.uialphaBlendingFadeOutTime);
2587    }
2588    else
2589    {
2590        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2591            "%*c <null>", indentation, ' ');
2592    }
2593}
2594#endif
2595
2596
2597void
2598videoEditClasses_getSlideTransitionSettings(
2599                bool*                               pResult,
2600                JNIEnv*                             pEnv,
2601                jobject                             object,
2602                M4xVSS_SlideTransitionSettings**    ppSettings)
2603{
2604    VideoEditJava_SlideTransitionSettingsFieldIds fieldIds  = {NULL};
2605    M4xVSS_SlideTransitionSettings*       pSettings = M4OSA_NULL;
2606    bool                                  converted = true;
2607
2608    // Check if the previous action succeeded.
2609    if (*pResult)
2610    {
2611        // Log the function call.
2612        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2613                "videoEditClasses_getSlideTransitionSettings()");
2614
2615        // Retrieve the field ids.
2616        videoEditJava_getSlideTransitionSettingsFieldIds(pResult, pEnv, &fieldIds);
2617    }
2618
2619
2620    // Only validate the SlideTransitionSettings if the fields could be located.
2621    if (*pResult)
2622    {
2623        // Check if the clip is set.
2624        videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
2625                                                    (NULL == object),
2626                                                    "slideSettings is null");
2627    }
2628
2629    // Only retrieve the SlideTransitionSettings if the fields could be located and validated.
2630    if (*pResult)
2631    {
2632        // Allocate memory for the SlideTransitionSettings.
2633        pSettings = (M4xVSS_SlideTransitionSettings*)videoEditOsal_alloc(pResult, pEnv,
2634                sizeof(M4xVSS_SlideTransitionSettings), "SlideTransitionSettings");
2635
2636        // Check if memory could be allocated for the SlideTransitionSettings.
2637        if (*pResult)
2638        {
2639            // Set the direction of the slide.
2640            pSettings->direction =
2641                    (M4xVSS_SlideTransition_Direction)videoEditJava_getSlideDirectionJavaToC(
2642                            &converted, pEnv->GetIntField(object, fieldIds.direction));
2643
2644            // Check if the direction is valid.
2645            videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
2646                    !converted, "slideSettings.direction is invalid");
2647        }
2648
2649        // Check if settings could be set.
2650        if (*pResult)
2651        {
2652            // Return the settings.
2653            (*ppSettings) = pSettings;
2654        }
2655        else
2656        {
2657            // Free the settings.
2658            videoEditClasses_freeSlideTransitionSettings(&pSettings);
2659        }
2660    }
2661}
2662
2663void
2664videoEditClasses_freeSlideTransitionSettings(
2665                M4xVSS_SlideTransitionSettings**    ppSettings)
2666{
2667    // Check if memory was allocated for the SlideTransitionSettings.
2668    if (M4OSA_NULL != (*ppSettings))
2669    {
2670        // Log the function call.
2671        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2672                "videoEditClasses_freeSlideTransitionSettings()");
2673
2674        // Free the settings structure.
2675        videoEditOsal_free((*ppSettings));
2676        (*ppSettings) = M4OSA_NULL;
2677    }
2678}
2679
2680#ifdef VIDEOEDIT_LOGGING_ENABLED
2681void
2682videoEditClasses_logSlideTransitionSettings(
2683                M4xVSS_SlideTransitionSettings*     pSettings,
2684                int                                 indentation)
2685{
2686    // Check if memory was allocated for the SlideTransitionSettings.
2687    if (M4OSA_NULL != pSettings)
2688    {
2689        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2690            "%*c direction: %s", indentation, ' ',
2691            videoEditJava_getSlideDirectionString(pSettings->direction));
2692    }
2693    else
2694    {
2695        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2696            "%*c <null>", indentation, ' ');
2697    }
2698}
2699#endif
2700
2701
2702void
2703videoEditClasses_getTransitionSettings(
2704                bool*                               pResult,
2705                JNIEnv*                             pEnv,
2706                jobject                             object,
2707                M4VSS3GPP_TransitionSettings**      ppSettings)
2708{
2709
2710    VideoEditJava_TransitionSettingsFieldIds fieldIds;
2711    jobject                          alphaSettings = NULL;
2712    jobject                          slideSettings = NULL;
2713    M4VSS3GPP_TransitionSettings*    pSettings     = M4OSA_NULL;
2714    bool                             converted     = true;
2715    memset(&fieldIds, 0, sizeof(VideoEditJava_TransitionSettingsFieldIds));
2716
2717    // Check if the previous action succeeded.
2718    if (*pResult)
2719    {
2720        // Log the function call.
2721        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2722               "videoEditClasses_getTransitionSettings()");
2723
2724        // Retrieve the field ids.
2725        videoEditJava_getTransitionSettingsFieldIds(pResult, pEnv, &fieldIds);
2726    }
2727
2728    // Only validate the TransitionSettings if the fields could be located.
2729    if (*pResult)
2730    {
2731        // Check if the transition is set.
2732        videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
2733                                                    (NULL == object),
2734                                                    "transition is null");
2735    }
2736
2737    // Check if the field ids could be located and validated.
2738    if (*pResult)
2739    {
2740        // Retrieve the alphaSettings.
2741        videoEditJava_getObject(pResult, pEnv, object, fieldIds.alphaSettings, &alphaSettings);
2742
2743        // Retrieve the slideSettings.
2744        videoEditJava_getObject(pResult, pEnv, object, fieldIds.slideSettings, &slideSettings);
2745    }
2746
2747    // Only retrieve the TransitionSettings if the fields could be located.
2748    if (*pResult)
2749    {
2750        // Allocate memory for the TransitionSettings.
2751        pSettings = (M4VSS3GPP_TransitionSettings*)videoEditOsal_alloc(pResult,
2752                pEnv, sizeof(M4VSS3GPP_TransitionSettings), "TransitionSettings");
2753
2754        // Check if memory could be allocated for the TransitionSettings.
2755        if (*pResult)
2756        {
2757            // Set the duration of the transition, in milliseconds (set to 0 to get no transition).
2758            pSettings->uiTransitionDuration = (M4OSA_UInt32)pEnv->GetIntField(object,
2759                    fieldIds.duration);
2760
2761            // Set the type of the video transition.
2762            pSettings->VideoTransitionType =
2763                    (M4VSS3GPP_VideoTransitionType)videoEditJava_getVideoTransitionJavaToC(
2764                             &converted, pEnv->GetIntField(object, fieldIds.videoTransitionType));
2765
2766            // Check if the video transition type is valid.
2767            videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, !converted,
2768                            "transition.videoTransitionType is invalid");
2769        }
2770
2771        // Check if the video transition type could be set.
2772        if (*pResult)
2773        {
2774            // Set the external transition video effect function.
2775            pSettings->ExtVideoTransitionFct = M4OSA_NULL;
2776
2777            // Set the context of the external transition video effect function.
2778            pSettings->pExtVideoTransitionFctCtxt = M4OSA_NULL;
2779
2780            // Set the type of the audio transition.
2781            pSettings->AudioTransitionType =
2782                    (M4VSS3GPP_AudioTransitionType)videoEditJava_getAudioTransitionJavaToC(
2783                            &converted, pEnv->GetIntField(object, fieldIds.audioTransitionType));
2784
2785            // Check if the audio transition type is valid.
2786            videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, !converted,
2787                             "transition.audioTransitionType is invalid");
2788        }
2789
2790        // Check if the audio transition type could be set.
2791        if (*pResult)
2792        {
2793            // Set the transition behaviour.
2794            pSettings->TransitionBehaviour =
2795                    (M4VSS3GPP_TransitionBehaviour)videoEditJava_getTransitionBehaviourJavaToC(
2796                            &converted, pEnv->GetIntField(object, fieldIds.transitionBehaviour));
2797
2798            // Check if the transition behaviour is valid.
2799            videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, !converted,
2800                                                    "transition.transitionBehaviour is invalid");
2801        }
2802
2803        // Check if the audio transition behaviour could be set.
2804        if (*pResult)
2805        {
2806            // Check if a slide transition or alpha magic setting object is expected.
2807            if ((int)pSettings->VideoTransitionType == M4xVSS_kVideoTransitionType_SlideTransition)
2808            {
2809                // Set the slide transition settings.
2810                videoEditClasses_getSlideTransitionSettings(pResult, pEnv, slideSettings,
2811                                     &pSettings->xVSS.transitionSpecific.pSlideTransitionSettings);
2812            }
2813            else if ((int)pSettings->VideoTransitionType == M4xVSS_kVideoTransitionType_AlphaMagic)
2814            {
2815                // Set the alpha magic settings.
2816                videoEditClasses_getAlphaMagicSettings(pResult, pEnv, alphaSettings,
2817                                  &pSettings->xVSS.transitionSpecific.pAlphaMagicSettings);
2818            }
2819        }
2820
2821        // Check if settings could be set.
2822        if (*pResult)
2823        {
2824            // Return the settings.
2825            (*ppSettings) = pSettings;
2826        }
2827        else
2828        {
2829            // Free the settings.
2830            videoEditClasses_freeTransitionSettings(&pSettings);
2831        }
2832    }
2833}
2834
2835void
2836videoEditClasses_freeTransitionSettings(
2837                M4VSS3GPP_TransitionSettings**      ppSettings)
2838{
2839    // Check if memory was allocated for the TransitionSettings.
2840    if (M4OSA_NULL != (*ppSettings))
2841    {
2842        // Log the function call.
2843        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2844                               "videoEditClasses_freeTransitionSettings()");
2845
2846        // Check if a slide transition or alpha magic setting structure is expected.
2847        if ((int)(*ppSettings)->VideoTransitionType == M4xVSS_kVideoTransitionType_SlideTransition)
2848        {
2849            // Free the slide transition settings.
2850            videoEditClasses_freeSlideTransitionSettings(
2851                               &(*ppSettings)->xVSS.transitionSpecific.pSlideTransitionSettings);
2852        }
2853        else
2854        {
2855            // Free the alpha magic settings.
2856            videoEditClasses_freeAlphaMagicSettings(
2857                              &(*ppSettings)->xVSS.transitionSpecific.pAlphaMagicSettings);
2858        }
2859
2860        // Free the settings structure.
2861        videoEditOsal_free((*ppSettings));
2862        (*ppSettings) = M4OSA_NULL;
2863    }
2864}
2865
2866#ifdef VIDEOEDIT_LOGGING_ENABLED
2867void
2868videoEditClasses_logTransitionSettings(
2869                M4VSS3GPP_TransitionSettings*       pSettings,
2870                int                                 indentation)
2871{
2872    // Check if memory was allocated for the TransitionSettings.
2873    if (M4OSA_NULL != pSettings)
2874    {
2875        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2876                               "%*c uiTransitionDuration:       %u ms", indentation, ' ',
2877                                  (unsigned int)pSettings->uiTransitionDuration);
2878        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2879                           "%*c VideoTransitionType:        %s",    indentation, ' ',
2880                           videoEditJava_getVideoTransitionString(pSettings->VideoTransitionType));
2881        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2882                              "%*c ExtVideoTransitionFct:      %s",    indentation, ' ',
2883                              (M4OSA_NULL != pSettings->ExtVideoTransitionFct) ? "set" : "<null>");
2884        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2885                         "%*c pExtVideoTransitionFctCtxt: %s",    indentation, ' ',
2886                         (M4OSA_NULL != pSettings->pExtVideoTransitionFctCtxt) ? "set" : "<null>");
2887        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2888                         "%*c AudioTransitionType:        %s",    indentation, ' ',
2889                          videoEditJava_getAudioTransitionString(pSettings->AudioTransitionType));
2890        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2891                      "%*c TransitionBehaviour:        %s",    indentation, ' ',
2892                      videoEditJava_getTransitionBehaviourString(pSettings->TransitionBehaviour));
2893
2894        // Check if a slide transition or alpha magic setting structure is expected.
2895        if ((int)pSettings->VideoTransitionType == M4xVSS_kVideoTransitionType_SlideTransition)
2896        {
2897            // Log the slide transition settings.
2898            VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2899                                   "%*c pSlideTransitionSettings:", indentation, ' ');
2900            videoEditClasses_logSlideTransitionSettings\
2901            (pSettings->xVSS.transitionSpecific.pSlideTransitionSettings,
2902            indentation + VIDEOEDIT_LOG_INDENTATION);
2903        }
2904        else
2905        {
2906            // Log the alpha magic settings.
2907            VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2908                                   "%*c pAlphaMagicSettings:", indentation, ' ');
2909            videoEditClasses_logAlphaMagicSettings\
2910            (pSettings->xVSS.transitionSpecific.pAlphaMagicSettings,
2911            indentation + VIDEOEDIT_LOG_INDENTATION);
2912        }
2913    }
2914    else
2915    {
2916        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
2917                               "%*c <null>", indentation, ' ');
2918    }
2919}
2920#endif
2921#ifdef VIDEOEDIT_LOGGING_ENABLED
2922void
2923videoEditPropClass_logProperties(
2924                VideoEditPropClass_Properties*                   pProperties,
2925                int                                 indentation)
2926{
2927    // Check if memory was allocated for the Properties.
2928    if (M4OSA_NULL != pProperties)
2929    {
2930        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2931            "%*c uiClipDuration:                   %u",       indentation, ' ',
2932            (unsigned int)pProperties->uiClipDuration);
2933        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2934            "%*c FileType:                         %s",       indentation, ' ',
2935            videoEditJava_getFileTypeString(pProperties->FileType));
2936
2937        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2938            "%*c VideoStreamType:                  %s",       indentation, ' ',
2939            videoEditJava_getVideoFormatString(pProperties->VideoStreamType));
2940        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2941            "%*c uiClipVideoDuration:              %u",       indentation, ' ',
2942            (unsigned int)pProperties->uiClipVideoDuration);
2943
2944        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2945            "%*c uiVideoBitrate:                   %s",       indentation, ' ',
2946            videoEditJava_getBitrateString(pProperties->uiVideoBitrate));
2947
2948        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2949            "%*c uiVideoWidth:                     %u",       indentation, ' ',
2950            (unsigned int)pProperties->uiVideoWidth);
2951
2952        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2953            "%*c uiVideoHeight:                    %u",       indentation, ' ',
2954            (unsigned int)(unsigned int)pProperties->uiVideoHeight);
2955
2956        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2957            "%*c fAverageFrameRate:                %.3f",     indentation, ' ',
2958            pProperties->fAverageFrameRate);
2959
2960        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2961            "%*c AudioStreamType:                  %s",       indentation, ' ',
2962            videoEditJava_getAudioFormatString(pProperties->AudioStreamType));
2963
2964        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2965            "%*c uiClipAudioDuration:              %u",       indentation, ' ',
2966            (unsigned int)pProperties->uiClipAudioDuration);
2967
2968        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2969            "%*c uiAudioBitrate:                   %s",       indentation, ' ',
2970            videoEditJava_getBitrateString(pProperties->uiAudioBitrate));
2971
2972        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2973            "%*c uiNbChannels:                     %u",       indentation, ' ',
2974            (unsigned int)pProperties->uiNbChannels);
2975
2976        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2977             "%*c uiSamplingFrequency:              %u",       indentation, ' ',
2978            (unsigned int)pProperties->uiSamplingFrequency);
2979    }
2980    else
2981    {
2982        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
2983            "%*c <null>", indentation, ' ');
2984    }
2985}
2986#endif
2987
2988
2989void
2990videoEditClasses_createVersion(
2991                bool*                               pResult,
2992                JNIEnv*                             pEnv,
2993                M4_VersionInfo*                     pVersionInfo,
2994                jobject*                            pObject)
2995{
2996
2997    VideoEditJava_VersionFieldIds fieldIds;
2998    jclass                clazz    = NULL;
2999    jobject               object   = NULL;
3000    memset(&fieldIds, 0, sizeof(VideoEditJava_VersionFieldIds));
3001    // Check if the previous action succeeded.
3002    if (*pResult)
3003    {
3004        // Log the function call.
3005        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
3006                               "videoEditClasses_createVersion()");
3007
3008        // Retrieve the class.
3009        videoEditJava_getVersionClass(pResult, pEnv, &clazz);
3010
3011        // Retrieve the field ids.
3012        videoEditJava_getVersionFieldIds(pResult, pEnv, &fieldIds);
3013    }
3014
3015    // Only create an object if the class and fields could be located.
3016    if (*pResult)
3017    {
3018        // Allocate a new object.
3019        object = pEnv->AllocObject(clazz);
3020
3021        // check if alloc is done
3022        videoEditJava_checkAndThrowRuntimeException(pResult, pEnv,
3023                                                    (NULL == object),
3024                                                    M4ERR_ALLOC);
3025        if (NULL != object)
3026        {
3027            // Set the major field.
3028            pEnv->SetIntField(object, fieldIds.major, pVersionInfo->m_major);
3029
3030            // Set the minor field.
3031            pEnv->SetIntField(object, fieldIds.minor, pVersionInfo->m_minor);
3032
3033            // Set the revision field.
3034            pEnv->SetIntField(object, fieldIds.revision, pVersionInfo->m_revision);
3035
3036            // Return the object.
3037            (*pObject) = object;
3038        }
3039    }
3040}
3041
3042#ifdef VIDEOEDIT_LOGGING_ENABLED
3043void
3044videoEditClasses_logVersion(
3045                M4_VersionInfo*                     pVersionInfo,
3046                int                                 indentation)
3047{
3048    // Check if memory was allocated for the Version.
3049    if (M4OSA_NULL != pVersionInfo)
3050    {
3051        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
3052                             "%*c major:    %u ms", indentation, ' ',
3053                             (unsigned int)pVersionInfo->m_major);
3054        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
3055                              "%*c minor:    %u",    indentation, ' ',
3056                              (unsigned int)pVersionInfo->m_minor);
3057        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
3058                             "%*c revision: %u",    indentation, ' ',
3059                             (unsigned int)pVersionInfo->m_revision);
3060    }
3061    else
3062    {
3063        VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
3064                              "%*c <null>", indentation, ' ');
3065    }
3066}
3067#endif
3068
3069
3070void*
3071videoEditClasses_getContext(
3072                bool*                               pResult,
3073                JNIEnv*                             pEnv,
3074                jobject                             object)
3075{
3076    void*                pContext = M4OSA_NULL;
3077    jclass               clazz    = NULL;
3078    VideoEditJava_EngineFieldIds fieldIds = {NULL};
3079
3080    // Check if the previous action succeeded.
3081    if (*pResult)
3082    {
3083        // Log the function call.
3084        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
3085                               "videoEditClasses_getContext()");
3086
3087        // Retrieve the class.
3088        videoEditJava_getEngineClass(pResult, pEnv, &clazz);
3089
3090        // Retrieve the field ids.
3091        videoEditJava_getEngineFieldIds(pResult, pEnv, &fieldIds);
3092    }
3093
3094    // Check if the class and field ids could be located.
3095    if (*pResult)
3096    {
3097        // Retrieve the context pointer.
3098        pContext = (void *)pEnv->GetIntField(object, fieldIds.context);
3099    }
3100
3101    // Return the context pointer.
3102    return(pContext);
3103}
3104
3105void
3106videoEditClasses_setContext(
3107                bool*                               pResult,
3108                JNIEnv*                             pEnv,
3109                jobject                             object,
3110                void*                               pContext)
3111{
3112    jclass               clazz    = NULL;
3113    VideoEditJava_EngineFieldIds fieldIds = {NULL};
3114
3115    // Check if the previous action succeeded.
3116    if (*pResult)
3117    {
3118        // Log the function call.
3119        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
3120                               "videoEditClasses_setContext()");
3121
3122        // Retrieve the class.
3123        videoEditJava_getEngineClass(pResult, pEnv, &clazz);
3124
3125        // Retrieve the field ids.
3126        videoEditJava_getEngineFieldIds(pResult, pEnv, &fieldIds);
3127    }
3128
3129    // Check if the class and field ids could be located.
3130    if (*pResult)
3131    {
3132        // Set the context field.
3133        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
3134                        "The context value from JAVA before setting is = 0x%x",
3135                        pEnv->GetIntField(object, fieldIds.context));
3136
3137        pEnv->SetIntField(object, fieldIds.context, (int)pContext);
3138        M4OSA_TRACE1_1("The context value in JNI is = 0x%x",pContext);
3139
3140        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
3141                         "The context value from JAVA after setting is = 0x%x",
3142                         pEnv->GetIntField(object, fieldIds.context));
3143    }
3144}
3145
3146