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.IOException;
229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.lang.ref.SoftReference;
239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.graphics.Bitmap;
249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.ClipSettings;
259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.Properties;
26600acf14ff12eaf139f0ac644fb7e17849af65faHong Tengimport android.media.videoeditor.VideoEditorProfile;
279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.view.Surface;
289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.view.SurfaceHolder;
299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava/**
319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * This class represents a video clip item on the storyboard
329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@hide}
339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */
349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavapublic class MediaVideoItem extends MediaItem {
359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  Instance variables
389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mWidth;
409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mHeight;
419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mAspectRatio;
429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mFileType;
439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mVideoType;
449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mVideoProfile;
453ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury    private final int mVideoLevel;
469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mVideoBitrate;
479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final long mDurationMs;
489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mAudioBitrate;
499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mFps;
509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mAudioType;
519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mAudioChannels;
529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mAudioSamplingFrequency;
539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private long mBeginBoundaryTimeMs;
549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private long mEndBoundaryTimeMs;
559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private int mVolumePercentage;
569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private boolean mMuted;
579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private String mAudioWaveformFilename;
589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private MediaArtistNativeHelper mMANativeHelper;
599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private VideoEditorImpl mVideoEditor;
60c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury    private final int mVideoRotationDegree;
619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The audio waveform data
639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private SoftReference<WaveformData> mWaveformData;
659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * An object of this type cannot be instantiated with a default constructor
689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @SuppressWarnings("unused")
709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private MediaVideoItem() throws IOException {
719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        this(null, null, null, RENDERING_MODE_BLACK_BORDER);
729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Constructor
769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param editor The video editor reference
789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param mediaItemId The MediaItem id
799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param filename The image file name
809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param renderingMode The rendering mode
819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IOException if the file cannot be opened for reading
839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
84c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi    public MediaVideoItem(VideoEditor editor, String mediaItemId, String filename,
85c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            int renderingMode) throws IOException {
86c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi        this(editor, mediaItemId, filename, renderingMode, 0, END_OF_FILE, 100, false, null);
879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Constructor
919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param editor The video editor reference
939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param mediaItemId The MediaItem id
949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param filename The image file name
959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param renderingMode The rendering mode
969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param beginMs Start time in milliseconds. Set to 0 to extract from the
979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *           beginning
989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param endMs End time in milliseconds. Set to {@link #END_OF_FILE} to
999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *           extract until the end
1009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param volumePercent in %/. 100% means no change; 50% means half value, 200%
1019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *            means double, 0% means silent.
1029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param muted true if the audio is muted
1039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param audioWaveformFilename The name of the audio waveform file
1049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
1059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IOException if the file cannot be opened for reading
1069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    MediaVideoItem(VideoEditor editor, String mediaItemId, String filename,
108c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            int renderingMode, long beginMs, long endMs, int volumePercent, boolean muted,
1099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            String audioWaveformFilename)  throws IOException {
1109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        super(editor, mediaItemId, filename, renderingMode);
111c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi
1129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (editor instanceof VideoEditorImpl) {
1139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mMANativeHelper = ((VideoEditorImpl)editor).getNativeContext();
1149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mVideoEditor = ((VideoEditorImpl)editor);
1159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
116c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi
117c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi        final Properties properties;
1189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        try {
1199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             properties = mMANativeHelper.getMediaProperties(filename);
1209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } catch ( Exception e) {
121895a28e14e6c88b4ff3b1f1cdf02d22f7b3b52caSantosh Madhava            throw new IllegalArgumentException(e.getMessage() + " : " + filename);
1229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
123c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi
124600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng        /** Check the platform specific maximum import resolution */
125600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng        VideoEditorProfile veProfile = VideoEditorProfile.get();
126600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng        if (veProfile == null) {
127600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng            throw new RuntimeException("Can't get the video editor profile");
128600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng        }
129600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng        final int maxInputWidth = veProfile.maxInputVideoFrameWidth;
130600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng        final int maxInputHeight = veProfile.maxInputVideoFrameHeight;
131600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng        if ((properties.width > maxInputWidth) ||
132600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng            (properties.height > maxInputHeight)) {
133600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng            throw new IllegalArgumentException(
134600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng                "Unsupported import resolution. Supported maximum width:" +
135600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng                maxInputWidth + " height:" + maxInputHeight +
136600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng                ", current width:" + properties.width +
137600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng                " height:" + properties.height);
138600acf14ff12eaf139f0ac644fb7e17849af65faHong Teng        }
1393ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury        /** Check the platform specific maximum video profile and level */
1403ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury        if (!properties.profileSupported) {
1413ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury            throw new IllegalArgumentException(
1423ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury                "Unsupported video profile " + properties.profile);
1433ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury        }
1443ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury        if (!properties.levelSupported) {
1453ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury            throw new IllegalArgumentException(
1463ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury                "Unsupported video level " + properties.level);
1473ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury        }
1489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        switch (mMANativeHelper.getFileType(properties.fileType)) {
1499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case MediaProperties.FILE_3GP:
1509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case MediaProperties.FILE_MP4:
1514e7032052137345450bfd2b7a4a9a05ecde17076Dharmaray Kundargi            case MediaProperties.FILE_M4V:
1529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                break;
1539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            default:
1559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                throw new IllegalArgumentException("Unsupported Input File Type");
1569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        switch (mMANativeHelper.getVideoCodecType(properties.videoFormat)) {
1599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case MediaProperties.VCODEC_H263:
1603ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury            case MediaProperties.VCODEC_H264:
1619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case MediaProperties.VCODEC_MPEG4:
1629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                break;
1639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            default:
1659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                throw new IllegalArgumentException("Unsupported Video Codec Format in Input File");
1669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mWidth = properties.width;
1699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mHeight = properties.height;
1709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mAspectRatio = mMANativeHelper.getAspectRatio(properties.width,
1719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                properties.height);
1729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mFileType = mMANativeHelper.getFileType(properties.fileType);
1739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mVideoType = mMANativeHelper.getVideoCodecType(properties.videoFormat);
1743ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury        mVideoProfile = properties.profile;
1753ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury        mVideoLevel = properties.level;
1769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mDurationMs = properties.videoDuration;
1779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mVideoBitrate = properties.videoBitrate;
1789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mAudioBitrate = properties.audioBitrate;
1799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mFps = (int)properties.averageFrameRate;
1809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mAudioType = mMANativeHelper.getAudioCodecType(properties.audioFormat);
1819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mAudioChannels = properties.audioChannels;
1829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mAudioSamplingFrequency =  properties.audioSamplingFrequency;
1839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mBeginBoundaryTimeMs = beginMs;
1849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mEndBoundaryTimeMs = endMs == END_OF_FILE ? mDurationMs : endMs;
1859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mVolumePercentage = volumePercent;
1869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mMuted = muted;
1879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mAudioWaveformFilename = audioWaveformFilename;
1889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (audioWaveformFilename != null) {
189c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            mWaveformData = new SoftReference<WaveformData>(
1909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                        new WaveformData(audioWaveformFilename));
1919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else {
1929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mWaveformData = null;
1939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
194c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury        mVideoRotationDegree = properties.videoRotation;
1959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
1969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
1989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Sets the start and end marks for trimming a video media item.
1999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * This method will adjust the duration of bounding transitions, effects
2009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * and overlays if the current duration of the transactions become greater
2019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * than the maximum allowable duration.
2029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param beginMs Start time in milliseconds. Set to 0 to extract from the
2049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *           beginning
2059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param endMs End time in milliseconds. Set to {@link #END_OF_FILE} to
2069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *           extract until the end
2079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalArgumentException if the start time is greater or equal than
2099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *           end time, the end time is beyond the file duration, the start time
2109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *           is negative
2119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void setExtractBoundaries(long beginMs, long endMs) {
2139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (beginMs > mDurationMs) {
2149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("setExtractBoundaries: Invalid start time");
2159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
216c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi
2179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (endMs > mDurationMs) {
2189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("setExtractBoundaries: Invalid end time");
2199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
220c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi
2219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if ((endMs != -1) && (beginMs >= endMs) ) {
2229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("setExtractBoundaries: Start time is greater than end time");
2239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
2249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if ((beginMs < 0) || ((endMs != -1) && (endMs < 0))) {
2269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("setExtractBoundaries: Start time or end time is negative");
2279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
2289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2292bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        mMANativeHelper.setGeneratePreview(true);
2302bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi
2319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (beginMs != mBeginBoundaryTimeMs) {
2329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (mBeginTransition != null) {
2339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mBeginTransition.invalidate();
2349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
2359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
2369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (endMs != mEndBoundaryTimeMs) {
2389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (mEndTransition != null) {
2399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mEndTransition.invalidate();
2409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
2419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
2429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mBeginBoundaryTimeMs = beginMs;
2449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mEndBoundaryTimeMs = endMs;
2459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        adjustTransitions();
2469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mVideoEditor.updateTimelineDuration();
2479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        /**
2489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         *  Note that the start and duration of any effects and overlays are
2499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         *  not adjusted nor are they automatically removed if they fall
2509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         *  outside the new boundaries.
2519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         */
2529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The boundary begin time
2569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public long getBoundaryBeginTime() {
2589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mBeginBoundaryTimeMs;
2599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The boundary end time
2639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public long getBoundaryEndTime() {
2659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mEndBoundaryTimeMs;
2669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
2699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
2709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
2729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void addEffect(Effect effect) {
2739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (effect instanceof EffectKenBurns) {
2749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Ken Burns effects cannot be applied to MediaVideoItem");
2759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
2769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        super.addEffect(effect);
2779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
2809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
2819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
2839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public Bitmap getThumbnail(int width, int height, long timeMs) {
284c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi        if (timeMs > mDurationMs) {
2859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Time Exceeds duration");
2869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
287c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi
288c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi        if (timeMs < 0) {
2899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Invalid Time duration");
2909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
291c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi
2922bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        if ((width <= 0) || (height <= 0)) {
2939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Invalid Dimensions");
2949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
295c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi
29647a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang        if (mVideoRotationDegree == 90 || mVideoRotationDegree == 270) {
29747a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang            int temp = width;
29847a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang            width = height;
29947a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang            height = temp;
30047a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang        }
30147a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang
30247a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang        return mMANativeHelper.getPixels(
30347a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang                getFilename(), width, height, timeMs, mVideoRotationDegree);
3049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
3079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
3089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
3101f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang    public void getThumbnailList(int width, int height,
3111f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                 long startMs, long endMs,
3121f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                 int thumbnailCount,
3131f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                 int[] indices,
3141f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                 GetThumbnailListCallback callback)
3151f5de3833daddfa1d0ebc7dee1f9e007d4ed36a0Chih-Chung Chang                                 throws IOException {
3169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (startMs > endMs) {
3179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Start time is greater than end time");
3189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
319c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi
3209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (endMs > mDurationMs) {
3219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("End time is greater than file duration");
3229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
323c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi
3249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if ((height <= 0) || (width <= 0)) {
3259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Invalid dimension");
3269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
327c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi
32847a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang        if (mVideoRotationDegree == 90 || mVideoRotationDegree == 270) {
32947a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang            int temp = width;
33047a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang            width = height;
33147a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang            height = temp;
33247a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang        }
33347a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang
33447a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang        mMANativeHelper.getPixelsList(getFilename(), width, height,
33547a52158d2df0eb818bf7d589d8ff9fd5c0daaa3Chih-Chung Chang                startMs, endMs, thumbnailCount, indices, callback,
336c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury                mVideoRotationDegree);
3379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
3409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
3419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
3439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void invalidateTransitions(long startTimeMs, long durationMs) {
3449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        /**
3459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         *  Check if the item overlaps with the beginning and end transitions
3469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         */
3479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mBeginTransition != null) {
3489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (isOverlapping(startTimeMs, durationMs,
3499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    mBeginBoundaryTimeMs, mBeginTransition.getDuration())) {
3509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mBeginTransition.invalidate();
3519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
3529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mEndTransition != null) {
3559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final long transitionDurationMs = mEndTransition.getDuration();
3569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            if (isOverlapping(startTimeMs, durationMs,
3579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    mEndBoundaryTimeMs - transitionDurationMs, transitionDurationMs)) {
3589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mEndTransition.invalidate();
3599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
3609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
3649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
3659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
367c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi    void invalidateTransitions(long oldStartTimeMs, long oldDurationMs, long newStartTimeMs,
3689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            long newDurationMs) {
3699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        /**
3709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         *  Check if the item overlaps with the beginning and end transitions
3719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         */
3729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mBeginTransition != null) {
3739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final long transitionDurationMs = mBeginTransition.getDuration();
374c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            final boolean oldOverlap = isOverlapping(oldStartTimeMs, oldDurationMs,
375c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                    mBeginBoundaryTimeMs, transitionDurationMs);
376c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            final boolean newOverlap = isOverlapping(newStartTimeMs, newDurationMs,
377c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                    mBeginBoundaryTimeMs, transitionDurationMs);
3789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /**
379c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi             * Invalidate transition if:
380c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi             *
381c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi             * 1. New item overlaps the transition, the old one did not
382c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi             * 2. New item does not overlap the transition, the old one did
383c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi             * 3. New and old item overlap the transition if begin or end
384c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi             * time changed
3859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
386c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            if (newOverlap != oldOverlap) { // Overlap has changed
3879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mBeginTransition.invalidate();
388c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            } else if (newOverlap) { // Both old and new overlap
389c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                if ((oldStartTimeMs != newStartTimeMs) ||
390c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                        !(oldStartTimeMs + oldDurationMs > transitionDurationMs &&
391c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                        newStartTimeMs + newDurationMs > transitionDurationMs)) {
392c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                    mBeginTransition.invalidate();
393c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                }
3949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
3959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mEndTransition != null) {
3989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final long transitionDurationMs = mEndTransition.getDuration();
399c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            final boolean oldOverlap = isOverlapping(oldStartTimeMs, oldDurationMs,
400c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                    mEndBoundaryTimeMs - transitionDurationMs, transitionDurationMs);
401c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            final boolean newOverlap = isOverlapping(newStartTimeMs, newDurationMs,
402c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                    mEndBoundaryTimeMs - transitionDurationMs, transitionDurationMs);
4039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /**
404c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi             * Invalidate transition if:
405c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi             *
406c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi             * 1. New item overlaps the transition, the old one did not
407c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi             * 2. New item does not overlap the transition, the old one did
408c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi             * 3. New and old item overlap the transition if begin or end
409c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi             * time changed
4109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
411c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            if (newOverlap != oldOverlap) { // Overlap has changed
4129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                mEndTransition.invalidate();
413c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            } else if (newOverlap) { // Both old and new overlap
414c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                if ((oldStartTimeMs + oldDurationMs != newStartTimeMs + newDurationMs) ||
415c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                        ((oldStartTimeMs > mEndBoundaryTimeMs - transitionDurationMs) ||
416c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                        newStartTimeMs > mEndBoundaryTimeMs - transitionDurationMs)) {
417c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                    mEndTransition.invalidate();
418c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi                }
4199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
4209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
4249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
4259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
4279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getAspectRatio() {
4289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mAspectRatio;
4299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
4329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
4339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
4359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getFileType() {
4369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mFileType;
4379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
4409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
4419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
4439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getWidth() {
444c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury        if (mVideoRotationDegree == 90 ||
445c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury             mVideoRotationDegree == 270) {
446c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury            return mHeight;
447c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury        } else {
448c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury            return mWidth;
449c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury        }
4509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
4539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
4549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
4569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getHeight() {
457c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury        if (mVideoRotationDegree == 90 ||
458c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury             mVideoRotationDegree == 270) {
459c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury            return mWidth;
460c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury        } else {
461c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury            return mHeight;
462c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury        }
4639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
4669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
4679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
4699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public long getDuration() {
4709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mDurationMs;
4719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
4749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
4759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
4779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public long getTimelineDuration() {
4789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mEndBoundaryTimeMs - mBeginBoundaryTimeMs;
4799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Render a frame according to the playback (in the native aspect ratio) for
4839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * the specified media item. All effects and overlays applied to the media
4849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * item are ignored. The extract boundaries are also ignored. This method
4859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * can be used to playback frames when implementing trimming functionality.
4869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
4879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param surfaceHolder SurfaceHolder used by the application
4889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param timeMs time corresponding to the frame to display (relative to the
4899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *            the beginning of the media item).
4909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The accurate time stamp of the frame that is rendered .
4919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalStateException if a playback, preview or an export is
4929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *             already in progress
4939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalArgumentException if time is negative or greater than the
4949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *             media item duration
4959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public long renderFrame(SurfaceHolder surfaceHolder, long timeMs) {
4979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (surfaceHolder == null) {
4989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Surface Holder is null");
4999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
5009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (timeMs > mDurationMs || timeMs < 0) {
5029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("requested time not correct");
5039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
5049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
505c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi        final Surface surface = surfaceHolder.getSurface();
5069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (surface == null) {
5079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new RuntimeException("Surface could not be retrieved from Surface holder");
5089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
5099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mFilename != null) {
5119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return mMANativeHelper.renderMediaItemPreviewFrame(surface,
5129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    mFilename,timeMs,mWidth,mHeight);
513c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi        } else {
5149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return 0;
5159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
5169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
5179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
5209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * This API allows to generate a file containing the sample volume levels of
5219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * the Audio track of this media item. This function may take significant
5229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * time and is blocking. The file can be retrieved using
5239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * getAudioWaveformFilename().
5249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param listener The progress listener
5269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IOException if the output file cannot be created
5289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalArgumentException if the mediaItem does not have a valid
5299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *             Audio track
5309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
5319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void extractAudioWaveform(ExtractAudioWaveformProgressListener listener)
532c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi        throws IOException {
5339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        int frameDuration = 0;
5349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        int sampleCount = 0;
5359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        final String projectPath = mMANativeHelper.getProjectPath();
5369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        /**
5379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         *  Waveform file does not exist
5389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         */
5399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mAudioWaveformFilename == null ) {
5409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /**
5419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * Since audioWaveformFilename will not be supplied,it is  generated
5429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
5439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            String mAudioWaveFileName = null;
5449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mAudioWaveFileName =
5469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                String.format(projectPath + "/" + "audioWaveformFile-"+ getId() + ".dat");
5479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /**
5489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * Logic to get frame duration = (no. of frames per sample * 1000)/
5499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * sampling frequency
5509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
551c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            if (mMANativeHelper.getAudioCodecType(mAudioType) ==
5529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                MediaProperties.ACODEC_AMRNB ) {
5539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                frameDuration = (MediaProperties.SAMPLES_PER_FRAME_AMRNB*1000)/
5549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                MediaProperties.DEFAULT_SAMPLING_FREQUENCY;
5559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                sampleCount = MediaProperties.SAMPLES_PER_FRAME_AMRNB;
556c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            } else if (mMANativeHelper.getAudioCodecType(mAudioType) ==
5579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                MediaProperties.ACODEC_AMRWB ) {
5589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                frameDuration = (MediaProperties.SAMPLES_PER_FRAME_AMRWB * 1000)/
5599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                MediaProperties.DEFAULT_SAMPLING_FREQUENCY;
5609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                sampleCount = MediaProperties.SAMPLES_PER_FRAME_AMRWB;
561c4edeb5a60a45af874474ae7244c921a268430f1Gil Dobjanschi            } else if (mMANativeHelper.getAudioCodecType(mAudioType) ==
5629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                MediaProperties.ACODEC_AAC_LC ) {
5639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                frameDuration = (MediaProperties.SAMPLES_PER_FRAME_AAC * 1000)/
5649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                MediaProperties.DEFAULT_SAMPLING_FREQUENCY;
5659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                sampleCount = MediaProperties.SAMPLES_PER_FRAME_AAC;
5669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
5679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mMANativeHelper.generateAudioGraph( getId(),
5699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    mFilename,
5709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    mAudioWaveFileName,
5719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    frameDuration,
5729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    MediaProperties.DEFAULT_CHANNEL_COUNT,
5739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    sampleCount,
5749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    listener,
5759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    true);
5769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /**
5779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * Record the generated file name
5789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
5799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mAudioWaveformFilename = mAudioWaveFileName;
5809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
5819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mWaveformData =
5829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            new SoftReference<WaveformData>(new WaveformData(mAudioWaveformFilename));
5839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
5849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
5869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the audio waveform file name if {@link #extractAudioWaveform()} was
5879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * successful. The file format is as following:
5889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * <ul>
5899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  <li>first 4 bytes provide the number of samples for each value, as big-endian signed</li>
5909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  <li>4 following bytes is the total number of values in the file, as big-endian signed</li>
5919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  <li>all values follow as bytes Name is unique.</li>
5929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *</ul>
5939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return the name of the file, null if the file has not been computed or
5949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         if there is no Audio track in the mediaItem
5959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
5969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    String getAudioWaveformFilename() {
5979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mAudioWaveformFilename;
5989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
5999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Invalidate the AudioWaveform File
6029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void invalidate() {
6049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mAudioWaveformFilename != null) {
6059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            new File(mAudioWaveformFilename).delete();
6069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mAudioWaveformFilename = null;
6079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The waveform data
6129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public WaveformData getWaveformData() throws IOException {
6149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mWaveformData == null) {
6159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return null;
6169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        WaveformData waveformData = mWaveformData.get();
6199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (waveformData != null) {
6209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return waveformData;
6219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else if (mAudioWaveformFilename != null) {
6229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            try {
6239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                waveformData = new WaveformData(mAudioWaveformFilename);
6249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            } catch(IOException e) {
6259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                throw e;
6269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
6279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mWaveformData = new SoftReference<WaveformData>(waveformData);
6289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return waveformData;
6299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else {
6309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return null;
6319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Set volume of the Audio track of this mediaItem
6369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
6379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param volumePercent in %/. 100% means no change; 50% means half value, 200%
6389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *            means double, 0% means silent.
6399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws UsupportedOperationException if volume value is not supported
6409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void setVolume(int volumePercent) {
6429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if ((volumePercent <0) || (volumePercent >100)) {
6439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Invalid volume");
6449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mVolumePercentage = volumePercent;
6479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the volume value of the audio track as percentage. Call of this
6519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * method before calling setVolume will always return 100%
6529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
6539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return the volume in percentage
6549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getVolume() {
6569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mVolumePercentage;
6579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param muted true to mute the media item
6619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void setMute(boolean muted) {
6632bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        mMANativeHelper.setGeneratePreview(true);
6649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mMuted = muted;
6659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mBeginTransition != null) {
6669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mBeginTransition.invalidate();
6679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mEndTransition != null) {
6699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mEndTransition.invalidate();
6709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return true if the media item is muted
6759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public boolean isMuted() {
6779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mMuted;
6789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The video type
6829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getVideoType() {
6849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mVideoType;
6859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The video profile
6899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getVideoProfile() {
6919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mVideoProfile;
6929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6953ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury     * @return The video profile
6963ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury     */
6973ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury    public int getVideoLevel() {
6983ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury        return mVideoLevel;
6993ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury    }
7003ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury
7013ced044154945f9d60983032278e00fe28f4ab1bRajneesh Chowdury    /**
7029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The video bitrate
7039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
7049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getVideoBitrate() {
7059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mVideoBitrate;
7069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
7079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
7099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The audio bitrate
7109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
7119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getAudioBitrate() {
7129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mAudioBitrate;
7139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
7149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
7169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The number of frames per second
7179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
7189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getFps() {
7199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mFps;
7209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
7219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
7239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The audio codec
7249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
7259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getAudioType() {
7269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mAudioType;
7279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
7289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
7309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The number of audio channels
7319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
7329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getAudioChannels() {
7339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mAudioChannels;
7349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
7359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
7379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The audio sample frequency
7389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
7399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getAudioSamplingFrequency() {
7409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mAudioSamplingFrequency;
7419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
7429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
7449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The Video media item properties in ClipSettings class object
7459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@link android.media.videoeditor.MediaArtistNativeHelper.ClipSettings}
7469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
7479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    ClipSettings getVideoClipProperties() {
7489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        ClipSettings clipSettings = new ClipSettings();
7499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.clipPath = getFilename();
7509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.fileType = mMANativeHelper.getMediaItemFileType(getFileType());
7519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.beginCutTime = (int)getBoundaryBeginTime();
7529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.endCutTime = (int)getBoundaryEndTime();
7539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        clipSettings.mediaRendering = mMANativeHelper.getMediaItemRenderingMode(getRenderingMode());
754c847b1a89df94dbff4c2f557f8c042ead5398c3fRajneesh Chowdury        clipSettings.rotationDegree = mVideoRotationDegree;
7559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
7569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return clipSettings;
7579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
7589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava}
759