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                             // Free the local references to avoid memory leaks
   1858                             pEnv->DeleteLocalRef(clipSettings);
   1859                         }
   1860                     }
   1861                 }
   1862 
   1863                 // Check if the transition settings array contains items.
   1864                 if (transitionSettingsArraySize > 0)
   1865                 {
   1866                     // Allocate memory for the transition settings array.
   1867                     pSettings->pTransitionList =
   1868                             (M4VSS3GPP_TransitionSettings **)videoEditOsal_alloc(pResult,
   1869                                 pEnv, transitionSettingsArraySize * sizeof(M4VSS3GPP_TransitionSettings *),
   1870                                 "TransitionSettingsArray");
   1871                     if (*pResult)
   1872                     {
   1873                         // Loop over all transition settings objects.
   1874                         for (int i = 0; ((*pResult) && (i < transitionSettingsArraySize)); i++)
   1875                         {
   1876                             // Get the transition settings object.
   1877                             transitionSettings =
   1878                                     pEnv->GetObjectArrayElement(transitionSettingsArray, i);
   1879 
   1880                             // Get the transition settings.
   1881                             videoEditClasses_getTransitionSettings(pResult, pEnv,
   1882                                     transitionSettings, &pSettings->pTransitionList[i]);
   1883 
   1884                             // Free the local references to avoid memory leaks
   1885                             pEnv->DeleteLocalRef(transitionSettings);
   1886                         }
   1887                     }
   1888                 }
   1889 
   1890                 // Check if the effect settings array contains items.
   1891                 if (effectSettingsArraySize > 0)
   1892                 {
   1893                     // Allocate memory for the effect settings array.
   1894                     pSettings->Effects = (M4VSS3GPP_EffectSettings*)videoEditOsal_alloc(pResult,
   1895                                 pEnv,
   1896                                 effectSettingsArraySize * sizeof(M4VSS3GPP_EffectSettings),
   1897                                 "EffectSettingsArray");
   1898                     if (*pResult)
   1899                     {
   1900                         // Loop over all effect settings objects.
   1901                         for (int i = 0; ((*pResult) && (i < effectSettingsArraySize)); i++)
   1902                         {
   1903                             // Get the effect settings object.
   1904                             effectSettings = pEnv->GetObjectArrayElement(effectSettingsArray, i);
   1905 
   1906                             // Get the effect settings.
   1907                             videoEditClasses_getEffectSettings(pResult, pEnv, effectSettings,
   1908                                     &pSettings->Effects[i]);
   1909 
   1910                             // Free the local references to avoid memory leaks
   1911                             pEnv->DeleteLocalRef(effectSettings);
   1912                         }
   1913                     }
   1914                 }
   1915 
   1916                 // Check if the clips, transitions and effects could be set.
   1917                 if (*pResult)
   1918                 {
   1919                     // Set the number of effects in the clip.
   1920                     pSettings->nbEffects = (M4OSA_UInt8)effectSettingsArraySize;
   1921 
   1922                     // Set the frame rate of the output video.
   1923                     pSettings->videoFrameRate =
   1924                         (M4VIDEOEDITING_VideoFramerate)videoEditJava_getVideoFrameRateJavaToC(
   1925                              &converted, pEnv->GetIntField(object, fieldIds.videoFrameRate));
   1926 
   1927                     // Check if the frame rate is valid.
   1928                     videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   1929                         !converted, "editSettings.videoFrameRate is invalid");
   1930                 }
   1931 
   1932                 // Check if the frame rate could be set.
   1933                 if (*pResult)
   1934                 {
   1935                     // Set the path of the output file.
   1936                     pSettings->pOutputFile = (M4OSA_Char*)videoEditJava_getString(pResult, pEnv,
   1937                         object, fieldIds.outputFile, &pSettings->uiOutputPathSize);
   1938                 }
   1939 
   1940                 // Check if path of the output file could be set.
   1941                 if (*pResult)
   1942                 {
   1943                     // Set the path of the temporary file produced when using
   1944                     // the constant memory 3gp writer.
   1945                     pSettings->pTemporaryFile = M4OSA_NULL;
   1946 
   1947                     // Set the output video size.
   1948                     pSettings->xVSS.outputVideoSize =
   1949                         (M4VIDEOEDITING_VideoFrameSize)videoEditJava_getVideoFrameSizeJavaToC(
   1950                                 &converted, pEnv->GetIntField(object, fieldIds.videoFrameSize));
   1951 
   1952                     // Check if the output video size is valid.
   1953                     videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   1954                         !converted, "editSettings.videoFrameSize is invalid");
   1955                 }
   1956 
   1957                 // Check if the output video size could be set.
   1958                 if (*pResult)
   1959                 {
   1960                     // Set the output video format.
   1961                     pSettings->xVSS.outputVideoFormat =
   1962                         (M4VIDEOEDITING_VideoFormat)videoEditJava_getVideoFormatJavaToC(
   1963                                &converted, pEnv->GetIntField(object, fieldIds.videoFormat));
   1964 
   1965                     // Check if the output video format is valid.
   1966                     videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   1967                         !converted, "editSettings.videoFormat is invalid");
   1968                 }
   1969 
   1970                 // Check if the output video format could be set.
   1971                 if (*pResult)
   1972                 {
   1973                     // Set the output audio format.
   1974                     pSettings->xVSS.outputAudioFormat =
   1975                             (M4VIDEOEDITING_AudioFormat)videoEditJava_getAudioFormatJavaToC(
   1976                                   &converted, pEnv->GetIntField(object, fieldIds.audioFormat));
   1977 
   1978                     // Check if the output audio format is valid.
   1979                     videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   1980                             !converted, "editSettings.audioFormat is invalid");
   1981                 }
   1982 
   1983                 // Check if the output audio format could be set.
   1984                 if (*pResult)
   1985                 {
   1986                     // Set the output audio sampling frequency when not replacing the audio,
   1987                     // or replacing it with MP3 audio.
   1988                     pSettings->xVSS.outputAudioSamplFreq =
   1989                         (M4VIDEOEDITING_AudioSamplingFrequency)\
   1990                             videoEditJava_getAudioSamplingFrequencyJavaToC(
   1991                                 &converted, pEnv->GetIntField(object, fieldIds.audioSamplingFreq));
   1992 
   1993                     // Check if the output audio sampling frequency is valid.
   1994                     videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   1995                             !converted, "editSettings.audioSamplingFreq is invalid");
   1996                 }
   1997 
   1998                 // Check if the output audio sampling frequency could be set.
   1999                 if (*pResult)
   2000                 {
   2001                     // Check if the number of audio channels is valid.
   2002                     videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   2003                         ((0 != audioChannels ) ||
   2004                         ((M4VIDEOEDITING_kNoneAudio != pSettings->xVSS.outputAudioFormat) &&
   2005                         (M4VIDEOEDITING_kNullAudio != pSettings->xVSS.outputAudioFormat) ) ) &&
   2006                         (1 != audioChannels ) &&
   2007                         (2 != audioChannels ),
   2008                         "editSettings.audioChannels must be set to 0, 1 or 2");
   2009                 }
   2010 
   2011                 // Check if the number of audio channels is valid.
   2012                 if (*pResult)
   2013                 {
   2014                     // Set the maximum output file size (MMS usecase).
   2015                     pSettings->xVSS.outputFileSize = (M4OSA_UInt32)pEnv->GetIntField(object,
   2016                             fieldIds.maxFileSize);
   2017 
   2018                     // Whether or not the audio is mono, only valid for AAC.
   2019                     pSettings->xVSS.bAudioMono = (M4OSA_Bool)(1 == audioChannels);
   2020 
   2021                     // Set the output video bitrate.
   2022                     pSettings->xVSS.outputVideoBitrate = (M4OSA_UInt32)pEnv->GetIntField(object,
   2023                             fieldIds.videoBitrate);
   2024 
   2025                     // Set the output video profile.
   2026                     pSettings->xVSS.outputVideoProfile = (M4OSA_UInt32)pEnv->GetIntField(object,
   2027                             fieldIds.videoProfile);
   2028 
   2029                     // Set the output video level.
   2030                     pSettings->xVSS.outputVideoLevel = (M4OSA_UInt32)pEnv->GetIntField(object,
   2031                             fieldIds.videoLevel);
   2032 
   2033                     // Set the output audio bitrate.
   2034                     pSettings->xVSS.outputAudioBitrate = (M4OSA_UInt32)pEnv->GetIntField(object,
   2035                             fieldIds.audioBitrate);
   2036 
   2037                     // Set the background music settings.
   2038                     videoEditClasses_getBackgroundMusicSettings(pResult, pEnv,
   2039                             backgroundMusicSettings, &pSettings->xVSS.pBGMtrack);
   2040 
   2041                     // Set the text rendering function (will be set elsewhere).
   2042                     pSettings->xVSS.pTextRenderingFct = M4OSA_NULL;
   2043                     pSettings->PTVolLevel =
   2044                             (M4OSA_Float)pEnv->GetIntField(object, fieldIds.primaryTrackVolume);
   2045                 }
   2046             }
   2047 
   2048             // Check if settings could be set.
   2049             if (*pResult)
   2050             {
   2051                 // Return the settings.
   2052                 (*ppSettings) = pSettings;
   2053             }
   2054             else
   2055             {
   2056                 // Free the settings.
   2057                 videoEditClasses_freeEditSettings(&pSettings);
   2058             }
   2059         }
   2060     }
   2061 }
   2062 
   2063 void
   2064 videoEditClasses_freeEditSettings(
   2065                 M4VSS3GPP_EditSettings**            ppSettings)
   2066 {
   2067     // Check if memory was allocated for the EditSettings.
   2068     if (M4OSA_NULL != (*ppSettings))
   2069     {
   2070         // Log the function call.
   2071         VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2072                 "videoEditClasses_freeEditSettings()");
   2073 
   2074         // Free the background music settings.
   2075         videoEditClasses_freeBackgroundMusicSettings(&(*ppSettings)->xVSS.pBGMtrack);
   2076 
   2077         // Free the path of the output file.
   2078         videoEditOsal_free((*ppSettings)->pOutputFile);
   2079         (*ppSettings)->pOutputFile = M4OSA_NULL;
   2080         (*ppSettings)->uiOutputPathSize = 0;
   2081 
   2082         // Check if the EffectSettings should be freed.
   2083         if (M4OSA_NULL != (*ppSettings)->Effects)
   2084         {
   2085             // Loop over all effect settings.
   2086             for (int i = 0; i < (*ppSettings)->nbEffects; i++)
   2087             {
   2088                 // Free the effect settings.
   2089                 videoEditClasses_freeEffectSettings(&(*ppSettings)->Effects[i]);
   2090             }
   2091 
   2092             // Free the memory for the effect settings array.
   2093             videoEditOsal_free((*ppSettings)->Effects);
   2094             (*ppSettings)->Effects = M4OSA_NULL;
   2095         }
   2096 
   2097         // Reset the number of effects in the clip.
   2098         (*ppSettings)->nbEffects = 0;
   2099 
   2100         // Check if there are clips.
   2101         if (0 < (*ppSettings)->uiClipNumber)
   2102         {
   2103             // Check if the TransitionSettings should be freed.
   2104             if (M4OSA_NULL != (*ppSettings)->pTransitionList)
   2105             {
   2106                 // Loop over all transition settings.
   2107                 for (int i = 0; i < ((*ppSettings)->uiClipNumber - 1); i++)
   2108                 {
   2109                     // Free the transition settings.
   2110                     videoEditClasses_freeTransitionSettings(&(*ppSettings)->pTransitionList[i]);
   2111                 }
   2112 
   2113                 // Free the memory for the transition settings array.
   2114                 videoEditOsal_free((*ppSettings)->pTransitionList);
   2115                 (*ppSettings)->pTransitionList = M4OSA_NULL;
   2116             }
   2117 
   2118             // Check if the ClipSettings should be freed.
   2119             if (M4OSA_NULL != (*ppSettings)->pClipList)
   2120             {
   2121                 // Loop over all clip settings.
   2122                 for (int i = 0; i < (*ppSettings)->uiClipNumber; i++)
   2123                 {
   2124                     // Free the clip settings.
   2125                     videoEditClasses_freeClipSettings(&(*ppSettings)->pClipList[i]);
   2126                 }
   2127 
   2128                 // Free the memory for the clip settings array.
   2129                 videoEditOsal_free((*ppSettings)->pClipList);
   2130                 (*ppSettings)->pClipList = M4OSA_NULL;
   2131             }
   2132         }
   2133 
   2134         // Reset the number of clips.
   2135         (*ppSettings)->uiClipNumber = 0;
   2136 
   2137         // Free the settings structure.
   2138         videoEditOsal_free((*ppSettings));
   2139         (*ppSettings) = M4OSA_NULL;
   2140     }
   2141 }
   2142 
   2143 #ifdef VIDEOEDIT_LOGGING_ENABLED
   2144 void
   2145 videoEditClasses_logEditSettings(
   2146                 M4VSS3GPP_EditSettings*             pSettings,
   2147                 int                                 indentation)
   2148 {
   2149     // Check if memory was allocated for the EditSettings.
   2150     if (M4OSA_NULL != pSettings)
   2151     {
   2152         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2153             "%*c uiClipNumber:         %d", indentation, ' ',
   2154             pSettings->uiClipNumber);
   2155         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2156             "%*c uiMasterClip:         %d", indentation, ' ',
   2157             pSettings->uiMasterClip);
   2158         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2159             "%*c pClipList:            %s", indentation, ' ',
   2160             (M4OSA_NULL != pSettings->pClipList) ? " " : "<null>");
   2161         if (M4OSA_NULL != pSettings->pClipList)
   2162         {
   2163             indentation += VIDEOEDIT_LOG_INDENTATION;
   2164             for (int i = 0; i < pSettings->uiClipNumber; i++)
   2165             {
   2166                 VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2167                     "%*c pClipList[%d]:", indentation, ' ',
   2168                     i);
   2169                 videoEditClasses_logClipSettings(pSettings->pClipList[i],
   2170                     indentation + VIDEOEDIT_LOG_INDENTATION);
   2171             }
   2172             indentation -= VIDEOEDIT_LOG_INDENTATION;
   2173         }
   2174         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2175             "%*c pTransitionList:      %s", indentation, ' ',
   2176             (M4OSA_NULL != pSettings->pTransitionList) ? " " : "<null>");
   2177         if (M4OSA_NULL != pSettings->pTransitionList)
   2178         {
   2179             indentation += VIDEOEDIT_LOG_INDENTATION;
   2180             for (int i = 0; i < (pSettings->uiClipNumber - 1); i++)
   2181             {
   2182                 VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2183                     "%*c pTransitionList[%d]:", indentation, ' ', i);
   2184                 videoEditClasses_logTransitionSettings(pSettings->pTransitionList[i],
   2185                     indentation + VIDEOEDIT_LOG_INDENTATION);
   2186             }
   2187             indentation -= VIDEOEDIT_LOG_INDENTATION;
   2188         }
   2189         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2190             "%*c Effects:              %s", indentation, ' ',
   2191             (M4OSA_NULL != pSettings->Effects)   ? " " : "<null>");
   2192         if (M4OSA_NULL != pSettings->Effects)
   2193         {
   2194             indentation += VIDEOEDIT_LOG_INDENTATION;
   2195             for (int i = 0; i < pSettings->nbEffects; i++)
   2196             {
   2197                 VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2198                     "%*c Effects[%d]:", indentation, ' ',  i);
   2199                 videoEditClasses_logEffectSettings(&pSettings->Effects[i],
   2200                     indentation + VIDEOEDIT_LOG_INDENTATION);
   2201             }
   2202             indentation -= VIDEOEDIT_LOG_INDENTATION;
   2203         }
   2204         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2205             "%*c nbEffects:            %d", indentation, ' ',
   2206             pSettings->nbEffects);
   2207         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2208             "%*c videoFrameRate:       %s", indentation, ' ',
   2209             videoEditJava_getVideoFrameRateString(pSettings->videoFrameRate));
   2210         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2211             "%*c pOutputFile:          %s", indentation, ' ',
   2212             (M4OSA_NULL != pSettings->pOutputFile) ? (char*)pSettings->pOutputFile : "<null>");
   2213         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2214             "%*c uiOutputPathSize:     %u", indentation, ' ',
   2215             (unsigned int)pSettings->uiOutputPathSize);
   2216         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2217             "%*c pTemporaryFile:       %s", indentation, ' ',
   2218             (M4OSA_NULL != pSettings->pTemporaryFile) ?\
   2219              (char*)pSettings->pTemporaryFile : "<null>");
   2220         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2221             "%*c outputVideoSize:      %s", indentation, ' ',
   2222             videoEditJava_getVideoFrameSizeString(pSettings->xVSS.outputVideoSize));
   2223         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2224             "%*c outputVideoFormat:    %s", indentation, ' ',
   2225             videoEditJava_getVideoFormatString(pSettings->xVSS.outputVideoFormat));
   2226         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2227             "%*c outputVideoProfile:    %u", indentation, ' ',
   2228             videoEditJava_getVideoFormatString(pSettings->xVSS.outputVideoProfile));
   2229         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2230             "%*c outputVideoLevel:    %u", indentation, ' ',
   2231             videoEditJava_getVideoFormatString(pSettings->xVSS.outputVideoLevel));
   2232         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2233             "%*c outputAudioFormat:    %s", indentation, ' ',
   2234             videoEditJava_getAudioFormatString(pSettings->xVSS.outputAudioFormat));
   2235         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2236             "%*c outputAudioSamplFreq: %s", indentation, ' ',
   2237             videoEditJava_getAudioSamplingFrequencyString(pSettings->xVSS.outputAudioSamplFreq));
   2238         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2239             "%*c outputFileSize:       %u", indentation, ' ',
   2240             (unsigned int)pSettings->xVSS.outputFileSize);
   2241         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2242             "%*c bAudioMono:           %s", indentation, ' ',
   2243             pSettings->xVSS.bAudioMono ? "true" : "false");
   2244         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2245             "%*c outputVideoBitrate:   %s", indentation, ' ',
   2246             videoEditJava_getBitrateString(pSettings->xVSS.outputVideoBitrate));
   2247         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2248             "%*c outputAudioBitrate:   %s", indentation, ' ',
   2249             videoEditJava_getBitrateString(pSettings->xVSS.outputAudioBitrate));
   2250         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2251             "%*c pBGMtrack:",               indentation, ' ');
   2252         videoEditClasses_logBackgroundMusicSettings(pSettings->xVSS.pBGMtrack,
   2253             indentation + VIDEOEDIT_LOG_INDENTATION);
   2254         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2255             "%*c pTextRenderingFct:    %s", indentation, ' ',
   2256             (M4OSA_NULL != pSettings->xVSS.pTextRenderingFct) ? "set" : "<null>");
   2257         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2258             "%*c PTVolLevel:       %u", indentation, ' ',
   2259             (unsigned int)pSettings->PTVolLevel);
   2260     }
   2261     else
   2262     {
   2263         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2264             "%*c <null>", indentation, ' ');
   2265     }
   2266 }
   2267 #endif
   2268 
   2269 
   2270 void
   2271 videoEditClasses_getEffectSettings(
   2272                 bool*                               pResult,
   2273                 JNIEnv*                             pEnv,
   2274                 jobject                             object,
   2275                 M4VSS3GPP_EffectSettings*           pSettings)
   2276 {
   2277 
   2278     VideoEditJava_EffectSettingsFieldIds fieldIds;
   2279     bool                         converted = true;
   2280     memset(&fieldIds, 0, sizeof(VideoEditJava_EffectSettingsFieldIds));
   2281 
   2282     // Check if the previous action succeeded.
   2283     if (*pResult)
   2284     {
   2285         // Log the function call.
   2286         VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2287          "videoEditClasses_getEffectSettings()");
   2288 
   2289         // Retrieve the field ids.
   2290         videoEditJava_getEffectSettingsFieldIds(pResult, pEnv, &fieldIds);
   2291     }
   2292 
   2293     // Only validate the EffectSettings if the fields could be located.
   2294     if (*pResult)
   2295     {
   2296         // Check if the effect is set.
   2297         videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   2298                                                     (NULL == object),
   2299                                                     "effect is null");
   2300     }
   2301 
   2302     // Only retrieve the EffectSettings if the fields could be located and validated.
   2303     if (*pResult)
   2304     {
   2305         // Set the start time in milliseconds.
   2306         pSettings->uiStartTime = (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.startTime);
   2307 
   2308         // Set the duration in milliseconds.
   2309         pSettings->uiDuration = (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.duration);
   2310 
   2311         // Set the video effect type, None, FadeIn, FadeOut, etc.
   2312         pSettings->VideoEffectType =
   2313                 (M4VSS3GPP_VideoEffectType)videoEditJava_getVideoEffectJavaToC(
   2314                               &converted, pEnv->GetIntField(object, fieldIds.videoEffectType));
   2315 
   2316         // Check if the video effect type is valid.
   2317         videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   2318                 !converted, "effect.videoEffectType is invalid");
   2319     }
   2320 
   2321     // Check if the video effect type could be set.
   2322     if (*pResult)
   2323     {
   2324         // Set the external effect function.
   2325         pSettings->ExtVideoEffectFct = M4OSA_NULL;
   2326 
   2327         // Set the context given to the external effect function.
   2328         pSettings->pExtVideoEffectFctCtxt = M4OSA_NULL;
   2329 
   2330         // Set the audio effect type, None, FadeIn, FadeOut.
   2331         pSettings->AudioEffectType =
   2332                 (M4VSS3GPP_AudioEffectType)videoEditJava_getAudioEffectJavaToC(
   2333                         &converted, pEnv->GetIntField(object, fieldIds.audioEffectType));
   2334 
   2335         // Check if the audio effect type is valid.
   2336         videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   2337                 !converted, "effect.audioEffectType is invalid");
   2338     }
   2339 
   2340     // Check if the audio effect type could be set.
   2341     if (*pResult)
   2342     {
   2343         // Set the start in percentage of the cut clip duration.
   2344         pSettings->xVSS.uiStartPercent = (M4OSA_UInt32)pEnv->GetIntField(object,
   2345                 fieldIds.startPercent);
   2346 
   2347         // Set the duration in percentage of the ((clip duration) - (effect starttime)).
   2348         pSettings->xVSS.uiDurationPercent = (M4OSA_UInt32)pEnv->GetIntField(object,
   2349                 fieldIds.durationPercent);
   2350 
   2351         // Set the framing file path (GIF/PNG file).
   2352         pSettings->xVSS.pFramingFilePath = (M4OSA_Char*)videoEditJava_getString(pResult, pEnv,
   2353                 object, fieldIds.framingFile, M4OSA_NULL);
   2354 
   2355         // Check if this is a framing effect.
   2356         if (M4xVSS_kVideoEffectType_Framing == (M4xVSS_VideoEffectType)pSettings->VideoEffectType)
   2357         {
   2358             // Check if the framing file path is valid.
   2359             videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   2360                     (M4OSA_NULL == pSettings->xVSS.pFramingFilePath), "effect.framingFile is null");
   2361         }
   2362     }
   2363 
   2364     // Check if the framing file path could be retrieved.
   2365     if (*pResult)
   2366     {
   2367         // Set the Framing RGB565 buffer.
   2368         pSettings->xVSS.pFramingBuffer = M4OSA_NULL;
   2369 
   2370         // Set the top-left X coordinate in the output picture
   2371         // where the added frame will be displayed.
   2372         pSettings->xVSS.topleft_x = (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.topLeftX);
   2373 
   2374         // Set the top-left Y coordinate in the output picture
   2375         // where the added frame will be displayed.
   2376         pSettings->xVSS.topleft_y = (M4OSA_UInt32)pEnv->GetIntField(object, fieldIds.topLeftY);
   2377 
   2378         // Set whether or not the framing image is resized to output video size.
   2379         pSettings->xVSS.bResize =
   2380                 (M4OSA_Bool)pEnv->GetBooleanField(object, fieldIds.framingResize);
   2381 
   2382         // Set the new size to which framing buffer needs to be resized to
   2383         pSettings->xVSS.framingScaledSize =
   2384                 (M4VIDEOEDITING_VideoFrameSize)pEnv->GetIntField(object, fieldIds.framingScaledSize);
   2385 
   2386         // Set the text buffer.
   2387         pSettings->xVSS.pTextBuffer = (M4OSA_Char*)videoEditJava_getString(pResult, pEnv, object,
   2388                 fieldIds.text, &pSettings->xVSS.textBufferSize);
   2389     }
   2390 
   2391     // Check if the text buffer could be retrieved.
   2392     if (*pResult)
   2393     {
   2394         // Set the data used by the font engine (size, color...).
   2395         pSettings->xVSS.pRenderingData = (M4OSA_Char*)videoEditJava_getString(pResult, pEnv,
   2396                 object, fieldIds.textRenderingData, M4OSA_NULL);
   2397     }
   2398 
   2399     // Check if the text rendering data could be retrieved.
   2400     if (*pResult)
   2401     {
   2402         // Set the text plane width.
   2403         pSettings->xVSS.uiTextBufferWidth = (M4OSA_UInt32)pEnv->GetIntField(object,
   2404                 fieldIds.textBufferWidth);
   2405 
   2406         // Set the text plane height.
   2407         pSettings->xVSS.uiTextBufferHeight = (M4OSA_UInt32)pEnv->GetIntField(object,
   2408                 fieldIds.textBufferHeight);
   2409 
   2410         // Set the processing rate of the effect added when using the Fifties effect.
   2411         pSettings->xVSS.uiFiftiesOutFrameRate = (M4OSA_UInt32)pEnv->GetIntField(object,
   2412                 fieldIds.fiftiesFrameRate);
   2413 
   2414         // Set the RGB16 input color of the effect added when using the rgb16 color effect.
   2415         pSettings->xVSS.uiRgb16InputColor = (M4OSA_UInt16)pEnv->GetIntField(object,
   2416                 fieldIds.rgb16InputColor);
   2417 
   2418         // Set the start percentage of Alpha blending.
   2419         pSettings->xVSS.uialphaBlendingStart = (M4OSA_UInt8)pEnv->GetIntField(object,
   2420                 fieldIds.alphaBlendingStartPercent);
   2421 
   2422         // Set the middle percentage of Alpha blending.
   2423         pSettings->xVSS.uialphaBlendingMiddle = (M4OSA_UInt8)pEnv->GetIntField(object,
   2424                 fieldIds.alphaBlendingMiddlePercent);
   2425 
   2426         // Set the end percentage of Alpha blending.
   2427         pSettings->xVSS.uialphaBlendingEnd = (M4OSA_UInt8)pEnv->GetIntField(object,
   2428                 fieldIds.alphaBlendingEndPercent);
   2429 
   2430         // Set the duration, in percentage of effect duration, of the FadeIn phase.
   2431         pSettings->xVSS.uialphaBlendingFadeInTime = (M4OSA_UInt8)pEnv->GetIntField(object,
   2432                 fieldIds.alphaBlendingFadeInTimePercent);
   2433 
   2434         // Set the duration, in percentage of effect duration, of the FadeOut phase.
   2435         pSettings->xVSS.uialphaBlendingFadeOutTime = (M4OSA_UInt8)pEnv->GetIntField(object,
   2436                 fieldIds.alphaBlendingFadeOutTimePercent);
   2437 
   2438         if (pSettings->xVSS.pFramingFilePath != M4OSA_NULL)
   2439         {
   2440             pSettings->xVSS.pFramingBuffer =
   2441                 (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(sizeof(M4VIFI_ImagePlane),
   2442                 0x00,(M4OSA_Char *)"framing buffer");
   2443         }
   2444 
   2445         if (pSettings->xVSS.pFramingBuffer != M4OSA_NULL)
   2446         {
   2447              // OverFrame height and width
   2448             pSettings->xVSS.pFramingBuffer->u_width = pEnv->GetIntField(object,
   2449              fieldIds.width);
   2450 
   2451             pSettings->xVSS.pFramingBuffer->u_height = pEnv->GetIntField(object,
   2452              fieldIds.height);
   2453 
   2454             pSettings->xVSS.width = pSettings->xVSS.pFramingBuffer->u_width;
   2455             pSettings->xVSS.height = pSettings->xVSS.pFramingBuffer->u_height;
   2456             pSettings->xVSS.rgbType = M4VSS3GPP_kRGB565;
   2457 
   2458             VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2459                     "pFramingBuffer u_width %d ", pSettings->xVSS.pFramingBuffer->u_width);
   2460             VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2461                     "pFramingBuffer u_height %d", pSettings->xVSS.pFramingBuffer->u_height);
   2462 
   2463         }
   2464 
   2465         // Check if settings could be set.
   2466         if (!(*pResult))
   2467         {
   2468             // Free the settings.
   2469             videoEditClasses_freeEffectSettings(pSettings);
   2470         }
   2471     }
   2472 }
   2473 
   2474 void
   2475 videoEditClasses_freeEffectSettings(
   2476                 M4VSS3GPP_EffectSettings*           pSettings)
   2477 {
   2478     // Check if memory was allocated for the EffectSettings.
   2479     if (M4OSA_NULL != pSettings)
   2480     {
   2481         // Log the function call.
   2482         VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2483                 "videoEditClasses_freeEffectSettings()");
   2484 
   2485         // Free the data used by the font engine (size, color...).
   2486         videoEditOsal_free(pSettings->xVSS.pRenderingData);
   2487         pSettings->xVSS.pRenderingData = M4OSA_NULL;
   2488 
   2489         // Free the text buffer.
   2490         videoEditOsal_free(pSettings->xVSS.pTextBuffer);
   2491         pSettings->xVSS.pTextBuffer = M4OSA_NULL;
   2492         pSettings->xVSS.textBufferSize = 0;
   2493 
   2494         // Free the framing file path.
   2495         videoEditOsal_free(pSettings->xVSS.pFramingFilePath);
   2496         pSettings->xVSS.pFramingFilePath = M4OSA_NULL;
   2497     }
   2498 }
   2499 
   2500 #ifdef VIDEOEDIT_LOGGING_ENABLED
   2501 void
   2502 videoEditClasses_logEffectSettings(
   2503                 M4VSS3GPP_EffectSettings*           pSettings,
   2504                 int                                 indentation)
   2505 {
   2506     // Check if memory was allocated for the EffectSettings.
   2507     if (M4OSA_NULL != pSettings)
   2508     {
   2509         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2510             "%*c uiStartTime:                %u ms", indentation, ' ',
   2511             (unsigned int)pSettings->uiStartTime);
   2512         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2513             "%*c uiDuration:                 %u ms", indentation, ' ',
   2514             (unsigned int)pSettings->uiDuration);
   2515         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2516             "%*c VideoEffectType:            %s",    indentation, ' ',
   2517             videoEditJava_getVideoEffectString(pSettings->VideoEffectType));
   2518         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2519              "%*c ExtVideoEffectFct:          %s",    indentation, ' ',
   2520             (M4OSA_NULL != pSettings->ExtVideoEffectFct) ? "set" : "<null>");
   2521         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2522             "%*c pExtVideoEffectFctCtxt:     %s",    indentation, ' ',
   2523             (M4OSA_NULL != pSettings->pExtVideoEffectFctCtxt) ? "set" : "<null>");
   2524         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2525             "%*c AudioEffectType:            %s",    indentation, ' ',
   2526             videoEditJava_getAudioEffectString(pSettings->AudioEffectType));
   2527         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2528             "%*c uiStartPercent:             %u %%", indentation, ' ',
   2529             (unsigned int)pSettings->xVSS.uiStartPercent);
   2530         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2531             "%*c uiDurationPercent:          %u %%", indentation, ' ',
   2532             (unsigned int)pSettings->xVSS.uiDurationPercent);
   2533         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2534             "%*c pFramingFilePath:           %s",    indentation, ' ',
   2535             (M4OSA_NULL != pSettings->xVSS.pFramingFilePath) ?\
   2536              (char*)pSettings->xVSS.pFramingFilePath : "<null>");
   2537         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2538             "%*c pFramingBuffer:             %s",    indentation, ' ',
   2539             (M4OSA_NULL != pSettings->xVSS.pFramingBuffer) ? "set" : "<null>");
   2540         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2541             "%*c topleft_x:                  %u",    indentation, ' ',
   2542             (unsigned int)pSettings->xVSS.topleft_x);
   2543         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2544             "%*c topleft_y:                  %u",    indentation, ' ',
   2545             (unsigned int)pSettings->xVSS.topleft_y);
   2546         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2547             "%*c bResize:                    %s",    indentation, ' ',
   2548             pSettings->xVSS.bResize ? "true" : "false");
   2549         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2550             "%*c pTextBuffer:                %s",    indentation, ' ',
   2551             (M4OSA_NULL != pSettings->xVSS.pTextBuffer) ?\
   2552              (char*)pSettings->xVSS.pTextBuffer : "<null>");
   2553         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2554             "%*c textBufferSize:             %u",    indentation, ' ',
   2555             (unsigned int)pSettings->xVSS.textBufferSize);
   2556         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2557             "%*c pRenderingData:             %s",    indentation, ' ',
   2558             (M4OSA_NULL != pSettings->xVSS.pRenderingData) ?\
   2559              (char*)pSettings->xVSS.pRenderingData : "<null>");
   2560         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2561             "%*c uiTextBufferWidth:          %u",    indentation, ' ',
   2562             (unsigned int)pSettings->xVSS.uiTextBufferWidth);
   2563         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2564              "%*c uiTextBufferHeight:         %u",    indentation, ' ',
   2565             (unsigned int)pSettings->xVSS.uiTextBufferHeight);
   2566         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2567             "%*c uiFiftiesOutFrameRate:      %u",    indentation, ' ',
   2568             (unsigned int)pSettings->xVSS.uiFiftiesOutFrameRate);
   2569         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2570             "%*c uiRgb16InputColor:          %d",    indentation, ' ',
   2571             pSettings->xVSS.uiRgb16InputColor);
   2572         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2573             "%*c uialphaBlendingStart:       %d %%", indentation, ' ',
   2574             pSettings->xVSS.uialphaBlendingStart);
   2575         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2576             "%*c uialphaBlendingMiddle:      %d %%", indentation, ' ',
   2577             pSettings->xVSS.uialphaBlendingMiddle);
   2578         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2579             "%*c uialphaBlendingEnd:         %d %%", indentation, ' ',
   2580             pSettings->xVSS.uialphaBlendingEnd);
   2581         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2582             "%*c uialphaBlendingFadeInTime:  %d %%", indentation, ' ',
   2583             pSettings->xVSS.uialphaBlendingFadeInTime);
   2584         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2585             "%*c uialphaBlendingFadeOutTime: %d %%", indentation, ' ',
   2586             pSettings->xVSS.uialphaBlendingFadeOutTime);
   2587     }
   2588     else
   2589     {
   2590         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2591             "%*c <null>", indentation, ' ');
   2592     }
   2593 }
   2594 #endif
   2595 
   2596 
   2597 void
   2598 videoEditClasses_getSlideTransitionSettings(
   2599                 bool*                               pResult,
   2600                 JNIEnv*                             pEnv,
   2601                 jobject                             object,
   2602                 M4xVSS_SlideTransitionSettings**    ppSettings)
   2603 {
   2604     VideoEditJava_SlideTransitionSettingsFieldIds fieldIds  = {NULL};
   2605     M4xVSS_SlideTransitionSettings*       pSettings = M4OSA_NULL;
   2606     bool                                  converted = true;
   2607 
   2608     // Check if the previous action succeeded.
   2609     if (*pResult)
   2610     {
   2611         // Log the function call.
   2612         VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2613                 "videoEditClasses_getSlideTransitionSettings()");
   2614 
   2615         // Retrieve the field ids.
   2616         videoEditJava_getSlideTransitionSettingsFieldIds(pResult, pEnv, &fieldIds);
   2617     }
   2618 
   2619 
   2620     // Only validate the SlideTransitionSettings if the fields could be located.
   2621     if (*pResult)
   2622     {
   2623         // Check if the clip is set.
   2624         videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   2625                                                     (NULL == object),
   2626                                                     "slideSettings is null");
   2627     }
   2628 
   2629     // Only retrieve the SlideTransitionSettings if the fields could be located and validated.
   2630     if (*pResult)
   2631     {
   2632         // Allocate memory for the SlideTransitionSettings.
   2633         pSettings = (M4xVSS_SlideTransitionSettings*)videoEditOsal_alloc(pResult, pEnv,
   2634                 sizeof(M4xVSS_SlideTransitionSettings), "SlideTransitionSettings");
   2635 
   2636         // Check if memory could be allocated for the SlideTransitionSettings.
   2637         if (*pResult)
   2638         {
   2639             // Set the direction of the slide.
   2640             pSettings->direction =
   2641                     (M4xVSS_SlideTransition_Direction)videoEditJava_getSlideDirectionJavaToC(
   2642                             &converted, pEnv->GetIntField(object, fieldIds.direction));
   2643 
   2644             // Check if the direction is valid.
   2645             videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   2646                     !converted, "slideSettings.direction is invalid");
   2647         }
   2648 
   2649         // Check if settings could be set.
   2650         if (*pResult)
   2651         {
   2652             // Return the settings.
   2653             (*ppSettings) = pSettings;
   2654         }
   2655         else
   2656         {
   2657             // Free the settings.
   2658             videoEditClasses_freeSlideTransitionSettings(&pSettings);
   2659         }
   2660     }
   2661 }
   2662 
   2663 void
   2664 videoEditClasses_freeSlideTransitionSettings(
   2665                 M4xVSS_SlideTransitionSettings**    ppSettings)
   2666 {
   2667     // Check if memory was allocated for the SlideTransitionSettings.
   2668     if (M4OSA_NULL != (*ppSettings))
   2669     {
   2670         // Log the function call.
   2671         VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2672                 "videoEditClasses_freeSlideTransitionSettings()");
   2673 
   2674         // Free the settings structure.
   2675         videoEditOsal_free((*ppSettings));
   2676         (*ppSettings) = M4OSA_NULL;
   2677     }
   2678 }
   2679 
   2680 #ifdef VIDEOEDIT_LOGGING_ENABLED
   2681 void
   2682 videoEditClasses_logSlideTransitionSettings(
   2683                 M4xVSS_SlideTransitionSettings*     pSettings,
   2684                 int                                 indentation)
   2685 {
   2686     // Check if memory was allocated for the SlideTransitionSettings.
   2687     if (M4OSA_NULL != pSettings)
   2688     {
   2689         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2690             "%*c direction: %s", indentation, ' ',
   2691             videoEditJava_getSlideDirectionString(pSettings->direction));
   2692     }
   2693     else
   2694     {
   2695         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2696             "%*c <null>", indentation, ' ');
   2697     }
   2698 }
   2699 #endif
   2700 
   2701 
   2702 void
   2703 videoEditClasses_getTransitionSettings(
   2704                 bool*                               pResult,
   2705                 JNIEnv*                             pEnv,
   2706                 jobject                             object,
   2707                 M4VSS3GPP_TransitionSettings**      ppSettings)
   2708 {
   2709 
   2710     VideoEditJava_TransitionSettingsFieldIds fieldIds;
   2711     jobject                          alphaSettings = NULL;
   2712     jobject                          slideSettings = NULL;
   2713     M4VSS3GPP_TransitionSettings*    pSettings     = M4OSA_NULL;
   2714     bool                             converted     = true;
   2715     memset(&fieldIds, 0, sizeof(VideoEditJava_TransitionSettingsFieldIds));
   2716 
   2717     // Check if the previous action succeeded.
   2718     if (*pResult)
   2719     {
   2720         // Log the function call.
   2721         VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2722                "videoEditClasses_getTransitionSettings()");
   2723 
   2724         // Retrieve the field ids.
   2725         videoEditJava_getTransitionSettingsFieldIds(pResult, pEnv, &fieldIds);
   2726     }
   2727 
   2728     // Only validate the TransitionSettings if the fields could be located.
   2729     if (*pResult)
   2730     {
   2731         // Check if the transition is set.
   2732         videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
   2733                                                     (NULL == object),
   2734                                                     "transition is null");
   2735     }
   2736 
   2737     // Check if the field ids could be located and validated.
   2738     if (*pResult)
   2739     {
   2740         // Retrieve the alphaSettings.
   2741         videoEditJava_getObject(pResult, pEnv, object, fieldIds.alphaSettings, &alphaSettings);
   2742 
   2743         // Retrieve the slideSettings.
   2744         videoEditJava_getObject(pResult, pEnv, object, fieldIds.slideSettings, &slideSettings);
   2745     }
   2746 
   2747     // Only retrieve the TransitionSettings if the fields could be located.
   2748     if (*pResult)
   2749     {
   2750         // Allocate memory for the TransitionSettings.
   2751         pSettings = (M4VSS3GPP_TransitionSettings*)videoEditOsal_alloc(pResult,
   2752                 pEnv, sizeof(M4VSS3GPP_TransitionSettings), "TransitionSettings");
   2753 
   2754         // Check if memory could be allocated for the TransitionSettings.
   2755         if (*pResult)
   2756         {
   2757             // Set the duration of the transition, in milliseconds (set to 0 to get no transition).
   2758             pSettings->uiTransitionDuration = (M4OSA_UInt32)pEnv->GetIntField(object,
   2759                     fieldIds.duration);
   2760 
   2761             // Set the type of the video transition.
   2762             pSettings->VideoTransitionType =
   2763                     (M4VSS3GPP_VideoTransitionType)videoEditJava_getVideoTransitionJavaToC(
   2764                              &converted, pEnv->GetIntField(object, fieldIds.videoTransitionType));
   2765 
   2766             // Check if the video transition type is valid.
   2767             videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, !converted,
   2768                             "transition.videoTransitionType is invalid");
   2769         }
   2770 
   2771         // Check if the video transition type could be set.
   2772         if (*pResult)
   2773         {
   2774             // Set the external transition video effect function.
   2775             pSettings->ExtVideoTransitionFct = M4OSA_NULL;
   2776 
   2777             // Set the context of the external transition video effect function.
   2778             pSettings->pExtVideoTransitionFctCtxt = M4OSA_NULL;
   2779 
   2780             // Set the type of the audio transition.
   2781             pSettings->AudioTransitionType =
   2782                     (M4VSS3GPP_AudioTransitionType)videoEditJava_getAudioTransitionJavaToC(
   2783                             &converted, pEnv->GetIntField(object, fieldIds.audioTransitionType));
   2784 
   2785             // Check if the audio transition type is valid.
   2786             videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, !converted,
   2787                              "transition.audioTransitionType is invalid");
   2788         }
   2789 
   2790         // Check if the audio transition type could be set.
   2791         if (*pResult)
   2792         {
   2793             // Set the transition behaviour.
   2794             pSettings->TransitionBehaviour =
   2795                     (M4VSS3GPP_TransitionBehaviour)videoEditJava_getTransitionBehaviourJavaToC(
   2796                             &converted, pEnv->GetIntField(object, fieldIds.transitionBehaviour));
   2797 
   2798             // Check if the transition behaviour is valid.
   2799             videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, !converted,
   2800                                                     "transition.transitionBehaviour is invalid");
   2801         }
   2802 
   2803         // Check if the audio transition behaviour could be set.
   2804         if (*pResult)
   2805         {
   2806             // Check if a slide transition or alpha magic setting object is expected.
   2807             if ((int)pSettings->VideoTransitionType == M4xVSS_kVideoTransitionType_SlideTransition)
   2808             {
   2809                 // Set the slide transition settings.
   2810                 videoEditClasses_getSlideTransitionSettings(pResult, pEnv, slideSettings,
   2811                                      &pSettings->xVSS.transitionSpecific.pSlideTransitionSettings);
   2812             }
   2813             else if ((int)pSettings->VideoTransitionType == M4xVSS_kVideoTransitionType_AlphaMagic)
   2814             {
   2815                 // Set the alpha magic settings.
   2816                 videoEditClasses_getAlphaMagicSettings(pResult, pEnv, alphaSettings,
   2817                                   &pSettings->xVSS.transitionSpecific.pAlphaMagicSettings);
   2818             }
   2819         }
   2820 
   2821         // Check if settings could be set.
   2822         if (*pResult)
   2823         {
   2824             // Return the settings.
   2825             (*ppSettings) = pSettings;
   2826         }
   2827         else
   2828         {
   2829             // Free the settings.
   2830             videoEditClasses_freeTransitionSettings(&pSettings);
   2831         }
   2832     }
   2833 }
   2834 
   2835 void
   2836 videoEditClasses_freeTransitionSettings(
   2837                 M4VSS3GPP_TransitionSettings**      ppSettings)
   2838 {
   2839     // Check if memory was allocated for the TransitionSettings.
   2840     if (M4OSA_NULL != (*ppSettings))
   2841     {
   2842         // Log the function call.
   2843         VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2844                                "videoEditClasses_freeTransitionSettings()");
   2845 
   2846         // Check if a slide transition or alpha magic setting structure is expected.
   2847         if ((int)(*ppSettings)->VideoTransitionType == M4xVSS_kVideoTransitionType_SlideTransition)
   2848         {
   2849             // Free the slide transition settings.
   2850             videoEditClasses_freeSlideTransitionSettings(
   2851                                &(*ppSettings)->xVSS.transitionSpecific.pSlideTransitionSettings);
   2852         }
   2853         else
   2854         {
   2855             // Free the alpha magic settings.
   2856             videoEditClasses_freeAlphaMagicSettings(
   2857                               &(*ppSettings)->xVSS.transitionSpecific.pAlphaMagicSettings);
   2858         }
   2859 
   2860         // Free the settings structure.
   2861         videoEditOsal_free((*ppSettings));
   2862         (*ppSettings) = M4OSA_NULL;
   2863     }
   2864 }
   2865 
   2866 #ifdef VIDEOEDIT_LOGGING_ENABLED
   2867 void
   2868 videoEditClasses_logTransitionSettings(
   2869                 M4VSS3GPP_TransitionSettings*       pSettings,
   2870                 int                                 indentation)
   2871 {
   2872     // Check if memory was allocated for the TransitionSettings.
   2873     if (M4OSA_NULL != pSettings)
   2874     {
   2875         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2876                                "%*c uiTransitionDuration:       %u ms", indentation, ' ',
   2877                                   (unsigned int)pSettings->uiTransitionDuration);
   2878         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2879                            "%*c VideoTransitionType:        %s",    indentation, ' ',
   2880                            videoEditJava_getVideoTransitionString(pSettings->VideoTransitionType));
   2881         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2882                               "%*c ExtVideoTransitionFct:      %s",    indentation, ' ',
   2883                               (M4OSA_NULL != pSettings->ExtVideoTransitionFct) ? "set" : "<null>");
   2884         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2885                          "%*c pExtVideoTransitionFctCtxt: %s",    indentation, ' ',
   2886                          (M4OSA_NULL != pSettings->pExtVideoTransitionFctCtxt) ? "set" : "<null>");
   2887         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2888                          "%*c AudioTransitionType:        %s",    indentation, ' ',
   2889                           videoEditJava_getAudioTransitionString(pSettings->AudioTransitionType));
   2890         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2891                       "%*c TransitionBehaviour:        %s",    indentation, ' ',
   2892                       videoEditJava_getTransitionBehaviourString(pSettings->TransitionBehaviour));
   2893 
   2894         // Check if a slide transition or alpha magic setting structure is expected.
   2895         if ((int)pSettings->VideoTransitionType == M4xVSS_kVideoTransitionType_SlideTransition)
   2896         {
   2897             // Log the slide transition settings.
   2898             VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2899                                    "%*c pSlideTransitionSettings:", indentation, ' ');
   2900             videoEditClasses_logSlideTransitionSettings\
   2901             (pSettings->xVSS.transitionSpecific.pSlideTransitionSettings,
   2902             indentation + VIDEOEDIT_LOG_INDENTATION);
   2903         }
   2904         else
   2905         {
   2906             // Log the alpha magic settings.
   2907             VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2908                                    "%*c pAlphaMagicSettings:", indentation, ' ');
   2909             videoEditClasses_logAlphaMagicSettings\
   2910             (pSettings->xVSS.transitionSpecific.pAlphaMagicSettings,
   2911             indentation + VIDEOEDIT_LOG_INDENTATION);
   2912         }
   2913     }
   2914     else
   2915     {
   2916         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   2917                                "%*c <null>", indentation, ' ');
   2918     }
   2919 }
   2920 #endif
   2921 #ifdef VIDEOEDIT_LOGGING_ENABLED
   2922 void
   2923 videoEditPropClass_logProperties(
   2924                 VideoEditPropClass_Properties*                   pProperties,
   2925                 int                                 indentation)
   2926 {
   2927     // Check if memory was allocated for the Properties.
   2928     if (M4OSA_NULL != pProperties)
   2929     {
   2930         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2931             "%*c uiClipDuration:                   %u",       indentation, ' ',
   2932             (unsigned int)pProperties->uiClipDuration);
   2933         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2934             "%*c FileType:                         %s",       indentation, ' ',
   2935             videoEditJava_getFileTypeString(pProperties->FileType));
   2936 
   2937         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2938             "%*c VideoStreamType:                  %s",       indentation, ' ',
   2939             videoEditJava_getVideoFormatString(pProperties->VideoStreamType));
   2940         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2941             "%*c uiClipVideoDuration:              %u",       indentation, ' ',
   2942             (unsigned int)pProperties->uiClipVideoDuration);
   2943 
   2944         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2945             "%*c uiVideoBitrate:                   %s",       indentation, ' ',
   2946             videoEditJava_getBitrateString(pProperties->uiVideoBitrate));
   2947 
   2948         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2949             "%*c uiVideoWidth:                     %u",       indentation, ' ',
   2950             (unsigned int)pProperties->uiVideoWidth);
   2951 
   2952         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2953             "%*c uiVideoHeight:                    %u",       indentation, ' ',
   2954             (unsigned int)(unsigned int)pProperties->uiVideoHeight);
   2955 
   2956         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2957             "%*c fAverageFrameRate:                %.3f",     indentation, ' ',
   2958             pProperties->fAverageFrameRate);
   2959 
   2960         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2961             "%*c AudioStreamType:                  %s",       indentation, ' ',
   2962             videoEditJava_getAudioFormatString(pProperties->AudioStreamType));
   2963 
   2964         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2965             "%*c uiClipAudioDuration:              %u",       indentation, ' ',
   2966             (unsigned int)pProperties->uiClipAudioDuration);
   2967 
   2968         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2969             "%*c uiAudioBitrate:                   %s",       indentation, ' ',
   2970             videoEditJava_getBitrateString(pProperties->uiAudioBitrate));
   2971 
   2972         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2973             "%*c uiNbChannels:                     %u",       indentation, ' ',
   2974             (unsigned int)pProperties->uiNbChannels);
   2975 
   2976         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2977              "%*c uiSamplingFrequency:              %u",       indentation, ' ',
   2978             (unsigned int)pProperties->uiSamplingFrequency);
   2979     }
   2980     else
   2981     {
   2982         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_PROP_CLASSES",
   2983             "%*c <null>", indentation, ' ');
   2984     }
   2985 }
   2986 #endif
   2987 
   2988 
   2989 void
   2990 videoEditClasses_createVersion(
   2991                 bool*                               pResult,
   2992                 JNIEnv*                             pEnv,
   2993                 M4_VersionInfo*                     pVersionInfo,
   2994                 jobject*                            pObject)
   2995 {
   2996 
   2997     VideoEditJava_VersionFieldIds fieldIds;
   2998     jclass                clazz    = NULL;
   2999     jobject               object   = NULL;
   3000     memset(&fieldIds, 0, sizeof(VideoEditJava_VersionFieldIds));
   3001     // Check if the previous action succeeded.
   3002     if (*pResult)
   3003     {
   3004         // Log the function call.
   3005         VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   3006                                "videoEditClasses_createVersion()");
   3007 
   3008         // Retrieve the class.
   3009         videoEditJava_getVersionClass(pResult, pEnv, &clazz);
   3010 
   3011         // Retrieve the field ids.
   3012         videoEditJava_getVersionFieldIds(pResult, pEnv, &fieldIds);
   3013     }
   3014 
   3015     // Only create an object if the class and fields could be located.
   3016     if (*pResult)
   3017     {
   3018         // Allocate a new object.
   3019         object = pEnv->AllocObject(clazz);
   3020 
   3021         // check if alloc is done
   3022         videoEditJava_checkAndThrowRuntimeException(pResult, pEnv,
   3023                                                     (NULL == object),
   3024                                                     M4ERR_ALLOC);
   3025         if (NULL != object)
   3026         {
   3027             // Set the major field.
   3028             pEnv->SetIntField(object, fieldIds.major, pVersionInfo->m_major);
   3029 
   3030             // Set the minor field.
   3031             pEnv->SetIntField(object, fieldIds.minor, pVersionInfo->m_minor);
   3032 
   3033             // Set the revision field.
   3034             pEnv->SetIntField(object, fieldIds.revision, pVersionInfo->m_revision);
   3035 
   3036             // Return the object.
   3037             (*pObject) = object;
   3038         }
   3039     }
   3040 }
   3041 
   3042 #ifdef VIDEOEDIT_LOGGING_ENABLED
   3043 void
   3044 videoEditClasses_logVersion(
   3045                 M4_VersionInfo*                     pVersionInfo,
   3046                 int                                 indentation)
   3047 {
   3048     // Check if memory was allocated for the Version.
   3049     if (M4OSA_NULL != pVersionInfo)
   3050     {
   3051         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   3052                              "%*c major:    %u ms", indentation, ' ',
   3053                              (unsigned int)pVersionInfo->m_major);
   3054         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   3055                               "%*c minor:    %u",    indentation, ' ',
   3056                               (unsigned int)pVersionInfo->m_minor);
   3057         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   3058                              "%*c revision: %u",    indentation, ' ',
   3059                              (unsigned int)pVersionInfo->m_revision);
   3060     }
   3061     else
   3062     {
   3063         VIDEOEDIT_LOG_SETTING(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   3064                               "%*c <null>", indentation, ' ');
   3065     }
   3066 }
   3067 #endif
   3068 
   3069 
   3070 void*
   3071 videoEditClasses_getContext(
   3072                 bool*                               pResult,
   3073                 JNIEnv*                             pEnv,
   3074                 jobject                             object)
   3075 {
   3076     void*                pContext = M4OSA_NULL;
   3077     jclass               clazz    = NULL;
   3078     VideoEditJava_EngineFieldIds fieldIds = {NULL};
   3079 
   3080     // Check if the previous action succeeded.
   3081     if (*pResult)
   3082     {
   3083         // Log the function call.
   3084         VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   3085                                "videoEditClasses_getContext()");
   3086 
   3087         // Retrieve the class.
   3088         videoEditJava_getEngineClass(pResult, pEnv, &clazz);
   3089 
   3090         // Retrieve the field ids.
   3091         videoEditJava_getEngineFieldIds(pResult, pEnv, &fieldIds);
   3092     }
   3093 
   3094     // Check if the class and field ids could be located.
   3095     if (*pResult)
   3096     {
   3097         // Retrieve the context pointer.
   3098         pContext = (void *)pEnv->GetIntField(object, fieldIds.context);
   3099     }
   3100 
   3101     // Return the context pointer.
   3102     return(pContext);
   3103 }
   3104 
   3105 void
   3106 videoEditClasses_setContext(
   3107                 bool*                               pResult,
   3108                 JNIEnv*                             pEnv,
   3109                 jobject                             object,
   3110                 void*                               pContext)
   3111 {
   3112     jclass               clazz    = NULL;
   3113     VideoEditJava_EngineFieldIds fieldIds = {NULL};
   3114 
   3115     // Check if the previous action succeeded.
   3116     if (*pResult)
   3117     {
   3118         // Log the function call.
   3119         VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   3120                                "videoEditClasses_setContext()");
   3121 
   3122         // Retrieve the class.
   3123         videoEditJava_getEngineClass(pResult, pEnv, &clazz);
   3124 
   3125         // Retrieve the field ids.
   3126         videoEditJava_getEngineFieldIds(pResult, pEnv, &fieldIds);
   3127     }
   3128 
   3129     // Check if the class and field ids could be located.
   3130     if (*pResult)
   3131     {
   3132         // Set the context field.
   3133         VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   3134                         "The context value from JAVA before setting is = 0x%x",
   3135                         pEnv->GetIntField(object, fieldIds.context));
   3136 
   3137         pEnv->SetIntField(object, fieldIds.context, (int)pContext);
   3138         M4OSA_TRACE1_1("The context value in JNI is = 0x%x",pContext);
   3139 
   3140         VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES",
   3141                          "The context value from JAVA after setting is = 0x%x",
   3142                          pEnv->GetIntField(object, fieldIds.context));
   3143     }
   3144 }
   3145 
   3146