diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index ad5966801..5bc8bed9f 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -102,9 +102,10 @@ vhost ingest.srs.com { input { # the type of input. # can be file/stream/device, that is, - # file: ingest file specifies by url. - # stream: ingest stream specifeis by url. - # devide: not support yet. + # file: ingest file specifies by url. + # stream: ingest stream specifeis by url. + # device: not support yet. + # default: file type file; # the url of file/stream. url ./doc/source.200kbps.768x320.flv; @@ -810,6 +811,9 @@ pithy_print { # shared print interval for all encoders, in milliseconds. # if not specified, set to 2000. encoder 3000; + # shared print interval for all ingesters, in milliseconds. + # if not specified, set to 2000. + ingester 3000; # shared print interval for all hls, in milliseconds. # if not specified, set to 2000. hls 3000; diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 8c7ca5837..7335d9797 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -847,12 +847,12 @@ int SrsConfig::get_pithy_print_forwarder() int SrsConfig::get_pithy_print_encoder() { - SrsConfDirective* pithy = root->get("encoder"); + SrsConfDirective* pithy = root->get("pithy_print"); if (!pithy) { return SRS_STAGE_ENCODER_INTERVAL_MS; } - pithy = pithy->get("forwarder"); + pithy = pithy->get("encoder"); if (!pithy) { return SRS_STAGE_ENCODER_INTERVAL_MS; } @@ -860,6 +860,21 @@ int SrsConfig::get_pithy_print_encoder() return ::atoi(pithy->arg0().c_str()); } +int SrsConfig::get_pithy_print_ingester() +{ + SrsConfDirective* pithy = root->get("pithy_print"); + if (!pithy) { + return SRS_STAGE_INGESTER_INTERVAL_MS; + } + + pithy = pithy->get("ingester"); + if (!pithy) { + return SRS_STAGE_INGESTER_INTERVAL_MS; + } + + return ::atoi(pithy->arg0().c_str()); +} + int SrsConfig::get_pithy_print_hls() { SrsConfDirective* pithy = root->get("pithy_print"); @@ -1645,10 +1660,33 @@ string SrsConfig::get_ingest_ffmpeg(SrsConfDirective* ingest) return conf->arg0(); } -string SrsConfig::get_ingest_input(SrsConfDirective* ingest) +string SrsConfig::get_ingest_input_type(SrsConfDirective* ingest) { SrsConfDirective* conf = ingest->get("input"); + if (!conf) { + return SRS_INGEST_TYPE_FILE; + } + + conf = conf->get("type"); + + if (!conf) { + return SRS_INGEST_TYPE_FILE; + } + + return conf->arg0(); +} + +string SrsConfig::get_ingest_input_url(SrsConfDirective* ingest) +{ + SrsConfDirective* conf = ingest->get("input"); + + if (!conf) { + return ""; + } + + conf = conf->get("url"); + if (!conf) { return ""; } diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index 7a5d6462e..5b467eeee 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -66,8 +66,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SRS_STAGE_PUBLISH_USER_INTERVAL_MS 1100 #define SRS_STAGE_FORWARDER_INTERVAL_MS 2000 #define SRS_STAGE_ENCODER_INTERVAL_MS 2000 +#define SRS_STAGE_INGESTER_INTERVAL_MS 2000 #define SRS_STAGE_HLS_INTERVAL_MS 2000 +#define SRS_INGEST_TYPE_FILE "file" + class SrsFileBuffer; class SrsConfDirective @@ -134,6 +137,7 @@ public: virtual int get_pithy_print_publish(); virtual int get_pithy_print_forwarder(); virtual int get_pithy_print_encoder(); + virtual int get_pithy_print_ingester(); virtual int get_pithy_print_hls(); virtual int get_pithy_print_play(); // vhost section @@ -190,7 +194,8 @@ public: virtual void get_ingesters(std::string vhost, std::vector& ingeters); virtual bool get_ingest_enabled(SrsConfDirective* ingest); virtual std::string get_ingest_ffmpeg(SrsConfDirective* ingest); - virtual std::string get_ingest_input(SrsConfDirective* ingest); + virtual std::string get_ingest_input_type(SrsConfDirective* ingest); + virtual std::string get_ingest_input_url(SrsConfDirective* ingest); // log section public: virtual bool get_srs_log_tank_file(); diff --git a/trunk/src/app/srs_app_encoder.cpp b/trunk/src/app/srs_app_encoder.cpp index af018d8e7..8bdea5bfd 100644 --- a/trunk/src/app/srs_app_encoder.cpp +++ b/trunk/src/app/srs_app_encoder.cpp @@ -99,13 +99,13 @@ int SrsEncoder::cycle() // start all ffmpegs. if ((ret = ffmpeg->start()) != ERROR_SUCCESS) { - srs_error("ffmpeg start failed. ret=%d", ret); + srs_error("transcode ffmpeg start failed. ret=%d", ret); return ret; } // check ffmpeg status. if ((ret = ffmpeg->cycle()) != ERROR_SUCCESS) { - srs_error("ffmpeg cycle failed. ret=%d", ret); + srs_error("transcode ffmpeg cycle failed. ret=%d", ret); return ret; } } diff --git a/trunk/src/app/srs_app_ffmpeg.cpp b/trunk/src/app/srs_app_ffmpeg.cpp index 3c1079add..8e7b1c3b1 100644 --- a/trunk/src/app/srs_app_ffmpeg.cpp +++ b/trunk/src/app/srs_app_ffmpeg.cpp @@ -73,6 +73,11 @@ SrsFFMPEG::~SrsFFMPEG() stop(); } +void SrsFFMPEG::set_iparams(string iparams) +{ + _iparams = iparams; +} + string SrsFFMPEG::output() { return _output; @@ -232,6 +237,11 @@ int SrsFFMPEG::start() // the filename associated with the file being executed. params.push_back(ffmpeg); + // input params + if (!_iparams.empty()) { + params.push_back(_iparams); + } + // input. params.push_back("-f"); params.push_back("flv"); diff --git a/trunk/src/app/srs_app_ffmpeg.hpp b/trunk/src/app/srs_app_ffmpeg.hpp index 6121eb3e0..92ae68424 100644 --- a/trunk/src/app/srs_app_ffmpeg.hpp +++ b/trunk/src/app/srs_app_ffmpeg.hpp @@ -51,6 +51,7 @@ private: int log_fd; private: std::string ffmpeg; + std::string _iparams; std::vector vfilter; std::string vcodec; int vbitrate; @@ -72,6 +73,7 @@ public: SrsFFMPEG(std::string ffmpeg_bin); virtual ~SrsFFMPEG(); public: + virtual void set_iparams(std::string iparams); virtual std::string output(); public: virtual int initialize(std::string in, std::string out, std::string log); diff --git a/trunk/src/app/srs_app_ingest.cpp b/trunk/src/app/srs_app_ingest.cpp index a5b3cd8b8..1b1e64699 100644 --- a/trunk/src/app/srs_app_ingest.cpp +++ b/trunk/src/app/srs_app_ingest.cpp @@ -29,6 +29,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +#include // when error, ingester sleep for a while and retry. #define SRS_INGESTER_SLEEP_US (int64_t)(3*1000*1000LL) @@ -37,6 +38,7 @@ SrsIngester::SrsIngester() { // TODO: FIXME: support reload. pthread = new SrsThread(this, SRS_INGESTER_SLEEP_US); + pithy_print = new SrsPithyPrint(SRS_STAGE_INGESTER); } SrsIngester::~SrsIngester() @@ -55,6 +57,17 @@ int SrsIngester::start() return ret; } + // return for error or no engine. + if (ffmpegs.empty()) { + return ret; + } + + // start thread to run all encoding engines. + if ((ret = pthread->start()) != ERROR_SUCCESS) { + srs_error("st_thread_create failed. ret=%d", ret); + return ret; + } + return ret; } @@ -96,7 +109,7 @@ int SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest _srs_config->get_transcode_engines(ingest, engines); if (engines.empty()) { SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin); - if ((ret = initialize_ffmpeg(ffmpeg, ingest, NULL)) != ERROR_SUCCESS) { + if ((ret = initialize_ffmpeg(ffmpeg, vhost, ingest, NULL)) != ERROR_SUCCESS) { srs_freep(ffmpeg); if (ret != ERROR_ENCODER_LOOP) { srs_error("invalid ingest engine. ret=%d", ret); @@ -112,7 +125,7 @@ int SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest for (int i = 0; i < (int)engines.size(); i++) { SrsConfDirective* engine = engines[i]; SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin); - if ((ret = initialize_ffmpeg(ffmpeg, ingest, engine)) != ERROR_SUCCESS) { + if ((ret = initialize_ffmpeg(ffmpeg, vhost, ingest, engine)) != ERROR_SUCCESS) { srs_freep(ffmpeg); if (ret != ERROR_ENCODER_LOOP) { srs_error("invalid ingest engine: %s %s", ingest->arg0().c_str(), engine->arg0().c_str()); @@ -128,11 +141,35 @@ int SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest void SrsIngester::stop() { + pthread->stop(); + clear_engines(); } int SrsIngester::cycle() { int ret = ERROR_SUCCESS; + + std::vector::iterator it; + for (it = ffmpegs.begin(); it != ffmpegs.end(); ++it) { + SrsFFMPEG* ffmpeg = *it; + + // start all ffmpegs. + if ((ret = ffmpeg->start()) != ERROR_SUCCESS) { + srs_error("ingest ffmpeg start failed. ret=%d", ret); + return ret; + } + + // check ffmpeg status. + if ((ret = ffmpeg->cycle()) != ERROR_SUCCESS) { + srs_error("ingest ffmpeg cycle failed. ret=%d", ret); + return ret; + } + } + + // pithy print + ingester(); + pithy_print->elapse(SRS_INGESTER_SLEEP_US / 1000); + return ret; } @@ -170,21 +207,109 @@ int SrsIngester::parse() return ret; } -int SrsIngester::initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* ingest, SrsConfDirective* engine) +int SrsIngester::initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* vhost, SrsConfDirective* ingest, SrsConfDirective* engine) { int ret = ERROR_SUCCESS; - std::string input = _srs_config->get_ingest_input(ingest); - if (input.empty()) { + SrsConfDirective* listen = _srs_config->get_listen(); + srs_assert(listen->args.size() > 0); + std::string port = listen->arg0(); + + std::string output = _srs_config->get_engine_output(engine); + // output stream, to other/self server + // ie. rtmp://127.0.0.1:1935/live/livestream_sd + output = srs_string_replace(output, "[vhost]", vhost->arg0()); + output = srs_string_replace(output, "[port]", port); + if (output.empty()) { + ret = ERROR_ENCODER_NO_OUTPUT; + srs_trace("empty ingest output url. ret=%d", ret); + return ret; + } + + // find the app and stream in rtmp url + std::string url = output; + std::string app, stream; + size_t pos = std::string::npos; + if ((pos = url.rfind("/")) != std::string::npos) { + stream = url.substr(pos + 1); + url = url.substr(0, pos); + } + if ((pos = url.rfind("/")) != std::string::npos) { + app = url.substr(pos + 1); + url = url.substr(0, pos); + } + if ((pos = app.rfind("?")) != std::string::npos) { + app = app.substr(0, pos); + } + + std::string log_file; + // write ffmpeg info to log file. + log_file = _srs_config->get_ffmpeg_log_dir(); + log_file += "/"; + log_file += "ingest"; + log_file += "-"; + log_file += vhost->arg0(); + log_file += "-"; + log_file += app; + log_file += "-"; + log_file += stream; + log_file += ".log"; + + // stream name: vhost/app/stream for print + input_stream_name = vhost->arg0(); + input_stream_name += "/"; + input_stream_name += app; + input_stream_name += "/"; + input_stream_name += stream; + + // input + std::string input_type = _srs_config->get_ingest_input_type(ingest); + if (input_type.empty()) { ret = ERROR_ENCODER_NO_INPUT; - srs_trace("empty ingest intput. ret=%d", ret); + srs_trace("empty ingest intput type. ret=%d", ret); return ret; } + + if (input_type == SRS_INGEST_TYPE_FILE) { + std::string input_url = _srs_config->get_ingest_input_url(ingest); + if (input_url.empty()) { + ret = ERROR_ENCODER_NO_INPUT; + srs_trace("empty ingest intput url. ret=%d", ret); + return ret; + } + + // for file, set re. + ffmpeg->set_iparams("-re"); + + if ((ret = ffmpeg->initialize(input_url, output, log_file)) != ERROR_SUCCESS) { + return ret; + } + } else { + ret = ERROR_ENCODER_INPUT_TYPE; + srs_error("invalid ingest type=%s, ret=%d", input_type.c_str(), ret); + } if (!engine || !_srs_config->get_engine_enabled(engine)) { + if ((ret = ffmpeg->initialize_copy()) != ERROR_SUCCESS) { + return ret; + } + } else { + if ((ret = ffmpeg->initialize_transcode(engine)) != ERROR_SUCCESS) { + return ret; + } } return ret; } +void SrsIngester::ingester() +{ + // reportable + if (pithy_print->can_print()) { + // TODO: FIXME: show more info. + srs_trace("-> time=%"PRId64", ingesters=%d, input=%s", + pithy_print->get_age(), (int)ffmpegs.size(), input_stream_name.c_str()); + } +} + #endif diff --git a/trunk/src/app/srs_app_ingest.hpp b/trunk/src/app/srs_app_ingest.hpp index 34dd4843e..af8f109dd 100644 --- a/trunk/src/app/srs_app_ingest.hpp +++ b/trunk/src/app/srs_app_ingest.hpp @@ -37,6 +37,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. class SrsFFMPEG; class SrsConfDirective; +class SrsPithyPrint; /** * ingest file/stream/device, @@ -46,9 +47,11 @@ class SrsConfDirective; class SrsIngester : public ISrsThreadHandler { private: + std::string input_stream_name; std::vector ffmpegs; private: SrsThread* pthread; + SrsPithyPrint* pithy_print; public: SrsIngester(); virtual ~SrsIngester(); @@ -64,7 +67,8 @@ private: virtual int parse(); virtual int parse_ingesters(SrsConfDirective* vhost); virtual int parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest); - virtual int initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* ingest, SrsConfDirective* engine); + virtual int initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* vhost, SrsConfDirective* ingest, SrsConfDirective* engine); + virtual void ingester(); }; #endif diff --git a/trunk/src/app/srs_app_pithy_print.cpp b/trunk/src/app/srs_app_pithy_print.cpp index 6438021d8..cca72c687 100644 --- a/trunk/src/app/srs_app_pithy_print.cpp +++ b/trunk/src/app/srs_app_pithy_print.cpp @@ -71,6 +71,10 @@ struct SrsStageInfo : public ISrsReloadHandler pithy_print_time_ms = _srs_config->get_pithy_print_encoder(); break; } + case SRS_STAGE_INGESTER: { + pithy_print_time_ms = _srs_config->get_pithy_print_ingester(); + break; + } case SRS_STAGE_HLS: { pithy_print_time_ms = _srs_config->get_pithy_print_hls(); break; @@ -108,7 +112,8 @@ int SrsPithyPrint::enter_stage() std::map::iterator it = _srs_stages.find(stage_id); if (it == _srs_stages.end()) { - stage = _srs_stages[stage_id] = new SrsStageInfo(stage_id); + stage = new SrsStageInfo(stage_id); + _srs_stages[stage_id] = stage; } else { stage = it->second; } diff --git a/trunk/src/app/srs_app_pithy_print.hpp b/trunk/src/app/srs_app_pithy_print.hpp index d15f65aa5..518584809 100644 --- a/trunk/src/app/srs_app_pithy_print.hpp +++ b/trunk/src/app/srs_app_pithy_print.hpp @@ -40,6 +40,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SRS_STAGE_ENCODER 4 // the pithy stage for all hls. #define SRS_STAGE_HLS 5 +// the pithy stage for all ingesters. +#define SRS_STAGE_INGESTER 6 /** * the stage is used for a collection of object to do print, diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index e6fde04ec..b31ec9023 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -164,13 +164,13 @@ SrsServer::SrsServer() _srs_config->subscribe(this); #ifdef SRS_HTTP_API - http_api_handler = SrsHttpHandler::create_http_api(); + http_api_handler = NULL; #endif #ifdef SRS_HTTP_SERVER - http_stream_handler = SrsHttpHandler::create_http_stream(); + http_stream_handler = NULL; #endif #ifdef SRS_INGEST - ingester = new SrsIngester(); + ingester = NULL; #endif } @@ -205,6 +205,19 @@ int SrsServer::initialize() { int ret = ERROR_SUCCESS; +#ifdef SRS_HTTP_API + srs_assert(!http_api_handler); + http_api_handler = SrsHttpHandler::create_http_api(); +#endif +#ifdef SRS_HTTP_SERVER + srs_assert(!http_stream_handler); + http_stream_handler = SrsHttpHandler::create_http_stream(); +#endif +#ifdef SRS_INGEST + srs_assert(!ingester); + ingester = new SrsIngester(); +#endif + #ifdef SRS_HTTP_API if ((ret = http_api_handler->initialize()) != ERROR_SUCCESS) { return ret; diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp old mode 100644 new mode 100755 index ffa750078..fb886e6e8 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -1,127 +1,127 @@ -/* -The MIT License (MIT) - -Copyright (c) 2013-2014 winlin - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef SRS_CORE_HPP -#define SRS_CORE_HPP - -/* -#include -*/ - -// current release version -#define VERSION_MAJOR "0" -#define VERSION_MINOR "9" -#define VERSION_REVISION "52" -#define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION -// server info. -#define RTMP_SIG_SRS_KEY "srs" -#define RTMP_SIG_SRS_ROLE "origin server" -#define RTMP_SIG_SRS_NAME RTMP_SIG_SRS_KEY"(simple rtmp server)" -#define RTMP_SIG_SRS_URL "https://"RTMP_SIG_SRS_URL_SHORT -#define RTMP_SIG_SRS_URL_SHORT "github.com/winlinvip/simple-rtmp-server" -#define RTMP_SIG_SRS_WEB "http://blog.csdn.net/win_lin" -#define RTMP_SIG_SRS_EMAIL "winlin@vip.126.com" -#define RTMP_SIG_SRS_LICENSE "The MIT License (MIT)" -#define RTMP_SIG_SRS_COPYRIGHT "Copyright (c) 2013-2014 winlin" -#define RTMP_SIG_SRS_PRIMARY_AUTHROS "winlin,wenjie.zhao" -#define RTMP_SIG_SRS_CONTRIBUTORS_URL "https://github.com/winlinvip/simple-rtmp-server/blob/master/AUTHORS.txt" - -/** -* the core provides the common defined macros, utilities, -* user must include the srs_core.hpp before any header, or maybe -* build failed. -*/ - -// for 32bit os, 2G big file limit for unistd io, -// ie. read/write/lseek to use 64bits size for huge file. -#ifndef _FILE_OFFSET_BITS - #define _FILE_OFFSET_BITS 64 -#endif - -// for int64_t print using PRId64 format. -#ifndef __STDC_FORMAT_MACROS - #define __STDC_FORMAT_MACROS -#endif -#include - -#include -#define srs_assert(expression) assert(expression) - -#include -#include - -// generated by configure. -#include - -// free the p and set to NULL. -// p must be a T*. -#define srs_freep(p) \ - if (p) { \ - delete p; \ - p = NULL; \ - } \ - (void)0 -// free the p which represents a array -#define srs_freepa(p) \ - if (p) { \ - delete[] p; \ - p = NULL; \ - } \ - (void)0 - -// compare -#define srs_min(a, b) (((a) < (b))? (a) : (b)) -#define srs_max(a, b) (((a) < (b))? (b) : (a)) - -// signal defines. -#define SIGNAL_RELOAD SIGHUP - -#include -// replace old_str to new_str of str -extern std::string srs_string_replace(std::string str, std::string old_str, std::string new_str); -// trim char in trim_chars of str -extern std::string srs_string_trim_end(std::string str, std::string trim_chars); -// trim char in trim_chars of str -extern std::string srs_string_trim_start(std::string str, std::string trim_chars); -// remove char in remove_chars of str -extern std::string srs_string_remove(std::string str, std::string remove_chars); -// whether string end with -extern bool srs_string_ends_with(std::string str, std::string flag); - -// dns resolve utility, return the resolved ip address. -extern std::string srs_dns_resolve(std::string host); -// whether system is little endian -extern bool srs_is_little_endian(); - -/** -* disable copy constructor of class -*/ -#define disable_default_copy(className)\ - private:\ - /** \ - * disable the copy constructor and operator=, donot allow directly copy. \ - */ \ - className(const className&); \ - className& operator= (const className&) - +/* +The MIT License (MIT) + +Copyright (c) 2013-2014 winlin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef SRS_CORE_HPP +#define SRS_CORE_HPP + +/* +#include +*/ + +// current release version +#define VERSION_MAJOR "0" +#define VERSION_MINOR "9" +#define VERSION_REVISION "53" +#define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION +// server info. +#define RTMP_SIG_SRS_KEY "srs" +#define RTMP_SIG_SRS_ROLE "origin server" +#define RTMP_SIG_SRS_NAME RTMP_SIG_SRS_KEY"(simple rtmp server)" +#define RTMP_SIG_SRS_URL "https://"RTMP_SIG_SRS_URL_SHORT +#define RTMP_SIG_SRS_URL_SHORT "github.com/winlinvip/simple-rtmp-server" +#define RTMP_SIG_SRS_WEB "http://blog.csdn.net/win_lin" +#define RTMP_SIG_SRS_EMAIL "winlin@vip.126.com" +#define RTMP_SIG_SRS_LICENSE "The MIT License (MIT)" +#define RTMP_SIG_SRS_COPYRIGHT "Copyright (c) 2013-2014 winlin" +#define RTMP_SIG_SRS_PRIMARY_AUTHROS "winlin,wenjie.zhao" +#define RTMP_SIG_SRS_CONTRIBUTORS_URL "https://github.com/winlinvip/simple-rtmp-server/blob/master/AUTHORS.txt" + +/** +* the core provides the common defined macros, utilities, +* user must include the srs_core.hpp before any header, or maybe +* build failed. +*/ + +// for 32bit os, 2G big file limit for unistd io, +// ie. read/write/lseek to use 64bits size for huge file. +#ifndef _FILE_OFFSET_BITS + #define _FILE_OFFSET_BITS 64 +#endif + +// for int64_t print using PRId64 format. +#ifndef __STDC_FORMAT_MACROS + #define __STDC_FORMAT_MACROS +#endif +#include + +#include +#define srs_assert(expression) assert(expression) + +#include +#include + +// generated by configure. +#include + +// free the p and set to NULL. +// p must be a T*. +#define srs_freep(p) \ + if (p) { \ + delete p; \ + p = NULL; \ + } \ + (void)0 +// free the p which represents a array +#define srs_freepa(p) \ + if (p) { \ + delete[] p; \ + p = NULL; \ + } \ + (void)0 + +// compare +#define srs_min(a, b) (((a) < (b))? (a) : (b)) +#define srs_max(a, b) (((a) < (b))? (b) : (a)) + +// signal defines. +#define SIGNAL_RELOAD SIGHUP + +#include +// replace old_str to new_str of str +extern std::string srs_string_replace(std::string str, std::string old_str, std::string new_str); +// trim char in trim_chars of str +extern std::string srs_string_trim_end(std::string str, std::string trim_chars); +// trim char in trim_chars of str +extern std::string srs_string_trim_start(std::string str, std::string trim_chars); +// remove char in remove_chars of str +extern std::string srs_string_remove(std::string str, std::string remove_chars); +// whether string end with +extern bool srs_string_ends_with(std::string str, std::string flag); + +// dns resolve utility, return the resolved ip address. +extern std::string srs_dns_resolve(std::string host); +// whether system is little endian +extern bool srs_is_little_endian(); + +/** +* disable copy constructor of class +*/ +#define disable_default_copy(className)\ + private:\ + /** \ + * disable the copy constructor and operator=, donot allow directly copy. \ + */ \ + className(const className&); \ + className& operator= (const className&) + #endif \ No newline at end of file diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index dc26d0447..c299fb177 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -155,6 +155,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define ERROR_ENCODER_DUP2 716 #define ERROR_ENCODER_PARSE 717 #define ERROR_ENCODER_NO_INPUT 718 +#define ERROR_ENCODER_NO_OUTPUT 719 +#define ERROR_ENCODER_INPUT_TYPE 720 #define ERROR_HTTP_PARSE_URI 800 #define ERROR_HTTP_DATA_INVLIAD 801