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 Madhava/** 219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * This is the super class for all effects. An effect can only be applied to a 229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * single media item. 239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@hide} 249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavapublic abstract class Effect { 269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Instance variables 289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private final String mUniqueId; 309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * The effect owner 329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private final MediaItem mMediaItem; 349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava protected long mDurationMs; 369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * The start time of the effect relative to the beginning 389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * of the media item 399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava protected long mStartTimeMs; 419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Default constructor 449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava @SuppressWarnings("unused") 469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava private Effect() { 479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMediaItem = null; 489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mUniqueId = null; 499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mStartTimeMs = 0; 509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mDurationMs = 0; 519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Constructor 559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * 569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @param mediaItem The media item owner 579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @param effectId The effect id 589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @param startTimeMs The start time relative to the media item to which it 599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * is applied 609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @param durationMs The effect duration in milliseconds 619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public Effect(MediaItem mediaItem, String effectId, long startTimeMs, 639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava long durationMs) { 649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mediaItem == null) { 659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("Media item cannot be null"); 669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if ((startTimeMs < 0) || (durationMs < 0)) { 699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("Invalid start time Or/And Duration"); 709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (startTimeMs + durationMs > mediaItem.getDuration()) { 729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("Invalid start time and duration"); 739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mMediaItem = mediaItem; 769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mUniqueId = effectId; 779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mStartTimeMs = startTimeMs; 789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mDurationMs = durationMs; 799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Get the id of the effect. 839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * 849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @return The id of the effect 859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public String getId() { 879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mUniqueId; 889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Set the duration of the effect. If a preview or export is in progress, 929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * then this change is effective for next preview or export session. 939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * 949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @param durationMs of the effect in milliseconds 959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public void setDuration(long durationMs) { 979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (durationMs <0) { 989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("Invalid duration"); 999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (mStartTimeMs + durationMs > mMediaItem.getDuration()) { 1029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("Duration is too large"); 1039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 105a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi getMediaItem().getNativeContext().setGeneratePreview(true); 106a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi 1079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final long oldDurationMs = mDurationMs; 1089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mDurationMs = durationMs; 1099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1102bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMediaItem.invalidateTransitions(mStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs); 1119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 1149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Get the duration of the effect 1159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * 1169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @return The duration of the effect in milliseconds 1179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 1189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public long getDuration() { 1199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mDurationMs; 1209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 1239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Set start time of the effect. If a preview or export is in progress, then 1249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * this change is effective for next preview or export session. 1259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * 1269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @param startTimeMs The start time of the effect relative to the beginning 1279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * of the media item in milliseconds 1289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 1299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public void setStartTime(long startTimeMs) { 1309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (startTimeMs + mDurationMs > mMediaItem.getDuration()) { 1319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("Start time is too large"); 1329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1342bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi getMediaItem().getNativeContext().setGeneratePreview(true); 1359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final long oldStartTimeMs = mStartTimeMs; 1369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mStartTimeMs = startTimeMs; 1379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1382bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMediaItem.invalidateTransitions(oldStartTimeMs, mDurationMs, mStartTimeMs, mDurationMs); 1399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 1429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Get the start time of the effect 1439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * 1449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @return The start time in milliseconds 1459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 1469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public long getStartTime() { 1479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mStartTimeMs; 1489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 1519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Set the start time and duration 1529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * 1539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @param startTimeMs start time in milliseconds 1549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @param durationMs The duration in milliseconds 1559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 1569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public void setStartTimeAndDuration(long startTimeMs, long durationMs) { 1579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (startTimeMs + durationMs > mMediaItem.getDuration()) { 1589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava throw new IllegalArgumentException("Invalid start time or duration"); 1599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 161a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi getMediaItem().getNativeContext().setGeneratePreview(true); 1629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final long oldStartTimeMs = mStartTimeMs; 1639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava final long oldDurationMs = mDurationMs; 1649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mStartTimeMs = startTimeMs; 1669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava mDurationMs = durationMs; 1679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1682bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi mMediaItem.invalidateTransitions(oldStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs); 1699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /** 1729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Get the media item owner. 1739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * 1749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * @return The media item owner 1759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 1769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public MediaItem getMediaItem() { 1779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mMediaItem; 1789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 1819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@inheritDoc} 1829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 1839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava @Override 1849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public boolean equals(Object object) { 1859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava if (!(object instanceof Effect)) { 1869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return false; 1879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mUniqueId.equals(((Effect)object).mUniqueId); 1899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava 1919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava /* 1929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@inheritDoc} 1939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */ 1949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava @Override 1959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava public int hashCode() { 1969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava return mUniqueId.hashCode(); 1979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava } 1989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava} 199