2013-12-08 02:46:33 +00:00
|
|
|
/*
|
|
|
|
The MIT License (MIT)
|
|
|
|
|
2014-01-01 02:37:12 +00:00
|
|
|
Copyright (c) 2013-2014 winlin
|
2013-12-08 02:46:33 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
|
2014-03-02 13:49:09 +00:00
|
|
|
#ifndef SRS_APP_CONIFG_HPP
|
|
|
|
#define SRS_APP_CONIFG_HPP
|
2013-12-08 02:46:33 +00:00
|
|
|
|
|
|
|
/*
|
2014-03-02 13:49:09 +00:00
|
|
|
#include <srs_app_config.hpp>
|
2013-12-08 02:46:33 +00:00
|
|
|
*/
|
|
|
|
#include <srs_core.hpp>
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
#include <string>
|
|
|
|
|
2014-03-02 13:49:09 +00:00
|
|
|
#include <srs_app_reload.hpp>
|
2013-12-08 02:46:33 +00:00
|
|
|
|
|
|
|
// default vhost for rtmp
|
|
|
|
#define RTMP_VHOST_DEFAULT "__defaultVhost__"
|
|
|
|
|
|
|
|
#define SRS_LOCALHOST "127.0.0.1"
|
2014-03-21 07:45:34 +00:00
|
|
|
#define SRS_CONF_DEFAULT_PID_FILE "./objs/srs.pid"
|
2014-04-13 08:55:42 +00:00
|
|
|
#define SRS_DEFAULT_CONF "conf/srs.conf"
|
2013-12-08 02:46:33 +00:00
|
|
|
|
|
|
|
#define SRS_CONF_DEFAULT_HLS_PATH "./objs/nginx/html"
|
|
|
|
#define SRS_CONF_DEFAULT_HLS_FRAGMENT 10
|
|
|
|
#define SRS_CONF_DEFAULT_HLS_WINDOW 60
|
2014-04-17 08:06:49 +00:00
|
|
|
#define SRS_CONF_DEFAULT_DVR_PATH "./objs/nginx/html"
|
2014-04-17 09:35:21 +00:00
|
|
|
#define SRS_CONF_DEFAULT_DVR_PLAN_SESSION "session"
|
|
|
|
#define SRS_CONF_DEFAULT_DVR_PLAN_SEGMENT "segment"
|
2014-04-24 04:22:36 +00:00
|
|
|
// chnvideo hss
|
|
|
|
#define SRS_CONF_DEFAULT_DVR_PLAN_HSS "hss"
|
2014-04-17 09:35:21 +00:00
|
|
|
#define SRS_CONF_DEFAULT_DVR_PLAN SRS_CONF_DEFAULT_DVR_PLAN_SESSION
|
|
|
|
#define SRS_CONF_DEFAULT_DVR_DURATION 30
|
2013-12-08 02:46:33 +00:00
|
|
|
// in ms, for HLS aac sync time.
|
|
|
|
#define SRS_CONF_DEFAULT_AAC_SYNC 100
|
|
|
|
// in ms, for HLS aac flush the audio
|
|
|
|
#define SRS_CONF_DEFAULT_AAC_DELAY 300
|
2013-12-15 10:25:55 +00:00
|
|
|
// in seconds, the live queue length.
|
|
|
|
#define SRS_CONF_DEFAULT_QUEUE_LENGTH 30
|
|
|
|
// in seconds, the paused queue length.
|
|
|
|
#define SRS_CONF_DEFAULT_PAUSED_LENGTH 10
|
2013-12-22 09:28:29 +00:00
|
|
|
// the interval in seconds for bandwidth check
|
|
|
|
#define SRS_CONF_DEFAULT_BANDWIDTH_INTERVAL 30
|
|
|
|
// the interval in seconds for bandwidth check
|
|
|
|
#define SRS_CONF_DEFAULT_BANDWIDTH_LIMIT_KBPS 1000
|
2013-12-08 02:46:33 +00:00
|
|
|
|
2014-04-04 10:55:21 +00:00
|
|
|
#define SRS_CONF_DEFAULT_HTTP_MOUNT "/"
|
|
|
|
#define SRS_CONF_DEFAULT_HTTP_DIR SRS_CONF_DEFAULT_HLS_PATH
|
|
|
|
|
2014-04-04 15:04:38 +00:00
|
|
|
#define SRS_CONF_DEFAULT_HTTP_STREAM_PORT 8080
|
|
|
|
#define SRS_CONF_DEFAULT_HTTP_API_PORT 1985
|
|
|
|
|
2014-05-04 02:45:13 +00:00
|
|
|
#define SRS_STAGE_PLAY_USER_INTERVAL_MS 10000
|
|
|
|
#define SRS_STAGE_PUBLISH_USER_INTERVAL_MS 10000
|
|
|
|
#define SRS_STAGE_FORWARDER_INTERVAL_MS 10000
|
|
|
|
#define SRS_STAGE_ENCODER_INTERVAL_MS 10000
|
|
|
|
#define SRS_STAGE_INGESTER_INTERVAL_MS 10000
|
|
|
|
#define SRS_STAGE_HLS_INTERVAL_MS 10000
|
|
|
|
#define SRS_STAGE_EDGE_INTERVAL_MS 10000
|
2013-12-14 13:19:47 +00:00
|
|
|
|
2014-04-15 06:01:57 +00:00
|
|
|
#define SRS_AUTO_INGEST_TYPE_FILE "file"
|
|
|
|
#define SRS_AUTO_INGEST_TYPE_STREAM "stream"
|
2014-04-07 06:20:03 +00:00
|
|
|
|
2013-12-14 07:56:20 +00:00
|
|
|
class SrsFileBuffer;
|
2013-12-08 02:46:33 +00:00
|
|
|
|
|
|
|
class SrsConfDirective
|
|
|
|
{
|
|
|
|
public:
|
2014-03-18 03:32:58 +00:00
|
|
|
int conf_line;
|
|
|
|
std::string name;
|
|
|
|
std::vector<std::string> args;
|
|
|
|
std::vector<SrsConfDirective*> directives;
|
2013-12-08 02:46:33 +00:00
|
|
|
public:
|
2014-03-18 03:32:58 +00:00
|
|
|
SrsConfDirective();
|
|
|
|
virtual ~SrsConfDirective();
|
|
|
|
std::string arg0();
|
|
|
|
std::string arg1();
|
|
|
|
std::string arg2();
|
2014-05-18 08:15:35 +00:00
|
|
|
void set_arg0(std::string value);
|
2014-03-18 03:32:58 +00:00
|
|
|
SrsConfDirective* at(int index);
|
|
|
|
SrsConfDirective* get(std::string _name);
|
|
|
|
SrsConfDirective* get(std::string _name, std::string _arg0);
|
2013-12-08 02:46:33 +00:00
|
|
|
public:
|
2014-03-18 03:32:58 +00:00
|
|
|
virtual int parse(const char* filename);
|
2013-12-08 02:46:33 +00:00
|
|
|
public:
|
2014-03-18 03:32:58 +00:00
|
|
|
enum SrsDirectiveType{parse_file, parse_block};
|
|
|
|
virtual int parse_conf(SrsFileBuffer* buffer, SrsDirectiveType type);
|
|
|
|
virtual int read_token(SrsFileBuffer* buffer, std::vector<std::string>& args);
|
2014-04-04 10:55:21 +00:00
|
|
|
public:
|
|
|
|
virtual bool is_vhost();
|
2013-12-08 02:46:33 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* the config parser.
|
|
|
|
* for the config supports reload, so never keep the reference cross st-thread,
|
|
|
|
* that is, never save the SrsConfDirective* get by any api of config,
|
|
|
|
* for it maybe free in the reload st-thread cycle.
|
|
|
|
* you can keep it before st-thread switch, or simply never keep it.
|
|
|
|
*/
|
|
|
|
class SrsConfig
|
|
|
|
{
|
|
|
|
private:
|
2014-03-18 03:32:58 +00:00
|
|
|
bool show_help;
|
2014-04-13 08:55:42 +00:00
|
|
|
bool test_conf;
|
2014-03-18 03:32:58 +00:00
|
|
|
bool show_version;
|
|
|
|
std::string config_file;
|
2014-04-19 13:23:34 +00:00
|
|
|
std::string _argv;
|
|
|
|
std::string _cwd;
|
2014-03-18 03:32:58 +00:00
|
|
|
SrsConfDirective* root;
|
|
|
|
std::vector<ISrsReloadHandler*> subscribes;
|
2013-12-08 02:46:33 +00:00
|
|
|
public:
|
2014-03-18 03:32:58 +00:00
|
|
|
SrsConfig();
|
|
|
|
virtual ~SrsConfig();
|
2014-04-10 06:06:23 +00:00
|
|
|
// reload
|
2013-12-08 02:46:33 +00:00
|
|
|
public:
|
2014-03-18 03:32:58 +00:00
|
|
|
virtual void subscribe(ISrsReloadHandler* handler);
|
|
|
|
virtual void unsubscribe(ISrsReloadHandler* handler);
|
2014-04-10 06:05:01 +00:00
|
|
|
virtual int reload();
|
2014-05-18 08:15:35 +00:00
|
|
|
private:
|
|
|
|
virtual SrsConfDirective* get_or_create(SrsConfDirective* node, std::string name);
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* dynamic set the config, for instance, for http api to set,
|
|
|
|
* @return ture if config changed and need to reload.
|
|
|
|
*/
|
|
|
|
virtual bool set_log_file(std::string file);
|
|
|
|
virtual bool set_log_tank(std::string tank);
|
|
|
|
virtual bool set_log_level(std::string level);
|
|
|
|
public:
|
|
|
|
virtual int force_reload_log_file();
|
|
|
|
virtual int force_reload_log_tank();
|
|
|
|
virtual int force_reload_log_level();
|
2014-04-10 06:05:01 +00:00
|
|
|
private:
|
2014-04-13 05:08:10 +00:00
|
|
|
virtual int reload_http_api(SrsConfDirective* old_root);
|
2014-04-13 05:27:51 +00:00
|
|
|
virtual int reload_http_stream(SrsConfDirective* old_root);
|
2014-04-13 05:08:10 +00:00
|
|
|
virtual int reload_vhost(SrsConfDirective* old_root);
|
2014-04-10 06:05:01 +00:00
|
|
|
virtual int reload_transcode(SrsConfDirective* new_vhost, SrsConfDirective* old_vhost);
|
|
|
|
virtual int reload_ingest(SrsConfDirective* new_vhost, SrsConfDirective* old_vhost);
|
2014-04-10 06:06:23 +00:00
|
|
|
// parse options and file
|
2013-12-08 02:46:33 +00:00
|
|
|
public:
|
2014-03-18 03:32:58 +00:00
|
|
|
virtual int parse_options(int argc, char** argv);
|
2013-12-08 02:46:33 +00:00
|
|
|
private:
|
2014-03-18 03:32:58 +00:00
|
|
|
virtual int parse_file(const char* filename);
|
|
|
|
virtual int parse_argv(int& i, char** argv);
|
|
|
|
virtual void print_help(char** argv);
|
2014-04-19 13:23:34 +00:00
|
|
|
public:
|
2014-05-08 07:45:51 +00:00
|
|
|
virtual std::string cwd();
|
|
|
|
virtual std::string argv();
|
2014-04-04 09:01:34 +00:00
|
|
|
// global section
|
|
|
|
public:
|
2014-04-04 10:55:21 +00:00
|
|
|
virtual SrsConfDirective* get_root();
|
2014-04-04 09:01:34 +00:00
|
|
|
virtual bool get_deamon();
|
|
|
|
virtual int get_max_connections();
|
|
|
|
virtual SrsConfDirective* get_listen();
|
|
|
|
virtual std::string get_pid_file();
|
2014-05-19 07:27:05 +00:00
|
|
|
virtual std::string get_heartbeat_url();
|
2014-04-04 09:01:34 +00:00
|
|
|
virtual int get_pithy_print_publish();
|
|
|
|
virtual int get_pithy_print_forwarder();
|
|
|
|
virtual int get_pithy_print_encoder();
|
2014-04-07 06:20:03 +00:00
|
|
|
virtual int get_pithy_print_ingester();
|
2014-04-04 09:01:34 +00:00
|
|
|
virtual int get_pithy_print_hls();
|
|
|
|
virtual int get_pithy_print_play();
|
2014-04-26 13:41:18 +00:00
|
|
|
virtual int get_pithy_print_edge();
|
2014-04-25 07:27:50 +00:00
|
|
|
// vhost specified section
|
2013-12-14 13:19:47 +00:00
|
|
|
public:
|
2014-03-21 07:45:34 +00:00
|
|
|
virtual SrsConfDirective* get_vhost(std::string vhost);
|
2014-04-07 05:13:57 +00:00
|
|
|
virtual void get_vhosts(std::vector<SrsConfDirective*>& vhosts);
|
2014-03-21 07:45:34 +00:00
|
|
|
virtual bool get_vhost_enabled(std::string vhost);
|
|
|
|
virtual bool get_vhost_enabled(SrsConfDirective* vhost);
|
|
|
|
virtual SrsConfDirective* get_vhost_on_connect(std::string vhost);
|
|
|
|
virtual SrsConfDirective* get_vhost_on_close(std::string vhost);
|
|
|
|
virtual SrsConfDirective* get_vhost_on_publish(std::string vhost);
|
|
|
|
virtual SrsConfDirective* get_vhost_on_unpublish(std::string vhost);
|
|
|
|
virtual SrsConfDirective* get_vhost_on_play(std::string vhost);
|
|
|
|
virtual SrsConfDirective* get_vhost_on_stop(std::string vhost);
|
2014-04-30 03:56:19 +00:00
|
|
|
virtual SrsConfDirective* get_vhost_on_dvr_hss_reap_flv(std::string vhost);
|
2014-04-04 09:01:34 +00:00
|
|
|
virtual bool get_gop_cache(std::string vhost);
|
|
|
|
virtual bool get_atc(std::string vhost);
|
2014-04-30 04:08:11 +00:00
|
|
|
virtual bool get_atc_auto(std::string vhost);
|
2014-04-04 09:01:34 +00:00
|
|
|
virtual double get_queue_length(std::string vhost);
|
|
|
|
virtual SrsConfDirective* get_forward(std::string vhost);
|
|
|
|
virtual SrsConfDirective* get_refer(std::string vhost);
|
|
|
|
virtual SrsConfDirective* get_refer_play(std::string vhost);
|
|
|
|
virtual SrsConfDirective* get_refer_publish(std::string vhost);
|
|
|
|
virtual int get_chunk_size(const std::string& vhost);
|
|
|
|
// bwct(bandwidth check tool) section
|
|
|
|
public:
|
|
|
|
virtual bool get_bw_check_enabled(const std::string& vhost);
|
|
|
|
virtual std::string get_bw_check_key(const std::string& vhost);
|
|
|
|
virtual int get_bw_check_interval_ms(const std::string& vhost);
|
|
|
|
virtual int get_bw_check_limit_kbps(const std::string& vhost);
|
2014-04-25 07:27:50 +00:00
|
|
|
// vhost edge section
|
|
|
|
public:
|
|
|
|
virtual bool get_vhost_is_edge(std::string vhost);
|
2014-04-28 09:57:59 +00:00
|
|
|
virtual bool get_vhost_is_edge(SrsConfDirective* vhost);
|
2014-04-26 13:41:18 +00:00
|
|
|
virtual SrsConfDirective* get_vhost_edge_origin(std::string vhost);
|
2014-04-04 09:01:34 +00:00
|
|
|
// vhost transcode section
|
|
|
|
public:
|
2014-03-21 07:45:34 +00:00
|
|
|
virtual SrsConfDirective* get_transcode(std::string vhost, std::string scope);
|
|
|
|
virtual bool get_transcode_enabled(SrsConfDirective* transcode);
|
|
|
|
virtual std::string get_transcode_ffmpeg(SrsConfDirective* transcode);
|
2014-03-18 03:32:58 +00:00
|
|
|
virtual void get_transcode_engines(SrsConfDirective* transcode, std::vector<SrsConfDirective*>& engines);
|
|
|
|
virtual bool get_engine_enabled(SrsConfDirective* engine);
|
2014-03-21 07:45:34 +00:00
|
|
|
virtual std::string get_engine_vcodec(SrsConfDirective* engine);
|
|
|
|
virtual int get_engine_vbitrate(SrsConfDirective* engine);
|
|
|
|
virtual double get_engine_vfps(SrsConfDirective* engine);
|
|
|
|
virtual int get_engine_vwidth(SrsConfDirective* engine);
|
|
|
|
virtual int get_engine_vheight(SrsConfDirective* engine);
|
|
|
|
virtual int get_engine_vthreads(SrsConfDirective* engine);
|
|
|
|
virtual std::string get_engine_vprofile(SrsConfDirective* engine);
|
|
|
|
virtual std::string get_engine_vpreset(SrsConfDirective* engine);
|
2014-03-18 03:32:58 +00:00
|
|
|
virtual void get_engine_vparams(SrsConfDirective* engine, std::vector<std::string>& vparams);
|
|
|
|
virtual void get_engine_vfilter(SrsConfDirective* engine, std::vector<std::string>& vfilter);
|
2014-03-21 07:45:34 +00:00
|
|
|
virtual std::string get_engine_acodec(SrsConfDirective* engine);
|
|
|
|
virtual int get_engine_abitrate(SrsConfDirective* engine);
|
|
|
|
virtual int get_engine_asample_rate(SrsConfDirective* engine);
|
|
|
|
virtual int get_engine_achannels(SrsConfDirective* engine);
|
2014-03-18 03:32:58 +00:00
|
|
|
virtual void get_engine_aparams(SrsConfDirective* engine, std::vector<std::string>& aparams);
|
2014-03-21 07:45:34 +00:00
|
|
|
virtual std::string get_engine_output(SrsConfDirective* engine);
|
2014-04-07 05:13:57 +00:00
|
|
|
// ingest section
|
2014-04-07 03:57:24 +00:00
|
|
|
public:
|
|
|
|
virtual void get_ingesters(std::string vhost, std::vector<SrsConfDirective*>& ingeters);
|
2014-04-10 03:24:27 +00:00
|
|
|
virtual SrsConfDirective* get_ingest_by_id(std::string vhost, std::string ingest_id);
|
2014-04-07 05:13:57 +00:00
|
|
|
virtual bool get_ingest_enabled(SrsConfDirective* ingest);
|
|
|
|
virtual std::string get_ingest_ffmpeg(SrsConfDirective* ingest);
|
2014-04-07 06:20:03 +00:00
|
|
|
virtual std::string get_ingest_input_type(SrsConfDirective* ingest);
|
|
|
|
virtual std::string get_ingest_input_url(SrsConfDirective* ingest);
|
2014-04-04 07:35:17 +00:00
|
|
|
// log section
|
|
|
|
public:
|
2014-05-18 08:15:35 +00:00
|
|
|
virtual bool get_log_tank_file();
|
|
|
|
virtual std::string get_log_level();
|
|
|
|
virtual std::string get_log_file();
|
2014-04-04 07:35:17 +00:00
|
|
|
virtual std::string get_ffmpeg_log_dir();
|
2014-03-27 04:14:04 +00:00
|
|
|
// hls section
|
2013-12-14 13:19:47 +00:00
|
|
|
private:
|
2014-03-21 07:45:34 +00:00
|
|
|
virtual SrsConfDirective* get_hls(std::string vhost);
|
2013-12-14 13:19:47 +00:00
|
|
|
public:
|
2014-03-18 03:32:58 +00:00
|
|
|
virtual bool get_hls_enabled(std::string vhost);
|
2014-03-21 07:45:34 +00:00
|
|
|
virtual std::string get_hls_path(std::string vhost);
|
|
|
|
virtual double get_hls_fragment(std::string vhost);
|
|
|
|
virtual double get_hls_window(std::string vhost);
|
2014-04-17 08:06:49 +00:00
|
|
|
// dvr section
|
|
|
|
private:
|
|
|
|
virtual SrsConfDirective* get_dvr(std::string vhost);
|
|
|
|
public:
|
|
|
|
virtual bool get_dvr_enabled(std::string vhost);
|
|
|
|
virtual std::string get_dvr_path(std::string vhost);
|
2014-04-17 09:35:21 +00:00
|
|
|
virtual std::string get_dvr_plan(std::string vhost);
|
|
|
|
virtual int get_dvr_duration(std::string vhost);
|
2014-03-27 04:14:04 +00:00
|
|
|
// http api section
|
|
|
|
private:
|
|
|
|
virtual SrsConfDirective* get_http_api();
|
|
|
|
public:
|
|
|
|
virtual bool get_http_api_enabled();
|
2014-04-13 05:08:10 +00:00
|
|
|
virtual bool get_http_api_enabled(SrsConfDirective* conf);
|
2014-03-27 04:14:04 +00:00
|
|
|
virtual int get_http_api_listen();
|
|
|
|
// http stream section
|
|
|
|
private:
|
|
|
|
virtual SrsConfDirective* get_http_stream();
|
|
|
|
public:
|
|
|
|
virtual bool get_http_stream_enabled();
|
2014-04-13 05:27:51 +00:00
|
|
|
virtual bool get_http_stream_enabled(SrsConfDirective* conf);
|
2014-03-27 04:14:04 +00:00
|
|
|
virtual int get_http_stream_listen();
|
2014-04-04 15:04:38 +00:00
|
|
|
virtual std::string get_http_stream_dir();
|
2014-04-04 10:55:21 +00:00
|
|
|
public:
|
|
|
|
virtual bool get_vhost_http_enabled(std::string vhost);
|
|
|
|
virtual std::string get_vhost_http_mount(std::string vhost);
|
|
|
|
virtual std::string get_vhost_http_dir(std::string vhost);
|
2013-12-08 02:46:33 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* deep compare directive.
|
|
|
|
*/
|
|
|
|
bool srs_directive_equals(SrsConfDirective* a, SrsConfDirective* b);
|
|
|
|
|
|
|
|
// global config
|
2014-03-01 10:06:20 +00:00
|
|
|
extern SrsConfig* _srs_config;
|
2013-12-08 02:46:33 +00:00
|
|
|
|
2013-11-02 09:55:59 +00:00
|
|
|
#endif
|