Loading media/java/android/media/MediaPlayer.java +36 −13 Original line number Diff line number Diff line Loading @@ -1649,8 +1649,8 @@ public class MediaPlayer implements SubtitleController.Listener mFormat = MediaFormat.createSubtitleFormat( MEDIA_MIMETYPE_TEXT_SUBRIP, language); } else if (mTrackType == MEDIA_TRACK_TYPE_SUBTITLE) { mFormat = MediaFormat.createSubtitleFormat( MEDIA_MIMETYPE_TEXT_VTT, language); String mime = in.readString(); mFormat = MediaFormat.createSubtitleFormat(mime, language); mFormat.setInteger(MediaFormat.KEY_IS_AUTOSELECT, in.readInt()); mFormat.setInteger(MediaFormat.KEY_IS_DEFAULT, in.readInt()); mFormat.setInteger(MediaFormat.KEY_IS_FORCED_SUBTITLE, in.readInt()); Loading Loading @@ -1683,12 +1683,40 @@ public class MediaPlayer implements SubtitleController.Listener dest.writeString(getLanguage()); if (mTrackType == MEDIA_TRACK_TYPE_SUBTITLE) { dest.writeString(mFormat.getString(MediaFormat.KEY_MIME)); dest.writeInt(mFormat.getInteger(MediaFormat.KEY_IS_AUTOSELECT)); dest.writeInt(mFormat.getInteger(MediaFormat.KEY_IS_DEFAULT)); dest.writeInt(mFormat.getInteger(MediaFormat.KEY_IS_FORCED_SUBTITLE)); } } @Override public String toString() { StringBuilder out = new StringBuilder(128); out.append(getClass().getName()); out.append('{'); switch (mTrackType) { case MEDIA_TRACK_TYPE_VIDEO: out.append("VIDEO"); break; case MEDIA_TRACK_TYPE_AUDIO: out.append("AUDIO"); break; case MEDIA_TRACK_TYPE_TIMEDTEXT: out.append("TIMEDTEXT"); break; case MEDIA_TRACK_TYPE_SUBTITLE: out.append("SUBTITLE"); break; default: out.append("UNKNOWN"); break; } out.append(", " + mFormat.toString()); out.append("}"); return out.toString(); } /** * Used to read a TrackInfo from a Parcel. */ Loading Loading @@ -1792,16 +1820,11 @@ public class MediaPlayer implements SubtitleController.Listener } SubtitleTrack track = mInbandSubtitleTracks[index]; if (track != null) { try { long runID = data.getStartTimeUs() + 1; // TODO: move conversion into track track.onData(new String(data.getData(), "UTF-8"), true /* eos */, runID); track.onData(data.getData(), true /* eos */, runID); track.setRunDiscardTimeMs( runID, (data.getStartTimeUs() + data.getDurationUs()) / 1000); } catch (java.io.UnsupportedEncodingException e) { Log.w(TAG, "subtitle data for track " + index + " is not UTF-8 encoded: " + e); } } } }; Loading Loading @@ -1872,7 +1895,7 @@ public class MediaPlayer implements SubtitleController.Listener } scanner.close(); mOutOfBandSubtitleTracks.add(track); track.onData(contents, true /* eos */, ~0 /* runID: keep forever */); track.onData(contents.getBytes(), true /* eos */, ~0 /* runID: keep forever */); return MEDIA_INFO_EXTERNAL_METADATA_UPDATE; } Loading media/java/android/media/SubtitleTrack.java +2 −4 Original line number Diff line number Diff line Loading @@ -83,7 +83,7 @@ public abstract class SubtitleTrack implements MediaTimeProvider.OnMediaTimeList * indicating the last section of the run. Calls from different * runs must not be intermixed. * * @param data * @param data subtitle data byte buffer * @param eos true if this is the last section of the run. * @param runID mostly-unique ID for this run of data. Subtitle cues * with runID of 0 are discarded immediately after Loading @@ -92,10 +92,8 @@ public abstract class SubtitleTrack implements MediaTimeProvider.OnMediaTimeList * with other runID-s are discarded at the end of the * run, which defaults to the latest timestamp of * any of its cues (with this runID). * * TODO use ByteBuffer */ public abstract void onData(String data, boolean eos, long runID); public abstract void onData(byte[] data, boolean eos, long runID); /** * Called when adding the subtitle rendering widget to the view hierarchy, Loading media/java/android/media/TtmlRenderer.java +27 −20 Original line number Diff line number Diff line Loading @@ -563,7 +563,11 @@ class TtmlTrack extends SubtitleTrack implements TtmlNodeListener { } @Override public void onData(String data, boolean eos, long runID) { public void onData(byte[] data, boolean eos, long runID) { try { // TODO: handle UTF-8 conversion properly String str = new String(data, "UTF-8"); // implement intermixing restriction for TTML. synchronized(mParser) { if (mCurrentRunID != null && runID != mCurrentRunID) { Loading @@ -572,7 +576,7 @@ class TtmlTrack extends SubtitleTrack implements TtmlNodeListener { " in progress. Cannot process run #" + runID); } mCurrentRunID = runID; mParsingData += data; mParsingData += str; if (eos) { try { mParser.parse(mParsingData, mCurrentRunID); Loading @@ -586,6 +590,9 @@ class TtmlTrack extends SubtitleTrack implements TtmlNodeListener { mCurrentRunID = null; } } } catch (java.io.UnsupportedEncodingException e) { Log.w(TAG, "subtitle data is not UTF-8 encoded: " + e); } } @Override Loading media/java/android/media/WebVttRenderer.java +21 −15 Original line number Diff line number Diff line Loading @@ -1001,7 +1001,10 @@ class WebVttTrack extends SubtitleTrack implements WebVttCueListener { } @Override public void onData(String data, boolean eos, long runID) { public void onData(byte[] data, boolean eos, long runID) { try { String str = new String(data, "UTF-8"); // implement intermixing restriction for WebVTT only for now synchronized(mParser) { if (mCurrentRunID != null && runID != mCurrentRunID) { Loading @@ -1010,7 +1013,7 @@ class WebVttTrack extends SubtitleTrack implements WebVttCueListener { " in progress. Cannot process run #" + runID); } mCurrentRunID = runID; mParser.parse(data); mParser.parse(str); if (eos) { finishedRun(runID); mParser.eos(); Loading @@ -1018,6 +1021,9 @@ class WebVttTrack extends SubtitleTrack implements WebVttCueListener { mCurrentRunID = null; } } } catch (java.io.UnsupportedEncodingException e) { Log.w(TAG, "subtitle data is not UTF-8 encoded: " + e); } } @Override Loading Loading
media/java/android/media/MediaPlayer.java +36 −13 Original line number Diff line number Diff line Loading @@ -1649,8 +1649,8 @@ public class MediaPlayer implements SubtitleController.Listener mFormat = MediaFormat.createSubtitleFormat( MEDIA_MIMETYPE_TEXT_SUBRIP, language); } else if (mTrackType == MEDIA_TRACK_TYPE_SUBTITLE) { mFormat = MediaFormat.createSubtitleFormat( MEDIA_MIMETYPE_TEXT_VTT, language); String mime = in.readString(); mFormat = MediaFormat.createSubtitleFormat(mime, language); mFormat.setInteger(MediaFormat.KEY_IS_AUTOSELECT, in.readInt()); mFormat.setInteger(MediaFormat.KEY_IS_DEFAULT, in.readInt()); mFormat.setInteger(MediaFormat.KEY_IS_FORCED_SUBTITLE, in.readInt()); Loading Loading @@ -1683,12 +1683,40 @@ public class MediaPlayer implements SubtitleController.Listener dest.writeString(getLanguage()); if (mTrackType == MEDIA_TRACK_TYPE_SUBTITLE) { dest.writeString(mFormat.getString(MediaFormat.KEY_MIME)); dest.writeInt(mFormat.getInteger(MediaFormat.KEY_IS_AUTOSELECT)); dest.writeInt(mFormat.getInteger(MediaFormat.KEY_IS_DEFAULT)); dest.writeInt(mFormat.getInteger(MediaFormat.KEY_IS_FORCED_SUBTITLE)); } } @Override public String toString() { StringBuilder out = new StringBuilder(128); out.append(getClass().getName()); out.append('{'); switch (mTrackType) { case MEDIA_TRACK_TYPE_VIDEO: out.append("VIDEO"); break; case MEDIA_TRACK_TYPE_AUDIO: out.append("AUDIO"); break; case MEDIA_TRACK_TYPE_TIMEDTEXT: out.append("TIMEDTEXT"); break; case MEDIA_TRACK_TYPE_SUBTITLE: out.append("SUBTITLE"); break; default: out.append("UNKNOWN"); break; } out.append(", " + mFormat.toString()); out.append("}"); return out.toString(); } /** * Used to read a TrackInfo from a Parcel. */ Loading Loading @@ -1792,16 +1820,11 @@ public class MediaPlayer implements SubtitleController.Listener } SubtitleTrack track = mInbandSubtitleTracks[index]; if (track != null) { try { long runID = data.getStartTimeUs() + 1; // TODO: move conversion into track track.onData(new String(data.getData(), "UTF-8"), true /* eos */, runID); track.onData(data.getData(), true /* eos */, runID); track.setRunDiscardTimeMs( runID, (data.getStartTimeUs() + data.getDurationUs()) / 1000); } catch (java.io.UnsupportedEncodingException e) { Log.w(TAG, "subtitle data for track " + index + " is not UTF-8 encoded: " + e); } } } }; Loading Loading @@ -1872,7 +1895,7 @@ public class MediaPlayer implements SubtitleController.Listener } scanner.close(); mOutOfBandSubtitleTracks.add(track); track.onData(contents, true /* eos */, ~0 /* runID: keep forever */); track.onData(contents.getBytes(), true /* eos */, ~0 /* runID: keep forever */); return MEDIA_INFO_EXTERNAL_METADATA_UPDATE; } Loading
media/java/android/media/SubtitleTrack.java +2 −4 Original line number Diff line number Diff line Loading @@ -83,7 +83,7 @@ public abstract class SubtitleTrack implements MediaTimeProvider.OnMediaTimeList * indicating the last section of the run. Calls from different * runs must not be intermixed. * * @param data * @param data subtitle data byte buffer * @param eos true if this is the last section of the run. * @param runID mostly-unique ID for this run of data. Subtitle cues * with runID of 0 are discarded immediately after Loading @@ -92,10 +92,8 @@ public abstract class SubtitleTrack implements MediaTimeProvider.OnMediaTimeList * with other runID-s are discarded at the end of the * run, which defaults to the latest timestamp of * any of its cues (with this runID). * * TODO use ByteBuffer */ public abstract void onData(String data, boolean eos, long runID); public abstract void onData(byte[] data, boolean eos, long runID); /** * Called when adding the subtitle rendering widget to the view hierarchy, Loading
media/java/android/media/TtmlRenderer.java +27 −20 Original line number Diff line number Diff line Loading @@ -563,7 +563,11 @@ class TtmlTrack extends SubtitleTrack implements TtmlNodeListener { } @Override public void onData(String data, boolean eos, long runID) { public void onData(byte[] data, boolean eos, long runID) { try { // TODO: handle UTF-8 conversion properly String str = new String(data, "UTF-8"); // implement intermixing restriction for TTML. synchronized(mParser) { if (mCurrentRunID != null && runID != mCurrentRunID) { Loading @@ -572,7 +576,7 @@ class TtmlTrack extends SubtitleTrack implements TtmlNodeListener { " in progress. Cannot process run #" + runID); } mCurrentRunID = runID; mParsingData += data; mParsingData += str; if (eos) { try { mParser.parse(mParsingData, mCurrentRunID); Loading @@ -586,6 +590,9 @@ class TtmlTrack extends SubtitleTrack implements TtmlNodeListener { mCurrentRunID = null; } } } catch (java.io.UnsupportedEncodingException e) { Log.w(TAG, "subtitle data is not UTF-8 encoded: " + e); } } @Override Loading
media/java/android/media/WebVttRenderer.java +21 −15 Original line number Diff line number Diff line Loading @@ -1001,7 +1001,10 @@ class WebVttTrack extends SubtitleTrack implements WebVttCueListener { } @Override public void onData(String data, boolean eos, long runID) { public void onData(byte[] data, boolean eos, long runID) { try { String str = new String(data, "UTF-8"); // implement intermixing restriction for WebVTT only for now synchronized(mParser) { if (mCurrentRunID != null && runID != mCurrentRunID) { Loading @@ -1010,7 +1013,7 @@ class WebVttTrack extends SubtitleTrack implements WebVttCueListener { " in progress. Cannot process run #" + runID); } mCurrentRunID = runID; mParser.parse(data); mParser.parse(str); if (eos) { finishedRun(runID); mParser.eos(); Loading @@ -1018,6 +1021,9 @@ class WebVttTrack extends SubtitleTrack implements WebVttCueListener { mCurrentRunID = null; } } } catch (java.io.UnsupportedEncodingException e) { Log.w(TAG, "subtitle data is not UTF-8 encoded: " + e); } } @Override Loading