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