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