From 7a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3 Mon Sep 17 00:00:00 2001 From: Gloria Wang Date: Tue, 3 May 2011 15:59:03 -0700 Subject: Initial CL for the timed text support: - Add support for MP4 timed text - Add API for app to turn on/off a text track - Add timed text metadata(language) in the MediaMetadataRetriever Change-Id: I0055beba38ac761627dbcc6d581ae9582d68bb94 --- media/libstagefright/AwesomePlayer.cpp | 70 +++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 6 deletions(-) (limited to 'media/libstagefright/AwesomePlayer.cpp') diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 974efa7..cccd0b7 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -28,6 +28,7 @@ #include "include/NuCachedSource2.h" #include "include/ThrottledSource.h" #include "include/MPEG2TSExtractor.h" +#include "include/TimedTextPlayer.h" #include #include @@ -185,7 +186,8 @@ AwesomePlayer::AwesomePlayer() mExtractorFlags(0), mVideoBuffer(NULL), mDecryptHandle(NULL), - mLastVideoTimeUs(-1) { + mLastVideoTimeUs(-1), + mTextPlayer(NULL) { CHECK_EQ(mClient.connect(), (status_t)OK); DataSource::RegisterDefaultSniffers(); @@ -381,10 +383,8 @@ status_t AwesomePlayer::setDataSource_l(const sp &extractor) { mFlags |= AUTO_LOOPING; } } - } - - if (haveAudio && haveVideo) { - break; + } else if (!strcasecmp(mime, MEDIA_MIMETYPE_TEXT_3GPP)) { + addTextSource(extractor->getTrack(i)); } } @@ -469,6 +469,11 @@ void AwesomePlayer::reset_l() { delete mAudioPlayer; mAudioPlayer = NULL; + if (mTextPlayer != NULL) { + delete mTextPlayer; + mTextPlayer = NULL; + } + mVideoRenderer.clear(); if (mRTSPController != NULL) { @@ -971,6 +976,11 @@ status_t AwesomePlayer::pause_l(bool at_eos) { mFlags &= ~AUDIO_RUNNING; } + if (mFlags & TEXTPLAYER_STARTED) { + mTextPlayer->pause(); + mFlags &= ~TEXT_RUNNING; + } + mFlags &= ~PLAYING; if (mDecryptHandle != NULL) { @@ -1119,6 +1129,32 @@ status_t AwesomePlayer::seekTo(int64_t timeUs) { return OK; } +status_t AwesomePlayer::setTimedTextTrackIndex(int32_t index) { + if (mTextPlayer != NULL) { + if (index >= 0) { // to turn on a text track + status_t err = mTextPlayer->setTimedTextTrackIndex(index); + if (err != OK) { + return err; + } + + mFlags |= TEXT_RUNNING; + mFlags |= TEXTPLAYER_STARTED; + return OK; + } else { // to turn off the text track display + if (mFlags & TEXT_RUNNING) { + mFlags &= ~TEXT_RUNNING; + } + if (mFlags & TEXTPLAYER_STARTED) { + mFlags &= ~TEXTPLAYER_STARTED; + } + + return mTextPlayer->setTimedTextTrackIndex(index); + } + } else { + return INVALID_OPERATION; + } +} + // static void AwesomePlayer::OnRTSPSeekDoneWrapper(void *cookie) { static_cast(cookie)->onRTSPSeekDone(); @@ -1155,6 +1191,10 @@ status_t AwesomePlayer::seekTo_l(int64_t timeUs) { seekAudioIfNecessary_l(); + if (mFlags & TEXTPLAYER_STARTED) { + mTextPlayer->seekTo(mSeekTimeUs); + } + if (!(mFlags & PLAYING)) { LOGV("seeking while paused, sending SEEK_COMPLETE notification" " immediately."); @@ -1193,6 +1233,16 @@ void AwesomePlayer::setAudioSource(sp source) { mAudioTrack = source; } +void AwesomePlayer::addTextSource(sp source) { + CHECK(source != NULL); + + if (mTextPlayer == NULL) { + mTextPlayer = new TimedTextPlayer(this, mListener, &mQueue); + } + + mTextPlayer->addTextSource(source); +} + status_t AwesomePlayer::initAudioDecoder() { sp meta = mAudioTrack->getFormat(); @@ -1472,6 +1522,11 @@ void AwesomePlayer::onVideoEvent() { } } + if ((mFlags & TEXTPLAYER_STARTED) && !(mFlags & (TEXT_RUNNING | SEEK_PREVIEW))) { + mTextPlayer->resume(); + mFlags |= TEXT_RUNNING; + } + TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; if (mFlags & FIRST_FRAME) { @@ -1906,7 +1961,10 @@ void AwesomePlayer::postAudioSeekComplete() { } status_t AwesomePlayer::setParameter(int key, const Parcel &request) { - return OK; + if (key == KEY_PARAMETER_TIMED_TEXT_TRACK_INDEX) { + return setTimedTextTrackIndex(request.readInt32()); + } + return ERROR_UNSUPPORTED; } status_t AwesomePlayer::getParameter(int key, Parcel *reply) { -- cgit v1.1