From a2a6ca8258560ff19346533cba4c83a0bcb9c7cb Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 4 Feb 2020 16:13:48 +0800 Subject: [PATCH] For #939, always enable fast FLV streaming. --- README.md | 2 ++ trunk/src/app/srs_app_http_stream.cpp | 17 ++--------------- trunk/src/app/srs_app_http_stream.hpp | 2 -- trunk/src/core/srs_core_performance.hpp | 7 ------- trunk/src/kernel/srs_kernel_flv.cpp | 16 +++++++--------- trunk/src/kernel/srs_kernel_flv.hpp | 4 +--- trunk/src/utest/srs_utest_kernel.cpp | 4 ---- 7 files changed, 12 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index aed7847b4..9d71e4071 100755 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-02-04, For [#939][bug #939], always enable fast FLV streaming. * v3.0, 2020-02-02, [3.0 beta0(3.0.112)][r3.0b0] released. 121709 lines. * v3.0, 2020-01-29, Support isolate version file. 3.0.112 * v3.0, 2020-01-29, Fix [#1206][bug #1206], dispose ingester while server quiting. 3.0.111 @@ -1637,6 +1638,7 @@ Winlin [bug #1303]: https://github.com/ossrs/srs/issues/1303 [bug #1230]: https://github.com/ossrs/srs/issues/1230 [bug #1206]: https://github.com/ossrs/srs/issues/1206 +[bug #939]: https://github.com/ossrs/srs/issues/939 [bug #xxxxxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxxxxx [exo #828]: https://github.com/google/ExoPlayer/pull/828 diff --git a/trunk/src/app/srs_app_http_stream.cpp b/trunk/src/app/srs_app_http_stream.cpp index 2a0d8e939..4bb38e5f9 100755 --- a/trunk/src/app/srs_app_http_stream.cpp +++ b/trunk/src/app/srs_app_http_stream.cpp @@ -300,7 +300,6 @@ srs_error_t SrsFlvStreamEncoder::dump_cache(SrsConsumer* /*consumer*/, SrsRtmpJi return srs_success; } -#ifdef SRS_PERF_FAST_FLV_ENCODER SrsFastFlvStreamEncoder::SrsFastFlvStreamEncoder() { } @@ -313,7 +312,6 @@ srs_error_t SrsFastFlvStreamEncoder::write_tags(SrsSharedPtrMessage** msgs, int { return enc->write_tags(msgs, count); } -#endif SrsAacStreamEncoder::SrsAacStreamEncoder() { @@ -511,7 +509,6 @@ srs_error_t SrsLiveStream::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMess srs_assert(entry); if (srs_string_ends_with(entry->pattern, ".flv")) { w->header()->set_content_type("video/x-flv"); -#ifdef SRS_PERF_FAST_FLV_ENCODER bool realtime = _srs_config->get_realtime_enabled(req->vhost); if (realtime) { enc_desc = "FLV"; @@ -520,10 +517,6 @@ srs_error_t SrsLiveStream::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMess enc_desc = "FastFLV"; enc = new SrsFastFlvStreamEncoder(); } -#else - enc_desc = "FLV"; - enc = new SrsFlvStreamEncoder(); -#endif } else if (srs_string_ends_with(entry->pattern, ".aac")) { w->header()->set_content_type("audio/x-aac"); enc_desc = "AAC"; @@ -576,10 +569,8 @@ srs_error_t SrsLiveStream::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMess } } -#ifdef SRS_PERF_FAST_FLV_ENCODER SrsFastFlvStreamEncoder* ffe = dynamic_cast(enc); -#endif - + // Use receive thread to accept the close event to avoid FD leak. // @see https://github.com/ossrs/srs/issues/636#issuecomment-298208427 SrsHttpMessage* hr = dynamic_cast(r); @@ -639,16 +630,12 @@ srs_error_t SrsLiveStream::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMess } // sendout all messages. -#ifdef SRS_PERF_FAST_FLV_ENCODER if (ffe) { err = ffe->write_tags(msgs.msgs, count); } else { err = streaming_send_messages(enc, msgs.msgs, count); } -#else - err = streaming_send_messages(enc, msgs.msgs, count); -#endif - + // free the messages. for (int i = 0; i < count; i++) { SrsSharedPtrMessage* msg = msgs.msgs[i]; diff --git a/trunk/src/app/srs_app_http_stream.hpp b/trunk/src/app/srs_app_http_stream.hpp index cc1d23ed1..18f7a1b6c 100755 --- a/trunk/src/app/srs_app_http_stream.hpp +++ b/trunk/src/app/srs_app_http_stream.hpp @@ -97,7 +97,6 @@ public: virtual srs_error_t dump_cache(SrsConsumer* consumer, SrsRtmpJitterAlgorithm jitter); }; -#ifdef SRS_PERF_FAST_FLV_ENCODER // A Fast HTTP FLV Live Streaming, to write multiple tags by writev. // @see https://github.com/ossrs/srs/issues/405 class SrsFastFlvStreamEncoder : public SrsFlvStreamEncoder @@ -109,7 +108,6 @@ public: // Write the tags in a time. virtual srs_error_t write_tags(SrsSharedPtrMessage** msgs, int count); }; -#endif // Transmux RTMP to HTTP TS Streaming. class SrsTsStreamEncoder : public ISrsBufferEncoder diff --git a/trunk/src/core/srs_core_performance.hpp b/trunk/src/core/srs_core_performance.hpp index 28eac85a9..bd962bbd4 100644 --- a/trunk/src/core/srs_core_performance.hpp +++ b/trunk/src/core/srs_core_performance.hpp @@ -177,13 +177,6 @@ #undef SRS_PERF_SO_SNDBUF_SIZE #endif -/** - * define the following macro to enable the fast flv encoder. - * @see https://github.com/ossrs/srs/issues/405 - */ -#undef SRS_PERF_FAST_FLV_ENCODER -#define SRS_PERF_FAST_FLV_ENCODER - /** * whether ensure glibc memory check. */ diff --git a/trunk/src/kernel/srs_kernel_flv.cpp b/trunk/src/kernel/srs_kernel_flv.cpp index 63238b4c6..0259def06 100644 --- a/trunk/src/kernel/srs_kernel_flv.cpp +++ b/trunk/src/kernel/srs_kernel_flv.cpp @@ -353,23 +353,19 @@ SrsFlvTransmuxer::SrsFlvTransmuxer() { writer = NULL; -#ifdef SRS_PERF_FAST_FLV_ENCODER nb_tag_headers = 0; tag_headers = NULL; nb_iovss_cache = 0; iovss_cache = NULL; nb_ppts = 0; ppts = NULL; -#endif } SrsFlvTransmuxer::~SrsFlvTransmuxer() { -#ifdef SRS_PERF_FAST_FLV_ENCODER srs_freepa(tag_headers); srs_freepa(iovss_cache); srs_freepa(ppts); -#endif } srs_error_t SrsFlvTransmuxer::initialize(ISrsWriter* fw) @@ -379,15 +375,19 @@ srs_error_t SrsFlvTransmuxer::initialize(ISrsWriter* fw) return srs_success; } -srs_error_t SrsFlvTransmuxer::write_header() +srs_error_t SrsFlvTransmuxer::write_header(bool has_video, bool has_audio) { srs_error_t err = srs_success; - + + uint8_t av_flag = 0; + av_flag += (has_audio? 4:0); + av_flag += (has_video? 1:0); + // 9bytes header and 4bytes first previous-tag-size char flv_header[] = { 'F', 'L', 'V', // Signatures "FLV" (char)0x01, // File version (for example, 0x01 for FLV version 1) - (char)0x05, // 4, audio; 1, video; 5 audio+video. + (char)av_flag, // 4, audio; 1, video; 5 audio+video. (char)0x00, (char)0x00, (char)0x00, (char)0x09 // DataOffset UI32 The length of this header in bytes }; @@ -472,7 +472,6 @@ int SrsFlvTransmuxer::size_tag(int data_size) return SRS_FLV_TAG_HEADER_SIZE + data_size + SRS_FLV_PREVIOUS_TAG_SIZE; } -#ifdef SRS_PERF_FAST_FLV_ENCODER srs_error_t SrsFlvTransmuxer::write_tags(SrsSharedPtrMessage** msgs, int count) { srs_error_t err = srs_success; @@ -542,7 +541,6 @@ srs_error_t SrsFlvTransmuxer::write_tags(SrsSharedPtrMessage** msgs, int count) return err; } -#endif void SrsFlvTransmuxer::cache_metadata(char type, char* data, int size, char* cache) { diff --git a/trunk/src/kernel/srs_kernel_flv.hpp b/trunk/src/kernel/srs_kernel_flv.hpp index 0c77a6664..ebc587f39 100644 --- a/trunk/src/kernel/srs_kernel_flv.hpp +++ b/trunk/src/kernel/srs_kernel_flv.hpp @@ -362,7 +362,7 @@ public: // 1. E.2 The FLV header // 2. PreviousTagSize0 UI32 Always 0 // that is, 9+4=13bytes. - virtual srs_error_t write_header(); + virtual srs_error_t write_header(bool has_video = true, bool has_audio = true); virtual srs_error_t write_header(char flv_header[9]); // Write flv metadata. // @param type, the type of data, or other message type. @@ -381,7 +381,6 @@ public: // including the tag header, body, and 4bytes previous tag size. // @remark assert data_size is not negative. static int size_tag(int data_size); -#ifdef SRS_PERF_FAST_FLV_ENCODER private: // The cache tag header. int nb_tag_headers; @@ -395,7 +394,6 @@ private: public: // Write the tags in a time. virtual srs_error_t write_tags(SrsSharedPtrMessage** msgs, int count); -#endif private: virtual void cache_metadata(char type, char* data, int size, char* cache); virtual void cache_audio(int64_t timestamp, char* data, int size, char* cache); diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index 5a113da84..f0270f9b6 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -912,7 +912,6 @@ VOID TEST(KernelFLVTest, CoverWriterErrorCase) HELPER_EXPECT_FAILED(m.write_video(0, NULL, 0)); } -#ifdef SRS_PERF_FAST_FLV_ENCODER if (true) { MockSrsFileWriter w; HELPER_EXPECT_SUCCESS(w.open("")); @@ -963,7 +962,6 @@ VOID TEST(KernelFLVTest, CoverWriterErrorCase) SrsSharedPtrMessage* msgs = &msg; HELPER_EXPECT_FAILED(m.write_tags(&msgs, 1)); } -#endif } VOID TEST(KernelFLVTest, CoverReaderErrorCase) @@ -4028,7 +4026,6 @@ VOID TEST(KernelFLVTest, CoverAll) EXPECT_TRUE(s.is_video()); } -#ifdef SRS_PERF_FAST_FLV_ENCODER if (true) { MockSrsFileWriter f; SrsFlvTransmuxer mux; @@ -4045,7 +4042,6 @@ VOID TEST(KernelFLVTest, CoverAll) EXPECT_EQ(16, f.tellg()); } -#endif } VOID TEST(KernelFLVTest, CoverSharedPtrMessage)