1ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih/*
2ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * Copyright 2015 The Android Open Source Project
3ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih *
4ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * Licensed under the Apache License, Version 2.0 (the "License");
5ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * you may not use this file except in compliance with the License.
6ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * You may obtain a copy of the License at
7ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih *
8ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih *      http://www.apache.org/licenses/LICENSE-2.0
9ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih *
10ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * Unless required by applicable law or agreed to in writing, software
11ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * distributed under the License is distributed on an "AS IS" BASIS,
12ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * See the License for the specific language governing permissions and
14ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * limitations under the License.
15ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih */
16ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih
17ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shihpackage android.media;
18ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih
19ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shihimport android.os.Parcel;
20ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih
21ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih/**
22b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih * Class that embodies one timed metadata access unit, including
23ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih *
24ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * <ul>
25ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * <li> a time stamp, and </li>
26ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * <li> raw uninterpreted byte-array extracted directly from the container. </li>
27ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih * </ul>
28ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih *
29b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih * @see MediaPlayer#setOnTimedMetaDataAvailableListener(android.media.MediaPlayer.OnTimedMetaDataListener)
30ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih */
31b7514effd1b77829fb950f4fab22041f98b2075fRobert Shihpublic final class TimedMetaData {
32ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih    private static final String TAG = "TimedMetaData";
33ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih
34b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih    private long mTimestampUs;
35b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih    private byte[] mMetaData;
36ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih
37ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih    /**
38ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih     * @hide
39ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih     */
40ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih    static TimedMetaData createTimedMetaDataFromParcel(Parcel parcel) {
41ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih        return new TimedMetaData(parcel);
42ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih    }
43ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih
44ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih    private TimedMetaData(Parcel parcel) {
45ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih        if (!parseParcel(parcel)) {
46ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih            throw new IllegalArgumentException("parseParcel() fails");
47ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih        }
48ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih    }
49ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih
50b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih    /**
51b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih     * @return the timestamp associated with this metadata access unit in microseconds;
52b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih     * 0 denotes playback start.
53b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih     */
54b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih    public long getTimestamp() {
55b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih        return mTimestampUs;
56ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih    }
57ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih
58b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih    /**
59b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih     * @return raw, uninterpreted content of this metadata access unit; for ID3 tags this includes
60b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih     * everything starting from the 3 byte signature "ID3".
61b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih     */
62b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih    public byte[] getMetaData() {
63b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih        return mMetaData;
64ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih    }
65ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih
66ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih    private boolean parseParcel(Parcel parcel) {
67ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih        parcel.setDataPosition(0);
68ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih        if (parcel.dataAvail() == 0) {
69ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih            return false;
70ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih        }
71ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih
72b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih        mTimestampUs = parcel.readLong();
73b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih        mMetaData = new byte[parcel.readInt()];
74b7514effd1b77829fb950f4fab22041f98b2075fRobert Shih        parcel.readByteArray(mMetaData);
75ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih
76ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih        return true;
77ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih    }
78ac033f033d2c0ff3d7cfd037409278d73260e87cRobert Shih}
79