From 560e7c3c2f9eeddeb5c3bbea33345f534c9e40d7 Mon Sep 17 00:00:00 2001 From: Winlin Date: Wed, 15 Sep 2021 21:44:13 +0800 Subject: [PATCH 1/3] Fix #2613, Try libopus and opus for ARM (#2614) * Fix #2613, Try libopus and opus for ARM * Refine code --- trunk/src/app/srs_app_rtc_codec.cpp | 45 +++++++++++++++++++---------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/trunk/src/app/srs_app_rtc_codec.cpp b/trunk/src/app/srs_app_rtc_codec.cpp index 3b62c8ff2..a8219a539 100644 --- a/trunk/src/app/srs_app_rtc_codec.cpp +++ b/trunk/src/app/srs_app_rtc_codec.cpp @@ -10,16 +10,32 @@ #include #include -static const char* id2codec_name(SrsAudioCodecId id) +static const AVCodec* srs_find_decoder_by_id(SrsAudioCodecId id) { - switch (id) { - case SrsAudioCodecIdAAC: - return "aac"; - case SrsAudioCodecIdOpus: - return "libopus"; - default: - return ""; + if (id == SrsAudioCodecIdAAC) { + return avcodec_find_decoder_by_name("aac"); + } else if (id == SrsAudioCodecIdOpus) { + const AVCodec* codec = avcodec_find_decoder_by_name("libopus"); + if (!codec) { + codec = avcodec_find_decoder_by_name("opus"); + } + return codec; } + return NULL; +} + +static const AVCodec* srs_find_encoder_by_id(SrsAudioCodecId id) +{ + if (id == SrsAudioCodecIdAAC) { + return avcodec_find_encoder_by_name("aac"); + } else if (id == SrsAudioCodecIdOpus) { + const AVCodec* codec = avcodec_find_encoder_by_name("libopus"); + if (!codec) { + codec = avcodec_find_encoder_by_name("opus"); + } + return codec; + } + return NULL; } class SrsFFmpegLogHelper { @@ -175,10 +191,9 @@ void SrsAudioTranscoder::aac_codec_header(uint8_t **data, int *len) srs_error_t SrsAudioTranscoder::init_dec(SrsAudioCodecId src_codec) { - const char* codec_name = id2codec_name(src_codec); - const AVCodec *codec = avcodec_find_decoder_by_name(codec_name); + const AVCodec *codec = srs_find_decoder_by_id(src_codec); if (!codec) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "Codec not found by name(%d,%s)", src_codec, codec_name); + return srs_error_new(ERROR_RTC_RTP_MUXER, "Codec not found by %d", src_codec); } dec_ = avcodec_alloc_context3(codec); @@ -208,15 +223,14 @@ srs_error_t SrsAudioTranscoder::init_dec(SrsAudioCodecId src_codec) srs_error_t SrsAudioTranscoder::init_enc(SrsAudioCodecId dst_codec, int dst_channels, int dst_samplerate, int dst_bit_rate) { - const char* codec_name = id2codec_name(dst_codec); - const AVCodec *codec = avcodec_find_encoder_by_name(codec_name); + const AVCodec *codec = srs_find_encoder_by_id(dst_codec); if (!codec) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "Codec not found by name(%d,%s)", dst_codec, codec_name); + return srs_error_new(ERROR_RTC_RTP_MUXER, "Codec not found by %d", dst_codec); } enc_ = avcodec_alloc_context3(codec); if (!enc_) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "Could not allocate audio codec context(%d,%s)", dst_codec, codec_name); + return srs_error_new(ERROR_RTC_RTP_MUXER, "Could not allocate audio codec context %d", dst_codec); } enc_->sample_rate = dst_samplerate; @@ -228,6 +242,7 @@ srs_error_t SrsAudioTranscoder::init_enc(SrsAudioCodecId dst_codec, int dst_chan if (dst_codec == SrsAudioCodecIdOpus) { //TODO: for more level setting enc_->compression_level = 1; + enc_->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; } else if (dst_codec == SrsAudioCodecIdAAC) { enc_->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; } From 5828d64a3dd0b41560dcb6d7eb96350c14ce0b22 Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 15 Sep 2021 21:46:55 +0800 Subject: [PATCH 2/3] For #2613, #2614, #2454, v4.0.162 --- trunk/src/core/srs_core_version4.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index 4310a7f36..84e390bbb 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 161 +#define VERSION_REVISION 162 #endif From 4456a275b68813baa161d874dcd4579fe312733e Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 17 Sep 2021 14:20:35 +0800 Subject: [PATCH 3/3] PushFLV: Fix bug, add stat --- trunk/src/app/srs_app_caster_flv.cpp | 7 ++++--- trunk/src/app/srs_app_latest_version.cpp | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/trunk/src/app/srs_app_caster_flv.cpp b/trunk/src/app/srs_app_caster_flv.cpp index 0339f4541..81bd43f7a 100644 --- a/trunk/src/app/srs_app_caster_flv.cpp +++ b/trunk/src/app/srs_app_caster_flv.cpp @@ -96,8 +96,9 @@ void SrsAppCasterFlv::remove(ISrsResource* c) srs_error_t SrsAppCasterFlv::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) { SrsHttpMessage* msg = dynamic_cast(r); - SrsDynamicHttpConn* conn = dynamic_cast(msg->connection()); - srs_assert(conn); + SrsHttpConn* hconn = dynamic_cast(msg->connection()); + SrsDynamicHttpConn* dconn = dynamic_cast(hconn->handler()); + srs_assert(dconn); std::string app = srs_path_dirname(r->path()); app = srs_string_trim_start(app, "/"); @@ -116,7 +117,7 @@ srs_error_t SrsAppCasterFlv::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessa o = o.substr(0, o.length() - 4); } - srs_error_t err = conn->proxy(w, r, o); + srs_error_t err = dconn->proxy(w, r, o); if (err != srs_success) { return srs_error_wrap(err, "proxy"); } diff --git a/trunk/src/app/srs_app_latest_version.cpp b/trunk/src/app/srs_app_latest_version.cpp index 11f6f58bf..9d172cb1b 100644 --- a/trunk/src/app/srs_app_latest_version.cpp +++ b/trunk/src/app/srs_app_latest_version.cpp @@ -68,6 +68,7 @@ void srs_build_features(stringstream& ss) int nn_vhosts = 0; bool rtsp = false, forward = false, ingest = false, edge = false, hls = false, dvr = false, flv = false; bool hooks = false, dash = false, hds = false, exec = false, transcode = false, security = false; + bool flv2 = false; SrsConfDirective* root = _srs_config->get_root(); // Note that we limit the loop, never detect all configs. @@ -78,6 +79,8 @@ void srs_build_features(stringstream& ss) string engine = _srs_config->get_stream_caster_engine(conf); if (engine == "rtsp") { rtsp = true; + } else if (engine == "flv") { + flv2 = true; } } @@ -134,6 +137,7 @@ void srs_build_features(stringstream& ss) SRS_CHECK_FEATURE2(nn_vhosts, "vhosts", ss); SRS_CHECK_FEATURE(rtsp, ss); + SRS_CHECK_FEATURE(flv2, ss); SRS_CHECK_FEATURE(forward, ss); SRS_CHECK_FEATURE(ingest, ss); SRS_CHECK_FEATURE(edge, ss);