diff --git a/README.md b/README.md index ea320daf3..79511a126 100755 --- a/README.md +++ b/README.md @@ -176,6 +176,7 @@ The ports used by SRS: ## V4 changes +* v4.0, 2021-05-14, RTC: Remove [Object Cache Pool](https://github.com/ossrs/srs/commit/14bfc98122bba369572417c19ebb2a61b373fc45#commitcomment-47655008), no effect. 4.0.110 * v4.0, 2021-05-14, Change virtual public to public. 4.0.109 * v4.0, 2021-05-14, Refine id and vid for statistic. 4.0.108 * v4.0, 2021-05-09, Refine tid for sdk and demos. 4.0.106 diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index 5e562bbee..f10bdd088 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -524,30 +524,6 @@ rtc_server { # TODO: FIXME: We should enable it when refined. # default: off perf_stat off; - # For RTP packet and its payload cache. - rtp_cache { - # Whether enable the RTP packet cache. - # default: on - enabled on; - # The cache size for rtp packet in MB, each object is about 300B.. - # default: 64 - pkt_size 64.0; - # The cache size for rtp payload in MB, each object is about 40B. - # default: 16 - payload_size 16.0; - } - # For RTP shared message and the large buffer cache. - rtp_msg_cache { - #Whether enable the RTP message(a large buffer) cache. - # default: on - enabled on; - # The cache size for message object in MB, each object is about 40B. - # default: 16 - msg_size 16.0; - # The cache size for message large buffer in MB, each object is about 1500B. - # default: 512 - buffer_size 512.0; - } # The black-hole to copy packet to, for debugging. # For example, when debugging Chrome publish stream, the received packets are encrypted cipher, # we can set the publisher black-hole, SRS will copy the plaintext packets to black-hole, and diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 72de89e07..daa024a57 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -3679,7 +3679,7 @@ srs_error_t SrsConfig::check_normal_config() string n = conf->at(i)->name; if (n != "enabled" && n != "listen" && n != "dir" && n != "candidate" && n != "ecdsa" && n != "encrypt" && n != "reuseport" && n != "merge_nalus" && n != "perf_stat" && n != "black_hole" - && n != "ip_family" && n != "rtp_cache" && n != "rtp_msg_cache") { + && n != "ip_family") { return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal rtc_server.%s", n.c_str()); } } @@ -5050,138 +5050,6 @@ bool SrsConfig::get_rtc_server_perf_stat() return SRS_CONF_PERFER_FALSE(conf->arg0()); } -SrsConfDirective* SrsConfig::get_rtc_server_rtp_cache() -{ - SrsConfDirective* conf = root->get("rtc_server"); - if (!conf) { - return NULL; - } - - conf = conf->get("rtp_cache"); - if (!conf) { - return NULL; - } - - return conf; -} - -bool SrsConfig::get_rtc_server_rtp_cache_enabled() -{ - static bool DEFAULT = true; - - SrsConfDirective* conf = get_rtc_server_rtp_cache(); - if (!conf) { - return DEFAULT; - } - - conf = conf->get("enabled"); - if (!conf || conf->arg0().empty()) { - return DEFAULT; - } - - return SRS_CONF_PERFER_TRUE(conf->arg0()); -} - -uint64_t SrsConfig::get_rtc_server_rtp_cache_pkt_size() -{ - int DEFAULT = 64 * 1024 * 1024; - - SrsConfDirective* conf = get_rtc_server_rtp_cache(); - if (!conf) { - return DEFAULT; - } - - conf = conf->get("pkt_size"); - if (!conf || conf->arg0().empty()) { - return DEFAULT; - } - - return 1024 * (uint64_t)(1024 * ::atof(conf->arg0().c_str())); -} - -uint64_t SrsConfig::get_rtc_server_rtp_cache_payload_size() -{ - int DEFAULT = 16 * 1024 * 1024; - - SrsConfDirective* conf = get_rtc_server_rtp_cache(); - if (!conf) { - return DEFAULT; - } - - conf = conf->get("payload_size"); - if (!conf || conf->arg0().empty()) { - return DEFAULT; - } - - return 1024 * (uint64_t)(1024 * ::atof(conf->arg0().c_str())); -} - -SrsConfDirective* SrsConfig::get_rtc_server_rtp_msg_cache() -{ - SrsConfDirective* conf = root->get("rtc_server"); - if (!conf) { - return NULL; - } - - conf = conf->get("rtp_msg_cache"); - if (!conf) { - return NULL; - } - - return conf; -} - -bool SrsConfig::get_rtc_server_rtp_msg_cache_enabled() -{ - static bool DEFAULT = true; - - SrsConfDirective* conf = get_rtc_server_rtp_msg_cache(); - if (!conf) { - return DEFAULT; - } - - conf = conf->get("enabled"); - if (!conf || conf->arg0().empty()) { - return DEFAULT; - } - - return SRS_CONF_PERFER_TRUE(conf->arg0()); -} - -uint64_t SrsConfig::get_rtc_server_rtp_msg_cache_msg_size() -{ - int DEFAULT = 16 * 1024 * 1024; - - SrsConfDirective* conf = get_rtc_server_rtp_msg_cache(); - if (!conf) { - return DEFAULT; - } - - conf = conf->get("msg_size"); - if (!conf || conf->arg0().empty()) { - return DEFAULT; - } - - return 1024 * (uint64_t)(1024 * ::atof(conf->arg0().c_str())); -} - -uint64_t SrsConfig::get_rtc_server_rtp_msg_cache_buffer_size() -{ - int DEFAULT = 512 * 1024 * 1024; - - SrsConfDirective* conf = get_rtc_server_rtp_msg_cache(); - if (!conf) { - return DEFAULT; - } - - conf = conf->get("buffer_size"); - if (!conf || conf->arg0().empty()) { - return DEFAULT; - } - - return 1024 * (uint64_t)(1024 * ::atof(conf->arg0().c_str())); -} - bool SrsConfig::get_rtc_server_black_hole() { static bool DEFAULT = false; diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index b47cd8a22..6493eadae 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -543,18 +543,6 @@ public: virtual int get_rtc_server_reuseport(); virtual bool get_rtc_server_merge_nalus(); virtual bool get_rtc_server_perf_stat(); -private: - SrsConfDirective* get_rtc_server_rtp_cache(); -public: - virtual bool get_rtc_server_rtp_cache_enabled(); - virtual uint64_t get_rtc_server_rtp_cache_pkt_size(); - virtual uint64_t get_rtc_server_rtp_cache_payload_size(); -private: - virtual SrsConfDirective* get_rtc_server_rtp_msg_cache(); -public: - virtual bool get_rtc_server_rtp_msg_cache_enabled(); - virtual uint64_t get_rtc_server_rtp_msg_cache_msg_size(); - virtual uint64_t get_rtc_server_rtp_msg_cache_buffer_size(); public: virtual bool get_rtc_server_black_hole(); virtual std::string get_rtc_server_black_hole_addr(); diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 511263d78..aa2e17d40 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -443,29 +443,20 @@ srs_error_t SrsHybridServer::on_timer(srs_utime_t interval) #endif string objs_desc; - _srs_pps_objs_rtps->update(); _srs_pps_objs_rraw->update(); _srs_pps_objs_rfua->update(); _srs_pps_objs_rbuf->update(); _srs_pps_objs_msgs->update(); _srs_pps_objs_rothers->update(); _srs_pps_objs_drop->update(); - if (_srs_pps_objs_rtps->r10s() || _srs_pps_objs_rraw->r10s() || _srs_pps_objs_rfua->r10s() || _srs_pps_objs_rbuf->r10s() || _srs_pps_objs_msgs->r10s() || _srs_pps_objs_rothers->r10s() || _srs_pps_objs_drop->r10s()) { - snprintf(buf, sizeof(buf), ", objs=(pkt:%d,raw:%d,fua:%d,msg:%d,oth:%d,buf:%d,drop:%d)", + _srs_pps_objs_rtps->update(); _srs_pps_objs_rraw->update(); _srs_pps_objs_rfua->update(); _srs_pps_objs_rbuf->update(); _srs_pps_objs_msgs->update(); _srs_pps_objs_rothers->update(); + if (_srs_pps_objs_rtps->r10s() || _srs_pps_objs_rraw->r10s() || _srs_pps_objs_rfua->r10s() || _srs_pps_objs_rbuf->r10s() || _srs_pps_objs_msgs->r10s() || _srs_pps_objs_rothers->r10s()) { + snprintf(buf, sizeof(buf), ", objs=(pkt:%d,raw:%d,fua:%d,msg:%d,oth:%d,buf:%d)", _srs_pps_objs_rtps->r10s(), _srs_pps_objs_rraw->r10s(), _srs_pps_objs_rfua->r10s(), - _srs_pps_objs_msgs->r10s(), _srs_pps_objs_rothers->r10s(), _srs_pps_objs_rbuf->r10s(), _srs_pps_objs_drop->r10s()); + _srs_pps_objs_msgs->r10s(), _srs_pps_objs_rothers->r10s(), _srs_pps_objs_rbuf->r10s()); objs_desc = buf; } - string cache_desc; - if (_srs_rtp_cache->size() || _srs_rtp_raw_cache->size() || _srs_rtp_fua_cache->size() || _srs_rtp_msg_cache_buffers->size() || _srs_rtp_msg_cache_objs->size()) { - snprintf(buf, sizeof(buf), ", cache=(pkt:%d-%dw,raw:%d-%dw,fua:%d-%dw,msg:%d-%dw,buf:%d-%dw)", - _srs_rtp_cache->size(), _srs_rtp_cache->capacity()/10000, _srs_rtp_raw_cache->size(), _srs_rtp_raw_cache->capacity()/10000, - _srs_rtp_fua_cache->size(), _srs_rtp_fua_cache->capacity()/10000, _srs_rtp_msg_cache_objs->size(), _srs_rtp_msg_cache_objs->capacity()/10000, - _srs_rtp_msg_cache_buffers->size(), _srs_rtp_msg_cache_buffers->capacity()/10000); - cache_desc = buf; - } - - srs_trace("Hybrid cpu=%.2f%%,%dMB%s%s%s%s%s%s%s%s%s%s%s%s", + srs_trace("Hybrid cpu=%.2f%%,%dMB%s%s%s%s%s%s%s%s%s%s%s", u->percent * 100, memory, cid_desc.c_str(), timer_desc.c_str(), recvfrom_desc.c_str(), io_desc.c_str(), msg_desc.c_str(), epoll_desc.c_str(), sched_desc.c_str(), clock_desc.c_str(), - thread_desc.c_str(), free_desc.c_str(), objs_desc.c_str(), cache_desc.c_str() + thread_desc.c_str(), free_desc.c_str(), objs_desc.c_str() ); return err; diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 09f28a035..240f8c186 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -612,9 +612,9 @@ srs_error_t SrsRtcPlayStream::cycle() srs_freep(err); } - // Release the packet to cache. + // Free the packet. // @remark Note that the pkt might be set to NULL. - _srs_rtp_cache->recycle(pkt); + srs_freep(pkt); } } @@ -1287,10 +1287,7 @@ srs_error_t SrsRtcPublishStream::on_rtp_plaintext(char* plaintext, int nb_plaint } // Allocate packet form cache. - SrsRtpPacket2* pkt = _srs_rtp_cache->allocate(); - - // It's better to reset it before decode it. - pkt->reset(); + SrsRtpPacket2* pkt = new SrsRtpPacket2(); // Copy the packet body. char* p = pkt->wrap(plaintext, nb_plaintext); @@ -1301,9 +1298,9 @@ srs_error_t SrsRtcPublishStream::on_rtp_plaintext(char* plaintext, int nb_plaint // @remark Note that the pkt might be set to NULL. err = do_on_rtp_plaintext(pkt, &buf); - // Release the packet to cache. + // Free the packet. // @remark Note that the pkt might be set to NULL. - _srs_rtp_cache->recycle(pkt); + srs_freep(pkt); return err; } diff --git a/trunk/src/app/srs_app_rtc_queue.cpp b/trunk/src/app/srs_app_rtc_queue.cpp index c398fcc5f..fe3b40a66 100644 --- a/trunk/src/app/srs_app_rtc_queue.cpp +++ b/trunk/src/app/srs_app_rtc_queue.cpp @@ -55,7 +55,7 @@ SrsRtpRingBuffer::~SrsRtpRingBuffer() { for (int i = 0; i < capacity_; ++i) { SrsRtpPacket2* pkt = queue_[i]; - _srs_rtp_cache->recycle(pkt); + srs_freep(pkt); } srs_freepa(queue_); } @@ -80,10 +80,7 @@ void SrsRtpRingBuffer::advance_to(uint16_t seq) void SrsRtpRingBuffer::set(uint16_t at, SrsRtpPacket2* pkt) { SrsRtpPacket2* p = queue_[at % capacity_]; - - if (p) { - _srs_rtp_cache->recycle(p); - } + srs_freep(p); queue_[at % capacity_] = pkt; } @@ -170,7 +167,7 @@ void SrsRtpRingBuffer::clear_histroy(uint16_t seq) for (uint16_t i = 0; i < capacity_; i++) { SrsRtpPacket2* p = queue_[i]; if (p && p->header.get_sequence() < seq) { - _srs_rtp_cache->recycle(p); + srs_freep(p); queue_[i] = NULL; } } @@ -181,7 +178,7 @@ void SrsRtpRingBuffer::clear_all_histroy() for (uint16_t i = 0; i < capacity_; i++) { SrsRtpPacket2* p = queue_[i]; if (p) { - _srs_rtp_cache->recycle(p); + srs_freep(p); queue_[i] = NULL; } } diff --git a/trunk/src/app/srs_app_rtc_server.cpp b/trunk/src/app/srs_app_rtc_server.cpp index 706b4a5e2..c7a062376 100644 --- a/trunk/src/app/srs_app_rtc_server.cpp +++ b/trunk/src/app/srs_app_rtc_server.cpp @@ -289,61 +289,11 @@ srs_error_t SrsRtcServer::initialize() return srs_error_wrap(err, "black hole"); } - bool rtp_cache_enabled = _srs_config->get_rtc_server_rtp_cache_enabled(); - uint64_t rtp_cache_pkt_size = _srs_config->get_rtc_server_rtp_cache_pkt_size(); - uint64_t rtp_cache_payload_size = _srs_config->get_rtc_server_rtp_cache_payload_size(); - _srs_rtp_cache->setup(rtp_cache_enabled, rtp_cache_pkt_size); - _srs_rtp_raw_cache->setup(rtp_cache_enabled, rtp_cache_payload_size); - _srs_rtp_fua_cache->setup(rtp_cache_enabled, rtp_cache_payload_size); - - bool rtp_msg_cache_enabled = _srs_config->get_rtc_server_rtp_msg_cache_enabled(); - uint64_t rtp_msg_cache_msg_size = _srs_config->get_rtc_server_rtp_msg_cache_msg_size(); - uint64_t rtp_msg_cache_buffer_size = _srs_config->get_rtc_server_rtp_msg_cache_buffer_size(); - _srs_rtp_msg_cache_buffers->setup(rtp_msg_cache_enabled, rtp_msg_cache_buffer_size); - _srs_rtp_msg_cache_objs->setup(rtp_msg_cache_enabled, rtp_msg_cache_msg_size); - - srs_trace("RTC: Object cache init, rtp-cache=(enabled:%d,pkt:%dm-%dw,payload:%dm-%dw-%dw), msg-cache=(enabled:%d,obj:%dm-%dw,buf:%dm-%dw)", - rtp_cache_enabled, (int)(rtp_cache_pkt_size/1024/1024), _srs_rtp_cache->capacity()/10000, - (int)(rtp_cache_payload_size/1024/1024), _srs_rtp_raw_cache->capacity()/10000, _srs_rtp_fua_cache->capacity()/10000, - rtp_msg_cache_enabled, (int)(rtp_msg_cache_msg_size/1024/1024), _srs_rtp_msg_cache_objs->capacity()/10000, - (int)(rtp_msg_cache_buffer_size/1024/1024), _srs_rtp_msg_cache_buffers->capacity()/10000); - return err; } srs_error_t SrsRtcServer::on_reload_rtc_server() { - bool changed = false; - - bool rtp_cache_enabled = _srs_config->get_rtc_server_rtp_cache_enabled(); - uint64_t rtp_cache_pkt_size = _srs_config->get_rtc_server_rtp_cache_pkt_size(); - uint64_t rtp_cache_payload_size = _srs_config->get_rtc_server_rtp_cache_payload_size(); - if (_srs_rtp_cache->enabled() != rtp_cache_enabled) { - _srs_rtp_cache->setup(rtp_cache_enabled, rtp_cache_pkt_size); - _srs_rtp_raw_cache->setup(rtp_cache_enabled, rtp_cache_payload_size); - _srs_rtp_fua_cache->setup(rtp_cache_enabled, rtp_cache_payload_size); - - changed = true; - } - - bool rtp_msg_cache_enabled = _srs_config->get_rtc_server_rtp_msg_cache_enabled(); - uint64_t rtp_msg_cache_msg_size = _srs_config->get_rtc_server_rtp_msg_cache_msg_size(); - uint64_t rtp_msg_cache_buffer_size = _srs_config->get_rtc_server_rtp_msg_cache_buffer_size(); - if (_srs_rtp_msg_cache_buffers->enabled() != rtp_msg_cache_enabled) { - _srs_rtp_msg_cache_buffers->setup(rtp_msg_cache_enabled, rtp_msg_cache_buffer_size); - _srs_rtp_msg_cache_objs->setup(rtp_msg_cache_enabled, rtp_msg_cache_msg_size); - - changed = true; - } - - if (changed) { - srs_trace("RTC: Object cache reload, rtp-cache=(enabled:%d,pkt:%dm-%dw,payload:%dm-%dw-%dw), msg-cache=(enabled:%d,obj:%dm-%dw,buf:%dm-%dw)", - rtp_cache_enabled, (int)(rtp_cache_pkt_size/1024/1024), _srs_rtp_cache->capacity()/10000, - (int)(rtp_cache_payload_size/1024/1024), _srs_rtp_raw_cache->capacity()/10000, _srs_rtp_fua_cache->capacity()/10000, - rtp_msg_cache_enabled, (int)(rtp_msg_cache_msg_size/1024/1024), _srs_rtp_msg_cache_objs->capacity()/10000, - (int)(rtp_msg_cache_buffer_size/1024/1024), _srs_rtp_msg_cache_buffers->capacity()/10000); - } - return srs_success; } diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 226a2105d..6b789a55f 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -178,7 +178,7 @@ SrsRtcConsumer::~SrsRtcConsumer() vector::iterator it; for (it = queue.begin(); it != queue.end(); ++it) { SrsRtpPacket2* pkt = *it; - _srs_rtp_cache->recycle(pkt); + srs_freep(pkt); } srs_cond_destroy(mw_wait); @@ -661,19 +661,6 @@ srs_error_t SrsRtcStream::on_timer(srs_utime_t interval) return err; } -SrsRtpPacketCacheHelper::SrsRtpPacketCacheHelper() -{ - pkt = _srs_rtp_cache->allocate(); - - // We MUST reset the packet, when got from cache. - pkt->reset(); -} - -SrsRtpPacketCacheHelper::~SrsRtpPacketCacheHelper() -{ - _srs_rtp_cache->recycle(pkt); -} - #ifdef SRS_FFMPEG_FIT SrsRtcFromRtmpBridger::SrsRtcFromRtmpBridger(SrsRtcStream* source) { @@ -844,45 +831,46 @@ srs_error_t SrsRtcFromRtmpBridger::on_audio(SrsSharedPtrMessage* msg) return err; } -srs_error_t SrsRtcFromRtmpBridger::transcode(SrsAudioFrame* pkt) +srs_error_t SrsRtcFromRtmpBridger::transcode(SrsAudioFrame* audio) { srs_error_t err = srs_success; - std::vector out_pkts; - if ((err = codec_->transcode(pkt, out_pkts)) != srs_success) { + std::vector out_audios; + if ((err = codec_->transcode(audio, out_audios)) != srs_success) { return srs_error_wrap(err, "recode error"); } // Save OPUS packets in shared message. - if (out_pkts.empty()) { + if (out_audios.empty()) { return err; } - for (std::vector::iterator it = out_pkts.begin(); it != out_pkts.end(); ++it) { - SrsRtpPacketCacheHelper* helper = new SrsRtpPacketCacheHelper(); - SrsAutoFree(SrsRtpPacketCacheHelper, helper); + for (std::vector::iterator it = out_audios.begin(); it != out_audios.end(); ++it) { + SrsAudioFrame* out_audio = *it; - if ((err = package_opus(*it, helper)) != srs_success) { + SrsRtpPacket2* pkt = new SrsRtpPacket2(); + SrsAutoFree(SrsRtpPacket2, pkt); + + if ((err = package_opus(out_audio, pkt)) != srs_success) { err = srs_error_wrap(err, "package opus"); break; } - if ((err = source_->on_rtp(helper->pkt)) != srs_success) { + if ((err = source_->on_rtp(pkt)) != srs_success) { err = srs_error_wrap(err, "consume opus"); break; } } - codec_->free_frames(out_pkts); + codec_->free_frames(out_audios); return err; } -srs_error_t SrsRtcFromRtmpBridger::package_opus(SrsAudioFrame* audio, SrsRtpPacketCacheHelper* helper) +srs_error_t SrsRtcFromRtmpBridger::package_opus(SrsAudioFrame* audio, SrsRtpPacket2* pkt) { srs_error_t err = srs_success; - SrsRtpPacket2* pkt = helper->pkt; pkt->header.set_payload_type(kAudioPayloadType); pkt->header.set_ssrc(audio_ssrc); pkt->frame_type = SrsFrameTypeAudio; @@ -890,7 +878,7 @@ srs_error_t SrsRtcFromRtmpBridger::package_opus(SrsAudioFrame* audio, SrsRtpPack pkt->header.set_sequence(audio_sequence++); pkt->header.set_timestamp(audio->dts * 48); - SrsRtpRawPayload* raw = _srs_rtp_raw_cache->allocate(); + SrsRtpRawPayload* raw = new SrsRtpRawPayload(); pkt->set_payload(raw, SrsRtpPacketPayloadTypeRaw); srs_assert(audio->nb_samples == 1); @@ -923,22 +911,22 @@ srs_error_t SrsRtcFromRtmpBridger::on_video(SrsSharedPtrMessage* msg) // Well, for each IDR, we append a SPS/PPS before it, which is packaged in STAP-A. if (has_idr) { - SrsRtpPacketCacheHelper* helper = new SrsRtpPacketCacheHelper(); - SrsAutoFree(SrsRtpPacketCacheHelper, helper); + SrsRtpPacket2* pkt = new SrsRtpPacket2(); + SrsAutoFree(SrsRtpPacket2, pkt); - if ((err = package_stap_a(source_, msg, helper)) != srs_success) { + if ((err = package_stap_a(source_, msg, pkt)) != srs_success) { return srs_error_wrap(err, "package stap-a"); } - if ((err = source_->on_rtp(helper->pkt)) != srs_success) { + if ((err = source_->on_rtp(pkt)) != srs_success) { return srs_error_wrap(err, "consume sps/pps"); } } // If merge Nalus, we pcakges all NALUs(samples) as one NALU, in a RTP or FUA packet. - vector helpers; + vector pkts; if (merge_nalus && nn_samples > 1) { - if ((err = package_nalus(msg, samples, helpers)) != srs_success) { + if ((err = package_nalus(msg, samples, pkts)) != srs_success) { return srs_error_wrap(err, "package nalus as one"); } } else { @@ -953,22 +941,22 @@ srs_error_t SrsRtcFromRtmpBridger::on_video(SrsSharedPtrMessage* msg) } if (sample->size <= kRtpMaxPayloadSize) { - if ((err = package_single_nalu(msg, sample, helpers)) != srs_success) { + if ((err = package_single_nalu(msg, sample, pkts)) != srs_success) { return srs_error_wrap(err, "package single nalu"); } } else { - if ((err = package_fu_a(msg, sample, kRtpMaxPayloadSize, helpers)) != srs_success) { + if ((err = package_fu_a(msg, sample, kRtpMaxPayloadSize, pkts)) != srs_success) { return srs_error_wrap(err, "package fu-a"); } } } } - if (!helpers.empty()) { - helpers.back()->pkt->header.set_marker(true); + if (!pkts.empty()) { + pkts.back()->header.set_marker(true); } - return consume_packets(helpers); + return consume_packets(pkts); } srs_error_t SrsRtcFromRtmpBridger::filter(SrsSharedPtrMessage* msg, SrsFormat* format, bool& has_idr, vector& samples) @@ -1001,7 +989,7 @@ srs_error_t SrsRtcFromRtmpBridger::filter(SrsSharedPtrMessage* msg, SrsFormat* f return err; } -srs_error_t SrsRtcFromRtmpBridger::package_stap_a(SrsRtcStream* source, SrsSharedPtrMessage* msg, SrsRtpPacketCacheHelper* helper) +srs_error_t SrsRtcFromRtmpBridger::package_stap_a(SrsRtcStream* source, SrsSharedPtrMessage* msg, SrsRtpPacket2* pkt) { srs_error_t err = srs_success; @@ -1017,7 +1005,6 @@ srs_error_t SrsRtcFromRtmpBridger::package_stap_a(SrsRtcStream* source, SrsShare return srs_error_new(ERROR_RTC_RTP_MUXER, "sps/pps empty"); } - SrsRtpPacket2* pkt = helper->pkt; pkt->header.set_payload_type(kVideoPayloadType); pkt->header.set_ssrc(video_ssrc); pkt->frame_type = SrsFrameTypeVideo; @@ -1061,7 +1048,7 @@ srs_error_t SrsRtcFromRtmpBridger::package_stap_a(SrsRtcStream* source, SrsShare return err; } -srs_error_t SrsRtcFromRtmpBridger::package_nalus(SrsSharedPtrMessage* msg, const vector& samples, vector& helpers) +srs_error_t SrsRtcFromRtmpBridger::package_nalus(SrsSharedPtrMessage* msg, const vector& samples, vector& pkts) { srs_error_t err = srs_success; @@ -1097,10 +1084,9 @@ srs_error_t SrsRtcFromRtmpBridger::package_nalus(SrsSharedPtrMessage* msg, const if (nn_bytes < kRtpMaxPayloadSize) { // Package NALUs in a single RTP packet. - SrsRtpPacketCacheHelper* helper = new SrsRtpPacketCacheHelper(); - helpers.push_back(helper); + SrsRtpPacket2* pkt = new SrsRtpPacket2(); + pkts.push_back(pkt); - SrsRtpPacket2* pkt = helper->pkt; pkt->header.set_payload_type(kVideoPayloadType); pkt->header.set_ssrc(video_ssrc); pkt->frame_type = SrsFrameTypeVideo; @@ -1132,10 +1118,9 @@ srs_error_t SrsRtcFromRtmpBridger::package_nalus(SrsSharedPtrMessage* msg, const return srs_error_wrap(err, "read samples %d bytes, left %d, total %d", packet_size, nb_left, nn_bytes); } - SrsRtpPacketCacheHelper* helper = new SrsRtpPacketCacheHelper(); - helpers.push_back(helper); + SrsRtpPacket2* pkt = new SrsRtpPacket2(); + pkts.push_back(pkt); - SrsRtpPacket2* pkt = helper->pkt; pkt->header.set_payload_type(kVideoPayloadType); pkt->header.set_ssrc(video_ssrc); pkt->frame_type = SrsFrameTypeVideo; @@ -1159,21 +1144,20 @@ srs_error_t SrsRtcFromRtmpBridger::package_nalus(SrsSharedPtrMessage* msg, const } // Single NAL Unit Packet @see https://tools.ietf.org/html/rfc6184#section-5.6 -srs_error_t SrsRtcFromRtmpBridger::package_single_nalu(SrsSharedPtrMessage* msg, SrsSample* sample, vector& helpers) +srs_error_t SrsRtcFromRtmpBridger::package_single_nalu(SrsSharedPtrMessage* msg, SrsSample* sample, vector& pkts) { srs_error_t err = srs_success; - SrsRtpPacketCacheHelper* helper = new SrsRtpPacketCacheHelper(); - helpers.push_back(helper); + SrsRtpPacket2* pkt = new SrsRtpPacket2(); + pkts.push_back(pkt); - SrsRtpPacket2* pkt = helper->pkt; pkt->header.set_payload_type(kVideoPayloadType); pkt->header.set_ssrc(video_ssrc); pkt->frame_type = SrsFrameTypeVideo; pkt->header.set_sequence(video_sequence++); pkt->header.set_timestamp(msg->timestamp * 90); - SrsRtpRawPayload* raw = _srs_rtp_raw_cache->allocate(); + SrsRtpRawPayload* raw = new SrsRtpRawPayload(); pkt->set_payload(raw, SrsRtpPacketPayloadTypeRaw); raw->payload = sample->bytes; @@ -1184,7 +1168,7 @@ srs_error_t SrsRtcFromRtmpBridger::package_single_nalu(SrsSharedPtrMessage* msg, return err; } -srs_error_t SrsRtcFromRtmpBridger::package_fu_a(SrsSharedPtrMessage* msg, SrsSample* sample, int fu_payload_size, vector& helpers) +srs_error_t SrsRtcFromRtmpBridger::package_fu_a(SrsSharedPtrMessage* msg, SrsSample* sample, int fu_payload_size, vector& pkts) { srs_error_t err = srs_success; @@ -1197,17 +1181,16 @@ srs_error_t SrsRtcFromRtmpBridger::package_fu_a(SrsSharedPtrMessage* msg, SrsSam for (int i = 0; i < num_of_packet; ++i) { int packet_size = srs_min(nb_left, fu_payload_size); - SrsRtpPacketCacheHelper* helper = new SrsRtpPacketCacheHelper(); - helpers.push_back(helper); + SrsRtpPacket2* pkt = new SrsRtpPacket2(); + pkts.push_back(pkt); - SrsRtpPacket2* pkt = helper->pkt; pkt->header.set_payload_type(kVideoPayloadType); pkt->header.set_ssrc(video_ssrc); pkt->frame_type = SrsFrameTypeVideo; pkt->header.set_sequence(video_sequence++); pkt->header.set_timestamp(msg->timestamp * 90); - SrsRtpFUAPayload2* fua = _srs_rtp_fua_cache->allocate(); + SrsRtpFUAPayload2* fua = new SrsRtpFUAPayload2(); pkt->set_payload(fua, SrsRtpPacketPayloadTypeFUA2); fua->nri = (SrsAvcNaluType)header; @@ -1227,22 +1210,22 @@ srs_error_t SrsRtcFromRtmpBridger::package_fu_a(SrsSharedPtrMessage* msg, SrsSam return err; } -srs_error_t SrsRtcFromRtmpBridger::consume_packets(vector& helpers) +srs_error_t SrsRtcFromRtmpBridger::consume_packets(vector& pkts) { srs_error_t err = srs_success; // TODO: FIXME: Consume a range of packets. - for (int i = 0; i < (int)helpers.size(); i++) { - SrsRtpPacketCacheHelper* helper = helpers[i]; - if ((err = source_->on_rtp(helper->pkt)) != srs_success) { + for (int i = 0; i < (int)pkts.size(); i++) { + SrsRtpPacket2* pkt = pkts[i]; + if ((err = source_->on_rtp(pkt)) != srs_success) { err = srs_error_wrap(err, "consume sps/pps"); break; } } - for (int i = 0; i < (int)helpers.size(); i++) { - SrsRtpPacketCacheHelper* helper = helpers[i]; - srs_freep(helper); + for (int i = 0; i < (int)pkts.size(); i++) { + SrsRtpPacket2* pkt = pkts[i]; + srs_freep(pkt); } return err; @@ -2341,7 +2324,7 @@ void SrsRtcAudioRecvTrack::on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffe return; } - *ppayload = _srs_rtp_raw_cache->allocate(); + *ppayload = new SrsRtpRawPayload(); *ppt = SrsRtpPacketPayloadTypeRaw; } @@ -2393,10 +2376,10 @@ void SrsRtcVideoRecvTrack::on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffe *ppayload = new SrsRtpSTAPPayload(); *ppt = SrsRtpPacketPayloadTypeSTAP; } else if (v == kFuA) { - *ppayload = _srs_rtp_fua_cache->allocate(); + *ppayload = new SrsRtpFUAPayload2(); *ppt = SrsRtpPacketPayloadTypeFUA2; } else { - *ppayload = _srs_rtp_raw_cache->allocate(); + *ppayload = new SrsRtpRawPayload(); *ppt = SrsRtpPacketPayloadTypeRaw; } } diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index 1c53d2140..7aab6896e 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -47,7 +47,6 @@ class SrsRtcStream; class SrsRtcFromRtmpBridger; class SrsAudioTranscoder; class SrsRtpPacket2; -class SrsRtpPacketCacheHelper; class SrsSample; class SrsRtcStreamDescription; class SrsRtcTrackDescription; @@ -259,16 +258,6 @@ private: srs_error_t on_timer(srs_utime_t interval); }; -// A helper class, to release the packet to cache. -class SrsRtpPacketCacheHelper -{ -public: - SrsRtpPacket2* pkt; -public: - SrsRtpPacketCacheHelper(); - virtual ~SrsRtpPacketCacheHelper(); -}; - #ifdef SRS_FFMPEG_FIT class SrsRtcFromRtmpBridger : public ISrsSourceBridger { @@ -298,16 +287,16 @@ public: virtual srs_error_t on_audio(SrsSharedPtrMessage* msg); private: srs_error_t transcode(SrsAudioFrame* audio); - srs_error_t package_opus(SrsAudioFrame* audio, SrsRtpPacketCacheHelper* helper); + srs_error_t package_opus(SrsAudioFrame* audio, SrsRtpPacket2* pkt); public: virtual srs_error_t on_video(SrsSharedPtrMessage* msg); private: srs_error_t filter(SrsSharedPtrMessage* msg, SrsFormat* format, bool& has_idr, std::vector& samples); - srs_error_t package_stap_a(SrsRtcStream* source, SrsSharedPtrMessage* msg, SrsRtpPacketCacheHelper* helper); - srs_error_t package_nalus(SrsSharedPtrMessage* msg, const std::vector& samples, std::vector& helpers); - srs_error_t package_single_nalu(SrsSharedPtrMessage* msg, SrsSample* sample, std::vector& helpers); - srs_error_t package_fu_a(SrsSharedPtrMessage* msg, SrsSample* sample, int fu_payload_size, std::vector& helpers); - srs_error_t consume_packets(std::vector& helpers); + srs_error_t package_stap_a(SrsRtcStream* source, SrsSharedPtrMessage* msg, SrsRtpPacket2* pkt); + srs_error_t package_nalus(SrsSharedPtrMessage* msg, const std::vector& samples, std::vector& pkts); + srs_error_t package_single_nalu(SrsSharedPtrMessage* msg, SrsSample* sample, std::vector& pkts); + srs_error_t package_fu_a(SrsSharedPtrMessage* msg, SrsSample* sample, int fu_payload_size, std::vector& pkts); + srs_error_t consume_packets(std::vector& pkts); }; class SrsRtmpFromRtcBridger : public ISrsRtcSourceBridger diff --git a/trunk/src/app/srs_app_threads.cpp b/trunk/src/app/srs_app_threads.cpp index cc17e9cd3..a7dff9b82 100644 --- a/trunk/src/app/srs_app_threads.cpp +++ b/trunk/src/app/srs_app_threads.cpp @@ -46,13 +46,6 @@ extern SrsStageManager* _srs_stages; extern SrsRtcBlackhole* _srs_blackhole; extern SrsResourceManager* _srs_rtc_manager; -extern SrsRtpObjectCacheManager* _srs_rtp_cache; -extern SrsRtpObjectCacheManager* _srs_rtp_raw_cache; -extern SrsRtpObjectCacheManager* _srs_rtp_fua_cache; - -extern SrsRtpObjectCacheManager* _srs_rtp_msg_cache_buffers; -extern SrsRtpObjectCacheManager* _srs_rtp_msg_cache_objs; - extern SrsResourceManager* _srs_rtc_manager; extern SrsDtlsCertificate* _srs_rtc_dtls_certificate; @@ -166,7 +159,6 @@ extern SrsPps* _srs_pps_objs_rraw; extern SrsPps* _srs_pps_objs_rfua; extern SrsPps* _srs_pps_objs_rbuf; extern SrsPps* _srs_pps_objs_rothers; -extern SrsPps* _srs_pps_objs_drop; SrsCircuitBreaker::SrsCircuitBreaker() { @@ -306,13 +298,6 @@ srs_error_t srs_thread_initialize() _srs_rtc_manager = new SrsResourceManager("RTC", true); _srs_circuit_breaker = new SrsCircuitBreaker(); - _srs_rtp_cache = new SrsRtpObjectCacheManager(sizeof(SrsRtpPacket2)); - _srs_rtp_raw_cache = new SrsRtpObjectCacheManager(sizeof(SrsRtpRawPayload)); - _srs_rtp_fua_cache = new SrsRtpObjectCacheManager(sizeof(SrsRtpFUAPayload2)); - - _srs_rtp_msg_cache_buffers = new SrsRtpObjectCacheManager(sizeof(SrsSharedPtrMessage) + kRtpPacketSize); - _srs_rtp_msg_cache_objs = new SrsRtpObjectCacheManager(sizeof(SrsSharedPtrMessage)); - _srs_rtc_manager = new SrsResourceManager("RTC", true); _srs_rtc_dtls_certificate = new SrsDtlsCertificate(); @@ -416,7 +401,6 @@ srs_error_t srs_thread_initialize() _srs_pps_objs_rfua = new SrsPps(); _srs_pps_objs_rbuf = new SrsPps(); _srs_pps_objs_rothers = new SrsPps(); - _srs_pps_objs_drop = new SrsPps(); return err; } diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index e8ac1ef24..be8eb9c81 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -26,6 +26,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 109 +#define VERSION_REVISION 110 #endif diff --git a/trunk/src/kernel/srs_kernel_flv.cpp b/trunk/src/kernel/srs_kernel_flv.cpp index 0a34c0034..a18313994 100644 --- a/trunk/src/kernel/srs_kernel_flv.cpp +++ b/trunk/src/kernel/srs_kernel_flv.cpp @@ -229,19 +229,6 @@ SrsSharedPtrMessage::~SrsSharedPtrMessage() } } -bool SrsSharedPtrMessage::recycle() -{ - // When recycle, unwrap if not the last reference. - if (ptr && ptr->shared_count > 0) { - ptr->shared_count--; - ptr = NULL; - payload = NULL; - size = 0; - } - - return true; -} - srs_error_t SrsSharedPtrMessage::create(SrsCommonMessage* msg) { srs_error_t err = srs_success; @@ -369,7 +356,7 @@ SrsSharedPtrMessage* SrsSharedPtrMessage::copy() SrsSharedPtrMessage* SrsSharedPtrMessage::copy2() { - SrsSharedPtrMessage* copy = _srs_rtp_msg_cache_objs->allocate(); + SrsSharedPtrMessage* copy = new SrsSharedPtrMessage(); // We got an object from cache, the ptr might exists, so unwrap it. //srs_assert(!copy->ptr); diff --git a/trunk/src/kernel/srs_kernel_flv.hpp b/trunk/src/kernel/srs_kernel_flv.hpp index 4fb9400e4..55b3dfd30 100644 --- a/trunk/src/kernel/srs_kernel_flv.hpp +++ b/trunk/src/kernel/srs_kernel_flv.hpp @@ -312,8 +312,6 @@ public: SrsSharedPtrMessage(); virtual ~SrsSharedPtrMessage(); public: - // For object cache to reset and reuse it. - bool recycle(); // Create shared ptr message, // copy header, manage the payload of msg, // set the payload to NULL to prevent double free. diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index bbe2c6f2c..88cacc5af 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -41,7 +41,6 @@ SrsPps* _srs_pps_objs_rraw = NULL; SrsPps* _srs_pps_objs_rfua = NULL; SrsPps* _srs_pps_objs_rbuf = NULL; SrsPps* _srs_pps_objs_rothers = NULL; -SrsPps* _srs_pps_objs_drop = NULL; /* @see https://tools.ietf.org/html/rfc1889#section-5.1 0 1 2 3 @@ -786,89 +785,8 @@ SrsRtpPacket2::SrsRtpPacket2() SrsRtpPacket2::~SrsRtpPacket2() { - recycle_payload(); - recycle_shared_buffer(); -} - -void SrsRtpPacket2::reset() -{ - nalu_type = SrsAvcNaluTypeReserved; - frame_type = SrsFrameTypeReserved; - cached_payload_size = 0; - decode_handler = NULL; - - // It's important to reset the header. - header = SrsRtpHeader(); - - // Recyle the payload again, to ensure the packet is new one. - recycle_payload(); - recycle_shared_buffer(); -} - -void SrsRtpPacket2::recycle_payload() -{ - if (!payload_) { - return; - } - - if (payload_type_ == SrsRtpPacketPayloadTypeRaw && _srs_rtp_raw_cache->enabled()) { - _srs_rtp_raw_cache->recycle((SrsRtpRawPayload*)payload_); - goto cleanup; - } - - if (payload_type_ == SrsRtpPacketPayloadTypeFUA2 && _srs_rtp_fua_cache->enabled()) { - _srs_rtp_fua_cache->recycle((SrsRtpFUAPayload2*)payload_); - goto cleanup; - } - srs_freep(payload_); - -cleanup: - payload_ = NULL; - payload_type_ = SrsRtpPacketPayloadTypeUnknown; -} - -void SrsRtpPacket2::recycle_shared_buffer() -{ - if (!shared_buffer_) { - return; - } - - // Only recycle the message for UDP packets. - if (shared_buffer_->payload && shared_buffer_->size == kRtpPacketSize) { - if (_srs_rtp_msg_cache_objs->enabled() && shared_buffer_->count() > 0) { - // Recycle the small shared message objects. - _srs_rtp_msg_cache_objs->recycle(shared_buffer_); - goto cleanup; - } - - if (_srs_rtp_msg_cache_buffers->enabled() && shared_buffer_->count() == 0) { - // Recycle the UDP large buffer. - _srs_rtp_msg_cache_buffers->recycle(shared_buffer_); - goto cleanup; - } - } - srs_freep(shared_buffer_); - -cleanup: - shared_buffer_ = NULL; - actual_buffer_size_ = 0; -} - -bool SrsRtpPacket2::recycle() -{ - // Clear the cache size, it may change when reuse it. - cached_payload_size = 0; - // Reset the handler, for decode only. - decode_handler = NULL; - - // We only recycle the payload and shared messages, - // for header and fields, user will reset or copy it. - recycle_payload(); - recycle_shared_buffer(); - - return true; } char* SrsRtpPacket2::wrap(int size) @@ -882,29 +800,16 @@ char* SrsRtpPacket2::wrap(int size) } // Create a large enough message, with under-layer buffer. - while (true) { - srs_freep(shared_buffer_); - shared_buffer_ = _srs_rtp_msg_cache_buffers->allocate(); + srs_freep(shared_buffer_); + shared_buffer_ = new SrsSharedPtrMessage(); - // If got a cached message(which has payload), but it's too small, - // we free it and allocate a larger one. - if (shared_buffer_->payload && shared_buffer_->size < size) { - ++_srs_pps_objs_rothers->sugar; - continue; - } + // Create under-layer buffer for new message + // For RTC, we use larger under-layer buffer for each packet. + int nb_buffer = srs_max(size, kRtpPacketSize); + char* buf = new char[nb_buffer]; + shared_buffer_->wrap(buf, nb_buffer); - // Create under-layer buffer for new message - if (!shared_buffer_->payload) { - // For RTC, we use larger under-layer buffer for each packet. - int nb_buffer = srs_max(size, kRtpPacketSize); - char* buf = new char[nb_buffer]; - shared_buffer_->wrap(buf, nb_buffer); - - ++_srs_pps_objs_rbuf->sugar; - } - - break; - } + ++_srs_pps_objs_rbuf->sugar; return shared_buffer_->payload; } @@ -933,7 +838,7 @@ char* SrsRtpPacket2::wrap(SrsSharedPtrMessage* msg) SrsRtpPacket2* SrsRtpPacket2::copy() { - SrsRtpPacket2* cp = _srs_rtp_cache->allocate(); + SrsRtpPacket2* cp = new SrsRtpPacket2(); // We got packet from cache, the payload and message MUST be NULL, // because we had clear it in recycle. @@ -1043,7 +948,7 @@ srs_error_t SrsRtpPacket2::decode(SrsBuffer* buf) // By default, we always use the RAW payload. if (!payload_) { - payload_ = _srs_rtp_raw_cache->allocate(); + payload_ = new SrsRtpRawPayload(); payload_type_ = SrsRtpPacketPayloadTypeRaw; } @@ -1081,13 +986,6 @@ bool SrsRtpPacket2::is_keyframe() return false; } -SrsRtpObjectCacheManager* _srs_rtp_cache = NULL; -SrsRtpObjectCacheManager* _srs_rtp_raw_cache = NULL; -SrsRtpObjectCacheManager* _srs_rtp_fua_cache = NULL; - -SrsRtpObjectCacheManager* _srs_rtp_msg_cache_buffers = NULL; -SrsRtpObjectCacheManager* _srs_rtp_msg_cache_objs = NULL; - SrsRtpRawPayload::SrsRtpRawPayload() { payload = NULL; @@ -1100,12 +998,6 @@ SrsRtpRawPayload::~SrsRtpRawPayload() { } -bool SrsRtpRawPayload::recycle() -{ - payload=NULL; nn_payload=0; - return true; -} - uint64_t SrsRtpRawPayload::nb_bytes() { return nn_payload; @@ -1140,7 +1032,7 @@ srs_error_t SrsRtpRawPayload::decode(SrsBuffer* buf) ISrsRtpPayloader* SrsRtpRawPayload::copy() { - SrsRtpRawPayload* cp = _srs_rtp_raw_cache->allocate(); + SrsRtpRawPayload* cp = new SrsRtpRawPayload(); cp->payload = payload; cp->nn_payload = nn_payload; @@ -1566,16 +1458,6 @@ SrsRtpFUAPayload2::~SrsRtpFUAPayload2() { } -bool SrsRtpFUAPayload2::recycle() -{ - start = end = false; - nri = nalu_type = (SrsAvcNaluType)0; - - payload = NULL; - size = 0; - return true; -} - uint64_t SrsRtpFUAPayload2::nb_bytes() { return 2 + size; @@ -1643,7 +1525,7 @@ srs_error_t SrsRtpFUAPayload2::decode(SrsBuffer* buf) ISrsRtpPayloader* SrsRtpFUAPayload2::copy() { - SrsRtpFUAPayload2* cp = _srs_rtp_fua_cache->allocate(); + SrsRtpFUAPayload2* cp = new SrsRtpFUAPayload2(); cp->nri = nri; cp->start = start; diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp index b00135e85..99589d723 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp @@ -315,15 +315,6 @@ public: SrsRtpPacket2(); virtual ~SrsRtpPacket2(); public: - // User MUST reset the packet if got from cache, - // except copy(we will assign the header and copy payload). - void reset(); -private: - void recycle_payload(); - void recycle_shared_buffer(); -public: - // Recycle the object to reuse it. - virtual bool recycle(); // Wrap buffer to shared_message, which is managed by us. char* wrap(int size); char* wrap(char* data, int size); @@ -357,112 +348,6 @@ public: bool is_keyframe(); }; -// For object cache manager to stat the object dropped. -#include -extern SrsPps* _srs_pps_objs_drop; - -// The RTP packet or message cache manager. -template -class SrsRtpObjectCacheManager -{ -private: - bool enabled_; - std::vector cache_objs_; - size_t capacity_; - size_t object_size_; -public: - // SrsRtpObjectCacheManager::SrsRtpObjectCacheManager - SrsRtpObjectCacheManager(size_t size_of_object) { - enabled_ = false; - capacity_ = 0; - object_size_ = size_of_object; - } - // SrsRtpObjectCacheManager::~SrsRtpObjectCacheManager - virtual ~SrsRtpObjectCacheManager() { - typedef typename std::vector::iterator iterator; - for (iterator it = cache_objs_.begin(); it != cache_objs_.end(); ++it) { - T* obj = *it; - srs_freep(obj); - } - } -public: - // Setup the object cache, shrink if capacity changed. - // SrsRtpObjectCacheManager::setup - void setup(bool v, uint64_t memory) { - enabled_ = v; - capacity_ = (size_t)(memory / object_size_); - - - if (!enabled_) { - capacity_ = 0; - } - - // Shrink the cache. - while (cache_objs_.size() > capacity_) { - T* obj = cache_objs_.back(); - cache_objs_.pop_back(); - srs_freep(obj); - } - } - // Get the status of object cache. - // SrsRtpObjectCacheManager::enabled - inline bool enabled() { - return enabled_; - } - // SrsRtpObjectCacheManager::size - int size() { - return (int)cache_objs_.size(); - } - // SrsRtpObjectCacheManager::capacity - int capacity() { - return (int)capacity_; - } - // Try to allocate from cache, create new object if no cache. - // SrsRtpObjectCacheManager::allocate - T* allocate() { - if (!enabled_ || cache_objs_.empty()) { - return new T(); - } - - T* obj = cache_objs_.back(); - cache_objs_.pop_back(); - - return obj; - } - // Recycle the object to cache. - // @remark User can directly free the packet. - // SrsRtpObjectCacheManager::recycle - void recycle(T* p) { - // The p may be NULL, because srs_freep(NULL) is ok. - if (!p) { - return; - } - - // If disabled, drop the object. - if (!enabled_) { - srs_freep(p); - return; - } - - // If recycle the object fail, drop the cached object. - if (!p->recycle()) { - srs_freep(p); - return; - } - - // If exceed the capacity, drop the object. - if (cache_objs_.size() > capacity_) { - ++_srs_pps_objs_drop->sugar; - - srs_freep(p); - return; - } - - // Recycle it. - cache_objs_.push_back(p); - } -}; - // Single payload data. class SrsRtpRawPayload : public ISrsRtpPayloader { @@ -474,8 +359,6 @@ public: public: SrsRtpRawPayload(); virtual ~SrsRtpRawPayload(); -public: - bool recycle(); // interface ISrsRtpPayloader public: virtual uint64_t nb_bytes(); @@ -574,8 +457,6 @@ public: public: SrsRtpFUAPayload2(); virtual ~SrsRtpFUAPayload2(); -public: - bool recycle(); // interface ISrsRtpPayloader public: virtual uint64_t nb_bytes(); @@ -584,15 +465,4 @@ public: virtual ISrsRtpPayloader* copy(); }; -// For RTP packets cache. -extern SrsRtpObjectCacheManager* _srs_rtp_cache; -extern SrsRtpObjectCacheManager* _srs_rtp_raw_cache; -extern SrsRtpObjectCacheManager* _srs_rtp_fua_cache; - -// For shared message cache, with payload. -extern SrsRtpObjectCacheManager* _srs_rtp_msg_cache_buffers; -// For shared message cache, without payload. -// Note that user must unwrap the shared message, before recycle it. -extern SrsRtpObjectCacheManager* _srs_rtp_msg_cache_objs; - #endif