winlin

for #319, dumps the http static, remux and globals.

@@ -443,6 +443,50 @@ vhost ingest.srs.com { @@ -443,6 +443,50 @@ vhost ingest.srs.com {
443 } 443 }
444 } 444 }
445 445
  446 +# the vhost for intest with transcode engine.
  447 +vhost transcode.ingest.srs.com {
  448 + ingest livestream {
  449 + enabled on;
  450 + input {
  451 + type file;
  452 + url ./doc/source.200kbps.768x320.flv;
  453 + }
  454 + ffmpeg ./objs/ffmpeg/bin/ffmpeg;
  455 + engine {
  456 + enabled off;
  457 + iformat flv;
  458 + vfilter {
  459 + i ./doc/ffmpeg-logo.png;
  460 + filter_complex 'overlay=10:10';
  461 + }
  462 + vcodec libx264;
  463 + vbitrate 1500;
  464 + vfps 25;
  465 + vwidth 768;
  466 + vheight 320;
  467 + vthreads 12;
  468 + vprofile main;
  469 + vpreset medium;
  470 + vparams {
  471 + t 100;
  472 + coder 1;
  473 + b_strategy 2;
  474 + bf 3;
  475 + refs 10;
  476 + }
  477 + acodec libfdk_aac;
  478 + abitrate 70;
  479 + asample_rate 44100;
  480 + achannels 2;
  481 + aparams {
  482 + profile:a aac_low;
  483 + }
  484 + oformat flv;
  485 + output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream];
  486 + }
  487 + }
  488 +}
  489 +
