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

Commit 2aea9552 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 f90debb4
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -565,7 +565,7 @@ status_t ANetworkSession::Session::writeMore() {
        mSawSendFailure = true;
    }

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

        if (mLastStallReportUs < 0ll
                || nowUs > mLastStallReportUs + 500000ll) {
                || nowUs > mLastStallReportUs + 100000ll) {
            sp<AMessage> msg = mNotify->dup();
            msg->setInt32("sessionID", mSessionID);
            msg->setInt32("reason", kWhatNetworkStall);
+7 −7
Original line number Diff line number Diff line
@@ -47,7 +47,8 @@ MediaReceiver::~MediaReceiver() {
}

ssize_t MediaReceiver::addTrack(
        RTPReceiver::TransportMode transportMode,
        RTPReceiver::TransportMode rtpMode,
        RTPReceiver::TransportMode rtcpMode,
        int32_t *localRTPPort) {
    if (mMode != MODE_UNDEFINED) {
        return INVALID_OPERATION;
@@ -74,10 +75,8 @@ ssize_t MediaReceiver::addTrack(
            97, RTPReceiver::PACKETIZATION_H264);

    status_t err = info.mReceiver->initAsync(
            transportMode,  // rtpMode
            transportMode == RTPReceiver::TRANSPORT_UDP
                ? transportMode
                : RTPReceiver::TRANSPORT_NONE,  // rtcpMode
            rtpMode,
            rtcpMode,
            localRTPPort);

    if (err != OK) {
@@ -314,13 +313,14 @@ void MediaReceiver::postAccessUnit(
    notify->post();
}

status_t MediaReceiver::notifyLateness(size_t trackIndex, int64_t latenessUs) {
status_t MediaReceiver::informSender(
        size_t trackIndex, const sp<AMessage> &params) {
    if (trackIndex >= mTrackInfos.size()) {
        return -ERANGE;
    }

    TrackInfo *info = &mTrackInfos.editItemAt(trackIndex);
    return info->mReceiver->notifyLateness(latenessUs);
    return info->mReceiver->informSender(params);
}

}  // namespace android
+3 −2
Original line number Diff line number Diff line
@@ -43,7 +43,8 @@ struct MediaReceiver : public AHandler {
            const sp<AMessage> &notify);

    ssize_t addTrack(
            RTPReceiver::TransportMode transportMode,
            RTPReceiver::TransportMode rtpMode,
            RTPReceiver::TransportMode rtcpMode,
            int32_t *localRTPPort);

    status_t connectTrack(
@@ -60,7 +61,7 @@ struct MediaReceiver : public AHandler {
    };
    status_t initAsync(Mode mode);

    status_t notifyLateness(size_t trackIndex, int64_t latenessUs);
    status_t informSender(size_t trackIndex, const sp<AMessage> &params);

protected:
    virtual void onMessageReceived(const sp<AMessage> &msg);
+22 −10
Original line number Diff line number Diff line
@@ -85,10 +85,11 @@ ssize_t MediaSender::addTrack(const sp<AMessage> &format, uint32_t flags) {

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

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

    if (err != OK) {
@@ -345,6 +341,22 @@ void MediaSender::onSenderNotify(const sp<AMessage> &msg) {
            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:
            TRESPASS();
    }
+3 −1
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ struct MediaSender : public AHandler {
        kWhatInitDone,
        kWhatError,
        kWhatNetworkStall,
        kWhatInformSender,
    };

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

    status_t queueAccessUnit(
Loading