19bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava/*
29bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Copyright (C) 2010 The Android Open Source Project
39bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava *
49bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Licensed under the Apache License, Version 2.0 (the "License");
59bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * you may not use this file except in compliance with the License.
69bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * You may obtain a copy of the License at
79bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava *
89bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava *      http://www.apache.org/licenses/LICENSE-2.0
99bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava *
109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Unless required by applicable law or agreed to in writing, software
119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * distributed under the License is distributed on an "AS IS" BASIS,
129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * See the License for the specific language governing permissions and
149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * limitations under the License.
159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */
169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavapackage android.media.videoeditor;
199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.io.File;
219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.util.ArrayList;
229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.util.List;
239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.AlphaMagicSettings;
259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.AudioTransition;
269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.ClipSettings;
279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.EditSettings;
289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.EffectSettings;
299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.SlideTransitionSettings;
309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.TransitionSettings;
319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.VideoTransition;
329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava/**
349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * This class is super class for all transitions. Transitions (with the
359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * exception of TransitionAtStart and TransitioAtEnd) can only be inserted
369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * between media items.
379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava *
389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Adding a transition between MediaItems makes the
399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * duration of the storyboard shorter by the duration of the Transition itself.
409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * As a result, if the duration of the transition is larger than the smaller
419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * duration of the two MediaItems associated with the Transition, an exception
429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * will be thrown.
439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava *
449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * During a transition, the audio track are cross-fading
459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * automatically. {@hide}
469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */
479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavapublic abstract class Transition {
489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The transition behavior
509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private static final int BEHAVIOR_MIN_VALUE = 0;
529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /** The transition starts slowly and speed up */
549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public static final int BEHAVIOR_SPEED_UP = 0;
559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /** The transition start fast and speed down */
569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public static final int BEHAVIOR_SPEED_DOWN = 1;
579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /** The transition speed is constant */
589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public static final int BEHAVIOR_LINEAR = 2;
599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /** The transition starts fast and ends fast with a slow middle */
609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public static final int BEHAVIOR_MIDDLE_SLOW = 3;
619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /** The transition starts slowly and ends slowly with a fast middle */
629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public static final int BEHAVIOR_MIDDLE_FAST = 4;
639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private static final int BEHAVIOR_MAX_VALUE = 4;
659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The unique id of the transition
689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final String mUniqueId;
709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The transition is applied at the end of this media item
739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final MediaItem mAfterMediaItem;
759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The transition is applied at the beginning of this media item
779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final MediaItem mBeforeMediaItem;
799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The transition behavior
829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected final int mBehavior;
849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The transition duration
879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected long mDurationMs;
899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The transition filename
929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected String mFilename;
949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected MediaArtistNativeHelper mNativeHelper;
969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * An object of this type cannot be instantiated by using the default
989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * constructor
999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @SuppressWarnings("unused")
1019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private Transition() {
1029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        this(null, null, null, 0, 0);
1039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
1049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Constructor
1079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
1089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param transitionId The transition id
1099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param afterMediaItem The transition is applied to the end of this
1109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *      media item
1119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param beforeMediaItem The transition is applied to the beginning of
1129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *      this media item
1139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param durationMs The duration of the transition in milliseconds
1149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param behavior The transition behavior
1159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected Transition(String transitionId, MediaItem afterMediaItem,
1179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                         MediaItem beforeMediaItem,long durationMs,
1189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                         int behavior) {
1199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (behavior < BEHAVIOR_MIN_VALUE || behavior > BEHAVIOR_MAX_VALUE) {
1209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Invalid behavior: " + behavior);
1219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if ((afterMediaItem == null) && (beforeMediaItem == null)) {
1239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Null media items");
1249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mUniqueId = transitionId;
1269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mAfterMediaItem = afterMediaItem;
1279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mBeforeMediaItem = beforeMediaItem;
1289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mDurationMs = durationMs;
1299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mBehavior = behavior;
1309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mNativeHelper = null;
1319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (durationMs > getMaximumDuration()) {
1329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("The duration is too large");
1339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
134e7defc29750e5e201a5041d0fce1ffca9e305229Rajneesh Chowdury        if (afterMediaItem != null) {
135e7defc29750e5e201a5041d0fce1ffca9e305229Rajneesh Chowdury            mNativeHelper = afterMediaItem.getNativeContext();
136e7defc29750e5e201a5041d0fce1ffca9e305229Rajneesh Chowdury        }else {
137e7defc29750e5e201a5041d0fce1ffca9e305229Rajneesh Chowdury            mNativeHelper = beforeMediaItem.getNativeContext();
138e7defc29750e5e201a5041d0fce1ffca9e305229Rajneesh Chowdury        }
1399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
1409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the ID of the transition.
1439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
1449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The ID of the transition
1459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public String getId() {
1479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mUniqueId;
1489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
1499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the media item at the end of which the transition is applied.
1529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
1539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The media item at the end of which the transition is applied
1549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public MediaItem getAfterMediaItem() {
1569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mAfterMediaItem;
1579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
1589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the media item at the beginning of which the transition is applied.
1619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
1629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The media item at the beginning of which the transition is
1639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *      applied
1649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public MediaItem getBeforeMediaItem() {
1669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mBeforeMediaItem;
1679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
1689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Set the duration of the transition.
1719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
1729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param durationMs the duration of the transition in milliseconds
1739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void setDuration(long durationMs) {
1759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (durationMs > getMaximumDuration()) {
1769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("The duration is too large");
1779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mDurationMs = durationMs;
1809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        invalidate();
18106a087a52b35f6cc9096a9a60c924bb765a5a746Rajneesh Chowdury        mNativeHelper.setGeneratePreview(true);
1829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
1839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the duration of the transition.
1869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
1879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return the duration of the transition in milliseconds
1889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public long getDuration() {
1909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mDurationMs;
1919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
1929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * The duration of a transition cannot be greater than half of the minimum
1959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * duration of the bounding media items.
1969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
1979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The maximum duration of this transition
1989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public long getMaximumDuration() {
2009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mAfterMediaItem == null) {
2019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return mBeforeMediaItem.getTimelineDuration() / 2;
2029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else if (mBeforeMediaItem == null) {
2039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return mAfterMediaItem.getTimelineDuration() / 2;
2049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else {
2059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return (Math.min(mAfterMediaItem.getTimelineDuration(),
2069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    mBeforeMediaItem.getTimelineDuration()) / 2);
2079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
2089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the behavior of the transition.
2129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The behavior
2149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getBehavior() {
2169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mBehavior;
2179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the transition data.
2219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The transition data in TransitionSettings object
2239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@link android.media.videoeditor.MediaArtistNativeHelper.TransitionSettings}
2249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    TransitionSettings getTransitionSettings() {
2269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        TransitionAlpha transitionAlpha = null;
2279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        TransitionSliding transitionSliding = null;
2289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        TransitionCrossfade transitionCrossfade = null;
2299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        TransitionFadeBlack transitionFadeBlack = null;
2309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        TransitionSettings transitionSetting = null;
2319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        transitionSetting = new TransitionSettings();
2329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        transitionSetting.duration = (int)getDuration();
2339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (this instanceof TransitionAlpha) {
2349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionAlpha = (TransitionAlpha)this;
2359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.videoTransitionType = VideoTransition.ALPHA_MAGIC;
2369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.audioTransitionType = AudioTransition.CROSS_FADE;
2379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.transitionBehaviour = mNativeHelper
2389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            .getVideoTransitionBehaviour(transitionAlpha.getBehavior());
2399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.alphaSettings = new AlphaMagicSettings();
2409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.slideSettings = null;
2419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.alphaSettings.file = transitionAlpha.getPNGMaskFilename();
2429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.alphaSettings.blendingPercent = transitionAlpha.getBlendingPercent();
2439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.alphaSettings.invertRotation = transitionAlpha.isInvert();
2449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.alphaSettings.rgbWidth = transitionAlpha.getRGBFileWidth();
2459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.alphaSettings.rgbHeight = transitionAlpha.getRGBFileHeight();
2469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else if (this instanceof TransitionSliding) {
2489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSliding = (TransitionSliding)this;
2499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.videoTransitionType = VideoTransition.SLIDE_TRANSITION;
2509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.audioTransitionType = AudioTransition.CROSS_FADE;
2519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.transitionBehaviour = mNativeHelper
2529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            .getVideoTransitionBehaviour(transitionSliding.getBehavior());
2539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.alphaSettings = null;
2549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.slideSettings = new SlideTransitionSettings();
2559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.slideSettings.direction = mNativeHelper
2569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            .getSlideSettingsDirection(transitionSliding.getDirection());
2579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else if (this instanceof TransitionCrossfade) {
2589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionCrossfade = (TransitionCrossfade)this;
2599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.videoTransitionType = VideoTransition.CROSS_FADE;
2609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.audioTransitionType = AudioTransition.CROSS_FADE;
2619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.transitionBehaviour = mNativeHelper
2629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            .getVideoTransitionBehaviour(transitionCrossfade.getBehavior());
2639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.alphaSettings = null;
2649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.slideSettings = null;
2659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else if (this instanceof TransitionFadeBlack) {
2669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionFadeBlack = (TransitionFadeBlack)this;
2679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.videoTransitionType = VideoTransition.FADE_BLACK;
2689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.audioTransitionType = AudioTransition.CROSS_FADE;
2699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.transitionBehaviour = mNativeHelper
2709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            .getVideoTransitionBehaviour(transitionFadeBlack.getBehavior());
2719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.alphaSettings = null;
2729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            transitionSetting.slideSettings = null;
2739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
2749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return transitionSetting;
2769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Checks if the effect and overlay applied on a media item
2809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * overlaps with the transition on media item.
2819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param m The media item
2839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param clipSettings The ClipSettings object
2849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param clipNo The clip no.(out of the two media items
2859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * associated with current transition)for which the effect
2869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * clip should be generated
2879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return List of effects that overlap with the transition
2889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    List<EffectSettings>  isEffectandOverlayOverlapping(MediaItem m, ClipSettings clipSettings,
2919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                         int clipNo) {
2929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        List<Effect> effects;
2939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        List<Overlay> overlays;
2949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        List<EffectSettings> effectSettings = new ArrayList<EffectSettings>();
2959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        EffectSettings tmpEffectSettings;
2969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
297ab280b8db6743b826f7412ec1de70e203b91c23dDharmaray Kundargi        overlays = m.getAllOverlays();
298ab280b8db6743b826f7412ec1de70e203b91c23dDharmaray Kundargi        for (Overlay overlay : overlays) {
299ab280b8db6743b826f7412ec1de70e203b91c23dDharmaray Kundargi            tmpEffectSettings = mNativeHelper.getOverlaySettings((OverlayFrame)overlay);
300ab280b8db6743b826f7412ec1de70e203b91c23dDharmaray Kundargi            mNativeHelper.adjustEffectsStartTimeAndDuration(tmpEffectSettings,
301ab280b8db6743b826f7412ec1de70e203b91c23dDharmaray Kundargi                    clipSettings.beginCutTime, clipSettings.endCutTime);
302ab280b8db6743b826f7412ec1de70e203b91c23dDharmaray Kundargi            if (tmpEffectSettings.duration != 0) {
303ab280b8db6743b826f7412ec1de70e203b91c23dDharmaray Kundargi                effectSettings.add(tmpEffectSettings);
304ab280b8db6743b826f7412ec1de70e203b91c23dDharmaray Kundargi            }
305ab280b8db6743b826f7412ec1de70e203b91c23dDharmaray Kundargi        }
306ab280b8db6743b826f7412ec1de70e203b91c23dDharmaray Kundargi
3079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        effects = m.getAllEffects();
3089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        for (Effect effect : effects) {
3099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (effect instanceof EffectColor) {
3109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                tmpEffectSettings = mNativeHelper.getEffectSettings((EffectColor)effect);
3119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mNativeHelper.adjustEffectsStartTimeAndDuration(tmpEffectSettings,
3129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                        clipSettings.beginCutTime, clipSettings.endCutTime);
3139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                if (tmpEffectSettings.duration != 0) {
3149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    if (m instanceof MediaVideoItem) {
3159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                        tmpEffectSettings.fiftiesFrameRate = mNativeHelper
3169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                        .GetClosestVideoFrameRate(((MediaVideoItem)m).getFps());
3179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    }
3189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    effectSettings.add(tmpEffectSettings);
3199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                }
3209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
3219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
322ab280b8db6743b826f7412ec1de70e203b91c23dDharmaray Kundargi
3239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         return effectSettings;
3249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Generate the video clip for the specified transition. This method may
3289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * block for a significant amount of time. Before the method completes
3299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * execution it sets the mFilename to the name of the newly generated
3309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * transition video clip file.
3319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void generate() {
3339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        MediaItem m1 = this.getAfterMediaItem();
3349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        MediaItem m2 = this.getBeforeMediaItem();
3359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        ClipSettings clipSettings1 = new ClipSettings();
3369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        ClipSettings clipSettings2 = new ClipSettings();
3379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        TransitionSettings transitionSetting = null;
3389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        EditSettings editSettings = new EditSettings();
3399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        List<EffectSettings> effectSettings_clip1;
3409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        List<EffectSettings> effectSettings_clip2;
3419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        String output = null;
3439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mNativeHelper == null) {
3459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (m1 != null)
3469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mNativeHelper = m1.getNativeContext();
3479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            else if (m2 != null)
3489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mNativeHelper = m2.getNativeContext();
3499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        transitionSetting = getTransitionSettings();
3519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (m1 != null && m2 != null) {
3529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /* transition between media items */
3539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings1 = m1.getClipSettings();
3549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings2 = m2.getClipSettings();
3559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings1.beginCutTime = (int)(clipSettings1.endCutTime -
3569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                                              this.mDurationMs);
3579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings2.endCutTime = (int)(clipSettings2.beginCutTime +
3589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                                              this.mDurationMs);
3599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /*
3609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * Check how many effects and overlays overlap with transition and
3619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * generate effect clip first if there is any overlap
3629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
3639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            effectSettings_clip1 = isEffectandOverlayOverlapping(m1, clipSettings1,1);
3649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            effectSettings_clip2 = isEffectandOverlayOverlapping(m2, clipSettings2,2);
3659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            for (int index = 0; index < effectSettings_clip2.size(); index++ ) {
3669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                effectSettings_clip2.get(index).startTime += this.mDurationMs;
3679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
3689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            editSettings.effectSettingsArray =
3699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                              new EffectSettings[effectSettings_clip1.size()
3709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                                 + effectSettings_clip2.size()];
3719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            int i=0,j=0;
3729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            while (i < effectSettings_clip1.size()) {
3739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                editSettings.effectSettingsArray[j] = effectSettings_clip1.get(i);
3749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                i++;
3759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                j++;
3769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
3779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            i=0;
3789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            while (i < effectSettings_clip2.size()) {
3799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                editSettings.effectSettingsArray[j] = effectSettings_clip2.get(i);
3809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                i++;
3819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                j++;
3829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
3839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else if (m1 == null && m2 != null) {
3849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /* begin transition at first media item */
3859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            m2.generateBlankFrame(clipSettings1);
3869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings2 = m2.getClipSettings();
3879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings1.endCutTime = (int)(this.mDurationMs + 50);
3889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings2.endCutTime = (int)(clipSettings2.beginCutTime +
3899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                                              this.mDurationMs);
3909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /*
3919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * Check how many effects and overlays overlap with transition and
3929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * generate effect clip first if there is any overlap
3939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
3949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            effectSettings_clip2 = isEffectandOverlayOverlapping(m2, clipSettings2,2);
3959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            for (int index = 0; index < effectSettings_clip2.size(); index++ ) {
3969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                effectSettings_clip2.get(index).startTime += this.mDurationMs;
3979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
3989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            editSettings.effectSettingsArray = new EffectSettings[effectSettings_clip2.size()];
3999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            int i=0, j=0;
4009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            while (i < effectSettings_clip2.size()) {
4019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                editSettings.effectSettingsArray[j] = effectSettings_clip2.get(i);
4029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                i++;
4039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                j++;
4049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
4059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else if (m1 != null && m2 == null) {
4069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /* end transition at last media item */
4079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings1 = m1.getClipSettings();
4089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            m1.generateBlankFrame(clipSettings2);
4099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings1.beginCutTime = (int)(clipSettings1.endCutTime -
4109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                                              this.mDurationMs);
4119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings2.endCutTime = (int)(this.mDurationMs + 50);
4129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /*
4139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * Check how many effects and overlays overlap with transition and
4149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * generate effect clip first if there is any overlap
4159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
4169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            effectSettings_clip1 = isEffectandOverlayOverlapping(m1, clipSettings1,1);
4179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            editSettings.effectSettingsArray = new EffectSettings[effectSettings_clip1.size()];
4189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            int i=0,j=0;
4199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            while (i < effectSettings_clip1.size()) {
4209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                editSettings.effectSettingsArray[j] = effectSettings_clip1.get(i);
4219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                i++;
4229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                j++;
4239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
4249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        editSettings.clipSettingsArray = new ClipSettings[2];
4279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        editSettings.clipSettingsArray[0] = clipSettings1;
4289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        editSettings.clipSettingsArray[1] = clipSettings2;
4299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        editSettings.backgroundMusicSettings = null;
4309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        editSettings.transitionSettingsArray = new TransitionSettings[1];
4319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        editSettings.transitionSettingsArray[0] = transitionSetting;
4329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        output = mNativeHelper.generateTransitionClip(editSettings, mUniqueId,
4339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                                      m1, m2,this);
4349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        setFilename(output);
4359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Set the transition filename.
4409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void setFilename(String filename) {
4429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mFilename = filename;
4439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the transition filename.
4479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    String getFilename() {
4499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mFilename;
4509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Remove any resources associated with this transition
4549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void invalidate() {
4569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mFilename != null) {
4579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            new File(mFilename).delete();
4589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mFilename = null;
4599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Check if the transition is generated.
4649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
4659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return true if the transition is generated
4669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    boolean isGenerated() {
4689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return (mFilename != null);
4699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
4729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
4739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
4759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public boolean equals(Object object) {
4769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (!(object instanceof Transition)) {
4779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return false;
4789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mUniqueId.equals(((Transition)object).mUniqueId);
4809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
4839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
4849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
4869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int hashCode() {
4879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mUniqueId.hashCode();
4889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava}
490