446 # vhost for http static and flv vod stream for each vhost. 490 # vhost for http static and flv vod stream for each vhost.
447 vhost http.static.srs.com { 491 vhost http.static.srs.com {
448 # http static vhost specified config 492 # http static vhost specified config
@@ -1796,6 +1796,177 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj) @@ -1796,6 +1796,177 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj)
1796 { 1796 {
1797 int ret = ERROR_SUCCESS; 1797 int ret = ERROR_SUCCESS;
1798 1798
  1799 + SrsConfDirective* dir = NULL;
  1800 +
  1801 + // security
  1802 + if ((dir = vhost->get("security")) != NULL) {
  1803 + SrsAmf0Object* security = SrsAmf0Any::object();
  1804 + obj->set("security", security);
  1805 +
  1806 + SrsAmf0StrictArray* allows = SrsAmf0Any::strict_array();
  1807 + security->set("allows", allows);
  1808 +
  1809 + for (int i = 0; i < (int)dir->directives.size(); i++) {
  1810 + SrsConfDirective* sdir = dir->directives.at(i);
  1811 +
  1812 + if (sdir->name == "enabled") {
  1813 + security->set("enabled", sdir->dumps_arg0_to_boolean());
  1814 + } else if (sdir->name == "allow") {
  1815 + SrsAmf0Object* allow = SrsAmf0Any::object();
  1816 + allow->set("action", SrsAmf0Any::str(sdir->name.c_str()));
  1817 + allow->set("method", SrsAmf0Any::str(sdir->arg0().c_str()));
  1818 + allow->set("entry", SrsAmf0Any::str(sdir->arg1().c_str()));
  1819 + allows->append(allow);
  1820 + }
  1821 + }
  1822 + }
  1823 +
  1824 + // mrw
  1825 + if ((dir = vhost->get("min_latency")) != NULL) {
  1826 + obj->set("min_latency", dir->dumps_arg0_to_boolean());
  1827 + }
  1828 + if ((dir = vhost->get("mr")) != NULL) {
  1829 + SrsAmf0Object* mr = SrsAmf0Any::object();
  1830 + obj->set("mr", mr);
  1831 +
  1832 + for (int i = 0; i < (int)dir->directives.size(); i++) {
  1833 + SrsConfDirective* sdir = dir->directives.at(i);
  1834 +
  1835 + if (sdir->name == "enabled") {
  1836 + mr->set("enabled", sdir->dumps_arg0_to_boolean());
  1837 + } else if (sdir->name == "latency") {
  1838 + mr->set("latency", sdir->dumps_arg0_to_number());
  1839 + }
  1840 + }
  1841 + }
  1842 + if ((dir = vhost->get("mw_latency")) != NULL) {
  1843 + obj->set("mw_latency", dir->dumps_arg0_to_number());
  1844 + }
  1845 +
  1846 + // edge.
  1847 + if ((dir = vhost->get("mode")) != NULL) {
  1848 + obj->set("mode", dir->dumps_arg0_to_str());
  1849 + }
  1850 + if ((dir = vhost->get("origin")) != NULL) {
  1851 + obj->set("origin", dir->dumps_args());
  1852 + }
  1853 + if ((dir = vhost->get("token_traverse")) != NULL) {
  1854 + obj->set("token_traverse", dir->dumps_arg0_to_boolean());
  1855 + }
  1856 + if ((dir = vhost->get("vhost")) != NULL) {
  1857 + obj->set("vhost", dir->dumps_arg0_to_str());
  1858 + }
  1859 +
  1860 + // dvr
  1861 + if ((dir = vhost->get("dvr")) != NULL) {
  1862 + SrsAmf0Object* dvr = SrsAmf0Any::object();
  1863 + obj->set("dvr", dvr);
  1864 +
  1865 + for (int i = 0; i < (int)dir->directives.size(); i++) {
  1866 + SrsConfDirective* sdir = dir->directives.at(i);
  1867 +
  1868 + if (sdir->name == "enabled") {
  1869 + dvr->set("enabled", sdir->dumps_arg0_to_boolean());
  1870 + } else if (sdir->name == "dvr_plan") {
  1871 + dvr->set("dvr_plan", sdir->dumps_arg0_to_str());
  1872 + } else if (sdir->name == "dvr_path") {
  1873 + dvr->set("dvr_path", sdir->dumps_arg0_to_str());
  1874 + } else if (sdir->name == "dvr_duration") {
  1875 + dvr->set("dvr_duration", sdir->dumps_arg0_to_number());
  1876 + } else if (sdir->name == "dvr_wait_keyframe") {
  1877 + dvr->set("dvr_wait_keyframe", sdir->dumps_arg0_to_boolean());
  1878 + } else if (sdir->name == "time_jitter") {
  1879 + dvr->set("time_jitter", sdir->dumps_arg0_to_str());
  1880 + }
  1881 + }
  1882 + }
  1883 +
  1884 + // ingest
  1885 + SrsAmf0StrictArray* ingests = NULL;
  1886 + for (int i = 0; i < (int)vhost->directives.size(); i++) {
  1887 + dir = vhost->directives.at(i);
  1888 + if (dir->name != "ingest") {
  1889 + continue;
  1890 + }
  1891 +
  1892 + if (!ingests) {
  1893 + ingests = SrsAmf0Any::strict_array();
  1894 + obj->set("ingests", ingests);
  1895 + }
  1896 +
  1897 + SrsAmf0Object* ingest = SrsAmf0Any::object();
  1898 + ingest->set("id", dir->dumps_arg0_to_str());
  1899 + ingests->append(ingest);
  1900 +
  1901 + for (int j = 0; j < (int)dir->directives.size(); j++) {
  1902 + SrsConfDirective* sdir = dir->directives.at(j);
  1903 +
  1904 + if (sdir->name == "enabled") {
  1905 + ingest->set("enabled", sdir->dumps_arg0_to_boolean());
  1906 + } else if (sdir->name == "input") {
  1907 + SrsAmf0Object* input = SrsAmf0Any::object();
  1908 + ingest->set("input", input);
  1909 +
  1910 + SrsConfDirective* type = sdir->get("type");
  1911 + if (type) {
  1912 + input->set("type", type->dumps_arg0_to_str());
  1913 + }
  1914 +
  1915 + SrsConfDirective* url = sdir->get("url");
  1916 + if (url) {
  1917 + input->set("url", url->dumps_arg0_to_str());
  1918 + }
  1919 + } else if (sdir->name == "ffmpeg") {
  1920 + ingest->set("ffmpeg", sdir->dumps_arg0_to_str());
  1921 + } else if (sdir->name == "engine") {
  1922 + SrsAmf0Object* engine = SrsAmf0Any::object();
  1923 + ingest->set("engine", engine);
  1924 +
  1925 + if ((ret = dumps_engine(sdir, engine)) != ERROR_SUCCESS) {
  1926 + return ret;
  1927 + }
  1928 + }
  1929 + }
  1930 + }
  1931 +
  1932 + // http_static
  1933 + if ((dir = vhost->get("http_static")) != NULL) {
  1934 + SrsAmf0Object* http_static = SrsAmf0Any::object();
  1935 + obj->set("http_static", http_static);
  1936 +
  1937 + for (int i = 0; i < (int)dir->directives.size(); i++) {
  1938 + SrsConfDirective* sdir = dir->directives.at(i);
  1939 +
  1940 + if (sdir->name == "enabled") {
  1941 + http_static->set("enabled", sdir->dumps_arg0_to_boolean());
  1942 + } else if (sdir->name == "mount") {
  1943 + http_static->set("mount", sdir->dumps_arg0_to_str());
  1944 + } else if (sdir->name == "dir") {
  1945 + http_static->set("dir", sdir->dumps_arg0_to_str());
  1946 + }
  1947 + }
  1948 + }
  1949 +
  1950 + // http_remux
  1951 + if ((dir = vhost->get("http_remux")) != NULL) {
  1952 + SrsAmf0Object* http_remux = SrsAmf0Any::object();
  1953 + obj->set("http_remux", http_remux);
  1954 +
  1955 + for (int i = 0; i < (int)dir->directives.size(); i++) {
  1956 + SrsConfDirective* sdir = dir->directives.at(i);
  1957 +
  1958 + if (sdir->name == "enabled") {
  1959 + http_remux->set("enabled", sdir->dumps_arg0_to_boolean());
  1960 + } else if (sdir->name == "fast_cache") {
  1961 + http_remux->set("fast_cache", sdir->dumps_arg0_to_number());
  1962 + } else if (sdir->name == "mount") {
  1963 + http_remux->set("mount", sdir->dumps_arg0_to_str());
  1964 + } else if (sdir->name == "hstrs") {
  1965 + http_remux->set("hstrs", sdir->dumps_arg0_to_boolean());
  1966 + }
  1967 + }
  1968 + }
  1969 +
1799 return ret; 1970 return ret;
1800 } 1971 }
1801 1972
@@ -1820,6 +1991,109 @@ int SrsConfig::raw_to_json(SrsAmf0Object* obj) @@ -1820,6 +1991,109 @@ int SrsConfig::raw_to_json(SrsAmf0Object* obj)
1820 return ret; 1991 return ret;
1821 } 1992 }
1822 1993
  1994 +int SrsConfig::dumps_engine(SrsConfDirective* dir, SrsAmf0Object* engine)
  1995 +{
  1996 + int ret = ERROR_SUCCESS;
  1997 +
  1998 + SrsConfDirective* conf = NULL;
  1999 +
  2000 + if ((conf = dir->get("enabled")) != NULL) {
  2001 + engine->set("enabled", conf->dumps_arg0_to_boolean());
  2002 + }
  2003 +
  2004 + if ((conf = dir->get("iformat")) != NULL) {
  2005 + engine->set("iformat", conf->dumps_arg0_to_str());
  2006 + }
  2007 +
  2008 + if ((conf = dir->get("vfilter")) != NULL) {
  2009 + SrsAmf0Object* vfilter = SrsAmf0Any::object();
  2010 + engine->set("vfilter", vfilter);
  2011 +
  2012 + for (int i = 0; i < (int)conf->directives.size(); i++) {
  2013 + SrsConfDirective* sdir = conf->directives.at(i);
  2014 + vfilter->set(sdir->name, sdir->dumps_arg0_to_str());
  2015 + }
  2016 + }
  2017 +
  2018 + if ((conf = dir->get("vcodec")) != NULL) {
  2019 + engine->set("vcodec", conf->dumps_arg0_to_str());
  2020 + }
  2021 +
  2022 + if ((conf = dir->get("vbitrate")) != NULL) {
  2023 + engine->set("vbitrate", conf->dumps_arg0_to_number());
  2024 + }
  2025 +
  2026 + if ((conf = dir->get("vfps")) != NULL) {
  2027 + engine->set("vfps", conf->dumps_arg0_to_number());
  2028 + }
  2029 +
  2030 + if ((conf = dir->get("vwidth")) != NULL) {
  2031 + engine->set("vwidth", conf->dumps_arg0_to_number());
  2032 + }
  2033 +
  2034 + if ((conf = dir->get("vheight")) != NULL) {
  2035 + engine->set("vheight", conf->dumps_arg0_to_number());
  2036 + }
  2037 +
  2038 + if ((conf = dir->get("vthreads")) != NULL) {
  2039 + engine->set("vthreads", conf->dumps_arg0_to_number());
  2040 + }
  2041 +
  2042 + if ((conf = dir->get("vprofile")) != NULL) {
  2043 + engine->set("vprofile", conf->dumps_arg0_to_str());
  2044 + }
  2045 +
  2046 + if ((conf = dir->get("vpreset")) != NULL) {
  2047 + engine->set("vpreset", conf->dumps_arg0_to_str());
  2048 + }
  2049 +
  2050 + if ((conf = dir->get("vparams")) != NULL) {
  2051 + SrsAmf0Object* vparams = SrsAmf0Any::object();
  2052 + engine->set("vparams", vparams);
  2053 +
  2054 + for (int i = 0; i < (int)conf->directives.size(); i++) {
  2055 + SrsConfDirective* sdir = conf->directives.at(i);
  2056 + vparams->set(sdir->name, sdir->dumps_arg0_to_str());
  2057 + }
  2058 + }
  2059 +
  2060 + if ((conf = dir->get("acodec")) != NULL) {
  2061 + engine->set("acodec", conf->dumps_arg0_to_str());
  2062 + }
  2063 +
  2064 + if ((conf = dir->get("abitrate")) != NULL) {
  2065 + engine->set("abitrate", conf->dumps_arg0_to_number());
  2066 + }
  2067 +
  2068 + if ((conf = dir->get("asample_rate")) != NULL) {
  2069 + engine->set("asample_rate", conf->dumps_arg0_to_number());
  2070 + }
  2071 +
  2072 + if ((conf = dir->get("achannels")) != NULL) {
  2073 + engine->set("achannels", conf->dumps_arg0_to_number());
  2074 + }
  2075 +
  2076 + if ((conf = dir->get("aparams")) != NULL) {
  2077 + SrsAmf0Object* aparams = SrsAmf0Any::object();
  2078 + engine->set("aparams", aparams);
  2079 +
  2080 + for (int i = 0; i < (int)conf->directives.size(); i++) {
  2081 + SrsConfDirective* sdir = conf->directives.at(i);
  2082 + aparams->set(sdir->name, sdir->dumps_arg0_to_str());
  2083 + }
  2084 + }
  2085 +
  2086 + if ((conf = dir->get("oformat")) != NULL) {
  2087 + engine->set("oformat", conf->dumps_arg0_to_str());
  2088 + }
  2089 +
  2090 + if ((conf = dir->get("output")) != NULL) {
  2091 + engine->set("output", conf->dumps_arg0_to_str());
  2092 + }
  2093 +
  2094 + return ret;
  2095 +}
  2096 +
