diff --git a/include/rtcp.hh b/include/rtcp.hh index 27e984d..b0929ff 100644 --- a/include/rtcp.hh +++ b/include/rtcp.hh @@ -357,6 +357,9 @@ namespace uvgrtp { rtp_error_t construct_rtcp_header(size_t packet_size, uint8_t*& frame, uint16_t secondField, uvgrtp::frame::RTCP_FRAME_TYPE frame_type, bool addLocalSSRC); + /* read the header values from rtcp packet */ + void read_rtcp_header(uint8_t* packet, uvgrtp::frame::rtcp_header& header, bool app); + /* Pointer to RTP context from which clock rate etc. info is collected and which is * used to change SSRC if a collision is detected */ uvgrtp::rtp *rtp_; diff --git a/src/rtcp.cc b/src/rtcp.cc index 16228e8..9fb555f 100644 --- a/src/rtcp.cc +++ b/src/rtcp.cc @@ -543,4 +543,16 @@ rtp_error_t uvgrtp::rtcp::construct_rtcp_header(size_t packet_size, } return RTP_OK; +} + +void uvgrtp::rtcp::read_rtcp_header(uint8_t* packet, uvgrtp::frame::rtcp_header& header, bool app) +{ + header.version = (packet[0] >> 6) & 0x3; + header.padding = (packet[0] >> 5) & 0x1; + if (app) + header.pkt_subtype = packet[0] & 0x1f; + else + header.count = packet[0] & 0x1f; + + header.length = ntohs(*(uint16_t*)&packet[2]); } \ No newline at end of file diff --git a/src/rtcp/app.cc b/src/rtcp/app.cc index bf48389..18d010a 100644 --- a/src/rtcp/app.cc +++ b/src/rtcp/app.cc @@ -29,14 +29,10 @@ rtp_error_t uvgrtp::rtcp::handle_app_packet(uint8_t *packet, size_t size) return RTP_INVALID_VALUE; auto frame = new uvgrtp::frame::rtcp_app_packet; - auto ret = RTP_OK; - - frame->header.version = (packet[0] >> 6) & 0x3; - frame->header.padding = (packet[0] >> 5) & 0x1; - frame->header.pkt_subtype = packet[0] & 0x1f; - frame->header.length = ntohs(*(uint16_t *)&packet[2]); + read_rtcp_header(packet, frame->header, true); frame->ssrc = ntohl(*(uint32_t *)&packet[4]); + auto ret = RTP_OK; if (srtcp_ && (ret = srtcp_->handle_rtcp_decryption(flags_, frame->ssrc, packet, size)) != RTP_OK) return ret; diff --git a/src/rtcp/receiver.cc b/src/rtcp/receiver.cc index 5ea664a..017a939 100644 --- a/src/rtcp/receiver.cc +++ b/src/rtcp/receiver.cc @@ -29,14 +29,10 @@ rtp_error_t uvgrtp::rtcp::handle_receiver_report_packet(uint8_t *packet, size_t return RTP_INVALID_VALUE; auto frame = new uvgrtp::frame::rtcp_receiver_report; - auto ret = RTP_OK; - - frame->header.version = (packet[0] >> 6) & 0x3; - frame->header.padding = (packet[0] >> 5) & 0x1; - frame->header.count = packet[0] & 0x1f; - frame->header.length = ntohs(*(uint16_t *)&packet[2]); + read_rtcp_header(packet, frame->header, false); frame->ssrc = ntohl(*(uint32_t *)&packet[4]); + auto ret = RTP_OK; if (srtcp_ && (ret = srtcp_->handle_rtcp_decryption(flags_, frame->ssrc, packet, size)) != RTP_OK) return ret; diff --git a/src/rtcp/sdes.cc b/src/rtcp/sdes.cc index 287ccf7..637883e 100644 --- a/src/rtcp/sdes.cc +++ b/src/rtcp/sdes.cc @@ -29,14 +29,10 @@ rtp_error_t uvgrtp::rtcp::handle_sdes_packet(uint8_t *packet, size_t size) return RTP_INVALID_VALUE; auto frame = new uvgrtp::frame::rtcp_sdes_packet; - auto ret = RTP_OK; - - frame->header.version = (packet[0] >> 6) & 0x3; - frame->header.padding = (packet[0] >> 5) & 0x1; - frame->header.count = packet[0] & 0x1f; - frame->header.length = ntohs(*(uint16_t *)&packet[2]); + read_rtcp_header(packet, frame->header, false); frame->ssrc = ntohl(*(uint32_t *)&packet[4]); + auto ret = RTP_OK; if (srtcp_ && (ret = srtcp_->handle_rtcp_decryption(flags_, frame->ssrc, packet, size)) != RTP_OK) return ret; diff --git a/src/rtcp/sender.cc b/src/rtcp/sender.cc index b614c0d..5a626f0 100644 --- a/src/rtcp/sender.cc +++ b/src/rtcp/sender.cc @@ -29,14 +29,10 @@ rtp_error_t uvgrtp::rtcp::handle_sender_report_packet(uint8_t *packet, size_t si return RTP_INVALID_VALUE; auto frame = new uvgrtp::frame::rtcp_sender_report; - auto ret = RTP_OK; - - frame->header.version = (packet[0] >> 6) & 0x3; - frame->header.padding = (packet[0] >> 5) & 0x1; - frame->header.count = packet[0] & 0x1f; - frame->header.length = ntohs(*(uint16_t *)&packet[2]); + read_rtcp_header(packet, frame->header, false); frame->ssrc = ntohl(*(uint32_t *)&packet[4]); + auto ret = RTP_OK; if (srtcp_ && (ret = srtcp_->handle_rtcp_decryption(flags_, frame->ssrc, packet, size)) != RTP_OK) return ret;