@@ -122,6 +122,7 @@ struct MyHandler : public AHandler {
122122 mSetupTracksSuccessful(false ),
123123 mSeekPending(false ),
124124 mFirstAccessUnit(true ),
125+ mAllTracksHaveTime(false ),
125126 mNTPAnchorUs(-1 ),
126127 mMediaAnchorUs(-1 ),
127128 mLastMediaTimeUs(0 ),
@@ -723,6 +724,7 @@ struct MyHandler : public AHandler {
723724 mSetupTracksSuccessful = false ;
724725 mSeekPending = false ;
725726 mFirstAccessUnit = true ;
727+ mAllTracksHaveTime = false ;
726728 mNTPAnchorUs = -1 ;
727729 mMediaAnchorUs = -1 ;
728730 mNumAccessUnitsReceived = 0 ;
@@ -930,6 +932,7 @@ struct MyHandler : public AHandler {
930932 info->mNTPAnchorUs = -1 ;
931933 }
932934
935+ mAllTracksHaveTime = false ;
933936 mNTPAnchorUs = -1 ;
934937
935938 int64_t timeUs;
@@ -1037,6 +1040,14 @@ struct MyHandler : public AHandler {
10371040 ALOGW (" Never received any data, disconnecting." );
10381041 (new AMessage (' abor' , id ()))->post ();
10391042 }
1043+ } else {
1044+ if (!mAllTracksHaveTime ) {
1045+ ALOGW (" We received some RTCP packets, but time "
1046+ " could not be established on all tracks, now "
1047+ " using fake timestamps" );
1048+
1049+ fakeTimestamps ();
1050+ }
10401051 }
10411052 break ;
10421053 }
@@ -1211,6 +1222,7 @@ struct MyHandler : public AHandler {
12111222 bool mSeekPending ;
12121223 bool mFirstAccessUnit ;
12131224
1225+ bool mAllTracksHaveTime ;
12141226 int64_t mNTPAnchorUs ;
12151227 int64_t mMediaAnchorUs ;
12161228 int64_t mLastMediaTimeUs ;
@@ -1357,6 +1369,7 @@ struct MyHandler : public AHandler {
13571369 }
13581370
13591371 void fakeTimestamps () {
1372+ mNTPAnchorUs = -1ll ;
13601373 for (size_t i = 0 ; i < mTracks .size (); ++i) {
13611374 onTimeUpdate (i, 0 , 0ll );
13621375 }
@@ -1377,6 +1390,21 @@ struct MyHandler : public AHandler {
13771390 mNTPAnchorUs = ntpTimeUs;
13781391 mMediaAnchorUs = mLastMediaTimeUs ;
13791392 }
1393+
1394+ if (!mAllTracksHaveTime ) {
1395+ bool allTracksHaveTime = true ;
1396+ for (size_t i = 0 ; i < mTracks .size (); ++i) {
1397+ TrackInfo *track = &mTracks .editItemAt (i);
1398+ if (track->mNTPAnchorUs < 0 ) {
1399+ allTracksHaveTime = false ;
1400+ break ;
1401+ }
1402+ }
1403+ if (allTracksHaveTime) {
1404+ mAllTracksHaveTime = true ;
1405+ ALOGI (" Time now established for all tracks." );
1406+ }
1407+ }
13801408 }
13811409
13821410 void onAccessUnitComplete (
@@ -1403,7 +1431,7 @@ struct MyHandler : public AHandler {
14031431
14041432 TrackInfo *track = &mTracks .editItemAt (trackIndex);
14051433
1406- if (mNTPAnchorUs < 0 || mMediaAnchorUs < 0 || track-> mNTPAnchorUs < 0 ) {
1434+ if (! mAllTracksHaveTime ) {
14071435 ALOGV (" storing accessUnit, no time established yet" );
14081436 track->mPackets .push_back (accessUnit);
14091437 return ;
0 commit comments