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:
parent
d5c514cdcb
commit
3bd56bb3a3
3 changed files with 37 additions and 18 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue