diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index c65f73e55..3b34ef160 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -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& 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& 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(); } } } diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index a10492217..7235ec691 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -154,8 +154,6 @@ class SrsRtcOutgoingPackets { public: bool use_gso; - // TODO: FIXME: Remove it. - bool should_merge_nalus; public: #if defined(SRS_DEBUG) // Debug id. @@ -187,22 +185,9 @@ public: int nn_paddings; // The number of dropped messages. int nn_dropped; -private: - // TODO: FIXME: Remove the cache. - int cursor; - int nn_cache; - SrsRtpPacket2* cache; public: - // TODO: FIXME: Remove the cache. - SrsRtcOutgoingPackets(int nn_cache_max = 8); + SrsRtcOutgoingPackets(); virtual ~SrsRtcOutgoingPackets(); -public: - void reset(bool gso, bool merge_nalus); - SrsRtpPacket2* fetch(); - SrsRtpPacket2* back(); - int size(); - int capacity(); - SrsRtpPacket2* at(int index); }; class SrsRtcPlayer : virtual public ISrsCoroutineHandler, virtual public ISrsReloadHandler diff --git a/trunk/src/app/srs_app_rtc_queue.cpp b/trunk/src/app/srs_app_rtc_queue.cpp index 65da0f5ff..134de8ae7 100644 --- a/trunk/src/app/srs_app_rtc_queue.cpp +++ b/trunk/src/app/srs_app_rtc_queue.cpp @@ -625,7 +625,9 @@ void SrsRtpVideoQueue::covert_frame(std::vector& frame, SrsR SrsRtpFUAPayload2* head_payload = dynamic_cast(head->payload); pkt->nalu_type = head_payload->nalu_type; - SrsRtpRawPayload* payload = pkt->reuse_raw(); + SrsRtpRawPayload* payload = new SrsRtpRawPayload(); + pkt->payload = payload; + payload->nn_payload = nn_nalus + 1; payload->payload = new char[payload->nn_payload]; diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 98b7e7180..e37685bf5 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -699,7 +699,9 @@ srs_error_t SrsRtcFromRtmpBridger::package_opus(char* data, int size, SrsRtpPack pkt->frame_type = SrsFrameTypeAudio; pkt->rtp_header.set_marker(true); - SrsRtpRawPayload* raw = pkt->reuse_raw(); + SrsRtpRawPayload* raw = new SrsRtpRawPayload(); + pkt->payload = raw; + raw->payload = new char[size]; raw->nn_payload = size; memcpy(raw->payload, data, size); @@ -964,7 +966,9 @@ srs_error_t SrsRtcFromRtmpBridger::package_single_nalu(SrsSharedPtrMessage* msg, pkt->frame_type = SrsFrameTypeVideo; pkt->rtp_header.set_timestamp(msg->timestamp * 90); - SrsRtpRawPayload* raw = pkt->reuse_raw(); + SrsRtpRawPayload* raw = new SrsRtpRawPayload(); + pkt->payload = raw; + raw->payload = sample->bytes; raw->nn_payload = sample->size; @@ -991,7 +995,8 @@ srs_error_t SrsRtcFromRtmpBridger::package_fu_a(SrsSharedPtrMessage* msg, SrsSam pkt->frame_type = SrsFrameTypeVideo; pkt->rtp_header.set_timestamp(msg->timestamp * 90); - SrsRtpFUAPayload2* fua = pkt->reuse_fua(); + SrsRtpFUAPayload2* fua = new SrsRtpFUAPayload2(); + pkt->payload = fua; fua->nri = (SrsAvcNaluType)header; fua->nalu_type = (SrsAvcNaluType)nal_type; diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index 18f7df3e6..0f880bb30 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -290,23 +290,12 @@ SrsRtpPacket2::SrsRtpPacket2() nalu_type = SrsAvcNaluTypeReserved; shared_msg = NULL; frame_type = SrsFrameTypeReserved; - - cache_raw = new SrsRtpRawPayload(); - cache_fua = new SrsRtpFUAPayload2(); - cache_payload = 0; + cached_payload_size = 0; } SrsRtpPacket2::~SrsRtpPacket2() { - // We may use the cache as payload. - if (payload == cache_raw || payload == cache_fua) { - payload = NULL; - } - srs_freep(payload); - srs_freep(cache_raw); - srs_freep(cache_fua); - srs_freep(shared_msg); } @@ -314,8 +303,8 @@ void SrsRtpPacket2::set_padding(int size) { rtp_header.set_padding(size > 0); rtp_header.set_padding_length(size); - if (cache_payload) { - cache_payload += size - padding; + if (cached_payload_size) { + cached_payload_size += size - padding; } padding = size; } @@ -324,37 +313,12 @@ void SrsRtpPacket2::add_padding(int size) { rtp_header.set_padding(padding + size > 0); rtp_header.set_padding_length(rtp_header.get_padding_length() + size); - if (cache_payload) { - cache_payload += size; + if (cached_payload_size) { + cached_payload_size += size; } padding += size; } -void SrsRtpPacket2::reset() -{ - rtp_header.reset(); - padding = 0; - cache_payload = 0; - - // We may use the cache as payload. - if (payload == cache_raw || payload == cache_fua) { - payload = NULL; - } - srs_freep(payload); -} - -SrsRtpRawPayload* SrsRtpPacket2::reuse_raw() -{ - payload = cache_raw; - return cache_raw; -} - -SrsRtpFUAPayload2* SrsRtpPacket2::reuse_fua() -{ - payload = cache_fua; - return cache_fua; -} - void SrsRtpPacket2::set_decode_handler(ISrsRtpPacketDecodeHandler* h) { decode_handler = h; @@ -377,7 +341,7 @@ SrsRtpPacket2* SrsRtpPacket2::copy() cp->shared_msg = shared_msg? shared_msg->copy():NULL; cp->frame_type = frame_type; - cp->cache_payload = cache_payload; + cp->cached_payload_size = cached_payload_size; cp->decode_handler = decode_handler; return cp; @@ -385,10 +349,10 @@ SrsRtpPacket2* SrsRtpPacket2::copy() int SrsRtpPacket2::nb_bytes() { - if (!cache_payload) { - cache_payload = rtp_header.nb_bytes() + (payload? payload->nb_bytes():0) + padding; + if (!cached_payload_size) { + cached_payload_size = rtp_header.nb_bytes() + (payload? payload->nb_bytes():0) + padding; } - return cache_payload; + return cached_payload_size; } srs_error_t SrsRtpPacket2::encode(SrsBuffer* buf) @@ -441,7 +405,7 @@ srs_error_t SrsRtpPacket2::decode(SrsBuffer* buf) // By default, we always use the RAW payload. if (!payload) { - payload = reuse_raw(); + payload = new SrsRtpRawPayload(); } if ((err = payload->decode(buf)) != srs_success) { diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp index d171f0091..a84cee11d 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp @@ -135,10 +135,8 @@ public: SrsFrameType frame_type; // Fast cache for performance. private: - // Cache frequently used payload for performance. - SrsRtpRawPayload* cache_raw; - SrsRtpFUAPayload2* cache_fua; - int cache_payload; + // The cached payload size for packet. + int cached_payload_size; // The helper handler for decoder, use RAW payload if NULL. ISrsRtpPacketDecodeHandler* decode_handler; public: @@ -149,12 +147,6 @@ public: void set_padding(int size); // Increase the padding of RTP packet. void add_padding(int size); - // Reset RTP packet. - void reset(); - // Reuse the cached raw message as payload. - SrsRtpRawPayload* reuse_raw(); - // Reuse the cached fua message as payload. - SrsRtpFUAPayload2* reuse_fua(); // Set the decode handler. void set_decode_handler(ISrsRtpPacketDecodeHandler* h); // Whether the packet is Audio packet.