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