From 079fa9683dc062f154333a661f5e84a5ac5e43c7 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Wed, 11 Jun 2014 15:09:13 -0700 Subject: [PATCH] change onData() to take byte array of raw data conversion to UTF-8 if necessary will be handled by the renderer. Bug: 15470448 Change-Id: I6d4a5e29e6af07f5c031197ea424f8f8e53cd05b --- media/java/android/media/MediaPlayer.java | 49 ++++++++++++++------ media/java/android/media/SubtitleTrack.java | 6 +-- media/java/android/media/TtmlRenderer.java | 47 +++++++++++-------- media/java/android/media/WebVttRenderer.java | 36 ++++++++------ 4 files changed, 86 insertions(+), 52 deletions(-) diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 1b924102bd6b3..dd43c3757ae58 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -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()); @@ -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. */ @@ -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.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); - } + long runID = data.getStartTimeUs() + 1; + track.onData(data.getData(), true /* eos */, runID); + track.setRunDiscardTimeMs( + runID, + (data.getStartTimeUs() + data.getDurationUs()) / 1000); } } }; @@ -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; } diff --git a/media/java/android/media/SubtitleTrack.java b/media/java/android/media/SubtitleTrack.java index 06063de66a0ba..b0e182dfac74f 100644 --- a/media/java/android/media/SubtitleTrack.java +++ b/media/java/android/media/SubtitleTrack.java @@ -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 @@ -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, diff --git a/media/java/android/media/TtmlRenderer.java b/media/java/android/media/TtmlRenderer.java index 0309334c163fc..75133c9fbd181 100644 --- a/media/java/android/media/TtmlRenderer.java +++ b/media/java/android/media/TtmlRenderer.java @@ -563,28 +563,35 @@ class TtmlTrack extends SubtitleTrack implements TtmlNodeListener { } @Override - public void onData(String data, boolean eos, long runID) { - // implement intermixing restriction for TTML. - synchronized(mParser) { - if (mCurrentRunID != null && runID != mCurrentRunID) { - throw new IllegalStateException( - "Run #" + mCurrentRunID + - " in progress. Cannot process run #" + runID); - } - mCurrentRunID = runID; - mParsingData += data; - if (eos) { - try { - mParser.parse(mParsingData, mCurrentRunID); - } catch (XmlPullParserException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); + 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) { + throw new IllegalStateException( + "Run #" + mCurrentRunID + + " in progress. Cannot process run #" + runID); + } + mCurrentRunID = runID; + mParsingData += str; + if (eos) { + try { + mParser.parse(mParsingData, mCurrentRunID); + } catch (XmlPullParserException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + finishedRun(runID); + mParsingData = ""; + mCurrentRunID = null; } - finishedRun(runID); - mParsingData = ""; - mCurrentRunID = null; } + } catch (java.io.UnsupportedEncodingException e) { + Log.w(TAG, "subtitle data is not UTF-8 encoded: " + e); } } diff --git a/media/java/android/media/WebVttRenderer.java b/media/java/android/media/WebVttRenderer.java index 7977988626f07..a9374d5c98551 100644 --- a/media/java/android/media/WebVttRenderer.java +++ b/media/java/android/media/WebVttRenderer.java @@ -1001,22 +1001,28 @@ class WebVttTrack extends SubtitleTrack implements WebVttCueListener { } @Override - public void onData(String data, boolean eos, long runID) { - // implement intermixing restriction for WebVTT only for now - synchronized(mParser) { - if (mCurrentRunID != null && runID != mCurrentRunID) { - throw new IllegalStateException( - "Run #" + mCurrentRunID + - " in progress. Cannot process run #" + runID); - } - mCurrentRunID = runID; - mParser.parse(data); - if (eos) { - finishedRun(runID); - mParser.eos(); - mRegions.clear(); - mCurrentRunID = null; + 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) { + throw new IllegalStateException( + "Run #" + mCurrentRunID + + " in progress. Cannot process run #" + runID); + } + mCurrentRunID = runID; + mParser.parse(str); + if (eos) { + finishedRun(runID); + mParser.eos(); + mRegions.clear(); + mCurrentRunID = null; + } } + } catch (java.io.UnsupportedEncodingException e) { + Log.w(TAG, "subtitle data is not UTF-8 encoded: " + e); } }