blob: 80748a90c527fa19f998668fc36ffa3313f104cd [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.media;
import android.graphics.Bitmap;
import android.util.Log;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
/**
Class to hold the media's metadata. Metadata are used
for human consumption and can be embedded in the media (e.g
shoutcast) or available from an external source. The source can be
local (e.g thumbnail stored in the DB) or remote (e.g caption
server).
Metadata is like a Bundle. It is sparse and each key can occur at
most once. The key is an integer and the value is the actual metadata.
The caller is expected to know the type of the metadata and call
the right get* method to fetch its value.
// FIXME: unhide.
{@hide}
*/
public class Metadata
{
// The metadata are keyed using integers rather than more heavy
// weight strings. We considered using Bundle to ship the metadata
// between the native layer and the java layer but dropped that
// option since keeping in sync a native implementation of Bundle
// and the java one would be too burdensome. Besides Bundle uses
// String for its keys.
// The key range [0 8192) is reserved for the system.
//
// We manually serialize the data in Parcels. For large memory
// blob (bitmaps, raw pictures) we use MemoryFile which allow the
// client to make the data purgeable once it is done with it.
//
public static final int ANY = 0; // Never used for metadata returned, only for filtering.
// TODO: Should we use numbers compatible with the metadata retriever?
public static final int TITLE = 1; // String
public static final int COMMENT = 2; // String
public static final int COPYRIGHT = 3; // String
public static final int ALBUM = 4; // String
public static final int ARTIST = 5; // String
public static final int AUTHOR = 6; // String
public static final int COMPOSER = 7; // String
public static final int GENRE = 8; // String
public static final int DATE = 9; // Date
public static final int DURATION = 10; // Integer(millisec)
public static final int CD_TRACK_NUM = 11; // Integer 1-based
public static final int CD_TRACK_MAX = 12; // Integer
public static final int RATING = 13; // String
public static final int ALBUM_ART = 14; // byte[]
public static final int VIDEO_FRAME = 15; // Bitmap
public static final int CAPTION = 16; // TimedText
public static final int BIT_RATE = 17; // Integer, Aggregate rate of
// all the streams in bps.
public static final int AUDIO_BIT_RATE = 18; // Integer, bps
public static final int VIDEO_BIT_RATE = 19; // Integer, bps
public static final int AUDIO_SAMPLE_RATE = 20; // Integer, Hz
public static final int VIDEO_FRAME_RATE = 21; // Integer, Hz
// See RFC2046 and RFC4281.
public static final int MIME_TYPE = 22; // String
public static final int AUDIO_CODEC = 23; // String
public static final int VIDEO_CODEC = 24; // String
public static final int VIDEO_HEIGHT = 25; // Integer
public static final int VIDEO_WIDTH = 26; // Integer
public static final int NUM_TRACKS = 27; // Integer
public static final int DRM_CRIPPLED = 28; // Boolean
public static final int LAST_SYSTEM = 29;
public static final int FIRST_CUSTOM = 8092;
// Shorthands to set the MediaPlayer's metadata filter.
public static final Set<Integer> MATCH_NONE = Collections.EMPTY_SET;
public static final Set<Integer> MATCH_ALL = Collections.singleton(ANY);
/**
* Helper class to hold a pair (time, text). Can be used to implement caption.
*/
public class TimedText {
private Date mTime;
private String mText;
public TimedText(final Date time, final String text) {
mTime = time;
mText = text;
}
public String toString() {
StringBuilder res = new StringBuilder(80);
res.append(mTime).append(":").append(mText);
return res.toString();
}
}
/* package */ Metadata() {}
/**
* @return the number of element in this metadata set.
*/
public int size() {
// FIXME: Implement.
return 0;
}
/**
* @return an iterator over the keys.
*/
public Iterator<Integer> iterator() {
// FIXME: Implement.
return new java.util.HashSet<Integer>().iterator();
}
/**
* @return true if a value is present for the given key.
*/
public boolean has(final int key) {
if (key <= ANY) {
throw new IllegalArgumentException("Invalid key: " + key);
}
if (LAST_SYSTEM <= key && key < FIRST_CUSTOM) {
throw new IllegalArgumentException("Key in reserved range: " + key);
}
// FIXME: Implement.
return true;
}
// Accessors
public String getString(final int key) {
// FIXME: Implement.
return new String();
}
public int getInt(final int key) {
// FIXME: Implement.
return 0;
}
public long getLong(final int key) {
// FIXME: Implement.
return 0;
}
public double getDouble(final int key) {
// FIXME: Implement.
return 0.0;
}
public byte[] getByteArray(final int key) {
return new byte[0];
}
public Bitmap getBitmap(final int key) {
// FIXME: Implement.
return null;
}
public Date getDate(final int key) {
// FIXME: Implement.
return new Date();
}
public TimedText getTimedText(final int key) {
// FIXME: Implement.
return new TimedText(new Date(0), "<missing>");
}
}