MediaPlayer: initial timed id3 support
Change-Id: Ibf2ea8fa1b44f2953bda49cdc6da979c2d3f6be2
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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!
|
||||
*/
|
||||
|
||||
71
media/java/android/media/TimedMetaData.java
Normal file
71
media/java/android/media/TimedMetaData.java
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user