diff --git a/README.md b/README.md index 68ee2f101..04ba70062 100755 --- a/README.md +++ b/README.md @@ -159,6 +159,8 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-02-05, For [#665][bug #665], fix HTTP-FLV reloading bug. 3.0.116 +* v3.0, 2020-02-05, For [#1592][bug #1592], fix terminal echo off by redirect process stdin. 3.0.115 * v3.0, 2020-02-04, For [#1186][bug #1186], refactor security check. 3.0.114 * v3.0, 2020-02-04, Fix [#939][bug #939], response right A/V flag in FLV header. 3.0.113 * v3.0, 2020-02-04, For [#939][bug #939], always enable fast FLV streaming. @@ -1664,6 +1666,8 @@ Winlin [bug #1206]: https://github.com/ossrs/srs/issues/1206 [bug #939]: https://github.com/ossrs/srs/issues/939 [bug #1186]: https://github.com/ossrs/srs/issues/1186 +[bug #1592]: https://github.com/ossrs/srs/issues/1592 +[bug #665]: https://github.com/ossrs/srs/issues/665 [bug #xxxxxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxxxxx [exo #828]: https://github.com/google/ExoPlayer/pull/828 diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index 20c52ae13..0348a9433 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -19,11 +19,16 @@ pid ./objs/srs.pid; # performance about 10%. # default: 60000 chunk_size 60000; -# the logs dir. +# the log dir for FFMPEG. # if enabled ffmpeg, each transcoding stream will create a log file. # /dev/null to disable the log. # default: ./objs ff_log_dir ./objs; +# the log level for FFMPEG. +# info warning error fatal panic quiet +# trace debug verbose +# default: info +ff_log_level info; # the log tank, console or file. # if console, print log to console. # if file, write log to file. requires srs_log_file if log to file. diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 1b494b149..585e1d6f0 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -3488,6 +3488,7 @@ srs_error_t SrsConfig::check_normal_config() && n != "http_api" && n != "stats" && n != "vhost" && n != "pithy_print_ms" && n != "http_server" && n != "stream_caster" && n != "srt_server" && n != "utc_time" && n != "work_dir" && n != "asprocess" + && n != "ff_log_level" ) { return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal directive %s", n.c_str()); } @@ -5775,13 +5776,13 @@ string SrsConfig::get_log_file() return conf->arg0(); } -bool SrsConfig::get_ffmpeg_log_enabled() +bool SrsConfig::get_ff_log_enabled() { - string log = get_ffmpeg_log_dir(); + string log = get_ff_log_dir(); return log != SRS_CONSTS_NULL_FILE; } -string SrsConfig::get_ffmpeg_log_dir() +string SrsConfig::get_ff_log_dir() { static string DEFAULT = "./objs"; @@ -5793,6 +5794,18 @@ string SrsConfig::get_ffmpeg_log_dir() return conf->arg0(); } +string SrsConfig::get_ff_log_level() +{ + static string DEFAULT = "info"; + + SrsConfDirective* conf = root->get("ff_log_level"); + if (!conf || conf->arg0().empty()) { + return DEFAULT; + } + + return conf->arg0(); +} + SrsConfDirective* SrsConfig::get_dash(string vhost) { SrsConfDirective* conf = get_vhost(vhost); diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index a95a07830..197c5decb 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -786,10 +786,12 @@ public: // Get the log file path. virtual std::string get_log_file(); // Whether ffmpeg log enabled - virtual bool get_ffmpeg_log_enabled(); + virtual bool get_ff_log_enabled(); // The ffmpeg log dir. // @remark, /dev/null to disable it. - virtual std::string get_ffmpeg_log_dir(); + virtual std::string get_ff_log_dir(); + // The ffmpeg log level. + virtual std::string get_ff_log_level(); // The MPEG-DASH section. private: virtual SrsConfDirective* get_dash(std::string vhost); diff --git a/trunk/src/app/srs_app_encoder.cpp b/trunk/src/app/srs_app_encoder.cpp index be3bb0263..346bd2715 100644 --- a/trunk/src/app/srs_app_encoder.cpp +++ b/trunk/src/app/srs_app_encoder.cpp @@ -285,8 +285,8 @@ srs_error_t SrsEncoder::initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsRequest* req, Sr std::string log_file = SRS_CONSTS_NULL_FILE; // disabled // write ffmpeg info to log file. - if (_srs_config->get_ffmpeg_log_enabled()) { - log_file = _srs_config->get_ffmpeg_log_dir(); + if (_srs_config->get_ff_log_enabled()) { + log_file = _srs_config->get_ff_log_dir(); log_file += "/"; log_file += "ffmpeg-encoder"; log_file += "-"; diff --git a/trunk/src/app/srs_app_ffmpeg.cpp b/trunk/src/app/srs_app_ffmpeg.cpp index 5c79bf992..e9c87a70e 100644 --- a/trunk/src/app/srs_app_ffmpeg.cpp +++ b/trunk/src/app/srs_app_ffmpeg.cpp @@ -82,9 +82,9 @@ SrsFFMPEG::~SrsFFMPEG() srs_freep(process); } -void SrsFFMPEG::set_iparams(string iparams) +void SrsFFMPEG::append_iparam(string iparam) { - _iparams = iparams; + iparams.push_back(iparam); } void SrsFFMPEG::set_oformat(string format) @@ -230,8 +230,11 @@ srs_error_t SrsFFMPEG::start() params.push_back(ffmpeg); // input params - if (!_iparams.empty()) { - params.push_back(_iparams); + for (int i = 0; i < iparams.size(); i++) { + string iparam = iparams.at(i); + if (!iparam.empty()) { + params.push_back(iparam); + } } // build the perfile diff --git a/trunk/src/app/srs_app_ffmpeg.hpp b/trunk/src/app/srs_app_ffmpeg.hpp index a837fdf24..452b7a564 100644 --- a/trunk/src/app/srs_app_ffmpeg.hpp +++ b/trunk/src/app/srs_app_ffmpeg.hpp @@ -45,7 +45,7 @@ private: std::string log_file; private: std::string ffmpeg; - std::string _iparams; + std::vector iparams; std::vector perfile; std::string iformat; std::string input; @@ -70,7 +70,7 @@ public: SrsFFMPEG(std::string ffmpeg_bin); virtual ~SrsFFMPEG(); public: - virtual void set_iparams(std::string iparams); + virtual void append_iparam(std::string iparam); virtual void set_oformat(std::string format); virtual std::string output(); public: diff --git a/trunk/src/app/srs_app_http_stream.cpp b/trunk/src/app/srs_app_http_stream.cpp index c7720be19..7a0688fff 100755 --- a/trunk/src/app/srs_app_http_stream.cpp +++ b/trunk/src/app/srs_app_http_stream.cpp @@ -809,6 +809,11 @@ SrsLiveEntry::SrsLiveEntry(std::string m) _is_aac = (ext == ".aac"); } +SrsLiveEntry::~SrsLiveEntry() +{ + srs_freep(req); +} + bool SrsLiveEntry::is_flv() { return _is_flv; @@ -846,7 +851,6 @@ SrsHttpStreamServer::~SrsHttpStreamServer() std::map::iterator it; for (it = tflvs.begin(); it != tflvs.end(); ++it) { SrsLiveEntry* entry = it->second; - srs_freep(entry->req); srs_freep(entry); } tflvs.clear(); @@ -901,7 +905,9 @@ srs_error_t SrsHttpStreamServer::http_mount(SrsSource* s, SrsRequest* r) mount = srs_string_replace(mount, SRS_CONSTS_RTMP_DEFAULT_VHOST"/", "/"); entry = new SrsLiveEntry(mount); - + + entry->source = s; + entry->req = r->copy()->as_http(); entry->cache = new SrsBufferCache(s, r); entry->stream = new SrsLiveStream(s, r, entry->cache); @@ -971,7 +977,8 @@ srs_error_t SrsHttpStreamServer::on_reload_vhost_added(string vhost) srs_error_t SrsHttpStreamServer::on_reload_vhost_http_remux_updated(string vhost) { srs_error_t err = srs_success; - + + // Create new vhost. if (tflvs.find(vhost) == tflvs.end()) { if ((err = initialize_flv_entry(vhost)) != srs_success) { return srs_error_wrap(err, "init flv entry"); @@ -981,41 +988,27 @@ srs_error_t SrsHttpStreamServer::on_reload_vhost_http_remux_updated(string vhost // and do mount automatically on playing http flv if this stream is a new http_remux stream. return err; } - - SrsLiveEntry* tmpl = tflvs[vhost]; - SrsRequest* req = tmpl->req; - SrsSource* source = tmpl->source; - - if (source && req) { - // cleanup the exists http remux. - http_unmount(source, req); - } - - if (!_srs_config->get_vhost_http_remux_enabled(vhost)) { - return err; - } - - string old_tmpl_mount = tmpl->mount; - string new_tmpl_mount = _srs_config->get_vhost_http_remux_mount(vhost); - - /** - * TODO: not support to reload different mount url for the time being. - * if the mount is change, need more logical thing to deal with. - * such as erase stream from sflvs and free all related resource. - */ - srs_assert(old_tmpl_mount == new_tmpl_mount); - - // do http mount directly with SrsRequest and SrsSource if stream is played already. - if (req) { - std::string sid = req->get_stream_url(); - - // remount stream. - if ((err = http_mount(source, req)) != srs_success) { - return srs_error_wrap(err, "vhost %s http_remux reload failed", vhost.c_str()); + + // Update all streams for exists vhost. + // TODO: FIMXE: If url changed, needs more things to deal with. + std::map::iterator it; + for (it = sflvs.begin(); it != sflvs.end(); ++it) { + SrsLiveEntry* entry = it->second; + if (!entry || !entry->req || !entry->source) { + continue; + } + + SrsRequest* req = entry->req; + if (!req || req->vhost != vhost) { + continue; + } + + SrsSource* source = entry->source; + if (_srs_config->get_vhost_http_remux_enabled(vhost)) { + http_mount(source, req); + } else { + http_unmount(source, req); } - } else { - // for without SrsRequest and SrsSource if stream is not played yet, do http mount automatically - // when start play this http flv stream. } srs_trace("vhost %s http_remux reload success", vhost.c_str()); diff --git a/trunk/src/app/srs_app_http_stream.hpp b/trunk/src/app/srs_app_http_stream.hpp index 720e53e3a..a82e2a5a0 100755 --- a/trunk/src/app/srs_app_http_stream.hpp +++ b/trunk/src/app/srs_app_http_stream.hpp @@ -207,7 +207,9 @@ private: bool _is_aac; bool _is_mp3; public: + // We will free the request. SrsRequest* req; + // Shared source. SrsSource* source; public: // For template, the mount contains variables. @@ -218,6 +220,7 @@ public: SrsBufferCache* cache; SrsLiveEntry(std::string m); + virtual ~SrsLiveEntry(); bool is_flv(); bool is_ts(); diff --git a/trunk/src/app/srs_app_ingest.cpp b/trunk/src/app/srs_app_ingest.cpp index 453c48c6e..c98ed7d04 100644 --- a/trunk/src/app/srs_app_ingest.cpp +++ b/trunk/src/app/srs_app_ingest.cpp @@ -397,8 +397,8 @@ srs_error_t SrsIngester::initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* std::string log_file = SRS_CONSTS_NULL_FILE; // disabled // write ffmpeg info to log file. - if (_srs_config->get_ffmpeg_log_enabled()) { - log_file = _srs_config->get_ffmpeg_log_dir(); + if (_srs_config->get_ff_log_enabled()) { + log_file = _srs_config->get_ff_log_dir(); log_file += "/"; log_file += "ffmpeg-ingest"; log_file += "-"; @@ -409,7 +409,13 @@ srs_error_t SrsIngester::initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* log_file += stream; log_file += ".log"; } - + + std::string log_level = _srs_config->get_ff_log_level(); + if (!log_level.empty()) { + ffmpeg->append_iparam("-loglevel"); + ffmpeg->append_iparam(log_level); + } + // input std::string input_type = _srs_config->get_ingest_input_type(ingest); if (input_type.empty()) { @@ -423,7 +429,7 @@ srs_error_t SrsIngester::initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* } // for file, set re. - ffmpeg->set_iparams("-re"); + ffmpeg->append_iparam("-re"); if ((err = ffmpeg->initialize(input_url, output, log_file)) != srs_success) { return srs_error_wrap(err, "init ffmpeg"); @@ -435,7 +441,7 @@ srs_error_t SrsIngester::initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* } // for stream, no re. - ffmpeg->set_iparams(""); + ffmpeg->append_iparam(""); if ((err = ffmpeg->initialize(input_url, output, log_file)) != srs_success) { return srs_error_wrap(err, "init ffmpeg"); diff --git a/trunk/src/app/srs_app_process.cpp b/trunk/src/app/srs_app_process.cpp index 2b50b9583..8ccc1b72e 100644 --- a/trunk/src/app/srs_app_process.cpp +++ b/trunk/src/app/srs_app_process.cpp @@ -152,7 +152,7 @@ srs_error_t srs_redirect_output(string from_file, int to_fd) // redirect the fd to file. int fd = -1; - int flags = O_CREAT|O_WRONLY|O_APPEND; + int flags = O_CREAT|O_RDWR|O_APPEND; mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH; if ((fd = ::open(from_file.c_str(), flags, mode)) < 0) { @@ -197,10 +197,7 @@ srs_error_t SrsProcess::start() // ignore the SIGINT and SIGTERM signal(SIGINT, SIG_IGN); signal(SIGTERM, SIG_IGN); - - // for the stdin, - // should never close it or ffmpeg will error. - + // for the stdout, ignore when not specified. // redirect stdout to file if possible. if ((err = srs_redirect_output(stdout_file, STDOUT_FILENO)) != srs_success) { @@ -212,16 +209,22 @@ srs_error_t SrsProcess::start() if ((err = srs_redirect_output(stderr_file, STDERR_FILENO)) != srs_success) { return srs_error_wrap(err, "redirect output"); } - + + // No stdin for process, @bug https://github.com/ossrs/srs/issues/1592 + if ((err = srs_redirect_output("/dev/null", STDIN_FILENO)) != srs_success) { + return srs_error_wrap(err, "redirect input"); + } + // should never close the fd 3+, for it myabe used. // for fd should close at exec, use fnctl to set it. // log basic info to stderr. if (true) { - fprintf(stderr, "\n"); - fprintf(stderr, "process ppid=%d, cid=%d, pid=%d\n", ppid, cid, getpid()); - fprintf(stderr, "process binary=%s, cli: %s\n", bin.c_str(), cli.c_str()); - fprintf(stderr, "process actual cli: %s\n", actual_cli.c_str()); + fprintf(stdout, "\n"); + fprintf(stdout, "process ppid=%d, cid=%d, pid=%d, in=%d, out=%d, err=%d\n", + ppid, cid, getpid(), STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO); + fprintf(stdout, "process binary=%s, cli: %s\n", bin.c_str(), cli.c_str()); + fprintf(stdout, "process actual cli: %s\n", actual_cli.c_str()); } // memory leak in child process, it's ok. diff --git a/trunk/src/core/srs_core_version3.hpp b/trunk/src/core/srs_core_version3.hpp index fe5e458d1..7b51a0991 100644 --- a/trunk/src/core/srs_core_version3.hpp +++ b/trunk/src/core/srs_core_version3.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION3_HPP #define SRS_CORE_VERSION3_HPP -#define SRS_VERSION3_REVISION 114 +#define SRS_VERSION3_REVISION 116 #endif diff --git a/trunk/src/srt/srt_data.cpp b/trunk/src/srt/srt_data.cpp index 075064b14..5fc766814 100644 --- a/trunk/src/srt/srt_data.cpp +++ b/trunk/src/srt/srt_data.cpp @@ -1,13 +1,22 @@ #include "srt_data.hpp" #include -SRT_DATA_MSG::SRT_DATA_MSG(unsigned int len, const std::string& path):_len(len) +SRT_DATA_MSG::SRT_DATA_MSG(const std::string& path, unsigned int msg_type):_msg_type(msg_type) + ,_len(0) + ,_data_p(nullptr) + ,_key_path(path) { + +} + +SRT_DATA_MSG::SRT_DATA_MSG(unsigned int len, const std::string& path, unsigned int msg_type):_msg_type(msg_type) + ,_len(len) ,_key_path(path) { _data_p = new unsigned char[len]; memset(_data_p, 0, len); } -SRT_DATA_MSG::SRT_DATA_MSG(unsigned char* data_p, unsigned int len, const std::string& path):_len(len) +SRT_DATA_MSG::SRT_DATA_MSG(unsigned char* data_p, unsigned int len, const std::string& path, unsigned int msg_type):_msg_type(msg_type) + ,_len(len) ,_key_path(path) { _data_p = new unsigned char[len]; @@ -15,7 +24,13 @@ SRT_DATA_MSG::SRT_DATA_MSG(unsigned char* data_p, unsigned int len, const std::s } SRT_DATA_MSG::~SRT_DATA_MSG() { - delete _data_p; + if (_data_p && (_len > 0)) { + delete _data_p; + } +} + +unsigned int SRT_DATA_MSG::msg_type() { + return _msg_type; } std::string SRT_DATA_MSG::get_path() { diff --git a/trunk/src/srt/srt_data.hpp b/trunk/src/srt/srt_data.hpp index ab9cf81ea..cc0d9604e 100644 --- a/trunk/src/srt/srt_data.hpp +++ b/trunk/src/srt/srt_data.hpp @@ -3,17 +3,23 @@ #include #include +#define SRT_MSG_DATA_TYPE 0x01 +#define SRT_MSG_CLOSE_TYPE 0x02 + class SRT_DATA_MSG { public: - SRT_DATA_MSG(unsigned int len, const std::string& path); - SRT_DATA_MSG(unsigned char* data_p, unsigned int len, const std::string& path); + SRT_DATA_MSG(const std::string& path, unsigned int msg_type=SRT_MSG_DATA_TYPE); + SRT_DATA_MSG(unsigned int len, const std::string& path, unsigned int msg_type=SRT_MSG_DATA_TYPE); + SRT_DATA_MSG(unsigned char* data_p, unsigned int len, const std::string& path, unsigned int msg_type=SRT_MSG_DATA_TYPE); ~SRT_DATA_MSG(); + unsigned int msg_type(); unsigned int data_len(); unsigned char* get_data(); std::string get_path(); private: + unsigned int _msg_type; unsigned int _len; unsigned char* _data_p; std::string _key_path; diff --git a/trunk/src/srt/srt_handle.cpp b/trunk/src/srt/srt_handle.cpp index ea25b2c83..f2bc2ff8c 100644 --- a/trunk/src/srt/srt_handle.cpp +++ b/trunk/src/srt/srt_handle.cpp @@ -17,8 +17,8 @@ static bool MONITOR_STATICS_ENABLE = false; static long long MONITOR_TIMEOUT = 5000; const unsigned int DEF_DATA_SIZE = 188*7; -const long long CHECK_ALIVE_INTERVAL = 10*1000; -const long long CHECK_ALIVE_TIMEOUT = 15*1000; +const long long CHECK_ALIVE_INTERVAL = 5*1000; +const long long CHECK_ALIVE_TIMEOUT = 5*1000; long long srt_now_ms = 0; @@ -236,6 +236,10 @@ void srt_handle::onwork() add_newconn(msg.conn_ptr, msg.events); } + if (_conn_map.empty()) { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + continue; + } check_alive(); ret = srt_epoll_wait(_handle_pollid, read_fds, &rfd_num, write_fds, &wfd_num, @@ -243,7 +247,6 @@ void srt_handle::onwork() if (ret < 0) { srs_info("srt handle epoll is timeout, ret=%d, srt_now_ms=%ld", ret, srt_now_ms); - std::this_thread::sleep_for(std::chrono::milliseconds(30)); continue; } @@ -376,6 +379,7 @@ void srt_handle::close_push_conn(SRTSOCKET srtsocket) { _push_conn_map.erase(push_iter); } _conn_map.erase(iter); + srt2rtmp::get_instance()->insert_ctrl_message(SRT_MSG_CLOSE_TYPE, conn_ptr->get_subpath()); conn_ptr->close(); } diff --git a/trunk/src/srt/srt_to_rtmp.cpp b/trunk/src/srt/srt_to_rtmp.cpp index e86a3c92d..f8e037af3 100644 --- a/trunk/src/srt/srt_to_rtmp.cpp +++ b/trunk/src/srt/srt_to_rtmp.cpp @@ -61,6 +61,14 @@ void srt2rtmp::insert_data_message(unsigned char* data_p, unsigned int len, cons return; } +void srt2rtmp::insert_ctrl_message(unsigned int msg_type, const std::string& key_path) { + std::unique_lock locker(_mutex); + + SRT_DATA_MSG_PTR msg_ptr = std::make_shared(key_path, msg_type); + _msg_queue.push(msg_ptr); + //_notify_cond.notify_one(); + return; +} SRT_DATA_MSG_PTR srt2rtmp::get_data_message() { std::unique_lock locker(_mutex); SRT_DATA_MSG_PTR msg_ptr; @@ -79,8 +87,8 @@ SRT_DATA_MSG_PTR srt2rtmp::get_data_message() { } void srt2rtmp::check_rtmp_alive() { - const int64_t CHECK_INTERVAL = 15*1000; - const int64_t ALIVE_TIMEOUT_MAX = 20*1000; + const int64_t CHECK_INTERVAL = 5*1000; + const int64_t ALIVE_TIMEOUT_MAX = 5*1000; if (_lastcheck_ts == 0) { _lastcheck_ts = now_ms(); @@ -108,6 +116,22 @@ void srt2rtmp::check_rtmp_alive() { return; } +void srt2rtmp::handle_close_rtmpsession(const std::string& key_path) { + RTMP_CLIENT_PTR rtmp_ptr; + auto iter = _rtmp_client_map.find(key_path); + if (iter == _rtmp_client_map.end()) { + srs_error("fail to close rtmp session fail, can't find session by key_path:%s", + key_path.c_str()); + return; + } + rtmp_ptr = iter->second; + _rtmp_client_map.erase(iter); + srs_trace("close rtmp session which key_path is %s", key_path.c_str()); + rtmp_ptr->close(); + + return; +} + //the cycle is running in srs coroutine srs_error_t srt2rtmp::cycle() { srs_error_t err = srs_success; @@ -119,7 +143,25 @@ srs_error_t srt2rtmp::cycle() { if (!msg_ptr) { srs_usleep((30 * SRS_UTIME_MILLISECONDS)); } else { - handle_ts_data(msg_ptr); + switch (msg_ptr->msg_type()) { + case SRT_MSG_DATA_TYPE: + { + handle_ts_data(msg_ptr); + break; + } + case SRT_MSG_CLOSE_TYPE: + { + handle_close_rtmpsession(msg_ptr->get_path()); + break; + } + default: + { + srs_error("srt to rtmp get wrong message type(%u), path:%s", + msg_ptr->msg_type(), msg_ptr->get_path().c_str()); + assert(0); + } + } + } check_rtmp_alive(); if ((err = _trd_ptr->pull()) != srs_success) { diff --git a/trunk/src/srt/srt_to_rtmp.hpp b/trunk/src/srt/srt_to_rtmp.hpp index c361e7cd0..08735c09d 100644 --- a/trunk/src/srt/srt_to_rtmp.hpp +++ b/trunk/src/srt/srt_to_rtmp.hpp @@ -85,11 +85,13 @@ public: void release(); void insert_data_message(unsigned char* data_p, unsigned int len, const std::string& key_path); + void insert_ctrl_message(unsigned int msg_type, const std::string& key_path); private: SRT_DATA_MSG_PTR get_data_message(); virtual srs_error_t cycle(); void handle_ts_data(SRT_DATA_MSG_PTR data_ptr); + void handle_close_rtmpsession(const std::string& key_path); void check_rtmp_alive(); private: diff --git a/trunk/src/utest/srs_utest_config.cpp b/trunk/src/utest/srs_utest_config.cpp index 2b8d90e75..1d03cefda 100644 --- a/trunk/src/utest/srs_utest_config.cpp +++ b/trunk/src/utest/srs_utest_config.cpp @@ -888,6 +888,11 @@ VOID TEST(ConfigMainTest, CheckConf_ff_log_dir) MockSrsConfig conf; HELPER_ASSERT_FAILED(conf.parse(_MIN_OK_CONF "ff_log_dirs ./objs;")); } + + if (true) { + MockSrsConfig conf; + HELPER_ASSERT_FAILED(conf.parse(_MIN_OK_CONF "ff_log_levels info;")); + } } VOID TEST(ConfigMainTest, CheckConf_srs_log_level) @@ -3503,12 +3508,13 @@ VOID TEST(ConfigMainTest, CheckVhostConfig5) if (true) { MockSrsConfig conf; - HELPER_ASSERT_SUCCESS(conf.parse(_MIN_OK_CONF "srs_log_tank xxx;srs_log_level xxx2;srs_log_file xxx3;ff_log_dir xxx4;")); + HELPER_ASSERT_SUCCESS(conf.parse(_MIN_OK_CONF "srs_log_tank xxx;srs_log_level xxx2;srs_log_file xxx3;ff_log_dir xxx4; ff_log_level xxx5;")); EXPECT_TRUE(conf.get_log_tank_file()); EXPECT_STREQ("xxx2", conf.get_log_level().c_str()); EXPECT_STREQ("xxx3", conf.get_log_file().c_str()); - EXPECT_STREQ("xxx4", conf.get_ffmpeg_log_dir().c_str()); - EXPECT_TRUE(conf.get_ffmpeg_log_enabled()); + EXPECT_STREQ("xxx4", conf.get_ff_log_dir().c_str()); + EXPECT_STREQ("xxx5", conf.get_ff_log_level().c_str()); + EXPECT_TRUE(conf.get_ff_log_enabled()); } if (true) {