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

Commit 418c5da8 authored by Kim Sungyeon's avatar Kim Sungyeon Committed by Lajos Molnar
Browse files

VT: Enhancements on RTP packetizer.



  1) Apply discounted bitrate for initial RTP case
    [Problem] There is a possibility that sending bitrate
      overs the AS value, if there is no TMMBR signal.
    [Solution] Apply the discounting also in inital bitrate.

  2) Correction of UDP fragmentation.
    [Problem] Packets can not be sent to remote in some network
      environment(R&S ATT TE). Packet should be fragmented up to
      1280bytes in case of IPv6.
    [Solution] make a condition to build a packet up to 1280bytes.

  3) Correct a condition to check last of the FU-A.
    [Problem] Marker bit (of RTP header) was 0 even it was last FU-A packet.
      A RTP buffer size checked with RTP header extension, but it filled
      without header extension size.
    [Solution] Correct a condition to set market bit as 1.

Bug: 165061754
Merged-in: Ic70b06b330394b40b1c756aba85e175fba178b8d
Change-Id: Ic70b06b330394b40b1c756aba85e175fba178b8d
Signed-off-by: default avatarByeongjo Park <bjo.park@samsung.com>
parent 75adcb7a
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -578,12 +578,14 @@ status_t StagefrightRecorder::setParamVideoEncodingBitRate(int32_t bitRate) {
    mVideoBitRate = bitRate;

    // A new bitrate(TMMBR) should be applied on runtime as well if OutputFormat is RTP_AVP
    if (mOutputFormat == OUTPUT_FORMAT_RTP_AVP && mStarted && mPauseStartTimeUs == 0) {
    if (mOutputFormat == OUTPUT_FORMAT_RTP_AVP) {
        // Regular I frames may overload the network so we reduce the bitrate to allow
        // margins for the I frame overruns.
        // Still send requested bitrate (TMMBR) in the reply (TMMBN).
        const float coefficient = 0.8f;
        mVideoBitRate = (bitRate * coefficient) / 1000 * 1000;
    }
    if (mOutputFormat == OUTPUT_FORMAT_RTP_AVP &&  mStarted && mPauseStartTimeUs == 0) {
        mVideoEncoderSource->setEncodingBitrate(mVideoBitRate);
        ARTPWriter* rtpWriter  = static_cast<ARTPWriter*>(mWriter.get());
        rtpWriter->setTMMBNInfo(mOpponentID, bitRate);
+18 −15
Original line number Diff line number Diff line
@@ -46,17 +46,20 @@
#define H265_NALU_SPS 0x21
#define H265_NALU_PPS 0x22

#define LINK_HEADER_SIZE 14
#define IP_HEADER_SIZE 20
#define UDP_HEADER_SIZE 8
#define TCPIP_HEADER_SIZE (LINK_HEADER_SIZE + IP_HEADER_SIZE + UDP_HEADER_SIZE)
#define RTP_HEADER_SIZE 12
#define RTP_HEADER_EXT_SIZE 1
#define RTP_HEADER_EXT_SIZE 8
#define RTP_FU_HEADER_SIZE 2
#define RTP_PAYLOAD_ROOM_SIZE 140
#define RTP_PAYLOAD_ROOM_SIZE 100 // ROOM size for IPv6 header, ESP and etc.


namespace android {

// static const size_t kMaxPacketSize = 65507;  // maximum payload in UDP over IP
static const size_t kMaxPacketSize = 1500;
static const size_t kMaxPacketSize = 1280;
static char kCNAME[255] = "someone@somewhere";

static int UniformRand(int limit) {
@@ -937,8 +940,8 @@ void ARTPWriter::sendHEVCData(MediaBufferBase *mediaBuf) {

    sp<ABuffer> buffer = new ABuffer(kMaxPacketSize);

    if (mediaBuf->range_length() + UDP_HEADER_SIZE + RTP_HEADER_SIZE + RTP_PAYLOAD_ROOM_SIZE
            <= buffer->capacity()) {
    if (mediaBuf->range_length() + TCPIP_HEADER_SIZE + RTP_HEADER_SIZE + RTP_HEADER_EXT_SIZE
            + RTP_PAYLOAD_ROOM_SIZE <= buffer->capacity()) {
        // The data fits into a single packet
        uint8_t *data = buffer->data();
        data[0] = 0x80;
@@ -978,11 +981,11 @@ void ARTPWriter::sendHEVCData(MediaBufferBase *mediaBuf) {
        while (offset < mediaBuf->range_length()) {
            size_t size = mediaBuf->range_length() - offset;
            bool lastPacket = true;
            if (size + UDP_HEADER_SIZE + RTP_HEADER_SIZE + RTP_FU_HEADER_SIZE +
                    RTP_PAYLOAD_ROOM_SIZE > buffer->capacity()) {
            if (size + TCPIP_HEADER_SIZE + RTP_HEADER_SIZE + RTP_HEADER_EXT_SIZE +
                    RTP_FU_HEADER_SIZE + RTP_PAYLOAD_ROOM_SIZE > buffer->capacity()) {
                lastPacket = false;
                size = buffer->capacity() - UDP_HEADER_SIZE - RTP_HEADER_SIZE -
                    RTP_FU_HEADER_SIZE - RTP_PAYLOAD_ROOM_SIZE;
                size = buffer->capacity() - TCPIP_HEADER_SIZE - RTP_HEADER_SIZE -
                    RTP_HEADER_EXT_SIZE - RTP_FU_HEADER_SIZE - RTP_PAYLOAD_ROOM_SIZE;
            }

            uint8_t *data = buffer->data();
@@ -1071,8 +1074,8 @@ void ARTPWriter::sendAVCData(MediaBufferBase *mediaBuf) {
    }

    sp<ABuffer> buffer = new ABuffer(kMaxPacketSize);
    if (mediaBuf->range_length() + UDP_HEADER_SIZE + RTP_HEADER_SIZE + RTP_PAYLOAD_ROOM_SIZE
            <= buffer->capacity()) {
    if (mediaBuf->range_length() + TCPIP_HEADER_SIZE + RTP_HEADER_SIZE + RTP_HEADER_EXT_SIZE
            + RTP_PAYLOAD_ROOM_SIZE <= buffer->capacity()) {
        // The data fits into a single packet
        uint8_t *data = buffer->data();
        data[0] = 0x80;
@@ -1148,11 +1151,11 @@ void ARTPWriter::sendAVCData(MediaBufferBase *mediaBuf) {
        while (offset < mediaBuf->range_length()) {
            size_t size = mediaBuf->range_length() - offset;
            bool lastPacket = true;
            if (size + UDP_HEADER_SIZE + RTP_HEADER_SIZE + RTP_FU_HEADER_SIZE +
                    RTP_PAYLOAD_ROOM_SIZE > buffer->capacity()) {
            if (size + TCPIP_HEADER_SIZE + RTP_HEADER_SIZE + RTP_HEADER_EXT_SIZE +
                    RTP_FU_HEADER_SIZE + RTP_PAYLOAD_ROOM_SIZE > buffer->capacity()) {
                lastPacket = false;
                size = buffer->capacity() - UDP_HEADER_SIZE - RTP_HEADER_SIZE -
                    RTP_FU_HEADER_SIZE - RTP_PAYLOAD_ROOM_SIZE;
                size = buffer->capacity() - TCPIP_HEADER_SIZE - RTP_HEADER_SIZE -
                    RTP_HEADER_EXT_SIZE - RTP_FU_HEADER_SIZE - RTP_PAYLOAD_ROOM_SIZE;
            }

            uint8_t *data = buffer->data();