public final class

SubtitleData

extends java.lang.Object

implements VersionedParcelable

 java.lang.Object

↳androidx.media2.common.SubtitleData

Gradle dependencies

compile group: 'androidx.media2', name: 'media2-common', version: '1.2.1'

  • groupId: androidx.media2
  • artifactId: media2-common
  • version: 1.2.1

Artifact androidx.media2:media2-common:1.2.1 it located at Google repository (https://maven.google.com/)

Overview

Class encapsulating subtitle data, as received through the SessionPlayer.PlayerCallback.onSubtitleData(SessionPlayer, MediaItem, SessionPlayer.TrackInfo, SubtitleData) interface. The subtitle data includes:

  • the start time (in microseconds) of the data
  • the duration (in microseconds) of the data
  • the actual data.
The data is stored in a byte-array, and is encoded in one of the supported in-band subtitle formats. The subtitle encoding is determined by the MIME type of the SessionPlayer.TrackInfo of the subtitle track, one of or .

Here is an example of iterating over the tracks of a SessionPlayer, and checking which encoding is used for the subtitle tracks:

 // Initialize instance of player that extends SessionPlayer
 SessionPlayerExtension player = new SessionPlayerExtension();

 final TrackInfo[] trackInfos = player.getTrackInfo();
 for (TrackInfo info : trackInfo) {
     if (info.getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) {
         final String mime = info.getFormat().getString(MediaFormat.KEY_MIME);
         if ("text/cea-608".equals(mime) {
             // subtitle encoding is CEA 608
         } else if ("text/cea-708".equals(mime) {
             // subtitle encoding is CEA 708
         }
     }
 }
 

Summary

Constructors
publicSubtitleData(long startTimeUs, long durationUs, byte[] data[])

Methods
public booleanequals(java.lang.Object o)

public byte[]getData()

Returns the encoded data for the subtitle content.

public longgetDurationUs()

Returns the duration in microsecond during which the subtitle should be displayed.

public longgetStartTimeUs()

Returns the media time at which the subtitle should be displayed, expressed in microseconds.

public inthashCode()

from java.lang.Objectclone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait

Constructors

public SubtitleData(long startTimeUs, long durationUs, byte[] data[])

Methods

public long getStartTimeUs()

Returns the media time at which the subtitle should be displayed, expressed in microseconds.

Returns:

the display start time for the subtitle

public long getDurationUs()

Returns the duration in microsecond during which the subtitle should be displayed.

Returns:

the display duration for the subtitle

public byte[] getData()

Returns the encoded data for the subtitle content. Encoding format depends on the subtitle type, refer to CEA 708, and CEA/EIA 608 defined by the MIME type of the subtitle track.

Returns:

the encoded subtitle data

public boolean equals(java.lang.Object o)

public int hashCode()

Source

/*
 * Copyright 2019 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 androidx.media2.common;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.util.ObjectsCompat;
import androidx.versionedparcelable.ParcelField;
import androidx.versionedparcelable.VersionedParcelable;
import androidx.versionedparcelable.VersionedParcelize;

import java.util.Arrays;
import java.util.concurrent.Executor;

/**
 * Class encapsulating subtitle data, as received through the
 * {@link SessionPlayer.PlayerCallback#onSubtitleData} interface.
 * The subtitle data includes:
 * <ul>
 * <li> the start time (in microseconds) of the data</li>
 * <li> the duration (in microseconds) of the data</li>
 * <li> the actual data.</li>
 * </ul>
 * The data is stored in a byte-array, and is encoded in one of the supported in-band
 * subtitle formats. The subtitle encoding is determined by the MIME type of the
 * {@link SessionPlayer.TrackInfo} of the subtitle track, one of
 * {@link android.media.MediaFormat#MIMETYPE_TEXT_CEA_608} or
 * {@link android.media.MediaFormat#MIMETYPE_TEXT_CEA_708}.
 *
 * <p>
 * Here is an example of iterating over the tracks of a {@link SessionPlayer}, and checking which
 * encoding is used for the subtitle tracks:
 * <p>
 * <pre class="prettyprint">
 * // Initialize instance of player that extends SessionPlayer
 * SessionPlayerExtension player = new SessionPlayerExtension();
 *
 * final TrackInfo[] trackInfos = player.getTrackInfo();
 * for (TrackInfo info : trackInfo) {
 *     if (info.getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) {
 *         final String mime = info.getFormat().getString(MediaFormat.KEY_MIME);
 *         if ("text/cea-608".equals(mime) {
 *             // subtitle encoding is CEA 608
 *         } else if ("text/cea-708".equals(mime) {
 *             // subtitle encoding is CEA 708
 *         }
 *     }
 * }
 * </pre>
 * <p>
 * @see SessionPlayer#registerPlayerCallback(Executor, SessionPlayer.PlayerCallback)
 * @see SessionPlayer.PlayerCallback#onSubtitleData(SessionPlayer, MediaItem,
 *      SessionPlayer.TrackInfo, SubtitleData)
 */
@VersionedParcelize
public final class SubtitleData implements VersionedParcelable {
    private static final String TAG = "SubtitleData";

    @ParcelField(1)
    long mStartTimeUs;
    @ParcelField(2)
    long mDurationUs;
    @ParcelField(3)
    byte[] mData;

    // WARNING: Adding a new ParcelField may break old library users (b/152830728)

    /**
     * Used for VersionedParcelable
     */
    SubtitleData() {
    }

    public SubtitleData(long startTimeUs, long durationUs, @NonNull byte[] data) {
        mStartTimeUs = startTimeUs;
        mDurationUs = durationUs;
        mData = data;
    }

    /**
     * Returns the media time at which the subtitle should be displayed, expressed in microseconds.
     * @return the display start time for the subtitle
     */
    public long getStartTimeUs() {
        return mStartTimeUs;
    }

    /**
     * Returns the duration in microsecond during which the subtitle should be displayed.
     * @return the display duration for the subtitle
     */
    public long getDurationUs() {
        return mDurationUs;
    }

    /**
     * Returns the encoded data for the subtitle content.
     * Encoding format depends on the subtitle type, refer to
     * <a href="https://en.wikipedia.org/wiki/CEA-708">CEA 708</a>, and
     * <a href="https://en.wikipedia.org/wiki/EIA-608">CEA/EIA 608</a> defined by the MIME type
     * of the subtitle track.
     * @return the encoded subtitle data
     */
    @NonNull
    public byte[] getData() {
        return mData;
    }

    @Override
    public boolean equals(@Nullable Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        SubtitleData that = (SubtitleData) o;
        return mStartTimeUs == that.mStartTimeUs
                && mDurationUs == that.mDurationUs
                && Arrays.equals(mData, that.mData);
    }

    @Override
    public int hashCode() {
        return ObjectsCompat.hash(mStartTimeUs, mDurationUs, Arrays.hashCode(mData));
    }
}