1 /*
2  * Copyright (C) 2008 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 package com.android.mediaframeworktest.functional;
18 
19 import android.media.MediaMetadataRetriever;
20 import android.test.AndroidTestCase;
21 import android.test.suitebuilder.annotation.MediumTest;
22 import android.util.Log;
23 
24 import com.android.mediaframeworktest.MediaNames;
25 import com.android.mediaframeworktest.MediaProfileReader;
26 
27 import java.io.IOException;
28 
29 /** This metadata test suite test the basic functionality of the MediaMetadataRetriever */
30 public class MediaMetadataTest extends AndroidTestCase {
31 
32     private static final String TAG = "MediaMetadataTest";
33 
34     public enum METADATA_EXPECTEDRESULT {
35         FILE_PATH,
36         CD_TRACK,
37         ALBUM,
38         ARTIST,
39         AUTHOR,
40         COMPOSER,
41         DATE,
42         GENRE,
43         TITLE,
44         YEAR,
45         DURATION,
46         NUM_TRACKS,
47         WRITER
48     }
49 
50     public enum MP3_TEST_FILE {
51         ID3V1V2,
52         ID3V2,
53         ID3V1
54     }
55 
56     public static METADATA_EXPECTEDRESULT meta;
57     public static MP3_TEST_FILE mp3_test_file;
58 
59     @MediumTest
testID3V1V2Metadata()60     public static void testID3V1V2Metadata() throws Exception {
61         validateMetatData(mp3_test_file.ID3V1V2.ordinal(), MediaNames.META_DATA_MP3);
62     }
63 
64     @MediumTest
testID3V2Metadata()65     public static void testID3V2Metadata() throws Exception {
66         validateMetatData(mp3_test_file.ID3V2.ordinal(), MediaNames.META_DATA_MP3);
67     }
68 
69     @MediumTest
testID3V1Metadata()70     public static void testID3V1Metadata() throws Exception {
71         validateMetatData(mp3_test_file.ID3V1.ordinal(), MediaNames.META_DATA_MP3);
72     }
73 
validateMetatData(int fileIndex, String[][] metadataFile)74     private static void validateMetatData(int fileIndex, String[][] metadataFile)
75             throws IOException {
76         Log.v(TAG, "filePath = " + metadataFile[fileIndex][0]);
77         if ((metadataFile[fileIndex][0].endsWith("wma") && !MediaProfileReader.getWMAEnable())
78                 || (metadataFile[fileIndex][0].endsWith("wmv")
79                         && !MediaProfileReader.getWMVEnable())) {
80             return;
81         }
82         String value = null;
83         MediaMetadataRetriever retriever = new MediaMetadataRetriever();
84         try {
85             retriever.setDataSource(metadataFile[fileIndex][0]);
86         } catch (Exception e) {
87             Log.v(TAG, "Failed: " + metadataFile[fileIndex][0] + " " + e.toString());
88             // Set the test case failure whenever it failed to setDataSource
89             assertTrue("Failed to setDataSource ", false);
90         }
91 
92         // METADATA_KEY_CD_TRACK_NUMBER should return the TCRK value
93         value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER);
94         Log.v(TAG, "CD_TRACK_NUMBER : " + value);
95         assertEquals(TAG, metadataFile[fileIndex][meta.CD_TRACK.ordinal()], value);
96 
97         value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
98         Log.v(TAG, "Album : " + value);
99         assertEquals(TAG, metadataFile[fileIndex][meta.ALBUM.ordinal()], value);
100 
101         value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
102         Log.v(TAG, "Artist : " + value);
103         assertEquals(TAG, metadataFile[fileIndex][meta.ARTIST.ordinal()], value);
104 
105         value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_AUTHOR);
106         Log.v(TAG, "Author : " + value);
107         assertEquals(TAG, metadataFile[fileIndex][meta.AUTHOR.ordinal()], value);
108 
109         value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COMPOSER);
110         Log.v(TAG, "Composer : " + value);
111         assertEquals(TAG, metadataFile[fileIndex][meta.COMPOSER.ordinal()], value);
112 
113         value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE);
114         Log.v(TAG, "Date : " + value);
115         assertEquals(TAG, metadataFile[fileIndex][meta.DATE.ordinal()], value);
116 
117         value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE);
118         Log.v(TAG, "Genre : " + value);
119         assertEquals(TAG, metadataFile[fileIndex][meta.GENRE.ordinal()], value);
120 
121         value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
122         Log.v(TAG, "Title : " + value);
123         assertEquals(TAG, metadataFile[fileIndex][meta.TITLE.ordinal()], value);
124 
125         value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR);
126         Log.v(TAG, "Year : " + value);
127         assertEquals(TAG, metadataFile[fileIndex][meta.YEAR.ordinal()], value);
128 
129         value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
130         Log.v(
131                 TAG,
132                 "Expected = "
133                         + metadataFile[fileIndex][meta.DURATION.ordinal()]
134                         + "reult = "
135                         + value);
136         // Only require that the returned duration is within 100ms of the expected
137         // one as PV and stagefright differ slightly in their implementation.
138         int durationDifferenceMs =
139                 Math.abs(
140                         Integer.parseInt(metadataFile[fileIndex][meta.DURATION.ordinal()])
141                                 - Integer.parseInt(value));
142         assertTrue(TAG, durationDifferenceMs < 100);
143 
144         // METADATA_KEY_NUM_TRACKS should return the total number of tracks in the media
145         // include the video and audio
146         value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS);
147         Log.v(TAG, "Track : " + value);
148         assertEquals(TAG, metadataFile[fileIndex][meta.NUM_TRACKS.ordinal()], value);
149 
150         value = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_WRITER);
151         Log.v(TAG, "Writer : " + value);
152         assertEquals(TAG, metadataFile[fileIndex][meta.WRITER.ordinal()], value);
153 
154         retriever.release();
155     }
156 }
157