1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

For #307, zero copy for RTP audio packet

This commit is contained in:
winlin 2020-04-11 22:54:44 +08:00
parent bf62244908
commit 4b2404c203
4 changed files with 148 additions and 29 deletions

View file

@ -77,7 +77,7 @@ srs_error_t SrsRtpHeader::decode(SrsBuffer* stream)
{
srs_error_t err = srs_success;
// TODO:
// TODO: FIXME: Implements it.
return err;
}
@ -86,19 +86,21 @@ srs_error_t SrsRtpHeader::encode(SrsBuffer* stream)
{
srs_error_t err = srs_success;
uint8_t first = 0x80 | cc;
uint8_t v = 0x80 | cc;
if (padding) {
first |= 0x40;
v |= 0x40;
}
if (extension) {
first |= 0x10;
v |= 0x10;
}
stream->write_1bytes(first);
uint8_t second = payload_type;
stream->write_1bytes(v);
v = payload_type;
if (marker) {
payload_type |= kRtpMarker;
v |= kRtpMarker;
}
stream->write_1bytes(second);
stream->write_1bytes(v);
stream->write_2bytes(sequence);
stream->write_4bytes(timestamp);
stream->write_4bytes(ssrc);
@ -143,6 +145,37 @@ void SrsRtpHeader::set_ssrc(uint32_t ssrc)
this->ssrc = ssrc;
}
SrsRtpPacket2::SrsRtpPacket2()
{
payload = NULL;
nn_payload = 0;
}
SrsRtpPacket2::~SrsRtpPacket2()
{
}
srs_error_t SrsRtpPacket2::encode(SrsBuffer* stream)
{
srs_error_t err = srs_success;
if ((err = rtp_header.encode(stream)) != srs_success) {
return srs_error_wrap(err, "rtp header");
}
if (nn_payload <= 0) {
return 0;
}
if (!stream->require(nn_payload)) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", nn_payload);
}
stream->write_bytes(payload, nn_payload);
return err;
}
SrsRtpSharedPacket::SrsRtpSharedPacketPayload::SrsRtpSharedPacketPayload()
{
payload = NULL;

View file

@ -70,6 +70,20 @@ public:
uint32_t get_ssrc() const { return ssrc; }
};
class SrsRtpPacket2
{
public:
SrsRtpHeader rtp_header;
// @remark We only refer to the memory, user must free it.
char* payload;
int nn_payload;
public:
SrsRtpPacket2();
virtual ~SrsRtpPacket2();
public:
virtual srs_error_t encode(SrsBuffer* stream);
};
class SrsRtpSharedPacket
{
private: