From 4c2e8620e6246b4a77eb6d2076bfbb024a4eba2c Mon Sep 17 00:00:00 2001 From: Dongwon Kang Date: Mon, 10 Sep 2018 19:48:47 -0700 Subject: [PATCH] MediaPlayer2: use protobuf instead of parcel for TimedText Test: MediaPlayer2Test Bug: 112767225 Change-Id: I374427125af3d470224876c947d69dda243625cd --- .../java/android/media/MediaPlayer2Impl.java | 57 ++++++++++++++++++- media/java/android/media/TimedText.java | 10 ++++ media/jni/Android.bp | 2 +- media/jni/android_media_MediaPlayer2.cpp | 5 -- 4 files changed, 67 insertions(+), 7 deletions(-) diff --git a/media/java/android/media/MediaPlayer2Impl.java b/media/java/android/media/MediaPlayer2Impl.java index ed4501466278b..6ae4d408fca2c 100644 --- a/media/java/android/media/MediaPlayer2Impl.java +++ b/media/java/android/media/MediaPlayer2Impl.java @@ -25,6 +25,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.res.AssetFileDescriptor; import android.graphics.SurfaceTexture; +import android.graphics.Rect; import android.media.MediaPlayer2Proto; import android.media.MediaPlayer2Proto.PlayerMessage; import android.media.MediaPlayer2Proto.Value; @@ -2983,7 +2984,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { Log.w(TAG, "Failed to parse timed text.", e); return; } - text = null; // TODO: convert PlayerMessage to new TimedText(playerMsg); + text = TimedTextUtil.parsePlayerMessage(playerMsg); } else { text = null; } @@ -4276,6 +4277,60 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { mode == VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING); } + private static class TimedTextUtil { + // These keys must be in sync with the keys in TextDescription2.h + private static final int KEY_START_TIME = 7; // int + private static final int KEY_STRUCT_TEXT_POS = 14; // TextPos + private static final int KEY_STRUCT_TEXT = 16; // Text + private static final int KEY_GLOBAL_SETTING = 101; + private static final int KEY_LOCAL_SETTING = 102; + + private static TimedText parsePlayerMessage(PlayerMessage playerMsg) { + if (playerMsg.getValuesCount() == 0) { + return null; + } + + String textChars = null; + Rect textBounds = null; + Iterator in = playerMsg.getValuesList().iterator(); + int type = in.next().getInt32Value(); + if (type == KEY_LOCAL_SETTING) { + type = in.next().getInt32Value(); + if (type != KEY_START_TIME) { + return null; + } + int startTimeMs = in.next().getInt32Value(); + + type = in.next().getInt32Value(); + if (type != KEY_STRUCT_TEXT) { + return null; + } + + byte[] text = in.next().getBytesValue().toByteArray(); + if (text == null || text.length == 0) { + textChars = null; + } else { + textChars = new String(text); + } + + } else if (type != KEY_GLOBAL_SETTING) { + Log.w(TAG, "Invalid timed text key found: " + type); + return null; + } + if (in.hasNext()) { + type = in.next().getInt32Value(); + if (type == KEY_STRUCT_TEXT_POS) { + int top = in.next().getInt32Value(); + int left = in.next().getInt32Value(); + int bottom = in.next().getInt32Value(); + int right = in.next().getInt32Value(); + textBounds = new Rect(left, top, right, bottom); + } + } + return new TimedText(textChars, textBounds); + } + } + /** @hide */ static class TimeProvider implements MediaTimeProvider { private static final String TAG = "MTP"; diff --git a/media/java/android/media/TimedText.java b/media/java/android/media/TimedText.java index ebcea1995261e..d8cdf9c12e09a 100644 --- a/media/java/android/media/TimedText.java +++ b/media/java/android/media/TimedText.java @@ -363,6 +363,16 @@ public final class TimedText } } + /** + * @param text the characters in the timed text. + * @param bounds the rectangle area or region for rendering the timed text. + * {@hide} + */ + public TimedText(String text, Rect bounds) { + mTextChars = text; + mTextBounds = bounds; + } + /** * Get the characters in the timed text. * diff --git a/media/jni/Android.bp b/media/jni/Android.bp index b46816424995d..339a7eef637e3 100644 --- a/media/jni/Android.bp +++ b/media/jni/Android.bp @@ -145,7 +145,7 @@ cc_library_shared { "libstagefright_nuplayer2", "libstagefright_player2", "libstagefright_rtsp", - "libstagefright_timedtext", + "libstagefright_timedtext2", "libunwindstack", "libutilscallstack", "libziparchive", diff --git a/media/jni/android_media_MediaPlayer2.cpp b/media/jni/android_media_MediaPlayer2.cpp index d13262aab3ac9..801dade632681 100644 --- a/media/jni/android_media_MediaPlayer2.cpp +++ b/media/jni/android_media_MediaPlayer2.cpp @@ -199,11 +199,6 @@ void JNIMediaPlayer2Listener::notify(int64_t srcId, int msg, int ext1, int ext2, { JNIEnv *env = JavaVMHelper::getJNIEnv(); if (obj != NULL) { - // TODO: replace the following Parcel usages with proto. - // 1. MEDIA_DRM_INFO : DrmInfo - // 2. MEDIA_TIMED_TEXT : TimedText - // 2. MEDIA_SUBTITLE_DATA : SubtitleData - // 4. MEDIA_META_DATA : TimedMetaData int size = obj->ByteSize(); jbyte* temp = new jbyte[size]; obj->SerializeToArray(temp, size);