/* * Copyright (C) 2006 The Android Open Source Project * Copyright (C) 2013 YIXIA.COM * * 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 io.vov.vitamio; import android.util.SparseArray; import java.io.UnsupportedEncodingException; import java.util.Locale; import java.util.Map; /** * See {@link io.vov.vitamio.MediaPlayer#getMetadata()} */ public class Metadata { public static final int ANY = 0; 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(milliseconds) 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 LENGTH = 16; // Integer (bytes) public static final int BIT_RATE = 17; // Integer public static final int AUDIO_BIT_RATE = 18; // Integer public static final int VIDEO_BIT_RATE = 19; // Integer public static final int AUDIO_SAMPLE_RATE = 20; // Integer public static final int VIDEO_FRAME_RATE = 21; // Float // 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 PAUSE_AVAILABLE = 29; // Boolean public static final int SEEK_BACKWARD_AVAILABLE = 30; // Boolean public static final int SEEK_FORWARD_AVAILABLE = 31; // Boolean public static final int SEEK_AVAILABLE = 32; // Boolean private static final int LAST_SYSTEM = 32; private static final int FIRST_CUSTOM = 8192; private SparseArray<byte[]> mMeta = new SparseArray<byte[]>(); private String mEncoding = "UTF-8"; public boolean parse(Map<byte[], byte[]> meta, String encoding) { String key = null; byte[] value = null; mEncoding = encoding; for (byte[] keyBytes : meta.keySet()) { try { key = new String(keyBytes, mEncoding).trim().toLowerCase(Locale.US); } catch (UnsupportedEncodingException e) { key = new String(keyBytes).trim().toLowerCase(Locale.US); } value = meta.get(keyBytes); if (key.equals("title")) { mMeta.put(TITLE, value); } else if (key.equals("comment")) { mMeta.put(COMMENT, value); } else if (key.equals("copyright")) { mMeta.put(COPYRIGHT, value); } else if (key.equals("album")) { mMeta.put(ALBUM, value); } else if (key.equals("artist")) { mMeta.put(ARTIST, value); } else if (key.equals("author")) { mMeta.put(AUTHOR, value); } else if (key.equals("composer")) { mMeta.put(COMPOSER, value); } else if (key.equals("genre")) { mMeta.put(GENRE, value); } else if (key.equals("creation_time") || key.equals("date")) { mMeta.put(DATE, value); } else if (key.equals("duration")) { mMeta.put(DURATION, value); } else if (key.equals("length")) { mMeta.put(LENGTH, value); } else if (key.equals("bit_rate")) { mMeta.put(BIT_RATE, value); } else if (key.equals("audio_bit_rate")) { mMeta.put(AUDIO_BIT_RATE, value); } else if (key.equals("video_bit_rate")) { mMeta.put(VIDEO_BIT_RATE, value); } else if (key.equals("audio_sample_rate")) { mMeta.put(AUDIO_SAMPLE_RATE, value); } else if (key.equals("video_frame_rate")) { mMeta.put(VIDEO_FRAME_RATE, value); } else if (key.equals("format")) { mMeta.put(MIME_TYPE, value); } else if (key.equals("audio_codec")) { mMeta.put(AUDIO_CODEC, value); } else if (key.equals("video_codec")) { mMeta.put(VIDEO_CODEC, value); } else if (key.equals("video_height")) { mMeta.put(VIDEO_HEIGHT, value); } else if (key.equals("video_width")) { mMeta.put(VIDEO_WIDTH, value); } else if (key.equals("num_tracks")) { mMeta.put(NUM_TRACKS, value); } else if (key.equals("cap_pause")) { mMeta.put(PAUSE_AVAILABLE, value); } else if (key.equals("cap_seek")) { mMeta.put(SEEK_AVAILABLE, value); } } if (BuildConfig.DEBUG) { android.util.Log.i("Vitamio[Metadata]", "title:\t\t" + getString(TITLE)); android.util.Log.i("Vitamio[Metadata]", "comment:\t\t" + getString(COMMENT)); android.util.Log.i("Vitamio[Metadata]", "copyright:\t\t" + getString(COPYRIGHT)); android.util.Log.i("Vitamio[Metadata]", "album:\t\t" + getString(ALBUM)); android.util.Log.i("Vitamio[Metadata]", "artist:\t\t" + getString(ARTIST)); android.util.Log.i("Vitamio[Metadata]", "composer:\t\t" + getString(COMPOSER)); android.util.Log.i("Vitamio[Metadata]", "genre:\t\t" + getString(GENRE)); android.util.Log.i("Vitamio[Metadata]", "date:\t\t" + getString(DATE)); android.util.Log.i("Vitamio[Metadata]", "duration:\t\t" + getLong(DURATION)); android.util.Log.i("Vitamio[Metadata]", "length:\t\t" + getLong(LENGTH)); android.util.Log.i("Vitamio[Metadata]", "bit_rate:\t\t" + getInt(BIT_RATE)); android.util.Log.i("Vitamio[Metadata]", "audio_bit_rate:\t" + getInt(AUDIO_BIT_RATE)); android.util.Log.i("Vitamio[Metadata]", "video_bit_rate:\t" + getInt(VIDEO_BIT_RATE)); android.util.Log.i("Vitamio[Metadata]", "audio_sample_rate:\t" + getInt(AUDIO_SAMPLE_RATE)); android.util.Log.i("Vitamio[Metadata]", "video_frame_rate:\t" + getDouble(VIDEO_FRAME_RATE)); android.util.Log.i("Vitamio[Metadata]", "format:\t\t" + getString(MIME_TYPE)); android.util.Log.i("Vitamio[Metadata]", "audio_codec:\t" + getString(AUDIO_CODEC)); android.util.Log.i("Vitamio[Metadata]", "video_codec:\t" + getString(VIDEO_CODEC)); android.util.Log.i("Vitamio[Metadata]", "video_height:\t" + getInt(VIDEO_HEIGHT)); android.util.Log.i("Vitamio[Metadata]", "video_width:\t" + getInt(VIDEO_WIDTH)); android.util.Log.i("Vitamio[Metadata]", "num_tracks:\t\t" + getInt(NUM_TRACKS)); android.util.Log.i("Vitamio[Metadata]", "cap_pause:\t\t" + getBoolean(PAUSE_AVAILABLE)); android.util.Log.i("Vitamio[Metadata]", "cap_seek:\t\t" + getBoolean(SEEK_AVAILABLE)); } return true; } public boolean has(final int metadataId) { if (!checkMetadataId(metadataId)) { throw new IllegalArgumentException("Invalid key: " + metadataId); } return mMeta.indexOfKey(metadataId) >= 0; } public String getString(final int key) { byte[] value = mMeta.get(key); if (value == null) { return null; } try { return new String(value, mEncoding); } catch (UnsupportedEncodingException e) { return new String(value); } } public int getInt(final int key) { try { return Integer.parseInt(getString(key)); } catch (Exception e) { return -1; } } public boolean getBoolean(final int key) { try { return Boolean.parseBoolean(getString(key)); } catch (Exception e) { return false; } } public long getLong(final int key) { try { return Long.parseLong(getString(key)); } catch (Exception e) { return -1; } } public double getDouble(final int key) { try { return Double.parseDouble(getString(key)); } catch (Exception e) { return -1; } } public byte[] getByteArray(final int key) { return mMeta.get(key); } private boolean checkMetadataId(final int val) { if (val <= ANY || (LAST_SYSTEM < val && val < FIRST_CUSTOM)) { return false; } return true; } }