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

Commit 17d903a1 authored by Byeongjo Park's avatar Byeongjo Park Committed by Automerger Merge Worker
Browse files

VT: ARTPSource: Jitter buffer implementation. am: b40918ca am: e0ea580b

Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/952484

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I474d82f012d462d1232cb632d80aee16b2aa190d
parents de950a71 e0ea580b
Loading
Loading
Loading
Loading
+50 −2
Original line number Diff line number Diff line
@@ -51,7 +51,52 @@ ARTPAssembler::AssemblyStatus AAVCAssembler::addNALUnit(
        return NOT_ENOUGH_DATA;
    }

    sp<ABuffer> buffer = *queue->begin();
    int32_t rtpTime;
    CHECK(buffer->meta()->findInt32("rtp-time", &rtpTime));
    int64_t startTime = source->mFirstSysTime / 1000;
    int64_t nowTime = ALooper::GetNowUs() / 1000;
    int64_t playedTime = nowTime - startTime;
    int32_t playedTimeRtp = source->mFirstRtpTime +
        (((uint32_t)playedTime) * (source->mClockRate / 1000));
    const int32_t jitterTime = source->mClockRate / 5;  // 200ms
    int32_t expiredTimeInJb = rtpTime + jitterTime;
    bool isExpired = expiredTimeInJb <= (playedTimeRtp);
    bool isTooLate = expiredTimeInJb < (playedTimeRtp - jitterTime);
    ALOGV("start=%lld, now=%lld, played=%lld", (long long)startTime,
            (long long)nowTime, (long long)playedTime);
    ALOGV("rtp-time(JB)=%d, played-rtp-time(JB)=%d, expired-rtp-time(JB)=%d isExpired=%d",
            rtpTime, playedTimeRtp, expiredTimeInJb, isExpired);

    if (!isExpired) {
        ALOGV("buffering in jitter buffer.");
        return NOT_ENOUGH_DATA;
    }

    if (isTooLate) {
        ALOGV("buffer arrived too lately..");
        ALOGW("start=%lld, now=%lld, played=%lld", (long long)startTime,
                (long long)nowTime, (long long)playedTime);
        ALOGW("rtp-time(JB)=%d, plyed-rtp-time(JB)=%d, exp-rtp-time(JB)=%d diff=%lld isExpired=%d",
                rtpTime, playedTimeRtp, expiredTimeInJb,
                ((long long)playedTimeRtp) - expiredTimeInJb, isExpired);
        ALOGW("expected Seq. NO =%d", buffer->int32Data());

        List<sp<ABuffer> >::iterator it = queue->begin();
        while (it != queue->end()) {
            CHECK((*it)->meta()->findInt32("rtp-time", &rtpTime));
            if (rtpTime + jitterTime >= playedTimeRtp) {
                mNextExpectedSeqNo = (*it)->int32Data();
                break;
            }
            it++;
        }
        source->noticeAbandonBuffer();
    }

    if (mNextExpectedSeqNoValid) {
        int32_t size = queue->size();
        int32_t cnt = 0;
        List<sp<ABuffer> >::iterator it = queue->begin();
        while (it != queue->end()) {
            if ((uint32_t)(*it)->int32Data() >= mNextExpectedSeqNo) {
@@ -59,15 +104,18 @@ ARTPAssembler::AssemblyStatus AAVCAssembler::addNALUnit(
            }

            it = queue->erase(it);
            cnt++;
        }

        if (cnt > 0) {
            source->noticeAbandonBuffer(cnt);
            ALOGW("delete %d of %d buffers", cnt, size);
        }
        if (queue->empty()) {
            return NOT_ENOUGH_DATA;
        }
    }

    sp<ABuffer> buffer = *queue->begin();

    if (!mNextExpectedSeqNoValid) {
        mNextExpectedSeqNoValid = true;
        mNextExpectedSeqNo = (uint32_t)buffer->int32Data();
+16 −2
Original line number Diff line number Diff line
@@ -41,7 +41,11 @@ ARTPSource::ARTPSource(
        uint32_t id,
        const sp<ASessionDescription> &sessionDesc, size_t index,
        const sp<AMessage> &notify)
    : mID(id),
    : mFirstSeqNumber(0),
      mFirstRtpTime(0),
      mFirstSysTime(0),
      mClockRate(0),
      mID(id),
      mHighestSeqNumber(0),
      mPrevExpected(0),
      mBaseSeqNumber(0),
@@ -112,9 +116,16 @@ void ARTPSource::timeUpdate(uint32_t rtpTime, uint64_t ntpTime) {
bool ARTPSource::queuePacket(const sp<ABuffer> &buffer) {
    uint32_t seqNum = (uint32_t)buffer->int32Data();

    if (mNumBuffersReceived++ == 0) {
    if (mNumBuffersReceived++ == 0 && mFirstSysTime == 0) {
        int32_t firstRtpTime;
        CHECK(buffer->meta()->findInt32("rtp-time", &firstRtpTime));
        mFirstSysTime = ALooper::GetNowUs();
        mHighestSeqNumber = seqNum;
        mBaseSeqNumber = seqNum;
        mFirstRtpTime = firstRtpTime;
        ALOGV("first-rtp arrived: first-rtp-time=%d, sys-time=%lld, seq-num=%u",
                mFirstRtpTime, (long long)mFirstSysTime, mHighestSeqNumber);
        mClockRate = 90000;
        mQueue.push_back(buffer);
        return true;
    }
@@ -306,6 +317,9 @@ void ARTPSource::addReceiverReport(const sp<ABuffer> &buffer) {
    buffer->setRange(buffer->offset(), buffer->size() + 32);
}

void ARTPSource::noticeAbandonBuffer(int cnt) {
    mNumBuffersReceived -= cnt;
}
}  // namespace android

+7 −0
Original line number Diff line number Diff line
@@ -46,6 +46,13 @@ struct ARTPSource : public RefBase {
    void addReceiverReport(const sp<ABuffer> &buffer);
    void addFIR(const sp<ABuffer> &buffer);

    void noticeAbandonBuffer(int cnt=1);

    int32_t mFirstSeqNumber;
    int32_t mFirstRtpTime;
    int64_t mFirstSysTime;
    int32_t mClockRate;

private:
    uint32_t mID;
    uint32_t mHighestSeqNumber;