Browse Source

Fix items in SDES packet

Filip Klembara 4 years ago
parent
commit
43d31caee3
2 changed files with 48 additions and 12 deletions
  1. 44 9
      include/rtc/rtp.hpp
  2. 4 3
      src/rtcpsenderreportable.cpp

+ 44 - 9
include/rtc/rtp.hpp

@@ -294,17 +294,13 @@ public:
 	}
 	}
 };
 };
 
 
-struct RTCP_SDES_CHUNK {
-private:
-    SSRC _ssrc;
+struct RTCP_SDES_ITEM {
 public:
 public:
     uint8_t type;
     uint8_t type;
 private:
 private:
     uint8_t _length;
     uint8_t _length;
     char _text;
     char _text;
 public:
 public:
-    inline SSRC ssrc() const { return ntohl(_ssrc); }
-    inline void setSSRC(SSRC ssrc) { _ssrc = htonl(ssrc); }
     inline std::string text() const {
     inline std::string text() const {
         return std::string(&_text, _length);
         return std::string(&_text, _length);
     }
     }
@@ -318,9 +314,47 @@ public:
     }
     }
 
 
     [[nodiscard]] static unsigned int size(uint8_t textLength) {
     [[nodiscard]] static unsigned int size(uint8_t textLength) {
-        auto words = uint8_t(std::ceil(double(textLength + 2) / 4)) + 1;
+        return textLength + 2;
+    }
+};
+
+struct RTCP_SDES_CHUNK {
+private:
+    SSRC _ssrc;
+    RTCP_SDES_ITEM _items;
+public:
+    inline SSRC ssrc() const { return ntohl(_ssrc); }
+    inline void setSSRC(SSRC ssrc) { _ssrc = htonl(ssrc); }
+
+    inline RTCP_SDES_ITEM *getItem(int num) {
+        auto base = &_items;
+        while (num-- > 0) {
+            auto itemSize = RTCP_SDES_ITEM::size(base->length());
+            base = reinterpret_cast<RTCP_SDES_ITEM *>(reinterpret_cast<uint8_t *>(base) + itemSize);
+        }
+        return reinterpret_cast<RTCP_SDES_ITEM *>(base);
+    }
+
+    [[nodiscard]] static unsigned int size(std::vector<uint8_t> textLengths) {
+        unsigned int itemsSize = 0;
+        for (auto length: textLengths) {
+            itemsSize += RTCP_SDES_ITEM::size(length);
+        }
+        auto nullTerminatedItemsSize = itemsSize + 1;
+        auto words = uint8_t(std::ceil(double(nullTerminatedItemsSize) / 4)) + 1;
         return words * 4;
         return words * 4;
     }
     }
+
+    [[nodiscard]] unsigned int getSize() {
+        std::vector<uint8_t> textLengths{};
+        unsigned int i = 0;
+        auto item = getItem(i);
+        while (item->type != 0) {
+            textLengths.push_back(item->length());
+            item = getItem(++i);
+        }
+        return size(textLengths);
+    }
 };
 };
 
 
 struct RTCP_SDES {
 struct RTCP_SDES {
@@ -334,21 +368,22 @@ public:
         unsigned int chunkSize = 0;
         unsigned int chunkSize = 0;
         for(uint8_t i = 0; i < chunkCount; i++) {
         for(uint8_t i = 0; i < chunkCount; i++) {
             auto chunk = getChunk(i);
             auto chunk = getChunk(i);
-            chunkSize += RTCP_SDES_CHUNK::size(chunk->length());
+            chunkSize += chunk->getSize();
         }
         }
         uint16_t length = (sizeof(header) + chunkSize) / 4 - 1;
         uint16_t length = (sizeof(header) + chunkSize) / 4 - 1;
         header.prepareHeader(202, chunkCount, length);
         header.prepareHeader(202, chunkCount, length);
     }
     }
+
     inline RTCP_SDES_CHUNK *getChunk(int num) {
     inline RTCP_SDES_CHUNK *getChunk(int num) {
         auto base = &_chunks;
         auto base = &_chunks;
         while (num-- > 0) {
         while (num-- > 0) {
-            auto chunkSize = RTCP_SDES_CHUNK::size(base->length());
+            auto chunkSize = base->getSize();
             base = reinterpret_cast<RTCP_SDES_CHUNK *>(reinterpret_cast<uint8_t *>(base) + chunkSize);
             base = reinterpret_cast<RTCP_SDES_CHUNK *>(reinterpret_cast<uint8_t *>(base) + chunkSize);
         }
         }
         return reinterpret_cast<RTCP_SDES_CHUNK *>(base);
         return reinterpret_cast<RTCP_SDES_CHUNK *>(base);
     }
     }
 
 
-    [[nodiscard]] static unsigned int size(std::vector<uint8_t> lengths) {
+    [[nodiscard]] static unsigned int size(std::vector<std::vector<uint8_t>> lengths) {
         unsigned int chunks_size = 0;
         unsigned int chunks_size = 0;
         for (auto length: lengths) {
         for (auto length: lengths) {
             chunks_size += RTCP_SDES_CHUNK::size(length);
             chunks_size += RTCP_SDES_CHUNK::size(length);

+ 4 - 3
src/rtcpsenderreportable.cpp

@@ -51,7 +51,7 @@ void RTCPSenderReportable::setNeedsToReport() {
 
 
 message_ptr RTCPSenderReportable::getSenderReport(uint32_t timestamp) {
 message_ptr RTCPSenderReportable::getSenderReport(uint32_t timestamp) {
     auto srSize = RTCP_SR::size(0);
     auto srSize = RTCP_SR::size(0);
-    auto msg = make_message(srSize + RTCP_SDES::size({uint8_t(rtpConfig->cname.size())}), Message::Type::Control);
+    auto msg = make_message(srSize + RTCP_SDES::size({{uint8_t(rtpConfig->cname.size())}}), Message::Type::Control);
     auto sr = reinterpret_cast<RTCP_SR *>(msg->data());
     auto sr = reinterpret_cast<RTCP_SR *>(msg->data());
     auto timestamp_s = rtpConfig->timestampToSeconds(timestamp);
     auto timestamp_s = rtpConfig->timestampToSeconds(timestamp);
     auto currentTime = timeOffset + timestamp_s;
     auto currentTime = timeOffset + timestamp_s;
@@ -64,8 +64,9 @@ message_ptr RTCPSenderReportable::getSenderReport(uint32_t timestamp) {
     auto sdes = reinterpret_cast<RTCP_SDES *>(msg->data() + srSize);
     auto sdes = reinterpret_cast<RTCP_SDES *>(msg->data() + srSize);
     auto chunk = sdes->getChunk(0);
     auto chunk = sdes->getChunk(0);
     chunk->setSSRC(rtpConfig->ssrc);
     chunk->setSSRC(rtpConfig->ssrc);
-    chunk->type = 1;
-    chunk->setText(rtpConfig->cname);
+    auto item = chunk->getItem(0);
+    item->type = 1;
+    item->setText(rtpConfig->cname);
     sdes->preparePacket(1);
     sdes->preparePacket(1);
     return msg;
     return msg;
 }
 }