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

Commit cbb2aad7 authored by Andreas Huber's avatar Andreas Huber Committed by Android (Google) Code Review
Browse files

Merge "Separate the mode of the RTP and RTCP channels." into jb-mr2-dev

parents 10222ef1 a64ea768
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -124,10 +124,14 @@ status_t MediaSender::initAsync(
            looper()->registerHandler(mTSSender);

            err = mTSSender->initAsync(
                    transportMode,
                    remoteHost,
                    remoteRTPPort,
                    transportMode,  // rtpMode
                    remoteRTCPPort,
                    (transportMode == RTPSender::TRANSPORT_UDP
                        && remoteRTCPPort >= 0)
                        ? transportMode
                        : RTPSender::TRANSPORT_NONE,  // rtcpMode
                    localRTPPort);

            if (err != OK) {
@@ -174,10 +178,13 @@ status_t MediaSender::initAsync(
    looper()->registerHandler(info->mSender);

    status_t err = info->mSender->initAsync(
            transportMode,
            remoteHost,
            remoteRTPPort,
            transportMode,  // rtpMode
            remoteRTCPPort,
            (transportMode == RTPSender::TRANSPORT_UDP && remoteRTCPPort >= 0)
                ? transportMode
                : RTPSender::TRANSPORT_NONE,  // rtcpMode
            localRTPPort);

    if (err != OK) {
+1 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ struct RTPBase {

    enum TransportMode {
        TRANSPORT_UNDEFINED,
        TRANSPORT_NONE,
        TRANSPORT_UDP,
        TRANSPORT_TCP,
        TRANSPORT_TCP_INTERLEAVED,
+34 −21
Original line number Diff line number Diff line
@@ -38,7 +38,8 @@ RTPSender::RTPSender(
        const sp<AMessage> &notify)
    : mNetSession(netSession),
      mNotify(notify),
      mMode(TRANSPORT_UNDEFINED),
      mRTPMode(TRANSPORT_UNDEFINED),
      mRTCPMode(TRANSPORT_UNDEFINED),
      mRTPSessionID(0),
      mRTCPSessionID(0),
      mRTPConnected(false),
@@ -74,18 +75,24 @@ int32_t RTPBase::PickRandomRTPPort() {
}

status_t RTPSender::initAsync(
        TransportMode mode,
        const char *remoteHost,
        int32_t remoteRTPPort,
        TransportMode rtpMode,
        int32_t remoteRTCPPort,
        TransportMode rtcpMode,
        int32_t *outLocalRTPPort) {
    if (mMode != TRANSPORT_UNDEFINED || mode == TRANSPORT_UNDEFINED) {
    if (mRTPMode != TRANSPORT_UNDEFINED
            || rtpMode == TRANSPORT_UNDEFINED
            || rtpMode == TRANSPORT_NONE
            || rtcpMode == TRANSPORT_UNDEFINED) {
        return INVALID_OPERATION;
    }

    CHECK_NE(mMode, TRANSPORT_TCP_INTERLEAVED);
    CHECK_NE(rtpMode, TRANSPORT_TCP_INTERLEAVED);
    CHECK_NE(rtcpMode, TRANSPORT_TCP_INTERLEAVED);

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

@@ -105,7 +112,7 @@ status_t RTPSender::initAsync(
        localRTPPort = PickRandomRTPPort();

        status_t err;
        if (mode == TRANSPORT_UDP) {
        if (rtpMode == TRANSPORT_UDP) {
            err = mNetSession->createUDPSession(
                    localRTPPort,
                    remoteHost,
@@ -113,7 +120,7 @@ status_t RTPSender::initAsync(
                    rtpNotify,
                    &mRTPSessionID);
        } else {
            CHECK_EQ(mode, TRANSPORT_TCP);
            CHECK_EQ(rtpMode, TRANSPORT_TCP);
            err = mNetSession->createTCPDatagramSession(
                    localRTPPort,
                    remoteHost,
@@ -130,7 +137,7 @@ status_t RTPSender::initAsync(
            break;
        }

        if (mode == TRANSPORT_UDP) {
        if (rtcpMode == TRANSPORT_UDP) {
            err = mNetSession->createUDPSession(
                    localRTPPort + 1,
                    remoteHost,
@@ -138,7 +145,7 @@ status_t RTPSender::initAsync(
                    rtcpNotify,
                    &mRTCPSessionID);
        } else {
            CHECK_EQ(mode, TRANSPORT_TCP);
            CHECK_EQ(rtcpMode, TRANSPORT_TCP);
            err = mNetSession->createTCPDatagramSession(
                    localRTPPort + 1,
                    remoteHost,
@@ -155,15 +162,20 @@ status_t RTPSender::initAsync(
        mRTPSessionID = 0;
    }

    if (mode == TRANSPORT_UDP) {
    if (rtpMode == TRANSPORT_UDP) {
        mRTPConnected = true;
    }

    if (rtcpMode == TRANSPORT_UDP) {
        mRTCPConnected = true;
    }

    mMode = mode;
    mRTPMode = rtpMode;
    mRTCPMode = rtcpMode;
    *outLocalRTPPort = localRTPPort;

    if (mMode == TRANSPORT_UDP) {
    if (mRTPMode == TRANSPORT_UDP
            && (mRTCPMode == TRANSPORT_UDP || mRTCPMode == TRANSPORT_NONE)) {
        notifyInitDone(OK);
    }

@@ -496,13 +508,13 @@ void RTPSender::onNetNotify(bool isRTP, const sp<AMessage> &msg) {
                mRTCPSessionID = 0;
            }

            if (mMode == TRANSPORT_TCP) {
            if (!mRTPConnected
                        || (mRTCPSessionID > 0 && !mRTCPConnected)) {
                    || (mRTPMode != TRANSPORT_NONE && !mRTCPConnected)) {
                // We haven't completed initialization, attach the error
                // to the notification instead.
                notifyInitDone(err);
                break;
            }
            }

            notifyError(err);
            break;
@@ -523,20 +535,21 @@ void RTPSender::onNetNotify(bool isRTP, const sp<AMessage> &msg) {

        case ANetworkSession::kWhatConnected:
        {
            CHECK_EQ(mMode, TRANSPORT_TCP);

            int32_t sessionID;
            CHECK(msg->findInt32("sessionID", &sessionID));

            if  (isRTP) {
                CHECK_EQ(mRTPMode, TRANSPORT_TCP);
                CHECK_EQ(sessionID, mRTPSessionID);
                mRTPConnected = true;
            } else {
                CHECK_EQ(mRTCPMode, TRANSPORT_TCP);
                CHECK_EQ(sessionID, mRTCPSessionID);
                mRTCPConnected = true;
            }

            if (mRTPConnected && (mRTCPSessionID == 0 || mRTCPConnected)) {
            if (mRTPConnected
                    && (mRTCPMode == TRANSPORT_NONE || mRTCPConnected)) {
                notifyInitDone(OK);
            }
            break;
+4 −2
Original line number Diff line number Diff line
@@ -43,10 +43,11 @@ struct RTPSender : public RTPBase, public AHandler {
            const sp<AMessage> &notify);

    status_t initAsync(
              TransportMode mode,
              const char *remoteHost,
              int32_t remoteRTPPort,
              TransportMode rtpMode,
              int32_t remoteRTCPPort,
              TransportMode rtcpMode,
              int32_t *outLocalRTPPort);

    status_t queueBuffer(
@@ -72,7 +73,8 @@ private:

    sp<ANetworkSession> mNetSession;
    sp<AMessage> mNotify;
    TransportMode mMode;
    TransportMode mRTPMode;
    TransportMode mRTCPMode;
    int32_t mRTPSessionID;
    int32_t mRTCPSessionID;
    bool mRTPConnected;