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