1ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/*
2ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Copyright (C) 2010 The Android Open Source Project
3ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi *
4ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Licensed under the Apache License, Version 2.0 (the "License");
5ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * you may not use this file except in compliance with the License.
6ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * You may obtain a copy of the License at
7ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi *
8ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi *      http://www.apache.org/licenses/LICENSE-2.0
9ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi *
10ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Unless required by applicable law or agreed to in writing, software
11ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * distributed under the License is distributed on an "AS IS" BASIS,
12ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * See the License for the specific language governing permissions and
14ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * limitations under the License.
15ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */
16ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1781393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschipackage com.android.videoeditor.service;
18ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1981393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.EffectType;
20ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
21ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.graphics.Rect;
22ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.Effect;
23ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.EffectColor;
24ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.EffectKenBurns;
25ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
26ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/**
27ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * An effect can only be applied to a single media item.
28ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */
29ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschipublic class MovieEffect {
30ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    // Instance variables
31ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private final String mUniqueId;
32ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private final int mType;
33ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private long mDurationMs;
34ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private long mStartTimeMs;
35ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private Rect mStartRect, mEndRect;
36ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
37ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
38ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Default constructor
39ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
40ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    @SuppressWarnings("unused")
41ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private MovieEffect() {
42ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        this (null);
43ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
44ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
45ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
46ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Constructor
47ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
48ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param effect The effect
49ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
50ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    MovieEffect(Effect effect) {
51ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mUniqueId = effect.getId();
52ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mStartTimeMs = effect.getStartTime();
53ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mDurationMs = effect.getDuration();
54ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (effect instanceof EffectKenBurns) {
55ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mStartRect = ((EffectKenBurns)effect).getStartRect();
5669dc69ef6942308d15d7d308d67ea1477325f09bGil Dobjanschi            mEndRect = ((EffectKenBurns)effect).getEndRect();
57ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else {
58ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mStartRect = null;
59ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mEndRect = null;
60ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
61ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
62ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mType = toType(effect);
63ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
64ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
65ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
66ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The effect type
67ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
68ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public int getType() {
69ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return mType;
70ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
71ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
72ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The id of the effect
73ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
74ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public String getId() {
75ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return mUniqueId;
76ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
77ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
78ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
79ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the duration of the effect. If a preview or export is in progress,
80ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * then this change is effective for next preview or export session. s
81ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
82ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param durationMs of the effect in milliseconds
83ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
84ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    void setDuration(long durationMs) {
85ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mDurationMs = durationMs;
86ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
87ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
88ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
89ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Get the duration of the effect
90ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
91ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The duration of the effect in milliseconds
92ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
93ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public long getDuration() {
94ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return mDurationMs;
95ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
96ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
97ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
98ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set start time of the effect. If a preview or export is in progress, then
99ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * this change is effective for next preview or export session.
100ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param startTimeMs The start time of the effect relative to the beginning
102ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *            of the media item in milliseconds
103ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
104ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    void setStartTime(long startTimeMs) {
105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mStartTimeMs = startTimeMs;
106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
108ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The start time in milliseconds
110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    long getStartTime() {
112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return mStartTimeMs;
113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the Ken Burns start and end rectangles
117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param startRect The start rectangle
119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param endRect The end rectangle
120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    void setRectangles(Rect startRect, Rect endRect) {
122ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mStartRect = startRect;
123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mEndRect = endRect;
124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
126ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The start rectangle
128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public Rect getStartRect() {
130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return mStartRect;
131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
132ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
133ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
134ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The end rectangle
135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
136ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public Rect getEndRect() {
137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return mEndRect;
138ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Get the effect type
142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param effect The effect
144ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The effect type
146ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static int toType(Effect effect) {
148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (effect instanceof EffectKenBurns) {
149ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return EffectType.EFFECT_KEN_BURNS;
150ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else if (effect instanceof EffectColor) {
151ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final EffectColor colorEffect = (EffectColor)effect;
152ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            switch (colorEffect.getType()) {
153ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case EffectColor.TYPE_GRADIENT: {
154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    return EffectType.EFFECT_COLOR_GRADIENT;
155ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
156ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
157ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case EffectColor.TYPE_SEPIA: {
158ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    return EffectType.EFFECT_COLOR_SEPIA;
159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
160ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
161ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case EffectColor.TYPE_NEGATIVE: {
162ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    return EffectType.EFFECT_COLOR_NEGATIVE;
163ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
164ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
165ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case EffectColor.TYPE_COLOR:
166ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                default: {
167ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    throw new IllegalArgumentException("Unsupported color type effect: " +
168ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            colorEffect.getType());
169ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
170ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
171ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else {
172ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            throw new IllegalArgumentException("Unsupported effect: " + effect.getClass());
173ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
174ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
175ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
176ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    @Override
177ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public boolean equals(Object object) {
178ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (!(object instanceof MovieEffect)) {
179ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return false;
180ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
181ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return mUniqueId.equals(((MovieEffect)object).mUniqueId);
182ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
183ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
184ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    @Override
185ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public int hashCode() {
186ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return mUniqueId.hashCode();
187ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
188ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi}
189