19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.mediaframeworktest.unit;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaMetadataRetriever;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.AndroidTestCase;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.mediaframeworktest.MediaNames;
2538b03a76616edffabb97f4131e268c701dffb00fJames Dongimport com.android.mediaframeworktest.MediaProfileReader;
263e7b3c0f270d2bf86fb701a94e55cb135480d571Yu Shan Emily Lauimport android.test.suitebuilder.annotation.*;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WARNING:
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Currently, captureFrame() does not work, due to hardware access permission problem.
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We are currently only testing the metadata/album art retrieval features.
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MediaMetadataRetrieverTest extends AndroidTestCase {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG         = "MediaMetadataRetrieverTest";
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Test album art extraction.
383e7b3c0f270d2bf86fb701a94e55cb135480d571Yu Shan Emily Lau    @MediumTest
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void testAlbumArt() throws Exception {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "testAlbumArt starts.");
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
421b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        boolean supportWMA = MediaProfileReader.getWMAEnable();
43454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        boolean hasFailed = false;
441b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        boolean supportWMV = MediaProfileReader.getWMVEnable();
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0, n = MediaNames.ALBUMART_TEST_FILES.length; i < n; ++i) {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "File " + i + ": " + MediaNames.ALBUMART_TEST_FILES[i]);
4938b03a76616edffabb97f4131e268c701dffb00fJames Dong                if ((MediaNames.ALBUMART_TEST_FILES[i].endsWith(".wma") && !supportWMA) ||
5038b03a76616edffabb97f4131e268c701dffb00fJames Dong                    (MediaNames.ALBUMART_TEST_FILES[i].endsWith(".wmv") && !supportWMV)
5138b03a76616edffabb97f4131e268c701dffb00fJames Dong                   ) {
5238b03a76616edffabb97f4131e268c701dffb00fJames Dong                    Log.v(TAG, "windows media is not supported and thus we will skip the test for this file");
5338b03a76616edffabb97f4131e268c701dffb00fJames Dong                    continue;
5438b03a76616edffabb97f4131e268c701dffb00fJames Dong                }
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                retriever.setDataSource(MediaNames.ALBUMART_TEST_FILES[i]);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] albumArt = retriever.extractAlbumArt();
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // TODO:
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // A better test would be to compare the retrieved album art with the
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // known result.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (albumArt == null) {  // Do we have expect in JUnit?
62454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                    Log.e(TAG, "Fails to extract album art for " + MediaNames.ALBUMART_TEST_FILES[i]);
63454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                    hasFailed = true;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch(Exception e) {
66454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                Log.e(TAG, "Fails to setDataSource for " + MediaNames.ALBUMART_TEST_FILES[i]);
67454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                hasFailed = true;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.yield();  // Don't be evil
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.release();
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "testAlbumArt completes.");
73454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        assertTrue(!hasFailed);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Test frame capture
77525ad18663bdac0b378f5ae1db4de66ca71d907eJames Dong    @LargeTest
78525ad18663bdac0b378f5ae1db4de66ca71d907eJames Dong    public static void testThumbnailCapture() throws Exception {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
801b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        boolean supportWMA = MediaProfileReader.getWMAEnable();
811b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        boolean supportWMV = MediaProfileReader.getWMVEnable();
82454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        boolean hasFailed = false;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "Thumbnail processing starts");
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long startedAt = System.currentTimeMillis();
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0, n = MediaNames.THUMBNAIL_CAPTURE_TEST_FILES.length; i < n; ++i) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "File " + i + ": " + MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]);
8838b03a76616edffabb97f4131e268c701dffb00fJames Dong                if ((MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i].endsWith(".wma") && !supportWMA) ||
8938b03a76616edffabb97f4131e268c701dffb00fJames Dong                    (MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i].endsWith(".wmv") && !supportWMV)
9038b03a76616edffabb97f4131e268c701dffb00fJames Dong                   ) {
9138b03a76616edffabb97f4131e268c701dffb00fJames Dong                    Log.v(TAG, "windows media is not supported and thus we will skip the test for this file");
9238b03a76616edffabb97f4131e268c701dffb00fJames Dong                    continue;
9338b03a76616edffabb97f4131e268c701dffb00fJames Dong                }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                retriever.setDataSource(MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Bitmap bitmap = retriever.captureFrame();
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assertTrue(bitmap != null);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    java.io.OutputStream stream = new FileOutputStream(MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i] + ".jpg");
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bitmap.compress(Bitmap.CompressFormat.JPEG, 75, stream);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    stream.close();
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (Exception e) {
102454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                    Log.e(TAG, "Fails to convert the bitmap to a JPEG file for " + MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]);
103454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                    hasFailed = true;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch(Exception e) {
106454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                Log.e(TAG, "Fails to setDataSource for file " + MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]);
107454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                hasFailed = true;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.yield();  // Don't be evil
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long endedAt = System.currentTimeMillis();
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.release();
113454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        assertTrue(!hasFailed);
114454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        Log.v(TAG, "Average processing time per thumbnail: " + (endedAt - startedAt)/MediaNames.THUMBNAIL_CAPTURE_TEST_FILES.length + " ms");
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void testMetadataRetrieval() throws Exception {
1191b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        boolean supportWMA = MediaProfileReader.getWMAEnable();
1201b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        boolean supportWMV = MediaProfileReader.getWMVEnable();
121454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        boolean hasFailed = false;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int i = 0, n = MediaNames.METADATA_RETRIEVAL_TEST_FILES.length; i < n; ++i) {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
12638b03a76616edffabb97f4131e268c701dffb00fJames Dong                Log.v(TAG, "File " + i + ": " + MediaNames.METADATA_RETRIEVAL_TEST_FILES[i]);
12738b03a76616edffabb97f4131e268c701dffb00fJames Dong                if ((MediaNames.METADATA_RETRIEVAL_TEST_FILES[i].endsWith(".wma") && !supportWMA) ||
12838b03a76616edffabb97f4131e268c701dffb00fJames Dong                    (MediaNames.METADATA_RETRIEVAL_TEST_FILES[i].endsWith(".wmv") && !supportWMV)
12938b03a76616edffabb97f4131e268c701dffb00fJames Dong                   ) {
13038b03a76616edffabb97f4131e268c701dffb00fJames Dong                    Log.v(TAG, "windows media is not supported and thus we will skip the test for this file");
13138b03a76616edffabb97f4131e268c701dffb00fJames Dong                    continue;
13238b03a76616edffabb97f4131e268c701dffb00fJames Dong                }
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                retriever.setDataSource(MediaNames.METADATA_RETRIEVAL_TEST_FILES[i]);
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                extractAllSupportedMetadataValues(retriever);
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch(Exception e) {
136454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                Log.e(TAG, "Fails to setDataSource for file " + MediaNames.METADATA_RETRIEVAL_TEST_FILES[i]);
137454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                hasFailed = true;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.yield();  // Don't be evil
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.release();
142454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        assertTrue(!hasFailed);
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If the specified call order and valid media file is used, no exception
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // should be thrown.
1473e7b3c0f270d2bf86fb701a94e55cb135480d571Yu Shan Emily Lau    @MediumTest
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void testBasicNormalMethodCallSequence() throws Exception {
149454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        boolean hasFailed = false;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            retriever.setDataSource(MediaNames.TEST_PATH_1);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /*
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * captureFrame() fails due to lack of permission to access hardware decoder devices
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bitmap bitmap = retriever.captureFrame();
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertTrue(bitmap != null);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                java.io.OutputStream stream = new FileOutputStream("/sdcard/thumbnailout.jpg");
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bitmap.compress(Bitmap.CompressFormat.JPEG, 75, stream);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stream.close();
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new Exception("Fails to convert the bitmap to a JPEG file for " + MediaNames.TEST_PATH_1, e);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            extractAllSupportedMetadataValues(retriever);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(Exception e) {
168454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            Log.e(TAG, "Fails to setDataSource for " + MediaNames.TEST_PATH_1, e);
169454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            hasFailed = true;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.release();
172454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        assertTrue(!hasFailed);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If setDataSource() has not been called, both captureFrame() and extractMetadata() must
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // return null.
1773e7b3c0f270d2bf86fb701a94e55cb135480d571Yu Shan Emily Lau    @MediumTest
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void testBasicAbnormalMethodCallSequence() {
179454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        boolean hasFailed = false;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
182454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        if (retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM) != null) {
183454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            Log.e(TAG, "No album metadata expected, but is available");
184454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            hasFailed = true;
185454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        }
186454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        if (retriever.captureFrame() != null) {
187454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            Log.e(TAG, "No frame expected, but is available");
188454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            hasFailed = true;
189454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        }
190454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        assertTrue(!hasFailed);
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Test setDataSource()
1943e7b3c0f270d2bf86fb701a94e55cb135480d571Yu Shan Emily Lau    @MediumTest
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void testSetDataSource() {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
198454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        boolean hasFailed = false;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Null pointer argument
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String path = null;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            retriever.setDataSource(path);
204454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            Log.e(TAG, "IllegalArgumentException failed to be thrown.");
205454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            hasFailed = true;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(Exception e) {
207454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            if (!(e instanceof IllegalArgumentException)) {
208454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                Log.e(TAG, "Expected a IllegalArgumentException, but got a different exception");
209454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                hasFailed = true;
210454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Use mem:// path
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            retriever.setDataSource(MediaNames.TEST_PATH_5);
216454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            Log.e(TAG, "IllegalArgumentException failed to be thrown.");
217454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            hasFailed = true;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(Exception e) {
219454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            if (!(e instanceof IllegalArgumentException)) {
220454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                Log.e(TAG, "Expected a IllegalArgumentException, but got a different exception");
221454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                hasFailed = true;
222454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            }
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The pathname does not correspond to any existing file
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            retriever.setDataSource(MediaNames.TEST_PATH_4);
228454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            Log.e(TAG, "RuntimeException failed to be thrown.");
229454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            hasFailed = true;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(Exception e) {
231454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            if (!(e instanceof RuntimeException)) {
232454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                Log.e(TAG, "Expected a RuntimeException, but got a different exception");
233454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                hasFailed = true;
234454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The pathname does correspond to a file, but this file
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // is not a valid media file
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            retriever.setDataSource(MediaNames.TEST_PATH_3);
241454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            Log.e(TAG, "RuntimeException failed to be thrown.");
242454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            hasFailed = true;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(Exception e) {
244454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            if (!(e instanceof RuntimeException)) {
245454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                Log.e(TAG, "Expected a RuntimeException, but got a different exception");
246454f69c84c294b8e0875788653a9c7d4fd80b233James Dong                hasFailed = true;
247454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.release();
251454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        assertTrue(!hasFailed);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Due to the lack of permission to access hardware decoder, any calls
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // attempting to capture a frame will fail. These are commented out for now
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // until we find a solution to this access permission problem.
2573e7b3c0f270d2bf86fb701a94e55cb135480d571Yu Shan Emily Lau    @MediumTest
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void testIntendedUsage() {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // By default, capture frame and retrieve metadata
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
261454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        boolean hasFailed = false;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // retriever.setDataSource(MediaNames.TEST_PATH_1);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // assertTrue(retriever.captureFrame() != null);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null);
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do not capture frame or retrieve metadata
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY & MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.setDataSource(MediaNames.TEST_PATH_1);
269454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        if (retriever.captureFrame() != null) {
270454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            Log.e(TAG, "No frame expected, but is available");
271454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            hasFailed = true;
272454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        }
273454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        if (retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null) {
274454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            Log.e(TAG, "No num track metadata expected, but is available");
275454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            hasFailed = true;
276454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Capture frame only
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // retriever.setDataSource(MediaNames.TEST_PATH_1);
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) == null);
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Retriever metadata only
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.setDataSource(MediaNames.TEST_PATH_1);
286454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        if (retriever.captureFrame() != null) {
287454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            Log.e(TAG, "No frame expected, but is available");
288454f69c84c294b8e0875788653a9c7d4fd80b233James Dong            hasFailed = true;
289454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Capture frame and retrieve metadata
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY | MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // retriever.setDataSource(MediaNames.TEST_PATH_1);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // assertTrue(retriever.captureFrame() != null);
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.release();
297454f69c84c294b8e0875788653a9c7d4fd80b233James Dong        assertTrue(!hasFailed);
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO:
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Encode and test for the correct mix of metadata elements on a per-file basis?
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // We should be able to compare the actual returned metadata with the expected metadata
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // with each given sample test file.
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void extractAllSupportedMetadataValues(MediaMetadataRetriever retriever) {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String value = null;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, (value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER)) == null? "not found": value);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, (value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)) == null? "not found": value);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, (value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS)) == null? "not found": value);
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, (value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM)) == null? "not found": value);
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, (value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST)) == null? "not found": value);
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, (value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_AUTHOR)) == null? "not found": value);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, (value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COMPOSER)) == null? "not found": value);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, (value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE)) == null? "not found": value);
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, (value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE)) == null? "not found": value);
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, (value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)) == null? "not found": value);
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, (value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR)) == null? "not found": value);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
319