mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
RTC: Store the actual size of buffer for RTP packet.
This commit is contained in:
parent
171ae5dd2d
commit
b91d37b78a
3 changed files with 43 additions and 33 deletions
|
@ -290,7 +290,7 @@ public:
|
||||||
// video/audio packet use raw bytes, no video/audio packet.
|
// video/audio packet use raw bytes, no video/audio packet.
|
||||||
char* payload;
|
char* payload;
|
||||||
|
|
||||||
public:
|
private:
|
||||||
class SrsSharedPtrPayload
|
class SrsSharedPtrPayload
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -766,7 +766,8 @@ SrsRtpPacket2::SrsRtpPacket2()
|
||||||
{
|
{
|
||||||
payload_ = NULL;
|
payload_ = NULL;
|
||||||
payload_type_ = SrsRtpPacketPayloadTypeUnknown;
|
payload_type_ = SrsRtpPacketPayloadTypeUnknown;
|
||||||
shared_msg = NULL;
|
shared_buffer = NULL;
|
||||||
|
actual_buffer_size_ = 0;
|
||||||
|
|
||||||
nalu_type = SrsAvcNaluTypeReserved;
|
nalu_type = SrsAvcNaluTypeReserved;
|
||||||
frame_type = SrsFrameTypeReserved;
|
frame_type = SrsFrameTypeReserved;
|
||||||
|
@ -779,7 +780,7 @@ SrsRtpPacket2::SrsRtpPacket2()
|
||||||
SrsRtpPacket2::~SrsRtpPacket2()
|
SrsRtpPacket2::~SrsRtpPacket2()
|
||||||
{
|
{
|
||||||
recycle_payload();
|
recycle_payload();
|
||||||
recycle_shared_msg();
|
recycle_shared_buffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SrsRtpPacket2::reset()
|
void SrsRtpPacket2::reset()
|
||||||
|
@ -794,7 +795,7 @@ void SrsRtpPacket2::reset()
|
||||||
|
|
||||||
// Recyle the payload again, to ensure the packet is new one.
|
// Recyle the payload again, to ensure the packet is new one.
|
||||||
recycle_payload();
|
recycle_payload();
|
||||||
recycle_shared_msg();
|
recycle_shared_buffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SrsRtpPacket2::recycle_payload()
|
void SrsRtpPacket2::recycle_payload()
|
||||||
|
@ -805,48 +806,47 @@ void SrsRtpPacket2::recycle_payload()
|
||||||
|
|
||||||
if (payload_type_ == SrsRtpPacketPayloadTypeRaw && _srs_rtp_raw_cache->enabled()) {
|
if (payload_type_ == SrsRtpPacketPayloadTypeRaw && _srs_rtp_raw_cache->enabled()) {
|
||||||
_srs_rtp_raw_cache->recycle((SrsRtpRawPayload*)payload_);
|
_srs_rtp_raw_cache->recycle((SrsRtpRawPayload*)payload_);
|
||||||
payload_ = NULL;
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (payload_type_ == SrsRtpPacketPayloadTypeFUA2 && _srs_rtp_fua_cache->enabled()) {
|
if (payload_type_ == SrsRtpPacketPayloadTypeFUA2 && _srs_rtp_fua_cache->enabled()) {
|
||||||
_srs_rtp_fua_cache->recycle((SrsRtpFUAPayload2*)payload_);
|
_srs_rtp_fua_cache->recycle((SrsRtpFUAPayload2*)payload_);
|
||||||
payload_ = NULL;
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_freep(payload_);
|
srs_freep(payload_);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
payload_ = NULL;
|
||||||
payload_type_ = SrsRtpPacketPayloadTypeUnknown;
|
payload_type_ = SrsRtpPacketPayloadTypeUnknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SrsRtpPacket2::recycle_shared_msg()
|
void SrsRtpPacket2::recycle_shared_buffer()
|
||||||
{
|
{
|
||||||
if (!shared_msg) {
|
if (!shared_buffer) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only recycle the message for UDP packets.
|
// Only recycle the message for UDP packets.
|
||||||
if (shared_msg->payload && shared_msg->size == kRtpPacketSize) {
|
if (shared_buffer->payload && shared_buffer->size == kRtpPacketSize) {
|
||||||
if (_srs_rtp_msg_cache_objs->enabled() && shared_msg->count() > 0) {
|
if (_srs_rtp_msg_cache_objs->enabled() && shared_buffer->count() > 0) {
|
||||||
// Recycle the small shared message objects.
|
// Recycle the small shared message objects.
|
||||||
_srs_rtp_msg_cache_objs->recycle(shared_msg);
|
_srs_rtp_msg_cache_objs->recycle(shared_buffer);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_srs_rtp_msg_cache_buffers->enabled() && shared_msg->count() == 0) {
|
if (_srs_rtp_msg_cache_buffers->enabled() && shared_buffer->count() == 0) {
|
||||||
// Recycle the UDP large buffer.
|
// Recycle the UDP large buffer.
|
||||||
_srs_rtp_msg_cache_buffers->recycle(shared_msg);
|
_srs_rtp_msg_cache_buffers->recycle(shared_buffer);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_freep(shared_msg);
|
srs_freep(shared_buffer);
|
||||||
return;
|
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
shared_msg = NULL;
|
shared_buffer = NULL;
|
||||||
|
actual_buffer_size_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SrsRtpPacket2::recycle()
|
bool SrsRtpPacket2::recycle()
|
||||||
|
@ -859,7 +859,7 @@ bool SrsRtpPacket2::recycle()
|
||||||
// We only recycle the payload and shared messages,
|
// We only recycle the payload and shared messages,
|
||||||
// for header and fields, user will reset or copy it.
|
// for header and fields, user will reset or copy it.
|
||||||
recycle_payload();
|
recycle_payload();
|
||||||
recycle_shared_msg();
|
recycle_shared_buffer();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -867,28 +867,30 @@ bool SrsRtpPacket2::recycle()
|
||||||
char* SrsRtpPacket2::wrap(int size)
|
char* SrsRtpPacket2::wrap(int size)
|
||||||
{
|
{
|
||||||
// If the buffer is large enough, reuse it.
|
// If the buffer is large enough, reuse it.
|
||||||
if (shared_msg && shared_msg->size >= size) {
|
if (shared_buffer && shared_buffer->size >= size) {
|
||||||
return shared_msg->payload;
|
return shared_buffer->payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a large enough message, with under-layer buffer.
|
// Create a large enough message, with under-layer buffer.
|
||||||
while (true) {
|
while (true) {
|
||||||
srs_freep(shared_msg);
|
srs_freep(shared_buffer);
|
||||||
shared_msg = _srs_rtp_msg_cache_buffers->allocate();
|
shared_buffer = _srs_rtp_msg_cache_buffers->allocate();
|
||||||
|
// The buffer size is larger or equals to the size of packet.
|
||||||
|
actual_buffer_size_ = size;
|
||||||
|
|
||||||
// If got a cached message(which has payload), but it's too small,
|
// If got a cached message(which has payload), but it's too small,
|
||||||
// we free it and allocate a larger one.
|
// we free it and allocate a larger one.
|
||||||
if (shared_msg->payload && shared_msg->size < size) {
|
if (shared_buffer->payload && shared_buffer->size < size) {
|
||||||
++_srs_pps_objs_rothers->sugar;
|
++_srs_pps_objs_rothers->sugar;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create under-layer buffer for new message
|
// Create under-layer buffer for new message
|
||||||
if (!shared_msg->payload) {
|
if (!shared_buffer->payload) {
|
||||||
// For RTC, we use larger under-layer buffer for each packet.
|
// For RTC, we use larger under-layer buffer for each packet.
|
||||||
int nb_buffer = srs_max(size, kRtpPacketSize);
|
int nb_buffer = srs_max(size, kRtpPacketSize);
|
||||||
char* buf = new char[nb_buffer];
|
char* buf = new char[nb_buffer];
|
||||||
shared_msg->wrap(buf, nb_buffer);
|
shared_buffer->wrap(buf, nb_buffer);
|
||||||
|
|
||||||
++_srs_pps_objs_rbuf->sugar;
|
++_srs_pps_objs_rbuf->sugar;
|
||||||
}
|
}
|
||||||
|
@ -896,7 +898,7 @@ char* SrsRtpPacket2::wrap(int size)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return shared_msg->payload;
|
return shared_buffer->payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* SrsRtpPacket2::wrap(char* data, int size)
|
char* SrsRtpPacket2::wrap(char* data, int size)
|
||||||
|
@ -908,11 +910,15 @@ char* SrsRtpPacket2::wrap(char* data, int size)
|
||||||
|
|
||||||
char* SrsRtpPacket2::wrap(SrsSharedPtrMessage* msg)
|
char* SrsRtpPacket2::wrap(SrsSharedPtrMessage* msg)
|
||||||
{
|
{
|
||||||
// Recycle the shared message.
|
// Generally, the wrap(msg) is used for RTMP to RTC, which is not generated by RTC,
|
||||||
recycle_shared_msg();
|
// so we do not recycle the msg. It's ok to directly free the msg, event the msg is
|
||||||
|
// allocated by object cache manager.
|
||||||
|
srs_freep(shared_buffer);
|
||||||
|
|
||||||
// Copy from the new message.
|
// Copy from the new message.
|
||||||
shared_msg = msg->copy();
|
shared_buffer = msg->copy();
|
||||||
|
// If we wrap a message, the size of packet equals to the message size.
|
||||||
|
actual_buffer_size_ = shared_buffer->size;
|
||||||
|
|
||||||
return msg->payload;
|
return msg->payload;
|
||||||
}
|
}
|
||||||
|
@ -924,19 +930,20 @@ SrsRtpPacket2* SrsRtpPacket2::copy()
|
||||||
// We got packet from cache, the payload and message MUST be NULL,
|
// We got packet from cache, the payload and message MUST be NULL,
|
||||||
// because we had clear it in recycle.
|
// because we had clear it in recycle.
|
||||||
//srs_assert(!cp->payload_);
|
//srs_assert(!cp->payload_);
|
||||||
//srs_assert(!cp->shared_msg);
|
//srs_assert(!cp->shared_buffer);
|
||||||
|
|
||||||
cp->header = header;
|
cp->header = header;
|
||||||
cp->payload_ = payload_? payload_->copy():NULL;
|
cp->payload_ = payload_? payload_->copy():NULL;
|
||||||
cp->payload_type_ = payload_type_;
|
cp->payload_type_ = payload_type_;
|
||||||
|
|
||||||
cp->nalu_type = nalu_type;
|
cp->nalu_type = nalu_type;
|
||||||
cp->shared_msg = shared_msg->copy2();
|
cp->shared_buffer = shared_buffer->copy2();
|
||||||
|
cp->actual_buffer_size_ = actual_buffer_size_;
|
||||||
cp->frame_type = frame_type;
|
cp->frame_type = frame_type;
|
||||||
|
|
||||||
cp->cached_payload_size = cached_payload_size;
|
cp->cached_payload_size = cached_payload_size;
|
||||||
// For performance issue, do not copy the unused field.
|
// For performance issue, do not copy the unused field.
|
||||||
//cp->decode_handler = decode_handler;
|
cp->decode_handler = decode_handler;
|
||||||
|
|
||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
|
|
|
@ -289,7 +289,10 @@ private:
|
||||||
SrsRtpPacketPayloadType payload_type_;
|
SrsRtpPacketPayloadType payload_type_;
|
||||||
private:
|
private:
|
||||||
// The original shared message, all RTP packets can refer to its data.
|
// The original shared message, all RTP packets can refer to its data.
|
||||||
SrsSharedPtrMessage* shared_msg;
|
// Note that the size of shared msg, is not the packet size, it's a larger aligned buffer.
|
||||||
|
SrsSharedPtrMessage* shared_buffer;
|
||||||
|
// The size of original packet.
|
||||||
|
int actual_buffer_size_;
|
||||||
// Helper fields.
|
// Helper fields.
|
||||||
public:
|
public:
|
||||||
// The first byte as nalu type, for video decoder only.
|
// The first byte as nalu type, for video decoder only.
|
||||||
|
@ -311,7 +314,7 @@ public:
|
||||||
void reset();
|
void reset();
|
||||||
private:
|
private:
|
||||||
void recycle_payload();
|
void recycle_payload();
|
||||||
void recycle_shared_msg();
|
void recycle_shared_buffer();
|
||||||
public:
|
public:
|
||||||
// Recycle the object to reuse it.
|
// Recycle the object to reuse it.
|
||||||
virtual bool recycle();
|
virtual bool recycle();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue