Loading media/libstagefright/httplive/LiveSession.cpp +9 −2 Original line number Diff line number Diff line Loading @@ -158,9 +158,16 @@ status_t LiveSession::dequeueAccessUnit( // wait for counterpart sp<AnotherPacketSource> otherSource; if (stream == STREAMTYPE_AUDIO && (mStreamMask & STREAMTYPE_VIDEO)) { uint32_t mask = mNewStreamMask & mStreamMask; uint32_t fetchersMask = 0; for (size_t i = 0; i < mFetcherInfos.size(); ++i) { uint32_t fetcherMask = mFetcherInfos.valueAt(i).mFetcher->getStreamTypeMask(); fetchersMask |= fetcherMask; } mask &= fetchersMask; if (stream == STREAMTYPE_AUDIO && (mask & STREAMTYPE_VIDEO)) { otherSource = mPacketSources.valueFor(STREAMTYPE_VIDEO); } else if (stream == STREAMTYPE_VIDEO && (mStreamMask & STREAMTYPE_AUDIO)) { } else if (stream == STREAMTYPE_VIDEO && (mask & STREAMTYPE_AUDIO)) { otherSource = mPacketSources.valueFor(STREAMTYPE_AUDIO); } if (otherSource != NULL && !otherSource->hasBufferAvailable(&finalResult)) { Loading media/libstagefright/httplive/PlaylistFetcher.cpp +50 −3 Original line number Diff line number Diff line Loading @@ -1010,6 +1010,15 @@ void PlaylistFetcher::onDownloadNext() { // bulk extract non-ts files if (tsBuffer == NULL) { err = extractAndQueueAccessUnits(buffer, itemMeta); if (err == -EAGAIN) { // starting sequence number too low/high postMonitorQueue(); return; } else if (err == ERROR_OUT_OF_RANGE) { // reached stopping point stopAsync(/* clear = */false); return; } } if (err != OK) { Loading Loading @@ -1552,14 +1561,52 @@ status_t PlaylistFetcher::extractAndQueueAccessUnits( if (startTimeUs < mStartTimeUs) { continue; } if (mStartTimeUsNotify != NULL) { int32_t targetDurationSecs; CHECK(mPlaylist->meta()->findInt32("target-duration", &targetDurationSecs)); int64_t targetDurationUs = targetDurationSecs * 1000000ll; // Duplicated logic from how we handle .ts playlists. if (mStartup && mSegmentStartTimeUs >= 0 && timeUs - mStartTimeUs > targetDurationUs) { int32_t newSeqNumber = getSeqNumberWithAnchorTime(timeUs); if (newSeqNumber >= mSeqNumber) { --mSeqNumber; } else { mSeqNumber = newSeqNumber; } return -EAGAIN; } mStartTimeUsNotify->setInt64("timeUsAudio", timeUs); mStartTimeUsNotify->setInt32("discontinuitySeq", mDiscontinuitySeq); mStartTimeUsNotify->setInt32("streamMask", LiveSession::STREAMTYPE_AUDIO); mStartTimeUsNotify->post(); mStartTimeUsNotify.clear(); } } if (mStopParams != NULL) { // Queue discontinuity in original stream. int32_t discontinuitySeq; int64_t stopTimeUs; if (!mStopParams->findInt32("discontinuitySeq", &discontinuitySeq) || discontinuitySeq > mDiscontinuitySeq || !mStopParams->findInt64("timeUsAudio", &stopTimeUs) || (discontinuitySeq == mDiscontinuitySeq && unitTimeUs >= stopTimeUs)) { packetSource->queueAccessUnit(mSession->createFormatChangeBuffer()); mStreamTypeMask = 0; mPacketSources.clear(); return ERROR_OUT_OF_RANGE; } } sp<ABuffer> unit = new ABuffer(aac_frame_length); memcpy(unit->data(), adtsHeader, aac_frame_length); unit->meta()->setInt64("timeUs", unitTimeUs); unit->meta()->setInt64("segmentStartTimeUs", getSegmentStartTimeUs(mSeqNumber)); unit->meta()->setInt32("discontinuitySeq", mDiscontinuitySeq); setAccessUnitProperties(unit, packetSource); packetSource->queueAccessUnit(unit); } Loading media/libstagefright/httplive/PlaylistFetcher.h +4 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,10 @@ struct PlaylistFetcher : public AHandler { void resumeUntilAsync(const sp<AMessage> ¶ms); uint32_t getStreamTypeMask() const { return mStreamTypeMask; } protected: virtual ~PlaylistFetcher(); virtual void onMessageReceived(const sp<AMessage> &msg); Loading Loading
media/libstagefright/httplive/LiveSession.cpp +9 −2 Original line number Diff line number Diff line Loading @@ -158,9 +158,16 @@ status_t LiveSession::dequeueAccessUnit( // wait for counterpart sp<AnotherPacketSource> otherSource; if (stream == STREAMTYPE_AUDIO && (mStreamMask & STREAMTYPE_VIDEO)) { uint32_t mask = mNewStreamMask & mStreamMask; uint32_t fetchersMask = 0; for (size_t i = 0; i < mFetcherInfos.size(); ++i) { uint32_t fetcherMask = mFetcherInfos.valueAt(i).mFetcher->getStreamTypeMask(); fetchersMask |= fetcherMask; } mask &= fetchersMask; if (stream == STREAMTYPE_AUDIO && (mask & STREAMTYPE_VIDEO)) { otherSource = mPacketSources.valueFor(STREAMTYPE_VIDEO); } else if (stream == STREAMTYPE_VIDEO && (mStreamMask & STREAMTYPE_AUDIO)) { } else if (stream == STREAMTYPE_VIDEO && (mask & STREAMTYPE_AUDIO)) { otherSource = mPacketSources.valueFor(STREAMTYPE_AUDIO); } if (otherSource != NULL && !otherSource->hasBufferAvailable(&finalResult)) { Loading
media/libstagefright/httplive/PlaylistFetcher.cpp +50 −3 Original line number Diff line number Diff line Loading @@ -1010,6 +1010,15 @@ void PlaylistFetcher::onDownloadNext() { // bulk extract non-ts files if (tsBuffer == NULL) { err = extractAndQueueAccessUnits(buffer, itemMeta); if (err == -EAGAIN) { // starting sequence number too low/high postMonitorQueue(); return; } else if (err == ERROR_OUT_OF_RANGE) { // reached stopping point stopAsync(/* clear = */false); return; } } if (err != OK) { Loading Loading @@ -1552,14 +1561,52 @@ status_t PlaylistFetcher::extractAndQueueAccessUnits( if (startTimeUs < mStartTimeUs) { continue; } if (mStartTimeUsNotify != NULL) { int32_t targetDurationSecs; CHECK(mPlaylist->meta()->findInt32("target-duration", &targetDurationSecs)); int64_t targetDurationUs = targetDurationSecs * 1000000ll; // Duplicated logic from how we handle .ts playlists. if (mStartup && mSegmentStartTimeUs >= 0 && timeUs - mStartTimeUs > targetDurationUs) { int32_t newSeqNumber = getSeqNumberWithAnchorTime(timeUs); if (newSeqNumber >= mSeqNumber) { --mSeqNumber; } else { mSeqNumber = newSeqNumber; } return -EAGAIN; } mStartTimeUsNotify->setInt64("timeUsAudio", timeUs); mStartTimeUsNotify->setInt32("discontinuitySeq", mDiscontinuitySeq); mStartTimeUsNotify->setInt32("streamMask", LiveSession::STREAMTYPE_AUDIO); mStartTimeUsNotify->post(); mStartTimeUsNotify.clear(); } } if (mStopParams != NULL) { // Queue discontinuity in original stream. int32_t discontinuitySeq; int64_t stopTimeUs; if (!mStopParams->findInt32("discontinuitySeq", &discontinuitySeq) || discontinuitySeq > mDiscontinuitySeq || !mStopParams->findInt64("timeUsAudio", &stopTimeUs) || (discontinuitySeq == mDiscontinuitySeq && unitTimeUs >= stopTimeUs)) { packetSource->queueAccessUnit(mSession->createFormatChangeBuffer()); mStreamTypeMask = 0; mPacketSources.clear(); return ERROR_OUT_OF_RANGE; } } sp<ABuffer> unit = new ABuffer(aac_frame_length); memcpy(unit->data(), adtsHeader, aac_frame_length); unit->meta()->setInt64("timeUs", unitTimeUs); unit->meta()->setInt64("segmentStartTimeUs", getSegmentStartTimeUs(mSeqNumber)); unit->meta()->setInt32("discontinuitySeq", mDiscontinuitySeq); setAccessUnitProperties(unit, packetSource); packetSource->queueAccessUnit(unit); } Loading
media/libstagefright/httplive/PlaylistFetcher.h +4 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,10 @@ struct PlaylistFetcher : public AHandler { void resumeUntilAsync(const sp<AMessage> ¶ms); uint32_t getStreamTypeMask() const { return mStreamTypeMask; } protected: virtual ~PlaylistFetcher(); virtual void onMessageReceived(const sp<AMessage> &msg); Loading