Skip to content

Commit

Permalink
for #319, dumps the http static, remux and globals.
Browse files Browse the repository at this point in the history
  • Loading branch information
winlinvip committed Aug 28, 2015
1 parent 5efd191 commit bdfd0ae
Show file tree
Hide file tree
Showing 4 changed files with 326 additions and 2 deletions.
44 changes: 44 additions & 0 deletions trunk/conf/full.conf
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
274 changes: 274 additions & 0 deletions trunk/src/app/srs_app_config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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;
Expand Down
6 changes: 6 additions & 0 deletions trunk/src/app/srs_app_config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand Down
4 changes: 2 additions & 2 deletions trunk/src/app/srs_app_http_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -937,15 +937,15 @@ 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();
SrsConfDirective* conf = root->get("vhost", vhost);
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();
Expand Down

0 comments on commit bdfd0ae

Please sign in to comment.