1fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi/* 2fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * Copyright (C) 2010 The Android Open Source Project 3fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * 4fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * Licensed under the Apache License, Version 2.0 (the "License"); 5fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * you may not use this file except in compliance with the License. 6fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * You may obtain a copy of the License at 7fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * 8fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * http://www.apache.org/licenses/LICENSE-2.0 9fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * 10fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * Unless required by applicable law or agreed to in writing, software 11fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * distributed under the License is distributed on an "AS IS" BASIS, 12fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * See the License for the specific language governing permissions and 14fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * limitations under the License. 15fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 16fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 18fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschipackage android.media.videoeditor; 19fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 20fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport java.io.File; 21fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport java.io.FileInputStream; 22fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport java.io.FileNotFoundException; 23fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport java.io.FileOutputStream; 24fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport java.io.IOException; 25fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport java.io.StringWriter; 26fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport java.util.ArrayList; 27fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport java.util.Iterator; 28fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport java.util.List; 295665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschiimport java.util.Map; 303f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschiimport java.util.concurrent.Semaphore; 313f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschiimport java.util.concurrent.TimeUnit; 323f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi 33fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport org.xmlpull.v1.XmlPullParser; 34fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport org.xmlpull.v1.XmlPullParserException; 35fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport org.xmlpull.v1.XmlSerializer; 36fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 372bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschiimport android.graphics.Bitmap; 38048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschiimport android.graphics.Rect; 3929206e917574688a6270233f92b734a2d7231faaGil Dobjanschiimport android.media.videoeditor.MediaImageItem; 4029206e917574688a6270233f92b734a2d7231faaGil Dobjanschiimport android.media.videoeditor.MediaItem; 4124a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dongimport android.media.MediaMetadataRetriever; 42fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport android.util.Log; 43fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport android.util.Xml; 449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.view.Surface; 45fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschiimport android.view.SurfaceHolder; 46f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowduryimport android.os.Debug; 47f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowduryimport android.os.SystemProperties; 48f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowduryimport android.os.Environment; 49fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 50fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi/** 51590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi * The VideoEditor implementation {@hide} 52fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 53731e46575aeffa26b41d7590a0a4de637d792258Gil Dobjanschipublic class VideoEditorImpl implements VideoEditor { 549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Logging 569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 57fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String TAG = "VideoEditorImpl"; 58fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * The project filename 619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 62fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String PROJECT_FILENAME = "videoeditor.xml"; 631abe0050fa82ada9dbc14f7371e8b4ef0e093936Santosh Madhava 641abe0050fa82ada9dbc14f7371e8b4ef0e093936Santosh Madhava /* 659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * XML tags 669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 67fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String TAG_PROJECT = "project"; 68fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String TAG_MEDIA_ITEMS = "media_items"; 69fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String TAG_MEDIA_ITEM = "media_item"; 7021e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi private static final String TAG_TRANSITIONS = "transitions"; 7121e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi private static final String TAG_TRANSITION = "transition"; 725665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi private static final String TAG_OVERLAYS = "overlays"; 735665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi private static final String TAG_OVERLAY = "overlay"; 742bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi private static final String TAG_OVERLAY_USER_ATTRIBUTES = "overlay_user_attributes"; 75048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi private static final String TAG_EFFECTS = "effects"; 76048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi private static final String TAG_EFFECT = "effect"; 773398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi private static final String TAG_AUDIO_TRACKS = "audio_tracks"; 783398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi private static final String TAG_AUDIO_TRACK = "audio_track"; 795665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi 80fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String ATTR_ID = "id"; 81fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String ATTR_FILENAME = "filename"; 829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private static final String ATTR_AUDIO_WAVEFORM_FILENAME = "waveform"; 83fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String ATTR_RENDERING_MODE = "rendering_mode"; 84fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String ATTR_ASPECT_RATIO = "aspect_ratio"; 859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private static final String ATTR_REGENERATE_PCM = "regeneratePCMFlag"; 86fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String ATTR_TYPE = "type"; 87fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String ATTR_DURATION = "duration"; 883398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi private static final String ATTR_START_TIME = "start_time"; 893398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi private static final String ATTR_BEGIN_TIME = "begin_time"; 90fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String ATTR_END_TIME = "end_time"; 91fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private static final String ATTR_VOLUME = "volume"; 92590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi private static final String ATTR_BEHAVIOR = "behavior"; 93590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi private static final String ATTR_DIRECTION = "direction"; 94590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi private static final String ATTR_BLENDING = "blending"; 95590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi private static final String ATTR_INVERT = "invert"; 96590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi private static final String ATTR_MASK = "mask"; 9721e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi private static final String ATTR_BEFORE_MEDIA_ITEM_ID = "before_media_item"; 9821e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi private static final String ATTR_AFTER_MEDIA_ITEM_ID = "after_media_item"; 99048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi private static final String ATTR_COLOR_EFFECT_TYPE = "color_type"; 100048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi private static final String ATTR_COLOR_EFFECT_VALUE = "color_value"; 1019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private static final String ATTR_START_RECT_LEFT = "start_l"; 1029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private static final String ATTR_START_RECT_TOP = "start_t"; 1039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private static final String ATTR_START_RECT_RIGHT = "start_r"; 1049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private static final String ATTR_START_RECT_BOTTOM = "start_b"; 1059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private static final String ATTR_END_RECT_LEFT = "end_l"; 1069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private static final String ATTR_END_RECT_TOP = "end_t"; 1079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private static final String ATTR_END_RECT_RIGHT = "end_r"; 1089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private static final String ATTR_END_RECT_BOTTOM = "end_b"; 1093398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi private static final String ATTR_LOOP = "loop"; 11061f9184547a3b9ad4c06846b87f1b1cbd4787230Gil Dobjanschi private static final String ATTR_MUTED = "muted"; 1117bfcabbb9e5425985b2f2ffe095949e290a8a4aeGil Dobjanschi private static final String ATTR_DUCK_ENABLED = "ducking_enabled"; 1127bfcabbb9e5425985b2f2ffe095949e290a8a4aeGil Dobjanschi private static final String ATTR_DUCK_THRESHOLD = "ducking_threshold"; 1137bfcabbb9e5425985b2f2ffe095949e290a8a4aeGil Dobjanschi private static final String ATTR_DUCKED_TRACK_VOLUME = "ducking_volume"; 1142bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi private static final String ATTR_GENERATED_IMAGE_CLIP = "generated_image_clip"; 115178d4f41119614b9064720a5bffeaebf3affe941Dheeraj Sharma private static final String ATTR_IS_IMAGE_CLIP_GENERATED = "is_image_clip_generated"; 1162bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi private static final String ATTR_GENERATED_TRANSITION_CLIP = "generated_transition_clip"; 1172bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi private static final String ATTR_IS_TRANSITION_GENERATED = "is_transition_generated"; 1182bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi private static final String ATTR_OVERLAY_RGB_FILENAME = "overlay_rgb_filename"; 1192bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi private static final String ATTR_OVERLAY_FRAME_WIDTH = "overlay_frame_width"; 1202bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi private static final String ATTR_OVERLAY_FRAME_HEIGHT = "overlay_frame_height"; 12163298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava private static final String ATTR_OVERLAY_RESIZED_RGB_FRAME_WIDTH = "resized_RGBframe_width"; 12263298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava private static final String ATTR_OVERLAY_RESIZED_RGB_FRAME_HEIGHT = "resized_RGBframe_height"; 123a3f87f855b9abe2d086658eba8a92e04b69dd078Dharmaray Kundargi private static final int ENGINE_ACCESS_MAX_TIMEOUT_MS = 500; 1249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 1259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Instance variables 1269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 1273f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi private final Semaphore mLock; 128fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private final String mProjectPath; 129fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private final List<MediaItem> mMediaItems = new ArrayList<MediaItem>(); 130fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private final List<AudioTrack> mAudioTracks = new ArrayList<AudioTrack>(); 131fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private final List<Transition> mTransitions = new ArrayList<Transition>(); 1323f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi private long mDurationMs; 133fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private int mAspectRatio; 134fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 1359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 1369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Private Object for calling native Methods via MediaArtistNativeHelper 137fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 1389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private MediaArtistNativeHelper mMANativeHelper; 1399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private boolean mPreviewInProgress = false; 140f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury private final boolean mMallocDebug; 141fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 142fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /** 143fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * Constructor 144fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * 1459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @param projectPath - The path where the VideoEditor stores all files 1469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * related to the project 147fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 148731e46575aeffa26b41d7590a0a4de637d792258Gil Dobjanschi public VideoEditorImpl(String projectPath) throws IOException { 149f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury String s; 150f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury s = SystemProperties.get("libc.debug.malloc"); 151f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury if (s.equals("1")) { 152f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury mMallocDebug = true; 153f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury try { 154f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury dumpHeap("HeapAtStart"); 155f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury } catch (Exception ex) { 156f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury Log.e(TAG, "dumpHeap returned error in constructor"); 157f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury } 158f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury } else { 159f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury mMallocDebug = false; 160f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury } 1613f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi mLock = new Semaphore(1, true); 1623f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi mMANativeHelper = new MediaArtistNativeHelper(projectPath, mLock, this); 163fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi mProjectPath = projectPath; 164fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi final File projectXml = new File(projectPath, PROJECT_FILENAME); 165fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi if (projectXml.exists()) { 166fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi try { 167fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi load(); 168fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } catch (Exception ex) { 1699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ex.printStackTrace(); 1709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IOException(ex.toString()); 171fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 172fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } else { 173fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi mAspectRatio = MediaProperties.ASPECT_RATIO_16_9; 174fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi mDurationMs = 0; 175fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 176fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 177fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 178fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 1799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @return The MediaArtistNativeHelper object 1809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 1819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava MediaArtistNativeHelper getNativeContext() { 1829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mMANativeHelper; 1839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 186fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 187fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 1889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public synchronized void addAudioTrack(AudioTrack audioTrack) { 1899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (audioTrack == null) { 1909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("Audio Track is null"); 1919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1922bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 1939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mAudioTracks.size() == 1) { 1949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("No more tracks can be added"); 1959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 197a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi mMANativeHelper.setGeneratePreview(true); 198a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi 1999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 2009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Add the audio track to AudioTrack list 2019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 2029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mAudioTracks.add(audioTrack); 2039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 2049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 2059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Form the audio PCM file path 2069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 2072bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi final String audioTrackPCMFilePath = String.format(mProjectPath + "/" 2089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava + "AudioPcm" + audioTrack.getId() + ".pcm"); 2099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 2109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 2119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Create PCM only if not generated in previous session 2129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 2132bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi if (new File(audioTrackPCMFilePath).exists()) { 2149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMANativeHelper.setAudioflag(false); 2159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 2162bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 217fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 218fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 219fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 220fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 221fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 222fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi public synchronized void addMediaItem(MediaItem mediaItem) { 2239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 2249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Validate Media Item 2259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 2269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mediaItem == null) { 2279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("Media item is null"); 228fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 2299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 2309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Add the Media item to MediaItem list 2319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 232fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi if (mMediaItems.contains(mediaItem)) { 2332bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi throw new IllegalArgumentException("Media item already exists: " + mediaItem.getId()); 234fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 235fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 236a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi mMANativeHelper.setGeneratePreview(true); 237a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi 2389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 2399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Invalidate the end transition if necessary 2409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 241590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi final int mediaItemsCount = mMediaItems.size(); 2422bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi if (mediaItemsCount > 0) { 243590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi removeTransitionAfter(mediaItemsCount - 1); 244590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi } 245590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi 2469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 2479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Add the new media item 2489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 249fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi mMediaItems.add(mediaItem); 250590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi 251fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi computeTimelineDuration(); 252a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi 2539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 2549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Generate project thumbnail only from first media Item on storyboard 2559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 2569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mMediaItems.size() == 1) { 2579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava generateProjectThumbnail(); 2589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 259fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 260fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 2619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 262fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 263fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 264fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 2659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public synchronized void addTransition(Transition transition) { 2669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (transition == null) { 2679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("Null Transition"); 268fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 2692bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 2709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem beforeMediaItem = transition.getBeforeMediaItem(); 2719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem afterMediaItem = transition.getAfterMediaItem(); 2729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 2739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Check if the MediaItems are in sequence 2749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 2759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mMediaItems == null) { 2769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("No media items are added"); 277fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 278fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 2792bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi if ((afterMediaItem != null) && (beforeMediaItem != null)) { 2802bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi final int afterMediaItemIndex = mMediaItems.indexOf(afterMediaItem); 2812bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi final int beforeMediaItemIndex = mMediaItems.indexOf(beforeMediaItem); 2829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 2839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if ((afterMediaItemIndex == -1) || (beforeMediaItemIndex == -1)) { 2849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException 2859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ("Either of the mediaItem is not found in the list"); 286fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 2872bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 2889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (afterMediaItemIndex != (beforeMediaItemIndex - 1) ) { 2899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("MediaItems are not in sequence"); 2909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 291a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi } 292a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi 293a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi mMANativeHelper.setGeneratePreview(true); 2949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 2959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mTransitions.add(transition); 2969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 2979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Cross reference the transitions 2989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 2999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (afterMediaItem != null) { 3009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 3019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * If a transition already exists at the specified position then 3029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * invalidate it. 3039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 3049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (afterMediaItem.getEndTransition() != null) { 3059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava afterMediaItem.getEndTransition().invalidate(); 3069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mTransitions.remove(afterMediaItem.getEndTransition()); 3079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 3089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava afterMediaItem.setEndTransition(transition); 3099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 3109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 3119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (beforeMediaItem != null) { 3129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 3139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * If a transition already exists at the specified position then 3149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * invalidate it. 3159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 3169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (beforeMediaItem.getBeginTransition() != null) { 3179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava beforeMediaItem.getBeginTransition().invalidate(); 3189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mTransitions.remove(beforeMediaItem.getBeginTransition()); 319fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 3209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava beforeMediaItem.setBeginTransition(transition); 3219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 3229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 3239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava computeTimelineDuration(); 3249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 3259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 3269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 3279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@inheritDoc} 3289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 3299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public void cancelExport(String filename) { 3309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mMANativeHelper != null && filename != null) { 3319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMANativeHelper.stop(filename); 332fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 333fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 334fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 335fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 336fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 337fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 3389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public void export(String filename, int height, int bitrate, 3399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava int audioCodec, int videoCodec, 340600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng ExportProgressListener listener) 341600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng throws IOException { 3423ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury int audcodec = 0; 3433ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury int vidcodec = 0; 3442bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi if (filename == null) { 3459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("export: filename is null"); 3469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 3472bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 3482bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi final File tempPathFile = new File(filename); 3499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (tempPathFile == null) { 3509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IOException(filename + "can not be created"); 3519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 3522bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 3539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mMediaItems.size() == 0) { 3549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalStateException("No MediaItems added"); 355fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 356fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 3579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava switch (height) { 3589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.HEIGHT_144: 3599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 360bcbf68583e38eeb79266f9f3a8c3d1b17f75a8c2Santosh Madhava case MediaProperties.HEIGHT_288: 361bcbf68583e38eeb79266f9f3a8c3d1b17f75a8c2Santosh Madhava break; 3629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.HEIGHT_360: 3639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 3649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.HEIGHT_480: 3659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 3669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.HEIGHT_720: 3679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 368600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng case MediaProperties.HEIGHT_1080: 369600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng break; 3709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 3712bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi default: { 37220586a128c1faa0bcca27537f006a2cbcd17206dJames Dong String message = "Unsupported height value " + height; 37320586a128c1faa0bcca27537f006a2cbcd17206dJames Dong throw new IllegalArgumentException(message); 3742bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi } 3759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 3762bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 3779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava switch (bitrate) { 3789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_28K: 3799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 3809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_40K: 3819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 3829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_64K: 3839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 3849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_96K: 3859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 3869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_128K: 3879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 3889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_192K: 3899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 3909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_256K: 3919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 3929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_384K: 3939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 3949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_512K: 3959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 3969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_800K: 3979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 3989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_2M: 3999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 4009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_5M: 4019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 4029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava case MediaProperties.BITRATE_8M: 4039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava break; 4049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 4052bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi default: { 40620586a128c1faa0bcca27537f006a2cbcd17206dJames Dong final String message = "Unsupported bitrate value " + bitrate; 40720586a128c1faa0bcca27537f006a2cbcd17206dJames Dong throw new IllegalArgumentException(message); 4082bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi } 409fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 4104d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav computeTimelineDuration(); 4114d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav final long audioBitrate = MediaArtistNativeHelper.Bitrate.BR_96_KBPS; 4124d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav final long fileSize = (mDurationMs * (bitrate + audioBitrate)) / 8000; 4134d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav if (MAX_SUPPORTED_FILE_SIZE <= fileSize) { 4144d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav throw new IllegalStateException("Export Size is more than 2GB"); 4154d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav } 4163ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury switch (audioCodec) { 4173ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury case MediaProperties.ACODEC_AAC_LC: 4183ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury audcodec = MediaArtistNativeHelper.AudioFormat.AAC; 4193ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury break; 4203ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury case MediaProperties.ACODEC_AMRNB: 4213ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury audcodec = MediaArtistNativeHelper.AudioFormat.AMR_NB; 4223ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury break; 4233ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury 4243ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury default: { 4253ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury String message = "Unsupported audio codec type " + audioCodec; 4263ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury throw new IllegalArgumentException(message); 4273ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury } 4283ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury } 4293ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury 4303ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury switch (videoCodec) { 4313ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury case MediaProperties.VCODEC_H263: 4323ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury vidcodec = MediaArtistNativeHelper.VideoFormat.H263; 4333ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury break; 4343ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury case MediaProperties.VCODEC_H264: 4353ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury vidcodec = MediaArtistNativeHelper.VideoFormat.H264; 4363ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury break; 4373ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury case MediaProperties.VCODEC_MPEG4: 4383ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury vidcodec = MediaArtistNativeHelper.VideoFormat.MPEG4; 4393ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury break; 4403ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury 4413ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury default: { 4423ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury String message = "Unsupported video codec type " + videoCodec; 4433ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury throw new IllegalArgumentException(message); 4443ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury } 4453ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury } 446fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 4472bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi boolean semAcquireDone = false; 4481abe0050fa82ada9dbc14f7371e8b4ef0e093936Santosh Madhava try { 4493f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi lock(); 4502bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi semAcquireDone = true; 4513f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi 4523f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi if (mMANativeHelper == null) { 4533f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi throw new IllegalStateException("The video editor is not initialized"); 4543f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 4553ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury mMANativeHelper.setAudioCodec(audcodec); 4563ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury mMANativeHelper.setVideoCodec(vidcodec); 4571abe0050fa82ada9dbc14f7371e8b4ef0e093936Santosh Madhava mMANativeHelper.export(filename, mProjectPath, height,bitrate, 4582bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMediaItems, mTransitions, mAudioTracks, listener); 4591abe0050fa82ada9dbc14f7371e8b4ef0e093936Santosh Madhava } catch (InterruptedException ex) { 460eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi Log.e(TAG, "Sem acquire NOT successful in export"); 4611abe0050fa82ada9dbc14f7371e8b4ef0e093936Santosh Madhava } finally { 4622bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi if (semAcquireDone) { 4633f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi unlock(); 4642bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi } 4651abe0050fa82ada9dbc14f7371e8b4ef0e093936Santosh Madhava } 466fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 467fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 468fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 469fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 470fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 4713ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury public void export(String filename, int height, int bitrate, 4723ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury ExportProgressListener listener) 4733ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury throws IOException { 4743ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury int defaultAudiocodec = MediaArtistNativeHelper.AudioFormat.AAC; 4753ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury int defaultVideocodec = MediaArtistNativeHelper.VideoFormat.H264; 4763ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury 4773ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury export(filename, height, bitrate, defaultAudiocodec, 4783ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury defaultVideocodec, listener); 4793ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury } 4803ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury 4813ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury /* 4823ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury * {@inheritDoc} 4833ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury */ 4849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public void generatePreview(MediaProcessingProgressListener listener) { 4859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava boolean semAcquireDone = false; 4861abe0050fa82ada9dbc14f7371e8b4ef0e093936Santosh Madhava try { 4873f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi lock(); 4889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava semAcquireDone = true; 4892bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 4903f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi if (mMANativeHelper == null) { 4913f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi throw new IllegalStateException("The video editor is not initialized"); 4923f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 4933f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi 4949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if ((mMediaItems.size() > 0) || (mAudioTracks.size() > 0)) { 4952bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMANativeHelper.previewStoryBoard(mMediaItems, mTransitions, mAudioTracks, 4962bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi listener); 4979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 4989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } catch (InterruptedException ex) { 499eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi Log.e(TAG, "Sem acquire NOT successful in previewStoryBoard"); 5009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } finally { 5019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (semAcquireDone) { 5023f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi unlock(); 503fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 504fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 5059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 506fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 5079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 5089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@inheritDoc} 5099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 5109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public List<AudioTrack> getAllAudioTracks() { 5119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mAudioTracks; 512fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 513fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 514fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 515fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 516fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 5179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public List<MediaItem> getAllMediaItems() { 518fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi return mMediaItems; 519fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 520fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 521fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 522fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 523fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 5249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public List<Transition> getAllTransitions() { 5259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mTransitions; 526fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 527fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 528fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 529fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 530fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 5319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public int getAspectRatio() { 5329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mAspectRatio; 5339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 534590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi 5359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 5369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@inheritDoc} 5379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 5389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public AudioTrack getAudioTrack(String audioTrackId) { 5399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava for (AudioTrack at : mAudioTracks) { 5409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (at.getId().equals(audioTrackId)) { 5419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return at; 542590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi } 543fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 5449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return null; 5459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 546590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi 5479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 5489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@inheritDoc} 5499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 5509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public long getDuration() { 5519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 5529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Since MediaImageItem can change duration we need to compute the 5539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * duration here 5549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 5559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava computeTimelineDuration(); 5569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mDurationMs; 5579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 55821e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi 5599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 5609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Force updates the timeline duration 5619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 5629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava void updateTimelineDuration() { 563fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi computeTimelineDuration(); 564fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 565fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 566fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 567fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 568fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 5699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public synchronized MediaItem getMediaItem(String mediaItemId) { 5709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava for (MediaItem mediaItem : mMediaItems) { 5719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mediaItem.getId().equals(mediaItemId)) { 5729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mediaItem; 5739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 574fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 5759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return null; 576fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 577fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 578fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 579fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 580fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 5819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public String getPath() { 5829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mProjectPath; 583fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 584fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 585fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 586fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 587fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 588fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi public Transition getTransition(String transitionId) { 589fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi for (Transition transition : mTransitions) { 590fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi if (transition.getId().equals(transitionId)) { 591fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi return transition; 592fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 593fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 594fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi return null; 595fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 596fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 597fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 598fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 599fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 6009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public synchronized void insertAudioTrack(AudioTrack audioTrack, 6019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava String afterAudioTrackId) { 6029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mAudioTracks.size() == 1) { 6039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("No more tracks can be added"); 604fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 605fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 606fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi if (afterAudioTrackId == null) { 6072bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMANativeHelper.setGeneratePreview(true); 608a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi mAudioTracks.add(0, audioTrack); 609fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } else { 610fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi final int audioTrackCount = mAudioTracks.size(); 611fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi for (int i = 0; i < audioTrackCount; i++) { 612fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi AudioTrack at = mAudioTracks.get(i); 613fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi if (at.getId().equals(afterAudioTrackId)) { 6142bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMANativeHelper.setGeneratePreview(true); 615a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi mAudioTracks.add(i + 1, audioTrack); 616fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi return; 617fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 618fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 6192bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 6202bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi throw new IllegalArgumentException("AudioTrack not found: " + afterAudioTrackId); 6219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 6229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 623fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 6249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 6259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@inheritDoc} 6269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 6272bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi public synchronized void insertMediaItem(MediaItem mediaItem, String afterMediaItemId) { 6289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mMediaItems.contains(mediaItem)) { 6292bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi throw new IllegalArgumentException("Media item already exists: " + mediaItem.getId()); 630fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 6319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 6329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (afterMediaItemId == null) { 633a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi mMANativeHelper.setGeneratePreview(true); 6349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mMediaItems.size() > 0) { 6359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 6369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Invalidate the transition at the beginning of the timeline 6379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 6389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava removeTransitionBefore(0); 6399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 6402bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 6419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMediaItems.add(0, mediaItem); 6429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava computeTimelineDuration(); 6439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava generateProjectThumbnail(); 6449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } else { 6459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final int mediaItemCount = mMediaItems.size(); 6469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava for (int i = 0; i < mediaItemCount; i++) { 6479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem mi = mMediaItems.get(i); 6489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mi.getId().equals(afterMediaItemId)) { 649a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi mMANativeHelper.setGeneratePreview(true); 6509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 6519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Invalidate the transition at this position 6529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 6539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava removeTransitionAfter(i); 6549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 6559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Insert the new media item 6569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 6579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMediaItems.add(i + 1, mediaItem); 6589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava computeTimelineDuration(); 6599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return; 6609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 6619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 6622bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 6632bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi throw new IllegalArgumentException("MediaItem not found: " + afterMediaItemId); 6649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 665fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 666fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 667fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 668fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 669fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 6702bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi public synchronized void moveAudioTrack(String audioTrackId, String afterAudioTrackId) { 671fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi throw new IllegalStateException("Not supported"); 672fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 673fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 674fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 675fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 676fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 6772bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi public synchronized void moveMediaItem(String mediaItemId, String afterMediaItemId) { 6789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem moveMediaItem = removeMediaItem(mediaItemId,true); 6799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (moveMediaItem == null) { 6802bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi throw new IllegalArgumentException("Target MediaItem not found: " + mediaItemId); 681fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 682fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 6839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (afterMediaItemId == null) { 6849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mMediaItems.size() > 0) { 685a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi mMANativeHelper.setGeneratePreview(true); 686a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi 6879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 6889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Invalidate adjacent transitions at the insertion point 6899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 6909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava removeTransitionBefore(0); 6919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 6929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 6939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Insert the media item at the new position 6949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 6959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMediaItems.add(0, moveMediaItem); 6969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava computeTimelineDuration(); 6972bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 6989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava generateProjectThumbnail(); 6999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } else { 7009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalStateException("Cannot move media item (it is the only item)"); 7019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 7029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } else { 7039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final int mediaItemCount = mMediaItems.size(); 7049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava for (int i = 0; i < mediaItemCount; i++) { 7059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem mi = mMediaItems.get(i); 7069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mi.getId().equals(afterMediaItemId)) { 707a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi mMANativeHelper.setGeneratePreview(true); 7089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 7099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Invalidate adjacent transitions at the insertion point 7109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 7119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava removeTransitionAfter(i); 7129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 7139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Insert the media item at the new position 7149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 7159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMediaItems.add(i + 1, moveMediaItem); 7169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava computeTimelineDuration(); 7179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return; 7189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 7199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 7209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 7212bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi throw new IllegalArgumentException("MediaItem not found: " + afterMediaItemId); 722fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 7239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 724fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 7259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 7269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@inheritDoc} 7279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 7289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public void release() { 7299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava stopPreview(); 7303f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi 7313f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi boolean semAcquireDone = false; 7323f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi try { 7333f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi lock(); 7343f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi semAcquireDone = true; 7353f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi 7363f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi if (mMANativeHelper != null) { 7373f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi mMediaItems.clear(); 7383f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi mAudioTracks.clear(); 7393f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi mTransitions.clear(); 7403f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi mMANativeHelper.releaseNativeHelper(); 7413f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi mMANativeHelper = null; 7423f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 7433f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } catch (Exception ex) { 7443f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi Log.e(TAG, "Sem acquire NOT successful in export", ex); 7453f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } finally { 7463f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi if (semAcquireDone) { 7473f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi unlock(); 7483f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 7493f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 750f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury if (mMallocDebug) { 751f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury try { 752f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury dumpHeap("HeapAtEnd"); 753f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury } catch (Exception ex) { 754f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury Log.e(TAG, "dumpHeap returned error in release"); 755f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury } 756f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury } 757fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 758fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 759fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 760fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 761fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 7629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public synchronized void removeAllMediaItems() { 7632bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMANativeHelper.setGeneratePreview(true); 7642bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 7659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMediaItems.clear(); 7669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 7679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 7689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Invalidate all transitions 7699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 7709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava for (Transition transition : mTransitions) { 7719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava transition.invalidate(); 7729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 7739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mTransitions.clear(); 7749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 7759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mDurationMs = 0; 7769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 7779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * If a thumbnail already exists, then delete it 7789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 7799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if ((new File(mProjectPath + "/" + THUMBNAIL_FILENAME)).exists()) { 7809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava (new File(mProjectPath + "/" + THUMBNAIL_FILENAME)).delete(); 781fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 782fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 783fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 784fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 785fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 786fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 787fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 7889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public synchronized AudioTrack removeAudioTrack(String audioTrackId) { 7899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final AudioTrack audioTrack = getAudioTrack(audioTrackId); 7909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (audioTrack != null) { 791a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi mMANativeHelper.setGeneratePreview(true); 7929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mAudioTracks.remove(audioTrack); 7939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava audioTrack.invalidate(); 7949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMANativeHelper.invalidatePcmFile(); 7959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMANativeHelper.setAudioflag(true); 7962bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi } else { 7979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException(" No more audio tracks"); 7989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 7999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return audioTrack; 800fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 801fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 802fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 803fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 804fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 8059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public synchronized MediaItem removeMediaItem(String mediaItemId) { 8069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final String firstItemString = mMediaItems.get(0).getId(); 8079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem mediaItem = getMediaItem(mediaItemId); 8089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mediaItem != null) { 8092bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMANativeHelper.setGeneratePreview(true); 8109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 8119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Remove the media item 8129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 8139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMediaItems.remove(mediaItem); 8149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mediaItem instanceof MediaImageItem) { 8159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ((MediaImageItem)mediaItem).invalidate(); 816fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 8175665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi final List<Overlay> overlays = mediaItem.getAllOverlays(); 8185665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi if (overlays.size() > 0) { 8195665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi for (Overlay overlay : overlays) { 8205665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi if (overlay instanceof OverlayFrame) { 8215665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi final OverlayFrame overlayFrame = (OverlayFrame)overlay; 8229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava overlayFrame.invalidate(); 8235665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi } 8245665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi } 8255665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi } 8265665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi 8279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 8289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Remove the adjacent transitions 8299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 8309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava removeAdjacentTransitions(mediaItem); 8319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava computeTimelineDuration(); 8329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 8332bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 8349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 8359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * If string equals first mediaItem, then 8362bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi * generate Project thumbnail 8379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 8389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (firstItemString.equals(mediaItemId)) { 8399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava generateProjectThumbnail(); 8409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 841048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi 8429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mediaItem instanceof MediaVideoItem) { 8439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 8449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Delete the graph file 8459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 8469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ((MediaVideoItem)mediaItem).invalidate(); 8479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 8489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mediaItem; 8499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 850048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi 85129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi private synchronized MediaItem removeMediaItem(String mediaItemId, boolean flag) { 8529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final String firstItemString = mMediaItems.get(0).getId(); 853048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi 8549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem mediaItem = getMediaItem(mediaItemId); 8559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mediaItem != null) { 8562bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMANativeHelper.setGeneratePreview(true); 8579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 8589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Remove the media item 8599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 8609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMediaItems.remove(mediaItem); 8619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 8629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Remove the adjacent transitions 8639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 8649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava removeAdjacentTransitions(mediaItem); 8659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava computeTimelineDuration(); 86621e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi } 86721e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi 8689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 8699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * If string equals first mediaItem, then 8709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * generate Project thumbail 8719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 8729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (firstItemString.equals(mediaItemId)) { 8739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava generateProjectThumbnail(); 8749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 8759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mediaItem; 8769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 87721e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi 8789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 8799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@inheritDoc} 8809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 8819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public synchronized Transition removeTransition(String transitionId) { 8829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final Transition transition = getTransition(transitionId); 8839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (transition == null) { 8842bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi throw new IllegalStateException("Transition not found: " + transitionId); 8859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 88621e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi 8872bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMANativeHelper.setGeneratePreview(true); 8882bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 8899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 8909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Remove the transition references 8919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 8929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem afterMediaItem = transition.getAfterMediaItem(); 8939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (afterMediaItem != null) { 8949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava afterMediaItem.setEndTransition(null); 8959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 896590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi 8979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem beforeMediaItem = transition.getBeforeMediaItem(); 8989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (beforeMediaItem != null) { 8999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava beforeMediaItem.setBeginTransition(null); 900fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 901fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 9029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mTransitions.remove(transition); 9039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava transition.invalidate(); 9049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava computeTimelineDuration(); 9059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return transition; 9069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 9073398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi 9089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 9099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@inheritDoc} 9109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 9119c077e44c05f6829dd12067947a387c132dc6eaaDharmaray Kundargi public long renderPreviewFrame(SurfaceHolder surfaceHolder, long timeMs, 9129c077e44c05f6829dd12067947a387c132dc6eaaDharmaray Kundargi OverlayData overlayData) { 9139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (surfaceHolder == null) { 9149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("Surface Holder is null"); 9153398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi } 9163398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi 9172bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi final Surface surface = surfaceHolder.getSurface(); 9182bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi if (surface == null) { 9192bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi throw new IllegalArgumentException("Surface could not be retrieved from Surface holder"); 9202bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi } 9212bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 9228e7991a52edb3eb8bd1a44ceb7f6d97108748c8cRajneesh Chowdury if (surface.isValid() == false) { 9238e7991a52edb3eb8bd1a44ceb7f6d97108748c8cRajneesh Chowdury throw new IllegalStateException("Surface is not valid"); 9248e7991a52edb3eb8bd1a44ceb7f6d97108748c8cRajneesh Chowdury } 9258e7991a52edb3eb8bd1a44ceb7f6d97108748c8cRajneesh Chowdury 9269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (timeMs < 0) { 9279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("requested time not correct"); 9289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } else if (timeMs > mDurationMs) { 9299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("requested time more than duration"); 9309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 9312bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi long result = 0; 9329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 9332bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi boolean semAcquireDone = false; 9342bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi try { 9353f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi semAcquireDone = lock(ENGINE_ACCESS_MAX_TIMEOUT_MS); 936a3f87f855b9abe2d086658eba8a92e04b69dd078Dharmaray Kundargi if (semAcquireDone == false) { 937a3f87f855b9abe2d086658eba8a92e04b69dd078Dharmaray Kundargi throw new IllegalStateException("Timeout waiting for semaphore"); 938a3f87f855b9abe2d086658eba8a92e04b69dd078Dharmaray Kundargi } 939fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 9403f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi if (mMANativeHelper == null) { 9413f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi throw new IllegalStateException("The video editor is not initialized"); 9423f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 9433f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi 9442bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi if (mMediaItems.size() > 0) { 9452bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi final Rect frame = surfaceHolder.getSurfaceFrame(); 9462bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi result = mMANativeHelper.renderPreviewFrame(surface, 9472bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi timeMs, frame.width(), frame.height(), overlayData); 9482bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi } else { 9492bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi result = 0; 9509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 951a3f87f855b9abe2d086658eba8a92e04b69dd078Dharmaray Kundargi } catch (InterruptedException ex) { 952a3f87f855b9abe2d086658eba8a92e04b69dd078Dharmaray Kundargi Log.w(TAG, "The thread was interrupted", new Throwable()); 953a3f87f855b9abe2d086658eba8a92e04b69dd078Dharmaray Kundargi throw new IllegalStateException("The thread was interrupted"); 9542bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi } finally { 9559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (semAcquireDone) { 9563f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi unlock(); 9579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 9589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 9599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return result; 960fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 961fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 962fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /** 9639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * the project form XML 964fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 96529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi private void load() throws FileNotFoundException, XmlPullParserException, IOException { 966fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi final File file = new File(mProjectPath, PROJECT_FILENAME); 9679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 9689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Load the metadata 9699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 970d141305f93364810b4e2324fe41285b65a6b6c82Gil Dobjanschi final FileInputStream fis = new FileInputStream(file); 9711fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi try { 97229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final List<String> ignoredMediaItems = new ArrayList<String>(); 97329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi 9741fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi final XmlPullParser parser = Xml.newPullParser(); 9751fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi parser.setInput(fis, "UTF-8"); 9761fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi int eventType = parser.getEventType(); 9771fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi String name; 9781fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi MediaItem currentMediaItem = null; 9791fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi Overlay currentOverlay = null; 98089782f501343fdbbe3bd6ab36e65474d49cd4b89Santosh Madhava boolean regenerateProjectThumbnail = false; 9811fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi while (eventType != XmlPullParser.END_DOCUMENT) { 9821fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi switch (eventType) { 9831fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi case XmlPullParser.START_TAG: { 9841fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi name = parser.getName(); 9851fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi if (TAG_PROJECT.equals(name)) { 98629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi mAspectRatio = Integer.parseInt(parser.getAttributeValue("", 9879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ATTR_ASPECT_RATIO)); 9889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 9899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final boolean mRegenPCM = 99029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Boolean.parseBoolean(parser.getAttributeValue("", 9919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ATTR_REGENERATE_PCM)); 9929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMANativeHelper.setAudioflag(mRegenPCM); 9931fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } else if (TAG_MEDIA_ITEM.equals(name)) { 99429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final String mediaItemId = parser.getAttributeValue("", ATTR_ID); 99529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi try { 99629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi currentMediaItem = parseMediaItem(parser); 9971fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi mMediaItems.add(currentMediaItem); 99829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } catch (Exception ex) { 99929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Log.w(TAG, "Cannot load media item: " + mediaItemId, ex); 100029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi currentMediaItem = null; 100189782f501343fdbbe3bd6ab36e65474d49cd4b89Santosh Madhava 100289782f501343fdbbe3bd6ab36e65474d49cd4b89Santosh Madhava // First media item is invalid, mark for project thumbnail removal 100389782f501343fdbbe3bd6ab36e65474d49cd4b89Santosh Madhava if (mMediaItems.size() == 0) { 100489782f501343fdbbe3bd6ab36e65474d49cd4b89Santosh Madhava regenerateProjectThumbnail = true; 100589782f501343fdbbe3bd6ab36e65474d49cd4b89Santosh Madhava } 100629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi // Ignore the media item 100729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi ignoredMediaItems.add(mediaItemId); 10081fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } 10091fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } else if (TAG_TRANSITION.equals(name)) { 101029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi try { 101129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final Transition transition = parseTransition(parser, 101229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi ignoredMediaItems); 101329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi // The transition will be null if the bounding 101429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi // media items are ignored 101529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi if (transition != null) { 101629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi mTransitions.add(transition); 101729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } 101829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } catch (Exception ex) { 101929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Log.w(TAG, "Cannot load transition", ex); 10201fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } 10211fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } else if (TAG_OVERLAY.equals(name)) { 10221fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi if (currentMediaItem != null) { 102329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi try { 102429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi currentOverlay = parseOverlay(parser, currentMediaItem); 10251fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi currentMediaItem.addOverlay(currentOverlay); 102629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } catch (Exception ex) { 102729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Log.w(TAG, "Cannot load overlay", ex); 10281fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } 10291fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } 10301fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } else if (TAG_OVERLAY_USER_ATTRIBUTES.equals(name)) { 10315665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi if (currentOverlay != null) { 10321fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi final int attributesCount = parser.getAttributeCount(); 10331fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi for (int i = 0; i < attributesCount; i++) { 10341fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi currentOverlay.setUserAttribute(parser.getAttributeName(i), 10351fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi parser.getAttributeValue(i)); 10361fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } 10375665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi } 10381fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } else if (TAG_EFFECT.equals(name)) { 10391fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi if (currentMediaItem != null) { 104029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi try { 104129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final Effect effect = parseEffect(parser, currentMediaItem); 10421fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi currentMediaItem.addEffect(effect); 104329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi 104429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi if (effect instanceof EffectKenBurns) { 104529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final boolean isImageClipGenerated = 104629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Boolean.parseBoolean(parser.getAttributeValue("", 104729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi ATTR_IS_IMAGE_CLIP_GENERATED)); 104829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi if(isImageClipGenerated) { 104929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final String filename = parser.getAttributeValue("", 105029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi ATTR_GENERATED_IMAGE_CLIP); 105129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi if (new File(filename).exists() == true) { 105229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi ((MediaImageItem)currentMediaItem). 105329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi setGeneratedImageClip(filename); 105429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi ((MediaImageItem)currentMediaItem). 105529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi setRegenerateClip(false); 105629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } else { 105729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi ((MediaImageItem)currentMediaItem). 105829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi setGeneratedImageClip(null); 105929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi ((MediaImageItem)currentMediaItem). 106029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi setRegenerateClip(true); 106129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } 106229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } else { 1063178d4f41119614b9064720a5bffeaebf3affe941Dheeraj Sharma ((MediaImageItem)currentMediaItem). 106429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi setGeneratedImageClip(null); 1065178d4f41119614b9064720a5bffeaebf3affe941Dheeraj Sharma ((MediaImageItem)currentMediaItem). 106629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi setRegenerateClip(true); 106729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } 10689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 106929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } catch (Exception ex) { 107029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Log.w(TAG, "Cannot load effect", ex); 10719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 10725665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi } 10731fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } else if (TAG_AUDIO_TRACK.equals(name)) { 107429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi try { 107529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final AudioTrack audioTrack = parseAudioTrack(parser); 10761fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi addAudioTrack(audioTrack); 107729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } catch (Exception ex) { 107829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Log.w(TAG, "Cannot load audio track", ex); 1079048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi } 1080048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi } 10811fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi break; 10825665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi } 10835665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi 10841fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi case XmlPullParser.END_TAG: { 10851fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi name = parser.getName(); 10861fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi if (TAG_MEDIA_ITEM.equals(name)) { 10871fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi currentMediaItem = null; 10881fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } else if (TAG_OVERLAY.equals(name)) { 10891fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi currentOverlay = null; 10901fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } 10911fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi break; 1092fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1093fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 10941fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi default: { 10951fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi break; 10961fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } 1097fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 10981fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi eventType = parser.next(); 10991fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } 11001fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi computeTimelineDuration(); 110189782f501343fdbbe3bd6ab36e65474d49cd4b89Santosh Madhava // Regenerate project thumbnail 110289782f501343fdbbe3bd6ab36e65474d49cd4b89Santosh Madhava if (regenerateProjectThumbnail) { 110389782f501343fdbbe3bd6ab36e65474d49cd4b89Santosh Madhava generateProjectThumbnail(); 110489782f501343fdbbe3bd6ab36e65474d49cd4b89Santosh Madhava regenerateProjectThumbnail = false; 110589782f501343fdbbe3bd6ab36e65474d49cd4b89Santosh Madhava } 11061fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi } finally { 11071fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi if (fis != null) { 11081fbeece669ac2ee1eec7dc45dc5a2a1bd5c36574Gil Dobjanschi fis.close(); 1109fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1110fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1111fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1112fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 1113590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi /** 111429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi * Parse the media item 111529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi * 111629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi * @param parser The parser 111729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi * @return The media item 111829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi */ 111929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi private MediaItem parseMediaItem(XmlPullParser parser) throws IOException { 112029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final String mediaItemId = parser.getAttributeValue("", ATTR_ID); 112129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final String type = parser.getAttributeValue("", ATTR_TYPE); 112229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final String filename = parser.getAttributeValue("", ATTR_FILENAME); 112329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final int renderingMode = Integer.parseInt(parser.getAttributeValue("", 112429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi ATTR_RENDERING_MODE)); 112529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi 112629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final MediaItem currentMediaItem; 112729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi if (MediaImageItem.class.getSimpleName().equals(type)) { 112829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long durationMs = Long.parseLong(parser.getAttributeValue("", ATTR_DURATION)); 112929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi currentMediaItem = new MediaImageItem(this, mediaItemId, filename, 113029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi durationMs, renderingMode); 113129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } else if (MediaVideoItem.class.getSimpleName().equals(type)) { 113229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long beginMs = Long.parseLong(parser.getAttributeValue("", ATTR_BEGIN_TIME)); 113329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long endMs = Long.parseLong(parser.getAttributeValue("", ATTR_END_TIME)); 113429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final int volume = Integer.parseInt(parser.getAttributeValue("", ATTR_VOLUME)); 113529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final boolean muted = Boolean.parseBoolean(parser.getAttributeValue("", ATTR_MUTED)); 113629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final String audioWaveformFilename = parser.getAttributeValue("", 113729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi ATTR_AUDIO_WAVEFORM_FILENAME); 113829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi currentMediaItem = new MediaVideoItem(this, mediaItemId, filename, 113929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi renderingMode, beginMs, endMs, volume, muted, audioWaveformFilename); 114029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi 114129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long beginTimeMs = Long.parseLong(parser.getAttributeValue("", ATTR_BEGIN_TIME)); 114229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long endTimeMs = Long.parseLong(parser.getAttributeValue("", ATTR_END_TIME)); 114329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi ((MediaVideoItem)currentMediaItem).setExtractBoundaries(beginTimeMs, endTimeMs); 114429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi 114529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final int volumePercent = Integer.parseInt(parser.getAttributeValue("", ATTR_VOLUME)); 114629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi ((MediaVideoItem)currentMediaItem).setVolume(volumePercent); 114729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } else { 114829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi throw new IllegalArgumentException("Unknown media item type: " + type); 114929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } 115029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi 115129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi return currentMediaItem; 115229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } 115329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi 115429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi /** 1155590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi * Parse the transition 1156590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi * 1157590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi * @param parser The parser 115829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi * @param ignoredMediaItems The list of ignored media items 115929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi * 1160590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi * @return The transition 1161590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi */ 116229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi private Transition parseTransition(XmlPullParser parser, List<String> ignoredMediaItems) { 1163590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi final String transitionId = parser.getAttributeValue("", ATTR_ID); 1164590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi final String type = parser.getAttributeValue("", ATTR_TYPE); 116529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long durationMs = Long.parseLong(parser.getAttributeValue("", ATTR_DURATION)); 116629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final int behavior = Integer.parseInt(parser.getAttributeValue("", ATTR_BEHAVIOR)); 116721e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi 116829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final String beforeMediaItemId = parser.getAttributeValue("", ATTR_BEFORE_MEDIA_ITEM_ID); 116921e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi final MediaItem beforeMediaItem; 117021e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi if (beforeMediaItemId != null) { 117129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi if (ignoredMediaItems.contains(beforeMediaItemId)) { 117229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi // This transition is ignored 117329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi return null; 117429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } 117529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi 117621e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi beforeMediaItem = getMediaItem(beforeMediaItemId); 117721e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi } else { 117821e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi beforeMediaItem = null; 117921e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi } 118021e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi 118129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final String afterMediaItemId = parser.getAttributeValue("", ATTR_AFTER_MEDIA_ITEM_ID); 118221e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi final MediaItem afterMediaItem; 118321e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi if (afterMediaItemId != null) { 118429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi if (ignoredMediaItems.contains(afterMediaItemId)) { 118529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi // This transition is ignored 118629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi return null; 118729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } 118829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi 118921e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi afterMediaItem = getMediaItem(afterMediaItemId); 119021e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi } else { 119121e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi afterMediaItem = null; 119221e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi } 119321e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi 119421e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi final Transition transition; 1195fa3d263131ba775bf62c406ff0f85abb8366d70fGil Dobjanschi if (TransitionAlpha.class.getSimpleName().equals(type)) { 1196590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi final int blending = Integer.parseInt(parser.getAttributeValue("", ATTR_BLENDING)); 1197590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi final String maskFilename = parser.getAttributeValue("", ATTR_MASK); 1198590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi final boolean invert = Boolean.getBoolean(parser.getAttributeValue("", ATTR_INVERT)); 119921e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi transition = new TransitionAlpha(transitionId, afterMediaItem, beforeMediaItem, 120021e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi durationMs, behavior, maskFilename, blending, invert); 120121e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi } else if (TransitionCrossfade.class.getSimpleName().equals(type)) { 120221e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi transition = new TransitionCrossfade(transitionId, afterMediaItem, beforeMediaItem, 1203590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi durationMs, behavior); 1204590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi } else if (TransitionSliding.class.getSimpleName().equals(type)) { 1205590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi final int direction = Integer.parseInt(parser.getAttributeValue("", ATTR_DIRECTION)); 120621e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi transition = new TransitionSliding(transitionId, afterMediaItem, beforeMediaItem, 120721e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi durationMs, behavior, direction); 1208fa3d263131ba775bf62c406ff0f85abb8366d70fGil Dobjanschi } else if (TransitionFadeBlack.class.getSimpleName().equals(type)) { 1209fa3d263131ba775bf62c406ff0f85abb8366d70fGil Dobjanschi transition = new TransitionFadeBlack(transitionId, afterMediaItem, beforeMediaItem, 1210590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi durationMs, behavior); 121121e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi } else { 121229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi throw new IllegalArgumentException("Invalid transition type: " + type); 1213590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi } 1214590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi 121529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final boolean isTransitionGenerated = Boolean.parseBoolean(parser.getAttributeValue("", 12169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ATTR_IS_TRANSITION_GENERATED)); 12179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (isTransitionGenerated == true) { 12189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final String transitionFile = parser.getAttributeValue("", 12199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ATTR_GENERATED_TRANSITION_CLIP); 12209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 12212bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi if (new File(transitionFile).exists()) { 12229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava transition.setFilename(transitionFile); 12239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } else { 12249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava transition.setFilename(null); 12259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 12269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 122729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi 122829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi // Use the transition 122929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi if (beforeMediaItem != null) { 123029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi beforeMediaItem.setBeginTransition(transition); 123129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } 123229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi 123329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi if (afterMediaItem != null) { 123429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi afterMediaItem.setEndTransition(transition); 123529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } 123629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi 123721e9da6f446301756ddabbfb9d61155db5480366Gil Dobjanschi return transition; 1238590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi } 1239590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi 12405665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi /** 12415665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi * Parse the overlay 12425665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi * 12435665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi * @param parser The parser 12445665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi * @param mediaItem The media item owner 12455665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi * 12465665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi * @return The overlay 12475665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi */ 12485665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi private Overlay parseOverlay(XmlPullParser parser, MediaItem mediaItem) { 12495665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi final String overlayId = parser.getAttributeValue("", ATTR_ID); 12505665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi final String type = parser.getAttributeValue("", ATTR_TYPE); 125129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long durationMs = Long.parseLong(parser.getAttributeValue("", ATTR_DURATION)); 125229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long startTimeMs = Long.parseLong(parser.getAttributeValue("", ATTR_BEGIN_TIME)); 12535665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi 12545665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi final Overlay overlay; 12555665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi if (OverlayFrame.class.getSimpleName().equals(type)) { 12565665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi final String filename = parser.getAttributeValue("", ATTR_FILENAME); 125729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi overlay = new OverlayFrame(mediaItem, overlayId, filename, startTimeMs, durationMs); 12585665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi } else { 125929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi throw new IllegalArgumentException("Invalid overlay type: " + type); 12605665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi } 12615665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi 126229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final String overlayRgbFileName = parser.getAttributeValue("", ATTR_OVERLAY_RGB_FILENAME); 12639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (overlayRgbFileName != null) { 12649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ((OverlayFrame)overlay).setFilename(overlayRgbFileName); 12659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 126629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final int overlayFrameWidth = Integer.parseInt(parser.getAttributeValue("", 12679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ATTR_OVERLAY_FRAME_WIDTH)); 126829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final int overlayFrameHeight = Integer.parseInt(parser.getAttributeValue("", 12699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ATTR_OVERLAY_FRAME_HEIGHT)); 12709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 12719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ((OverlayFrame)overlay).setOverlayFrameWidth(overlayFrameWidth); 12729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ((OverlayFrame)overlay).setOverlayFrameHeight(overlayFrameHeight); 127363298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava 127429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final int resizedRGBFrameWidth = Integer.parseInt(parser.getAttributeValue("", 127563298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava ATTR_OVERLAY_RESIZED_RGB_FRAME_WIDTH)); 127629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final int resizedRGBFrameHeight = Integer.parseInt(parser.getAttributeValue("", 127763298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava ATTR_OVERLAY_RESIZED_RGB_FRAME_HEIGHT)); 127863298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava 127963298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava ((OverlayFrame)overlay).setResizedRGBSize(resizedRGBFrameWidth, resizedRGBFrameHeight); 12809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 12819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 12825665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi return overlay; 12835665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi } 12845665fd6ac2b2d3a00b3addf1ae897426896935d6Gil Dobjanschi 1285048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi /** 1286048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi * Parse the effect 1287048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi * 1288048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi * @param parser The parser 1289048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi * @param mediaItem The media item owner 1290048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi * 1291048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi * @return The effect 1292048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi */ 1293048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi private Effect parseEffect(XmlPullParser parser, MediaItem mediaItem) { 1294048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi final String effectId = parser.getAttributeValue("", ATTR_ID); 1295048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi final String type = parser.getAttributeValue("", ATTR_TYPE); 129629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long durationMs = Long.parseLong(parser.getAttributeValue("", ATTR_DURATION)); 129729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long startTimeMs = Long.parseLong(parser.getAttributeValue("", ATTR_BEGIN_TIME)); 1298048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi 1299048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi final Effect effect; 1300048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi if (EffectColor.class.getSimpleName().equals(type)) { 130129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final int colorEffectType = Integer.parseInt(parser.getAttributeValue("", 13029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ATTR_COLOR_EFFECT_TYPE)); 1303048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi final int color; 13040ce122e38b46ce3dc5d37c7b0719c0b9325e9cc0Gil Dobjanschi if (colorEffectType == EffectColor.TYPE_COLOR 13050ce122e38b46ce3dc5d37c7b0719c0b9325e9cc0Gil Dobjanschi || colorEffectType == EffectColor.TYPE_GRADIENT) { 130629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi color = Integer.parseInt(parser.getAttributeValue("", ATTR_COLOR_EFFECT_VALUE)); 1307048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi } else { 1308048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi color = 0; 1309048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi } 13109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava effect = new EffectColor(mediaItem, effectId, startTimeMs, 13119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava durationMs, colorEffectType, color); 1312048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi } else if (EffectKenBurns.class.getSimpleName().equals(type)) { 1313048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi final Rect startRect = new Rect( 131429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Integer.parseInt(parser.getAttributeValue("", ATTR_START_RECT_LEFT)), 131529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Integer.parseInt(parser.getAttributeValue("", ATTR_START_RECT_TOP)), 131629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Integer.parseInt(parser.getAttributeValue("", ATTR_START_RECT_RIGHT)), 131729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Integer.parseInt(parser.getAttributeValue("", ATTR_START_RECT_BOTTOM))); 1318048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi final Rect endRect = new Rect( 131929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Integer.parseInt(parser.getAttributeValue("", ATTR_END_RECT_LEFT)), 132029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Integer.parseInt(parser.getAttributeValue("", ATTR_END_RECT_TOP)), 132129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Integer.parseInt(parser.getAttributeValue("", ATTR_END_RECT_RIGHT)), 132229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Integer.parseInt(parser.getAttributeValue("", ATTR_END_RECT_BOTTOM))); 13239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava effect = new EffectKenBurns(mediaItem, effectId, startRect, endRect, 13249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava startTimeMs, durationMs); 1325048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi } else { 132629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi throw new IllegalArgumentException("Invalid effect type: " + type); 1327048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi } 1328048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi 1329048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi return effect; 1330048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi } 1331048449ebfa3f42e1431338785f225d25125f294eGil Dobjanschi 13323398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi /** 13333398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi * Parse the audio track 13343398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi * 13353398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi * @param parser The parser 13363398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi * 13373398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi * @return The audio track 13383398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi */ 133929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi private AudioTrack parseAudioTrack(XmlPullParser parser) throws IOException { 13403398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi final String audioTrackId = parser.getAttributeValue("", ATTR_ID); 13413398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi final String filename = parser.getAttributeValue("", ATTR_FILENAME); 134229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long startTimeMs = Long.parseLong(parser.getAttributeValue("", ATTR_START_TIME)); 134329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long beginMs = Long.parseLong(parser.getAttributeValue("", ATTR_BEGIN_TIME)); 134429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final long endMs = Long.parseLong(parser.getAttributeValue("", ATTR_END_TIME)); 134529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final int volume = Integer.parseInt(parser.getAttributeValue("", ATTR_VOLUME)); 134629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final boolean muted = Boolean.parseBoolean(parser.getAttributeValue("", ATTR_MUTED)); 134729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final boolean loop = Boolean.parseBoolean(parser.getAttributeValue("", ATTR_LOOP)); 134829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final boolean duckingEnabled = Boolean.parseBoolean( 134929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi parser.getAttributeValue("", ATTR_DUCK_ENABLED)); 135029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final int duckThreshold = Integer.parseInt( 135129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi parser.getAttributeValue("", ATTR_DUCK_THRESHOLD)); 135229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final int duckedTrackVolume = Integer.parseInt(parser.getAttributeValue("", 13539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ATTR_DUCKED_TRACK_VOLUME)); 13549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 135529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final String waveformFilename = parser.getAttributeValue("", ATTR_AUDIO_WAVEFORM_FILENAME); 135629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi final AudioTrack audioTrack = new AudioTrack(this, audioTrackId, 135729206e917574688a6270233f92b734a2d7231faaGil Dobjanschi filename, startTimeMs, 135829206e917574688a6270233f92b734a2d7231faaGil Dobjanschi beginMs, endMs, loop, 135929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi volume, muted, 136029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi duckingEnabled, 136129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi duckThreshold, 136229206e917574688a6270233f92b734a2d7231faaGil Dobjanschi duckedTrackVolume, 136329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi waveformFilename); 13643398abafca25ff8c58feedd4d2b82857a3322061Gil Dobjanschi 136529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi return audioTrack; 136629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi } 1367fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 1368289f08990ca1f0de33c9939a00958739969dff7eGil Dobjanschi /* 1369289f08990ca1f0de33c9939a00958739969dff7eGil Dobjanschi * {@inheritDoc} 1370289f08990ca1f0de33c9939a00958739969dff7eGil Dobjanschi */ 13719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public void save() throws IOException { 13729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final XmlSerializer serializer = Xml.newSerializer(); 13739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final StringWriter writer = new StringWriter(); 13749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.setOutput(writer); 13759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startDocument("UTF-8", true); 13769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startTag("", TAG_PROJECT); 13779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", 13789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ATTR_ASPECT_RATIO, Integer.toString(mAspectRatio)); 1379c006e8ef64bbfd47a9ecd4cfd708362e40b0d337Gil Dobjanschi 13809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_REGENERATE_PCM, 13819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Boolean.toString(mMANativeHelper.getAudioflag())); 1382fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 13839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startTag("", TAG_MEDIA_ITEMS); 13849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava for (MediaItem mediaItem : mMediaItems) { 13859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startTag("", TAG_MEDIA_ITEM); 13869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_ID, mediaItem.getId()); 13879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_TYPE, 13889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mediaItem.getClass().getSimpleName()); 13899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_FILENAME, mediaItem.getFilename()); 13909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_RENDERING_MODE, Integer.toString( 13919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mediaItem.getRenderingMode())); 13929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mediaItem instanceof MediaVideoItem) { 13939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaVideoItem mvi = (MediaVideoItem)mediaItem; 13949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer 13959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava .attribute("", ATTR_BEGIN_TIME, 13969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Long.toString(mvi.getBoundaryBeginTime())); 13979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_END_TIME, 13989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Long.toString(mvi.getBoundaryEndTime())); 13999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_VOLUME, 14009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(mvi.getVolume())); 14019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_MUTED, 14029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Boolean.toString(mvi.isMuted())); 14039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mvi.getAudioWaveformFilename() != null) { 14049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_AUDIO_WAVEFORM_FILENAME, 14059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mvi.getAudioWaveformFilename()); 14069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 14079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } else if (mediaItem instanceof MediaImageItem) { 14089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_DURATION, 14099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Long.toString(mediaItem.getTimelineDuration())); 14109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 14119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 14129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final List<Overlay> overlays = mediaItem.getAllOverlays(); 14139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (overlays.size() > 0) { 14149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startTag("", TAG_OVERLAYS); 14159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava for (Overlay overlay : overlays) { 14169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startTag("", TAG_OVERLAY); 14179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_ID, overlay.getId()); 14189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", 14199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ATTR_TYPE, overlay.getClass().getSimpleName()); 14209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_BEGIN_TIME, 14219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Long.toString(overlay.getStartTime())); 14229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_DURATION, 14239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Long.toString(overlay.getDuration())); 14249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (overlay instanceof OverlayFrame) { 14259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final OverlayFrame overlayFrame = (OverlayFrame)overlay; 14269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava overlayFrame.save(getPath()); 14279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (overlayFrame.getBitmapImageFileName() != null) { 14289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_FILENAME, 14299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava overlayFrame.getBitmapImageFileName()); 14309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 14319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 14329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (overlayFrame.getFilename() != null) { 14339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", 14349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ATTR_OVERLAY_RGB_FILENAME, 14359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava overlayFrame.getFilename()); 14369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_OVERLAY_FRAME_WIDTH, 14379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(overlayFrame.getOverlayFrameWidth())); 14389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_OVERLAY_FRAME_HEIGHT, 14399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(overlayFrame.getOverlayFrameHeight())); 144063298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava serializer.attribute("", ATTR_OVERLAY_RESIZED_RGB_FRAME_WIDTH, 144163298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava Integer.toString(overlayFrame.getResizedRGBSizeWidth())); 144263298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava serializer.attribute("", ATTR_OVERLAY_RESIZED_RGB_FRAME_HEIGHT, 144363298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava Integer.toString(overlayFrame.getResizedRGBSizeHeight())); 144463298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava 14459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 14469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 14479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 14489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 14499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 14509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Save the user attributes 14519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 14529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startTag("", TAG_OVERLAY_USER_ATTRIBUTES); 14539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final Map<String, String> userAttributes = overlay.getUserAttributes(); 14549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava for (String name : userAttributes.keySet()) { 14559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final String value = userAttributes.get(name); 14569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (value != null) { 14579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", name, value); 14589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 14599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 14609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endTag("", TAG_OVERLAY_USER_ATTRIBUTES); 14619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 14629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endTag("", TAG_OVERLAY); 14639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 14649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endTag("", TAG_OVERLAYS); 14659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 14669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 14679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final List<Effect> effects = mediaItem.getAllEffects(); 14689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (effects.size() > 0) { 14699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startTag("", TAG_EFFECTS); 14709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava for (Effect effect : effects) { 14719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startTag("", TAG_EFFECT); 14729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_ID, effect.getId()); 14739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", 14749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava ATTR_TYPE, effect.getClass().getSimpleName()); 14759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_BEGIN_TIME, 14769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Long.toString(effect.getStartTime())); 14779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_DURATION, 14789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Long.toString(effect.getDuration())); 14799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (effect instanceof EffectColor) { 14809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final EffectColor colorEffect = (EffectColor)effect; 14819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_COLOR_EFFECT_TYPE, 14829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(colorEffect.getType())); 14839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (colorEffect.getType() == EffectColor.TYPE_COLOR || 14849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava colorEffect.getType() == EffectColor.TYPE_GRADIENT) { 14859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_COLOR_EFFECT_VALUE, 14869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(colorEffect.getColor())); 14879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 14889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } else if (effect instanceof EffectKenBurns) { 14899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final Rect startRect = ((EffectKenBurns)effect).getStartRect(); 14909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_START_RECT_LEFT, 14919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(startRect.left)); 14929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_START_RECT_TOP, 14939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(startRect.top)); 14949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_START_RECT_RIGHT, 14959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(startRect.right)); 14969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_START_RECT_BOTTOM, 14979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(startRect.bottom)); 14989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 14999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final Rect endRect = ((EffectKenBurns)effect).getEndRect(); 15009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_END_RECT_LEFT, 15019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(endRect.left)); 15029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_END_RECT_TOP, 15039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(endRect.top)); 15049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_END_RECT_RIGHT, 15059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(endRect.right)); 15069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_END_RECT_BOTTOM, 15079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(endRect.bottom)); 15089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem mItem = effect.getMediaItem(); 1509178d4f41119614b9064720a5bffeaebf3affe941Dheeraj Sharma if(((MediaImageItem)mItem).getGeneratedImageClip() != null) { 151029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi serializer.attribute("", ATTR_IS_IMAGE_CLIP_GENERATED, 151129206e917574688a6270233f92b734a2d7231faaGil Dobjanschi Boolean.toString(true)); 1512178d4f41119614b9064720a5bffeaebf3affe941Dheeraj Sharma serializer.attribute("", ATTR_GENERATED_IMAGE_CLIP, 1513178d4f41119614b9064720a5bffeaebf3affe941Dheeraj Sharma ((MediaImageItem)mItem).getGeneratedImageClip()); 1514178d4f41119614b9064720a5bffeaebf3affe941Dheeraj Sharma } else { 1515178d4f41119614b9064720a5bffeaebf3affe941Dheeraj Sharma serializer.attribute("", ATTR_IS_IMAGE_CLIP_GENERATED, 1516178d4f41119614b9064720a5bffeaebf3affe941Dheeraj Sharma Boolean.toString(false)); 1517178d4f41119614b9064720a5bffeaebf3affe941Dheeraj Sharma } 15189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 15199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 15209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endTag("", TAG_EFFECT); 15219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 15229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endTag("", TAG_EFFECTS); 1523fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 15249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 15259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endTag("", TAG_MEDIA_ITEM); 1526fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 15279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endTag("", TAG_MEDIA_ITEMS); 1528fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 15299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startTag("", TAG_TRANSITIONS); 1530fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 15319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava for (Transition transition : mTransitions) { 15329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startTag("", TAG_TRANSITION); 15339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_ID, transition.getId()); 153429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi serializer.attribute("", ATTR_TYPE, transition.getClass().getSimpleName()); 153529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi serializer.attribute("", ATTR_DURATION, Long.toString(transition.getDuration())); 153629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi serializer.attribute("", ATTR_BEHAVIOR, Integer.toString(transition.getBehavior())); 15379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_IS_TRANSITION_GENERATED, 15389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Boolean.toString(transition.isGenerated())); 15399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (transition.isGenerated() == true) { 154029206e917574688a6270233f92b734a2d7231faaGil Dobjanschi serializer.attribute("", ATTR_GENERATED_TRANSITION_CLIP, transition.mFilename); 15419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 15429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem afterMediaItem = transition.getAfterMediaItem(); 15439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (afterMediaItem != null) { 154429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi serializer.attribute("", ATTR_AFTER_MEDIA_ITEM_ID, afterMediaItem.getId()); 15459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1546fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 15479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem beforeMediaItem = transition.getBeforeMediaItem(); 15489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (beforeMediaItem != null) { 154929206e917574688a6270233f92b734a2d7231faaGil Dobjanschi serializer.attribute("", ATTR_BEFORE_MEDIA_ITEM_ID, beforeMediaItem.getId()); 15509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1551fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 15529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (transition instanceof TransitionSliding) { 15539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_DIRECTION, 15549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(((TransitionSliding)transition).getDirection())); 15559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } else if (transition instanceof TransitionAlpha) { 15569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava TransitionAlpha ta = (TransitionAlpha)transition; 15579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_BLENDING, 15589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(ta.getBlendingPercent())); 15599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_INVERT, 15609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Boolean.toString(ta.isInvert())); 15619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (ta.getMaskFilename() != null) { 15629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_MASK, ta.getMaskFilename()); 15639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 15649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 15659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endTag("", TAG_TRANSITION); 15669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 15679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endTag("", TAG_TRANSITIONS); 15689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startTag("", TAG_AUDIO_TRACKS); 15699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava for (AudioTrack at : mAudioTracks) { 15709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.startTag("", TAG_AUDIO_TRACK); 15719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_ID, at.getId()); 15729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_FILENAME, at.getFilename()); 157329206e917574688a6270233f92b734a2d7231faaGil Dobjanschi serializer.attribute("", ATTR_START_TIME, Long.toString(at.getStartTime())); 157429206e917574688a6270233f92b734a2d7231faaGil Dobjanschi serializer.attribute("", ATTR_BEGIN_TIME, Long.toString(at.getBoundaryBeginTime())); 157529206e917574688a6270233f92b734a2d7231faaGil Dobjanschi serializer.attribute("", ATTR_END_TIME, Long.toString(at.getBoundaryEndTime())); 157629206e917574688a6270233f92b734a2d7231faaGil Dobjanschi serializer.attribute("", ATTR_VOLUME, Integer.toString(at.getVolume())); 15779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_DUCK_ENABLED, 15789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Boolean.toString(at.isDuckingEnabled())); 15799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_DUCKED_TRACK_VOLUME, 15809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(at.getDuckedTrackVolume())); 15819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_DUCK_THRESHOLD, 15829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Integer.toString(at.getDuckingThreshhold())); 15839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_MUTED, Boolean.toString(at.isMuted())); 15849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_LOOP, Boolean.toString(at.isLooping())); 15859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (at.getAudioWaveformFilename() != null) { 15869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.attribute("", ATTR_AUDIO_WAVEFORM_FILENAME, 15879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava at.getAudioWaveformFilename()); 15889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 15899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 15909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endTag("", TAG_AUDIO_TRACK); 15919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 15929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endTag("", TAG_AUDIO_TRACKS); 15939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 15949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endTag("", TAG_PROJECT); 15959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava serializer.endDocument(); 15969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 15979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 15989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Save the metadata XML file 15999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 16009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final FileOutputStream out = new FileOutputStream(new File(getPath(), 16019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava PROJECT_FILENAME)); 16029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava out.write(writer.toString().getBytes()); 16039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava out.flush(); 16049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava out.close(); 1605fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1606fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 1607fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 1608fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 1609fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 1610fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi public void setAspectRatio(int aspectRatio) { 1611fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi mAspectRatio = aspectRatio; 16129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 16139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Invalidate all transitions 16149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 16158afee6694b9584e7efcbf48c977780893bda4870Dheeraj Sharma mMANativeHelper.setGeneratePreview(true); 16168afee6694b9584e7efcbf48c977780893bda4870Dheeraj Sharma 1617549a65b5a40e6377e2311ba5efb09ae4c94092f0Gil Dobjanschi for (Transition transition : mTransitions) { 1618549a65b5a40e6377e2311ba5efb09ae4c94092f0Gil Dobjanschi transition.invalidate(); 1619549a65b5a40e6377e2311ba5efb09ae4c94092f0Gil Dobjanschi } 162063298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava 162163298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava final Iterator<MediaItem> it = mMediaItems.iterator(); 162263298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava 162363298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava while (it.hasNext()) { 162463298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava final MediaItem t = it.next(); 162563298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava List<Overlay> overlayList = t.getAllOverlays(); 162663298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava for (Overlay overlay : overlayList) { 162763298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava 162863298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava ((OverlayFrame)overlay).invalidateGeneratedFiles(); 162963298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava } 163063298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava } 1631fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1632fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 1633fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 1634fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 1635fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 16369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public void startPreview(SurfaceHolder surfaceHolder, long fromMs, long toMs, 16379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava boolean loop, int callbackAfterFrameCount, 16389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava PreviewProgressListener listener) { 1639fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 16409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (surfaceHolder == null) { 16419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException(); 16429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 16432bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 16442bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi final Surface surface = surfaceHolder.getSurface(); 16452bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi if (surface == null) { 16462bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi throw new IllegalArgumentException("Surface could not be retrieved from surface holder"); 16472bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi } 16482bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 16498e7991a52edb3eb8bd1a44ceb7f6d97108748c8cRajneesh Chowdury if (surface.isValid() == false) { 16508e7991a52edb3eb8bd1a44ceb7f6d97108748c8cRajneesh Chowdury throw new IllegalStateException("Surface is not valid"); 16518e7991a52edb3eb8bd1a44ceb7f6d97108748c8cRajneesh Chowdury } 16528e7991a52edb3eb8bd1a44ceb7f6d97108748c8cRajneesh Chowdury 16539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (listener == null) { 16549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException(); 16559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 16562bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 1657fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi if (fromMs >= mDurationMs) { 16582bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi throw new IllegalArgumentException("Requested time not correct"); 16599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 16609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 16619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (fromMs < 0) { 16622bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi throw new IllegalArgumentException("Requested time not correct"); 16639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 16649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 16659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava boolean semAcquireDone = false; 166613984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma if (!mPreviewInProgress) { 166713984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma try{ 16683f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi semAcquireDone = lock(ENGINE_ACCESS_MAX_TIMEOUT_MS); 166913984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma if (semAcquireDone == false) { 167013984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma throw new IllegalStateException("Timeout waiting for semaphore"); 167113984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma } 16729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 16733f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi if (mMANativeHelper == null) { 16743f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi throw new IllegalStateException("The video editor is not initialized"); 16753f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 16763f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi 167713984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma if (mMediaItems.size() > 0) { 167813984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma mPreviewInProgress = true; 167913984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma mMANativeHelper.previewStoryBoard(mMediaItems, mTransitions, 168013984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma mAudioTracks, null); 168113984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma mMANativeHelper.doPreview(surface, fromMs, toMs, loop, 168213984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma callbackAfterFrameCount, listener); 168313984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma } 168413984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma /** 16853f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi * Release The lock on complete by calling stopPreview 168613984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma */ 168713984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma } catch (InterruptedException ex) { 168813984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma Log.w(TAG, "The thread was interrupted", new Throwable()); 168913984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma throw new IllegalStateException("The thread was interrupted"); 16902bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi } 169113984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma } else { 169213984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma throw new IllegalStateException("Preview already in progress"); 1693fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1694fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1695fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 1696fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /* 1697fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * {@inheritDoc} 1698fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 16999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public long stopPreview() { 170013984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma long result = 0; 17019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mPreviewInProgress) { 170213984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma try { 170313984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma result = mMANativeHelper.stopPreview(); 170413984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma /** 170513984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma * release on complete by calling stopPreview 170613984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma */ 170713984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma } finally { 170813984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma mPreviewInProgress = false; 17093f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi unlock(); 171013984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma } 17119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return result; 171213984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma } 171313984592b1b63a14c8401cf314865daf633e85ecDheeraj Sharma else { 17149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return 0; 1715fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1716fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1717fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 17189c077e44c05f6829dd12067947a387c132dc6eaaDharmaray Kundargi /* 1719fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * Remove transitions associated with the specified media item 1720fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * 1721fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * @param mediaItem The media item 1722fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 1723fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi private void removeAdjacentTransitions(MediaItem mediaItem) { 1724e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi final Transition beginTransition = mediaItem.getBeginTransition(); 1725e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi if (beginTransition != null) { 172670bfc087d95ab7b1bf782c3d579e1a3e48d9ddb2Gil Dobjanschi if (beginTransition.getAfterMediaItem() != null) { 172770bfc087d95ab7b1bf782c3d579e1a3e48d9ddb2Gil Dobjanschi beginTransition.getAfterMediaItem().setEndTransition(null); 172870bfc087d95ab7b1bf782c3d579e1a3e48d9ddb2Gil Dobjanschi } 1729e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi beginTransition.invalidate(); 1730e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi mTransitions.remove(beginTransition); 1731e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi } 1732e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi 1733e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi final Transition endTransition = mediaItem.getEndTransition(); 1734e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi if (endTransition != null) { 173570bfc087d95ab7b1bf782c3d579e1a3e48d9ddb2Gil Dobjanschi if (endTransition.getBeforeMediaItem() != null) { 173670bfc087d95ab7b1bf782c3d579e1a3e48d9ddb2Gil Dobjanschi endTransition.getBeforeMediaItem().setBeginTransition(null); 173770bfc087d95ab7b1bf782c3d579e1a3e48d9ddb2Gil Dobjanschi } 1738e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi endTransition.invalidate(); 1739e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi mTransitions.remove(endTransition); 1740fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1741e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi 1742e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi mediaItem.setBeginTransition(null); 1743e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi mediaItem.setEndTransition(null); 1744fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1745fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 1746fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /** 1747fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * Remove the transition before this media item 1748fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * 1749590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi * @param index The media item index 1750fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 1751590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi private void removeTransitionBefore(int index) { 1752e2c28468a5aa196f939474232f578b0fbf66a1f2Gil Dobjanschi final MediaItem mediaItem = mMediaItems.get(index); 1753fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi final Iterator<Transition> it = mTransitions.iterator(); 1754fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi while (it.hasNext()) { 1755fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi Transition t = it.next(); 1756fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi if (t.getBeforeMediaItem() == mediaItem) { 17572bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMANativeHelper.setGeneratePreview(true); 1758a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi it.remove(); 1759fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi t.invalidate(); 1760fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi mediaItem.setBeginTransition(null); 1761590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi if (index > 0) { 1762590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi mMediaItems.get(index - 1).setEndTransition(null); 1763590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi } 1764fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi break; 1765fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1766fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1767fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1768fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi 1769fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi /** 1770fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * Remove the transition after this media item 1771fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi * 17729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @param mediaItem The media item 1773fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi */ 1774590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi private void removeTransitionAfter(int index) { 1775590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi final MediaItem mediaItem = mMediaItems.get(index); 1776fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi final Iterator<Transition> it = mTransitions.iterator(); 1777fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi while (it.hasNext()) { 1778fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi Transition t = it.next(); 1779fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi if (t.getAfterMediaItem() == mediaItem) { 17802bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMANativeHelper.setGeneratePreview(true); 1781a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi it.remove(); 1782fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi t.invalidate(); 1783fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi mediaItem.setEndTransition(null); 17849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 17859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Invalidate the reference in the next media item 17869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 1787590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi if (index < mMediaItems.size() - 1) { 1788590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi mMediaItems.get(index + 1).setBeginTransition(null); 1789590f87fe9a00777e73e3866c64ee4bf0bf987955Gil Dobjanschi } 1790fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi break; 1791fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1792fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 1793fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi } 17949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 17959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 17969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Compute the duration 17979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 17989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private void computeTimelineDuration() { 17999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mDurationMs = 0; 18009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final int mediaItemsCount = mMediaItems.size(); 18019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava for (int i = 0; i < mediaItemsCount; i++) { 18029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final MediaItem mediaItem = mMediaItems.get(i); 18039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mDurationMs += mediaItem.getTimelineDuration(); 18049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mediaItem.getEndTransition() != null) { 18059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (i < mediaItemsCount - 1) { 18069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mDurationMs -= mediaItem.getEndTransition().getDuration(); 18079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 18089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 18099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 18109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 18119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 18129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 18139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Generate the project thumbnail 18149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 18159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private void generateProjectThumbnail() { 18169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 18179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * If a thumbnail already exists, then delete it first 18189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 18199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if ((new File(mProjectPath + "/" + THUMBNAIL_FILENAME)).exists()) { 18209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava (new File(mProjectPath + "/" + THUMBNAIL_FILENAME)).delete(); 18219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 18229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 18239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Generate a new thumbnail for the project from first media Item 18249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 18259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mMediaItems.size() > 0) { 18269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava MediaItem mI = mMediaItems.get(0); 18279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 182847a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang * Keep aspect ratio of the image 18299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 18309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava int height = 480; 183147a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang int width = mI.getWidth() * height / mI.getHeight(); 18329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 18339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava Bitmap projectBitmap = null; 183424a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong String filename = mI.getFilename(); 183524a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong if (mI instanceof MediaVideoItem) { 183624a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 183724a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong retriever.setDataSource(filename); 183824a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong Bitmap bitmap = retriever.getFrameAtTime(); 183924a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong retriever.release(); 184024a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong retriever = null; 184124a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong if (bitmap == null) { 184224a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong String msg = "Thumbnail extraction from " + 184324a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong filename + " failed"; 184424a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong throw new IllegalArgumentException(msg); 184524a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong } 184624a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong // Resize the thumbnail to the target size 184724a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong projectBitmap = 184824a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong Bitmap.createScaledBitmap(bitmap, width, height, true); 184924a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong } else { 185024a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong try { 185124a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong projectBitmap = mI.getThumbnail(width, height, 500); 185224a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong } catch (IllegalArgumentException e) { 185324a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong String msg = "Project thumbnail extraction from " + 185424a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong filename + " failed"; 185524a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong throw new IllegalArgumentException(msg); 185624a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong } catch (IOException e) { 185724a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong String msg = "IO Error creating project thumbnail"; 185824a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong throw new IllegalArgumentException(msg); 185924a38f1ab9ed3b7b9f8517b22dbf692a898117e3James Dong } 18609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 18612bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi 18629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava try { 18639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava FileOutputStream stream = new FileOutputStream(mProjectPath + "/" 18649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava + THUMBNAIL_FILENAME); 18659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava projectBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 18669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava stream.flush(); 18679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava stream.close(); 18689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } catch (IOException e) { 18699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException ("Error creating project thumbnail"); 18709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } finally { 18719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava projectBitmap.recycle(); 18729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 18739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 18749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 187505d9f81bd638a749669192b50e680b166529d5f3Dheeraj Sharma 187605d9f81bd638a749669192b50e680b166529d5f3Dheeraj Sharma /** 187705d9f81bd638a749669192b50e680b166529d5f3Dheeraj Sharma * Clears the preview surface 187805d9f81bd638a749669192b50e680b166529d5f3Dheeraj Sharma * 187905d9f81bd638a749669192b50e680b166529d5f3Dheeraj Sharma * @param surfaceHolder SurfaceHolder where the preview is rendered 188005d9f81bd638a749669192b50e680b166529d5f3Dheeraj Sharma * and needs to be cleared. 188105d9f81bd638a749669192b50e680b166529d5f3Dheeraj Sharma */ 188205d9f81bd638a749669192b50e680b166529d5f3Dheeraj Sharma public void clearSurface(SurfaceHolder surfaceHolder) { 1883eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi if (surfaceHolder == null) { 1884eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi throw new IllegalArgumentException("Invalid surface holder"); 1885eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi } 188605d9f81bd638a749669192b50e680b166529d5f3Dheeraj Sharma 1887eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi final Surface surface = surfaceHolder.getSurface(); 1888eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi if (surface == null) { 18892bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi throw new IllegalArgumentException("Surface could not be retrieved from surface holder"); 1890eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi } 189105d9f81bd638a749669192b50e680b166529d5f3Dheeraj Sharma 18928e7991a52edb3eb8bd1a44ceb7f6d97108748c8cRajneesh Chowdury if (surface.isValid() == false) { 18938e7991a52edb3eb8bd1a44ceb7f6d97108748c8cRajneesh Chowdury throw new IllegalStateException("Surface is not valid"); 18948e7991a52edb3eb8bd1a44ceb7f6d97108748c8cRajneesh Chowdury } 18958e7991a52edb3eb8bd1a44ceb7f6d97108748c8cRajneesh Chowdury 1896eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi if (mMANativeHelper != null) { 1897eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi mMANativeHelper.clearPreviewSurface(surface); 1898eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi } else { 1899eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi Log.w(TAG, "Native helper was not ready!"); 1900eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi } 1901eea200a96a561d8eb9e26831aa6aaf7ddf6ad5a5Gil Dobjanschi } 19023f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi 19033f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi /** 19043f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi * Grab the semaphore which arbitrates access to the editor 19053f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi * 19063f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi * @throws InterruptedException 19073f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi */ 19083f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi private void lock() throws InterruptedException { 19093f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi if (Log.isLoggable(TAG, Log.DEBUG)) { 19103f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi Log.d(TAG, "lock: grabbing semaphore", new Throwable()); 19113f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 19123f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi mLock.acquire(); 19133f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi if (Log.isLoggable(TAG, Log.DEBUG)) { 19143f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi Log.d(TAG, "lock: grabbed semaphore"); 19153f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 19163f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 19173f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi 19183f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi /** 19193f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi * Tries to grab the semaphore with a specified time out which arbitrates access to the editor 19203f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi * 19213f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi * @param timeoutMs time out in ms. 19223f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi * 19233f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi * @return true if the semaphore is acquired, false otherwise 19243f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi * @throws InterruptedException 19253f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi */ 19263f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi private boolean lock(long timeoutMs) throws InterruptedException { 19273f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi if (Log.isLoggable(TAG, Log.DEBUG)) { 19283f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi Log.d(TAG, "lock: grabbing semaphore with timeout " + timeoutMs, new Throwable()); 19293f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 19303f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi 19313f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi boolean acquireSem = mLock.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS); 19323f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi if (Log.isLoggable(TAG, Log.DEBUG)) { 19333f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi Log.d(TAG, "lock: grabbed semaphore status " + acquireSem); 19343f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 19353f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi 19363f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi return acquireSem; 19373f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 19383f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi 19393f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi /** 19403f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi * Release the semaphore which arbitrates access to the editor 19413f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi */ 19423f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi private void unlock() { 19433f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi if (Log.isLoggable(TAG, Log.DEBUG)) { 19443f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi Log.d(TAG, "unlock: releasing semaphore"); 19453f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 19463f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi mLock.release(); 19473f1c57394091de7204d218898696baeb20c04f25Gil Dobjanschi } 1948f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury 1949f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury /** 1950f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury * Dumps the heap memory usage information to file 1951f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury */ 1952f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury private static void dumpHeap (String filename) throws Exception { 1953f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury /* Cleanup as much as possible before dump 1954f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury */ 1955f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury System.gc(); 1956f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury System.runFinalization(); 1957f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury Thread.sleep(1000); 1958f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury String state = Environment.getExternalStorageState(); 1959f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury if (Environment.MEDIA_MOUNTED.equals(state)) { 1960f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury String extDir = 1961f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury Environment.getExternalStorageDirectory().toString(); 1962f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury 1963f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury /* If dump file already exists, then delete it first 1964f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury */ 1965f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury if ((new File(extDir + "/" + filename + ".dump")).exists()) { 1966f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury (new File(extDir + "/" + filename + ".dump")).delete(); 1967f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury } 1968f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury /* Dump native heap 1969f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury */ 1970f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury FileOutputStream ost = 1971f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury new FileOutputStream(extDir + "/" + filename + ".dump"); 1972f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury Debug.dumpNativeHeap(ost.getFD()); 1973f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury ost.close(); 1974f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury } 1975f67441eb370f764710b5697885d1a1549d41e819Rajneesh Chowdury } 1976fdacc8be92cd36f712cfdb0fcf9b0e847f8eeb58Gil Dobjanschi} 1977