Skip to content

Commit f6ae711

Browse files
committed
Fix Bitreader "putBits" implementation, make sure we emulate timestamps
if we don't receive npt time mapping from the rtsp server (i.e. live stream) Change-Id: I5147d665bd90c9a303ad6ffdafbf770f930f917c related-to-bug: 5660357
1 parent a693a4b commit f6ae711

File tree

4 files changed

+37
-13
lines changed

4 files changed

+37
-13
lines changed

media/libmediaplayerservice/nuplayer/RTSPSource.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -208,21 +208,32 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) {
208208
break;
209209
}
210210

211-
const TrackInfo &info = mTracks.editItemAt(trackIndex);
212-
sp<AnotherPacketSource> source = info.mSource;
211+
TrackInfo *info = &mTracks.editItemAt(trackIndex);
212+
213+
sp<AnotherPacketSource> source = info->mSource;
213214
if (source != NULL) {
214-
#if 1
215215
uint32_t rtpTime;
216216
CHECK(accessUnit->meta()->findInt32("rtp-time", (int32_t *)&rtpTime));
217217

218+
if (!info->mNPTMappingValid) {
219+
// This is a live stream, we didn't receive any normal
220+
// playtime mapping. Assume the first packets correspond
221+
// to time 0.
222+
223+
LOGV("This is a live stream, assuming time = 0");
224+
225+
info->mRTPTime = rtpTime;
226+
info->mNormalPlaytimeUs = 0ll;
227+
info->mNPTMappingValid = true;
228+
}
229+
218230
int64_t nptUs =
219-
((double)rtpTime - (double)info.mRTPTime)
220-
/ info.mTimeScale
231+
((double)rtpTime - (double)info->mRTPTime)
232+
/ info->mTimeScale
221233
* 1000000ll
222-
+ info.mNormalPlaytimeUs;
234+
+ info->mNormalPlaytimeUs;
223235

224236
accessUnit->meta()->setInt64("timeUs", nptUs);
225-
#endif
226237

227238
source->queueAccessUnit(accessUnit);
228239
}
@@ -278,6 +289,7 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) {
278289
TrackInfo *info = &mTracks.editItemAt(trackIndex);
279290
info->mRTPTime = rtpTime;
280291
info->mNormalPlaytimeUs = nptUs;
292+
info->mNPTMappingValid = true;
281293
break;
282294
}
283295

@@ -305,6 +317,7 @@ void NuPlayer::RTSPSource::onConnected() {
305317
info.mTimeScale = timeScale;
306318
info.mRTPTime = 0;
307319
info.mNormalPlaytimeUs = 0ll;
320+
info.mNPTMappingValid = false;
308321

309322
if ((isAudio && mAudioTrack == NULL)
310323
|| (isVideo && mVideoTrack == NULL)) {

media/libmediaplayerservice/nuplayer/RTSPSource.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ struct NuPlayer::RTSPSource : public NuPlayer::Source {
7676
int32_t mTimeScale;
7777
uint32_t mRTPTime;
7878
int64_t mNormalPlaytimeUs;
79+
bool mNPTMappingValid;
7980
};
8081

8182
AString mURL;

media/libstagefright/foundation/ABitReader.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,13 @@ void ABitReader::skipBits(size_t n) {
7979
}
8080

8181
void ABitReader::putBits(uint32_t x, size_t n) {
82-
CHECK_LE(mNumBitsLeft + n, 32u);
82+
CHECK_LE(n, 32u);
83+
84+
while (mNumBitsLeft + n > 32) {
85+
mNumBitsLeft -= 8;
86+
--mData;
87+
++mSize;
88+
}
8389

8490
mReservoir = (mReservoir >> n) | (x << (32 - n));
8591
mNumBitsLeft += n;

media/libstagefright/rtsp/MyHandler.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,6 +1100,8 @@ struct MyHandler : public AHandler {
11001100
float npt1, npt2;
11011101
if (!ASessionDescription::parseNTPRange(val.c_str(), &npt1, &npt2)) {
11021102
// This is a live stream and therefore not seekable.
1103+
1104+
LOGI("This is a live stream");
11031105
return;
11041106
}
11051107

@@ -1386,12 +1388,14 @@ struct MyHandler : public AHandler {
13861388
msg->setInt32("what", kWhatConnected);
13871389
msg->post();
13881390

1389-
for (size_t i = 0; i < mTracks.size(); ++i) {
1390-
TrackInfo *info = &mTracks.editItemAt(i);
1391+
if (mSeekable) {
1392+
for (size_t i = 0; i < mTracks.size(); ++i) {
1393+
TrackInfo *info = &mTracks.editItemAt(i);
13911394

1392-
postNormalPlayTimeMapping(
1393-
i,
1394-
info->mNormalPlayTimeRTP, info->mNormalPlayTimeUs);
1395+
postNormalPlayTimeMapping(
1396+
i,
1397+
info->mNormalPlayTimeRTP, info->mNormalPlayTimeUs);
1398+
}
13951399
}
13961400

13971401
mFirstAccessUnit = false;

0 commit comments

Comments
 (0)