diff options
author | Gloria Wang <gwang@google.com> | 2011-04-11 17:23:27 -0700 |
---|---|---|
committer | Gloria Wang <gwang@google.com> | 2011-04-13 11:11:34 -0700 |
commit | 162ee49e1ce8800de80697fdd0e0e42ad7e9374e (patch) | |
tree | fb729edc49c75aa905daa34211810bd92c959f8c /media | |
parent | a58ee55f490953247882298d56003cbf94285344 (diff) | |
download | frameworks_base-162ee49e1ce8800de80697fdd0e0e42ad7e9374e.zip frameworks_base-162ee49e1ce8800de80697fdd0e0e42ad7e9374e.tar.gz frameworks_base-162ee49e1ce8800de80697fdd0e0e42ad7e9374e.tar.bz2 |
- Add another parameter in notify() to be able to send timed text sample
through listener during video playback.
- Add OnTimedTextListener in the MediaPlayer
For feature request 800939.
Change-Id: I65072c27acb4c0037109a72be38c73e9f667420f
Diffstat (limited to 'media')
-rw-r--r-- | media/java/android/media/MediaPlayer.java | 40 | ||||
-rw-r--r-- | media/jni/android_media_MediaPlayer.cpp | 19 | ||||
-rw-r--r-- | media/libmedia/IMediaPlayerClient.cpp | 12 | ||||
-rw-r--r-- | media/libmedia/mediaplayer.cpp | 7 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 8 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.h | 6 |
6 files changed, 80 insertions, 12 deletions
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 0b0d145..1e4b585 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -1120,6 +1120,7 @@ public class MediaPlayer mOnErrorListener = null; mOnInfoListener = null; mOnVideoSizeChangedListener = null; + mOnTimedTextListener = null; _release(); } @@ -1301,6 +1302,7 @@ public class MediaPlayer private static final int MEDIA_BUFFERING_UPDATE = 3; private static final int MEDIA_SEEK_COMPLETE = 4; private static final int MEDIA_SET_VIDEO_SIZE = 5; + private static final int MEDIA_TIMED_TEXT = 99; private static final int MEDIA_ERROR = 100; private static final int MEDIA_INFO = 200; @@ -1369,6 +1371,11 @@ public class MediaPlayer } // No real default action so far. return; + case MEDIA_TIMED_TEXT: + if (mOnTimedTextListener != null) { + mOnTimedTextListener.onTimedText(mMediaPlayer, (String)msg.obj); + } + return; case MEDIA_NOP: // interface test message - ignore break; @@ -1545,6 +1552,39 @@ public class MediaPlayer private OnVideoSizeChangedListener mOnVideoSizeChangedListener; + /** + * Interface definition of a callback to be invoked when a + * timed text is available for display. + * {@hide} + */ + public interface OnTimedTextListener + { + /** + * Called to indicate the video size + * + * @param mp the MediaPlayer associated with this callback + * @param text the timed text sample which contains the + * text needed to be displayed. + * {@hide} + */ + public void onTimedText(MediaPlayer mp, String text); + } + + /** + * Register a callback to be invoked when a timed text is available + * for display. + * + * @param listener the callback that will be run + * {@hide} + */ + public void setOnTimedTextListener(OnTimedTextListener listener) + { + mOnTimedTextListener = listener; + } + + private OnTimedTextListener mOnTimedTextListener; + + /* Do not change these values without updating their counterparts * in include/media/mediaplayer.h! */ diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp index ecbd288..ec61956 100644 --- a/media/jni/android_media_MediaPlayer.cpp +++ b/media/jni/android_media_MediaPlayer.cpp @@ -69,7 +69,7 @@ class JNIMediaPlayerListener: public MediaPlayerListener public: JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz); ~JNIMediaPlayerListener(); - void notify(int msg, int ext1, int ext2); + virtual void notify(int msg, int ext1, int ext2, const Parcel *obj = NULL); private: JNIMediaPlayerListener(); jclass mClass; // Reference to MediaPlayer class @@ -102,10 +102,23 @@ JNIMediaPlayerListener::~JNIMediaPlayerListener() env->DeleteGlobalRef(mClass); } -void JNIMediaPlayerListener::notify(int msg, int ext1, int ext2) +void JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *obj) { JNIEnv *env = AndroidRuntime::getJNIEnv(); - env->CallStaticVoidMethod(mClass, fields.post_event, mObject, msg, ext1, ext2, 0); + if (obj && obj->dataSize() > 0) { + jbyteArray jArray = env->NewByteArray(obj->dataSize()); + if (jArray != NULL) { + jbyte *nArray = env->GetByteArrayElements(jArray, NULL); + memcpy(nArray, obj->data(), obj->dataSize()); + env->ReleaseByteArrayElements(jArray, nArray, 0); + env->CallStaticVoidMethod(mClass, fields.post_event, mObject, + msg, ext1, ext2, jArray); + env->DeleteLocalRef(jArray); + } + } else { + env->CallStaticVoidMethod(mClass, fields.post_event, mObject, + msg, ext1, ext2, NULL); + } } // ---------------------------------------------------------------------------- diff --git a/media/libmedia/IMediaPlayerClient.cpp b/media/libmedia/IMediaPlayerClient.cpp index bf51829..1f135c4 100644 --- a/media/libmedia/IMediaPlayerClient.cpp +++ b/media/libmedia/IMediaPlayerClient.cpp @@ -35,13 +35,16 @@ public: { } - virtual void notify(int msg, int ext1, int ext2) + virtual void notify(int msg, int ext1, int ext2, const Parcel *obj) { Parcel data, reply; data.writeInterfaceToken(IMediaPlayerClient::getInterfaceDescriptor()); data.writeInt32(msg); data.writeInt32(ext1); data.writeInt32(ext2); + if (obj && obj->dataSize() > 0) { + data.appendFrom(const_cast<Parcel *>(obj), 0, obj->dataSize()); + } remote()->transact(NOTIFY, data, &reply, IBinder::FLAG_ONEWAY); } }; @@ -59,7 +62,12 @@ status_t BnMediaPlayerClient::onTransact( int msg = data.readInt32(); int ext1 = data.readInt32(); int ext2 = data.readInt32(); - notify(msg, ext1, ext2); + Parcel obj; + if (data.dataAvail() > 0) { + obj.appendFrom(const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail()); + } + + notify(msg, ext1, ext2, &obj); return NO_ERROR; } break; default: diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index 0ee0249..e80e742 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -551,7 +551,7 @@ status_t MediaPlayer::attachAuxEffect(int effectId) return mPlayer->attachAuxEffect(effectId); } -void MediaPlayer::notify(int msg, int ext1, int ext2) +void MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj) { LOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2); bool send = true; @@ -641,6 +641,9 @@ void MediaPlayer::notify(int msg, int ext1, int ext2) mVideoWidth = ext1; mVideoHeight = ext2; break; + case MEDIA_TIMED_TEXT: + LOGV("Received timed text message"); + break; default: LOGV("unrecognized message: (%d, %d, %d)", msg, ext1, ext2); break; @@ -653,7 +656,7 @@ void MediaPlayer::notify(int msg, int ext1, int ext2) if ((listener != 0) && send) { Mutex::Autolock _l(mNotifyLock); LOGV("callback application"); - listener->notify(msg, ext1, ext2); + listener->notify(msg, ext1, ext2, obj); LOGV("back from callback"); } } diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 9c9ac97..6b97708 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -1022,7 +1022,8 @@ status_t MediaPlayerService::Client::attachAuxEffect(int effectId) return NO_ERROR; } -void MediaPlayerService::Client::notify(void* cookie, int msg, int ext1, int ext2) +void MediaPlayerService::Client::notify( + void* cookie, int msg, int ext1, int ext2, const Parcel *obj) { Client* client = static_cast<Client*>(cookie); @@ -1039,7 +1040,7 @@ void MediaPlayerService::Client::notify(void* cookie, int msg, int ext1, int ext client->addNewMetadataUpdate(metadata_type); } LOGV("[%d] notify (%p, %d, %d, %d)", client->mConnId, cookie, msg, ext1, ext2); - client->mClient->notify(msg, ext1, ext2); + client->mClient->notify(msg, ext1, ext2, obj); } @@ -1623,7 +1624,8 @@ status_t MediaPlayerService::AudioCache::wait() return mError; } -void MediaPlayerService::AudioCache::notify(void* cookie, int msg, int ext1, int ext2) +void MediaPlayerService::AudioCache::notify( + void* cookie, int msg, int ext1, int ext2, const Parcel *obj) { LOGV("notify(%p, %d, %d, %d)", cookie, msg, ext1, ext2); AudioCache* p = static_cast<AudioCache*>(cookie); diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index ff6ccf5..5539a37 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -156,7 +156,8 @@ class MediaPlayerService : public BnMediaPlayerService sp<IMemoryHeap> getHeap() const { return mHeap; } - static void notify(void* cookie, int msg, int ext1, int ext2); + static void notify(void* cookie, int msg, + int ext1, int ext2, const Parcel *obj); virtual status_t dump(int fd, const Vector<String16>& args) const; private: @@ -287,7 +288,8 @@ private: status_t setDataSource(const sp<IStreamSource> &source); - static void notify(void* cookie, int msg, int ext1, int ext2); + static void notify(void* cookie, int msg, + int ext1, int ext2, const Parcel *obj); pid_t pid() const { return mPid; } virtual status_t dump(int fd, const Vector<String16>& args) const; |