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
18package com.android.mediaframeworktest.performance;
19
20import java.io.BufferedWriter;
21import java.io.File;
22import java.io.FileWriter;
23import java.io.Writer;
24
25import android.graphics.Bitmap;
26import android.graphics.Rect;
27import android.media.videoeditor.AudioTrack;
28import android.media.videoeditor.EffectColor;
29import android.media.videoeditor.EffectKenBurns;
30import android.media.videoeditor.MediaImageItem;
31import android.media.videoeditor.MediaItem;
32import android.media.videoeditor.MediaProperties;
33import android.media.videoeditor.MediaVideoItem;
34import android.media.videoeditor.OverlayFrame;
35import android.media.videoeditor.Transition;
36import android.media.videoeditor.TransitionCrossfade;
37import android.media.videoeditor.TransitionAlpha;
38import android.media.videoeditor.TransitionFadeBlack;
39import android.media.videoeditor.TransitionSliding;
40import android.media.videoeditor.VideoEditor;
41import android.os.Environment;
42import android.test.ActivityInstrumentationTestCase;
43import android.media.videoeditor.VideoEditor.MediaProcessingProgressListener;
44import android.os.Environment;
45import android.os.SystemClock;
46import android.test.ActivityInstrumentationTestCase;
47import android.media.videoeditor.VideoEditor.ExportProgressListener;
48
49import android.util.Log;
50
51import com.android.mediaframeworktest.MediaFrameworkTest;
52import android.test.suitebuilder.annotation.LargeTest;
53import com.android.mediaframeworktest.VideoEditorHelper;
54
55/**
56 * Junit / Instrumentation - performance measurement for media player and
57 * recorder
58 */
59public class VideoEditorPerformance extends
60    ActivityInstrumentationTestCase<MediaFrameworkTest> {
61
62    private final String TAG = "VideoEditorPerformance";
63
64    private final String PROJECT_LOCATION = VideoEditorHelper.PROJECT_LOCATION_COMMON;
65
66    private final String INPUT_FILE_PATH = VideoEditorHelper.INPUT_FILE_PATH_COMMON;
67
68    private final String VIDEOEDITOR_OUTPUT = PROJECT_LOCATION +
69        "VideoEditorPerformance.txt";
70
71    public VideoEditorPerformance() {
72        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
73    }
74
75    private final String PROJECT_CLASS_NAME =
76        "android.media.videoeditor.VideoEditorImpl";
77    private VideoEditor mVideoEditor;
78    private VideoEditorHelper mVideoEditorHelper;
79
80    @Override
81    protected void setUp() throws Exception {
82        // setup for each test case.
83        super.setUp();
84        mVideoEditorHelper = new VideoEditorHelper();
85        // Create a random String which will be used as project path, where all
86        // project related files will be stored.
87        final String projectPath =
88            mVideoEditorHelper.createRandomFile(PROJECT_LOCATION);
89        mVideoEditor = mVideoEditorHelper.createVideoEditor(projectPath);
90    }
91
92    @Override
93    protected void tearDown() throws Exception {
94        mVideoEditorHelper.destroyVideoEditor(mVideoEditor);
95        // Clean the directory created as project path
96        mVideoEditorHelper.deleteProject(new File(mVideoEditor.getPath()));
97        System.gc();
98        super.tearDown();
99    }
100
101    private void writeTimingInfo(String testCaseName, String[] information)
102        throws Exception {
103        File outFile = new File(VIDEOEDITOR_OUTPUT);
104        Writer output = new BufferedWriter(new FileWriter(outFile, true));
105        output.write(testCaseName + "\n\t");
106        for (int i = 0; i < information.length; i++) {
107            output.write(information[i]);
108        }
109        output.write("\n\n");
110        output.close();
111    }
112
113    private final int NUM_OF_ITERATIONS=20;
114
115    private int calculateTimeTaken(long beginTime, int numIterations)
116        throws Exception {
117        final long duration2 = SystemClock.uptimeMillis();
118        final long durationToCreateMediaItem = (duration2 - beginTime);
119        final int timeTaken1 = (int)(durationToCreateMediaItem / numIterations);
120        return (timeTaken1);
121    }
122
123    private void createVideoItems(MediaVideoItem[] mediaVideoItem,
124        String videoItemFileName, int renderingMode, int startTime, int endTime) throws Exception {
125        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
126            try {
127                mediaVideoItem[i] = new MediaVideoItem(mVideoEditor, "m" + i,
128                    videoItemFileName, renderingMode);
129                mediaVideoItem[i].setExtractBoundaries(startTime, endTime);
130            } catch (Exception e1) {
131                assertTrue(
132                    "Can not create an object of Video Item with file name = "
133                    + videoItemFileName + "------ID:m" + i + "       Issue = "
134                    + e1.toString(), false);
135            }
136        }
137    }
138
139    private void addVideoItems(MediaVideoItem[] mediaVideoItem) throws Exception {
140        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
141            try {
142                mVideoEditor.addMediaItem(mediaVideoItem[i]);
143            } catch (Exception e1) {
144                assertTrue(
145                    "Can not add an object of Video Item with ID:m" + i +
146                    "    Issue = " + e1.toString(), false);
147            }
148        }
149    }
150
151    private void removeVideoItems(MediaVideoItem[] mediaVideoItem) throws Exception {
152            for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
153            try {
154            mVideoEditor.removeMediaItem(mediaVideoItem[i].getId());
155            } catch (Exception e1) {
156                assertTrue(
157                    "Can not Remove an object of Video Item with ID:m" + i +
158                    "    Issue = " + e1.toString(), false);
159            }
160        }
161    }
162
163    private void createImageItems(MediaImageItem[] mIi,
164        String imageItemFileName, int renderingMode, int duration) throws Exception {
165        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
166            try {
167                mIi[i] = new MediaImageItem(mVideoEditor, "m" + i,
168                    imageItemFileName, duration, renderingMode);
169            } catch (Exception e1) {
170                assertTrue( " Cannot create Image Item", false);
171            }
172        }
173    }
174
175    private void addImageItems(MediaImageItem[] mIi) throws Exception {
176        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
177            try {
178                mVideoEditor.addMediaItem(mIi[i]);
179            } catch (Exception e1) {
180                assertTrue("Cannot add Image item", false);
181            }
182        }
183    }
184
185    private void removeImageItems(MediaImageItem[] mIi) throws Exception {
186            for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
187            try {
188            mVideoEditor.removeMediaItem(mIi[i].getId());
189            } catch (Exception e1) {
190                assertTrue("Cannot remove image item", false);
191            }
192        }
193    }
194    /**
195     * To test the performance of adding and removing the video media item
196     *
197     * @throws Exception
198     */
199    @LargeTest
200    public void testPerformanceAddRemoveVideoItem() throws Exception {
201        final String videoItemFileName = INPUT_FILE_PATH +
202            "H264_BP_1080x720_30fps_800kbps_1_17.mp4";
203        final int videoItemStartTime = 0;
204        final int videoItemEndTime = 5000;
205        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
206        final String[] loggingInfo = new String[3];
207        final MediaVideoItem[] mediaVideoItem =
208            new MediaVideoItem[NUM_OF_ITERATIONS];
209        int timeTaken = 0;
210        long startTime = 0;
211
212        /** Time Take for creation of Media Video Item */
213        startTime = SystemClock.uptimeMillis();
214        createVideoItems(mediaVideoItem, videoItemFileName, renderingMode,
215            videoItemStartTime, videoItemEndTime);
216
217        timeTaken = calculateTimeTaken (startTime, NUM_OF_ITERATIONS);
218        loggingInfo[0] = "Time taken to Create Media Video Item :" +
219            timeTaken;
220
221        /** Time Take for Addition of Media Video Item */
222        startTime = SystemClock.uptimeMillis();
223        addVideoItems(mediaVideoItem);
224        timeTaken = calculateTimeTaken (startTime, NUM_OF_ITERATIONS);
225        loggingInfo[1] = "\n\tTime taken to Add  Media Video Item :"
226            + timeTaken;
227
228        /** Time Take for Removal of Media Video Item */
229        startTime = SystemClock.uptimeMillis();
230        removeVideoItems(mediaVideoItem);
231        timeTaken = calculateTimeTaken (startTime, NUM_OF_ITERATIONS);
232        loggingInfo[2] = "\n\tTime taken to remove  Media Video Item :"
233            + timeTaken;
234
235        writeTimingInfo("testPerformanceAddRemoveVideoItem (in mSec)", loggingInfo);
236    }
237
238    /**
239     * To test the performance of adding and removing the image media item
240     *
241     * @throws Exception
242     */
243    @LargeTest
244    public void testPerformanceAddRemoveImageItem() throws Exception {
245        final String imageItemFileName = INPUT_FILE_PATH + "IMG_1600x1200.jpg";
246        final int imageItemDuration = 0;
247        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
248        final String[] loggingInfo = new String[3];
249        final MediaImageItem[] mediaImageItem =
250            new MediaImageItem[NUM_OF_ITERATIONS];
251        int timeTaken = 0;
252
253        long beginTime = SystemClock.uptimeMillis();
254        createImageItems(mediaImageItem, imageItemFileName, renderingMode,
255            imageItemDuration);
256        timeTaken = calculateTimeTaken(beginTime, NUM_OF_ITERATIONS);
257        loggingInfo[0] = "Time taken to Create  Media Image Item :" +
258            timeTaken;
259
260        beginTime = SystemClock.uptimeMillis();
261        addImageItems(mediaImageItem);
262        timeTaken = calculateTimeTaken(beginTime, NUM_OF_ITERATIONS);
263        loggingInfo[1] = "\n\tTime taken to add  Media Image Item :" +
264            timeTaken;
265
266        beginTime = SystemClock.uptimeMillis();
267        removeImageItems(mediaImageItem);
268        timeTaken = calculateTimeTaken(beginTime, NUM_OF_ITERATIONS);
269        loggingInfo[2] = "\n\tTime taken to remove  Media Image Item :"
270            + timeTaken;
271
272        writeTimingInfo("testPerformanceAddRemoveImageItem (in mSec)",
273            loggingInfo);
274    }
275
276    /**
277     * To test the performance of adding and removing the transition
278     *
279     * @throws Exception
280     */
281    @LargeTest
282    public void testPerformanceAddRemoveTransition() throws Exception {
283        final String videoItemFileName1 = INPUT_FILE_PATH +
284        "H264_BP_1080x720_30fps_800kbps_1_17.mp4";
285        final int videoItemStartTime1 = 0;
286        final int videoItemEndTime1 = 20000;
287        final String videoItemFileName2 = INPUT_FILE_PATH
288            + "MPEG4_SP_640x480_15fps_512kbps_AACLC_48khz_132kbps_s_0_26.mp4";
289        final int videoItemStartTime2 = 0;
290        final int videoItemEndTime2 = 20000;
291        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
292        final int transitionDuration = 5000;
293        final int transitionBehavior = Transition.BEHAVIOR_MIDDLE_FAST;
294        final String[] loggingInfo = new String[3];
295        int timeTaken = 0;
296
297        final MediaVideoItem[] mediaVideoItem =
298            new MediaVideoItem[(NUM_OF_ITERATIONS *10) + 1];
299
300        for (int i = 0; i < (NUM_OF_ITERATIONS *10); i+=2) {
301            try {
302                mediaVideoItem[i] = new MediaVideoItem(mVideoEditor, "m" + i,
303                    videoItemFileName1, renderingMode);
304                mediaVideoItem[i+1] = new MediaVideoItem(mVideoEditor,
305                    "m" + (i+1), videoItemFileName2, renderingMode);
306                mediaVideoItem[i].setExtractBoundaries(videoItemStartTime1,
307                    videoItemEndTime1);
308                mediaVideoItem[i+1].setExtractBoundaries(videoItemStartTime2,
309                    videoItemEndTime2);
310            } catch (Exception e1) {
311                assertTrue("Can not create Video Object Item with file name = "
312                    + e1.toString(), false);
313            }
314            mVideoEditor.addMediaItem(mediaVideoItem[i]);
315            mVideoEditor.addMediaItem(mediaVideoItem[i+1]);
316        }
317        mediaVideoItem[(NUM_OF_ITERATIONS *10)] = new MediaVideoItem(mVideoEditor,
318            "m" + (NUM_OF_ITERATIONS *10), videoItemFileName1, renderingMode);
319        mediaVideoItem[(NUM_OF_ITERATIONS *10)].setExtractBoundaries(
320            videoItemStartTime1, videoItemEndTime1);
321        mVideoEditor.addMediaItem(mediaVideoItem[(NUM_OF_ITERATIONS *10)]);
322        final TransitionCrossfade tranCrossfade[] =
323            new TransitionCrossfade[(NUM_OF_ITERATIONS *10)];
324
325        long beginTime = SystemClock.uptimeMillis();
326        for (int i = 0; i < (NUM_OF_ITERATIONS *10); i++) {
327            tranCrossfade[i] = new TransitionCrossfade("transition" + i,
328                mediaVideoItem[i], mediaVideoItem[i+1], transitionDuration,
329                transitionBehavior);
330        }
331        timeTaken = calculateTimeTaken(beginTime, (NUM_OF_ITERATIONS * 10));
332        loggingInfo[0] = "Time taken to Create CrossFade Transition :" +
333            timeTaken;
334
335        beginTime = SystemClock.uptimeMillis();
336        for (int i = 0; i < (NUM_OF_ITERATIONS *10); i++) {
337            mVideoEditor.addTransition(tranCrossfade[i]);
338        }
339        timeTaken = calculateTimeTaken(beginTime, (NUM_OF_ITERATIONS * 10));
340        loggingInfo[1] = "\n\tTime taken to add CrossFade Transition :" +
341            timeTaken;
342
343        beginTime = SystemClock.uptimeMillis();
344        for (int i = 0; i < (NUM_OF_ITERATIONS *10); i++) {
345            assertEquals("Removing Transitions", tranCrossfade[i], mVideoEditor
346                .removeTransition(tranCrossfade[i].getId()));
347        }
348        timeTaken = calculateTimeTaken(beginTime, (NUM_OF_ITERATIONS * 10));
349        loggingInfo[2] = "\n\tTime taken to remove CrossFade Transition :" +
350            timeTaken;
351
352        writeTimingInfo("testPerformanceAddRemoveTransition (in mSec)", loggingInfo);
353    }
354
355    /**
356     * To test performance of Export
357     *
358     * @throws Exception
359     */
360    @LargeTest
361    public void testPerformanceExport() throws Exception {
362        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
363        final int outHeight = MediaProperties.HEIGHT_480;
364        final int outBitrate = MediaProperties.BITRATE_256K;
365        final int outVcodec = MediaProperties.VCODEC_H264;
366        final String[] loggingInfo = new String[1];
367        final String outFilename = mVideoEditorHelper
368            .createRandomFile(mVideoEditor.getPath() + "/") + ".3gp";
369        final String videoItemFileName1 = INPUT_FILE_PATH +
370            "H264_BP_1080x720_30fps_12Mbps_AACLC_44.1khz_64kbps_s_1_17.mp4";
371        final String imageItemFileName1 = INPUT_FILE_PATH + "IMG_1600x1200.jpg";
372        final String videoItemFileName2 = INPUT_FILE_PATH +
373            "H264_BP_640x480_15fps_1200Kbps_AACLC_48KHz_32kbps_m_1_17.3gp";
374        final String imageItemFileName2 = INPUT_FILE_PATH + "IMG_176x144.jpg";
375        final String videoItemFileName3 = INPUT_FILE_PATH +
376            "MPEG4_SP_720x480_30fps_280kbps_AACLC_48kHz_161kbps_s_0_26.mp4";
377        final String overlayFile = INPUT_FILE_PATH + "IMG_640x480_Overlay1.png";
378        final String audioTrackFilename = INPUT_FILE_PATH +
379            "AMRNB_8KHz_12.2Kbps_m_1_17.3gp";
380        final String maskFilename = INPUT_FILE_PATH +
381            "TransitionSpiral_QVGA.jpg";
382
383        final MediaVideoItem mediaItem1 = new MediaVideoItem(mVideoEditor,
384            "m1", videoItemFileName1, renderingMode);
385        mediaItem1.setExtractBoundaries(0, 20000);
386        mVideoEditor.addMediaItem(mediaItem1);
387
388        final MediaImageItem mediaItem2 = new MediaImageItem(mVideoEditor,
389            "m2", imageItemFileName1, 10000, renderingMode);
390        mVideoEditor.addMediaItem(mediaItem2);
391
392        final MediaVideoItem mediaItem3 = new MediaVideoItem(mVideoEditor,
393            "m3", videoItemFileName2, renderingMode);
394        mediaItem3.setExtractBoundaries(0, 20000);
395        mVideoEditor.addMediaItem(mediaItem3);
396
397        final MediaImageItem mediaItem4 = new MediaImageItem(mVideoEditor,
398            "m4", imageItemFileName2, 10000, renderingMode);
399        mVideoEditor.addMediaItem(mediaItem4);
400
401        final MediaVideoItem mediaItem5 = new MediaVideoItem(mVideoEditor,
402            "m5", videoItemFileName3, renderingMode);
403        mediaItem5.setExtractBoundaries(0, 20000);
404        mVideoEditor.addMediaItem(mediaItem5);
405        /**
406         * 7.Add TransitionAlpha, Apply this  Transition as Begin for Media Item 1
407         *  with duration = 2 sec behavior = BEHAVIOR_LINEAR, mask file name =
408         * TransitionSpiral_QVGA.jpg , blending percent = 50%, invert = true;
409         * */
410        final TransitionAlpha transition1 =
411            mVideoEditorHelper.createTAlpha("transition1", null, mediaItem1,
412                2000, Transition.BEHAVIOR_LINEAR, maskFilename, 50, true);
413        mVideoEditor.addTransition(transition1);
414
415        /**
416         * 8.Add Transition Sliding between MediaItem 2 and 3 ,
417         *  Sliding Direction  = DIRECTION_RIGHT_OUT_LEFT_IN,
418         *  behavior  = BEHAVIOR_MIDDLE_FAST and duration = 4sec
419         * */
420        final TransitionSliding transition2And3 =
421            mVideoEditorHelper.createTSliding("transition2", mediaItem2,
422                mediaItem3, 4000, Transition.BEHAVIOR_MIDDLE_FAST,
423                TransitionSliding.DIRECTION_RIGHT_OUT_LEFT_IN);
424        mVideoEditor.addTransition(transition2And3);
425
426        /**
427         * 9.Add Transition Crossfade between  Media Item 3 and 4,
428         *  behavior = BEHAVIOR_MIDDLE_SLOW, duration = 3.5 sec
429         * */
430        final TransitionCrossfade transition3And4 =
431            mVideoEditorHelper.createTCrossFade("transition3", mediaItem3,
432                mediaItem4, 3500, Transition.BEHAVIOR_MIDDLE_SLOW);
433        mVideoEditor.addTransition(transition3And4);
434
435        /**
436         * 10.Add Transition Fadeblack between  Media Item 4 and 5,
437         *  behavior = BEHAVIOR_SPEED_DOWN, duration = 3.5 sec
438         * */
439        final TransitionFadeBlack transition4And5 =
440            mVideoEditorHelper.createTFadeBlack("transition4", mediaItem4,
441                mediaItem5, 3500, Transition.BEHAVIOR_SPEED_DOWN);
442        mVideoEditor.addTransition(transition4And5);
443
444        /**
445         * 11.Add Effect 1 type="TYPE_SEPIA" to the MediaItem 1,
446         *  start time=1sec and duration =4secs
447         * */
448        final EffectColor effectColor1 = mVideoEditorHelper.createEffectItem(
449            mediaItem1, "effect1", 1000, 4000, EffectColor.TYPE_SEPIA, 0);
450        mediaItem1.addEffect(effectColor1);
451
452        /**
453         * 12.Add Overlay 1  to the MediaItem 3: Frame Overlay with start time = 1 sec
454         * duration = 4 sec with item  = IMG_640x480_Overlay1.png
455         * */
456        final Bitmap mBitmap =  mVideoEditorHelper.getBitmap(overlayFile, 640,
457            480);
458        final OverlayFrame overlayFrame =
459            mVideoEditorHelper.createOverlay(mediaItem3, "overlay",
460                mBitmap, 1000, 4000);
461        mediaItem3.addOverlay(overlayFrame);
462        /**
463         * 13.Add Effect 2 type="TYPE_NEGATIVE" to the MediaItem 2,
464         *  start time=8sec and duration =2secs
465         * */
466        final EffectColor effectColor2 = mVideoEditorHelper.createEffectItem(
467            mediaItem2, "effect2", 8000, 2000, EffectColor.TYPE_NEGATIVE, 0);
468        mediaItem2.addEffect(effectColor2);
469        /**
470         * 14.Add Effect 3 type="TYPE_COLOR" to the MediaItem 3, color param = "PINK",
471         *  start time=5 sec and duration =3secs
472         * */
473        final EffectColor effectColor3 = mVideoEditorHelper.createEffectItem(
474            mediaItem3, "effect3", 5000, 3000, EffectColor.TYPE_COLOR,
475            EffectColor.PINK);
476        mediaItem3.addEffect(effectColor3);
477        /**
478         * 15.Add Effect 4 type="TYPE_FIFTIES" to the MediaItem 4,
479         *  start time=2 sec and duration =1secs
480        * */
481        final EffectColor effectColor4 = mVideoEditorHelper.createEffectItem(
482            mediaItem4, "effect4", 2000, 1000, EffectColor.TYPE_FIFTIES, 0);
483        mediaItem4.addEffect(effectColor4);
484        /**
485         * 16.Add KenBurnsEffect for MediaItem 4 with
486         *  duration = 3 sec and startTime = 4 sec
487         *  StartRect
488         *  left = org_height/3  ;  top = org_width/3
489         *  bottom = org_width/2  ;  right = org_height/2
490         *  EndRect
491         *  left = 0  ;  top = 0
492         *  bottom =  org_height;  right =  org_width
493         * */
494
495        final Rect startRect = new Rect((mediaItem4.getHeight() / 3),
496            (mediaItem4.getWidth() / 3), (mediaItem4.getHeight() / 2),
497            (mediaItem4.getWidth() / 2));
498        final Rect endRect = new Rect(0, 0, mediaItem4.getWidth(),
499            mediaItem4.getHeight());
500        final EffectKenBurns kbEffectOnMediaItem = new EffectKenBurns(
501            mediaItem4, "KBOnM2", startRect, endRect,4000 , 3000);
502        mediaItem4.addEffect(kbEffectOnMediaItem);
503
504        /** 17.Add Audio Track,Set extract boundaries o to 10 sec.
505         * */
506        final AudioTrack audioTrack = mVideoEditorHelper.createAudio(
507            mVideoEditor, "audioTrack", audioTrackFilename);
508        mVideoEditor.addAudioTrack(audioTrack);
509        /** 18.Enable Looping for Audio Track.
510         * */
511        audioTrack.enableLoop();
512        int timeTaken = 0;
513        final long beginTime = SystemClock.uptimeMillis();
514            try {
515                mVideoEditor.export(outFilename, outHeight, outBitrate,
516                    new ExportProgressListener() {
517                        public void onProgress(VideoEditor ve,
518                            String outFileName, int progress) {
519                        }
520                    });
521            } catch (Exception e) {
522                assertTrue("Error in Export" + e.toString(), false);
523            }
524        mVideoEditorHelper.checkDeleteExistingFile(outFilename);
525
526        timeTaken = calculateTimeTaken(beginTime, 1);
527        loggingInfo[0] = "Time taken to do ONE export of storyboard duration "
528            + mVideoEditor.getDuration() + " is :" + timeTaken;
529
530        writeTimingInfo("testPerformanceExport (in mSec)", loggingInfo);
531        mVideoEditorHelper.deleteProject(new File(mVideoEditor.getPath()));
532    }
533
534
535    /**
536     * To test the performance of thumbnail extraction
537     *
538     * @throws Exception
539     */
540    @LargeTest
541    public void testPerformanceThumbnailVideoItem() throws Exception {
542        final String videoItemFileName = INPUT_FILE_PATH
543            + "MPEG4_SP_640x480_15fps_512kbps_AACLC_48khz_132kbps_s_0_26.mp4";
544        final int videoItemStartTime = 0;
545        final int videoItemEndTime = 20000;
546        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
547        final String[] loggingInfo = new String[1];
548
549        final MediaVideoItem mediaVideoItem = new MediaVideoItem(mVideoEditor,
550            "m1", videoItemFileName, renderingMode);
551        mediaVideoItem.setExtractBoundaries(videoItemStartTime,
552            videoItemEndTime);
553
554        int timeTaken = 0;
555        long beginTime = SystemClock.uptimeMillis();
556        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
557            mediaVideoItem.getThumbnail(mediaVideoItem.getWidth() / 2,
558                mediaVideoItem.getHeight() / 2, i);
559        }
560        timeTaken = calculateTimeTaken(beginTime, NUM_OF_ITERATIONS);
561        loggingInfo[0] = "Duration taken to get Video Thumbnails :" +
562            timeTaken;
563
564        writeTimingInfo("testPerformanceThumbnailVideoItem (in mSec)", loggingInfo);
565    }
566
567    /**
568     * To test the performance of adding and removing the overlay to media item
569     *
570     * @throws Exception
571     */
572    @LargeTest
573    public void testPerformanceOverlayVideoItem() throws Exception {
574        final String videoItemFileName1 = INPUT_FILE_PATH +
575            "MPEG4_SP_640x480_15fps_512kbps_AACLC_48khz_132kbps_s_0_26.mp4";
576        final int videoItemStartTime1 = 0;
577        final int videoItemEndTime1 = 10000;
578        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
579        final String overlayFilename = INPUT_FILE_PATH
580            + "IMG_640x480_Overlay1.png";
581        final int overlayStartTime = 1000;
582        final int overlayDuration = 5000;
583
584        final String[] loggingInfo = new String[2];
585        MediaVideoItem mediaVideoItem = null;
586
587        try {
588            mediaVideoItem = new MediaVideoItem(mVideoEditor, "m0",
589                videoItemFileName1, renderingMode);
590            mediaVideoItem.setExtractBoundaries(videoItemStartTime1,
591                videoItemEndTime1);
592        } catch (Exception e1) {
593            assertTrue("Can not create Video Item with file name = "
594                + e1.toString(), false);
595        }
596        final OverlayFrame overlayFrame[] = new OverlayFrame[NUM_OF_ITERATIONS];
597        final Bitmap mBitmap =  mVideoEditorHelper.getBitmap(overlayFilename,
598            640, 480);
599        int timeTaken = 0;
600        long beginTime = SystemClock.uptimeMillis();
601        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
602            overlayFrame[i] = new OverlayFrame(mediaVideoItem, "overlay" + i,
603            mBitmap, overlayStartTime, overlayDuration);
604            mediaVideoItem.addOverlay(overlayFrame[i]);
605        }
606        timeTaken = calculateTimeTaken(beginTime, NUM_OF_ITERATIONS);
607        loggingInfo[0] = "Time taken to add & create Overlay :" + timeTaken;
608
609        beginTime = SystemClock.uptimeMillis();
610        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
611            assertEquals("Removing Overlays", overlayFrame[i],
612                mediaVideoItem.removeOverlay((overlayFrame[i].getId())));
613        }
614        timeTaken = calculateTimeTaken(beginTime, NUM_OF_ITERATIONS);
615        loggingInfo[1] = "\n\tTime taken to remove  Overlay :" +
616            timeTaken;
617
618        writeTimingInfo("testPerformanceOverlayVideoItem (in mSec)", loggingInfo);
619    }
620
621    /**
622     * To test the performance of get properties of a Video media item
623     *
624     * @throws Exception
625     */
626    @LargeTest
627    public void testPerformanceVideoItemProperties() throws Exception {
628        final String videoItemFileName1 = INPUT_FILE_PATH +
629            "H264_BP_1080x720_30fps_800kbps_1_17.mp4";
630        final int videoItemStartTime1 = 0;
631        final int videoItemEndTime1 = 10100;
632        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
633        final int aspectRatio = MediaProperties.ASPECT_RATIO_3_2;
634        final int fileType = MediaProperties.FILE_MP4;
635        final int videoCodecType = MediaProperties.VCODEC_H264;
636        final int duration = 77366;
637        final int videoBitrate = 3169971;
638        final int fps = 30;
639        final int videoProfile = MediaProperties.H264Profile.H264ProfileBaseline;
640        final int videoLevel = MediaProperties.H264Level.H264Level13;
641        final int width = 1080;
642        final int height = MediaProperties.HEIGHT_720;
643        int timeTaken = 0;
644        final String[] loggingInfo = new String[1];
645        final MediaVideoItem mediaVideoItem = new MediaVideoItem(mVideoEditor,
646            "m0", videoItemFileName1, renderingMode);
647        mediaVideoItem.setExtractBoundaries(videoItemStartTime1,
648            videoItemEndTime1);
649        long beginTime = SystemClock.uptimeMillis();
650        for (int i = 0; i < (NUM_OF_ITERATIONS*10); i++) {
651            try {
652                assertEquals("Aspect Ratio Mismatch",
653                    aspectRatio, mediaVideoItem.getAspectRatio());
654                assertEquals("File Type Mismatch",
655                    fileType, mediaVideoItem.getFileType());
656                assertEquals("VideoCodec Mismatch",
657                    videoCodecType, mediaVideoItem.getVideoType());
658                assertEquals("duration Mismatch",
659                    duration, mediaVideoItem.getDuration());
660                assertEquals("Video Profile ",
661                    videoProfile, mediaVideoItem.getVideoProfile());
662                assertEquals("Video Level ",
663                    videoLevel, mediaVideoItem.getVideoLevel());
664                assertEquals("Video height ",
665                    height, mediaVideoItem.getHeight());
666                assertEquals("Video width ",
667                    width, mediaVideoItem.getWidth());
668            } catch (Exception e1) {
669                assertTrue("Can not create Video Item with file name = "
670                    + e1.toString(), false);
671            }
672        }
673        timeTaken = calculateTimeTaken(beginTime, (NUM_OF_ITERATIONS*10));
674        loggingInfo[0] = "Time taken to get Media Properties :"
675            + timeTaken;
676        writeTimingInfo("testPerformanceVideoItemProperties:", loggingInfo);
677    }
678
679    /**
680     * To test the performance of generatePreview : with Transitions
681     *
682     * @throws Exception
683     */
684    @LargeTest
685    public void testPerformanceGeneratePreviewWithTransitions()
686        throws Exception {
687        final String videoItemFileName = INPUT_FILE_PATH +
688            "H264_BP_1080x720_30fps_800kbps_1_17.mp4";
689        final String imageItemFileName = INPUT_FILE_PATH +
690            "IMG_1600x1200.jpg";
691        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
692        final int transitionBehavior = Transition.BEHAVIOR_MIDDLE_FAST;
693        long averageTime = 0;
694        final String[] loggingInfo = new String[1];
695
696        final MediaVideoItem mediaVideoItem = new MediaVideoItem(mVideoEditor,
697            "mediaItem1", videoItemFileName, renderingMode);
698        mediaVideoItem.setExtractBoundaries(0, 10000);
699        mVideoEditor.addMediaItem(mediaVideoItem);
700
701        final MediaImageItem mediaImageItem = new MediaImageItem(mVideoEditor,
702            "mediaItem2", imageItemFileName, 10000, renderingMode);
703        mVideoEditor.addMediaItem(mediaImageItem);
704
705        final TransitionCrossfade transitionCrossFade = new TransitionCrossfade(
706            "transitionCrossFade", mediaVideoItem, mediaImageItem,
707            5000, transitionBehavior);
708        mVideoEditor.addTransition(transitionCrossFade);
709
710        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
711            final long duration1 = SystemClock.uptimeMillis();
712            mVideoEditor.generatePreview(new MediaProcessingProgressListener() {
713                public void onProgress(Object item, int action, int progress) {
714                }
715            });
716            final long duration2 = SystemClock.uptimeMillis();
717            mVideoEditor.removeTransition(transitionCrossFade.getId());
718            mVideoEditor.addTransition(transitionCrossFade);
719            averageTime += (duration2 - duration1);
720        }
721        final long durationToAddObjects = averageTime;
722        final float timeTaken = (float)durationToAddObjects *
723            1.0f/(float)NUM_OF_ITERATIONS;
724        loggingInfo[0] = "Time taken to Generate Preview with transition :"
725            + timeTaken;
726        writeTimingInfo("testPerformanceGeneratePreviewWithTransitions:",
727            loggingInfo);
728    }
729
730    /**
731     * To test the performance of generatePreview : with KenBurn
732     *
733     * @throws Exception
734     */
735    @LargeTest
736    public void testPerformanceWithKenBurn() throws Exception {
737        final String videoItemFileName = INPUT_FILE_PATH +
738            "H264_BP_1080x720_30fps_800kbps_1_17.mp4";
739        final String imageItemFileName = INPUT_FILE_PATH +
740            "IMG_1600x1200.jpg";
741        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
742        long averageTime = 0;
743        final String[] loggingInfo = new String[1];
744        final MediaVideoItem mediaVideoItem = new MediaVideoItem(mVideoEditor,
745            "mediaItem1", videoItemFileName, renderingMode);
746        mediaVideoItem.setExtractBoundaries(0, 10000);
747        mVideoEditor.addMediaItem(mediaVideoItem);
748
749        final MediaImageItem mediaImageItem = new MediaImageItem(mVideoEditor,
750            "mediaItem2", imageItemFileName, 10000, renderingMode);
751        mVideoEditor.addMediaItem(mediaImageItem);
752
753        final Rect startRect = new Rect((mediaImageItem.getHeight() / 3),
754            (mediaImageItem.getWidth() / 3), (mediaImageItem.getHeight() / 2),
755            (mediaImageItem.getWidth() / 2));
756        final Rect endRect = new Rect(0, 0, mediaImageItem.getWidth(),
757            mediaImageItem.getHeight());
758        final EffectKenBurns kbEffectOnMediaItem =
759            new EffectKenBurns(mediaImageItem, "KBOnM2", startRect, endRect,
760                500, 3000);
761        mediaImageItem.addEffect(kbEffectOnMediaItem);
762
763        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
764            final long duration1 = SystemClock.uptimeMillis();
765            mVideoEditor.generatePreview(new MediaProcessingProgressListener() {
766                public void onProgress(Object item, int action, int progress) {
767                }
768            });
769            final long duration2 = SystemClock.uptimeMillis();
770            mediaImageItem.removeEffect(kbEffectOnMediaItem.getId());
771            mediaImageItem.addEffect(kbEffectOnMediaItem);
772            averageTime += duration2 - duration1;
773        }
774
775        final long durationToAddObjects = (averageTime);
776        final float timeTaken = (float)durationToAddObjects *
777            1.0f/(float)NUM_OF_ITERATIONS;
778        loggingInfo[0] = "Time taken to Generate KenBurn Effect :"
779            + timeTaken;
780        writeTimingInfo("testPerformanceWithKenBurn", loggingInfo);
781    }
782
783    /**
784     * To test the performance of generatePreview : with Transitions and
785     * Effect,Overlapping scenario
786     *
787     * @throws Exception
788     */
789    @LargeTest
790    public void testPerformanceEffectOverlappingTransition() throws Exception {
791        final String videoItemFileName1 = INPUT_FILE_PATH +
792            "H264_BP_1080x720_30fps_800kbps_1_17.mp4";
793        final String videoItemFileName2 = INPUT_FILE_PATH
794            + "MPEG4_SP_640x480_15fps_512kbps_AACLC_48khz_132kbps_s_0_26.mp4";
795        final int videoStartTime1 = 0;
796        final int videoEndTime1 = 10000;
797        final int videoStartTime2 = 0;
798        final int videoEndTime2 = 10000;
799        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
800        final int transitionDuration = 5000;
801        final int transitionBehavior = Transition.BEHAVIOR_MIDDLE_FAST;
802        final int effectItemStartTime = 5000;
803        final int effectItemDurationTime = 5000;
804        final int effectType = EffectColor.TYPE_COLOR;
805        final int effectColorType = EffectColor.GREEN;
806        long averageDuration = 0;
807
808        final String[] loggingInfo = new String[1];
809        final MediaVideoItem mediaVideoItem1 = new MediaVideoItem(mVideoEditor,
810            "mediaItem1", videoItemFileName1, renderingMode);
811        mediaVideoItem1.setExtractBoundaries(videoStartTime1, videoEndTime1);
812        mVideoEditor.addMediaItem(mediaVideoItem1);
813
814        final MediaVideoItem mediaVideoItem2 = new MediaVideoItem(mVideoEditor,
815            "mediaItem2", videoItemFileName2, renderingMode);
816        mediaVideoItem2.setExtractBoundaries(videoStartTime2, videoEndTime2);
817        mVideoEditor.addMediaItem(mediaVideoItem2);
818
819        final TransitionCrossfade transitionCrossFade = new TransitionCrossfade(
820            "transitionCrossFade", mediaVideoItem1, mediaVideoItem2,
821            transitionDuration, transitionBehavior);
822        mVideoEditor.addTransition(transitionCrossFade);
823
824        final EffectColor effectColor = new EffectColor(mediaVideoItem1,
825            "effect", effectItemStartTime, effectItemDurationTime, effectType,
826             effectColorType);
827        mediaVideoItem1.addEffect(effectColor);
828
829        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
830            final long duration1 = SystemClock.uptimeMillis();
831            mVideoEditor.generatePreview(new MediaProcessingProgressListener() {
832                public void onProgress(Object item, int action, int progress) {
833                }
834            });
835            final long duration2 = SystemClock.uptimeMillis();
836            mVideoEditor.removeTransition(transitionCrossFade.getId());
837            mVideoEditor.addTransition(transitionCrossFade);
838            averageDuration += (duration2 - duration1);
839        }
840        SystemClock.uptimeMillis();
841        final long durationToAddObjects = (averageDuration);
842        final float timeTaken = (float)durationToAddObjects *
843            1.0f/(float)NUM_OF_ITERATIONS;
844        loggingInfo[0] =
845            "Time taken to testPerformanceEffectOverlappingTransition :"
846            + timeTaken;
847        writeTimingInfo("testPerformanceEffectOverlappingTransition:",
848            loggingInfo);
849    }
850
851    /**
852     * To test creation of story board with Transition and Two Effects, Effect
853     * overlapping transitions
854     *
855     * @throws Exception
856     */
857    @LargeTest
858    public void testPerformanceTransitionWithEffectOverlapping() throws Exception {
859        final String videoItemFileName1 = INPUT_FILE_PATH +
860            "H264_BP_1080x720_30fps_800kbps_1_17.mp4";
861        final String videoItemFileName2 = INPUT_FILE_PATH
862            + "MPEG4_SP_640x480_15fps_512kbps_AACLC_48khz_132kbps_s_0_26.mp4";
863        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
864        final int transitionDuration = 5000;
865        final int transitionBehavior = Transition.BEHAVIOR_MIDDLE_FAST;
866        final int effectItemStartTime1 = 5000;
867        final int effectItemDurationTime1 = 5000;
868        final int effectType1 = EffectColor.TYPE_COLOR;
869        final int effectColorType1 = EffectColor.GREEN;
870        final int effectItemStartTime2 = 5000;
871        final int effectItemDurationTime2 = 5000;
872        final int effectType2 = EffectColor.TYPE_COLOR;
873        final int effectColorType2 = EffectColor.GREEN;
874        int averageTime = 0;
875        final String[] loggingInfo = new String[1];
876
877        final MediaVideoItem mediaVideoItem1 = new MediaVideoItem(mVideoEditor,
878            "mediaItem1", videoItemFileName1, renderingMode);
879        mVideoEditor.addMediaItem(mediaVideoItem1);
880
881        final MediaVideoItem mediaVideoItem2 = new MediaVideoItem(mVideoEditor,
882            "mediaItem2", videoItemFileName2, renderingMode);
883        mVideoEditor.addMediaItem(mediaVideoItem2);
884
885        final TransitionCrossfade transitionCrossFade = new TransitionCrossfade(
886            "transitionCrossFade", mediaVideoItem1, mediaVideoItem2,
887            transitionDuration, transitionBehavior);
888        mVideoEditor.addTransition(transitionCrossFade);
889
890        final EffectColor effectColor1 = new EffectColor(mediaVideoItem1,
891            "effect1", effectItemStartTime1, effectItemDurationTime1,
892            effectType1, effectColorType1);
893        mediaVideoItem1.addEffect(effectColor1);
894
895        final EffectColor effectColor2 = new EffectColor(mediaVideoItem2,
896            "effect2", effectItemStartTime2, effectItemDurationTime2,
897            effectType2, effectColorType2);
898        mediaVideoItem2.addEffect(effectColor2);
899
900        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
901            final long duration1 = SystemClock.uptimeMillis();
902            mVideoEditor.generatePreview(new MediaProcessingProgressListener() {
903                public void onProgress(Object item, int action, int progress) {
904                }
905            });
906            final long duration2 = SystemClock.uptimeMillis();
907            mVideoEditor.removeTransition(transitionCrossFade.getId());
908            mVideoEditor.addTransition(transitionCrossFade);
909            averageTime += duration2 - duration1;
910        }
911        final long durationToAddObjects = (averageTime);
912        final float timeTaken = (float)durationToAddObjects *
913            1.0f/(float)NUM_OF_ITERATIONS;
914        loggingInfo[0] = "Time taken to TransitionWithEffectOverlapping :"
915            + timeTaken;
916        writeTimingInfo("testPerformanceTransitionWithEffectOverlapping",
917            loggingInfo);
918    }
919
920    /**
921     *To test ThumbnailList for H264
922     */
923    @LargeTest
924    public void testThumbnailH264NonIFrame() throws Exception {
925        final String videoItemFilename = INPUT_FILE_PATH +
926            "H264_BP_1080x720_30fps_800kbps_1_17.mp4";
927        final int outWidth = 1080;
928        final int outHeight = 720;
929        final int atTime = 2400;
930        long durationToAddObjects = 0;
931        int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
932        final String[] loggingInfo = new String[1];
933        final MediaVideoItem mediaVideoItem = new MediaVideoItem(mVideoEditor,
934            "m1", videoItemFilename, renderingMode);
935        assertNotNull("MediaVideoItem", mediaVideoItem);
936
937        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
938            final long duration1 = SystemClock.uptimeMillis();
939            mediaVideoItem.getThumbnail(outWidth, outHeight, atTime + i);
940            final long duration2 = SystemClock.uptimeMillis();
941            durationToAddObjects += (duration2 - duration1);
942        }
943        final float timeTaken = (float)durationToAddObjects *
944            1.0f/(float)NUM_OF_ITERATIONS;
945        loggingInfo[0] = "Time taken for Thumbnail generation :"
946            + timeTaken;
947        writeTimingInfo("testThumbnailH264NonIFrame", loggingInfo);
948    }
949
950    /**
951     *To test ThumbnailList for H264
952     */
953    @LargeTest
954    public void testThumbnailH264AnIFrame() throws Exception {
955        final String videoItemFilename = INPUT_FILE_PATH +
956            "H264_BP_1080x720_30fps_800kbps_1_17.mp4";
957        final int outWidth = 1080;
958        final int outHeight = 720;
959        final int atTime = 3000;
960        int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
961        final String[] loggingInfo = new String[1];
962        long durationToAddObjects = 0;
963
964        final MediaVideoItem mediaVideoItem = new MediaVideoItem(mVideoEditor,
965            "m1", videoItemFilename, renderingMode);
966        assertNotNull("MediaVideoItem", mediaVideoItem);
967
968        for (int i = 0; i < NUM_OF_ITERATIONS; i++) {
969            final long duration1 = SystemClock.uptimeMillis();
970            mediaVideoItem.getThumbnail(outWidth, outHeight, atTime + i);
971            final long duration2 = SystemClock.uptimeMillis();
972            durationToAddObjects += (duration2 - duration1);
973        }
974        final float timeTaken = (float)durationToAddObjects *
975            1.0f/(float)NUM_OF_ITERATIONS;
976        loggingInfo[0] = "Time taken Thumbnail generation :"
977            + timeTaken;
978        writeTimingInfo("testThumbnailH264AnIFrame", loggingInfo);
979    }
980
981    /**
982     * To test the performance : With an audio track
983     *
984     * @throws Exception
985     */
986    @LargeTest
987    public void testPerformanceWithAudioTrack() throws Exception {
988        final String videoItemFileName1 = INPUT_FILE_PATH +
989            "H264_BP_1080x720_30fps_800kbps_1_17.mp4";
990        final String audioFilename1 = INPUT_FILE_PATH +
991            "AACLC_44.1kHz_256kbps_s_1_17.mp4";
992        final String audioFilename2 = INPUT_FILE_PATH +
993            "AMRNB_8KHz_12.2Kbps_m_1_17.3gp";
994        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
995        final int audioVolume = 50;
996        final String[] loggingInfo = new String[2];
997        int timeTaken = 0;
998
999        final MediaVideoItem mediaVideoItem = new MediaVideoItem(mVideoEditor,
1000            "mediaItem1", videoItemFileName1, renderingMode);
1001        mVideoEditor.addMediaItem(mediaVideoItem);
1002
1003        final AudioTrack audioTrack1 = new AudioTrack(mVideoEditor,
1004            "Audio Track1", audioFilename1);
1005        audioTrack1.disableDucking();
1006        audioTrack1.setVolume(audioVolume);
1007        mVideoEditor.addAudioTrack(audioTrack1);
1008
1009        long beginTime = SystemClock.uptimeMillis();
1010        mVideoEditor.generatePreview(new MediaProcessingProgressListener() {
1011            public void onProgress(Object item, int action, int progress) {
1012            }
1013        });
1014        timeTaken = calculateTimeTaken(beginTime, 1);
1015        loggingInfo[0] = "Time taken for 1st Audio Track (AACLC) :"
1016            + timeTaken;
1017
1018        final AudioTrack audioTrack2 = new AudioTrack(mVideoEditor,
1019            "Audio Track2", audioFilename2);
1020        audioTrack2.enableLoop();
1021
1022        beginTime = SystemClock.uptimeMillis();
1023        mVideoEditor.generatePreview(new MediaProcessingProgressListener() {
1024            public void onProgress(Object item, int action, int progress) {
1025            }
1026        });
1027        timeTaken = calculateTimeTaken(beginTime, 1);
1028        loggingInfo[1] = "\n\tTime taken for 2nd Audio Track(AMRNB) :"
1029            + timeTaken;
1030
1031        writeTimingInfo("testPerformanceWithAudioTrack", loggingInfo);
1032    }
1033
1034    /**
1035     * To test the performance of adding and removing the
1036     * image media item with 640 x 480
1037     *
1038     * @throws Exception
1039     */
1040    @LargeTest
1041    public void testPerformanceAddRemoveImageItem640x480() throws Exception {
1042        final String imageItemFileName = INPUT_FILE_PATH + "IMG_640x480.jpg";
1043        final int imageItemDuration = 0;
1044        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
1045        final String[] loggingInfo = new String[3];
1046
1047        int timeTaken = 0;
1048
1049        final MediaImageItem[] mediaImageItem =
1050            new MediaImageItem[NUM_OF_ITERATIONS];
1051        long beginTime = SystemClock.uptimeMillis();
1052        createImageItems(mediaImageItem, imageItemFileName, renderingMode,
1053            imageItemDuration);
1054        timeTaken = calculateTimeTaken(beginTime, NUM_OF_ITERATIONS);
1055        loggingInfo[0] = "Time taken to Create  Media Image Item (640x480) :"
1056            + timeTaken;
1057
1058        beginTime = SystemClock.uptimeMillis();
1059        addImageItems(mediaImageItem);
1060        timeTaken = calculateTimeTaken(beginTime, NUM_OF_ITERATIONS);
1061        loggingInfo[1] = "\n\tTime taken to add  Media Image Item (640x480) :"
1062            + timeTaken;
1063
1064        beginTime = SystemClock.uptimeMillis();
1065        removeImageItems(mediaImageItem);
1066        timeTaken = calculateTimeTaken(beginTime, NUM_OF_ITERATIONS);
1067        loggingInfo[2] = "\n\tTime taken to remove  Media Image Item (640x480) :"
1068            + timeTaken;
1069        writeTimingInfo("testPerformanceAddRemoveImageItem640x480 (in mSec)", loggingInfo);
1070    }
1071
1072
1073}
1074