1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-15 04:42:04 +00:00

For #307, reuse fua cache payload for RTP

This commit is contained in:
winlin 2020-04-16 14:51:36 +08:00
parent d5c514cdcb
commit 3bd56bb3a3
3 changed files with 37 additions and 18 deletions

View file

@ -1182,10 +1182,12 @@ srs_error_t SrsRtcSenderThread::packet_nalus(SrsSharedPtrMessage* msg, SrsRtcPac
if (nn_bytes < kRtpMaxPayloadSize) { if (nn_bytes < kRtpMaxPayloadSize) {
// Package NALUs in a single RTP packet. // Package NALUs in a single RTP packet.
SrsRtpPacket2* packet = packets.fetch(); SrsRtpPacket2* packet = packets.fetch();
packet->rtp_header.set_timestamp(msg->timestamp * 90); packet->rtp_header.set_timestamp(msg->timestamp * 90);
packet->rtp_header.set_sequence(video_sequence++); packet->rtp_header.set_sequence(video_sequence++);
packet->rtp_header.set_ssrc(video_ssrc); packet->rtp_header.set_ssrc(video_ssrc);
packet->rtp_header.set_payload_type(video_payload_type); packet->rtp_header.set_payload_type(video_payload_type);
packet->payload = raw; packet->payload = raw;
} else { } else {
SrsAutoFree(SrsRtpRawNALUs, raw); SrsAutoFree(SrsRtpRawNALUs, raw);
@ -1202,12 +1204,6 @@ srs_error_t SrsRtcSenderThread::packet_nalus(SrsSharedPtrMessage* msg, SrsRtcPac
for (int i = 0; i < num_of_packet; ++i) { for (int i = 0; i < num_of_packet; ++i) {
int packet_size = srs_min(nb_left, fu_payload_size); int packet_size = srs_min(nb_left, fu_payload_size);
SrsRtpFUAPayload* fua = new SrsRtpFUAPayload();
if ((err = raw->read_samples(fua->nalus, packet_size)) != srs_success) {
srs_freep(fua);
return srs_error_wrap(err, "read samples %d bytes, left %d, total %d", packet_size, nb_left, nn_bytes);
}
SrsRtpPacket2* packet = packets.fetch(); SrsRtpPacket2* packet = packets.fetch();
packet->rtp_header.set_timestamp(msg->timestamp * 90); packet->rtp_header.set_timestamp(msg->timestamp * 90);
@ -1215,13 +1211,17 @@ srs_error_t SrsRtcSenderThread::packet_nalus(SrsSharedPtrMessage* msg, SrsRtcPac
packet->rtp_header.set_ssrc(video_ssrc); packet->rtp_header.set_ssrc(video_ssrc);
packet->rtp_header.set_payload_type(video_payload_type); packet->rtp_header.set_payload_type(video_payload_type);
packet->payload = fua; SrsRtpFUAPayload* fua = packet->reuse_fua();
fua->nri = (SrsAvcNaluType)header; fua->nri = (SrsAvcNaluType)header;
fua->nalu_type = (SrsAvcNaluType)nal_type; fua->nalu_type = (SrsAvcNaluType)nal_type;
fua->start = bool(i == 0); fua->start = bool(i == 0);
fua->end = bool(i == num_of_packet - 1); fua->end = bool(i == num_of_packet - 1);
if ((err = raw->read_samples(fua->nalus, packet_size)) != srs_success) {
return srs_error_wrap(err, "read samples %d bytes, left %d, total %d", packet_size, nb_left, nn_bytes);
}
nb_left -= packet_size; nb_left -= packet_size;
} }
} }
@ -1274,8 +1274,7 @@ srs_error_t SrsRtcSenderThread::packet_fu_a(SrsSharedPtrMessage* msg, SrsSample*
packet->rtp_header.set_ssrc(video_ssrc); packet->rtp_header.set_ssrc(video_ssrc);
packet->rtp_header.set_payload_type(video_payload_type); packet->rtp_header.set_payload_type(video_payload_type);
SrsRtpFUAPayload* fua = new SrsRtpFUAPayload(); SrsRtpFUAPayload* fua = packet->reuse_fua();
packet->payload = fua;
fua->nri = (SrsAvcNaluType)header; fua->nri = (SrsAvcNaluType)header;
fua->nalu_type = (SrsAvcNaluType)nal_type; fua->nalu_type = (SrsAvcNaluType)nal_type;
@ -1305,13 +1304,9 @@ srs_error_t SrsRtcSenderThread::packet_single_nalu(SrsSharedPtrMessage* msg, Srs
packet->rtp_header.set_ssrc(video_ssrc); packet->rtp_header.set_ssrc(video_ssrc);
packet->rtp_header.set_payload_type(video_payload_type); packet->rtp_header.set_payload_type(video_payload_type);
SrsRtpRawNALUs* raw = new SrsRtpRawNALUs(); SrsRtpRawPayload* raw = packet->reuse_raw();
packet->payload = raw; raw->payload = sample->bytes;
raw->nn_payload = sample->size;
SrsSample* p = new SrsSample();
p->bytes = sample->bytes;
p->size = sample->size;
raw->push_back(p);
return err; return err;
} }

View file

@ -148,12 +148,13 @@ SrsRtpPacket2::SrsRtpPacket2()
padding = 0; padding = 0;
cache_raw = new SrsRtpRawPayload(); cache_raw = new SrsRtpRawPayload();
cache_fua = new SrsRtpFUAPayload();
} }
SrsRtpPacket2::~SrsRtpPacket2() SrsRtpPacket2::~SrsRtpPacket2()
{ {
// We may use the cache as payload. // We may use the cache as payload.
if (payload == cache_raw) { if (payload == cache_raw || payload == cache_fua) {
payload = NULL; payload = NULL;
} }
@ -173,7 +174,7 @@ void SrsRtpPacket2::reset()
padding = 0; padding = 0;
// We may use the cache as payload. // We may use the cache as payload.
if (payload == cache_raw) { if (payload == cache_raw || payload == cache_fua) {
payload = NULL; payload = NULL;
} }
@ -186,6 +187,13 @@ SrsRtpRawPayload* SrsRtpPacket2::reuse_raw()
return cache_raw; return cache_raw;
} }
SrsRtpFUAPayload* SrsRtpPacket2::reuse_fua()
{
payload = cache_fua;
cache_fua->reset();
return cache_fua;
}
int SrsRtpPacket2::nb_bytes() int SrsRtpPacket2::nb_bytes()
{ {
return rtp_header.header_size() + (payload? payload->nb_bytes():0) + padding; return rtp_header.header_size() + (payload? payload->nb_bytes():0) + padding;
@ -421,6 +429,16 @@ SrsRtpFUAPayload::~SrsRtpFUAPayload()
nalus.clear(); nalus.clear();
} }
void SrsRtpFUAPayload::reset()
{
vector<SrsSample*>::iterator it;
for (it = nalus.begin(); it != nalus.end(); ++it) {
SrsSample* p = *it;
srs_freep(p);
}
nalus.clear();
}
int SrsRtpFUAPayload::nb_bytes() int SrsRtpFUAPayload::nb_bytes()
{ {
int size = 2; int size = 2;

View file

@ -39,6 +39,7 @@ const uint8_t kNalTypeMask = 0x1F;
class SrsBuffer; class SrsBuffer;
class SrsRtpRawPayload; class SrsRtpRawPayload;
class SrsRtpFUAPayload;
class SrsRtpHeader class SrsRtpHeader
{ {
@ -85,6 +86,7 @@ public:
int padding; int padding;
private: private:
SrsRtpRawPayload* cache_raw; SrsRtpRawPayload* cache_raw;
SrsRtpFUAPayload* cache_fua;
public: public:
SrsRtpPacket2(); SrsRtpPacket2();
virtual ~SrsRtpPacket2(); virtual ~SrsRtpPacket2();
@ -95,6 +97,8 @@ public:
void reset(); void reset();
// Reuse the cached raw message as payload. // Reuse the cached raw message as payload.
SrsRtpRawPayload* reuse_raw(); SrsRtpRawPayload* reuse_raw();
// Reuse the cached fua message as payload.
SrsRtpFUAPayload* reuse_fua();
// interface ISrsEncoder // interface ISrsEncoder
public: public:
virtual int nb_bytes(); virtual int nb_bytes();
@ -172,6 +176,8 @@ public:
public: public:
SrsRtpFUAPayload(); SrsRtpFUAPayload();
virtual ~SrsRtpFUAPayload(); virtual ~SrsRtpFUAPayload();
public:
void reset();
// interface ISrsEncoder // interface ISrsEncoder
public: public:
virtual int nb_bytes(); virtual int nb_bytes();