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