diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index 2c367e33a6..77a3767b4f 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -443,6 +443,50 @@ vhost ingest.srs.com { } } +# the vhost for intest with transcode engine. +vhost transcode.ingest.srs.com { + ingest livestream { + enabled on; + input { + type file; + url ./doc/source.200kbps.768x320.flv; + } + ffmpeg ./objs/ffmpeg/bin/ffmpeg; + engine { + enabled off; + iformat flv; + vfilter { + i ./doc/ffmpeg-logo.png; + filter_complex 'overlay=10:10'; + } + vcodec libx264; + vbitrate 1500; + vfps 25; + vwidth 768; + vheight 320; + vthreads 12; + vprofile main; + vpreset medium; + vparams { + t 100; + coder 1; + b_strategy 2; + bf 3; + refs 10; + } + acodec libfdk_aac; + abitrate 70; + asample_rate 44100; + achannels 2; + aparams { + profile:a aac_low; + } + oformat flv; + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]; + } + } +} + # vhost for http static and flv vod stream for each vhost. vhost http.static.srs.com { # http static vhost specified config diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index e3602ac2ed..3d3902d533 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -1796,6 +1796,177 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj) { int ret = ERROR_SUCCESS; + SrsConfDirective* dir = NULL; + + // security + if ((dir = vhost->get("security")) != NULL) { + SrsAmf0Object* security = SrsAmf0Any::object(); + obj->set("security", security); + + SrsAmf0StrictArray* allows = SrsAmf0Any::strict_array(); + security->set("allows", allows); + + for (int i = 0; i < (int)dir->directives.size(); i++) { + SrsConfDirective* sdir = dir->directives.at(i); + + if (sdir->name == "enabled") { + security->set("enabled", sdir->dumps_arg0_to_boolean()); + } else if (sdir->name == "allow") { + SrsAmf0Object* allow = SrsAmf0Any::object(); + allow->set("action", SrsAmf0Any::str(sdir->name.c_str())); + allow->set("method", SrsAmf0Any::str(sdir->arg0().c_str())); + allow->set("entry", SrsAmf0Any::str(sdir->arg1().c_str())); + allows->append(allow); + } + } + } + + // mrw + if ((dir = vhost->get("min_latency")) != NULL) { + obj->set("min_latency", dir->dumps_arg0_to_boolean()); + } + if ((dir = vhost->get("mr")) != NULL) { + SrsAmf0Object* mr = SrsAmf0Any::object(); + obj->set("mr", mr); + + for (int i = 0; i < (int)dir->directives.size(); i++) { + SrsConfDirective* sdir = dir->directives.at(i); + + if (sdir->name == "enabled") { + mr->set("enabled", sdir->dumps_arg0_to_boolean()); + } else if (sdir->name == "latency") { + mr->set("latency", sdir->dumps_arg0_to_number()); + } + } + } + if ((dir = vhost->get("mw_latency")) != NULL) { + obj->set("mw_latency", dir->dumps_arg0_to_number()); + } + + // edge. + if ((dir = vhost->get("mode")) != NULL) { + obj->set("mode", dir->dumps_arg0_to_str()); + } + if ((dir = vhost->get("origin")) != NULL) { + obj->set("origin", dir->dumps_args()); + } + if ((dir = vhost->get("token_traverse")) != NULL) { + obj->set("token_traverse", dir->dumps_arg0_to_boolean()); + } + if ((dir = vhost->get("vhost")) != NULL) { + obj->set("vhost", dir->dumps_arg0_to_str()); + } + + // dvr + if ((dir = vhost->get("dvr")) != NULL) { + SrsAmf0Object* dvr = SrsAmf0Any::object(); + obj->set("dvr", dvr); + + for (int i = 0; i < (int)dir->directives.size(); i++) { + SrsConfDirective* sdir = dir->directives.at(i); + + if (sdir->name == "enabled") { + dvr->set("enabled", sdir->dumps_arg0_to_boolean()); + } else if (sdir->name == "dvr_plan") { + dvr->set("dvr_plan", sdir->dumps_arg0_to_str()); + } else if (sdir->name == "dvr_path") { + dvr->set("dvr_path", sdir->dumps_arg0_to_str()); + } else if (sdir->name == "dvr_duration") { + dvr->set("dvr_duration", sdir->dumps_arg0_to_number()); + } else if (sdir->name == "dvr_wait_keyframe") { + dvr->set("dvr_wait_keyframe", sdir->dumps_arg0_to_boolean()); + } else if (sdir->name == "time_jitter") { + dvr->set("time_jitter", sdir->dumps_arg0_to_str()); + } + } + } + + // ingest + SrsAmf0StrictArray* ingests = NULL; + for (int i = 0; i < (int)vhost->directives.size(); i++) { + dir = vhost->directives.at(i); + if (dir->name != "ingest") { + continue; + } + + if (!ingests) { + ingests = SrsAmf0Any::strict_array(); + obj->set("ingests", ingests); + } + + SrsAmf0Object* ingest = SrsAmf0Any::object(); + ingest->set("id", dir->dumps_arg0_to_str()); + ingests->append(ingest); + + for (int j = 0; j < (int)dir->directives.size(); j++) { + SrsConfDirective* sdir = dir->directives.at(j); + + if (sdir->name == "enabled") { + ingest->set("enabled", sdir->dumps_arg0_to_boolean()); + } else if (sdir->name == "input") { + SrsAmf0Object* input = SrsAmf0Any::object(); + ingest->set("input", input); + + SrsConfDirective* type = sdir->get("type"); + if (type) { + input->set("type", type->dumps_arg0_to_str()); + } + + SrsConfDirective* url = sdir->get("url"); + if (url) { + input->set("url", url->dumps_arg0_to_str()); + } + } else if (sdir->name == "ffmpeg") { + ingest->set("ffmpeg", sdir->dumps_arg0_to_str()); + } else if (sdir->name == "engine") { + SrsAmf0Object* engine = SrsAmf0Any::object(); + ingest->set("engine", engine); + + if ((ret = dumps_engine(sdir, engine)) != ERROR_SUCCESS) { + return ret; + } + } + } + } + + // http_static + if ((dir = vhost->get("http_static")) != NULL) { + SrsAmf0Object* http_static = SrsAmf0Any::object(); + obj->set("http_static", http_static); + + for (int i = 0; i < (int)dir->directives.size(); i++) { + SrsConfDirective* sdir = dir->directives.at(i); + + if (sdir->name == "enabled") { + http_static->set("enabled", sdir->dumps_arg0_to_boolean()); + } else if (sdir->name == "mount") { + http_static->set("mount", sdir->dumps_arg0_to_str()); + } else if (sdir->name == "dir") { + http_static->set("dir", sdir->dumps_arg0_to_str()); + } + } + } + + // http_remux + if ((dir = vhost->get("http_remux")) != NULL) { + SrsAmf0Object* http_remux = SrsAmf0Any::object(); + obj->set("http_remux", http_remux); + + for (int i = 0; i < (int)dir->directives.size(); i++) { + SrsConfDirective* sdir = dir->directives.at(i); + + if (sdir->name == "enabled") { + http_remux->set("enabled", sdir->dumps_arg0_to_boolean()); + } else if (sdir->name == "fast_cache") { + http_remux->set("fast_cache", sdir->dumps_arg0_to_number()); + } else if (sdir->name == "mount") { + http_remux->set("mount", sdir->dumps_arg0_to_str()); + } else if (sdir->name == "hstrs") { + http_remux->set("hstrs", sdir->dumps_arg0_to_boolean()); + } + } + } + return ret; } @@ -1820,6 +1991,109 @@ int SrsConfig::raw_to_json(SrsAmf0Object* obj) return ret; } +int SrsConfig::dumps_engine(SrsConfDirective* dir, SrsAmf0Object* engine) +{ + int ret = ERROR_SUCCESS; + + SrsConfDirective* conf = NULL; + + if ((conf = dir->get("enabled")) != NULL) { + engine->set("enabled", conf->dumps_arg0_to_boolean()); + } + + if ((conf = dir->get("iformat")) != NULL) { + engine->set("iformat", conf->dumps_arg0_to_str()); + } + + if ((conf = dir->get("vfilter")) != NULL) { + SrsAmf0Object* vfilter = SrsAmf0Any::object(); + engine->set("vfilter", vfilter); + + for (int i = 0; i < (int)conf->directives.size(); i++) { + SrsConfDirective* sdir = conf->directives.at(i); + vfilter->set(sdir->name, sdir->dumps_arg0_to_str()); + } + } + + if ((conf = dir->get("vcodec")) != NULL) { + engine->set("vcodec", conf->dumps_arg0_to_str()); + } + + if ((conf = dir->get("vbitrate")) != NULL) { + engine->set("vbitrate", conf->dumps_arg0_to_number()); + } + + if ((conf = dir->get("vfps")) != NULL) { + engine->set("vfps", conf->dumps_arg0_to_number()); + } + + if ((conf = dir->get("vwidth")) != NULL) { + engine->set("vwidth", conf->dumps_arg0_to_number()); + } + + if ((conf = dir->get("vheight")) != NULL) { + engine->set("vheight", conf->dumps_arg0_to_number()); + } + + if ((conf = dir->get("vthreads")) != NULL) { + engine->set("vthreads", conf->dumps_arg0_to_number()); + } + + if ((conf = dir->get("vprofile")) != NULL) { + engine->set("vprofile", conf->dumps_arg0_to_str()); + } + + if ((conf = dir->get("vpreset")) != NULL) { + engine->set("vpreset", conf->dumps_arg0_to_str()); + } + + if ((conf = dir->get("vparams")) != NULL) { + SrsAmf0Object* vparams = SrsAmf0Any::object(); + engine->set("vparams", vparams); + + for (int i = 0; i < (int)conf->directives.size(); i++) { + SrsConfDirective* sdir = conf->directives.at(i); + vparams->set(sdir->name, sdir->dumps_arg0_to_str()); + } + } + + if ((conf = dir->get("acodec")) != NULL) { + engine->set("acodec", conf->dumps_arg0_to_str()); + } + + if ((conf = dir->get("abitrate")) != NULL) { + engine->set("abitrate", conf->dumps_arg0_to_number()); + } + + if ((conf = dir->get("asample_rate")) != NULL) { + engine->set("asample_rate", conf->dumps_arg0_to_number()); + } + + if ((conf = dir->get("achannels")) != NULL) { + engine->set("achannels", conf->dumps_arg0_to_number()); + } + + if ((conf = dir->get("aparams")) != NULL) { + SrsAmf0Object* aparams = SrsAmf0Any::object(); + engine->set("aparams", aparams); + + for (int i = 0; i < (int)conf->directives.size(); i++) { + SrsConfDirective* sdir = conf->directives.at(i); + aparams->set(sdir->name, sdir->dumps_arg0_to_str()); + } + } + + if ((conf = dir->get("oformat")) != NULL) { + engine->set("oformat", conf->dumps_arg0_to_str()); + } + + if ((conf = dir->get("output")) != NULL) { + engine->set("output", conf->dumps_arg0_to_str()); + } + + return ret; +} + string SrsConfig::config() { return config_file; diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index 9f0a51341e..bf51f17d7b 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -324,6 +324,12 @@ class SrsConfig * dumps the http_api sections to json for raw api info. */ virtual int raw_to_json(SrsAmf0Object* obj); +private: + /** + * dumps the engine section to amf0 object. + */ + virtual int dumps_engine(SrsConfDirective* dir, SrsAmf0Object* engine); +public: /** * get the config file path. */ diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 591e4f9cb6..7c1ba7d16d 100755 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -937,7 +937,7 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) if (vhost.empty()) { ret = ERROR_SYSTEM_CONFIG_RAW_PARAMS; srs_error("raw api query vhost invalid vhost=%s. ret=%d", vhost.c_str(), ret); - return ret; + return srs_api_response_code(w, r, ret); } SrsConfDirective* root = _srs_config->get_root(); @@ -945,7 +945,7 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) if (!conf) { ret = ERROR_SYSTEM_CONFIG_RAW_PARAMS; srs_error("raw api query vhost invalid vhost=%s. ret=%d", vhost.c_str(), ret); - return ret; + return srs_api_response_code(w, r, ret); } SrsAmf0Object* data = SrsAmf0Any::object();