diff options
author | Insun Kang <insun@google.com> | 2012-03-14 08:16:35 +0900 |
---|---|---|
committer | Insun Kang <insun@google.com> | 2012-03-21 10:44:04 +0900 |
commit | bae00e73c6d1d87cc5fd42b50f95d1d9572162ea (patch) | |
tree | 23f0936dc8ce1c2167fbba1b9f1c2d9de7044f7e /media/libstagefright/timedtext/TimedTextPlayer.cpp | |
parent | 1bb8e81b066a2311fd238fc6dae8f026e33ed99e (diff) | |
download | frameworks_av-bae00e73c6d1d87cc5fd42b50f95d1d9572162ea.zip frameworks_av-bae00e73c6d1d87cc5fd42b50f95d1d9572162ea.tar.gz frameworks_av-bae00e73c6d1d87cc5fd42b50f95d1d9572162ea.tar.bz2 |
Handling end times of subtitles.
Change-Id: Ic19ec8980d0a2bf9f265d375cd56e638a2460af8
Diffstat (limited to 'media/libstagefright/timedtext/TimedTextPlayer.cpp')
-rw-r--r-- | media/libstagefright/timedtext/TimedTextPlayer.cpp | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/media/libstagefright/timedtext/TimedTextPlayer.cpp b/media/libstagefright/timedtext/TimedTextPlayer.cpp index 8717914..917c62a 100644 --- a/media/libstagefright/timedtext/TimedTextPlayer.cpp +++ b/media/libstagefright/timedtext/TimedTextPlayer.cpp @@ -31,6 +31,7 @@ namespace android { static const int64_t kAdjustmentProcessingTimeUs = 100000ll; +static const int64_t kWaitTimeUsToRetryRead = 100000ll; TimedTextPlayer::TimedTextPlayer(const wp<MediaPlayerBase> &listener) : mListener(listener), @@ -139,13 +140,25 @@ void TimedTextPlayer::doSeekAndRead(int64_t seekTimeUs) { } void TimedTextPlayer::doRead(MediaSource::ReadOptions* options) { - int64_t timeUs = 0; + int64_t startTimeUs = 0; + int64_t endTimeUs = 0; sp<ParcelEvent> parcelEvent = new ParcelEvent(); - status_t err = mSource->read(&timeUs, &(parcelEvent->parcel), options); - if (err != OK) { + status_t err = mSource->read(&startTimeUs, &endTimeUs, + &(parcelEvent->parcel), options); + if (err == WOULD_BLOCK) { + postTextEventDelayUs(NULL, kWaitTimeUsToRetryRead); + return; + } else if (err != OK) { notifyError(err); - } else { - postTextEvent(parcelEvent, timeUs); + return; + } + + postTextEvent(parcelEvent, startTimeUs); + if (endTimeUs > 0) { + CHECK_GE(endTimeUs, startTimeUs); + // send an empty timed text to clear the subtitle when it reaches to the + // end time. + postTextEvent(NULL, endTimeUs); } } @@ -162,6 +175,13 @@ void TimedTextPlayer::postTextEvent(const sp<ParcelEvent>& parcel, int64_t timeU } else { delayUs = timeUs - positionUs - kAdjustmentProcessingTimeUs; } + postTextEventDelayUs(parcel, delayUs); + } +} + +void TimedTextPlayer::postTextEventDelayUs(const sp<ParcelEvent>& parcel, int64_t delayUs) { + sp<MediaPlayerBase> listener = mListener.promote(); + if (listener != NULL) { sp<AMessage> msg = new AMessage(kWhatSendSubtitle, id()); msg->setInt32("generation", mSendSubtitleGeneration); if (parcel != NULL) { |