summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/rtsp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-01-20 13:30:03 -0800
committerAndreas Huber <andih@google.com>2012-01-20 13:30:03 -0800
commit7e73e44c2d2208a7079e562f7b0b9b73ef6a29f1 (patch)
treef0d1a0eab6914865bfe576d427d6fa2ee5480a6f /media/libstagefright/rtsp
parent6f444c95d86936217bf49fc11d279851b0fa364d (diff)
downloadframeworks_av-7e73e44c2d2208a7079e562f7b0b9b73ef6a29f1.zip
frameworks_av-7e73e44c2d2208a7079e562f7b0b9b73ef6a29f1.tar.gz
frameworks_av-7e73e44c2d2208a7079e562f7b0b9b73ef6a29f1.tar.bz2
Starhub RTSP apparently does not establish time on all tracks
i.e. the "SR" RTCP packet is sent for only one of the two tracks. fake timestamps if that's the case, previously we'd only fake timestamps if we didn't receive _any_ "SR" packets. Change-Id: Id63d4940d453ba6c04c62e02ab9a0ad843936bc1 related-to-bug: 5669027
Diffstat (limited to 'media/libstagefright/rtsp')
-rw-r--r--media/libstagefright/rtsp/MyHandler.h30
1 files changed, 29 insertions, 1 deletions
diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h
index 2391c5c..9a7dd70 100644
--- a/media/libstagefright/rtsp/MyHandler.h
+++ b/media/libstagefright/rtsp/MyHandler.h
@@ -122,6 +122,7 @@ struct MyHandler : public AHandler {
mSetupTracksSuccessful(false),
mSeekPending(false),
mFirstAccessUnit(true),
+ mAllTracksHaveTime(false),
mNTPAnchorUs(-1),
mMediaAnchorUs(-1),
mLastMediaTimeUs(0),
@@ -723,6 +724,7 @@ struct MyHandler : public AHandler {
mSetupTracksSuccessful = false;
mSeekPending = false;
mFirstAccessUnit = true;
+ mAllTracksHaveTime = false;
mNTPAnchorUs = -1;
mMediaAnchorUs = -1;
mNumAccessUnitsReceived = 0;
@@ -930,6 +932,7 @@ struct MyHandler : public AHandler {
info->mNTPAnchorUs = -1;
}
+ mAllTracksHaveTime = false;
mNTPAnchorUs = -1;
int64_t timeUs;
@@ -1037,6 +1040,14 @@ struct MyHandler : public AHandler {
ALOGW("Never received any data, disconnecting.");
(new AMessage('abor', id()))->post();
}
+ } else {
+ if (!mAllTracksHaveTime) {
+ ALOGW("We received some RTCP packets, but time "
+ "could not be established on all tracks, now "
+ "using fake timestamps");
+
+ fakeTimestamps();
+ }
}
break;
}
@@ -1211,6 +1222,7 @@ private:
bool mSeekPending;
bool mFirstAccessUnit;
+ bool mAllTracksHaveTime;
int64_t mNTPAnchorUs;
int64_t mMediaAnchorUs;
int64_t mLastMediaTimeUs;
@@ -1357,6 +1369,7 @@ private:
}
void fakeTimestamps() {
+ mNTPAnchorUs = -1ll;
for (size_t i = 0; i < mTracks.size(); ++i) {
onTimeUpdate(i, 0, 0ll);
}
@@ -1377,6 +1390,21 @@ private:
mNTPAnchorUs = ntpTimeUs;
mMediaAnchorUs = mLastMediaTimeUs;
}
+
+ if (!mAllTracksHaveTime) {
+ bool allTracksHaveTime = true;
+ for (size_t i = 0; i < mTracks.size(); ++i) {
+ TrackInfo *track = &mTracks.editItemAt(i);
+ if (track->mNTPAnchorUs < 0) {
+ allTracksHaveTime = false;
+ break;
+ }
+ }
+ if (allTracksHaveTime) {
+ mAllTracksHaveTime = true;
+ ALOGI("Time now established for all tracks.");
+ }
+ }
}
void onAccessUnitComplete(
@@ -1403,7 +1431,7 @@ private:
TrackInfo *track = &mTracks.editItemAt(trackIndex);
- if (mNTPAnchorUs < 0 || mMediaAnchorUs < 0 || track->mNTPAnchorUs < 0) {
+ if (!mAllTracksHaveTime) {
ALOGV("storing accessUnit, no time established yet");
track->mPackets.push_back(accessUnit);
return;