Loading media/libstagefright/HTTPBase.cpp +7 −2 Original line number Diff line number Diff line Loading @@ -36,7 +36,8 @@ HTTPBase::HTTPBase() mTotalTransferBytes(0), mPrevBandwidthMeasureTimeUs(0), mPrevEstimatedBandWidthKbps(0), mBandWidthCollectFreqMs(5000) { mBandWidthCollectFreqMs(5000), mMaxBandwidthHistoryItems(100) { } void HTTPBase::addBandwidthMeasurement( Loading @@ -50,7 +51,7 @@ void HTTPBase::addBandwidthMeasurement( mTotalTransferBytes += numBytes; mBandwidthHistory.push_back(entry); if (++mNumBandwidthHistoryItems > 100) { if (++mNumBandwidthHistoryItems > mMaxBandwidthHistoryItems) { BandwidthEntry *entry = &*mBandwidthHistory.begin(); mTotalTransferTimeUs -= entry->mDelayUs; mTotalTransferBytes -= entry->mNumBytes; Loading Loading @@ -104,6 +105,10 @@ status_t HTTPBase::setBandwidthStatCollectFreq(int32_t freqMs) { return OK; } void HTTPBase::setBandwidthHistorySize(size_t numHistoryItems) { mMaxBandwidthHistoryItems = numHistoryItems; } // static void HTTPBase::RegisterSocketUserTag(int sockfd, uid_t uid, uint32_t kTag) { int res = qtaguid_tagSocket(sockfd, kTag, uid); Loading media/libstagefright/httplive/LiveSession.cpp +30 −2 Original line number Diff line number Diff line Loading @@ -49,6 +49,9 @@ namespace android { // Number of recently-read bytes to use for bandwidth estimation const size_t LiveSession::kBandwidthHistoryBytes = 200 * 1024; LiveSession::LiveSession( const sp<AMessage> ¬ify, uint32_t flags, const sp<IMediaHTTPService> &httpService) Loading Loading @@ -84,6 +87,13 @@ LiveSession::LiveSession( mPacketSources2.add(indexToType(i), new AnotherPacketSource(NULL /* meta */)); mBuffering[i] = false; } size_t numHistoryItems = kBandwidthHistoryBytes / PlaylistFetcher::kDownloadBlockSize + 1; if (numHistoryItems < 5) { numHistoryItems = 5; } mHTTPDataSource->setBandwidthHistorySize(numHistoryItems); } LiveSession::~LiveSession() { Loading Loading @@ -145,10 +155,24 @@ status_t LiveSession::dequeueAccessUnit( } } int32_t targetDuration = 0; sp<AMessage> meta = packetSource->getLatestEnqueuedMeta(); if (meta != NULL) { meta->findInt32("targetDuration", &targetDuration); } int64_t targetDurationUs = targetDuration * 1000000ll; if (targetDurationUs == 0 || targetDurationUs > PlaylistFetcher::kMinBufferedDurationUs) { // Fetchers limit buffering to // min(3 * targetDuration, kMinBufferedDurationUs) targetDurationUs = PlaylistFetcher::kMinBufferedDurationUs; } if (mBuffering[idx]) { if (mSwitchInProgress || packetSource->isFinished(0) || packetSource->getEstimatedDurationUs() > 10000000ll) { || packetSource->getEstimatedDurationUs() > targetDurationUs) { mBuffering[idx] = false; } } Loading Loading @@ -859,7 +883,11 @@ ssize_t LiveSession::fetchFile( // Only resize when we don't know the size. size_t bufferRemaining = buffer->capacity() - buffer->size(); if (bufferRemaining == 0 && getSizeErr != OK) { bufferRemaining = 32768; size_t bufferIncrement = buffer->size() / 2; if (bufferIncrement < 32768) { bufferIncrement = 32768; } bufferRemaining = bufferIncrement; ALOGV("increasing download buffer to %zu bytes", buffer->size() + bufferRemaining); Loading media/libstagefright/httplive/LiveSession.h +2 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,8 @@ private: kWhatSwitchDown = 'sDwn', }; static const size_t kBandwidthHistoryBytes; struct BandwidthItem { size_t mPlaylistIndex; unsigned long mBandwidth; Loading media/libstagefright/httplive/PlaylistFetcher.cpp +16 −5 Original line number Diff line number Diff line Loading @@ -49,8 +49,9 @@ namespace android { // static const int64_t PlaylistFetcher::kMinBufferedDurationUs = 10000000ll; const int64_t PlaylistFetcher::kMaxMonitorDelayUs = 3000000ll; const int32_t PlaylistFetcher::kDownloadBlockSize = 2048; const int32_t PlaylistFetcher::kNumSkipFrames = 10; // LCM of 188 (size of a TS packet) & 1k works well const int32_t PlaylistFetcher::kDownloadBlockSize = 47 * 1024; const int32_t PlaylistFetcher::kNumSkipFrames = 5; PlaylistFetcher::PlaylistFetcher( const sp<AMessage> ¬ify, Loading Loading @@ -561,7 +562,7 @@ status_t PlaylistFetcher::onResumeUntil(const sp<AMessage> &msg) { // Don't resume if we would stop within a resume threshold. int32_t discontinuitySeq; int64_t latestTimeUs = 0, stopTimeUs = 0; sp<AMessage> latestMeta = packetSource->getLatestDequeuedMeta(); sp<AMessage> latestMeta = packetSource->getLatestEnqueuedMeta(); if (latestMeta != NULL && latestMeta->findInt32("discontinuitySeq", &discontinuitySeq) && discontinuitySeq == mDiscontinuitySeq Loading Loading @@ -610,7 +611,12 @@ void PlaylistFetcher::onMonitorQueue() { int32_t targetDurationSecs; int64_t targetDurationUs = kMinBufferedDurationUs; if (mPlaylist != NULL) { CHECK(mPlaylist->meta()->findInt32("target-duration", &targetDurationSecs)); if (mPlaylist->meta() == NULL || !mPlaylist->meta()->findInt32( "target-duration", &targetDurationSecs)) { ALOGE("Playlist is missing required EXT-X-TARGETDURATION tag"); notifyError(ERROR_MALFORMED); return; } targetDurationUs = targetDurationSecs * 1000000ll; } Loading Loading @@ -1159,6 +1165,11 @@ const sp<ABuffer> &PlaylistFetcher::setAccessUnitProperties( accessUnit->meta()->setInt32("discard", discard); } int32_t targetDurationSecs; if (mPlaylist->meta()->findInt32("target-duration", &targetDurationSecs)) { accessUnit->meta()->setInt32("targetDuration", targetDurationSecs); } accessUnit->meta()->setInt32("discontinuitySeq", mDiscontinuitySeq); accessUnit->meta()->setInt64("segmentStartTimeUs", getSegmentStartTimeUs(mSeqNumber)); return accessUnit; Loading Loading @@ -1668,7 +1679,7 @@ void PlaylistFetcher::updateDuration() { int64_t PlaylistFetcher::resumeThreshold(const sp<AMessage> &msg) { int64_t durationUs, threshold; if (msg->findInt64("durationUs", &durationUs)) { if (msg->findInt64("durationUs", &durationUs) && durationUs > 0) { return kNumSkipFrames * durationUs; } Loading media/libstagefright/httplive/PlaylistFetcher.h +3 −2 Original line number Diff line number Diff line Loading @@ -34,6 +34,9 @@ struct M3UParser; struct String8; struct PlaylistFetcher : public AHandler { static const int64_t kMinBufferedDurationUs; static const int32_t kDownloadBlockSize; enum { kWhatStarted, kWhatPaused, Loading Loading @@ -92,9 +95,7 @@ private: kWhatDownloadNext = 'dlnx', }; static const int64_t kMinBufferedDurationUs; static const int64_t kMaxMonitorDelayUs; static const int32_t kDownloadBlockSize; static const int32_t kNumSkipFrames; static bool bufferStartsWithTsSyncByte(const sp<ABuffer>& buffer); Loading Loading
media/libstagefright/HTTPBase.cpp +7 −2 Original line number Diff line number Diff line Loading @@ -36,7 +36,8 @@ HTTPBase::HTTPBase() mTotalTransferBytes(0), mPrevBandwidthMeasureTimeUs(0), mPrevEstimatedBandWidthKbps(0), mBandWidthCollectFreqMs(5000) { mBandWidthCollectFreqMs(5000), mMaxBandwidthHistoryItems(100) { } void HTTPBase::addBandwidthMeasurement( Loading @@ -50,7 +51,7 @@ void HTTPBase::addBandwidthMeasurement( mTotalTransferBytes += numBytes; mBandwidthHistory.push_back(entry); if (++mNumBandwidthHistoryItems > 100) { if (++mNumBandwidthHistoryItems > mMaxBandwidthHistoryItems) { BandwidthEntry *entry = &*mBandwidthHistory.begin(); mTotalTransferTimeUs -= entry->mDelayUs; mTotalTransferBytes -= entry->mNumBytes; Loading Loading @@ -104,6 +105,10 @@ status_t HTTPBase::setBandwidthStatCollectFreq(int32_t freqMs) { return OK; } void HTTPBase::setBandwidthHistorySize(size_t numHistoryItems) { mMaxBandwidthHistoryItems = numHistoryItems; } // static void HTTPBase::RegisterSocketUserTag(int sockfd, uid_t uid, uint32_t kTag) { int res = qtaguid_tagSocket(sockfd, kTag, uid); Loading
media/libstagefright/httplive/LiveSession.cpp +30 −2 Original line number Diff line number Diff line Loading @@ -49,6 +49,9 @@ namespace android { // Number of recently-read bytes to use for bandwidth estimation const size_t LiveSession::kBandwidthHistoryBytes = 200 * 1024; LiveSession::LiveSession( const sp<AMessage> ¬ify, uint32_t flags, const sp<IMediaHTTPService> &httpService) Loading Loading @@ -84,6 +87,13 @@ LiveSession::LiveSession( mPacketSources2.add(indexToType(i), new AnotherPacketSource(NULL /* meta */)); mBuffering[i] = false; } size_t numHistoryItems = kBandwidthHistoryBytes / PlaylistFetcher::kDownloadBlockSize + 1; if (numHistoryItems < 5) { numHistoryItems = 5; } mHTTPDataSource->setBandwidthHistorySize(numHistoryItems); } LiveSession::~LiveSession() { Loading Loading @@ -145,10 +155,24 @@ status_t LiveSession::dequeueAccessUnit( } } int32_t targetDuration = 0; sp<AMessage> meta = packetSource->getLatestEnqueuedMeta(); if (meta != NULL) { meta->findInt32("targetDuration", &targetDuration); } int64_t targetDurationUs = targetDuration * 1000000ll; if (targetDurationUs == 0 || targetDurationUs > PlaylistFetcher::kMinBufferedDurationUs) { // Fetchers limit buffering to // min(3 * targetDuration, kMinBufferedDurationUs) targetDurationUs = PlaylistFetcher::kMinBufferedDurationUs; } if (mBuffering[idx]) { if (mSwitchInProgress || packetSource->isFinished(0) || packetSource->getEstimatedDurationUs() > 10000000ll) { || packetSource->getEstimatedDurationUs() > targetDurationUs) { mBuffering[idx] = false; } } Loading Loading @@ -859,7 +883,11 @@ ssize_t LiveSession::fetchFile( // Only resize when we don't know the size. size_t bufferRemaining = buffer->capacity() - buffer->size(); if (bufferRemaining == 0 && getSizeErr != OK) { bufferRemaining = 32768; size_t bufferIncrement = buffer->size() / 2; if (bufferIncrement < 32768) { bufferIncrement = 32768; } bufferRemaining = bufferIncrement; ALOGV("increasing download buffer to %zu bytes", buffer->size() + bufferRemaining); Loading
media/libstagefright/httplive/LiveSession.h +2 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,8 @@ private: kWhatSwitchDown = 'sDwn', }; static const size_t kBandwidthHistoryBytes; struct BandwidthItem { size_t mPlaylistIndex; unsigned long mBandwidth; Loading
media/libstagefright/httplive/PlaylistFetcher.cpp +16 −5 Original line number Diff line number Diff line Loading @@ -49,8 +49,9 @@ namespace android { // static const int64_t PlaylistFetcher::kMinBufferedDurationUs = 10000000ll; const int64_t PlaylistFetcher::kMaxMonitorDelayUs = 3000000ll; const int32_t PlaylistFetcher::kDownloadBlockSize = 2048; const int32_t PlaylistFetcher::kNumSkipFrames = 10; // LCM of 188 (size of a TS packet) & 1k works well const int32_t PlaylistFetcher::kDownloadBlockSize = 47 * 1024; const int32_t PlaylistFetcher::kNumSkipFrames = 5; PlaylistFetcher::PlaylistFetcher( const sp<AMessage> ¬ify, Loading Loading @@ -561,7 +562,7 @@ status_t PlaylistFetcher::onResumeUntil(const sp<AMessage> &msg) { // Don't resume if we would stop within a resume threshold. int32_t discontinuitySeq; int64_t latestTimeUs = 0, stopTimeUs = 0; sp<AMessage> latestMeta = packetSource->getLatestDequeuedMeta(); sp<AMessage> latestMeta = packetSource->getLatestEnqueuedMeta(); if (latestMeta != NULL && latestMeta->findInt32("discontinuitySeq", &discontinuitySeq) && discontinuitySeq == mDiscontinuitySeq Loading Loading @@ -610,7 +611,12 @@ void PlaylistFetcher::onMonitorQueue() { int32_t targetDurationSecs; int64_t targetDurationUs = kMinBufferedDurationUs; if (mPlaylist != NULL) { CHECK(mPlaylist->meta()->findInt32("target-duration", &targetDurationSecs)); if (mPlaylist->meta() == NULL || !mPlaylist->meta()->findInt32( "target-duration", &targetDurationSecs)) { ALOGE("Playlist is missing required EXT-X-TARGETDURATION tag"); notifyError(ERROR_MALFORMED); return; } targetDurationUs = targetDurationSecs * 1000000ll; } Loading Loading @@ -1159,6 +1165,11 @@ const sp<ABuffer> &PlaylistFetcher::setAccessUnitProperties( accessUnit->meta()->setInt32("discard", discard); } int32_t targetDurationSecs; if (mPlaylist->meta()->findInt32("target-duration", &targetDurationSecs)) { accessUnit->meta()->setInt32("targetDuration", targetDurationSecs); } accessUnit->meta()->setInt32("discontinuitySeq", mDiscontinuitySeq); accessUnit->meta()->setInt64("segmentStartTimeUs", getSegmentStartTimeUs(mSeqNumber)); return accessUnit; Loading Loading @@ -1668,7 +1679,7 @@ void PlaylistFetcher::updateDuration() { int64_t PlaylistFetcher::resumeThreshold(const sp<AMessage> &msg) { int64_t durationUs, threshold; if (msg->findInt64("durationUs", &durationUs)) { if (msg->findInt64("durationUs", &durationUs) && durationUs > 0) { return kNumSkipFrames * durationUs; } Loading
media/libstagefright/httplive/PlaylistFetcher.h +3 −2 Original line number Diff line number Diff line Loading @@ -34,6 +34,9 @@ struct M3UParser; struct String8; struct PlaylistFetcher : public AHandler { static const int64_t kMinBufferedDurationUs; static const int32_t kDownloadBlockSize; enum { kWhatStarted, kWhatPaused, Loading Loading @@ -92,9 +95,7 @@ private: kWhatDownloadNext = 'dlnx', }; static const int64_t kMinBufferedDurationUs; static const int64_t kMaxMonitorDelayUs; static const int32_t kDownloadBlockSize; static const int32_t kNumSkipFrames; static bool bufferStartsWithTsSyncByte(const sp<ABuffer>& buffer); Loading