183ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang/*
283ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * Copyright (C) 2011 The Android Open Source Project
383ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang *
483ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * Licensed under the Apache License, Version 2.0 (the "License");
583ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * you may not use this file except in compliance with the License.
683ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * You may obtain a copy of the License at
783ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang *
883ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang *      http://www.apache.org/licenses/LICENSE-2.0
983ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang *
1083ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * Unless required by applicable law or agreed to in writing, software
1183ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * distributed under the License is distributed on an "AS IS" BASIS,
1283ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1383ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * See the License for the specific language governing permissions and
1483ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * limitations under the License.
1583ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang */
1683ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang
1783ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhangpackage android.media;
1883ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang
1983ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhangimport android.os.Parcel;
2083ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang
2183ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang/**
2283ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * @hide
2383ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang *
2483ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * Class to hold the subtitle track's data, including:
2583ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * <ul>
2683ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * <li> Track index</li>
2783ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * <li> Start time (in microseconds) of the data</li>
2883ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * <li> Duration (in microseconds) of the data</li>
2983ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * <li> A byte-array of the data</li>
3083ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * </ul>
3183ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang *
3283ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * <p> To receive the subtitle data, applications need to do the following:
3383ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang *
3483ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * <ul>
3583ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * <li> Select a track of type MEDIA_TRACK_TYPE_SUBTITLE with {@link MediaPlayer.selectTrack(int)</li>
3683ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * <li> Implement the {@link MediaPlayer.OnSubtitleDataListener} interface</li>
3783ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * <li> Register the {@link MediaPlayer.OnSubtitleDataListener} callback on a MediaPlayer object</li>
3883ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * </ul>
3983ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang *
4083ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang * @see android.media.MediaPlayer
4183ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang */
4283ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhangpublic final class SubtitleData
4383ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang{
4483ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    private static final String TAG = "SubtitleData";
4583ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang
4683ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    private int mTrackIndex;
4783ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    private long mStartTimeUs;
4883ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    private long mDurationUs;
4983ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    private byte[] mData;
5083ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang
5183ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    public SubtitleData(Parcel parcel) {
5283ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        if (!parseParcel(parcel)) {
5383ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang            throw new IllegalArgumentException("parseParcel() fails");
5483ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        }
5583ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    }
5683ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang
5783ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    public int getTrackIndex() {
5883ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        return mTrackIndex;
5983ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    }
6083ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang
6183ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    public long getStartTimeUs() {
6283ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        return mStartTimeUs;
6383ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    }
6483ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang
6583ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    public long getDurationUs() {
6683ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        return mDurationUs;
6783ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    }
6883ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang
6983ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    public byte[] getData() {
7083ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        return mData;
7183ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    }
7283ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang
7383ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    private boolean parseParcel(Parcel parcel) {
7483ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        parcel.setDataPosition(0);
7583ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        if (parcel.dataAvail() == 0) {
7683ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang            return false;
7783ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        }
7883ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang
7983ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        mTrackIndex = parcel.readInt();
8083ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        mStartTimeUs = parcel.readLong();
8183ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        mDurationUs = parcel.readLong();
8283ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        mData = new byte[parcel.readInt()];
8383ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        parcel.readByteArray(mData);
8483ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang
8583ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang        return true;
8683ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang    }
8783ddaf664c7a9eb2759269ec75d25dba48edebf2Chong Zhang}
88