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