diff options
| author | Robert Shih <robertshih@google.com> | 2015-04-10 11:15:02 -0700 |
|---|---|---|
| committer | Robert Shih <robertshih@google.com> | 2015-04-17 19:49:13 -0700 |
| commit | ac033f033d2c0ff3d7cfd037409278d73260e87c (patch) | |
| tree | dec4775425dda7c9549d6fd26340c84527101d9e | |
| parent | bb664e12e2539c4e8121764a891e000d52e9664f (diff) | |
| download | frameworks_base-ac033f033d2c0ff3d7cfd037409278d73260e87c.zip frameworks_base-ac033f033d2c0ff3d7cfd037409278d73260e87c.tar.gz frameworks_base-ac033f033d2c0ff3d7cfd037409278d73260e87c.tar.bz2 | |
MediaPlayer: initial timed id3 support
Change-Id: Ibf2ea8fa1b44f2953bda49cdc6da979c2d3f6be2
| -rw-r--r-- | api/current.txt | 11 | ||||
| -rw-r--r-- | api/system-current.txt | 11 | ||||
| -rw-r--r-- | media/java/android/media/MediaPlayer.java | 54 | ||||
| -rw-r--r-- | media/java/android/media/TimedMetaData.java | 71 |
4 files changed, 147 insertions, 0 deletions
diff --git a/api/current.txt b/api/current.txt index 202139c..17cf44e 100644 --- a/api/current.txt +++ b/api/current.txt @@ -15654,6 +15654,7 @@ package android.media { method public void setOnInfoListener(android.media.MediaPlayer.OnInfoListener); method public void setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener); method public void setOnSeekCompleteListener(android.media.MediaPlayer.OnSeekCompleteListener); + method public void setOnTimedMetaDataListener(android.media.MediaPlayer.OnTimedMetaDataListener); method public void setOnTimedTextListener(android.media.MediaPlayer.OnTimedTextListener); method public void setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener); method public void setPlaybackRate(float, int); @@ -15711,6 +15712,10 @@ package android.media { method public abstract void onSeekComplete(android.media.MediaPlayer); } + public static abstract interface MediaPlayer.OnTimedMetaDataListener { + method public abstract void onTimedMetaData(android.media.MediaPlayer, android.media.TimedMetaData); + } + public static abstract interface MediaPlayer.OnTimedTextListener { method public abstract void onTimedText(android.media.MediaPlayer, android.media.TimedText); } @@ -15726,6 +15731,7 @@ package android.media { method public int getTrackType(); method public void writeToParcel(android.os.Parcel, int); field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2 + field public static final int MEDIA_TRACK_TYPE_METADATA = 5; // 0x5 field public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4; // 0x4 field public static final int MEDIA_TRACK_TYPE_TIMEDTEXT = 3; // 0x3 field public static final int MEDIA_TRACK_TYPE_UNKNOWN = 0; // 0x0 @@ -16171,6 +16177,11 @@ package android.media { field public static final int OPTIONS_RECYCLE_INPUT = 2; // 0x2 } + public class TimedMetaData { + method public byte[] getRawData(); + method public long getTimeUs(); + } + public final class TimedText { method public android.graphics.Rect getBounds(); method public java.lang.String getText(); diff --git a/api/system-current.txt b/api/system-current.txt index c6c37d5..ce0e8e8 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -16859,6 +16859,7 @@ package android.media { method public void setOnInfoListener(android.media.MediaPlayer.OnInfoListener); method public void setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener); method public void setOnSeekCompleteListener(android.media.MediaPlayer.OnSeekCompleteListener); + method public void setOnTimedMetaDataListener(android.media.MediaPlayer.OnTimedMetaDataListener); method public void setOnTimedTextListener(android.media.MediaPlayer.OnTimedTextListener); method public void setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener); method public void setPlaybackRate(float, int); @@ -16916,6 +16917,10 @@ package android.media { method public abstract void onSeekComplete(android.media.MediaPlayer); } + public static abstract interface MediaPlayer.OnTimedMetaDataListener { + method public abstract void onTimedMetaData(android.media.MediaPlayer, android.media.TimedMetaData); + } + public static abstract interface MediaPlayer.OnTimedTextListener { method public abstract void onTimedText(android.media.MediaPlayer, android.media.TimedText); } @@ -16931,6 +16936,7 @@ package android.media { method public int getTrackType(); method public void writeToParcel(android.os.Parcel, int); field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2 + field public static final int MEDIA_TRACK_TYPE_METADATA = 5; // 0x5 field public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4; // 0x4 field public static final int MEDIA_TRACK_TYPE_TIMEDTEXT = 3; // 0x3 field public static final int MEDIA_TRACK_TYPE_UNKNOWN = 0; // 0x0 @@ -17378,6 +17384,11 @@ package android.media { field public static final int OPTIONS_RECYCLE_INPUT = 2; // 0x2 } + public class TimedMetaData { + method public byte[] getRawData(); + method public long getTimeUs(); + } + public final class TimedText { method public android.graphics.Rect getBounds(); method public java.lang.String getText(); diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 83954ae..763d358 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -1822,6 +1822,7 @@ public class MediaPlayer implements SubtitleController.Listener public static final int MEDIA_TRACK_TYPE_AUDIO = 2; public static final int MEDIA_TRACK_TYPE_TIMEDTEXT = 3; public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4; + public static final int MEDIA_TRACK_TYPE_METADATA = 5; final int mTrackType; final MediaFormat mFormat; @@ -2562,6 +2563,7 @@ public class MediaPlayer implements SubtitleController.Listener private static final int MEDIA_ERROR = 100; private static final int MEDIA_INFO = 200; private static final int MEDIA_SUBTITLE_DATA = 201; + private static final int MEDIA_META_DATA = 202; private TimeProvider mTimeProvider; @@ -2709,6 +2711,18 @@ public class MediaPlayer implements SubtitleController.Listener } return; + case MEDIA_META_DATA: + if (mOnTimedMetaDataListener == null) { + return; + } + if (msg.obj instanceof Parcel) { + Parcel parcel = (Parcel) msg.obj; + TimedMetaData data = TimedMetaData.createTimedMetaDataFromParcel(parcel); + parcel.recycle(); + mOnTimedMetaDataListener.onTimedMetaData(mMediaPlayer, data); + } + return; + case MEDIA_NOP: // interface test message - ignore break; @@ -2945,6 +2959,46 @@ public class MediaPlayer implements SubtitleController.Listener private OnSubtitleDataListener mOnSubtitleDataListener; + /** + * Interface definition of a callback to be invoked when a + * track has timed metadata available. + * + * @see MediaPlayer#setOnTimedMetaDataListener(OnTimedMetaDataListener) + */ + public interface OnTimedMetaDataListener + { + /** + * Called to indicate avaliable timed metadata + * <p> + * This method will be called as timed metadata is extracted from the media, + * in the same order as it occurs in the media. The timing of this event is + * not controlled by the associated timestamp. + * + * @param mp the MediaPlayer associated with this callback + * @param data the timed metadata sample associated with this event + */ + public void onTimedMetaData(MediaPlayer mp, TimedMetaData data); + } + + /** + * Register a callback to be invoked when a selected track has timed metadata available. + * <p> + * Currently only HTTP live streaming data URI's embedded with timed ID3 tags generates + * {@link TimedMetaData}. + * + * @see MediaPlayer#selectTrack(int) + * @see MediaPlayer.OnTimedMetaDataListener + * @see TimedMetaData + * + * @param listener the callback that will be run + */ + public void setOnTimedMetaDataListener(OnTimedMetaDataListener listener) + { + mOnTimedMetaDataListener = listener; + } + + private OnTimedMetaDataListener mOnTimedMetaDataListener; + /* Do not change these values without updating their counterparts * in include/media/mediaplayer.h! */ diff --git a/media/java/android/media/TimedMetaData.java b/media/java/android/media/TimedMetaData.java new file mode 100644 index 0000000..dceb050 --- /dev/null +++ b/media/java/android/media/TimedMetaData.java @@ -0,0 +1,71 @@ +/* + * Copyright 2015 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 android.media; + +import android.os.Parcel; + +/** + * Class that embodies a piece of timed metadata, including + * + * <ul> + * <li> a time stamp, and </li> + * <li> raw uninterpreted byte-array extracted directly from the container. </li> + * </ul> + * + * @see MediaPlayer#setOnTimedMetaDataListener(android.media.MediaPlayer.OnTimedMetaDataListener) + */ + +public class TimedMetaData { + private static final String TAG = "TimedMetaData"; + + private long mTimeUs; + private byte[] mRawData; + + /** + * @hide + */ + static TimedMetaData createTimedMetaDataFromParcel(Parcel parcel) { + return new TimedMetaData(parcel); + } + + private TimedMetaData(Parcel parcel) { + if (!parseParcel(parcel)) { + throw new IllegalArgumentException("parseParcel() fails"); + } + } + + public long getTimeUs() { + return mTimeUs; + } + + public byte[] getRawData() { + return mRawData; + } + + private boolean parseParcel(Parcel parcel) { + parcel.setDataPosition(0); + if (parcel.dataAvail() == 0) { + return false; + } + + mTimeUs = parcel.readLong(); + mRawData = new byte[parcel.readInt()]; + parcel.readByteArray(mRawData); + + return true; + } +} |
