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.functional;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.MediaMetadataRetriever;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.AndroidTestCase;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.MediumTest;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.Suppress;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.mediaframeworktest.MediaNames;
26b1c85ec47a6ee026a5d7ee4c0e683b9cbd6599e5James Dongimport com.android.mediaframeworktest.MediaProfileReader;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This metadata test suite test the basic functionality of the
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * MediaMetadataRetriever
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MediaMetadataTest extends AndroidTestCase {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "MediaMetadataTest";
35b1c85ec47a6ee026a5d7ee4c0e683b9cbd6599e5James Dong
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static enum METADATA_EXPECTEDRESULT{
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FILE_PATH,CD_TRACK, ALBUM,
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ARTIST, AUTHOR, COMPOSER,
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DATE, GENRE, TITLE,
40c9706f0262a2f399f95e0d78ba2b7616e08d0069Sahil Sachdeva        YEAR, DURATION, NUM_TRACKS, WRITER
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static enum MP3_TEST_FILE{
44c4fe54a2385e8e67dcfed6b2c365214ed020d245Yu Shan Emily Lau        ID3V1V2, ID3V2, ID3V1
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static METADATA_EXPECTEDRESULT meta;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static MP3_TEST_FILE mp3_test_file;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void testID3V1V2Metadata() throws Exception {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateMetatData(mp3_test_file.ID3V1V2.ordinal(), MediaNames.META_DATA_MP3);
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void testID3V2Metadata() throws Exception {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateMetatData(mp3_test_file.ID3V2.ordinal(), MediaNames.META_DATA_MP3);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void testID3V1Metadata() throws Exception {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateMetatData(mp3_test_file.ID3V1.ordinal(), MediaNames.META_DATA_MP3);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void validateMetatData(int fileIndex, String meta_data_file[][]) {
66b1c85ec47a6ee026a5d7ee4c0e683b9cbd6599e5James Dong        Log.v(TAG, "filePath = "+ meta_data_file[fileIndex][0]);
67b1c85ec47a6ee026a5d7ee4c0e683b9cbd6599e5James Dong        if ((meta_data_file[fileIndex][0].endsWith("wma") && !MediaProfileReader.getWMAEnable()) ||
68b1c85ec47a6ee026a5d7ee4c0e683b9cbd6599e5James Dong            (meta_data_file[fileIndex][0].endsWith("wmv") && !MediaProfileReader.getWMVEnable())) {
69b1c85ec47a6ee026a5d7ee4c0e683b9cbd6599e5James Dong            return;
70b1c85ec47a6ee026a5d7ee4c0e683b9cbd6599e5James Dong        }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String value = null;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            retriever.setDataSource(meta_data_file[fileIndex][0]);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(Exception e) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "Failed: "+meta_data_file[fileIndex][0] + " " + e.toString());
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Set the test case failure whenever it failed to setDataSource
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertTrue("Failed to setDataSource ", false);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //METADATA_KEY_CD_TRACK_NUMBER should return the TCRK value
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "CD_TRACK_NUMBER : " + value);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(TAG, meta_data_file[fileIndex][meta.CD_TRACK.ordinal()], value);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "Album : "+ value);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(TAG, meta_data_file[fileIndex][meta.ALBUM.ordinal()], value);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "Artist : "+ value);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(TAG, meta_data_file[fileIndex][meta.ARTIST.ordinal()], value);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_AUTHOR);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "Author : "+ value);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(TAG, meta_data_file[fileIndex][meta.AUTHOR.ordinal()], value);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COMPOSER);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "Composer : "+ value);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(TAG, meta_data_file[fileIndex][meta.COMPOSER.ordinal()], value);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "Date : "+ value);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(TAG, meta_data_file[fileIndex][meta.DATE.ordinal()], value);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "Genre : "+ value);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(TAG, meta_data_file[fileIndex][meta.GENRE.ordinal()], value);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "Title : "+ value);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(TAG, meta_data_file[fileIndex][meta.TITLE.ordinal()], value);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "Year : "+ value);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(TAG, meta_data_file[fileIndex][meta.YEAR.ordinal()], value);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "Expected = " + meta_data_file[fileIndex][meta.DURATION.ordinal()] + "reult = " + value);
12006b3ff7d5a7903d6804d295110820c121629ee4dAndreas Huber        // Only require that the returned duration is within 100ms of the expected
12106b3ff7d5a7903d6804d295110820c121629ee4dAndreas Huber        // one as PV and stagefright differ slightly in their implementation.
12206b3ff7d5a7903d6804d295110820c121629ee4dAndreas Huber        assertTrue(TAG, Math.abs(Integer.parseInt(
12306b3ff7d5a7903d6804d295110820c121629ee4dAndreas Huber                        meta_data_file[fileIndex][meta.DURATION.ordinal()])
12406b3ff7d5a7903d6804d295110820c121629ee4dAndreas Huber                            - Integer.parseInt(value)) < 100);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //METADATA_KEY_NUM_TRACKS should return the total number of tracks in the media
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //include the video and audio
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.v(TAG, "Track : "+ value);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(TAG,meta_data_file[fileIndex][meta.NUM_TRACKS.ordinal()], value);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
132c9706f0262a2f399f95e0d78ba2b7616e08d0069Sahil Sachdeva        value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_WRITER);
133c9706f0262a2f399f95e0d78ba2b7616e08d0069Sahil Sachdeva        Log.v(TAG, "Writer : "+ value);
134c9706f0262a2f399f95e0d78ba2b7616e08d0069Sahil Sachdeva        assertEquals(TAG,meta_data_file[fileIndex][meta.WRITER.ordinal()], value);
135c9706f0262a2f399f95e0d78ba2b7616e08d0069Sahil Sachdeva
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        retriever.release();
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
139