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
17package com.android.mediaframeworktest.functional.videoeditor;
18
19import java.io.File;
20
21import android.graphics.Bitmap;
22import android.graphics.Rect;
23import android.media.videoeditor.AudioTrack;
24import android.media.videoeditor.EffectColor;
25import android.media.videoeditor.EffectKenBurns;
26import android.media.videoeditor.MediaImageItem;
27import android.media.videoeditor.MediaItem;
28import android.media.videoeditor.MediaProperties;
29import android.media.videoeditor.MediaVideoItem;
30import android.media.videoeditor.OverlayFrame;
31import android.media.videoeditor.Transition;
32import android.media.videoeditor.TransitionAlpha;
33import android.media.videoeditor.TransitionCrossfade;
34import android.media.videoeditor.TransitionFadeBlack;
35import android.media.videoeditor.TransitionSliding;
36import android.media.videoeditor.VideoEditor;
37import android.media.videoeditor.VideoEditor.ExportProgressListener;
38import android.media.videoeditor.VideoEditor.MediaProcessingProgressListener;
39import android.os.Environment;
40import android.test.ActivityInstrumentationTestCase;
41
42
43import android.util.Log;
44
45import com.android.mediaframeworktest.MediaFrameworkTest;
46import android.test.suitebuilder.annotation.LargeTest;
47import android.test.suitebuilder.annotation.Suppress;
48import com.android.mediaframeworktest.VideoEditorHelper;
49
50public 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