diff --git a/library/src/main/java/com/google/android/exoplayer/MediaFormat.java b/library/src/main/java/com/google/android/exoplayer/MediaFormat.java index 898223969f..34407f4042 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaFormat.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaFormat.java @@ -94,11 +94,19 @@ public class MediaFormat { } public static MediaFormat createTextFormat(String mimeType) { - return createFormatForMimeType(mimeType); + return createTextFormat(mimeType, C.UNKNOWN_TIME_US); + } + + public static MediaFormat createTextFormat(String mimeType, long durationUs) { + return createFormatForMimeType(mimeType, durationUs); } public static MediaFormat createFormatForMimeType(String mimeType) { - return new MediaFormat(mimeType, NO_VALUE, C.UNKNOWN_TIME_US, NO_VALUE, NO_VALUE, NO_VALUE, + return createFormatForMimeType(mimeType, C.UNKNOWN_TIME_US); + } + + public static MediaFormat createFormatForMimeType(String mimeType, long durationUs) { + return new MediaFormat(mimeType, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, null); } diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java index 10b94e5007..06395188ac 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java @@ -45,7 +45,7 @@ import java.util.List; Atom.ContainerAtom mdia = trak.getContainerAtomOfType(Atom.TYPE_mdia); int trackType = parseHdlr(mdia.getLeafAtomOfType(Atom.TYPE_hdlr).data); if (trackType != Track.TYPE_AUDIO && trackType != Track.TYPE_VIDEO - && trackType != Track.TYPE_TEXT && trackType != Track.TYPE_TIME_CODE) { + && trackType != Track.TYPE_TEXT && trackType != Track.TYPE_SUBTITLE) { return null; } @@ -344,9 +344,9 @@ import java.util.List; parseAudioSampleEntry(stsd, childAtomType, childStartPosition, childAtomSize, durationUs, holder, i); } else if (childAtomType == Atom.TYPE_TTML) { - holder.mediaFormat = MediaFormat.createTextFormat(MimeTypes.APPLICATION_TTML); + holder.mediaFormat = MediaFormat.createTextFormat(MimeTypes.APPLICATION_TTML, durationUs); } else if (childAtomType == Atom.TYPE_tx3g) { - holder.mediaFormat = MediaFormat.createTextFormat(MimeTypes.APPLICATION_TX3G); + holder.mediaFormat = MediaFormat.createTextFormat(MimeTypes.APPLICATION_TX3G, durationUs); } stsd.setPosition(childStartPosition + childAtomSize); } diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Mp4Extractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Mp4Extractor.java index 368b09561d..4c7f18df63 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Mp4Extractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Mp4Extractor.java @@ -230,8 +230,7 @@ public final class Mp4Extractor implements Extractor, SeekMap { } Track track = AtomParsers.parseTrak(atom, moov.getLeafAtomOfType(Atom.TYPE_mvhd)); - if (track == null || (track.type != Track.TYPE_AUDIO && track.type != Track.TYPE_VIDEO - && track.type != Track.TYPE_TEXT)) { + if (track == null) { continue; } diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Track.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Track.java index c53a9760b2..6cdcd9568f 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Track.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Track.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer.extractor.mp4; import com.google.android.exoplayer.C; import com.google.android.exoplayer.MediaFormat; +import com.google.android.exoplayer.util.Util; /** * Encapsulates information describing an MP4 track. @@ -26,27 +27,19 @@ public final class Track { /** * Type of a video track. */ - public static final int TYPE_VIDEO = 0x76696465; + public static final int TYPE_VIDEO = Util.getIntegerCodeForString("vide"); /** * Type of an audio track. */ - public static final int TYPE_AUDIO = 0x736F756E; + public static final int TYPE_AUDIO = Util.getIntegerCodeForString("soun"); /** * Type of a text track. */ - public static final int TYPE_TEXT = 0x74657874; + public static final int TYPE_TEXT = Util.getIntegerCodeForString("text"); /** - * Type of a hint track. + * Type of a subtitle track. */ - public static final int TYPE_HINT = 0x68696E74; - /** - * Type of a meta track. - */ - public static final int TYPE_META = 0x6D657461; - /** - * Type of a time-code track. - */ - public static final int TYPE_TIME_CODE = 0x746D6364; + public static final int TYPE_SUBTITLE = Util.getIntegerCodeForString("sbtl"); /** * The track identifier. @@ -54,8 +47,7 @@ public final class Track { public final int id; /** - * One of {@link #TYPE_VIDEO}, {@link #TYPE_AUDIO}, {@link #TYPE_HINT}, {@link #TYPE_META} and - * {@link #TYPE_TIME_CODE}. + * One of {@link #TYPE_VIDEO}, {@link #TYPE_AUDIO}, {@link #TYPE_TEXT} and {@link #TYPE_SUBTITLE}. */ public final int type; diff --git a/library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java index 51fb6e263e..47ef4a41c4 100644 --- a/library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java @@ -206,6 +206,10 @@ public class TextTrackRenderer extends TrackRenderer implements Callback { } } + if (getState() != TrackRenderer.STATE_STARTED) { + return; + } + boolean textRendererNeedsUpdate = false; long subtitleNextEventTimeUs = Long.MAX_VALUE; if (subtitle != null) { @@ -228,7 +232,7 @@ public class TextTrackRenderer extends TrackRenderer implements Callback { textRendererNeedsUpdate = true; } - if (textRendererNeedsUpdate && getState() == TrackRenderer.STATE_STARTED) { + if (textRendererNeedsUpdate) { // textRendererNeedsUpdate is set and we're playing. Update the renderer. updateTextRenderer(subtitle.getCues(positionUs)); }