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

Commit 40828d67 authored by Robert Shih's avatar Robert Shih
Browse files

rtsp: refactor access unit queue processing

All access units must pass through processAccessUnitQueue (which
filters out stale sequence numbers) before being dequeued by NuPlayer.

Bug: 30230942
Change-Id: I87a099ded18324c4844747d901dc17cacfc1a12b
parent 78fe845d
Loading
Loading
Loading
Loading
+28 −31
Original line number Diff line number Diff line
@@ -1792,14 +1792,8 @@ private:

            // Time is now established, lets start timestamping immediately
            for (size_t i = 0; i < mTracks.size(); ++i) {
                TrackInfo *trackInfo = &mTracks.editItemAt(i);
                while (!trackInfo->mPackets.empty()) {
                    sp<ABuffer> accessUnit = *trackInfo->mPackets.begin();
                    trackInfo->mPackets.erase(trackInfo->mPackets.begin());

                    if (addMediaTimestamp(i, trackInfo, accessUnit)) {
                        postQueueAccessUnit(i, accessUnit);
                    }
                if (OK != processAccessUnitQueue(i)) {
                    return;
                }
            }
            for (size_t i = 0; i < mTracks.size(); ++i) {
@@ -1812,26 +1806,8 @@ private:
        }
    }

    void onAccessUnitComplete(
            int32_t trackIndex, const sp<ABuffer> &accessUnit) {
        ALOGV("onAccessUnitComplete track %d", trackIndex);

    status_t processAccessUnitQueue(int32_t trackIndex) {
        TrackInfo *track = &mTracks.editItemAt(trackIndex);
        if(!mPlayResponseParsed){
            uint32_t seqNum = (uint32_t)accessUnit->int32Data();
            ALOGI("play response is not parsed, storing accessunit %u", seqNum);
            track->mPackets.push_back(accessUnit);
            return;
        }

        handleFirstAccessUnit();

        if (!mAllTracksHaveTime) {
            ALOGV("storing accessUnit, no time established yet");
            track->mPackets.push_back(accessUnit);
            return;
        }

        while (!track->mPackets.empty()) {
            sp<ABuffer> accessUnit = *track->mPackets.begin();
            track->mPackets.erase(track->mPackets.begin());
@@ -1862,7 +1838,7 @@ private:
                         "Still no first rtp packet after %d stale ones",
                         kMaxAllowedStaleAccessUnits);
                    track->mAllowedStaleAccessUnits = -1;
                    return;
                    return UNKNOWN_ERROR;
                }

                // Now found the first rtp packet of the stream after seeking.
@@ -1876,14 +1852,35 @@ private:
                continue;
            }


            if (addMediaTimestamp(trackIndex, track, accessUnit)) {
                postQueueAccessUnit(trackIndex, accessUnit);
            }
        }
        return OK;
    }

        if (addMediaTimestamp(trackIndex, track, accessUnit)) {
            postQueueAccessUnit(trackIndex, accessUnit);
    void onAccessUnitComplete(
            int32_t trackIndex, const sp<ABuffer> &accessUnit) {
        TrackInfo *track = &mTracks.editItemAt(trackIndex);
        track->mPackets.push_back(accessUnit);

        uint32_t seqNum = (uint32_t)accessUnit->int32Data();
        ALOGV("onAccessUnitComplete track %d storing accessunit %u", trackIndex, seqNum);

        if(!mPlayResponseParsed){
            ALOGV("play response is not parsed");
            return;
        }

        handleFirstAccessUnit();

        if (!mAllTracksHaveTime) {
            ALOGV("storing accessUnit, no time established yet");
            return;
        }

        if (OK != processAccessUnitQueue(trackIndex)) {
            return;
        }

        if (track->mEOSReceived) {