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.functional.videoeditor;
19
20import java.io.File;
21import java.io.IOException;
22
23import android.graphics.Bitmap;
24import android.media.videoeditor.MediaImageItem;
25import android.media.videoeditor.MediaItem;
26import android.media.videoeditor.MediaVideoItem;
27import android.media.videoeditor.VideoEditor;
28import android.os.Environment;
29import android.test.ActivityInstrumentationTestCase;
30import android.test.suitebuilder.annotation.LargeTest;
31import com.android.mediaframeworktest.MediaFrameworkTest;
32import com.android.mediaframeworktest.VideoEditorHelper;
33
34public class MediaItemThumbnailTest extends
35    ActivityInstrumentationTestCase<MediaFrameworkTest> {
36    private final String TAG = "MediaItemThumbailTest";
37
38    private final String PROJECT_LOCATION = VideoEditorHelper.PROJECT_LOCATION_COMMON;
39
40    private final String INPUT_FILE_PATH = VideoEditorHelper.INPUT_FILE_PATH_COMMON;
41
42    private VideoEditor mVideoEditor;
43
44    private VideoEditorHelper mVideoEditorHelper;
45
46    public MediaItemThumbnailTest() {
47        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
48    }
49
50    @Override
51    protected void setUp() throws Exception {
52        // setup for each test case.
53        super.setUp();
54        mVideoEditorHelper = new VideoEditorHelper();
55        // Create a random String which will be used as project path, where all
56        // project related files will be stored.
57        final String projectPath = mVideoEditorHelper.
58            createRandomFile(PROJECT_LOCATION);
59        mVideoEditor = mVideoEditorHelper.createVideoEditor(projectPath);
60    }
61
62    @Override
63    protected void tearDown() throws Exception {
64        mVideoEditorHelper.destroyVideoEditor(mVideoEditor);
65        // Clean the directory created as project path
66        mVideoEditorHelper.deleteProject(new File(mVideoEditor.getPath()));
67        System.gc();
68        super.tearDown();
69    }
70
71    protected void validateThumbnail(Bitmap thumbNailBmp, int outWidth,
72        int outHeight) throws Exception {
73        assertNotNull("Thumbnail Retrived is Null", thumbNailBmp);
74        assertEquals("Thumbnail Height", outHeight, thumbNailBmp.getHeight());
75        assertEquals("Thumbnail Width", outWidth, thumbNailBmp.getWidth());
76        thumbNailBmp.recycle();
77    }
78
79    // -----------------------------------------------------------------
80    // THUMBNAIL
81    // -----------------------------------------------------------------
82    /**
83     * To test thumbnail / frame extraction on H.263 QCIF.
84     */
85    @LargeTest
86    public void testThumbnailForH263QCIF() throws Exception {
87        final String videoItemFilename = INPUT_FILE_PATH
88            + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_0_26.3gp";
89        final int atTime = 0;
90        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
91        final MediaVideoItem mediaVideoItem =
92            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
93                videoItemFilename, renderingMode);
94
95        final int outWidth = (mediaVideoItem.getWidth() / 2);
96        final int outHeight = mediaVideoItem.getHeight();
97
98        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
99            outHeight, atTime);
100        validateThumbnail(thumbNailBmp, outWidth, outHeight);
101    }
102
103    /**
104     * To test thumbnail / frame extraction on MPEG4 VGA .
105     */
106    @LargeTest
107    public void testThumbnailForMPEG4VGA() throws Exception {
108        final String videoItemFilename = INPUT_FILE_PATH +
109            "MPEG4_SP_640x480_30fps_512Kbps_0_23.3gp";
110        final int atTime = 0;
111        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
112        final MediaVideoItem mediaVideoItem =
113            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
114                videoItemFilename, renderingMode);
115        final int outWidth = (mediaVideoItem.getWidth() / 2);
116        final int outHeight = mediaVideoItem.getHeight();
117        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
118            outHeight, atTime);
119        validateThumbnail(thumbNailBmp, outWidth, outHeight);
120    }
121
122    /**
123     * To test thumbnail / frame extraction on MPEG4 NTSC.
124     */
125    @LargeTest
126    public void testThumbnailForMPEG4NTSC() throws Exception {
127        final String videoItemFilename = INPUT_FILE_PATH
128            + "MPEG4_SP_720x480_30fps_280kbps_AACLC_48kHz_96kbps_s_0_21.mp4";
129        final int atTime = 0;
130        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
131        final MediaVideoItem mediaVideoItem =
132            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
133                videoItemFilename, renderingMode);
134        final int outWidth = mediaVideoItem.getWidth() / 2;
135        final int outHeight = mediaVideoItem.getHeight() / 2;
136        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
137            outHeight, atTime);
138        validateThumbnail(thumbNailBmp, outWidth, outHeight);
139    }
140
141    /**
142     * To test thumbnail / frame extraction on MPEG4 WVGA.
143     */
144    @LargeTest
145    public void testThumbnailForMPEG4WVGA() throws Exception {
146
147        final String videoItemFilename = INPUT_FILE_PATH
148            + "MPEG4_SP_800x480_515kbps_15fps_AMR_NB_8KHz_12.2kbps_m_0_26.mp4";
149        final int atTime = 0;
150        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
151        final MediaVideoItem mediaVideoItem =
152            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
153                videoItemFilename, renderingMode);
154        final int outWidth = mediaVideoItem.getWidth() * 2;
155        final int outHeight = mediaVideoItem.getHeight();
156        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
157            outHeight, atTime);
158        validateThumbnail(thumbNailBmp, outWidth, outHeight);
159    }
160
161    /**
162     * To test thumbnail / frame extraction on MPEG4 QCIF.
163     */
164    @LargeTest
165    public void testThumbnailForMPEG4QCIF() throws Exception {
166        final String videoItemFilename = INPUT_FILE_PATH
167            + "MPEG4_SP_176x144_30fps_256kbps_AACLC_44.1kHz_96kbps_s_1_17.3gp";
168        final int atTime = 0;
169        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
170
171        final MediaVideoItem mediaVideoItem =
172            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
173                videoItemFilename, renderingMode);
174        final int outWidth = mediaVideoItem.getWidth();
175        final int outHeight = mediaVideoItem.getHeight() * 2;
176        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
177            outHeight, atTime);
178        validateThumbnail(thumbNailBmp, outWidth, outHeight);
179    }
180
181    /**
182     * To test thumbnail / frame extraction on H264 QCIF.
183     */
184    @LargeTest
185    public void testThumbnailForH264QCIF() throws Exception {
186        final String videoItemFilename = INPUT_FILE_PATH
187            + "H264_BP_176x144_15fps_144kbps_AMRNB_8kHz_12.2kbps_m_1_17.3gp";
188
189        final int atTime = 0;
190        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
191        final MediaVideoItem mediaVideoItem =
192            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
193                videoItemFilename, renderingMode);
194        final int outWidth = mediaVideoItem.getWidth() * 2;
195        final int outHeight = mediaVideoItem.getHeight() * 2;
196        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
197            outHeight, atTime);
198        validateThumbnail(thumbNailBmp, outWidth, outHeight);
199    }
200
201    /**
202     * To test thumbnail / frame extraction on H264 VGA.
203     */
204    @LargeTest
205    public void testThumbnailForH264VGA() throws Exception {
206        final String videoItemFilename = INPUT_FILE_PATH +
207            "H264_BP_640x480_30fps_192kbps_1_5.mp4";
208        final int outWidth = 32;
209        final int outHeight = 32;
210        final int atTime = 0;
211
212        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
213        final MediaVideoItem mediaVideoItem =
214            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
215                videoItemFilename, renderingMode);
216
217        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
218            outHeight, atTime);
219        validateThumbnail(thumbNailBmp, outWidth, outHeight);
220    }
221    /**
222     * To test thumbnail / frame extraction on H264 WVGA.
223     */
224    @LargeTest
225    public void testThumbnailForH264WVGA() throws Exception {
226        final String videoItemFilename = INPUT_FILE_PATH +
227            "H264_BP_800x480_15fps_512kbps_AACLC_24KHz_38Kbps_s_1_17.mp4";
228        final int outWidth = 64;
229        final int outHeight = 64;
230        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
231        final MediaVideoItem mediaVideoItem =
232            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
233                videoItemFilename, renderingMode);
234        final long atTime = mediaVideoItem.getDuration() / 2;
235        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
236            outHeight, atTime);
237        validateThumbnail(thumbNailBmp, outWidth, outHeight);
238    }
239
240    /**
241     * To test thumbnail / frame extraction on H264 854x480.
242     */
243    @LargeTest
244    public void testThumbnailForH264854_480() throws Exception {
245        final String videoItemFilename = INPUT_FILE_PATH
246            + "MPEG4_SP_854x480_15fps_256kbps_AACLC_16khz_48kbps_s_0_26.mp4";
247        final int outWidth = 128;
248        final int outHeight = 128;
249        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
250        MediaVideoItem mediaVideoItem = null;
251        mediaVideoItem =
252            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
253                videoItemFilename, renderingMode);
254        final long atTime = mediaVideoItem.getDuration() - 1000;
255        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
256            outHeight, atTime);
257        validateThumbnail(thumbNailBmp, outWidth, outHeight);
258    }
259
260    /**
261     * To test thumbnail / frame extraction on H264 960x720.
262     */
263    @LargeTest
264    public void testThumbnailForH264HD960() throws Exception {
265        final String videoItemFilename = INPUT_FILE_PATH +
266            "H264_BP_960x720_25fps_800kbps_AACLC_48Khz_192Kbps_s_1_17.mp4";
267        final int outWidth = 75;
268        final int outHeight = 75;
269
270        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
271        final MediaVideoItem mediaVideoItem =
272            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
273                videoItemFilename, renderingMode);
274        final long atTime = mediaVideoItem.getDuration() - 1000;
275        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
276            outHeight, atTime);
277        validateThumbnail(thumbNailBmp, outWidth, outHeight);
278    }
279
280    /**
281     * To test thumbnail / frame extraction on H264 1080x720 .
282     */
283    @LargeTest
284    public void testThumbnailForH264HD1080() throws Exception {
285        final String videoItemFilename = INPUT_FILE_PATH +
286            "H264_BP_1080x720_30fps_800kbps_1_17.mp4";
287        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
288        final MediaVideoItem mediaVideoItem =
289            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
290                videoItemFilename, renderingMode);
291        final int outWidth = mediaVideoItem.getWidth() / 2;
292        final int outHeight = mediaVideoItem.getHeight() / 2;
293        final long atTime = mediaVideoItem.getDuration() / 4;
294        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
295            outHeight, atTime);
296        validateThumbnail(thumbNailBmp, outWidth, outHeight);
297    }
298
299    /**
300     * Check the thumbnail / frame extraction precision at 0,100 and 200 ms
301     */
302    @LargeTest
303    public void testThumbnailForH264VGADifferentDuration() throws Exception {
304        final String videoItemFilename = INPUT_FILE_PATH +
305            "H264_BP_640x480_30fps_256kbps_1_17.mp4";
306        final int atTime = 0;
307        final int atTime1 = 100;
308        final int atTime2 = 200;
309        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
310
311        final MediaVideoItem mediaVideoItem =
312            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
313                videoItemFilename, renderingMode);
314        final int outWidth = mediaVideoItem.getWidth();
315        final int outHeight = mediaVideoItem.getHeight();
316
317        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
318            outHeight, atTime);
319        validateThumbnail(thumbNailBmp, outWidth, outHeight);
320
321        // get Thumbnail @ 100ms
322        final Bitmap thumbNailBmpAt100 =
323            mediaVideoItem.getThumbnail(outWidth, outHeight, atTime1);
324        validateThumbnail(thumbNailBmpAt100, outWidth, outHeight);
325
326        // get Thumbnail @ 200ms
327        final Bitmap thumbNailBmpAt200 = mediaVideoItem.getThumbnail(
328            outWidth, outHeight, atTime2);
329        validateThumbnail(thumbNailBmpAt200, outWidth, outHeight);
330    }
331
332    /**
333     *Check the thumbnail / frame extraction precision at
334     * FileDuration,FileDuration/2 + 100 andFileDuration/2 + 200 ms
335     */
336    @LargeTest
337    public void testThumbnailForMP4VGA() throws Exception {
338        final String videoItemFilename = INPUT_FILE_PATH +
339            "MPEG4_SP_640x480_15fps_256kbps_0_30.mp4";
340        final MediaVideoItem mediaVideoItem =
341            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
342                videoItemFilename, MediaItem.RENDERING_MODE_BLACK_BORDER);
343
344        final int outWidth = mediaVideoItem.getWidth();
345        final int outHeight = mediaVideoItem.getHeight();
346        final long atTime = mediaVideoItem.getDuration() / 2;
347        final long atTime1 = atTime + 100;
348        final long atTime2 = atTime + 200;
349
350        // get Thumbnail @ duration/2
351        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
352            outHeight, atTime);
353        validateThumbnail(thumbNailBmp, outWidth, outHeight);
354
355        // get Thumbnail @ duration/2 + 100ms
356        final Bitmap thumbNailBmpAt100 = mediaVideoItem.getThumbnail(
357            outWidth, outHeight, atTime1);
358        validateThumbnail(thumbNailBmpAt100, outWidth, outHeight);
359
360        // get Thumbnail @ duration/2 + 200ms
361        final Bitmap thumbNailBmpAt200 = mediaVideoItem.getThumbnail(
362            outWidth, outHeight, atTime2);
363        validateThumbnail(thumbNailBmpAt200, outWidth, outHeight);
364    }
365
366    /**
367     * Check the thumbnail / frame extraction on JPEG file
368     */
369    @LargeTest
370    public void testThumbnailForImage() throws Exception {
371        final String imageItemFilename = INPUT_FILE_PATH + "IMG_640x480.jpg";
372        final int mediaDuration = 1000;
373        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
374        boolean flagForException = false;
375        int outWidth = 0;
376        int outHeight = 0;
377
378        final MediaImageItem mii = mVideoEditorHelper.createMediaItem(
379            mVideoEditor, "m1", imageItemFilename, mediaDuration, renderingMode);
380        assertNotNull("Media Image Item is Null",  mii);
381        outWidth =  mii.getWidth() / 2;
382        outHeight =  mii.getHeight() / 2;
383
384        final Bitmap thumbNailBmp = mii.getThumbnail(outWidth,
385            outHeight, mediaDuration);
386        validateThumbnail(thumbNailBmp, outWidth, outHeight);
387    }
388    /**
389     *To test ThumbnailList for H263 QCIF
390     */
391    @LargeTest
392    public void testThumbnailListH263QCIF() throws Exception {
393        final String videoItemFilename = INPUT_FILE_PATH
394            + "H263_profile0_176x144_15fps_256kbps_AACLC_32kHz_128kbps_s_1_17.3gp";
395        final int startTime = 0;
396        final int tnCount = 10;
397        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
398        final MediaVideoItem mediaVideoItem =
399            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
400                videoItemFilename, renderingMode);
401
402        final int outWidth = mediaVideoItem.getWidth() / 4;
403        final int outHeight = mediaVideoItem.getHeight() / 4;
404        final long endTime = mediaVideoItem.getDuration() / 2;
405
406        final Bitmap thumbNailBmp[] = mediaVideoItem.getThumbnailList(
407            outWidth, outHeight, startTime, endTime, tnCount);
408        assertNotNull("Thumbnail Retrived is Null", thumbNailBmp);
409        assertEquals("Thumbnail Count", tnCount, thumbNailBmp.length);
410
411        for (int i = 0; i < thumbNailBmp.length; i++) {
412            validateThumbnail(thumbNailBmp[i], outWidth, outHeight);
413            thumbNailBmp[i] = null;
414        }
415    }
416
417    /**
418     *To test ThumbnailList for MPEG4 QCIF
419     */
420    @LargeTest
421    public void testThumbnailListMPEG4QCIF() throws Exception {
422        final String videoItemFilename = INPUT_FILE_PATH
423            + "MPEG4_SP_176x144_30fps_256kbps_AACLC_44.1kHz_96kbps_s_1_17.3gp";
424        final int tnCount = 10;
425        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
426
427        final MediaVideoItem mediaVideoItem =
428            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
429                videoItemFilename, renderingMode);
430
431        final int outWidth = mediaVideoItem.getWidth() / 2;
432        final int outHeight = mediaVideoItem.getHeight() / 2;
433        final long startTime = mediaVideoItem.getDuration() / 2;
434        final long endTime = mediaVideoItem.getDuration();
435
436        final Bitmap thumbNailBmp[] = mediaVideoItem.getThumbnailList(
437            outWidth, outHeight, startTime, endTime, tnCount);
438
439        assertNotNull("Thumbnail Retrived is Null", thumbNailBmp);
440        assertEquals("Thumbnail Count", tnCount, thumbNailBmp.length);
441        for (int i = 0; i < thumbNailBmp.length; i++) {
442            validateThumbnail(thumbNailBmp[i], outWidth, outHeight);
443            thumbNailBmp[i] = null;
444        }
445    }
446
447    /**
448     *To test ThumbnailList for H264 VGA
449     */
450    @LargeTest
451    public void testThumbnailListH264VGA() throws Exception {
452        final String videoItemFilename = INPUT_FILE_PATH +
453            "H264_BP_640x480_30fps_256kbps_1_17.mp4";
454        final int tnCount = 10;
455        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
456        final MediaVideoItem mediaVideoItem =
457            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
458                videoItemFilename, renderingMode);
459
460        final int outWidth = mediaVideoItem.getWidth() / 2;
461        final int outHeight = mediaVideoItem.getHeight() / 2;
462        final long startTime = mediaVideoItem.getDuration() / 3;
463        final long endTime = mediaVideoItem.getDuration() / 2;
464
465        final Bitmap thumbNailBmp[] = mediaVideoItem.getThumbnailList(
466            outWidth, outHeight, startTime, endTime, tnCount);
467        assertNotNull("Thumbnail Retrived is Null", thumbNailBmp);
468        assertEquals("Thumbnail Count", tnCount, thumbNailBmp.length);
469        for (int i = 0; i < thumbNailBmp.length; i++) {
470            validateThumbnail(thumbNailBmp[i], outWidth, outHeight);
471            thumbNailBmp[i] = null;
472        }
473    }
474
475    /**
476     *To test ThumbnailList for H264 WVGA
477     */
478    @LargeTest
479    public void testThumbnailListH264WVGA() throws Exception {
480        final String videoItemFilename = INPUT_FILE_PATH +
481            "H264_BP_800x480_15fps_512kbps_AACLC_24KHz_38Kbps_s_1_17.mp4";
482        final int tnCount = 10;
483        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
484        final MediaVideoItem mediaVideoItem =
485            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
486                videoItemFilename, renderingMode);
487
488        final int outWidth = mediaVideoItem.getWidth() / 2;
489        final int outHeight = mediaVideoItem.getHeight() / 2;
490        final long startTime = mediaVideoItem.getDuration() / 3;
491        final long endTime = mediaVideoItem.getDuration() / 2;
492
493        final Bitmap thumbNailBmp[] = mediaVideoItem.getThumbnailList(
494            outWidth, outHeight, startTime, endTime, tnCount);
495        assertNotNull("Thumbnail Retrived is Null", thumbNailBmp);
496        assertEquals("Thumbnail Count", tnCount, thumbNailBmp.length);
497        for (int i = 0; i < thumbNailBmp.length; i++) {
498            validateThumbnail(thumbNailBmp[i], outWidth, outHeight);
499            thumbNailBmp[i] = null;
500        }
501    }
502
503    /**
504     *To test ThumbnailList for H264 VGA ,Time exceeding file duration
505     */
506    @LargeTest
507    public void testThumbnailH264VGAExceedingFileDuration() throws Exception {
508        final String videoItemFilename = INPUT_FILE_PATH +
509            "H264_BP_640x480_30fps_256kbps_1_17.mp4";
510        boolean flagForException = false;
511        int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
512
513        try {
514            final MediaVideoItem mediaVideoItem =
515                mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
516                    videoItemFilename, renderingMode);
517            final int outWidth = mediaVideoItem.getWidth() / 2;
518            final int outHeight = mediaVideoItem.getHeight() / 2;
519            final long atTime = mediaVideoItem.getDuration() + 2000;
520            mediaVideoItem.getThumbnail(outWidth, outHeight, atTime);
521        } catch (IllegalArgumentException e) {
522            flagForException = true;
523        }
524        assertTrue("Exception in Extracting thumbanil with Invalid Time",
525            flagForException);
526    }
527
528    /**
529     *To test ThumbnailList for VGA Image
530     */
531    @LargeTest
532    public void testThumbnailListVGAImage() throws Exception {
533        final String imageItemFilename = INPUT_FILE_PATH + "IMG_640x480.jpg";
534        final int imageItemDuration = 10000;
535        final int startTime = 0;
536        final int endTime = 0;
537        final int tnCount = 10;
538        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
539
540        final MediaImageItem mediaImageItem =
541            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
542                imageItemFilename, imageItemDuration, renderingMode);
543        final int outWidth = mediaImageItem.getWidth() / 2;
544        final int outHeight = mediaImageItem.getHeight() / 2;
545
546        final Bitmap thumbNailBmp[] = mediaImageItem.getThumbnailList
547            (outWidth, outHeight, startTime, endTime, tnCount);
548        assertNotNull("Thumbnail Retrived is Null", thumbNailBmp);
549        assertEquals("Thumbnail Count", tnCount, thumbNailBmp.length);
550        for (int i = 0; i < thumbNailBmp.length; i++) {
551            validateThumbnail(thumbNailBmp[i], outWidth, outHeight);
552            thumbNailBmp[i] = null;
553        }
554    }
555
556    /**
557     *To test ThumbnailList for Invalid file path
558     */
559    @LargeTest
560    public void testThumbnailForInvalidFilePath() throws Exception {
561        final String imageItemFileName = INPUT_FILE_PATH + "/sdcard/abc.jpg";
562        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
563        boolean flagForException = false;
564        try{
565        final MediaImageItem mii = new MediaImageItem(mVideoEditor, "m1",
566            imageItemFileName, 3000, renderingMode);
567        } catch (IllegalArgumentException e) {
568            flagForException = true;
569        } catch (IOException e) {
570            flagForException = true;
571        }
572        assertTrue(" Invalid File Path", flagForException);
573    }
574
575    /**
576     * To test thumbnail / frame extraction with setBoundaries
577     */
578    @LargeTest
579    public void testThumbnailForMPEG4WVGAWithSetBoundaries() throws Exception {
580        final String videoItemFilename = INPUT_FILE_PATH +
581            "MPEG4_SP_800x480_515kbps_15fps_AMR_NB_8KHz_12.2kbps_m_0_26.mp4";
582        final int atTime = 10000;
583        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
584        final MediaVideoItem mediaVideoItem =
585            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
586                videoItemFilename, renderingMode);
587
588        mediaVideoItem.setExtractBoundaries(1000,
589            (mediaVideoItem.getDuration() - 21000));
590
591        final int outWidth = (mediaVideoItem.getWidth() / 2);
592        final int outHeight = (mediaVideoItem.getHeight() / 2);
593        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail(outWidth,
594            outHeight, atTime);
595        validateThumbnail(thumbNailBmp, outWidth, outHeight);
596    }
597
598    /**
599     *To test ThumbnailList for H264 WVGA with setExtractboundaries
600     */
601    @LargeTest
602    public void testThumbnailListForH264WVGAWithSetBoundaries() throws Exception {
603        final String videoItemFilename = INPUT_FILE_PATH +
604            "H264_BP_800x480_15fps_512kbps_1_17.mp4";
605        final int thumbNailStartTime = 10000;
606        final int thumbNailEndTime = 12000;
607        final int tnCount = 10;
608        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
609        final MediaVideoItem mediaVideoItem =
610            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
611                videoItemFilename, renderingMode);
612
613        final int outWidth = (mediaVideoItem.getWidth() / 2);
614        final int outHeight = (mediaVideoItem.getHeight() / 2);
615
616        mediaVideoItem.setExtractBoundaries(10000, 12000);
617
618        final Bitmap thumbNailBmp[] = mediaVideoItem.getThumbnailList
619            (outWidth, outHeight, thumbNailStartTime, thumbNailEndTime,
620             tnCount);
621        assertNotNull("Thumbnail Retrived is Null", thumbNailBmp);
622        assertTrue("Thumbnail Size", (thumbNailBmp.length > 0) ? true : false);
623        for (int i = 0; i < thumbNailBmp.length; i++) {
624            validateThumbnail(thumbNailBmp[i], outWidth, outHeight);
625            thumbNailBmp[i] = null;
626        }
627    }
628
629    /**
630     *To test ThumbnailList for H264 WVGA with count > frame available
631     */
632    @LargeTest
633    public void testThumbnailListForH264WVGAWithCount() throws Exception {
634        final String videoItemFilename = INPUT_FILE_PATH +
635            "H264_BP_800x480_15fps_512kbps_AACLC_24KHz_38Kbps_s_1_17.mp4";
636        final int tnCount = 70;
637        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
638        final MediaVideoItem mediaVideoItem =
639            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
640                videoItemFilename, renderingMode);
641
642        final int outWidth = (mediaVideoItem.getWidth() / 2);
643        final int outHeight = (mediaVideoItem.getHeight() / 2);
644        final long thumbNailStartTime = mediaVideoItem.getDuration() / 2;
645        final long thumbNailEndTime = thumbNailStartTime + 4000;
646        Bitmap thumbNailBmp[] = null;
647        boolean flagForException = false;
648        try{
649            thumbNailBmp = mediaVideoItem.getThumbnailList(outWidth, outHeight,
650                thumbNailStartTime, thumbNailEndTime, tnCount);
651        }catch (Exception e){
652            assertTrue("Unable to get Thumbnail list", flagForException);
653        }
654        if (thumbNailBmp.length <= tnCount) {
655            flagForException = true;
656        }
657        assertTrue("Thumbnail count more than asked", flagForException);
658    }
659
660    /**
661     *To test ThumbnailList for H264 WVGA with startTime > End Time
662     */
663    @LargeTest
664    public void testThumbnailListH264WVGAWithStartGreaterEnd() throws Exception {
665        final String videoItemFilename = INPUT_FILE_PATH +
666            "H264_BP_800x480_15fps_512kbps_AACLC_24KHz_38Kbps_s_1_17.mp4";
667        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
668        final int tnCount = 10;
669        boolean flagForException = false;
670        final MediaVideoItem mediaVideoItem =
671            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
672                videoItemFilename, renderingMode);
673        final int outWidth = (mediaVideoItem.getWidth() / 2);
674        final int outHeight = (mediaVideoItem.getHeight() / 2);
675        final long thumbNailStartTime = mediaVideoItem.getDuration() / 2;
676        final long thumbNailEndTime = thumbNailStartTime - 1000;
677        try{
678            mediaVideoItem.getThumbnailList(outWidth, outHeight,
679                thumbNailStartTime, thumbNailEndTime, tnCount);
680        } catch (IllegalArgumentException e) {
681            flagForException = true;
682        }
683        assertTrue("Thumbnail Extraction where start time > end time",
684            flagForException);
685    }
686
687    /**
688     *To test ThumbnailList for H264 WVGA with startTime = End Time
689     */
690    @LargeTest
691    public void testThumbnailListH264WVGAWithStartEqualEnd() throws Exception {
692        final String videoItemFilename = INPUT_FILE_PATH +
693            "H264_BP_800x480_15fps_512kbps_AACLC_24KHz_38Kbps_s_1_17.mp4";
694        final int tnCount = 1;
695        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
696
697        final MediaVideoItem mediaVideoItem =
698            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
699                videoItemFilename, renderingMode);
700        final int outWidth = (mediaVideoItem.getWidth() / 2);
701        final int outHeight = (mediaVideoItem.getHeight() / 2);
702        final long thumbNailStartTime = mediaVideoItem.getDuration() / 2;
703        final long thumbNailEndTime = thumbNailStartTime;
704        final Bitmap thumbNailBmp[] = mediaVideoItem.getThumbnailList(outWidth,
705            outHeight, thumbNailStartTime, thumbNailEndTime, tnCount);
706        assertNotNull("Thumbnail Retrived is Null", thumbNailBmp);
707        assertEquals("Thumbnail Count", tnCount, thumbNailBmp.length);
708        for (int i = 0; i < thumbNailBmp.length; i++) {
709            validateThumbnail(thumbNailBmp[i], outWidth, outHeight);
710            thumbNailBmp[i] = null;
711        }
712    }
713
714    /**
715     *To test ThumbnailList for file where video duration is less
716     * than file duration.
717     */
718    @LargeTest
719    public void testThumbnailForVideoDurationLessFileDuration() throws Exception {
720        final String videoItemFilename = INPUT_FILE_PATH
721            + "H264_BP_640x480_15fps_1200Kbps_AACLC_48KHz_64kps_m_0_27.3gp";
722        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
723            final MediaVideoItem mediaVideoItem =
724                mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
725                    videoItemFilename, renderingMode);
726            final int outWidth = (mediaVideoItem.getWidth() / 2);
727            final int outHeight = (mediaVideoItem.getHeight() / 2);
728            final long atTime = mediaVideoItem.getDuration() - 2000;
729            final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail (outWidth,
730                outHeight, atTime);
731        validateThumbnail(thumbNailBmp, outWidth, outHeight);
732
733    }
734
735    /**
736     *To test ThumbnailList for file which has video part corrupted
737     */
738    @LargeTest
739    public void testThumbnailWithCorruptedVideoPart() throws Exception {
740        final String videoItemFilename = INPUT_FILE_PATH +
741            "corrupted_H264_BP_640x480_12.5fps_256kbps_AACLC_16khz_24kbps_s_0_26.mp4";
742        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
743        boolean flagForException = false;
744
745        try {
746            final MediaVideoItem mediaVideoItem =
747                 mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
748                    videoItemFilename, renderingMode);
749            final int outWidth = mediaVideoItem.getWidth();
750            final int outHeight = mediaVideoItem.getHeight() * 2;
751            final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail
752                (outWidth, outHeight, mediaVideoItem.getDuration()/2);
753        } catch (IllegalArgumentException e) {
754            flagForException = true;
755        }
756        assertTrue("Corrupted File cannot be read", flagForException);
757    }
758
759    /**
760     * Check the thumbnail / frame list extraction for Height as Negative Value
761     */
762    @LargeTest
763    public void testThumbnailWithNegativeHeight() throws Exception {
764        final String videoItemFilename = INPUT_FILE_PATH
765            + "MPEG4_SP_176x144_30fps_256kbps_AACLC_44.1kHz_96kbps_s_1_17.3gp";
766        final int tnCount = 10;
767        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
768        boolean flagForException = false;
769        try {
770            final MediaVideoItem mediaVideoItem =
771                mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
772                    videoItemFilename, renderingMode);
773            final int outWidth = (mediaVideoItem.getWidth() / 2);
774            final int outHeight = -1;
775            final long thumbNailStartTime =
776                mediaVideoItem.getBoundaryBeginTime()/2;
777            final long thumbNailEndTime = mediaVideoItem.getBoundaryEndTime();
778            mediaVideoItem.getThumbnailList(outWidth, outHeight,
779                thumbNailStartTime, thumbNailEndTime, tnCount);
780        } catch (IllegalArgumentException e) {
781            flagForException = true;
782        }
783        assertTrue("Thumbnail List with negative Height", flagForException);
784    }
785
786    /**
787     * Check the thumbnail for Height as Zero
788     */
789    @LargeTest
790    public void testThumbnailWithHeightAsZero() throws Exception {
791        final String videoItemFilename = INPUT_FILE_PATH
792            + "MPEG4_SP_176x144_30fps_256kbps_AACLC_44.1kHz_96kbps_s_1_17.3gp";
793        final int atTime = 100;
794        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
795        boolean flagForException = false;
796        try {
797            final MediaVideoItem mediaVideoItem =
798                mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
799                    videoItemFilename, renderingMode);
800            final int outWidth = (mediaVideoItem.getWidth() / 2);
801            final int outHeight = -1;
802            mediaVideoItem.getThumbnail(outWidth, outHeight, atTime);
803        } catch (IllegalArgumentException e) {
804            flagForException = true;
805        }
806        assertTrue("Thumbnail List with Zero Height", flagForException);
807    }
808
809    /**
810     * Check the thumbnail for Height = 10
811     */
812    @LargeTest
813    public void testThumbnailWithHeight() throws Exception {
814        final String videoItemFilename = INPUT_FILE_PATH
815            + "MPEG4_SP_176x144_30fps_256kbps_AACLC_44.1kHz_96kbps_s_1_17.3gp";
816        final int atTime = 1000;
817        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
818            final MediaVideoItem mediaVideoItem =
819                mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
820                    videoItemFilename, renderingMode);
821            final int outWidth = (mediaVideoItem.getWidth() / 2);
822            final int outHeight = 10;
823            final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail (outWidth,
824                outHeight, atTime);
825        validateThumbnail(thumbNailBmp, outWidth, outHeight);
826    }
827
828    /**
829     * Check the thumbnail / frame list extraction for Width as Negative Value
830     */
831    @LargeTest
832    public void testThumbnailWithNegativeWidth() throws Exception {
833        final String videoItemFilename = INPUT_FILE_PATH
834            + "MPEG4_SP_176x144_30fps_256kbps_AACLC_44.1kHz_96kbps_s_1_17.3gp";
835        final int tnCount = 10;
836        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
837        boolean flagForException = false;
838        try {
839            final MediaVideoItem mediaVideoItem =
840                mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
841                    videoItemFilename, renderingMode);
842            final int outWidth = -1;
843            final int outHeight = mediaVideoItem.getHeight();
844            final long thumbNailStartTime =
845                mediaVideoItem.getBoundaryBeginTime()/2;
846            final long thumbNailEndTime = mediaVideoItem.getBoundaryEndTime();
847            mediaVideoItem.getThumbnailList(outWidth, outHeight, thumbNailStartTime,
848                thumbNailEndTime, tnCount);
849        } catch (IllegalArgumentException e) {
850            flagForException = true;
851        }
852        assertTrue("Thumbnail List with negative Height", flagForException);
853    }
854
855    /**
856     * Check the thumbnail / frame list extraction for Width zero
857     */
858    @LargeTest
859    public void testThumbnailWithWidthAsZero() throws Exception {
860        final String videoItemFilename = INPUT_FILE_PATH
861            + "MPEG4_SP_176x144_30fps_256kbps_AACLC_44.1kHz_96kbps_s_1_17.3gp";
862        final int atTime = 1000;
863        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
864        boolean flagForException = false;
865        try {
866            final MediaVideoItem mediaVideoItem =
867                mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
868                    videoItemFilename, renderingMode);
869            final int outWidth = 0;
870            final int outHeight = mediaVideoItem.getHeight() / 2;
871            mediaVideoItem.getThumbnail(outWidth, outHeight, atTime);
872        } catch (IllegalArgumentException e) {
873            flagForException = true;
874        }
875        assertTrue("Thumbnail List with Zero Width", flagForException);
876    }
877
878    /**
879     * Check the thumbnail for Width = 10
880     */
881    @LargeTest
882    public void testThumbnailWithWidth() throws Exception {
883        final String videoItemFilename = INPUT_FILE_PATH
884            + "MPEG4_SP_176x144_30fps_256kbps_AACLC_44.1kHz_96kbps_s_1_17.3gp";
885        final int atTime = 1000;
886        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
887        final MediaVideoItem mediaVideoItem =
888            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
889                videoItemFilename, renderingMode);
890        final int outWidth = 10;
891        final int outHeight = mediaVideoItem.getHeight();
892        final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail (outWidth,
893            outHeight, atTime);
894        validateThumbnail(thumbNailBmp, outWidth, outHeight);
895    }
896
897    /**
898     * To test thumbnail / frame extraction on MPEG4 (time beyond file duration).
899     */
900    @LargeTest
901    public void testThumbnailMPEG4withMorethanFileDuration() throws Exception {
902        final String videoItemFilename = INPUT_FILE_PATH
903            + "MPEG4_SP_176x144_30fps_256kbps_AACLC_44.1kHz_96kbps_s_1_17.3gp";
904        boolean flagForException = false;
905        final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
906        final MediaVideoItem mediaVideoItem =
907            mVideoEditorHelper.createMediaItem(mVideoEditor, "m1",
908                videoItemFilename, renderingMode);
909        final int outWidth =  mediaVideoItem.getWidth()/2;
910        final int outHeight =  mediaVideoItem.getHeight()/2;
911        final long atTime = mediaVideoItem.getDuration() + 100;
912        try{
913            final Bitmap thumbNailBmp = mediaVideoItem.getThumbnail (outWidth,
914            outHeight, atTime);
915        } catch (IllegalArgumentException e) {
916            flagForException = true;
917        }
918        assertTrue("Thumbnail duration is more than file duration",
919            flagForException);
920    }
921}
922