Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba5e39b9 authored by Chong Zhang's avatar Chong Zhang Committed by Android (Google) Code Review
Browse files

Merge "HLS: do not discard packets when queuing explicit discontinuity"

parents 718cee5f 632740c5
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -272,7 +272,9 @@ void NuPlayer::GenericSource::readBuffer(

            if (seeking) {
                track->mPackets->queueDiscontinuity(
                        ATSParser::DISCONTINUITY_SEEK, NULL);
                        ATSParser::DISCONTINUITY_SEEK,
                        NULL,
                        true /* discard */);
            }

            track->mPackets->queueAccessUnit(buffer);
@@ -280,7 +282,9 @@ void NuPlayer::GenericSource::readBuffer(
        } else if (err == INFO_FORMAT_CHANGED) {
#if 0
            track->mPackets->queueDiscontinuity(
                    ATSParser::DISCONTINUITY_FORMATCHANGE, NULL);
                    ATSParser::DISCONTINUITY_FORMATCHANGE,
                    NULL,
                    false /* discard */);
#endif
        } else {
            track->mPackets->signalEOS(err);
+4 −1
Original line number Diff line number Diff line
@@ -505,7 +505,10 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) {
            TrackInfo *info = &mTracks.editItemAt(trackIndex);
            sp<AnotherPacketSource> source = info->mSource;
            if (source != NULL) {
                source->queueDiscontinuity(ATSParser::DISCONTINUITY_SEEK, NULL);
                source->queueDiscontinuity(
                        ATSParser::DISCONTINUITY_SEEK,
                        NULL,
                        true /* discard */);
            }

            break;
+12 −14
Original line number Diff line number Diff line
@@ -588,7 +588,10 @@ void PlaylistFetcher::notifyError(status_t err) {
void PlaylistFetcher::queueDiscontinuity(
        ATSParser::DiscontinuityType type, const sp<AMessage> &extra) {
    for (size_t i = 0; i < mPacketSources.size(); ++i) {
        mPacketSources.valueAt(i)->queueDiscontinuity(type, extra);
        // do not discard buffer upon #EXT-X-DISCONTINUITY tag
        // (seek will discard buffer by abandoning old fetchers)
        mPacketSources.valueAt(i)->queueDiscontinuity(
                type, extra, false /* discard */);
    }
}

@@ -723,8 +726,7 @@ void PlaylistFetcher::onDownloadNext() {
        firstSeqNumberInPlaylist = 0;
    }

    bool seekDiscontinuity = false;
    bool explicitDiscontinuity = false;
    bool discontinuity = false;

    const int32_t lastSeqNumberInPlaylist =
        firstSeqNumberInPlaylist + (int32_t)mPlaylist->size() - 1;
@@ -792,7 +794,7 @@ void PlaylistFetcher::onDownloadNext() {
            if (mSeqNumber < firstSeqNumberInPlaylist) {
                mSeqNumber = firstSeqNumberInPlaylist;
            }
            explicitDiscontinuity = true;
            discontinuity = true;

            // fall through
        } else {
@@ -817,7 +819,7 @@ void PlaylistFetcher::onDownloadNext() {

    int32_t val;
    if (itemMeta->findInt32("discontinuity", &val) && val != 0) {
        explicitDiscontinuity = true;
        discontinuity = true;
    }

    int64_t range_offset, range_length;
@@ -877,7 +879,7 @@ void PlaylistFetcher::onDownloadNext() {
            return;
        }

        if (mStartup || seekDiscontinuity || explicitDiscontinuity) {
        if (mStartup || discontinuity) {
            // Signal discontinuity.

            if (mPlaylist->isComplete() || mPlaylist->isEvent()) {
@@ -887,18 +889,14 @@ void PlaylistFetcher::onDownloadNext() {
                mNextPTSTimeUs = getSegmentStartTimeUs(mSeqNumber);
            }

            if (seekDiscontinuity || explicitDiscontinuity) {
                ALOGI("queueing discontinuity (seek=%d, explicit=%d)",
                     seekDiscontinuity, explicitDiscontinuity);
            if (discontinuity) {
                ALOGI("queueing discontinuity (explicit=%d)", discontinuity);

                queueDiscontinuity(
                        explicitDiscontinuity
                            ? ATSParser::DISCONTINUITY_FORMATCHANGE
                            : ATSParser::DISCONTINUITY_SEEK,
                        ATSParser::DISCONTINUITY_FORMATCHANGE,
                        NULL /* extra */);

                seekDiscontinuity = false;
                explicitDiscontinuity = false;
                discontinuity = false;
            }
        }

+1 −1
Original line number Diff line number Diff line
@@ -669,7 +669,7 @@ void ATSParser::Stream::signalDiscontinuity(
    }

    if (mSource != NULL) {
        mSource->queueDiscontinuity(type, extra);
        mSource->queueDiscontinuity(type, extra, true);
    }
}

+15 −12
Original line number Diff line number Diff line
@@ -217,9 +217,11 @@ void AnotherPacketSource::clear() {

void AnotherPacketSource::queueDiscontinuity(
        ATSParser::DiscontinuityType type,
        const sp<AMessage> &extra) {
        const sp<AMessage> &extra,
        bool discard) {
    Mutex::Autolock autoLock(mLock);

    if (discard) {
        // Leave only discontinuities in the queue.
        List<sp<ABuffer> >::iterator it = mBuffers.begin();
        while (it != mBuffers.end()) {
@@ -234,6 +236,7 @@ void AnotherPacketSource::queueDiscontinuity(

            ++it;
        }
    }

    mEOSResult = OK;
    mLastQueuedTimeUs = 0;
Loading