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