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