Home | History | Annotate | Download | only in videoeditor
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.mediaframeworktest.functional.videoeditor;
     18 
     19 import java.io.File;
     20 
     21 import android.graphics.Bitmap;
     22 import android.graphics.Rect;
     23 import android.media.videoeditor.AudioTrack;
     24 import android.media.videoeditor.EffectColor;
     25 import android.media.videoeditor.EffectKenBurns;
     26 import android.media.videoeditor.MediaImageItem;
     27 import android.media.videoeditor.MediaItem;
     28 import android.media.videoeditor.MediaProperties;
     29 import android.media.videoeditor.MediaVideoItem;
     30 import android.media.videoeditor.OverlayFrame;
     31 import android.media.videoeditor.Transition;
     32 import android.media.videoeditor.TransitionAlpha;
     33 import android.media.videoeditor.TransitionCrossfade;
     34 import android.media.videoeditor.TransitionFadeBlack;
     35 import android.media.videoeditor.TransitionSliding;
     36 import android.media.videoeditor.VideoEditor;
     37 import android.media.videoeditor.VideoEditor.ExportProgressListener;
     38 import android.media.videoeditor.VideoEditor.MediaProcessingProgressListener;
     39 import android.os.Environment;
     40 import android.test.ActivityInstrumentationTestCase;
     41 
     42 
     43 import android.util.Log;
     44 
     45 import com.android.mediaframeworktest.MediaFrameworkTest;
     46 import android.test.suitebuilder.annotation.LargeTest;
     47 import android.test.suitebuilder.annotation.Suppress;
     48 import com.android.mediaframeworktest.VideoEditorHelper;
     49 
     50 public class VideoEditorExportTest extends
     51     ActivityInstrumentationTestCase<MediaFrameworkTest> {
     52     private final String TAG = "TransitionTest";
     53 
     54     private final String PROJECT_LOCATION = VideoEditorHelper.PROJECT_LOCATION_COMMON;
     55 
     56     private final String INPUT_FILE_PATH = VideoEditorHelper.INPUT_FILE_PATH_COMMON;
     57 
     58     private VideoEditor mVideoEditor;
     59 
     60     private VideoEditorHelper mVideoEditorHelper;
     61 
     62     // Declares the annotation for Preview Test Cases
     63     public @interface TransitionTests {
     64     }
     65 
     66     public VideoEditorExportTest() {
     67         super("com.android.mediaframeworktest", MediaFrameworkTest.class);
     68     }
     69 
     70     @Override
     71     protected void setUp() throws Exception {
     72         // setup for each test case.
     73         super.setUp();
     74         mVideoEditorHelper = new VideoEditorHelper();
     75         // Create a random String which will be used as project path, where all
     76         // project related files will be stored.
     77         final String projectPath =
     78             mVideoEditorHelper.createRandomFile(PROJECT_LOCATION);
     79         mVideoEditor = mVideoEditorHelper.createVideoEditor(projectPath);
     80     }
     81 
     82     @Override
     83     protected void tearDown() throws Exception {
     84         mVideoEditorHelper.destroyVideoEditor(mVideoEditor);
     85         // Clean the directory created as project path
     86         mVideoEditorHelper.deleteProject(new File(mVideoEditor.getPath()));
     87         System.gc();
     88         super.tearDown();
     89     }
     90 
     91     /**
     92      * To Test export : Merge and Trim different types of Video and Image files
     93      */
     94     @LargeTest
     95     public void testExportMergeTrim() throws Exception {
     96         final String videoItemFilename1 = INPUT_FILE_PATH
     97             + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_0_26.3gp";
     98         final String imageItemFilename1 = INPUT_FILE_PATH + "IMG_1600x1200.jpg";
     99         final String videoItemFilename2 = INPUT_FILE_PATH
    100             + "H264_BP_640x480_12.5fps_256kbps_AACLC_16khz_24kbps_s_0_26.mp4";
    101         final String videoItemFilename3 = INPUT_FILE_PATH
    102             + "MPEG4_SP_720x480_30fps_280kbps_AACLC_48kHz_96kbps_s_0_21.mp4";
    103         final String imageItemFilename2 = INPUT_FILE_PATH + "IMG_176x144.jpg";
    104         final String imageItemFilename3 = INPUT_FILE_PATH + "IMG_640x480.jpg";
    105         final String outFilename = mVideoEditorHelper
    106             .createRandomFile(mVideoEditor.getPath() + "/")
    107             + ".3gp";
    108 
    109         final MediaVideoItem mediaVideoItem1 =
    110             mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
    111                 videoItemFilename1, MediaItem.RENDERING_MODE_BLACK_BORDER);
    112         mediaVideoItem1.setExtractBoundaries(2000, 7000);
    113         mVideoEditor.addMediaItem(mediaVideoItem1);
    114 
    115         final MediaImageItem mediaImageItem2 =
    116             mVideoEditorHelper.createMediaItem(mVideoEditor, "m2",
    117                 imageItemFilename1, 3000, MediaItem.RENDERING_MODE_BLACK_BORDER);
    118         mVideoEditor.addMediaItem(mediaImageItem2);
    119 
    120         final MediaVideoItem mediaVideoItem3 =
    121             mVideoEditorHelper.createMediaItem(mVideoEditor, "m3",
    122                 videoItemFilename2, MediaItem.RENDERING_MODE_BLACK_BORDER);
    123         mediaVideoItem3.setExtractBoundaries(0, 2000);
    124         mVideoEditor.addMediaItem(mediaVideoItem3);
    125 
    126         final MediaVideoItem mediaVideoItem4 =
    127             mVideoEditorHelper.createMediaItem(mVideoEditor, "m4",
    128                 videoItemFilename3, MediaItem.RENDERING_MODE_BLACK_BORDER);
    129         mediaVideoItem4.setExtractBoundaries(mediaVideoItem4.getDuration()-5000,
    130             mediaVideoItem4.getDuration());
    131         mVideoEditor.addMediaItem(mediaVideoItem4);
    132 
    133         final MediaImageItem mediaImageItem5 =
    134             mVideoEditorHelper.createMediaItem(mVideoEditor, "m5",
    135                 imageItemFilename2, 4000, MediaItem.RENDERING_MODE_BLACK_BORDER);
    136         mVideoEditor.addMediaItem(mediaImageItem5);
    137 
    138         final MediaImageItem mediaImageItem6 =
    139             mVideoEditorHelper.createMediaItem(mVideoEditor, "m6",
    140                 imageItemFilename3, 2000, MediaItem.RENDERING_MODE_BLACK_BORDER);
    141         mVideoEditor.addMediaItem(mediaImageItem6);
    142 
    143         mVideoEditor.generatePreview(new MediaProcessingProgressListener() {
    144             public void onProgress(Object item, int action, int progress) {
    145             }
    146         });
    147 
    148         try {
    149             final int[] progressUpdate = new int[100];
    150             mVideoEditor.export(outFilename, MediaProperties.HEIGHT_720,
    151                 MediaProperties.BITRATE_800K, new ExportProgressListener() {
    152                     int i = 0;
    153                     public void onProgress(VideoEditor ve, String outFileName,
    154                         int progress) {
    155                             progressUpdate[i++] = progress;
    156                     }
    157                 });
    158             mVideoEditorHelper.checkProgressCBValues(progressUpdate);
    159         } catch (Exception e) {
    160             assertTrue("Error in Export" + e.toString(), false);
    161         }
    162         final long storyBoardDuration = mediaVideoItem1.getTimelineDuration()
    163             + mediaImageItem2.getDuration() + mediaVideoItem3.getTimelineDuration()
    164             + mediaVideoItem4.getTimelineDuration() + mediaImageItem5.getDuration()
    165             + mediaImageItem6.getDuration();
    166         mVideoEditorHelper.validateExport(mVideoEditor, outFilename,
    167             MediaProperties.HEIGHT_720, 0, storyBoardDuration,
    168             MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC);
    169         mVideoEditorHelper.checkDeleteExistingFile(outFilename);
    170     }
    171 
    172     /**
    173      *To Test export : With Effect and Overlays on Different Media Items
    174      */
    175     @LargeTest
    176     public void testExportEffectOverlay() throws Exception {
    177           final String videoItemFilename1 = INPUT_FILE_PATH
    178             + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_0_26.3gp";
    179         final String imageItemFilename1 = INPUT_FILE_PATH + "IMG_1600x1200.jpg";
    180         final String videoItemFilename2 = INPUT_FILE_PATH
    181               + "H264_BP_640x480_15fps_1200Kbps_AACLC_48KHz_64kps_m_0_27.3gp";
    182         final String videoItemFilename3 = INPUT_FILE_PATH
    183             + "MPEG4_SP_720x480_30fps_280kbps_AACLC_48kHz_96kbps_s_0_21.mp4";
    184         final String imageItemFilename2 = INPUT_FILE_PATH + "IMG_176x144.jpg";
    185         final String imageItemFilename3 = INPUT_FILE_PATH + "IMG_640x480.jpg";
    186         final String outFilename = mVideoEditorHelper
    187             .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp";
    188 
    189         final String overlayFile = INPUT_FILE_PATH + "IMG_640x480_Overlay1.png";
    190 
    191         final MediaVideoItem mediaVideoItem1 =
    192             mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
    193                 videoItemFilename1, MediaItem.RENDERING_MODE_BLACK_BORDER);
    194         mediaVideoItem1.setExtractBoundaries(2000, 7000);
    195         mVideoEditor.addMediaItem(mediaVideoItem1);
    196 
    197         final EffectColor effectPink =
    198             mVideoEditorHelper.createEffectItem(mediaVideoItem1, "effectPink",
    199                 0, 2000, EffectColor.TYPE_COLOR, EffectColor.PINK);
    200         mediaVideoItem1.addEffect(effectPink);
    201 
    202         final EffectColor effectNegative =
    203             mVideoEditorHelper.createEffectItem(mediaVideoItem1, "effectNegative",
    204                 3000, 4000, EffectColor.TYPE_NEGATIVE, 0);
    205         mediaVideoItem1.addEffect(effectNegative);
    206 
    207         final MediaImageItem mediaImageItem2 =
    208             mVideoEditorHelper.createMediaItem(mVideoEditor, "m2",
    209                 imageItemFilename1, 3000, MediaItem.RENDERING_MODE_BLACK_BORDER);
    210         mVideoEditor.addMediaItem(mediaImageItem2);
    211 
    212         final EffectColor effectFifties =
    213             mVideoEditorHelper.createEffectItem(mediaImageItem2, "effectFifties",
    214                 0, 3000, EffectColor.TYPE_FIFTIES, 0);
    215         mediaImageItem2.addEffect(effectFifties);
    216 
    217         final MediaVideoItem mediaVideoItem3 =
    218             mVideoEditorHelper.createMediaItem(mVideoEditor, "m3",
    219                 videoItemFilename2, MediaItem.RENDERING_MODE_BLACK_BORDER);
    220         mVideoEditor.addMediaItem(mediaVideoItem3);
    221         mediaVideoItem3.setExtractBoundaries(0, 8000);
    222 
    223         final Bitmap mBitmap =  mVideoEditorHelper.getBitmap(overlayFile,
    224             640, 480);
    225         final OverlayFrame overlayFrame =
    226             mVideoEditorHelper.createOverlay(mediaVideoItem3, "overlay",
    227                 mBitmap, 2000, 5000);
    228         mediaVideoItem3.addOverlay(overlayFrame);
    229 
    230         final EffectColor effectGreen =
    231             mVideoEditorHelper.createEffectItem(mediaVideoItem3, "effectGreen",
    232                 0, 2000, EffectColor.TYPE_COLOR, EffectColor.GREEN);
    233         mediaVideoItem3.addEffect(effectGreen);
    234 
    235         final MediaVideoItem mediaVideoItem4 =
    236             mVideoEditorHelper.createMediaItem(mVideoEditor, "m4",
    237                 videoItemFilename3, MediaItem.RENDERING_MODE_BLACK_BORDER);
    238         mediaVideoItem4.setExtractBoundaries(mediaVideoItem4.getDuration()-5000,
    239             mediaVideoItem4.getDuration());
    240         mVideoEditor.addMediaItem(mediaVideoItem4);
    241 
    242         final EffectColor effectSepia =
    243             mVideoEditorHelper.createEffectItem(mediaVideoItem4, "effectSepia",
    244                 0, 2000, EffectColor.TYPE_SEPIA, 0);
    245         mediaVideoItem4.addEffect(effectSepia);
    246 
    247         final MediaImageItem mediaImageItem5 =
    248             mVideoEditorHelper.createMediaItem(mVideoEditor, "m5",
    249                 imageItemFilename2, 4000, MediaItem.RENDERING_MODE_BLACK_BORDER);
    250         mVideoEditor.addMediaItem(mediaImageItem5);
    251 
    252         final EffectColor effectGray =
    253             mVideoEditorHelper.createEffectItem(mediaImageItem5, "effectGray",
    254                 0, 2000, EffectColor.TYPE_COLOR, EffectColor.GRAY);
    255         mediaImageItem5.addEffect(effectGray);
    256 
    257         final MediaImageItem mediaImageItem6 =
    258             mVideoEditorHelper.createMediaItem(mVideoEditor, "m6",
    259                 imageItemFilename3, 2000, MediaItem.RENDERING_MODE_BLACK_BORDER);
    260         mVideoEditor.addMediaItem(mediaImageItem6);
    261 
    262         final EffectColor effectGradient =
    263             mVideoEditorHelper.createEffectItem(mediaImageItem6,
    264                 "effectGradient", 0, 2000, EffectColor.TYPE_GRADIENT,
    265                 EffectColor.PINK);
    266         mediaImageItem6.addEffect(effectGradient);
    267 
    268         mVideoEditor.generatePreview(new MediaProcessingProgressListener() {
    269             public void onProgress(Object item, int action, int progress) {
    270             }
    271         });
    272 
    273         try {
    274             final int[] progressUpdate = new int[100];
    275             mVideoEditor.export(outFilename, MediaProperties.HEIGHT_720,
    276                 MediaProperties.BITRATE_800K, new ExportProgressListener() {
    277                     int i = 0;
    278                     public void onProgress(VideoEditor ve, String outFileName,
    279                         int progress) {
    280                             progressUpdate[i++] = progress;
    281                     }
    282                 });
    283             mVideoEditorHelper.checkProgressCBValues(progressUpdate);
    284         } catch (Exception e) {
    285             assertTrue("Error in Export" + e.toString(), false);
    286         }
    287         final long storyBoardDuration = mediaVideoItem1.getTimelineDuration()
    288             + mediaImageItem2.getDuration()
    289             + mediaVideoItem3.getTimelineDuration()
    290             + mediaVideoItem4.getTimelineDuration()
    291             + mediaImageItem5.getDuration()
    292             + mediaImageItem6.getDuration();
    293         mVideoEditorHelper.validateExport(mVideoEditor, outFilename,
    294             MediaProperties.HEIGHT_720, 0, storyBoardDuration,
    295             MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC);
    296         mVideoEditorHelper.checkDeleteExistingFile(outFilename);
    297     }
    298 
    299     /**
    300      * To test export : with Image with KenBurnEffect
    301      */
    302     @LargeTest
    303     public void testExportEffectKenBurn() throws Exception {
    304         final String imageItemFileName = INPUT_FILE_PATH + "IMG_640x480.jpg";
    305         final int imageItemRenderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
    306         final String outFilename = mVideoEditorHelper
    307             .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp";
    308 
    309         final MediaImageItem mediaImageItem =
    310             mVideoEditorHelper.createMediaItem(mVideoEditor, "mediaImageItem1",
    311                 imageItemFileName, 5000, imageItemRenderingMode);
    312         mVideoEditor.addMediaItem(mediaImageItem);
    313 
    314         final Rect startRect = new Rect((mediaImageItem.getHeight() / 3),
    315             (mediaImageItem.getWidth() / 3), (mediaImageItem.getHeight() / 2),
    316             (mediaImageItem.getWidth() / 2));
    317 
    318         final Rect endRect = new Rect(0, 0, mediaImageItem.getWidth(),
    319             mediaImageItem.getHeight());
    320 
    321         final EffectKenBurns kbEffectOnMediaItem = new EffectKenBurns(
    322             mediaImageItem, "KBOnM2", startRect, endRect, 500, 3000);
    323         assertNotNull("EffectKenBurns", kbEffectOnMediaItem);
    324         mediaImageItem.addEffect(kbEffectOnMediaItem);
    325 
    326         assertEquals("KenBurn Start Rect", startRect,
    327             kbEffectOnMediaItem.getStartRect());
    328         assertEquals("KenBurn End Rect", endRect,
    329             kbEffectOnMediaItem.getEndRect());
    330 
    331         mVideoEditor.generatePreview(new MediaProcessingProgressListener() {
    332             public void onProgress(Object item, int action, int progress) {
    333             }
    334         });
    335 
    336         try {
    337             final int[] progressUpdate = new int[100];
    338             mVideoEditor.export(outFilename, MediaProperties.HEIGHT_720,
    339                 MediaProperties.BITRATE_800K, new ExportProgressListener() {
    340                     int i = 0;
    341                     public void onProgress(VideoEditor ve, String outFileName,
    342                         int progress) {
    343                             progressUpdate[i++] = progress;
    344                     }
    345                 });
    346             mVideoEditorHelper.checkProgressCBValues(progressUpdate);
    347         } catch (Exception e) {
    348             assertTrue("Error in Export" + e.toString(), false);
    349         }
    350         mVideoEditorHelper.validateExport(mVideoEditor, outFilename,
    351             MediaProperties.HEIGHT_720, 0, mediaImageItem.getDuration(),
    352             MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC);
    353         mVideoEditorHelper.checkDeleteExistingFile(outFilename);
    354     }
    355 
    356     /**
    357      * To Test Export : With Video and Image and An Audio BackGround Track
    358      */
    359     @LargeTest
    360     public void testExportAudio() throws Exception {
    361         final String videoItemFileName = INPUT_FILE_PATH
    362             + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_0_26.3gp";
    363         final String imageItemFileName = INPUT_FILE_PATH + "IMG_1600x1200.jpg";
    364         final String outFilename = mVideoEditorHelper
    365             .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp";
    366         final String audioTrackFilename = INPUT_FILE_PATH +
    367             "AMRNB_8KHz_12.2Kbps_m_1_17.3gp";
    368 
    369         final MediaVideoItem mediaVideoItem =
    370             mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
    371                 videoItemFileName, MediaItem.RENDERING_MODE_BLACK_BORDER);
    372         mediaVideoItem.setExtractBoundaries(0, 10000);
    373         mVideoEditor.addMediaItem(mediaVideoItem);
    374 
    375         final MediaImageItem mediaImageItem =
    376             mVideoEditorHelper.createMediaItem(mVideoEditor, "m2",
    377                 imageItemFileName, 5000, MediaItem.RENDERING_MODE_BLACK_BORDER);
    378         mVideoEditor.addMediaItem(mediaImageItem);
    379 
    380         final AudioTrack audioTrack = mVideoEditorHelper.createAudio(
    381             mVideoEditor, "a1", audioTrackFilename);
    382         audioTrack.setExtractBoundaries(2000, 5000);
    383         mVideoEditor.addAudioTrack(audioTrack);
    384 
    385         audioTrack.disableDucking();
    386         audioTrack.enableLoop();
    387         audioTrack.setVolume(75);
    388 
    389         mVideoEditor.generatePreview(new MediaProcessingProgressListener() {
    390             public void onProgress(Object item, int action, int progress) {
    391             }
    392         });
    393 
    394         try {
    395             final int[] progressUpdate = new int[100];
    396             mVideoEditor.export(outFilename, MediaProperties.HEIGHT_720,
    397                 MediaProperties.BITRATE_800K, new ExportProgressListener() {
    398                     int i = 0;
    399                     public void onProgress(VideoEditor ve, String outFileName,
    400                         int progress) {
    401                             progressUpdate[i++] = progress;
    402                     }
    403                 });
    404             mVideoEditorHelper.checkProgressCBValues(progressUpdate);
    405         } catch (Exception e) {
    406             assertTrue("Error in Export" + e.toString(), false);
    407         }
    408         mVideoEditorHelper.validateExport(mVideoEditor, outFilename,
    409             MediaProperties.HEIGHT_720, 0, (mediaVideoItem.getTimelineDuration() +
    410             mediaImageItem.getDuration()),
    411             MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC);
    412 
    413         mVideoEditorHelper.checkDeleteExistingFile(outFilename);
    414     }
    415 
    416     /**
    417      *To Test export : With Transition on Different Media Items
    418      */
    419     @LargeTest
    420     public void testExportTransition() throws Exception {
    421         final String videoItemFilename1 = INPUT_FILE_PATH
    422             + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_0_26.3gp";
    423         final String imageItemFilename1 = INPUT_FILE_PATH + "IMG_1600x1200.jpg";
    424         final String videoItemFilename2 = INPUT_FILE_PATH
    425             + "H264_BP_640x480_12.5fps_256kbps_AACLC_16khz_24kbps_s_0_26.mp4";
    426         final String videoItemFilename3 = INPUT_FILE_PATH +
    427             "MPEG4_SP_720x480_30fps_280kbps_AACLC_48kHz_96kbps_s_0_21.mp4";
    428 
    429         final String imageItemFilename2 = INPUT_FILE_PATH + "IMG_176x144.jpg";
    430         final String imageItemFilename3 = INPUT_FILE_PATH + "IMG_640x480.jpg";
    431         final String outFilename = mVideoEditorHelper
    432             .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp";
    433         final String maskFilename = INPUT_FILE_PATH +
    434             "TransitionSpiral_QVGA.jpg";
    435 
    436         final MediaVideoItem mediaItem1 =
    437             mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
    438                 videoItemFilename1, MediaItem.RENDERING_MODE_BLACK_BORDER);
    439         mediaItem1.setExtractBoundaries(2000, 7000);
    440         mVideoEditor.addMediaItem(mediaItem1);
    441 
    442         final TransitionAlpha transition1 =
    443             mVideoEditorHelper.createTAlpha("transition1", null, mediaItem1,
    444                 2000, Transition.BEHAVIOR_LINEAR, maskFilename, 50, true);
    445         mVideoEditor.addTransition(transition1);
    446 
    447         final MediaImageItem mediaItem2 =
    448             mVideoEditorHelper.createMediaItem(mVideoEditor, "m2",
    449                 imageItemFilename1, 8000, MediaItem.RENDERING_MODE_BLACK_BORDER);
    450         mVideoEditor.addMediaItem(mediaItem2);
    451 
    452         final MediaVideoItem mediaItem3 =
    453             mVideoEditorHelper.createMediaItem(mVideoEditor, "m3",
    454                 videoItemFilename2, MediaItem.RENDERING_MODE_BLACK_BORDER);
    455         mediaItem3.setExtractBoundaries(0, 8000);
    456         mVideoEditor.addMediaItem(mediaItem3);
    457 
    458         final TransitionSliding transition2And3 =
    459             mVideoEditorHelper.createTSliding("transition2", mediaItem2,
    460                 mediaItem3, 4000, Transition.BEHAVIOR_MIDDLE_FAST,
    461                 TransitionSliding.DIRECTION_RIGHT_OUT_LEFT_IN);
    462         mVideoEditor.addTransition(transition2And3);
    463 
    464         final MediaVideoItem mediaItem4 =
    465             mVideoEditorHelper.createMediaItem(mVideoEditor, "m4",
    466                 videoItemFilename3, MediaItem.RENDERING_MODE_BLACK_BORDER);
    467         mVideoEditor.addMediaItem(mediaItem4);
    468         mediaItem4.setExtractBoundaries(0, 8000);
    469 
    470         final TransitionCrossfade transition3And4 =
    471             mVideoEditorHelper.createTCrossFade("transition3", mediaItem3,
    472                 mediaItem4, 3500, Transition.BEHAVIOR_MIDDLE_SLOW);
    473         mVideoEditor.addTransition(transition3And4);
    474 
    475         final MediaImageItem mediaItem5 =
    476             mVideoEditorHelper.createMediaItem(mVideoEditor, "m5",
    477                 imageItemFilename2, 7000, MediaItem.RENDERING_MODE_BLACK_BORDER);
    478         mVideoEditor.addMediaItem(mediaItem5);
    479 
    480         final TransitionFadeBlack transition4And5 =
    481             mVideoEditorHelper.createTFadeBlack("transition4", mediaItem4,
    482                 mediaItem5, 3500, Transition.BEHAVIOR_SPEED_DOWN);
    483         mVideoEditor.addTransition(transition4And5);
    484 
    485         final MediaImageItem mediaItem6 =
    486             mVideoEditorHelper.createMediaItem(mVideoEditor, "m6",
    487                 imageItemFilename3, 3000, MediaItem.RENDERING_MODE_BLACK_BORDER);
    488         mVideoEditor.addMediaItem(mediaItem6);
    489 
    490         final TransitionSliding transition5And6 =
    491             mVideoEditorHelper.createTSliding("transition5", mediaItem5,
    492                 mediaItem6, 1000/*4000*/, Transition.BEHAVIOR_SPEED_UP,
    493                 TransitionSliding.DIRECTION_LEFT_OUT_RIGHT_IN);
    494         mVideoEditor.addTransition(transition5And6);
    495 
    496         final TransitionSliding transition6 =
    497             mVideoEditorHelper.createTSliding("transition6", mediaItem6, null,
    498                 1000 /*4000*/, Transition.BEHAVIOR_SPEED_UP,
    499                 TransitionSliding.DIRECTION_TOP_OUT_BOTTOM_IN);
    500         mVideoEditor.addTransition(transition6);
    501 
    502         mVideoEditor.generatePreview(new MediaProcessingProgressListener() {
    503             public void onProgress(Object item, int action, int progress) {
    504             }
    505         });
    506 
    507         try {
    508             final int[] progressUpdate = new int[100];
    509             mVideoEditor.export(outFilename, MediaProperties.HEIGHT_720,
    510                 MediaProperties.BITRATE_800K, new ExportProgressListener() {
    511                     int i = 0;
    512                     public void onProgress(VideoEditor ve, String outFileName,
    513                         int progress) {
    514                             progressUpdate[i++] = progress;
    515                     }
    516                 });
    517             mVideoEditorHelper.checkProgressCBValues(progressUpdate);
    518         } catch (Exception e) {
    519             assertTrue("Error in Export" + e.toString(), false);
    520         }
    521         final long storyBoardDuration = mediaItem1.getTimelineDuration()
    522             + mediaItem2.getTimelineDuration()
    523             + mediaItem3.getTimelineDuration() - transition2And3.getDuration()
    524             + mediaItem4.getTimelineDuration() - transition3And4.getDuration()
    525             + mediaItem5.getTimelineDuration() - transition4And5.getDuration()
    526             + mediaItem6.getTimelineDuration() - transition5And6.getDuration();
    527         mVideoEditorHelper.validateExport(mVideoEditor, outFilename,
    528             MediaProperties.HEIGHT_720, 0, storyBoardDuration,
    529             MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC);
    530         mVideoEditorHelper.checkDeleteExistingFile(outFilename);
    531     }
    532 
    533     /**
    534      * To Test Export : Without any Media Items in the story Board
    535      *
    536      * @throws Exception
    537      */
    538     @LargeTest
    539     public void testExportWithoutMediaItems() throws Exception {
    540         boolean flagForException = false;
    541         try {
    542             final int[] progressUpdate = new int[100];
    543             mVideoEditor.export("/sdcard/Test.3gp", MediaProperties.HEIGHT_720,
    544                 MediaProperties.BITRATE_800K, new ExportProgressListener() {
    545                     int i = 0;
    546                     public void onProgress(VideoEditor ve, String outFileName,
    547                         int progress) {
    548                             progressUpdate[i++] = progress;
    549                     }
    550                 });
    551             mVideoEditorHelper.checkProgressCBValues(progressUpdate);
    552         } catch (IllegalStateException e) {
    553             flagForException = true;
    554         }
    555         assertTrue("Export without any MediaItems", flagForException);
    556     }
    557 
    558     /**
    559      * To Test Export : With Media Items add and removed in the story Board
    560      *
    561      * @throws Exception
    562      */
    563     @LargeTest
    564     public void testExportWithoutMediaItemsAddRemove() throws Exception {
    565         final String videoItemFilename1 = INPUT_FILE_PATH +
    566             "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_1_17.3gp";
    567         final String imageItemFilename1 = INPUT_FILE_PATH + "IMG_640x480.jpg";
    568         final String maskFilename = INPUT_FILE_PATH + "TransitionSpiral_QVGA.jpg";
    569         boolean flagForException = false;
    570 
    571         final MediaVideoItem mediaItem1 =
    572             mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
    573                 videoItemFilename1, MediaItem.RENDERING_MODE_BLACK_BORDER);
    574         mediaItem1.setExtractBoundaries(0, 15000);
    575         mVideoEditor.addMediaItem(mediaItem1);
    576 
    577         final MediaImageItem mediaItem2 =
    578             mVideoEditorHelper.createMediaItem(mVideoEditor, "m2",
    579                 imageItemFilename1, 15000,
    580                 MediaItem.RENDERING_MODE_BLACK_BORDER);
    581         mVideoEditor.addMediaItem(mediaItem2);
    582 
    583         final TransitionAlpha transition1 =
    584             mVideoEditorHelper.createTAlpha("transition1", mediaItem1, mediaItem2,
    585                 3000, Transition.BEHAVIOR_LINEAR, maskFilename, 50, false);
    586         mVideoEditor.addTransition(transition1);
    587 
    588         final EffectColor effectColor =
    589             mVideoEditorHelper.createEffectItem(mediaItem2, "effect", 12000,
    590                 3000, EffectColor.TYPE_COLOR, EffectColor.PINK);
    591         mediaItem2.addEffect(effectColor);
    592 
    593         mVideoEditor.removeMediaItem(mediaItem1.getId());
    594         mVideoEditor.removeMediaItem(mediaItem2.getId());
    595         try {
    596             final int[] progressUpdate = new int[100];
    597             mVideoEditor.export("/sdcard/Test.3gp", MediaProperties.HEIGHT_720,
    598                 MediaProperties.BITRATE_800K, new ExportProgressListener() {
    599                     int i = 0;
    600                     public void onProgress(VideoEditor ve, String outFileName,
    601                         int progress) {
    602                             progressUpdate[i++] = progress;
    603                     }
    604                 });
    605             mVideoEditorHelper.checkProgressCBValues(progressUpdate);
    606         } catch (IllegalStateException e) {
    607             flagForException = true;
    608         }
    609         assertTrue("Export with MediaItem added and removed", flagForException);
    610     }
    611 
    612     /**
    613      * To Test Export : With Video and Image : MMS use case
    614      *
    615      * @throws Exception
    616      */
    617     @LargeTest
    618     public void testExportMMS() throws Exception {
    619         final String videoItemFilename1 = INPUT_FILE_PATH
    620             + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_1_17.3gp";
    621         final String imageItemFilename1 = INPUT_FILE_PATH + "IMG_1600x1200.jpg";
    622         final String videoItemFilename2 = INPUT_FILE_PATH
    623             + "H264_BP_640x480_12.5fps_256kbps_AACLC_16khz_24kbps_s_0_26.mp4";
    624         final String maskFilename = INPUT_FILE_PATH + "TransitionSpiral_QVGA.jpg";
    625         final String outFilename = mVideoEditorHelper
    626             .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp";
    627 
    628         final MediaVideoItem mediaItem1 =
    629             mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
    630                 videoItemFilename1, MediaItem.RENDERING_MODE_BLACK_BORDER);
    631         mediaItem1.setExtractBoundaries(2000, 7000);
    632         mVideoEditor.addMediaItem(mediaItem1);
    633 
    634         final TransitionAlpha transition1 =
    635             mVideoEditorHelper.createTAlpha("transition1", null, mediaItem1,
    636                 2000, Transition.BEHAVIOR_LINEAR, maskFilename, 50, true);
    637         mVideoEditor.addTransition(transition1);
    638 
    639         final MediaImageItem mediaItem2 =
    640             mVideoEditorHelper.createMediaItem(mVideoEditor, "m2",
    641                 imageItemFilename1, 8000, MediaItem.RENDERING_MODE_BLACK_BORDER);
    642         mVideoEditor.addMediaItem(mediaItem2);
    643 
    644         final MediaVideoItem mediaItem3 =
    645             mVideoEditorHelper.createMediaItem(mVideoEditor, "m3",
    646                 videoItemFilename2, MediaItem.RENDERING_MODE_BLACK_BORDER);
    647         mediaItem3.setExtractBoundaries(0, 8000);
    648         mVideoEditor.addMediaItem(mediaItem3);
    649 
    650         final TransitionSliding transition2And3 =
    651             mVideoEditorHelper.createTSliding("transition2", mediaItem2,
    652                 mediaItem3, 4000, Transition.BEHAVIOR_MIDDLE_FAST,
    653                 TransitionSliding.DIRECTION_RIGHT_OUT_LEFT_IN);
    654         mVideoEditor.addTransition(transition2And3);
    655 
    656         final TransitionCrossfade transition3 =
    657             mVideoEditorHelper.createTCrossFade("transition3", mediaItem3, null,
    658                 3500, Transition.BEHAVIOR_MIDDLE_SLOW);
    659         mVideoEditor.addTransition(transition3);
    660 
    661         final EffectColor effectColor =
    662             mVideoEditorHelper.createEffectItem(mediaItem2, "effect", 0,
    663                 3000, EffectColor.TYPE_COLOR, EffectColor.PINK);
    664         mediaItem2.addEffect(effectColor);
    665 
    666         mVideoEditor.setAspectRatio(MediaProperties.ASPECT_RATIO_11_9);
    667 
    668         try {
    669             final int[] progressUpdate = new int[100];
    670             mVideoEditor.export(outFilename, MediaProperties.HEIGHT_144,
    671                 MediaProperties.BITRATE_800K, new ExportProgressListener() {
    672                     int i = 0;
    673                     public void onProgress(VideoEditor ve, String outFileName,
    674                         int progress) {
    675                             progressUpdate[i++] = progress;
    676                     }
    677                 });
    678             mVideoEditorHelper.checkProgressCBValues(progressUpdate);
    679         } catch (Exception e) {
    680             assertTrue("Error in Export" + e.toString(), false);
    681         }
    682         final long storyBoardDuration = mediaItem1.getTimelineDuration()
    683             + mediaItem2.getTimelineDuration() + mediaItem3.getTimelineDuration()
    684             - transition2And3.getDuration();
    685 
    686         mVideoEditorHelper.validateExport(mVideoEditor, outFilename,
    687             MediaProperties.HEIGHT_144, 0, storyBoardDuration,
    688             MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC);
    689          mVideoEditorHelper.checkDeleteExistingFile(outFilename);
    690     }
    691 
    692     /**
    693      * To Test Export :Media Item having duration of 1 Hour
    694      *
    695      * @throws Exception
    696      */
    697     @Suppress
    698     @LargeTest
    699     public void testExportDuration1Hour() throws Exception {
    700         final String videoItemFilename1 = INPUT_FILE_PATH +
    701             "H264_BP_640x480_15fps_384kbps_60_0.mp4";
    702         final String outFilename = mVideoEditorHelper.createRandomFile(
    703             mVideoEditor.getPath() + "/") + ".3gp";
    704 
    705         final MediaVideoItem mediaItem1 =
    706             mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
    707                 videoItemFilename1, MediaItem.RENDERING_MODE_BLACK_BORDER);
    708         mVideoEditor.addMediaItem(mediaItem1);
    709         try {
    710             final int[] progressUpdate = new int[100];
    711             mVideoEditor.export(outFilename, MediaProperties.HEIGHT_144,
    712                 MediaProperties.BITRATE_800K, new ExportProgressListener() {
    713                     int i = 0;
    714                     public void onProgress(VideoEditor ve, String outFileName,
    715                         int progress) {
    716                             progressUpdate[i++] = progress;
    717                     }
    718                 });
    719             mVideoEditorHelper.checkProgressCBValues(progressUpdate);
    720         }catch (Exception e) {
    721             assertTrue("Error in Export" + e.toString(), false);
    722         }
    723         mVideoEditorHelper.validateExport(mVideoEditor, outFilename,
    724             MediaProperties.HEIGHT_720, 0, mediaItem1.getDuration(),
    725             MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC);
    726         mVideoEditorHelper.checkDeleteExistingFile(outFilename);
    727     }
    728 
    729     /**
    730      * To Test Export : Storage location having very less space (Less than 100
    731      * KB)
    732      *
    733      * @throws Exception
    734      */
    735     @LargeTest
    736     public void testExportWithStorageFull() throws Exception {
    737         final String videoItemFilename1 = INPUT_FILE_PATH
    738             + "H264_BP_640x480_12.5fps_256kbps_AACLC_16khz_24kbps_s_0_26.mp4";
    739         final String outFilename = mVideoEditorHelper
    740             .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp";
    741         boolean flagForException = false;
    742 
    743         mVideoEditorHelper.createMediaItem(mVideoEditor, "m1", videoItemFilename1,
    744             MediaItem.RENDERING_MODE_BLACK_BORDER);
    745         try {
    746             final int[] progressUpdate = new int[100];
    747             mVideoEditor.export(outFilename, MediaProperties.HEIGHT_144,
    748                 MediaProperties.BITRATE_800K, new ExportProgressListener() {
    749                     int i = 0;
    750                     public void onProgress(VideoEditor ve, String outFileName,
    751                         int progress) {
    752                             progressUpdate[i++] = progress;
    753                     }
    754                 });
    755             mVideoEditorHelper.checkProgressCBValues(progressUpdate);
    756         } catch (Exception e) {
    757             flagForException = true;
    758         }
    759         assertTrue("Error in exporting file due to lack of storage space",
    760             flagForException);
    761     }
    762 
    763      /**
    764      * To Test Export :Two Media Items added
    765      *
    766      * @throws Exception
    767      */
    768     @LargeTest
    769     public void testExportTwoVideos() throws Exception {
    770         final String videoItemFileName = INPUT_FILE_PATH
    771             + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_1_17.3gp";
    772         final String videoItemFileName1 = INPUT_FILE_PATH +
    773             "H264_BP_640x480_12.5fps_256kbps_AACLC_16khz_24kbps_s_0_26.mp4";
    774         final String outFilename = mVideoEditorHelper
    775             .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp";
    776 
    777         final MediaVideoItem mediaVideoItem =
    778             mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
    779                 videoItemFileName, MediaItem.RENDERING_MODE_BLACK_BORDER);
    780         mVideoEditor.addMediaItem(mediaVideoItem);
    781 
    782         final MediaVideoItem mediaVideoItem1 =
    783             mVideoEditorHelper.createMediaItem(mVideoEditor, "m2",
    784                 videoItemFileName1, MediaItem.RENDERING_MODE_BLACK_BORDER);
    785         mVideoEditor.addMediaItem(mediaVideoItem1);
    786 
    787         mVideoEditor.generatePreview(new MediaProcessingProgressListener() {
    788             public void onProgress(Object item, int action, int progress) {
    789             }
    790         });
    791 
    792         try {
    793             final int[] progressUpdate = new int[100];
    794             mVideoEditor.export(outFilename, MediaProperties.HEIGHT_720,
    795                 MediaProperties.BITRATE_800K, new ExportProgressListener() {
    796                     int i = 0;
    797                     public void onProgress(VideoEditor ve, String outFileName,
    798                         int progress) {
    799                             progressUpdate[i++] = progress;
    800                     }
    801                 });
    802             mVideoEditorHelper.checkProgressCBValues(progressUpdate);
    803         } catch (Exception e) {
    804             assertTrue("Error in Export" + e.toString(), false);
    805         }
    806         mVideoEditorHelper.validateExport(mVideoEditor, outFilename,
    807             MediaProperties.HEIGHT_720, 0,
    808             (mediaVideoItem.getDuration()+ mediaVideoItem1.getDuration()),
    809             MediaProperties.VCODEC_H264, MediaProperties.ACODEC_AAC_LC);
    810         mVideoEditorHelper.checkDeleteExistingFile(outFilename);
    811     }
    812 }
    813