1823 string SrsConfig::config() 2097 string SrsConfig::config()
1824 { 2098 {
1825 return config_file; 2099 return config_file;
@@ -324,6 +324,12 @@ public: @@ -324,6 +324,12 @@ public:
324 * dumps the http_api sections to json for raw api info. 324 * dumps the http_api sections to json for raw api info.
325 */ 325 */
326 virtual int raw_to_json(SrsAmf0Object* obj); 326 virtual int raw_to_json(SrsAmf0Object* obj);
  327 +private:
  328 + /**
  329 + * dumps the engine section to amf0 object.
  330 + */
  331 + virtual int dumps_engine(SrsConfDirective* dir, SrsAmf0Object* engine);
  332 +public:
327 /** 333 /**
328 * get the config file path. 334 * get the config file path.
329 */ 335 */
@@ -937,7 +937,7 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -937,7 +937,7 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
937 if (vhost.empty()) { 937 if (vhost.empty()) {
938 ret = ERROR_SYSTEM_CONFIG_RAW_PARAMS; 938 ret = ERROR_SYSTEM_CONFIG_RAW_PARAMS;
939 srs_error("raw api query vhost invalid vhost=%s. ret=%d", vhost.c_str(), ret); 939 srs_error("raw api query vhost invalid vhost=%s. ret=%d", vhost.c_str(), ret);
940 - return ret; 940 + return srs_api_response_code(w, r, ret);
941 } 941 }
942 942
943 SrsConfDirective* root = _srs_config->get_root(); 943 SrsConfDirective* root = _srs_config->get_root();
@@ -945,7 +945,7 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) @@ -945,7 +945,7 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
945 if (!conf) { 945 if (!conf) {
946 ret = ERROR_SYSTEM_CONFIG_RAW_PARAMS; 946 ret = ERROR_SYSTEM_CONFIG_RAW_PARAMS;
947 srs_error("raw api query vhost invalid vhost=%s. ret=%d", vhost.c_str(), ret); 947 srs_error("raw api query vhost invalid vhost=%s. ret=%d", vhost.c_str(), ret);
948 - return ret; 948 + return srs_api_response_code(w, r, ret);
949 } 949 }
950 950
951 SrsAmf0Object* data = SrsAmf0Any::object(); 951 SrsAmf0Object* data = SrsAmf0Any::object();