diff --git a/trunk/src/kernel/srs_kernel_rtp.cpp b/trunk/src/kernel/srs_kernel_rtp.cpp index 9f8a3b671..d00140005 100644 --- a/trunk/src/kernel/srs_kernel_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtp.cpp @@ -157,6 +157,7 @@ void SrsRtpHeader::set_ssrc(uint32_t ssrc) SrsRtpPacket2::SrsRtpPacket2() { payload = NULL; + padding = 0; } SrsRtpPacket2::~SrsRtpPacket2() @@ -164,6 +165,17 @@ SrsRtpPacket2::~SrsRtpPacket2() srs_freep(payload); } +void SrsRtpPacket2::set_padding(int size) +{ + rtp_header.set_padding(size > 0); + padding = size; +} + +int SrsRtpPacket2::nb_bytes() +{ + return rtp_header.header_size() + (payload? payload->nb_bytes():0) + padding; +} + srs_error_t SrsRtpPacket2::encode(SrsBuffer* buf) { srs_error_t err = srs_success; @@ -176,6 +188,14 @@ srs_error_t SrsRtpPacket2::encode(SrsBuffer* buf) return srs_error_wrap(err, "encode payload"); } + if (padding) { + if (!buf->require(padding)) { + return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", padding); + } + memset(buf->data(), padding, padding); + buf->skip(padding); + } + return err; } diff --git a/trunk/src/kernel/srs_kernel_rtp.hpp b/trunk/src/kernel/srs_kernel_rtp.hpp index 6fe5f32ef..975b2b463 100644 --- a/trunk/src/kernel/srs_kernel_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtp.hpp @@ -74,6 +74,7 @@ public: int64_t get_timestamp() const { return timestamp; } void set_ssrc(uint32_t ssrc); uint32_t get_ssrc() const { return ssrc; } + void set_padding(bool v) { padding = v; } }; class SrsRtpPacket2 @@ -81,10 +82,16 @@ class SrsRtpPacket2 public: SrsRtpHeader rtp_header; ISrsEncoder* payload; + int padding; public: SrsRtpPacket2(); virtual ~SrsRtpPacket2(); public: + // Append size of bytes as padding. + virtual void set_padding(int size); +// interface ISrsEncoder +public: + virtual int nb_bytes(); virtual srs_error_t encode(SrsBuffer* buf); };