1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-13 20:01:56 +00:00

RTC: Fast copy shared message for RTP

This commit is contained in:
winlin 2021-02-27 23:29:52 +08:00
parent 9ee0ed919a
commit 4e474a24ce
4 changed files with 23 additions and 10 deletions

View file

@ -361,14 +361,7 @@ SrsSharedPtrMessage* SrsSharedPtrMessage::copy()
{
srs_assert(ptr);
SrsSharedPtrMessage* copy = _srs_rtp_msg_cache_objs->allocate();
// We got an object from cache, the ptr might exists, so unwrap it.
copy->unwrap();
// Reference to this message instead.
copy->ptr = ptr;
ptr->shared_count++;
SrsSharedPtrMessage* copy = copy2();
copy->timestamp = timestamp;
copy->stream_id = stream_id;
@ -378,6 +371,20 @@ SrsSharedPtrMessage* SrsSharedPtrMessage::copy()
return copy;
}
SrsSharedPtrMessage* SrsSharedPtrMessage::copy2()
{
SrsSharedPtrMessage* copy = _srs_rtp_msg_cache_objs->allocate();
// We got an object from cache, the ptr might exists, so unwrap it.
//srs_assert(!copy->ptr);
// Reference to this message instead.
copy->ptr = ptr;
ptr->shared_count++;
return copy;
}
SrsFlvTransmuxer::SrsFlvTransmuxer()
{
writer = NULL;

View file

@ -351,6 +351,8 @@ public:
// copy current shared ptr message, use ref-count.
// @remark, assert object is created.
virtual SrsSharedPtrMessage* copy();
// Only copy the buffer, without header fields.
virtual SrsSharedPtrMessage* copy2();
};
// Transmux RTMP packets to FLV stream.

View file

@ -910,6 +910,8 @@ void SrsRtpPacket2::recycle_shared_msg()
}
if (!shared_msg->payload || shared_msg->size != kRtpPacketSize || shared_msg->count() > 0) {
// Note that we must unwrap the shared message, because this object pool only cache the
// shared message itself without payload.
shared_msg->unwrap();
_srs_rtp_msg_cache_objs->recycle(shared_msg);
goto cleanup;
@ -1007,7 +1009,7 @@ SrsRtpPacket2* SrsRtpPacket2::copy()
cp->payload_type_ = payload_type_;
cp->nalu_type = nalu_type;
cp->shared_msg = shared_msg->copy();
cp->shared_msg = shared_msg->copy2();
cp->frame_type = frame_type;
// For performance issue, do not copy the unused field.

View file

@ -591,8 +591,10 @@ extern SrsRtpObjectCacheManager<SrsRtpPacket2>* _srs_rtp_cache;
extern SrsRtpObjectCacheManager<SrsRtpRawPayload>* _srs_rtp_raw_cache;
extern SrsRtpObjectCacheManager<SrsRtpFUAPayload2>* _srs_rtp_fua_cache;
// For RTP packet shared messages cache.
// For shared message cache, with payload.
extern SrsRtpObjectCacheManager<SrsSharedPtrMessage>* _srs_rtp_msg_cache_buffers;
// For shared message cache, without payload.
// Note that user must unwrap the shared message, before recycle it.
extern SrsRtpObjectCacheManager<SrsSharedPtrMessage>* _srs_rtp_msg_cache_objs;
#endif