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

RTC: Remove cache for RTP packet

This commit is contained in:
winlin 2020-05-14 14:44:24 +08:00
parent 7b0a9fe95f
commit 5e2a3572eb
6 changed files with 37 additions and 148 deletions

View file

@ -469,86 +469,23 @@ srs_error_t SrsRtcDtls::unprotect_rtcp(char* out_buf, const char* in_buf, int& n
return srs_error_new(ERROR_RTC_SRTP_UNPROTECT, "rtcp unprotect failed");
}
SrsRtcOutgoingPackets::SrsRtcOutgoingPackets(int nn_cache_max)
SrsRtcOutgoingPackets::SrsRtcOutgoingPackets()
{
#if defined(SRS_DEBUG)
debug_id = 0;
#endif
use_gso = false;
should_merge_nalus = false;
nn_rtp_pkts = 0;
nn_audios = nn_extras = 0;
nn_videos = nn_samples = 0;
nn_bytes = nn_rtp_bytes = 0;
nn_padding_bytes = nn_paddings = 0;
nn_dropped = 0;
cursor = 0;
nn_cache = nn_cache_max;
// TODO: FIXME: We should allocate a smaller cache, and increase it when exhausted.
cache = new SrsRtpPacket2[nn_cache];
}
SrsRtcOutgoingPackets::~SrsRtcOutgoingPackets()
{
srs_freepa(cache);
nn_cache = 0;
}
void SrsRtcOutgoingPackets::reset(bool gso, bool merge_nalus)
{
for (int i = 0; i < cursor; i++) {
SrsRtpPacket2* packet = cache + i;
packet->reset();
}
#if defined(SRS_DEBUG)
debug_id++;
#endif
use_gso = gso;
should_merge_nalus = merge_nalus;
nn_rtp_pkts = 0;
nn_audios = nn_extras = 0;
nn_videos = nn_samples = 0;
nn_bytes = nn_rtp_bytes = 0;
nn_padding_bytes = nn_paddings = 0;
nn_dropped = 0;
cursor = 0;
}
SrsRtpPacket2* SrsRtcOutgoingPackets::fetch()
{
if (cursor >= nn_cache) {
return NULL;
}
return cache + (cursor++);
}
SrsRtpPacket2* SrsRtcOutgoingPackets::back()
{
srs_assert(cursor > 0);
return cache + cursor - 1;
}
int SrsRtcOutgoingPackets::size()
{
return cursor;
}
int SrsRtcOutgoingPackets::capacity()
{
return nn_cache;
}
SrsRtpPacket2* SrsRtcOutgoingPackets::at(int index)
{
srs_assert(index < cursor);
return cache + index;
}
SrsRtcPlayer::SrsRtcPlayer(SrsRtcSession* s, int parent_cid)
@ -752,7 +689,7 @@ srs_error_t SrsRtcPlayer::cycle()
int nn_rtc_packets = srs_max(info.nn_audios, info.nn_extras) + info.nn_videos;
stat->perf_on_rtc_packets(nn_rtc_packets);
// Stat the RAW RTP packets, which maybe group by GSO.
stat->perf_on_rtp_packets(info.size());
stat->perf_on_rtp_packets(msg_count);
// Stat the RTP packets going into kernel.
stat->perf_on_gso_packets(info.nn_rtp_pkts);
// Stat the bytes and paddings.
@ -764,8 +701,8 @@ srs_error_t SrsRtcPlayer::cycle()
if (pprint->can_print()) {
// TODO: FIXME: Print stat like frame/s, packet/s, loss_packets.
srs_trace("-> RTC PLAY %d/%d msgs, %d/%d packets, %d audios, %d extras, %d videos, %d samples, %d/%d/%d bytes, %d pad, %d/%d cache",
msg_count, info.nn_dropped, info.size(), info.nn_rtp_pkts, info.nn_audios, info.nn_extras, info.nn_videos, info.nn_samples, info.nn_bytes,
info.nn_rtp_bytes, info.nn_padding_bytes, info.nn_paddings, info.size(), info.capacity());
msg_count, info.nn_dropped, msg_count, info.nn_rtp_pkts, info.nn_audios, info.nn_extras, info.nn_videos, info.nn_samples, info.nn_bytes,
info.nn_rtp_bytes, info.nn_padding_bytes, info.nn_paddings, msg_count, msg_count);
}
}
}
@ -926,7 +863,9 @@ srs_error_t SrsRtcPlayer::send_packets(std::vector<SrsRtpPacket2*>& pkts, SrsRtc
nack->padding = pkt->padding;
// TODO: FIXME: Should avoid memory copying.
SrsRtpRawPayload* payload = nack->reuse_raw();
SrsRtpRawPayload* payload = new SrsRtpRawPayload();
nack->payload = payload;
payload->nn_payload = (int)iov->iov_len;
payload->payload = new char[payload->nn_payload];
memcpy((void*)payload->payload, iov->iov_base, iov->iov_len);
@ -1099,7 +1038,9 @@ srs_error_t SrsRtcPlayer::send_packets_gso(vector<SrsRtpPacket2*>& pkts, SrsRtcO
nack->padding = packet->padding;
// TODO: FIXME: Should avoid memory copying.
SrsRtpRawPayload* payload = nack->reuse_raw();
SrsRtpRawPayload* payload = new SrsRtpRawPayload();
nack->payload = payload;
payload->nn_payload = (int)iov->iov_len;
payload->payload = new char[payload->nn_payload];
memcpy((void*)payload->payload, iov->iov_base, iov->iov_len);
@ -1747,15 +1688,15 @@ void SrsRtcPublisher::on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* bu
uint32_t ssrc = pkt->rtp_header.get_ssrc();
if (ssrc == audio_ssrc) {
*ppayload = pkt->reuse_raw();
*ppayload = new SrsRtpRawPayload();
} else if (ssrc == video_ssrc) {
uint8_t v = (uint8_t)pkt->nalu_type;
if (v == kStapA) {
*ppayload = new SrsRtpSTAPPayload();
} else if (v == kFuA) {
*ppayload = pkt->reuse_fua();
*ppayload = new SrsRtpFUAPayload2();
} else {
*ppayload = pkt->reuse_raw();
*ppayload = new SrsRtpRawPayload();
}
}
}