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.io.FileNotFoundException;
229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.io.FileOutputStream;
239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.io.IOException;
249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.util.ArrayList;
259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.util.List;
269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.io.DataOutputStream;
289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.nio.ByteBuffer;
299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.nio.IntBuffer;
309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.graphics.Bitmap;
329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.ClipSettings;
339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.FileType;
349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.MediaRendering;
359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava/**
379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * This abstract class describes the base class for any MediaItem. Objects are
389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * defined with a file path as a source data.
399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@hide}
409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */
419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavapublic abstract class MediaItem {
429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  A constant which can be used to specify the end of the file (instead of
449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  providing the actual duration of the media item).
459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public final static int END_OF_FILE = -1;
479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  Rendering modes
509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * When using the RENDERING_MODE_BLACK_BORDER rendering mode video frames
539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * are resized by preserving the aspect ratio until the movie matches one of
549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * the dimensions of the output movie. The areas outside the resized video
559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * clip are rendered black.
569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public static final int RENDERING_MODE_BLACK_BORDER = 0;
589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * When using the RENDERING_MODE_STRETCH rendering mode video frames are
619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * stretched horizontally or vertically to match the current aspect ratio of
629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * the video editor.
639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public static final int RENDERING_MODE_STRETCH = 1;
659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * When using the RENDERING_MODE_CROPPING rendering mode video frames are
689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * scaled horizontally or vertically by preserving the original aspect ratio
699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * of the media item.
709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public static final int RENDERING_MODE_CROPPING = 2;
729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The unique id of the MediaItem
759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final String mUniqueId;
779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The name of the file associated with the MediaItem
809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected final String mFilename;
829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  List of effects
859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final List<Effect> mEffects;
879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  List of overlays
909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final List<Overlay> mOverlays;
929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The rendering mode
959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private int mRenderingMode;
979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final MediaArtistNativeHelper mMANativeHelper;
999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final String mProjectPath;
1019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  Beginning and end transitions
1049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected Transition mBeginTransition;
1069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected Transition mEndTransition;
1089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected String mGeneratedImageClip;
1109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected boolean mRegenerateClip;
1129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private boolean mBlankFrameGenerated = false;
1149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private String mBlankFrameFilename = null;
1169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Constructor
1199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
1209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param editor The video editor reference
1219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param mediaItemId The MediaItem id
1229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param filename name of the media file.
1239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param renderingMode The rendering mode
1249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IOException if file is not found
1259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalArgumentException if a capability such as file format is
1269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *             not supported the exception object contains the unsupported
1279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *             capability
1289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected MediaItem(VideoEditor editor, String mediaItemId, String filename,
1309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                        int renderingMode) throws IOException {
1319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (filename == null) {
1329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("MediaItem : filename is null");
1339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1344d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav        File file = new File(filename);
1354d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav        if (!file.exists()) {
1364d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav            throw new IOException(filename + " not found ! ");
1374d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav        }
1384d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav
1394d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav        /*Compare file_size with 2GB*/
1404d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav        if (VideoEditor.MAX_SUPPORTED_FILE_SIZE <= file.length()) {
1414d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav            throw new IllegalArgumentException("File size is more than 2GB");
1424d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav        }
1439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mUniqueId = mediaItemId;
1449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mFilename = filename;
1459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mRenderingMode = renderingMode;
1469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mEffects = new ArrayList<Effect>();
1479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mOverlays = new ArrayList<Overlay>();
1489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mBeginTransition = null;
1499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mEndTransition = null;
1509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mMANativeHelper = ((VideoEditorImpl)editor).getNativeContext();
1519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mProjectPath = editor.getPath();
1529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mRegenerateClip = false;
1539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mGeneratedImageClip = null;
1549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
1559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The id of the media item
1589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public String getId() {
1609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mUniqueId;
1619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
1629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The media source file name
1659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public String getFilename() {
1679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mFilename;
1689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
1699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * If aspect ratio of the MediaItem is different from the aspect ratio of
1729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * the editor then this API controls the rendering mode.
1739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
1749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param renderingMode rendering mode. It is one of:
1759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *            {@link #RENDERING_MODE_BLACK_BORDER},
1769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *            {@link #RENDERING_MODE_STRETCH}
1779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void setRenderingMode(int renderingMode) {
1799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        switch (renderingMode) {
1809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case RENDERING_MODE_BLACK_BORDER:
1819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case RENDERING_MODE_STRETCH:
1829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case RENDERING_MODE_CROPPING:
1839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                break;
1849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            default:
1869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                throw new IllegalArgumentException("Invalid Rendering Mode");
1879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1882bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi
1892bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        mMANativeHelper.setGeneratePreview(true);
1902bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi
1919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mRenderingMode = renderingMode;
1929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mBeginTransition != null) {
1939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mBeginTransition.invalidate();
1949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mEndTransition != null) {
1979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mEndTransition.invalidate();
1989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
19963298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava
20063298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava        for (Overlay overlay : mOverlays) {
20163298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava            ((OverlayFrame)overlay).invalidateGeneratedFiles();
20263298a980930c81754ab4fb7849a4ff61088d864Santosh Madhava        }
2039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The rendering mode
2079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getRenderingMode() {
2099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mRenderingMode;
2109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param transition The beginning transition
2149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void setBeginTransition(Transition transition) {
2169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mBeginTransition = transition;
2179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The begin transition
2219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public Transition getBeginTransition() {
2239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mBeginTransition;
2249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param transition The end transition
2289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void setEndTransition(Transition transition) {
2309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mEndTransition = transition;
2319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The end transition
2359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public Transition getEndTransition() {
2379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mEndTransition;
2389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The timeline duration. This is the actual duration in the
2429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         timeline (trimmed duration)
2439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public abstract long getTimelineDuration();
2459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The is the full duration of the media item (not trimmed)
2489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public abstract long getDuration();
2509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The source file type
2539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public abstract int getFileType();
2559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return Get the native width of the media item
2589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public abstract int getWidth();
2609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return Get the native height of the media item
2639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public abstract int getHeight();
2659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get aspect ratio of the source media item.
2689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return the aspect ratio as described in MediaProperties.
2709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         MediaProperties.ASPECT_RATIO_UNDEFINED if aspect ratio is not
2719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         supported as in MediaProperties
2729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public abstract int getAspectRatio();
2749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Add the specified effect to this media item.
2779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Note that certain types of effects cannot be applied to video and to
2799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * image media items. For example in certain implementation a Ken Burns
2809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * implementation cannot be applied to video media item.
2819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * This method invalidates transition video clips if the
2839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * effect overlaps with the beginning and/or the end transition.
2849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param effect The effect to apply
2869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalStateException if a preview or an export is in progress
2879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalArgumentException if the effect start and/or duration are
2889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *      invalid or if the effect cannot be applied to this type of media
2899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *      item or if the effect id is not unique across all the Effects
2909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *      added.
2919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void addEffect(Effect effect) {
2939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (effect == null) {
2959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("NULL effect cannot be applied");
2969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
2979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (effect.getMediaItem() != this) {
2999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Media item mismatch");
3009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mEffects.contains(effect)) {
3039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Effect already exists: " + effect.getId());
3049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (effect.getStartTime() + effect.getDuration() > getDuration()) {
3079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException(
3089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            "Effect start time + effect duration > media clip duration");
3099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
311a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi        mMANativeHelper.setGeneratePreview(true);
312a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi
3139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mEffects.add(effect);
3149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        invalidateTransitions(effect.getStartTime(), effect.getDuration());
3162bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi
3172bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        if (effect instanceof EffectKenBurns) {
3182bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi            mRegenerateClip = true;
3199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Remove the effect with the specified id.
3249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * This method invalidates a transition video clip if the effect overlaps
3269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * with a transition.
3279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param effectId The id of the effect to be removed
3299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The effect that was removed
3319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalStateException if a preview or an export is in progress
3329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public Effect removeEffect(String effectId) {
3349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        for (Effect effect : mEffects) {
3359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (effect.getId().equals(effectId)) {
3362bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                mMANativeHelper.setGeneratePreview(true);
3372bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi
3389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mEffects.remove(effect);
3392bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi
3409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                invalidateTransitions(effect.getStartTime(), effect.getDuration());
3412bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                if (effect instanceof EffectKenBurns) {
3422bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                    if (mGeneratedImageClip != null) {
3432bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                        /**
3442bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                         *  Delete the file
3452bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                         */
3462bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                        new File(mGeneratedImageClip).delete();
3472bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                        /**
3482bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                         *  Invalidate the filename
3492bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                         */
3502bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                        mGeneratedImageClip = null;
3519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    }
3522bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                    mRegenerateClip = false;
3539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                }
3549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                return effect;
3559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
3569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return null;
3589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Set the filepath of the generated image clip when the effect is added.
3629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param The filepath of the generated image clip.
3649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void setGeneratedImageClip(String generatedFilePath) {
3669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mGeneratedImageClip = generatedFilePath;
3679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the filepath of the generated image clip when the effect is added.
3719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The filepath of the generated image clip (null if it does not
3739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         exist)
3749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    String getGeneratedImageClip() {
3769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mGeneratedImageClip;
3779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Find the effect with the specified id
3819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param effectId The effect id
3839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The effect with the specified id (null if it does not exist)
3849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public Effect getEffect(String effectId) {
3869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        for (Effect effect : mEffects) {
3879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (effect.getId().equals(effectId)) {
3889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                return effect;
3899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
3909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return null;
3929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the list of effects.
3969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return the effects list. If no effects exist an empty list will be
3989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         returned.
3999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public List<Effect> getAllEffects() {
4019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mEffects;
4029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Add an overlay to the storyboard. This method invalidates a transition
4069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * video clip if the overlay overlaps with a transition.
4079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
4089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param overlay The overlay to add
4099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalStateException if a preview or an export is in progress or
4109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *             if the overlay id is not unique across all the overlays added
4119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *             or if the bitmap is not specified or if the dimensions of the
4129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *             bitmap do not match the dimensions of the media item
4139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws FileNotFoundException, IOException if overlay could not be saved
4149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *             to project path
4159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void addOverlay(Overlay overlay) throws FileNotFoundException, IOException {
4179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (overlay == null) {
4189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("NULL Overlay cannot be applied");
4199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (overlay.getMediaItem() != this) {
4229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Media item mismatch");
4239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mOverlays.contains(overlay)) {
4269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Overlay already exists: " + overlay.getId());
4279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (overlay.getStartTime() + overlay.getDuration() > getDuration()) {
4309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException(
4319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            "Overlay start time + overlay duration > media clip duration");
4329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (overlay instanceof OverlayFrame) {
4359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final OverlayFrame frame = (OverlayFrame)overlay;
4369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final Bitmap bitmap = frame.getBitmap();
4379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (bitmap == null) {
4389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                throw new IllegalArgumentException("Overlay bitmap not specified");
4399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
4409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final int scaledWidth, scaledHeight;
4429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (this instanceof MediaVideoItem) {
4439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                scaledWidth = getWidth();
4449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                scaledHeight = getHeight();
4459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            } else {
4469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                scaledWidth = ((MediaImageItem)this).getScaledWidth();
4479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                scaledHeight = ((MediaImageItem)this).getScaledHeight();
4489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
4499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /**
4519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * The dimensions of the overlay bitmap must be the same as the
4529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * media item dimensions
4539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
4549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (bitmap.getWidth() != scaledWidth || bitmap.getHeight() != scaledHeight) {
4559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                throw new IllegalArgumentException(
4569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                "Bitmap dimensions must match media item dimensions");
4579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
458a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi
459a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi            mMANativeHelper.setGeneratePreview(true);
460a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi            ((OverlayFrame)overlay).save(mProjectPath);
461a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi
462a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi            mOverlays.add(overlay);
463a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi            invalidateTransitions(overlay.getStartTime(), overlay.getDuration());
464a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi
4659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else {
4669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Overlay not supported");
4679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param flag The flag to indicate if regeneration of clip is true or
4729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *            false.
4739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void setRegenerateClip(boolean flag) {
4759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mRegenerateClip = flag;
4769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return flag The flag to indicate if regeneration of clip is true or
4809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         false.
4819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    boolean getRegenerateClip() {
4839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mRegenerateClip;
4849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Remove the overlay with the specified id.
4889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
4899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * This method invalidates a transition video clip if the overlay overlaps
4909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * with a transition.
4919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
4929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param overlayId The id of the overlay to be removed
4939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
4949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The overlay that was removed
4959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalStateException if a preview or an export is in progress
4969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public Overlay removeOverlay(String overlayId) {
4989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        for (Overlay overlay : mOverlays) {
4999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (overlay.getId().equals(overlayId)) {
5002bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi                mMANativeHelper.setGeneratePreview(true);
5012bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi
5029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mOverlays.remove(overlay);
5039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                if (overlay instanceof OverlayFrame) {
5049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    ((OverlayFrame)overlay).invalidate();
5059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                }
5069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                invalidateTransitions(overlay.getStartTime(), overlay.getDuration());
5079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                return overlay;
5089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
5099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
5109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return null;
5119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
5129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
5149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Find the overlay with the specified id
5159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param overlayId The overlay id
5179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The overlay with the specified id (null if it does not exist)
5199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
5209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public Overlay getOverlay(String overlayId) {
5219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        for (Overlay overlay : mOverlays) {
5229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (overlay.getId().equals(overlayId)) {
5239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                return overlay;
5249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
5259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
5269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return null;
5289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
5299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
5319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the list of overlays associated with this media item
5329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Note that if any overlay source files are not accessible anymore,
5349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * this method will still provide the full list of overlays.
5359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The list of overlays. If no overlays exist an empty list will
5379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         be returned.
5389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
5399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public List<Overlay> getAllOverlays() {
5409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mOverlays;
5419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
5429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
5449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Create a thumbnail at specified time in a video stream in Bitmap format
5459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param width width of the thumbnail in pixels
5479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param height height of the thumbnail in pixels
5489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param timeMs The time in the source video file at which the thumbnail is
5499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *            requested (even if trimmed).
5509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The thumbnail as a Bitmap.
5529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IOException if a file error occurs
5549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalArgumentException if time is out of video duration
5559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
5569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public abstract Bitmap getThumbnail(int width, int height, long timeMs)
5579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                        throws IOException;
5589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
5609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the array of Bitmap thumbnails between start and end.
5619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param width width of the thumbnail in pixels
5639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param height height of the thumbnail in pixels
5649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param startMs The start of time range in milliseconds
5659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param endMs The end of the time range in milliseconds
5669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param thumbnailCount The thumbnail count
5671f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang     * @param indices The indices of the thumbnails wanted
5681f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang     * @param callback The callback used to pass back the bitmaps
5699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IOException if a file error occurs
5719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
5721f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang    public abstract void getThumbnailList(int width, int height,
5731f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                          long startMs, long endMs,
5741f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                          int thumbnailCount,
5751f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                          int[] indices,
5761f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                          GetThumbnailListCallback callback)
5771f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                          throws IOException;
5781f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang
5791f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang    public interface GetThumbnailListCallback {
5801f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang        public void onThumbnail(Bitmap bitmap, int index);
5811f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang    }
5821f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang
5831f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang    // This is for compatibility, only used in tests.
5841f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang    public Bitmap[] getThumbnailList(int width, int height,
5851f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                     long startMs, long endMs,
5861f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                     int thumbnailCount)
5871f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                     throws IOException {
5881f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang        final Bitmap[] bitmaps = new Bitmap[thumbnailCount];
5891f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang        int[] indices = new int[thumbnailCount];
5901f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang        for (int i = 0; i < thumbnailCount; i++) {
5911f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang            indices[i] = i;
5921f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang        }
5931f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang        getThumbnailList(width, height, startMs, endMs,
5941f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                thumbnailCount, indices, new GetThumbnailListCallback() {
5951f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang            public void onThumbnail(Bitmap bitmap, int index) {
5961f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                bitmaps[index] = bitmap;
5971f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang            }
5981f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang        });
5991f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang
6001f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang        return bitmaps;
6011f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang    }
6029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
6049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
6059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
6079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public boolean equals(Object object) {
6089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (!(object instanceof MediaItem)) {
6099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return false;
6109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mUniqueId.equals(((MediaItem)object).mUniqueId);
6129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
6159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
6169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
6189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int hashCode() {
6199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mUniqueId.hashCode();
6209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Invalidate the start and end transitions if necessary
6249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
6259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param startTimeMs The start time of the effect or overlay
6269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param durationMs The duration of the effect or overlay
6279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    abstract void invalidateTransitions(long startTimeMs, long durationMs);
6299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Invalidate the start and end transitions if necessary. This method is
6329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * typically called when the start time and/or duration of an overlay or
6339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * effect is changing.
6349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
6359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param oldStartTimeMs The old start time of the effect or overlay
6369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param oldDurationMs The old duration of the effect or overlay
6379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param newStartTimeMs The new start time of the effect or overlay
6389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param newDurationMs The new duration of the effect or overlay
6399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    abstract void invalidateTransitions(long oldStartTimeMs, long oldDurationMs,
6419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            long newStartTimeMs, long newDurationMs);
6429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Check if two items overlap in time
6459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
6469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param startTimeMs1 Item 1 start time
6479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param durationMs1 Item 1 duration
6489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param startTimeMs2 Item 2 start time
6499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param durationMs2 Item 2 end time
6509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return true if the two items overlap
6519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected boolean isOverlapping(long startTimeMs1, long durationMs1,
6539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                    long startTimeMs2, long durationMs2) {
6549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (startTimeMs1 + durationMs1 <= startTimeMs2) {
6559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return false;
6569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else if (startTimeMs1 >= startTimeMs2 + durationMs2) {
6579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return false;
6589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return true;
6619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Adjust the duration transitions.
6659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    protected void adjustTransitions() {
6679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        /**
6689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         *  Check if the duration of transitions need to be adjusted
6699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         */
6709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mBeginTransition != null) {
6719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final long maxDurationMs = mBeginTransition.getMaximumDuration();
6729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (mBeginTransition.getDuration() > maxDurationMs) {
6739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mBeginTransition.setDuration(maxDurationMs);
6749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
6759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mEndTransition != null) {
6789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final long maxDurationMs = mEndTransition.getMaximumDuration();
6799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (mEndTransition.getDuration() > maxDurationMs) {
6809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mEndTransition.setDuration(maxDurationMs);
6819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
6829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return MediaArtistNativeHleper context
6879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    MediaArtistNativeHelper getNativeContext() {
6899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mMANativeHelper;
6909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Initialises ClipSettings fields to default value
6949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
6959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param ClipSettings object
6969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *{@link android.media.videoeditor.MediaArtistNativeHelper.ClipSettings}
6979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void initClipSettings(ClipSettings clipSettings) {
6999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.clipPath = null;
7009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.clipDecodedPath = null;
7019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.clipOriginalPath = null;
7029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.fileType = 0;
7039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.endCutTime = 0;
7049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.beginCutTime = 0;
7059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.beginCutPercent = 0;
7069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.endCutPercent = 0;
7079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.panZoomEnabled = false;
7089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.panZoomPercentStart = 0;
7099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.panZoomTopLeftXStart = 0;
7109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.panZoomTopLeftYStart = 0;
7119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.panZoomPercentEnd = 0;
7129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.panZoomTopLeftXEnd = 0;
7139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.panZoomTopLeftYEnd = 0;
7149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.mediaRendering = 0;
7159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.rgbWidth = 0;
7169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.rgbHeight = 0;
7179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
7189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
7209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return ClipSettings object with populated data
7219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *{@link android.media.videoeditor.MediaArtistNativeHelper.ClipSettings}
7229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
7239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    ClipSettings getClipSettings() {
7249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        MediaVideoItem mVI = null;
7259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        MediaImageItem mII = null;
7269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        ClipSettings clipSettings = new ClipSettings();
7279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        initClipSettings(clipSettings);
7289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (this instanceof MediaVideoItem) {
7299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mVI = (MediaVideoItem)this;
7309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings.clipPath = mVI.getFilename();
7319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings.fileType = mMANativeHelper.getMediaItemFileType(mVI.
7329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                                                 getFileType());
7339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings.beginCutTime = (int)mVI.getBoundaryBeginTime();
7349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings.endCutTime = (int)mVI.getBoundaryEndTime();
7359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings.mediaRendering = mMANativeHelper.
7369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                          getMediaItemRenderingMode(mVI
7379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                          .getRenderingMode());
7389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else if (this instanceof MediaImageItem) {
7399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mII = (MediaImageItem)this;
7409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            clipSettings = mII.getImageClipProperties();
7419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
7429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return clipSettings;
7439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
7449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
7469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Generates a black frame to be used for generating
7479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * begin transition at first media item in storyboard
7489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * or end transition at last media item in storyboard
7499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
7509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param ClipSettings object
7519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *{@link android.media.videoeditor.MediaArtistNativeHelper.ClipSettings}
7529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
7539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void generateBlankFrame(ClipSettings clipSettings) {
7549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (!mBlankFrameGenerated) {
7559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            int mWidth = 64;
7569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            int mHeight = 64;
7579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mBlankFrameFilename = String.format(mProjectPath + "/" + "ghost.rgb");
7589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            FileOutputStream fl = null;
7599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            try {
7609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                 fl = new FileOutputStream(mBlankFrameFilename);
7619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            } catch (IOException e) {
7629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                /* catch IO exception */
7639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
7649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final DataOutputStream dos = new DataOutputStream(fl);
7659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final int [] framingBuffer = new int[mWidth];
7679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            ByteBuffer byteBuffer = ByteBuffer.allocate(framingBuffer.length * 4);
7699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            IntBuffer intBuffer;
7709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            byte[] array = byteBuffer.array();
7729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            int tmp = 0;
7739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            while(tmp < mHeight) {
7749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                intBuffer = byteBuffer.asIntBuffer();
7759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                intBuffer.put(framingBuffer,0,mWidth);
7769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                try {
7779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    dos.write(array);
7789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                } catch (IOException e) {
7799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    /* catch file write error */
7809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                }
7819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                tmp += 1;
7829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
7839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            try {
7859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                fl.close();
7869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            } catch (IOException e) {
7879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                /* file close error */
7889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
7899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mBlankFrameGenerated = true;
7909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
7919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.clipPath = mBlankFrameFilename;
7939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.fileType = FileType.JPG;
7949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.beginCutTime = 0;
7959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.endCutTime = 0;
7969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.mediaRendering = MediaRendering.RESIZING;
7979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.rgbWidth = 64;
7999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.rgbHeight = 64;
8009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
8019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
8029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
8039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Invalidates the blank frame generated
8049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
8059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void invalidateBlankFrame() {
8069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mBlankFrameFilename != null) {
8079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (new File(mBlankFrameFilename).exists()) {
8089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                new File(mBlankFrameFilename).delete();
8099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mBlankFrameFilename = null;
8109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
8119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
8129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
8139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
8149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava}
815