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

Commit c862b435 authored by JainishKumar Anghan's avatar JainishKumar Anghan Committed by Lajos Molnar
Browse files

VT: DSCP implementation.



[Problem] dscp value needs to be updated based on operator's
  requirement. but there is no interface to update the dscp value.

[Solution] Implement interface to set dscp value into socket by
  setsockopt(). dscp value will be taking care by upper layer.

Bug: 142345921

Merged-in: I1468a08f64b71db0f12d96b393263b520109be6d
Change-Id: I1468a08f64b71db0f12d96b393263b520109be6d
Signed-off-by: default avatarJainishKumar Anghan <jai.anghan@samsung.com>
parent 75b135ef
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ StagefrightRecorder::StagefrightRecorder(const String16 &opPackageName)
      mVideoSource(VIDEO_SOURCE_LIST_END),
      mRTPCVOExtMap(-1),
      mRTPCVODegrees(0),
      mRTPSockDscp(0),
      mRTPSockNetwork(0),
      mLastSeqNo(0),
      mStarted(false),
@@ -878,6 +879,13 @@ status_t StagefrightRecorder::setRTPCVODegrees(int32_t cvoDegrees) {
    return OK;
}

status_t StagefrightRecorder::setParamRtpDscp(int32_t dscp) {
    ALOGV("setParamRtpDscp: %d", dscp);

    mRTPSockDscp = dscp;
    return OK;
}

status_t StagefrightRecorder::setSocketNetwork(int64_t networkHandle) {
    ALOGV("setSocketNetwork: %llu", (unsigned long long) networkHandle);

@@ -1056,6 +1064,11 @@ status_t StagefrightRecorder::setParameter(
        }
    } else if (key == "video-param-request-i-frame") {
        return requestIDRFrame();
    } else if (key == "rtp-param-set-socket-dscp") {
        int32_t dscp;
        if (safe_strtoi32(value.string(), &dscp)) {
            return setParamRtpDscp(dscp);
        }
    } else if (key == "rtp-param-set-socket-network") {
        int64_t networkHandle;
        if (safe_strtoi64(value.string(), &networkHandle)) {
@@ -1234,6 +1247,10 @@ status_t StagefrightRecorder::start() {
                meta->setInt32(kKeyRtpExtMap, mRTPCVOExtMap);
                meta->setInt32(kKeyRtpCvoDegrees, mRTPCVODegrees);
            }
            if (mRTPSockDscp > 0) {
                meta->setInt32(kKeyRtpDscp, mRTPSockDscp);
            }

            status = mWriter->start(meta.get());
            break;
        }
+2 −0
Original line number Diff line number Diff line
@@ -148,6 +148,7 @@ private:
    int32_t mPayloadType;
    int32_t mRTPCVOExtMap;
    int32_t mRTPCVODegrees;
    int32_t mRTPSockDscp;
    int64_t mRTPSockNetwork;
    uint32_t mLastSeqNo;

@@ -241,6 +242,7 @@ private:
    status_t setParamPayloadType(int32_t payloadType);
    status_t setRTPCVOExtMap(int32_t extmap);
    status_t setRTPCVODegrees(int32_t cvoDegrees);
    status_t setParamRtpDscp(int32_t dscp);
    status_t setSocketNetwork(int64_t networkHandle);
    status_t requestIDRFrame();
    void clipVideoBitRate();
+1 −0
Original line number Diff line number Diff line
@@ -253,6 +253,7 @@ enum {
    kKeyPayloadType      = 'pTyp', // int32_t, SDP negotiated payload type.
    kKeyRtpExtMap        = 'extm', // int32_t, rtp extension ID for cvo on RTP protocol.
    kKeyRtpCvoDegrees    = 'cvod', // int32_t, rtp cvo degrees as per 3GPP 26.114.
    kKeyRtpDscp          = 'dscp', // int32_t, DSCP(Differentiated services codepoint) of RFC 2474.
    kKeySocketNetwork    = 'sNet', // int64_t, socket will be bound to network handle.
};

+19 −0
Original line number Diff line number Diff line
@@ -227,6 +227,10 @@ status_t ARTPWriter::start(MetaData * params) {
    if(params->findInt32(kKeyRtpCvoDegrees, &rtpCVODegrees))
        mRTPCVODegrees = rtpCVODegrees;

    int32_t dscp = 0;
    if(params->findInt32(kKeyRtpDscp, &dscp))
        updateSocketDscp(dscp);

    int64_t sockNetwork = 0;
    if(params->findInt64(kKeySocketNetwork, &sockNetwork))
        updateSocketNetwork(sockNetwork);
@@ -1182,6 +1186,21 @@ void ARTPWriter::updatePayloadType(int32_t payloadType) {
    mPayloadType = payloadType;
}

void ARTPWriter::updateSocketDscp(int32_t dscp) {
    mRtpLayer3Dscp = dscp << 2;

    /* mRtpLayer3Dscp will be mapped to WMM(Wifi) as per operator's requirement */
    if (setsockopt(mRTPSocket, IPPROTO_IP, IP_TOS,
                (int *)&mRtpLayer3Dscp, sizeof(mRtpLayer3Dscp)) < 0) {
        ALOGE("failed to set dscp on rtpsock. err=%s", strerror(errno));
    } else {
        ALOGD("success to set dscp on rtpsock. opt=%d", mRtpLayer3Dscp);
        setsockopt(mRTCPSocket, IPPROTO_IP, IP_TOS,
                (int *)&mRtpLayer3Dscp, sizeof(mRtpLayer3Dscp));
        ALOGD("success to set dscp on rtcpsock. opt=%d", mRtpLayer3Dscp);
    }
}

void ARTPWriter::updateSocketNetwork(int64_t socketNetwork) {
    mRTPSockNetwork = (net_handle_t)socketNetwork;
    ALOGI("trying to bind rtp socket(%d) to network(%llu).",
+2 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ struct ARTPWriter : public MediaWriter {
    virtual status_t pause();
    void updateCVODegrees(int32_t cvoDegrees);
    void updatePayloadType(int32_t payloadType);
    void updateSocketDscp(int32_t dscp);
    void updateSocketNetwork(int64_t socketNetwork);
    uint32_t getSequenceNum();

@@ -94,6 +95,7 @@ private:
    struct sockaddr_in6 mLocalAddr6;
    struct sockaddr_in6 mRTPAddr6;
    struct sockaddr_in6 mRTCPAddr6;
    int32_t mRtpLayer3Dscp;
    net_handle_t mRTPSockNetwork;

    AString mProfileLevel;