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

Commit dca73b8f authored by Andreas Huber's avatar Andreas Huber
Browse files

In "special" mode we now establish a UDP RTCP channel in addition to the

TCP RTP channel and provide feedback on the latency of arriving packets from
the sink back to the source. This information is then used to throttle
video bitrate.

Change-Id: Ic589a3cb65e4893a3ff67de947da6063d32a1c6e
parent d3d9263c
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -565,7 +565,7 @@ status_t ANetworkSession::Session::writeMore() {
        mSawSendFailure = true;
        mSawSendFailure = true;
    }
    }


#if 1
#if 0
    int numBytesQueued;
    int numBytesQueued;
    int res = ioctl(mSocket, SIOCOUTQ, &numBytesQueued);
    int res = ioctl(mSocket, SIOCOUTQ, &numBytesQueued);
    if (res == 0 && numBytesQueued > 50 * 1024) {
    if (res == 0 && numBytesQueued > 50 * 1024) {
@@ -576,7 +576,7 @@ status_t ANetworkSession::Session::writeMore() {
        int64_t nowUs = ALooper::GetNowUs();
        int64_t nowUs = ALooper::GetNowUs();


        if (mLastStallReportUs < 0ll
        if (mLastStallReportUs < 0ll
                || nowUs > mLastStallReportUs + 500000ll) {
                || nowUs > mLastStallReportUs + 100000ll) {
            sp<AMessage> msg = mNotify->dup();
            sp<AMessage> msg = mNotify->dup();
            msg->setInt32("sessionID", mSessionID);
            msg->setInt32("sessionID", mSessionID);
            msg->setInt32("reason", kWhatNetworkStall);
            msg->setInt32("reason", kWhatNetworkStall);
+22 −10
Original line number Original line Diff line number Diff line
@@ -85,10 +85,11 @@ ssize_t MediaSender::addTrack(const sp<AMessage> &format, uint32_t flags) {


status_t MediaSender::initAsync(
status_t MediaSender::initAsync(
        ssize_t trackIndex,
        ssize_t trackIndex,
        RTPSender::TransportMode transportMode,
        const char *remoteHost,
        const char *remoteHost,
        int32_t remoteRTPPort,
        int32_t remoteRTPPort,
        RTPSender::TransportMode rtpMode,
        int32_t remoteRTCPPort,
        int32_t remoteRTCPPort,
        RTPSender::TransportMode rtcpMode,
        int32_t *localRTPPort) {
        int32_t *localRTPPort) {
    if (trackIndex < 0) {
    if (trackIndex < 0) {
        if (mMode != MODE_UNDEFINED) {
        if (mMode != MODE_UNDEFINED) {
@@ -126,12 +127,9 @@ status_t MediaSender::initAsync(
            err = mTSSender->initAsync(
            err = mTSSender->initAsync(
                    remoteHost,
                    remoteHost,
                    remoteRTPPort,
                    remoteRTPPort,
                    transportMode,  // rtpMode
                    rtpMode,
                    remoteRTCPPort,
                    remoteRTCPPort,
                    (transportMode == RTPSender::TRANSPORT_UDP
                    rtcpMode,
                        && remoteRTCPPort >= 0)
                        ? transportMode
                        : RTPSender::TRANSPORT_NONE,  // rtcpMode
                    localRTPPort);
                    localRTPPort);


            if (err != OK) {
            if (err != OK) {
@@ -180,11 +178,9 @@ status_t MediaSender::initAsync(
    status_t err = info->mSender->initAsync(
    status_t err = info->mSender->initAsync(
            remoteHost,
            remoteHost,
            remoteRTPPort,
            remoteRTPPort,
            transportMode,  // rtpMode
            rtpMode,
            remoteRTCPPort,
            remoteRTCPPort,
            (transportMode == RTPSender::TRANSPORT_UDP && remoteRTCPPort >= 0)
            rtcpMode,
                ? transportMode
                : RTPSender::TRANSPORT_NONE,  // rtcpMode
            localRTPPort);
            localRTPPort);


    if (err != OK) {
    if (err != OK) {
@@ -345,6 +341,22 @@ void MediaSender::onSenderNotify(const sp<AMessage> &msg) {
            break;
            break;
        }
        }


        case kWhatInformSender:
        {
            int64_t avgLatencyUs;
            CHECK(msg->findInt64("avgLatencyUs", &avgLatencyUs));

            int64_t maxLatencyUs;
            CHECK(msg->findInt64("maxLatencyUs", &maxLatencyUs));

            sp<AMessage> notify = mNotify->dup();
            notify->setInt32("what", kWhatInformSender);
            notify->setInt64("avgLatencyUs", avgLatencyUs);
            notify->setInt64("maxLatencyUs", maxLatencyUs);
            notify->post();
            break;
        }

        default:
        default:
            TRESPASS();
            TRESPASS();
    }
    }
+3 −1
Original line number Original line Diff line number Diff line
@@ -43,6 +43,7 @@ struct MediaSender : public AHandler {
        kWhatInitDone,
        kWhatInitDone,
        kWhatError,
        kWhatError,
        kWhatNetworkStall,
        kWhatNetworkStall,
        kWhatInformSender,
    };
    };


    MediaSender(
    MediaSender(
@@ -59,10 +60,11 @@ struct MediaSender : public AHandler {
    // If trackIndex == -1, initialize for transport stream muxing.
    // If trackIndex == -1, initialize for transport stream muxing.
    status_t initAsync(
    status_t initAsync(
            ssize_t trackIndex,
            ssize_t trackIndex,
            RTPSender::TransportMode transportMode,
            const char *remoteHost,
            const char *remoteHost,
            int32_t remoteRTPPort,
            int32_t remoteRTPPort,
            RTPSender::TransportMode rtpMode,
            int32_t remoteRTCPPort,
            int32_t remoteRTCPPort,
            RTPSender::TransportMode rtcpMode,
            int32_t *localRTPPort);
            int32_t *localRTPPort);


    status_t queueAccessUnit(
    status_t queueAccessUnit(
+18 −2
Original line number Original line Diff line number Diff line
@@ -91,8 +91,8 @@ status_t RTPSender::initAsync(
    CHECK_NE(rtpMode, TRANSPORT_TCP_INTERLEAVED);
    CHECK_NE(rtpMode, TRANSPORT_TCP_INTERLEAVED);
    CHECK_NE(rtcpMode, TRANSPORT_TCP_INTERLEAVED);
    CHECK_NE(rtcpMode, TRANSPORT_TCP_INTERLEAVED);


    if (rtcpMode == TRANSPORT_NONE && remoteRTCPPort >= 0
    if ((rtcpMode == TRANSPORT_NONE && remoteRTCPPort >= 0)
            || rtcpMode != TRANSPORT_NONE && remoteRTCPPort < 0) {
            || (rtcpMode != TRANSPORT_NONE && remoteRTCPPort < 0)) {
        return INVALID_OPERATION;
        return INVALID_OPERATION;
    }
    }


@@ -616,6 +616,7 @@ status_t RTPSender::onRTCPData(const sp<ABuffer> &buffer) {
                break;
                break;


            case 204:  // APP
            case 204:  // APP
                parseAPP(data, headerLength);
                break;
                break;


            case 205:  // TSFB (transport layer specific feedback)
            case 205:  // TSFB (transport layer specific feedback)
@@ -721,6 +722,21 @@ status_t RTPSender::parseTSFB(const uint8_t *data, size_t size) {
    return OK;
    return OK;
}
}


status_t RTPSender::parseAPP(const uint8_t *data, size_t size) {
    if (!memcmp("late", &data[8], 4)) {
        int64_t avgLatencyUs = (int64_t)U64_AT(&data[12]);
        int64_t maxLatencyUs = (int64_t)U64_AT(&data[20]);

        sp<AMessage> notify = mNotify->dup();
        notify->setInt32("what", kWhatInformSender);
        notify->setInt64("avgLatencyUs", avgLatencyUs);
        notify->setInt64("maxLatencyUs", maxLatencyUs);
        notify->post();
    }

    return OK;
}

void RTPSender::notifyInitDone(status_t err) {
void RTPSender::notifyInitDone(status_t err) {
    sp<AMessage> notify = mNotify->dup();
    sp<AMessage> notify = mNotify->dup();
    notify->setInt32("what", kWhatInitDone);
    notify->setInt32("what", kWhatInitDone);
+2 −0
Original line number Original line Diff line number Diff line
@@ -37,6 +37,7 @@ struct RTPSender : public RTPBase, public AHandler {
        kWhatInitDone,
        kWhatInitDone,
        kWhatError,
        kWhatError,
        kWhatNetworkStall,
        kWhatNetworkStall,
        kWhatInformSender,
    };
    };
    RTPSender(
    RTPSender(
            const sp<ANetworkSession> &netSession,
            const sp<ANetworkSession> &netSession,
@@ -105,6 +106,7 @@ private:
    status_t onRTCPData(const sp<ABuffer> &data);
    status_t onRTCPData(const sp<ABuffer> &data);
    status_t parseReceiverReport(const uint8_t *data, size_t size);
    status_t parseReceiverReport(const uint8_t *data, size_t size);
    status_t parseTSFB(const uint8_t *data, size_t size);
    status_t parseTSFB(const uint8_t *data, size_t size);
    status_t parseAPP(const uint8_t *data, size_t size);


    void notifyInitDone(status_t err);
    void notifyInitDone(status_t err);
    void notifyError(status_t err);
    void notifyError(status_t err);
Loading