summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/timedtext/TimedTextPlayer.cpp
diff options
context:
space:
mode:
authorInsun Kang <insun@google.com>2012-06-01 16:21:11 +0900
committerInsun Kang <insun@google.com>2012-08-02 11:56:07 +0900
commit2f0632f12cd02b0350918720443c888b48f4417b (patch)
treee1cfdbfb3834e49e165cea7f80a10f0f612c384b /media/libstagefright/timedtext/TimedTextPlayer.cpp
parent9007619d1f786a75dae0fff31feadbf9aed9cfb8 (diff)
downloadframeworks_av-2f0632f12cd02b0350918720443c888b48f4417b.zip
frameworks_av-2f0632f12cd02b0350918720443c888b48f4417b.tar.gz
frameworks_av-2f0632f12cd02b0350918720443c888b48f4417b.tar.bz2
Adjust fire time of a timed text message before firing it.
related-to-bug: 6501328 o When Video/Audio is stuttering, subtitle's firing time should be adjusted. Change-Id: I0e7e8a1796cb2b3c8a09c8fbd41690bce2689e85 (cherry picked from gtv: commit b2c3aedcb6c145e33ded39ef81e3202b2419469f)
Diffstat (limited to 'media/libstagefright/timedtext/TimedTextPlayer.cpp')
-rw-r--r--media/libstagefright/timedtext/TimedTextPlayer.cpp56
1 files changed, 39 insertions, 17 deletions
diff --git a/media/libstagefright/timedtext/TimedTextPlayer.cpp b/media/libstagefright/timedtext/TimedTextPlayer.cpp
index 9b001cc..bf22db9 100644
--- a/media/libstagefright/timedtext/TimedTextPlayer.cpp
+++ b/media/libstagefright/timedtext/TimedTextPlayer.cpp
@@ -18,6 +18,7 @@
#define LOG_TAG "TimedTextPlayer"
#include <utils/Log.h>
+#include <limits.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/timedtext/TimedTextDriver.h>
@@ -30,8 +31,12 @@
namespace android {
+// Event should be fired a bit earlier considering the processing time till
+// application actually gets the notification message.
static const int64_t kAdjustmentProcessingTimeUs = 100000ll;
+static const int64_t kMaxDelayUs = 5000000ll;
static const int64_t kWaitTimeUsToRetryRead = 100000ll;
+static const int64_t kInvalidTimeUs = INT_MIN;
TimedTextPlayer::TimedTextPlayer(const wp<MediaPlayerBase> &listener)
: mListener(listener),
@@ -111,6 +116,17 @@ void TimedTextPlayer::onMessageReceived(const sp<AMessage> &msg) {
// Drop obsolete msg.
break;
}
+ // If current time doesn't reach to the fire time,
+ // re-post the message with the adjusted delay time.
+ int64_t fireTimeUs = kInvalidTimeUs;
+ if (msg->findInt64("fireTimeUs", &fireTimeUs)) {
+ // TODO: check if fireTimeUs is not kInvalidTimeUs.
+ int64_t delayUs = delayUsFromCurrentTime(fireTimeUs);
+ if (delayUs > 0) {
+ msg->post(delayUs);
+ break;
+ }
+ }
sp<RefBase> obj;
if (msg->findObject("subtitle", &obj)) {
sp<ParcelEvent> parcelEvent;
@@ -185,23 +201,7 @@ void TimedTextPlayer::doRead(MediaSource::ReadOptions* options) {
}
void TimedTextPlayer::postTextEvent(const sp<ParcelEvent>& parcel, int64_t timeUs) {
- sp<MediaPlayerBase> listener = mListener.promote();
- if (listener != NULL) {
- int64_t positionUs, delayUs;
- int32_t positionMs = 0;
- listener->getCurrentPosition(&positionMs);
- positionUs = positionMs * 1000ll;
-
- if (timeUs <= positionUs + kAdjustmentProcessingTimeUs) {
- delayUs = 0;
- } else {
- delayUs = timeUs - positionUs - kAdjustmentProcessingTimeUs;
- }
- postTextEventDelayUs(parcel, delayUs);
- }
-}
-
-void TimedTextPlayer::postTextEventDelayUs(const sp<ParcelEvent>& parcel, int64_t delayUs) {
+ int64_t delayUs = delayUsFromCurrentTime(timeUs);
sp<MediaPlayerBase> listener = mListener.promote();
if (listener != NULL) {
sp<AMessage> msg = new AMessage(kWhatSendSubtitle, id());
@@ -209,10 +209,32 @@ void TimedTextPlayer::postTextEventDelayUs(const sp<ParcelEvent>& parcel, int64_
if (parcel != NULL) {
msg->setObject("subtitle", parcel);
}
+ msg->setInt64("fireTimeUs", timeUs);
msg->post(delayUs);
}
}
+int64_t TimedTextPlayer::delayUsFromCurrentTime(int64_t fireTimeUs) {
+ sp<MediaPlayerBase> listener = mListener.promote();
+ if (listener == NULL) {
+ // TODO: it may be better to return kInvalidTimeUs
+ return 0;
+ }
+ int32_t positionMs = 0;
+ listener->getCurrentPosition(&positionMs);
+ int64_t positionUs = positionMs * 1000ll;
+
+ if (fireTimeUs <= positionUs + kAdjustmentProcessingTimeUs) {
+ return 0;
+ } else {
+ int64_t delayUs = fireTimeUs - positionUs - kAdjustmentProcessingTimeUs;
+ if (delayUs > kMaxDelayUs) {
+ return kMaxDelayUs;
+ }
+ return delayUs;
+ }
+}
+
void TimedTextPlayer::notifyError(int error) {
sp<MediaPlayerBase> listener = mListener.promote();
if (listener != NULL) {