diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 47ea846cb..822980deb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -84,6 +84,8 @@ jobs: run: | docker tag ossrs/srs:$SRS_TAG registry.cn-hangzhou.aliyuncs.com/ossrs/srs:$SRS_TAG docker push registry.cn-hangzhou.aliyuncs.com/ossrs/srs:$SRS_TAG + docker tag ossrs/srs:$SRS_TAG registry.cn-hangzhou.aliyuncs.com/ossrs/srs:v$SRS_MAJOR + docker push registry.cn-hangzhou.aliyuncs.com/ossrs/srs:v$SRS_MAJOR docker tag ossrs/srs:$SRS_TAG registry.cn-hangzhou.aliyuncs.com/ossrs/srs:$SRS_MAJOR docker push registry.cn-hangzhou.aliyuncs.com/ossrs/srs:$SRS_MAJOR diff --git a/trunk/3rdparty/httpx-static/.gitignore b/trunk/3rdparty/httpx-static/.gitignore index b691a2815..bf2764b21 100644 --- a/trunk/3rdparty/httpx-static/.gitignore +++ b/trunk/3rdparty/httpx-static/.gitignore @@ -5,3 +5,4 @@ letsencrypt.cache *.key objs .format.txt +.DS_Store diff --git a/trunk/3rdparty/httpx-static/README.md b/trunk/3rdparty/httpx-static/README.md index d82b7b7a6..0287304ec 100644 --- a/trunk/3rdparty/httpx-static/README.md +++ b/trunk/3rdparty/httpx-static/README.md @@ -2,6 +2,12 @@ A HTTP/HTTPS Server, support letsencrypt or self-sign HTTPS and proxying HTTP as HTTPS. +Docker for https://github.com/ossrs/go-oryx + +Build at https://code.aliyun.com/ossrs/go-oryx + +Images at https://cr.console.aliyun.com/repository/cn-hangzhou/ossrs/httpx/images + > Remark: Requires GO1.8+ ## Usage diff --git a/trunk/3rdparty/httpx-static/main.go b/trunk/3rdparty/httpx-static/main.go index 0e3c42002..39cffa1e3 100644 --- a/trunk/3rdparty/httpx-static/main.go +++ b/trunk/3rdparty/httpx-static/main.go @@ -36,6 +36,7 @@ import ( oh "github.com/ossrs/go-oryx-lib/http" "github.com/ossrs/go-oryx-lib/https" ol "github.com/ossrs/go-oryx-lib/logger" + "io/ioutil" "log" "net" "net/http" @@ -77,8 +78,77 @@ func shouldProxyURL(srcPath, proxyPath string) bool { return strings.HasPrefix(srcPath, proxyPath) } -func NewComplexProxy(ctx context.Context, proxyUrl *url.URL, originalRequest *http.Request) http.Handler { +// about x-real-ip and x-forwarded-for or +// about X-Real-IP and X-Forwarded-For or +// https://segmentfault.com/q/1010000002409659 +// https://distinctplace.com/2014/04/23/story-behind-x-forwarded-for-and-x-real-ip-headers/ +// @remark http proxy will set the X-Forwarded-For. +func addProxyAddToHeader(remoteAddr, realIP string, fwd []string, header http.Header, omitForward bool) { + rip, _, err := net.SplitHostPort(remoteAddr) + if err != nil { + return + } + + if realIP != "" { + header.Set("X-Real-IP", realIP) + } else { + header.Set("X-Real-IP", rip) + } + + if !omitForward { + header["X-Forwarded-For"] = fwd[:] + header.Add("X-Forwarded-For", rip) + } +} + +func filterByPreHook(ctx context.Context, preHook *url.URL, req *http.Request) error { + target := *preHook + target.RawQuery = strings.Join([]string{target.RawQuery, req.URL.RawQuery}, "&") + + api := target.String() + r, err := http.NewRequestWithContext(ctx, req.Method, api, nil) + if err != nil { + return err + } + + // Add real ip and forwarded for to header. + // We should append the forward for pass-by. + addProxyAddToHeader(req.RemoteAddr, req.Header.Get("X-Real-IP"), req.Header["X-Forwarded-For"], r.Header, false) + ol.Tf(ctx, "Pre-hook proxy addr req=%v, r=%v", req.Header, r.Header) + + r2, err := http.DefaultClient.Do(r) + if err != nil { + return err + } + defer r2.Body.Close() + + if r2.StatusCode != http.StatusOK { + return fmt.Errorf("Pre-hook HTTP StatusCode=%v %v", r2.StatusCode, r2.Status) + } + + b, err := ioutil.ReadAll(r2.Body) + if err != nil { + return err + } + ol.Tf(ctx, "Pre-hook %v url=%v, res=%v, headers=%v", req.Method, api, string(b), r.Header) + + return nil +} + +func NewComplexProxy(ctx context.Context, proxyUrl, preHook *url.URL, originalRequest *http.Request) http.Handler { + // Hook before proxy it. + if preHook != nil { + if err := filterByPreHook(ctx, preHook, originalRequest); err != nil { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ol.Ef(ctx, "Pre-hook err %+v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + }) + } + } + + // Start proxy it. proxy := &httputil.ReverseProxy{} + proxyUrlQuery := proxyUrl.Query() // Create a proxy which attach a isolate logger. elogger := log.New(os.Stderr, fmt.Sprintf("%v ", originalRequest.RemoteAddr), log.LstdFlags) @@ -94,27 +164,47 @@ func NewComplexProxy(ctx context.Context, proxyUrl *url.URL, originalRequest *ht } } - // about x-real-ip and x-forwarded-for or - // about X-Real-IP and X-Forwarded-For or - // https://segmentfault.com/q/1010000002409659 - // https://distinctplace.com/2014/04/23/story-behind-x-forwarded-for-and-x-real-ip-headers/ - // @remark http proxy will set the X-Forwarded-For. - if rip := r.Header.Get("X-Real-IP"); rip == "" { - if rip, _, err := net.SplitHostPort(r.RemoteAddr); err == nil { - r.Header.Set("X-Real-IP", rip) - } - } + // Add real ip and forwarded for to header. + // We should omit the forward header, because the ReverseProxy will doit. + addProxyAddToHeader(r.RemoteAddr, r.Header.Get("X-Real-IP"), r.Header["X-Forwarded-For"], r.Header, true) + ol.Tf(ctx, "Proxy addr header %v", r.Header) r.URL.Scheme = proxyUrl.Scheme r.URL.Host = proxyUrl.Host + // Trim the prefix path. + if trimPrefix := proxyUrlQuery.Get("trimPrefix"); trimPrefix != "" { + r.URL.Path = strings.TrimPrefix(r.URL.Path, trimPrefix) + } + // Aadd the prefix to path. + if addPrefix := proxyUrlQuery.Get("addPrefix"); addPrefix != "" { + r.URL.Path = addPrefix + r.URL.Path + } + + // The original request.Host requested by the client. + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Host + if r.Header.Get("X-Forwarded-Host") == "" { + r.Header.Set("X-Forwarded-Host", r.Host) + } + + // Set the Host of client request to the upstream server's, to act as client + // directly access the upstream server. + if proxyUrlQuery.Get("modifyRequestHost") != "false" { + r.Host = proxyUrl.Host + } + ra, url, rip := r.RemoteAddr, r.URL.String(), r.Header.Get("X-Real-Ip") ol.Tf(ctx, "proxy http rip=%v, addr=%v %v %v with headers %v", rip, ra, r.Method, url, r.Header) } proxy.ModifyResponse = func(w *http.Response) error { - // we already added this header, it will cause chrome failed when duplicated. - if w.Header.Get("Access-Control-Allow-Origin") == "*" { + // We have already set the server, so remove the upstream one. + if proxyUrlQuery.Get("keepUpsreamServer") != "true" { + w.Header.Del("Server") + } + + // We already added this header, it will cause chrome failed when duplicated. + if w.Header.Get("Access-Control-Allow-Origin") != "" { w.Header.Del("Access-Control-Allow-Origin") } @@ -164,6 +254,9 @@ func run(ctx context.Context) error { flag.Var(&oproxies, "p", "proxy ruler") flag.Var(&oproxies, "proxy", "one or more proxy the matched path to backend, for example, -proxy http://127.0.0.1:8888/api/webrtc") + var oprehooks Strings + flag.Var(&oprehooks, "pre-hook", "the pre-hook ruler, with request") + var sdomains, skeys, scerts Strings flag.Var(&sdomains, "sdomain", "the SSL hostname") flag.Var(&skeys, "skey", "the SSL key for domain") @@ -181,6 +274,12 @@ func run(ctx context.Context) error { fmt.Println(fmt.Sprintf(" The www root path. Supports relative to argv[0]=%v. Default: ./html", path.Dir(os.Args[0]))) fmt.Println(fmt.Sprintf(" -p, -proxy string")) fmt.Println(fmt.Sprintf(" Proxy path to backend. For example: http://127.0.0.1:8888/api/webrtc")) + fmt.Println(fmt.Sprintf(" Proxy path to backend. For example: http://127.0.0.1:8888/api/webrtc?modifyRequestHost=false")) + fmt.Println(fmt.Sprintf(" Proxy path to backend. For example: http://127.0.0.1:8888/api/webrtc?keepUpsreamServer=true")) + fmt.Println(fmt.Sprintf(" Proxy path to backend. For example: http://127.0.0.1:8888/api/webrtc?trimPrefix=/ffmpeg")) + fmt.Println(fmt.Sprintf(" Proxy path to backend. For example: http://127.0.0.1:8888/api/webrtc?addPrefix=/release")) + fmt.Println(fmt.Sprintf(" -pre-hook string")) + fmt.Println(fmt.Sprintf(" Pre-hook to backend, with request. For example: http://127.0.0.1:8888/api/stat")) fmt.Println(fmt.Sprintf("Options for HTTPS(letsencrypt cert):")) fmt.Println(fmt.Sprintf(" -l, -lets=bool")) fmt.Println(fmt.Sprintf(" Whether use letsencrypt CA. Default: false")) @@ -239,6 +338,27 @@ func run(ctx context.Context) error { ol.Tf(ctx, "Proxy %v to %v", proxyUrl.Path, oproxy) } + var preHookUrls []*url.URL + preHooks := make(map[string]*url.URL) + for _, oprehook := range []string(oprehooks) { + if oprehook == "" { + return oe.Errorf("empty pre-hook in %v", oprehooks) + } + + preHookUrl, err := url.Parse(oprehook) + if err != nil { + return oe.Wrapf(err, "parse pre-hook %v", oprehook) + } + + if _, ok := preHooks[preHookUrl.Path]; ok { + return oe.Errorf("pre-hook %v duplicated", preHookUrl.Path) + } + + preHookUrls = append(preHookUrls, preHookUrl) + preHooks[preHookUrl.Path] = preHookUrl + ol.Tf(ctx, "pre-hook %v to %v", preHookUrl.Path, oprehook) + } + if !path.IsAbs(cacheFile) && path.IsAbs(os.Args[0]) { cacheFile = path.Join(path.Dir(os.Args[0]), cacheFile) } @@ -272,13 +392,26 @@ func run(ctx context.Context) error { return } + // Find pre-hook to serve with proxy. + var preHook *url.URL + for _, preHookUrl := range preHookUrls { + if !shouldProxyURL(r.URL.Path, preHookUrl.Path) { + continue + } + + if p, ok := preHooks[preHookUrl.Path]; ok { + preHook = p + } + } + + // Find proxy to serve it. for _, proxyUrl := range proxyUrls { if !shouldProxyURL(r.URL.Path, proxyUrl.Path) { continue } if proxy, ok := proxies[proxyUrl.Path]; ok { - p := NewComplexProxy(ctx, proxy, r) + p := NewComplexProxy(ctx, proxy, preHook, r) p.ServeHTTP(w, r) return } diff --git a/trunk/3rdparty/httpx-static/version.go b/trunk/3rdparty/httpx-static/version.go index e6510d175..5302075c1 100644 --- a/trunk/3rdparty/httpx-static/version.go +++ b/trunk/3rdparty/httpx-static/version.go @@ -35,7 +35,7 @@ func VersionMinor() int { } func VersionRevision() int { - return 5 + return 18 } func Version() string { diff --git a/trunk/3rdparty/signaling/.gitignore b/trunk/3rdparty/signaling/.gitignore index 306de4702..28a12d9aa 100644 --- a/trunk/3rdparty/signaling/.gitignore +++ b/trunk/3rdparty/signaling/.gitignore @@ -16,3 +16,4 @@ .format.txt objs +.DS_Store diff --git a/trunk/3rdparty/srs-bench/.gitignore b/trunk/3rdparty/srs-bench/.gitignore index 589c6ab3a..45945c841 100644 --- a/trunk/3rdparty/srs-bench/.gitignore +++ b/trunk/3rdparty/srs-bench/.gitignore @@ -6,3 +6,4 @@ objs .DS_Store .format.txt +.DS_Store diff --git a/trunk/Dockerfile b/trunk/Dockerfile index fcccb08c0..bd37ef08c 100644 --- a/trunk/Dockerfile +++ b/trunk/Dockerfile @@ -32,4 +32,4 @@ COPY --from=build /usr/local/srs /usr/local/srs # Default workdir and command. WORKDIR /usr/local/srs -CMD ["./objs/srs", "-c", "conf/srs.conf"] +CMD ["./objs/srs", "-c", "conf/docker.conf"] diff --git a/trunk/conf/docker.conf b/trunk/conf/docker.conf index a819e3379..c8e4ede8d 100644 --- a/trunk/conf/docker.conf +++ b/trunk/conf/docker.conf @@ -1,4 +1,4 @@ -# main config for srs. +# docker config for srs. # @see full.conf for detail config. listen 1935; @@ -14,20 +14,10 @@ http_server { listen 8080; dir ./objs/nginx/html; } -stats { - network 0; - disk sda sdb xvda xvdb; -} rtc_server { - enabled on; - # Listen at udp://8000 - listen 8000; - # - # The $CANDIDATE means fetch from env, if not configed, use * as default. - # - # The * means retrieving server IP automatically, from all network interfaces, - # @see https://github.com/ossrs/srs/issues/307#issuecomment-599028124 - candidate $CANDIDATE; + enabled on; + listen 8000; + candidate $CANDIDATE; } vhost __defaultVhost__ { hls { @@ -39,6 +29,5 @@ vhost __defaultVhost__ { } rtc { enabled on; - bframe discard; } } diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index 0325860ab..8afb05aa3 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -230,11 +230,11 @@ http_api { # default: off allow_reload off; # whether enable rpc query. - # default: off - allow_query off; + # Always off by https://github.com/ossrs/srs/issues/2653 + #allow_query off; # whether enable rpc update. - # default: off - allow_update off; + # Always off by https://github.com/ossrs/srs/issues/2653 + #allow_update off; } # For https_api or HTTPS API. https { @@ -323,33 +323,6 @@ stream_caster { listen 8935; } -# RTSP -# It's deprecated and will be removed in the future, see [#2304](https://github.com/ossrs/srs/issues/2304#issuecomment-826009290). -stream_caster { - # whether stream caster is enabled. - # default: off - enabled on; - # the caster type of stream, the casters: - # rtsp, Real Time Streaming Protocol (RTSP). - caster rtsp; - # the output rtmp url. - # for rtsp caster, the typically output url: - # rtmp://127.0.0.1/[app]/[stream] - # for example, the rtsp url: - # rtsp://192.168.1.173:8544/live/livestream.sdp - # where the [app] is "live" and [stream] is "livestream", output is: - # rtmp://127.0.0.1/live/livestream - output rtmp://127.0.0.1/[app]/[stream]; - # the listen port for stream caster. - # for rtsp caster, listen at tcp port. for example, 554. - listen 554; - # for the rtsp caster, the rtp server local port over udp, - # which reply the rtsp setup request message, the port will be used: - # [rtp_port_min, rtp_port_max) - rtp_port_min 57200; - rtp_port_max 57300; -} - # FLV stream_caster { # whether stream caster is enabled. diff --git a/trunk/conf/http.api.raw.conf b/trunk/conf/http.api.raw.conf index df0180fbc..6c5531a60 100644 --- a/trunk/conf/http.api.raw.conf +++ b/trunk/conf/http.api.raw.conf @@ -11,8 +11,6 @@ http_api { raw_api { enabled on; allow_reload on; - allow_query on; - allow_update on; } } http_server { diff --git a/trunk/conf/push.rtsp.conf b/trunk/conf/push.rtsp.conf index 016a06796..ea17332e4 100644 --- a/trunk/conf/push.rtsp.conf +++ b/trunk/conf/push.rtsp.conf @@ -1,19 +1,2 @@ # push MPEG-TS over UDP to SRS. -# @see https://github.com/ossrs/srs/wiki/v2_CN_Streamer#push-mpeg-ts-over-udp -# @see https://github.com/ossrs/srs/issues/250#issuecomment-72321769 -# @see full.conf for detail config. - -listen 1935; -max_connections 1000; -daemon off; -srs_log_tank console; -stream_caster { - enabled on; - caster rtsp; - output rtmp://127.0.0.1/[app]/[stream]; - listen 554; - rtp_port_min 57200; - rtp_port_max 57300; -} -vhost __defaultVhost__ { -} +# @note Removed for https://github.com/ossrs/srs/issues/2304#issuecomment-826009290 diff --git a/trunk/conf/srs.conf b/trunk/conf/srs.conf index eb7725331..7f79f1150 100644 --- a/trunk/conf/srs.conf +++ b/trunk/conf/srs.conf @@ -3,8 +3,8 @@ listen 1935; max_connections 1000; -srs_log_tank file; -srs_log_file ./objs/srs.log; +#srs_log_tank file; +#srs_log_file ./objs/srs.log; daemon on; http_api { enabled on; @@ -15,6 +15,11 @@ http_server { listen 8080; dir ./objs/nginx/html; } +rtc_server { + enabled on; + listen 8000; + candidate $CANDIDATE; +} vhost __defaultVhost__ { hls { enabled on; @@ -23,4 +28,7 @@ vhost __defaultVhost__ { enabled on; mount [vhost]/[app]/[stream].flv; } + rtc { + enabled on; + } } diff --git a/trunk/configure b/trunk/configure index 51331458d..f69d0bfea 100755 --- a/trunk/configure +++ b/trunk/configure @@ -269,7 +269,7 @@ MODULE_FILES=("srs_app_server" "srs_app_conn" "srs_app_rtmp_conn" "srs_app_sourc "srs_app_ingest" "srs_app_ffmpeg" "srs_app_utility" "srs_app_edge" "srs_app_heartbeat" "srs_app_empty" "srs_app_http_client" "srs_app_http_static" "srs_app_recv_thread" "srs_app_security" "srs_app_statistic" "srs_app_hds" - "srs_app_mpegts_udp" "srs_app_rtsp" "srs_app_listener" "srs_app_async_call" + "srs_app_mpegts_udp" "srs_app_listener" "srs_app_async_call" "srs_app_caster_flv" "srs_app_latest_version" "srs_app_uuid" "srs_app_process" "srs_app_ng_exec" "srs_app_hourglass" "srs_app_dash" "srs_app_fragment" "srs_app_dvr" "srs_app_coworkers" "srs_app_hybrid" "srs_app_threads") diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 76c209a2b..e6bbe470e 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -27,6 +27,10 @@ The changelog for SRS. ## SRS 4.0 Changelog +* v4.0, 2021-10-10, Fix [#2304](https://github.com/ossrs/srs/issues/2304) Remove Push RTSP feature. v4.0.171 +* v4.0, 2021-10-10, Fix [#2653](https://github.com/ossrs/srs/issues/2653) Remove HTTP RAW API. v4.0.170 +* v4.0, 2021-10-08, Merge [#2654](https://github.com/ossrs/srs/pull/2654): Parse width and width from SPS/PPS. v4.0.169 +* v4.0, 2021-10-08, Default to log to console for docker. v4.0.168 * v4.0, 2021-10-07, Fix bugs #2648, #2415. v4.0.167 * v4.0, 2021-10-03, Support --arch and --cross-prefix for cross compile. 4.0.166 * v4.0, 2021-10-03, Actions: Create source tar file srs-server-4.0.165.tar.gz diff --git a/trunk/doc/Features.md b/trunk/doc/Features.md index 17dc967a4..96831107c 100644 --- a/trunk/doc/Features.md +++ b/trunk/doc/Features.md @@ -52,13 +52,13 @@ The features of SRS. - [x] [Experimental] Support MPEG-DASH, the future live streaming protocol, read [#299][bug #299]. - [x] [Experimental] Support pushing MPEG-TS over UDP, please read [bug #250][bug #250]. - [x] [Experimental] Support pushing FLV over HTTP POST, please read wiki([CN][v4_CN_Streamer2], [EN][v4_EN_Streamer2]). -- [x] [Experimental] Support HTTP RAW API, please read [#459][bug #459], [#470][bug #470], [#319][bug #319]. - [x] [Experimental] Support SRT server, read [#1147][bug #1147]. - [x] [Experimental] Support transmux RTC to RTMP, [#2093][bug #2093]. -- [x] [Deprecated] Support pushing RTSP, please read [bug #2304][bug #2304]. - [x] [Deprecated] Support Adobe HDS(f4m), please read wiki([CN][v4_CN_DeliveryHDS], [EN][v4_EN_DeliveryHDS]) and [#1535][bug #1535]. - [x] [Deprecated] Support bandwidth testing, please read [#1535][bug #1535]. - [x] [Deprecated] Support Adobe FMS/AMS token traverse([CN][v4_CN_DRM2], [EN][v4_EN_DRM2]) authentication, please read [#1535][bug #1535]. +- [x] [Removed] Support pushing RTSP, please read [#2304](https://github.com/ossrs/srs/issues/2304#issuecomment-826009290). +- [x] [Removed] Support HTTP RAW API, please read [#2653](https://github.com/ossrs/srs/issues/2653). - [x] [Removed] Support RTMP client library: [srs-librtmp](https://github.com/ossrs/srs-librtmp). - [ ] Support Windows/Cygwin 64bits, [#2532](https://github.com/ossrs/srs/issues/2532). - [ ] Support push stream by GB28181, [#1500][bug #1500]. diff --git a/trunk/research/arm/jmp_sp.cpp b/trunk/research/arm/jmp_sp.cpp index ddb3f56f2..9d26c68a2 100644 --- a/trunk/research/arm/jmp_sp.cpp +++ b/trunk/research/arm/jmp_sp.cpp @@ -1,5 +1,4 @@ /* - # see: https://github.com/ossrs/srs/issues/190 # see: https://github.com/ossrs/srs/wiki/v1_CN_SrsLinuxArm g++ -g -O0 -o jmp_sp jmp_sp.cpp arm-linux-gnueabi-g++ -g -o jmp_sp jmp_sp.cpp -static diff --git a/trunk/research/console/en_index.html b/trunk/research/console/en_index.html index 6c16c7d68..527a8f607 100644 --- a/trunk/research/console/en_index.html +++ b/trunk/research/console/en_index.html @@ -32,7 +32,6 @@
  • Streams
  • Clients
  • Config
  • -
  • DVR
  • Chinese
  • diff --git a/trunk/research/console/js/srs.cn.js b/trunk/research/console/js/srs.cn.js index 68d14d603..012afd574 100644 --- a/trunk/research/console/js/srs.cn.js +++ b/trunk/research/console/js/srs.cn.js @@ -12,9 +12,6 @@ scApp.config(["$routeProvider", function($routeProvider){ .when("/clients", {templateUrl:"views/clients.html", controller:"CSCClients"}) .when("/clients/:id", {templateUrl:"views/client.html", controller:"CSCClient"}) .when("/configs", {templateUrl:"views/configs.html", controller:"CSCConfigs"}) - .when("/configs/:id", {templateUrl:"views/config.html", controller:"CSCConfig"}) - .when("/dvr", {templateUrl:"views/dvrs.html", controller:"CSCDvrs"}) - .when("/dvr/:vid/:sid/:app/:stream", {templateUrl:"views/dvr.html", controller:"CSCDvr"}) .when("/summaries", {templateUrl:"views/summary.html", controller:"CSCSummary"}); }]); diff --git a/trunk/research/console/js/srs.console.js b/trunk/research/console/js/srs.console.js index 08ca7b77f..95c3a5d11 100644 --- a/trunk/research/console/js/srs.console.js +++ b/trunk/research/console/js/srs.console.js @@ -296,268 +296,18 @@ scApp.controller("CSCClient", ["$scope", "$routeParams", "MSCApi", "$sc_nav", "$ $sc_utility.log("trace", "Retrieve client info from SRS"); }]); -scApp.controller("CSCDvrs", ['$scope', '$routeParams', 'MSCApi', '$sc_nav', '$sc_utility', function($scope, $routeParams, MSCApi, $sc_nav, $sc_utility){ - $sc_nav.in_dvr(); - - $sc_utility.log("trace", "Please use DVR in streams."); -}]); - -scApp.controller("CSCDvr", ['$scope', '$routeParams', 'MSCApi', '$sc_nav', '$sc_utility', function($scope, $routeParams, MSCApi, $sc_nav, $sc_utility){ - $sc_nav.in_dvr(); - - $scope.vid = $routeParams.vid; - $scope.sid = $routeParams.sid; - $scope.app = $routeParams.app.replace('___', '/'); - $scope.stream = $routeParams.stream.replace('___', '/'); - - $sc_utility.refresh.stop(); - - $scope.dvr = function(conf) { - //console.log(apply); return; - - // submit to server. - $sc_utility.log("trace", "Submit to server for dvr apply=" + conf.value); - MSCApi.clients_update3("dvr", $scope.vid, $scope.app + '/' + $scope.stream, conf.value? 'enable':'disable', function(data){ - $sc_utility.log("trace", "Server accepted, dvr apply=" + conf.value); - conf.error = false; - }, function(){ - conf.error = true; - }); - - return true; - }; - - MSCApi.configs_get2($scope.vid, function(data){ - data.vhost.stream = $scope.stream; - data.vhost.app = $scope.app; - data.vhost.vid = $scope.vid; - data.vhost.sid = $scope.sid; - - var dvr = data.vhost.dvr; - if (!dvr) { - dvr = { - enabled: false - }; - } - if (dvr.dvr_apply) { - if (dvr.dvr_apply.length === 1 && dvr.dvr_apply[0] === "all") { - dvr.apply = true; - } else { - dvr.apply = system_array_contains(dvr.dvr_apply, $scope.app + '/' + $scope.stream); - } - } else { - dvr.apply = true; - } - console.log(data.vhost); - - $scope.global = $sc_utility.object2complex({}, data.vhost, null); - console.log($scope.global); - }); - - $sc_utility.log("trace", "Retrieve vhost config info from SRS"); -}]); - scApp.controller("CSCConfigs", ["$scope", "$location", "MSCApi", "$sc_nav", "$sc_utility", "$sc_server", function($scope, $location, MSCApi, $sc_nav, $sc_utility, $sc_server){ $sc_nav.in_configs(); $sc_utility.refresh.stop(); - $scope.support_raw_api = false; - $scope.warn_raw_api = false; - MSCApi.configs_raw(function(data){ $scope.http_api = data.http_api; - $scope.support_raw_api = $sc_utility.raw_api_enabled(data); - if (!$scope.support_raw_api) { - $scope.warn_raw_api = true; - return; - } - - MSCApi.configs_get(function(data){ - //console.log(data.global); - $scope.global = $sc_utility.object2complex({}, data.global, null); - //console.log($scope.global); - }); - }, function(data){ - $scope.warn_raw_api = true; }); - // operate vhost in client. - $scope.new_vhost = function() { - $scope.global.vhosts.push({ - editable: true - }); - }; - - $scope.edit_vhost = function(vhost) { - vhost.editable = true; - }; - - $scope.cancel_vhost = function(vhost) { - vhost.editable = false; - vhost.name = vhost.vid; - }; - - $scope.abort_vhost = function(vhost) { - system_array_remove($scope.global.vhosts, vhost); - }; - - // submit vhost to server - $scope.add_vhost = function(vhost) { - if (system_array_contains($scope.global.vhosts, function(e){ return vhost !== e && vhost.name === e.name; })) { - $sc_utility.log("warn", "vhost " + vhost.name + "已经存在"); - return; - } - - MSCApi.clients_update2("vhost", vhost.name, "create", function(data){ - $sc_utility.copy_object(vhost, data.data); - vhost.enabled = true; - vhost.editable = false; - - $sc_utility.log("trace", "创建vhost成功"); - }); - - $sc_utility.log("trace", "提交vhost到服务器"); - }; - - $scope.update_vhost = function(vhost) { - if (vhost.vid === vhost.name) { - $sc_utility.log("warn", "Vhost没有任何改变"); - return; - } - - MSCApi.clients_update3("vhost", vhost.vid, vhost.name, "update", function(data){ - vhost.vid = vhost.name; - vhost.editable = false; - $sc_utility.log("trace", "修改vhost成功"); - }); - $sc_utility.log("trace", "提交修改vhost请求到服务器"); - }; - - $scope.delete_vhost= function(vhost) { - MSCApi.clients_update2("vhost", vhost.vid, "delete", function(data){ - system_array_remove($scope.global.vhosts, vhost); - $sc_utility.log("trace", "删除vhost成功"); - }); - $sc_utility.log("trace", "提交删除vhost请求到服务器"); - }; - - $scope.disable_vhost = function(vhost) { - MSCApi.clients_update2("vhost", vhost.vid, "disable", function(data){ - vhost.enabled = false; - $sc_utility.log("trace", "禁用vhost成功"); - }); - $sc_utility.log("trace", "提交禁用vhost请求到服务器"); - }; - - $scope.enable_vhost = function(vhost) { - MSCApi.clients_update2("vhost", vhost.vid, "enable", function(data){ - vhost.enabled = true; - $sc_utility.log("trace", "启用vhost成功"); - }); - $sc_utility.log("trace", "提交启用vhost请求到服务器"); - }; - - // submit global config to server. - $scope.submit = function(conf) { - if (typeof conf.value !== "boolean" && !conf.value) { - $sc_utility.log("warn", "global." + conf.key + " should not be empty"); - return false; - } - - var v = conf.value; - if (conf.key === "listen") { - if (!system_array_foreach(v, function(e){ return e; })) { - $sc_utility.log("warn", "listen should not be empty"); - return false; - } - } else if (conf.key === "pid") { - if (!system_string_startswith(v, ['./', '/var/', '/tmp/'])) { - $sc_utility.log("warn", "pid should starts with ./, /var/ or /tmp/"); - return false; - } - if (!system_string_endswith(v, '.pid')) { - $sc_utility.log("warn", "pid should be *.pid"); - return false; - } - } else if (conf.key === "chunk_size") { - if (parseInt(v) < 128 || parseInt(v) > 65535) { - $sc_utility.log("warn", "chunk_size should in [128, 65535], value=" + v); - return false; - } - } else if (conf.key === "ff_log_dir") { - if (v !== '/dev/null' && !system_string_startswith(v, ['/var/', '/tmp/', './'])) { - $sc_utility.log("warn", "ff_log_dir should be /dev/null or in ./, /var/ or /tmp/"); - return false; - } - } else if (conf.key === "srs_log_tank") { - if (v !== "file" && v !== "console") { - $sc_utility.log("warn", "srs_log_tank should be file or console"); - return false; - } - } else if (conf.key === "srs_log_level") { - if (v !== "verbose" && v !== "info" && v !== "trace" && v !== "warn" && v !== "error") { - $sc_utility.log("warn", "srs_log_level should be verbose, info, trace, warn, error"); - return false; - } - } else if (conf.key === "srs_log_file") { - if (!system_string_startswith(v, ['./', '/var/', '/tmp/'])) { - $sc_utility.log("warn", "srs_log_file should be in ./, /var/ or /tmp/"); - return false; - } - if (!system_string_endswith(v, '.log')) { - $sc_utility.log("warn", "srs_log_file should be *.log"); - return false; - } - } else if (conf.key === "max_connections") { - if (parseInt(v) < 10 || parseInt(v) > 65535) { - $sc_utility.log("warn", "max_connections should in [10, 65535], value=" + v); - return false; - } - } else if (conf.key === "utc_time") { - if (v === undefined) { - $sc_utility.log("warn", "utc_time invalid"); - return false; - } - } else if (conf.key === "pithy_print_ms") { - if (parseInt(v) < 100 || parseInt(v) > 300000) { - $sc_utility.log("warn", "pithy_print_ms invalid"); - return false; - } - } - - // submit to server. - $sc_utility.log("trace", "Submit to server ok, " + conf.key + "=" + conf.value); - MSCApi.clients_update(conf.key, conf.value, function(data){ - $sc_utility.log("trace", "Server accepted, " + conf.key + "=" + conf.value); - conf.error = false; - - // reload the rtmp service port when port changed. - if (conf.key === "listen") { - $sc_server.init($location, MSCApi); - } - }, function(){ - conf.error = true; - }); - - return true; - }; - $sc_utility.log("trace", "Retrieve config info from SRS"); }]); -scApp.controller("CSCConfig", ["$scope", "$routeParams", "MSCApi", "$sc_nav", "$sc_utility", function($scope, $routeParams, MSCApi, $sc_nav, $sc_utility){ - $sc_nav.in_configs(); - - $sc_utility.refresh.stop(); - - MSCApi.configs_get2($routeParams.id, function(data){ - $scope.vhost = data.vhost; - }); - - $sc_utility.log("trace", "Retrieve vhost config info from SRS"); -}]); - scApp.factory("MSCApi", ["$http", "$sc_server", function($http, $sc_server){ return { versions_get: function(success) { @@ -607,38 +357,6 @@ scApp.factory("MSCApi", ["$http", "$sc_server", function($http, $sc_server){ var url = $sc_server.jsonp_query("/api/v1/raw", "rpc=query&scope=global"); $http.jsonp(url).success(success); }, - configs_get2: function(id, success) { - var url = $sc_server.jsonp_query("/api/v1/raw", "rpc=query&scope=vhost&vhost=" + id); - $http.jsonp(url).success(success); - }, - configs_get3: function(success) { - var url = $sc_server.jsonp_query("/api/v1/raw", "rpc=query&scope=minimal"); - $http.jsonp(url).success(success); - }, - clients_update: function(scope, value, success, error) { - var query = "rpc=update&scope=" + scope + "&value=" + value; - var url = $sc_server.jsonp_query("/api/v1/raw", query); - var obj = $http.jsonp(url).success(success); - if (error) { - obj.error(error); - } - }, - clients_update2: function(scope, value, param, success, error) { - var query = "rpc=update&scope=" + scope + "&value=" + value + "¶m=" + param; - var url = $sc_server.jsonp_query("/api/v1/raw", query); - var obj = $http.jsonp(url).success(success); - if (error) { - obj.error(error); - } - }, - clients_update3: function(scope, value, data, param, success, error) { - var query = "rpc=update&scope=" + scope + "&value=" + value + "¶m=" + param + "&data=" + data; - var url = $sc_server.jsonp_query("/api/v1/raw", query); - var obj = $http.jsonp(url).success(success); - if (error) { - obj.error(error); - } - } }; }]); @@ -883,9 +601,6 @@ scApp.provider("$sc_nav", function(){ in_configs: function(){ this.selected = "/configs"; }, - in_dvr: function(){ - this.selected = "/dvr"; - }, go_summary: function($location){ $location.path("/summaries"); }, @@ -970,13 +685,6 @@ scApp.provider("$sc_server", [function(){ } else { self.port = $location.port(); } - - // optional, init the rtmp port. - MSCApi.configs_get3(function(data){ - if (data.minimal) { - self.rtmp = data.minimal.listen; - } - }); } }; return self; diff --git a/trunk/research/console/js/srs.en.js b/trunk/research/console/js/srs.en.js index af9999165..eb3e26f06 100644 --- a/trunk/research/console/js/srs.en.js +++ b/trunk/research/console/js/srs.en.js @@ -12,9 +12,6 @@ scApp.config(["$routeProvider", function($routeProvider){ .when("/clients", {templateUrl:"views/clients_en.html", controller:"CSCClients"}) .when("/clients/:id", {templateUrl:"views/client_en.html", controller:"CSCClient"}) .when("/configs", {templateUrl:"views/configs_en.html", controller:"CSCConfigs"}) - .when("/configs/:id", {templateUrl:"views/config_en.html", controller:"CSCConfig"}) - .when("/dvr", {templateUrl:"views/dvrs_en.html", controller:"CSCDvrs"}) - .when("/dvr/:vid/:sid/:app/:stream", {templateUrl:"views/dvr_en.html", controller:"CSCDvr"}) .when("/summaries", {templateUrl:"views/summary_en.html", controller:"CSCSummary"}); }]); diff --git a/trunk/research/console/ng_index.html b/trunk/research/console/ng_index.html index 7d17d2209..a141d9eff 100644 --- a/trunk/research/console/ng_index.html +++ b/trunk/research/console/ng_index.html @@ -32,7 +32,6 @@
  • 视频流
  • 客户端
  • 配置
  • -
  • DVR
  • English
  • diff --git a/trunk/research/console/views/config.html b/trunk/research/console/views/config.html deleted file mode 100644 index 503b52c05..000000000 --- a/trunk/research/console/views/config.html +++ /dev/null @@ -1,1007 +0,0 @@ -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.id{{vhost.id}}Vhost的统计信息,必须有访问时才会有数据.
    vhost.id{{vhost.id}}该Vhost没有任何访问客户端,无统计信息.
    vhost.enabled{{vhost.enabled| sc_filter_enabled}}Vhost是否启用。默认: {{true| sc_filter_enabled}}
    vhost.name{{vhost.name}}Vhost的名称,即客户的服务域名,或者虚拟主机名,服务器上不能重名。
    vhost.chunk_size{{vhost.chunk_size}}RTMP Chunk大小,即分包大小。默认: 全局的chunk_size
    vhost.min_latency{{vhost.min_latency| sc_filter_enabled}}是否开启最小延迟配置,将设置vhost.publish.mr=off。默认: {{false| sc_filter_enabled}}
    vhost.tcp_nodelay{{vhost.tcp_nodelay| sc_filter_enabled}}是否设置TCP_NODELAY,将包及时发送到客户端,但严重影响性能。默认: {{false| sc_filter_enabled}}
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.cluster.mode{{vhost.cluster.mode}}RTMP/FLV流集群模式的类型,local为源站,remote为边缘。默认: local
    vhost.cluster.origin{{vhost.cluster.origin}}边缘模式时,回源的源站服务器地址。
    vhost.cluster.token_traverse{{vhost.cluster.token_traverse| sc_filter_enabled}}RTMP Edge防盗链,将连接信息传递给Origin源站验证。默认: {{false| sc_filter_enabled}}
    vhost.cluster.vhost{{vhost.cluster.vhost}}边缘模式时,回源的vhost,可以改变vhost回源。
    vhost.cluster.debug_srs_upnode{{vhost.cluster.debug_srs_upnode| sc_filter_enabled}}连接上层节点时发送本节点信息,影响所有连接服务器的地方如回源。默认: {{true| sc_filter_enabled}}
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.forward.enabled{{vhost.forward.enabled| sc_filter_enabled}}是否开启Forward。默认: {{false| sc_filter_enabled}}
    vhost.forward.destination{{vhost.forward.destination}}转发的服务器列表,同时转发给这些服务器。
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.play.gop_cache{{vhost.play.gop_cache| sc_filter_enabled}}是否开启GopCache,可快速启动播放。默认: {{true| sc_filter_enabled}}
    vhost.play.queue_length{{vhost.play.queue_length}}秒。队列的最大长度,超过后清空队列。默认: 30
    vhost.play.time_jitter{{vhost.play.time_jitter}}时间戳校正算法。full: 完全校正;zero: 零校正;off: 关闭。默认: full
    vhost.play.mix_correct{{vhost.play.mix_correct| sc_filter_enabled}}是否开启MixCorrect,混合单增校正算法。默认: {{false| sc_filter_enabled}}
    vhost.play.atc{{vhost.play.atc| sc_filter_enabled}}是否开启ATC,绝对时间戳。启用后将设置vhost.play.time_jitter为off。默认: {{false| sc_filter_enabled}}
    vhost.play.atc_auto{{vhost.play.atc_auto| sc_filter_enabled}}是否开启自动ATC。metadata中bravo_atc="true"时自动开启ATC。默认: {{false| sc_filter_enabled}}
    vhost.play.mw_latency{{vhost.play.mw_latency}}毫秒。合并写入延迟,同时将多少毫秒的包一次写入,writev高性能的关键配置。默认: 350
    vhost.play.send_min_interval{{vhost.play.send_min_interval}}毫秒。每个包发送的间隔。能控制发包间隔,但严重影响性能;0表示关闭。默认: 0
    vhost.play.reduce_sequence_header{{vhost.play.reduce_sequence_header| sc_filter_enabled}}是否去掉重复的SequenceHeader,有些编码器不能接收重复的sps/pps。默认: {{false| sc_filter_enabled}}
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.publish.mr{{vhost.publish.mr| sc_filter_enabled}}是否开启合并读,推流客户端较多时能提高性能。默认: {{false| sc_filter_enabled}}
    vhost.publish.mr_latency{{vhost.publish.mr_latency}}毫秒。合并读的延迟,即至少等一定毫秒才读包。默认: 350
    vhost.publish.firstpkt_timeout{{vhost.publish.firstpkt_timeout}}毫秒。发布客户端首包超时的时间。默认: 20000
    vhost.publish.normal_timeout{{vhost.publish.normal_timeout}}毫秒。发布客户端非首包超时的时间。默认: 5000
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.refer.enabled{{vhost.refer.enabled| sc_filter_enabled}}是否开启Referer防盗链机制。默认: {{false| sc_filter_enabled}}
    vhost.refer.all{{vhost.refer.all}}针对play和publish都有效的Referer设置。
    vhost.refer.play{{vhost.refer.play}}只针对play有效的Referer设置。
    vhost.refer.publish{{vhost.refer.publish}}只针对publish有效的Referer设置。
    vhost.cluster.token_traverse{{vhost.cluster.token_traverse| sc_filter_enabled}}RTMP Edge防盗链,将连接信息传递给Origin源站验证。默认: {{false| sc_filter_enabled}}
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.bandcheck.enabled{{vhost.bandcheck.enabled| sc_filter_enabled}}是否开启测速配置。默认: {{false| sc_filter_enabled}}。
    vhost.bandcheck.key{{vhost.bandcheck.key}}带宽测速的Key,客户端必须指定合法的Key才能测速。
    vhost.bandcheck.interval{{vhost.bandcheck.interval}}秒。带宽测速的间隔,低于这个间隔不提供服务。默认: 30。
    vhost.bandcheck.limit_kbps{{vhost.bandcheck.limit_kbps}}Kbps。带宽测速的上限速度。默认: 1000。
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.security.enabled{{vhost.security.enabled| sc_filter_enabled}}是否开启安全设置。默认: {{false| sc_filter_enabled}}。
    vhost.security.{{allow.action}}{{allow.action}} {{allow.method}} {{allow.entry}}{{allow| sc_filter_security}}
    vhost.security.{{deny.action}}{{deny.action}} {{deny.method}} {{deny.entry}}{{deny| sc_filter_security}}
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.http_static.enabled{{vhost.http_static.enabled| sc_filter_enabled}}是否开启Vhost的HTTP静态配置。默认: {{false| sc_filter_enabled}}。
    vhost.http_static.mount{{vhost.http_static.mount}}Vhost特殊的挂载信息。默认: [vhost]/。
    vhost.http_static.dir{{vhost.http_static.dir}}Vhost的主目录。
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.http_remux.enabled{{vhost.http_remux.enabled| sc_filter_enabled}}是否开启Vhost的HTTP流服务器配置。默认: {{false| sc_filter_enabled}}。
    vhost.http_remux.fast_cache{{vhost.http_remux.fast_cache}}秒。音频流的预缓存时间,只对aac/mp3等纯音频流有效。默认: 30。
    vhost.http_remux.mount{{vhost.http_remux.mount}}挂载点,即用户的访问路径。默认: [vhost]/[app]/[stream].flv。
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.http_hooks.enabled{{vhost.http_hooks.enabled| sc_filter_enabled}}是否开启Vhost的HTTP回调配置。默认: {{false| sc_filter_enabled}}。
    vhost.http_hooks.on_connecthooks当RTMP客户端Connect时的回调,知道了tcUrl,但不知道Type和StreamName。
    vhost.http_hooks.on_closehooks当RTMP客户端Close时的回调,即断开连接时。
    vhost.http_hooks.on_publishhooks当RTMP客户端Publish时的回调,知道了类型和StreamName。
    vhost.http_hooks.on_unpublishhooks当RTMP客户端UnPublish时的回调,即停止推流。
    vhost.http_hooks.on_playhooks当RTMP客户端Play时的回调,知道了类型和StreamName。
    vhost.http_hooks.on_stophooks当RTMP客户端Stop时的回调,即停止播放时。
    vhost.http_hooks.on_dvrhooks当服务器DVR关闭文件时的回调。
    vhost.http_hooks.on_hlshooks当服务器HLS关闭TS切片文件时的回调,支持多个地址,通知系统HLS切片生成了。
    vhost.http_hooks.on_hls_notifyhooks当服务器HLS更新流信息(一般是关闭切片),只支持一个地址,可用来访问CDN做预取。
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.exec.enabled{{vhost.exec.enabled| sc_filter_enabled}}是否开启Vhost的EXEC配置。默认: {{false| sc_filter_enabled}}。
    vhost.exec.publishEXEC发布流时的EXEC配置。
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.hls.enabled{{vhost.hls.enabled| sc_filter_enabled}}是否支持HLS输出。默认: {{false| sc_filter_enabled}}。
    vhost.hls.hls_fragment{{vhost.hls.hls_fragment}}秒。HLS的TS切片的长度。默认: 10。
    vhost.hls.hls_td_ratio{{vhost.hls.hls_td_ratio}}HLS的#EXT-X-TARGETDURATION的值,为hls_fragment的默认倍数。默认: 1.5。
    vhost.hls.hls_aof_ratio{{vhost.hls.hls_aof_ratio}}纯音频的溢出倍数,当TS切片超过溢出时长时就生成切片。默认: 2.0。
    vhost.hls.hls_window{{vhost.hls.hls_window}}秒。HLS的TS切片的窗口,即m3u8中有多少个TS切片。默认: 60。
    vhost.hls.hls_on_error{{vhost.hls.hls_on_error}} - 错误时,ignore: 忽略并禁用HLS;disconnect: 断开推流连接; - continue: 继续再试。默认: ignore -
    vhost.hls.hls_path{{vhost.hls.hls_path}}HLS的存储目录。默认: ./objs/nginx/html。
    vhost.hls.hls_m3u8_file{{vhost.hls.hls_m3u8_file}}m3u8文件模板。默认: [app]/[stream].m3u8
    vhost.hls.hls_ts_file{{vhost.hls.hls_ts_file}}ts文件模板。默认: [app]/[stream]-[seq].ts
    vhost.hls.hls_ts_floor{{vhost.hls.hls_ts_floor| sc_filter_enabled}}是否开启TS文件名递增算法。默认: {{false| sc_filter_enabled}}
    vhost.hls.hls_entry_prefix{{vhost.hls.hls_entry_prefix}}HLS的TS切片的前缀。
    vhost.hls.hls_acodec{{vhost.hls.hls_acodec}}HLS默认的音频编码。默认: aac
    vhost.hls.hls_vcodec{{vhost.hls.hls_vcodec}}HLS默认的视频编码。默认: h264
    vhost.hls.hls_cleanup{{vhost.hls.hls_cleanup| sc_filter_enabled}}是否清理超过窗口的TS切片。默认: {{true| sc_filter_enabled}}
    vhost.hls.hls_dispose{{vhost.hls.hls_dispose}}秒。HLS没有收到数据时清理的超时时间。0表示禁用。默认: 0
    vhost.hls.hls_nb_notify{{vhost.hls.hls_nb_notify}}HLS请求on_hls_notify读取内容的最大长度。默认: 64
    vhost.hls.hls_wait_keyframe{{vhost.hls.hls_wait_keyframe| sc_filter_enabled}}关闭TS切片时是否等待关键帧。默认: {{true| sc_filter_enabled}}
    vhost.http_hooks.on_hlshooks当服务器HLS关闭TS切片文件时的回调,支持多个地址,通知系统HLS切片生成了。
    vhost.http_hooks.on_hls_notifyhooks当服务器HLS更新流信息(一般是关闭切片),只支持一个地址,可用来访问CDN做预取。
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.hds.enabled{{vhost.hds.enabled| sc_filter_enabled}}是否分发HDS流。默认: {{false| sc_filter_enabled}}。
    vhost.hds.hds_fragment{{vhost.hds.hds_fragment}}秒。HDS的f4v切片的长度。默认: 10。
    vhost.hds.hds_window{{vhost.hds.hds_window}}秒。HDS的f4v切片的窗口,即f4m中有多少个f4v切片。默认: 60。
    vhost.hds.hds_path{{vhost.hds.hds_path}}HDS的存储目录。默认: ./objs/nginx/html。
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.dvr.enabled{{vhost.dvr.enabled| sc_filter_enabled}}是否开启直播录制。默认: {{false| sc_filter_enabled}}。
    vhost.dvr.dvr_plan{{vhost.dvr.dvr_plan}}录制计划,session: 按Session;segment: 分段;append: 一个文件。默认: session
    vhost.dvr.dvr_applyFilters录制应用的目标,all表示所有流,app/stream指定特定的流。默认: all
    vhost.dvr.dvr_pathPATH录制文件的模板。默认: ./objs/nginx/html/[app]/[stream].[timestamp].flv
    vhost.dvr.dvr_duration{{vhost.dvr.dvr_duration}}秒。segment计划时,录制文件的时长。默认: 30
    vhost.dvr.dvr_wait_keyframe{{vhost.dvr.dvr_wait_keyframe| sc_filter_enabled}}segment计划时,关闭文件时是否等待关键帧。默认: {{true| sc_filter_enabled}}。
    vhost.dvr.time_jitter{{vhost.dvr.time_jitter}}时间戳校正算法。full: 完全校正;zero: 零校正;off: 关闭。默认: full
    vhost.http_hooks.on_dvrhooks当服务器DVR关闭文件时的回调。
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    ingest.enabled{{ingest.enabled| sc_filter_enabled}}是否开启采集。默认: {{false| sc_filter_enabled}}。
    ingest.input.type{{ingest.input.type}}采集的类型,file: 文件;stream: 流。默认: file
    ingest.input.urlURL采集的地址。
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    engine.enabled{{engine.enabled| sc_filter_enabled}}是否开启转码引擎。默认: {{false| sc_filter_enabled}}。
    engine.iformat{{engine.iformat}}引擎的输入格式,即"-i v"。默认: flv
    engine.vfilter

    -{{fk}} {{fv}}

    引擎的视频参数,譬如滤镜,在"-i"和"-vcodec"之间的参数。
    engine.vcodec{{engine.vcodec}}引擎的视频编码器,即"-vcodec v",可以是libx264,copy,vn
    engine.vbitrate{{engine.vbitrate}}Kbps。编码器输出的视频码率,即"-v:b v"。0表示跟随源。默认: 0
    engine.vfps{{engine.vfps}}fps。编码器输出的视频帧率,即"-r v"。0表示跟随源。默认: 0
    engine.vwidth{{engine.vwidth}}px。编码器输出的视频宽度,即"-s v"。0表示跟随源。默认: 0
    engine.vheight{{engine.vheight}}px。编码器输出的视频高度,即"-s v"。0表示跟随源。默认: 0
    engine.vthreads{{engine.vthreads}}编码器使用的最多线程数,即"-thread v"。默认: 1
    engine.vprofile{{engine.vprofile}}视频的编码profile,即"-profile:v v",可以是high,main,baseline
    engine.vpreset{{engine.vpreset}}视频的编码preset,即"-preset v",可以是medium,slow,slower,veryslow,placebo
    engine.vparams

    -{{fk}} {{fv}}

    引擎的视频转码参数,譬如264的参数,在"-vpreset"和"-acodec"之前的参数。
    engine.acodec{{engine.acodec}}音频编码器,即"-acodec v",可以是libfdk_aac,copy,an
    engine.abitrate{{engine.abitrate}}Kbps。编码器输出的音频码率,即"-b:a v"。0表示跟随源。默认: 0
    engine.asample_rate{{engine.asample_rate}}编码器输出的音频采样率,即"-ar v"。0表示跟随源。默认: 0
    engine.achannels{{engine.achannels}}编码器输出的音频声道,即"-ac v"。0表示跟随源。默认: 0
    engine.aparams

    -{{fk}} {{fv}}

    引擎的音频转码参数,譬如aac的参数,在"-ac"和"-f"/"-y"之前的参数。
    engine.oformat{{engine.oformat}}编码器输出的格式,可选。默认: flv
    engine.outputURL编码器输出的url,可以使用变量[vhost],[port],[app],[stream],[engine]
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - -
    KeyValueDescription
    transcode.enabled{{transcode.enabled| sc_filter_enabled}}是否开启转码。默认: {{false| sc_filter_enabled}}。
    transcode.ffmpeg{{transcode.ffmpeg}}编码器的地址。
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    engine.enabled{{engine.enabled| sc_filter_enabled}}是否开启转码引擎。默认: {{false| sc_filter_enabled}}。
    engine.iformat{{engine.iformat}}引擎的输入格式,即"-i v"。默认: flv
    engine.vfilter

    -{{fk}} {{fv}}

    引擎的视频参数,譬如滤镜,在"-i"和"-vcodec"之间的参数。
    engine.vcodec{{engine.vcodec}}引擎的视频编码器,即"-vcodec v",可以是libx264,copy,vn
    engine.vbitrate{{engine.vbitrate}}Kbps。编码器输出的视频码率,即"-v:b v"。0表示跟随源。默认: 0
    engine.vfps{{engine.vfps}}fps。编码器输出的视频帧率,即"-r v"。0表示跟随源。默认: 0
    engine.vwidth{{engine.vwidth}}px。编码器输出的视频宽度,即"-s v"。0表示跟随源。默认: 0
    engine.vheight{{engine.vheight}}px。编码器输出的视频高度,即"-s v"。0表示跟随源。默认: 0
    engine.vthreads{{engine.vthreads}}编码器使用的最多线程数,即"-thread v"。默认: 1
    engine.vprofile{{engine.vprofile}}视频的编码profile,即"-profile:v v",可以是high,main,baseline
    engine.vpreset{{engine.vpreset}}视频的编码preset,即"-preset v",可以是medium,slow,slower,veryslow,placebo
    engine.vparams

    -{{fk}} {{fv}}

    引擎的视频转码参数,譬如264的参数,在"-vpreset"和"-acodec"之前的参数。
    engine.acodec{{engine.acodec}}音频编码器,即"-acodec v",可以是libfdk_aac,copy,an
    engine.abitrate{{engine.abitrate}}Kbps。编码器输出的音频码率,即"-b:a v"。0表示跟随源。默认: 0
    engine.asample_rate{{engine.asample_rate}}编码器输出的音频采样率,即"-ar v"。0表示跟随源。默认: 0
    engine.achannels{{engine.achannels}}编码器输出的音频声道,即"-ac v"。0表示跟随源。默认: 0
    engine.aparams

    -{{fk}} {{fv}}

    引擎的音频转码参数,譬如aac的参数,在"-ac"和"-f"/"-y"之前的参数。
    engine.oformat{{engine.oformat}}编码器输出的格式,可选。默认: flv
    engine.outputURL编码器输出的url,可以使用变量[vhost],[port],[app],[stream],[engine]
    -
    -
    -
    -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/trunk/research/console/views/config_en.html b/trunk/research/console/views/config_en.html deleted file mode 100644 index bbf0d0fcb..000000000 --- a/trunk/research/console/views/config_en.html +++ /dev/null @@ -1,1004 +0,0 @@ -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.id{{vhost.id}}Vhost statistic.
    vhost.id{{vhost.id}}No clients.
    vhost.enabled{{vhost.enabled| sc_filter_enabled}}Whether vhost is enabled. Default is {{true| sc_filter_enabled}}
    vhost.name{{vhost.name}}The name of vhost.
    vhost.chunk_size{{vhost.chunk_size}}The size of RTMP chunk. Default to global chunk size.
    vhost.min_latency{{vhost.min_latency| sc_filter_enabled}}Whether low latency enabled. Default is {{false| sc_filter_enabled}}
    vhost.tcp_nodelay{{vhost.tcp_nodelay| sc_filter_enabled}}Whether enable TCP_NODELAY. Default is {{false| sc_filter_enabled}}
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.cluster.mode{{vhost.cluster.mode}}The type of cluster, local is origin server, remote is edge. Default is local
    vhost.cluster.origin{{vhost.cluster.origin}}For edge, the upstream server address.
    vhost.cluster.token_traverse{{vhost.cluster.token_traverse| sc_filter_enabled}}For RTMP edge, traverse token to upstream to verify. Default is {{false| sc_filter_enabled}}
    vhost.cluster.vhost{{vhost.cluster.vhost}}For edge, the transform vhost to connect to upstream.
    vhost.cluster.debug_srs_upnode{{vhost.cluster.debug_srs_upnode| sc_filter_enabled}}For edge, local information to connect to upstream. Default is {{true| sc_filter_enabled}}
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.forward.enabled{{vhost.forward.enabled| sc_filter_enabled}}Whether enable forward. Default is {{false| sc_filter_enabled}}
    vhost.forward.destination{{vhost.forward.destination}}The server list to forward to.
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.play.gop_cache{{vhost.play.gop_cache| sc_filter_enabled}}Whether gop cache is enabled. Default is {{true| sc_filter_enabled}}
    vhost.play.queue_length{{vhost.play.queue_length}}The max queue length in seconds. Default is 30
    vhost.play.time_jitter{{vhost.play.time_jitter}}The time jitter algorithm, can be full, zero or off. Default is full
    vhost.play.mix_correct{{vhost.play.mix_correct| sc_filter_enabled}}Whether mix correct is enabled. Default is {{false| sc_filter_enabled}}
    vhost.play.atc{{vhost.play.atc| sc_filter_enabled}}Whether atc is enabled. Default is {{false| sc_filter_enabled}}
    vhost.play.atc_auto{{vhost.play.atc_auto| sc_filter_enabled}}Whether auto enable atc by metadata. Default is {{false| sc_filter_enabled}}
    vhost.play.mw_latency{{vhost.play.mw_latency}}Merge latency in ms. Default is 350
    vhost.play.send_min_interval{{vhost.play.send_min_interval}}Send interval in ms for each packet, 0 to disable it. Default is 0
    vhost.play.reduce_sequence_header{{vhost.play.reduce_sequence_header| sc_filter_enabled}}Whether reduce the sequence header. Default is {{false| sc_filter_enabled}}
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.publish.mr{{vhost.publish.mr| sc_filter_enabled}}Whether merged read is enabled. Default is {{false| sc_filter_enabled}}
    vhost.publish.mr_latency{{vhost.publish.mr_latency}}Merged read latency in ms. Default is 350
    vhost.publish.firstpkt_timeout{{vhost.publish.firstpkt_timeout}}The first packet timeout in ms for publisher. Default is 20000
    vhost.publish.normal_timeout{{vhost.publish.normal_timeout}}The read timeout in ms for publisher. Default is 5000
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.refer.enabled{{vhost.refer.enabled| sc_filter_enabled}}Whether referer DRM is enabled. Default is {{false| sc_filter_enabled}}
    vhost.refer.all{{vhost.refer.all}}The referer for both publisher player.
    vhost.refer.play{{vhost.refer.play}}The referer for player only.
    vhost.refer.publish{{vhost.refer.publish}}The referer for publisher only.
    vhost.cluster.token_traverse{{vhost.cluster.token_traverse| sc_filter_enabled}}The RTMP edge token tranverse, to verify token by upstream server. Default is {{false| sc_filter_enabled}}
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.bandcheck.enabled{{vhost.bandcheck.enabled| sc_filter_enabled}}Whether bandwidth test is enabled. Default is {{false| sc_filter_enabled}}
    vhost.bandcheck.key{{vhost.bandcheck.key}}The key for bandwidth test.
    vhost.bandcheck.interval{{vhost.bandcheck.interval}}The minimal interval in seconds. Default is 30
    vhost.bandcheck.limit_kbps{{vhost.bandcheck.limit_kbps}}The limit speed in Kbps. Default is 1000
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.security.enabled{{vhost.security.enabled| sc_filter_enabled}}Whether security is enabled. Default is {{false| sc_filter_enabled}}
    vhost.security.{{allow.action}}{{allow.action}} {{allow.method}} {{allow.entry}}{{allow| sc_filter_security}}
    vhost.security.{{deny.action}}{{deny.action}} {{deny.method}} {{deny.entry}}{{deny| sc_filter_security}}
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.http_static.enabled{{vhost.http_static.enabled| sc_filter_enabled}}Whether enable HTTP server. Default is {{false| sc_filter_enabled}}
    vhost.http_static.mount{{vhost.http_static.mount}}The HTTP mount for vhost. Default is [vhost]/
    vhost.http_static.dir{{vhost.http_static.dir}}The HTTP root directory for vhost.
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.http_remux.enabled{{vhost.http_remux.enabled| sc_filter_enabled}}Whether HTTP streaming is enabled. Default is {{false| sc_filter_enabled}}
    vhost.http_remux.fast_cache{{vhost.http_remux.fast_cache}}The pre cache for HTTP audio streaming, i.e. aac or mp3. Default is 30
    vhost.http_remux.mount{{vhost.http_remux.mount}}The mount point for HTTP streaming. Default is [vhost]/[app]/[stream].flv
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.http_hooks.enabled{{vhost.http_hooks.enabled| sc_filter_enabled}}Whether HTTP callback is enabled. Default is {{false| sc_filter_enabled}}。
    vhost.http_hooks.on_connecthooksThe callback for on_connect.
    vhost.http_hooks.on_closehooksThe callback for on_close.
    vhost.http_hooks.on_publishhooksThe callback for on_publisher.
    vhost.http_hooks.on_unpublishhooksThe callback for on_unpublish.
    vhost.http_hooks.on_playhooksThe callback for on_play.
    vhost.http_hooks.on_stophooksThe callback for on_stop.
    vhost.http_hooks.on_dvrhooksThe callback for on_dvr.
    vhost.http_hooks.on_hlshooksThe callback for on_hls.
    vhost.http_hooks.on_hls_notifyhooksThe callback for on_hls_notify.
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.exec.enabled{{vhost.exec.enabled| sc_filter_enabled}}Whether exec is enabled. Default is {{false| sc_filter_enabled}}
    vhost.exec.publishEXECThe exec config.
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.hls.enabled{{vhost.hls.enabled| sc_filter_enabled}}Whether HLS is enabled. Default is {{false| sc_filter_enabled}}
    vhost.hls.hls_fragment{{vhost.hls.hls_fragment}}The ts segment length in seconds. Default is 10
    vhost.hls.hls_td_ratio{{vhost.hls.hls_td_ratio}}The target duration, times hls_fragment. Default is 1.5
    vhost.hls.hls_aof_ratio{{vhost.hls.hls_aof_ratio}}The pure audio overflow ratio. Default is 2.0
    vhost.hls.hls_window{{vhost.hls.hls_window}}The ts segment window in seconds. Default is 60
    vhost.hls.hls_on_error{{vhost.hls.hls_on_error}}When error, SRS will ignore, disconnect or continue. Default is ignore
    vhost.hls.hls_path{{vhost.hls.hls_path}}The ts segment root directory. Default is ./objs/nginx/html
    vhost.hls.hls_m3u8_file{{vhost.hls.hls_m3u8_file}}The m3u8 file path template. Default is [app]/[stream].m3u8
    vhost.hls.hls_ts_file{{vhost.hls.hls_ts_file}}The ts segment file path template. Default is [app]/[stream]-[seq].ts
    vhost.hls.hls_ts_floor{{vhost.hls.hls_ts_floor| sc_filter_enabled}}Whether enable ts_floor algorithm. Default is {{false| sc_filter_enabled}}
    vhost.hls.hls_entry_prefix{{vhost.hls.hls_entry_prefix}}The ts segment prefix.
    vhost.hls.hls_acodec{{vhost.hls.hls_acodec}}The default audio codec. Default is aac
    vhost.hls.hls_vcodec{{vhost.hls.hls_vcodec}}The default video codec. Default is h264
    vhost.hls.hls_cleanup{{vhost.hls.hls_cleanup| sc_filter_enabled}}Whether cleanup ts segments not in window. Default is {{true| sc_filter_enabled}}
    vhost.hls.hls_dispose{{vhost.hls.hls_dispose}}The max timeout in seconds to dispose ts segments when no stream, 0 means never dispose. Default is 0
    vhost.hls.hls_nb_notify{{vhost.hls.hls_nb_notify}}The max reading size for on_hls_notify. Default is 64
    vhost.hls.hls_wait_keyframe{{vhost.hls.hls_wait_keyframe| sc_filter_enabled}}Whether wait keyframe when closing segment. Default is {{true| sc_filter_enabled}}
    vhost.http_hooks.on_hlshooksThe HTTP callback for on_hls.
    vhost.http_hooks.on_hls_notifyhooksThe HTTP callback for on_hls_notify, to pre cache HLS.
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.hds.enabled{{vhost.hds.enabled| sc_filter_enabled}}Whether HDS is enabled. Default is {{false| sc_filter_enabled}}
    vhost.hds.hds_fragment{{vhost.hds.hds_fragment}}The f4v segment length in seconds. Default is 10
    vhost.hds.hds_window{{vhost.hds.hds_window}}The f4v segment window in seconds. Default is 60
    vhost.hds.hds_path{{vhost.hds.hds_path}}The HDS root directory. Default is ./objs/nginx/html
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    vhost.dvr.enabled{{vhost.dvr.enabled| sc_filter_enabled}}Whether DVR is enabled. Default is {{false| sc_filter_enabled}}
    vhost.dvr.dvr_plan{{vhost.dvr.dvr_plan}}The record plan, can be session, segment or append. Default is session
    vhost.dvr.dvr_applyFiltersThe DVR plan apply to, all or app/stream. Default is all
    vhost.dvr.dvr_pathPATHThe DVR file path template. Default is ./objs/nginx/html/[app]/[stream].[timestamp].flv
    vhost.dvr.dvr_duration{{vhost.dvr.dvr_duration}}The record segment duration in seconds. Default is 30
    vhost.dvr.dvr_wait_keyframe{{vhost.dvr.dvr_wait_keyframe| sc_filter_enabled}}Whether wait for keyframe when closing record file. Default is {{true| sc_filter_enabled}}
    vhost.dvr.time_jitter{{vhost.dvr.time_jitter}}The time jitter algorithm for DVR, can be full, zero or off. Default is full
    vhost.http_hooks.on_dvrhooksThe HTTP callback for on_dvr.
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    ingest.enabled{{ingest.enabled| sc_filter_enabled}}Whether ingest is enabled. Default is {{false| sc_filter_enabled}}
    ingest.input.type{{ingest.input.type}}The ingest type, can be file or stream. Default is file
    ingest.input.urlURLThe url of ingest file or stream.
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    engine.enabled{{engine.enabled| sc_filter_enabled}}Whether transcode is enabled. Default is {{false| sc_filter_enabled}}
    engine.iformat{{engine.iformat}}The input format, ffmpeg params "-i v". Default is flv
    engine.vfilter

    -{{fk}} {{fv}}

    The video param, ffmpeg params between "-i" and "-vcodec".
    engine.vcodec{{engine.vcodec}}The video codec, ffmpeg params "-vcodec v", can be libx264, copy or vn.
    engine.vbitrate{{engine.vbitrate}}The video bitrate in Kbps, ffmpeg params "-v:b v", 0 to follow source. Default is 0
    engine.vfps{{engine.vfps}}The video fps, ffmpeg params "-r v", 0 to follow source. Default is 0
    engine.vwidth{{engine.vwidth}}The video width in px, ffmpeg params "-s v", 0 to follow source. Default is 0
    engine.vheight{{engine.vheight}}The video height in px, ffmpeg params "-s v", 0 to follow source. Default is 0
    engine.vthreads{{engine.vthreads}}The encode threads, ffmpeg params "-thread v". Default is 1
    engine.vprofile{{engine.vprofile}}The video profile, ffmpeg params "-profile:v v", can be high, main or baseline.
    engine.vpreset{{engine.vpreset}}The video preset, ffmpeg params "-preset v", can be medium, slow, slower, veryslow or placebo
    engine.vparams

    -{{fk}} {{fv}}

    The video transcode params, between ffmpeg params "-vpreset" and "-acodec".
    engine.acodec{{engine.acodec}}The audio encoder, ffmpeg params "-acodec v", can be libfdk_aac, copy or an
    engine.abitrate{{engine.abitrate}}The audio bitrate in Kbps, ffmepg params "-b:a v", 0 to follow source. Default is 0
    engine.asample_rate{{engine.asample_rate}}The audio sample rate, ffmpeg params "-ar v", 0 to follow source. Default is 0
    engine.achannels{{engine.achannels}}The audio channel count, ffmpeg params "-ac v", 0 to follow source. Default is 0
    engine.aparams

    -{{fk}} {{fv}}

    The audio transcode params, between ffmpeg params "-ac" and "-f"/"-y"
    engine.oformat{{engine.oformat}}The output format. Default is flv
    engine.outputURLThe output url, which may include variables [vhost], [port], [app], [stream], [engine]
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - -
    KeyValueDescription
    transcode.enabled{{transcode.enabled| sc_filter_enabled}}Whether transcode is enabled. Default is {{false| sc_filter_enabled}}
    transcode.ffmpeg{{transcode.ffmpeg}}The binary path of encoder.
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescription
    engine.enabled{{engine.enabled| sc_filter_enabled}}Whether transcode is enabled. Default is {{false| sc_filter_enabled}}
    engine.iformat{{engine.iformat}}The input format, ffmpeg params "-i v". Default is flv
    engine.vfilter

    -{{fk}} {{fv}}

    The video param, ffmpeg params between "-i" and "-vcodec".
    engine.vcodec{{engine.vcodec}}The video codec, ffmpeg params "-vcodec v", can be libx264, copy or vn.
    engine.vbitrate{{engine.vbitrate}}The video bitrate in Kbps, ffmpeg params "-v:b v", 0 to follow source. Default is 0
    engine.vfps{{engine.vfps}}The video fps, ffmpeg params "-r v", 0 to follow source. Default is 0
    engine.vwidth{{engine.vwidth}}The video width in px, ffmpeg params "-s v", 0 to follow source. Default is 0
    engine.vheight{{engine.vheight}}The video height in px, ffmpeg params "-s v", 0 to follow source. Default is 0
    engine.vthreads{{engine.vthreads}}The encode threads, ffmpeg params "-thread v". Default is 1
    engine.vprofile{{engine.vprofile}}The video profile, ffmpeg params "-profile:v v", can be high, main or baseline.
    engine.vpreset{{engine.vpreset}}The video preset, ffmpeg params "-preset v", can be medium, slow, slower, veryslow or placebo
    engine.vparams

    -{{fk}} {{fv}}

    The video transcode params, between ffmpeg params "-vpreset" and "-acodec".
    engine.acodec{{engine.acodec}}The audio encoder, ffmpeg params "-acodec v", can be libfdk_aac, copy or an
    engine.abitrate{{engine.abitrate}}The audio bitrate in Kbps, ffmepg params "-b:a v", 0 to follow source. Default is 0
    engine.asample_rate{{engine.asample_rate}}The audio sample rate, ffmpeg params "-ar v", 0 to follow source. Default is 0
    engine.achannels{{engine.achannels}}The audio channel count, ffmpeg params "-ac v", 0 to follow source. Default is 0
    engine.aparams

    -{{fk}} {{fv}}

    The audio transcode params, between ffmpeg params "-ac" and "-f"/"-y"
    engine.oformat{{engine.oformat}}The output format. Default is flv
    engine.outputURLThe output url, which may include variables [vhost], [port], [app], [stream], [engine]
    -
    -
    -
    -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/trunk/research/console/views/configs.html b/trunk/research/console/views/configs.html index 23b9dc390..ce1bf6f5d 100644 --- a/trunk/research/console/views/configs.html +++ b/trunk/research/console/views/configs.html @@ -8,10 +8,10 @@
    -
    - 该服务器不支持HTTP RAW API,或者配置中禁用了该功能。参考WIKI。 +
    + SRS 4.0不再支持HTTP RAW API。参考#2653
    - +
    @@ -43,410 +43,5 @@ -
    Key Value
    - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - 主机名称开启DVRHTTPFLVHLSHDS回调ExecBWT转发安全盗链MRRTCGOPTcpNoDelayMixCorrectTimeJitterATC转码采集 - 添加 -
    {{vhost.id}}无流 - {{vhost.name}} - -
    - 请输入vhost的名称。 -
    -
    {{vhost.enabled| sc_filter_yesno}}{{vhost.origin| sc_filter_yn}}{{vhost.dvr| sc_filter_yn}}{{vhost.http_static| sc_filter_yn}}{{vhost.http_remux| sc_filter_yn}}{{vhost.hls| sc_filter_yn}}{{vhost.hds| sc_filter_yn}}{{vhost.http_hooks| sc_filter_yn}}{{vhost.exec| sc_filter_yn}}{{vhost.bandcheck| sc_filter_yn}}{{vhost.forward| sc_filter_yn}}{{vhost.security| sc_filter_yn}}{{vhost.refer| sc_filter_yn}}{{vhost.mr| sc_filter_yn}}{{vhost.min_latency| sc_filter_yn}}{{vhost.gop_cache| sc_filter_yn}}{{vhost.tcp_nodelay| sc_filter_yn}}{{vhost.mix_correct| sc_filter_yn}}{{vhost.time_jitter| sc_filter_yn}}{{vhost.atc| sc_filter_yn}}{{vhost.transcode| sc_filter_yn}}{{vhost.ingest| sc_filter_yn}} - - - - - 提交 - - 放弃 - - - - - 提交 - - 放弃 - - - - - 编辑 - - 禁用 - - 删除 - - - 编辑 - - 启用 - - - 删除 - - - 详细 - -
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    \ No newline at end of file diff --git a/trunk/research/console/views/configs_en.html b/trunk/research/console/views/configs_en.html index a90d5514f..61e663564 100644 --- a/trunk/research/console/views/configs_en.html +++ b/trunk/research/console/views/configs_en.html @@ -8,10 +8,10 @@
    -
    - HTTP RAW API is not supported or disabled. Read WIKI。 +
    + HTTP RAW API is removed, please read #2653
    - +
    @@ -43,410 +43,5 @@ -
    Key Value
    - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - NameEODHFLVHLSHDSCBExecBWTFSRefererMRRTCGOPTcpNoDelayMixCorrectTimeJitterATCTI - Add -
    {{vhost.id}}No Stream - {{vhost.name}} - -
    - Please input vhost name. -
    -
    {{vhost.enabled| sc_filter_yesno}}{{vhost.origin| sc_filter_yn}}{{vhost.dvr| sc_filter_yn}}{{vhost.http_static| sc_filter_yn}}{{vhost.http_remux| sc_filter_yn}}{{vhost.hls| sc_filter_yn}}{{vhost.hds| sc_filter_yn}}{{vhost.http_hooks| sc_filter_yn}}{{vhost.exec| sc_filter_yn}}{{vhost.bandcheck| sc_filter_yn}}{{vhost.forward| sc_filter_yn}}{{vhost.security| sc_filter_yn}}{{vhost.refer| sc_filter_yn}}{{vhost.mr| sc_filter_yn}}{{vhost.min_latency| sc_filter_yn}}{{vhost.gop_cache| sc_filter_yn}}{{vhost.tcp_nodelay| sc_filter_yn}}{{vhost.mix_correct| sc_filter_yn}}{{vhost.time_jitter| sc_filter_yn}}{{vhost.atc| sc_filter_yn}}{{vhost.transcode| sc_filter_yn}}{{vhost.ingest| sc_filter_yn}} - - - - - Submit - - Cancel - - - - - Submit - - Cancel - - - - - Update - - Disable - - Delete - - - 编辑 - - Enable - - - Delete - - - Detail - -
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    \ No newline at end of file diff --git a/trunk/research/console/views/dvr.html b/trunk/research/console/views/dvr.html deleted file mode 100644 index 61f6a5325..000000000 --- a/trunk/research/console/views/dvr.html +++ /dev/null @@ -1,62 +0,0 @@ -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/trunk/research/console/views/dvr_en.html b/trunk/research/console/views/dvr_en.html deleted file mode 100644 index cd4f5058e..000000000 --- a/trunk/research/console/views/dvr_en.html +++ /dev/null @@ -1,62 +0,0 @@ -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    KeyValueDescriptionOpt
    -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/trunk/research/console/views/dvrs.html b/trunk/research/console/views/dvrs.html deleted file mode 100644 index 1eb6cf4af..000000000 --- a/trunk/research/console/views/dvrs.html +++ /dev/null @@ -1 +0,0 @@ -DVR信息请在每个Stream中单独配置, 请前往Streams配置。 \ No newline at end of file diff --git a/trunk/research/console/views/dvrs_en.html b/trunk/research/console/views/dvrs_en.html deleted file mode 100644 index df452625f..000000000 --- a/trunk/research/console/views/dvrs_en.html +++ /dev/null @@ -1 +0,0 @@ -Please config DVR in each stream by here. \ No newline at end of file diff --git a/trunk/scripts/copy_to_gits.sh b/trunk/scripts/copy_to_gits.sh index d944cad57..941959b28 100755 --- a/trunk/scripts/copy_to_gits.sh +++ b/trunk/scripts/copy_to_gits.sh @@ -15,11 +15,17 @@ if [[ ! -f ~/git/srs-bench/go.mod ]]; then fi echo "Copy signaling" -cp -R 3rdparty/signaling/* ~/git/signaling/ && (cd ~/git/signaling && git st) +cp -R 3rdparty/signaling/* ~/git/signaling/ && +cp -R 3rdparty/signaling/.gitignore ~/git/signaling/ && +(cd ~/git/signaling && git st) echo "Copy httpx-static" -cp -R 3rdparty/httpx-static/* ~/git/go-oryx/httpx-static/ && (cd ~/git/go-oryx && git st) +cp -R 3rdparty/httpx-static/* ~/git/go-oryx/httpx-static/ && +cp -R 3rdparty/httpx-static/.gitignore ~/git/go-oryx/httpx-static/ && +(cd ~/git/go-oryx && git st) echo "Copy srs-bench" -cp -R 3rdparty/srs-bench/* ~/git/srs-bench/ && (cd ~/git/srs-bench && git st) +cp -R 3rdparty/srs-bench/* ~/git/srs-bench/ && +cp -R 3rdparty/srs-bench/.gitignore ~/git/srs-bench/ && +(cd ~/git/srs-bench && git st) diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 87ce7c22a..27c71a94b 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -250,11 +250,6 @@ bool srs_stream_caster_is_udp(string caster) return caster == "mpegts_over_udp"; } -bool srs_stream_caster_is_rtsp(string caster) -{ - return caster == "rtsp"; -} - bool srs_stream_caster_is_flv(string caster) { return caster == "flv"; @@ -2056,1142 +2051,28 @@ srs_error_t SrsConfig::do_persistence(SrsFileWriter* fw) return err; } -srs_error_t SrsConfig::minimal_to_json(SrsJsonObject* obj) -{ - srs_error_t err = srs_success; - - for (int i = 0; i < (int)root->directives.size(); i++) { - SrsConfDirective* dir = root->directives.at(i); - if (dir->is_vhost()) { - continue; - } - - if (dir->name == "listen") { - obj->set(dir->name, dir->dumps_args()); - } - } - - return err; -} - -srs_error_t SrsConfig::global_to_json(SrsJsonObject* obj) -{ - srs_error_t err = srs_success; - - for (int i = 0; i < (int)root->directives.size(); i++) { - SrsConfDirective* dir = root->directives.at(i); - if (dir->is_vhost()) { - continue; - } - - if (dir->name == "listen") { - obj->set(dir->name, dir->dumps_args()); - } else if (dir->name == "pid") { - obj->set(dir->name, dir->dumps_arg0_to_str()); - } else if (dir->name == "chunk_size") { - obj->set(dir->name, dir->dumps_arg0_to_integer()); - } else if (dir->name == "ff_log_dir") { - obj->set(dir->name, dir->dumps_arg0_to_str()); - } else if (dir->name == "srs_log_tank") { - obj->set(dir->name, dir->dumps_arg0_to_str()); - } else if (dir->name == "srs_log_level") { - obj->set(dir->name, dir->dumps_arg0_to_str()); - } else if (dir->name == "srs_log_file") { - obj->set(dir->name, dir->dumps_arg0_to_str()); - } else if (dir->name == "max_connections") { - obj->set(dir->name, dir->dumps_arg0_to_integer()); - } else if (dir->name == "daemon") { - obj->set(dir->name, dir->dumps_arg0_to_boolean()); - } else if (dir->name == "utc_time") { - obj->set(dir->name, dir->dumps_arg0_to_boolean()); - } else if (dir->name == "pithy_print_ms") { - obj->set(dir->name, dir->dumps_arg0_to_integer()); - } else if (dir->name == "heartbeat") { - SrsJsonObject* sobj = SrsJsonAny::object(); - for (int j = 0; j < (int)dir->directives.size(); j++) { - SrsConfDirective* sdir = dir->directives.at(j); - if (sdir->name == "enabled") { - sobj->set(sdir->name, sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "interval") { - sobj->set(sdir->name, sdir->dumps_arg0_to_integer()); - } else if (sdir->name == "url") { - sobj->set(sdir->name, sdir->dumps_arg0_to_str()); - } else if (sdir->name == "device_id") { - sobj->set(sdir->name, sdir->dumps_arg0_to_str()); - } else if (sdir->name == "summaries") { - sobj->set(sdir->name, sdir->dumps_arg0_to_boolean()); - } - } - obj->set(dir->name, sobj); - } else if (dir->name == "stats") { - SrsJsonObject* sobj = SrsJsonAny::object(); - for (int j = 0; j < (int)dir->directives.size(); j++) { - SrsConfDirective* sdir = dir->directives.at(j); - if (sdir->name == "network") { - sobj->set(sdir->name, sdir->dumps_arg0_to_integer()); - } else if (sdir->name == "disk") { - sobj->set(sdir->name, sdir->dumps_args()); - } - } - obj->set(dir->name, sobj); - } else if (dir->name == "http_api") { - SrsJsonObject* sobj = SrsJsonAny::object(); - for (int j = 0; j < (int)dir->directives.size(); j++) { - SrsConfDirective* sdir = dir->directives.at(j); - if (sdir->name == "enabled") { - sobj->set(sdir->name, sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "listen") { - sobj->set(sdir->name, sdir->dumps_arg0_to_str()); - } else if (sdir->name == "crossdomain") { - sobj->set(sdir->name, sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "raw_api") { - SrsJsonObject* ssobj = SrsJsonAny::object(); - sobj->set(sdir->name, ssobj); - - for (int j = 0; j < (int)sdir->directives.size(); j++) { - SrsConfDirective* ssdir = sdir->directives.at(j); - if (ssdir->name == "enabled") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_boolean()); - } else if (ssdir->name == "allow_reload") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_boolean()); - } else if (ssdir->name == "allow_query") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_boolean()); - } else if (ssdir->name == "allow_update") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_boolean()); - } - } - } - } - obj->set(dir->name, sobj); - } else if (dir->name == "http_server") { - SrsJsonObject* sobj = SrsJsonAny::object(); - for (int j = 0; j < (int)dir->directives.size(); j++) { - SrsConfDirective* sdir = dir->directives.at(j); - if (sdir->name == "enabled") { - sobj->set(sdir->name, sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "listen") { - sobj->set(sdir->name, sdir->dumps_arg0_to_str()); - } else if (sdir->name == "dir") { - sobj->set(sdir->name, sdir->dumps_arg0_to_str()); - } - } - obj->set(dir->name, sobj); - } else if (dir->name == "stream_caster") { - SrsJsonObject* sobj = SrsJsonAny::object(); - for (int j = 0; j < (int)dir->directives.size(); j++) { - SrsConfDirective* sdir = dir->directives.at(j); - if (sdir->name == "enabled") { - sobj->set(sdir->name, sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "caster") { - sobj->set(sdir->name, sdir->dumps_arg0_to_str()); - } else if (sdir->name == "output") { - sobj->set(sdir->name, sdir->dumps_arg0_to_str()); - } else if (sdir->name == "listen") { - sobj->set(sdir->name, sdir->dumps_arg0_to_str()); - } else if (sdir->name == "rtp_port_min") { - sobj->set(sdir->name, sdir->dumps_arg0_to_integer()); - } else if (sdir->name == "rtp_port_max") { - sobj->set(sdir->name, sdir->dumps_arg0_to_integer()); - } else if (sdir->name == "rtp_idle_timeout") { - sobj->set(sdir->name, sdir->dumps_arg0_to_integer()); - } else if (sdir->name == "audio_enable") { - sobj->set(sdir->name, sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "jitterbuffer_enable") { - sobj->set(sdir->name, sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "host") { - sobj->set(sdir->name, sdir->dumps_arg0_to_str()); - } else if (sdir->name == "wait_keyframe") { - sobj->set(sdir->name, sdir->dumps_arg0_to_str()); - } else if (sdir->name == "auto_create_channel") { - sobj->set(sdir->name, sdir->dumps_arg0_to_str()); - } else if (sdir->name == "sip"){ - SrsJsonObject* ssobj = SrsJsonAny::object(); - sobj->set(sdir->name, ssobj); - - for (int j = 0; j < (int)sdir->directives.size(); j++) { - SrsConfDirective* ssdir = sdir->directives.at(j); - if (ssdir->name == "enabled") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_boolean()); - } else if (ssdir->name == "listen") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_integer()); - } else if (ssdir->name == "serial") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_str()); - } else if (ssdir->name == "realm") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_str()); - } else if (ssdir->name == "ack_timeout") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_integer()); - } else if (ssdir->name == "keepalive_timeout") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_integer()); - } else if (ssdir->name == "auto_play") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_boolean()); - } else if (ssdir->name == "invite_port_fixed") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_boolean()); - } else if (ssdir->name == "query_catalog_interval") { - ssobj->set(ssdir->name, ssdir->dumps_arg0_to_integer()); - } - } - }//end if - }//end for - obj->set(dir->name, sobj); - } else { - continue; - } - } - - SrsJsonObject* sobjs = SrsJsonAny::object(); - int nb_vhosts = 0; - - SrsStatistic* stat = SrsStatistic::instance(); - for (int i = 0; i < (int)root->directives.size(); i++) { - SrsConfDirective* dir = root->directives.at(i); - if (!dir->is_vhost()) { - continue; - } - - nb_vhosts++; - SrsJsonObject* sobj = SrsJsonAny::object(); - sobjs->set(dir->arg0(), sobj); - - SrsStatisticVhost* svhost = stat->find_vhost_by_name(dir->arg0()); - if (!svhost) { - continue; - } - sobj->set("id", SrsJsonAny::str(svhost->id.c_str())); - sobj->set("name", dir->dumps_arg0_to_str()); - sobj->set("enabled", SrsJsonAny::boolean(get_vhost_enabled(dir->arg0()))); - - if (get_dvr_enabled(dir->arg0())) { - sobj->set("dvr", SrsJsonAny::boolean(true)); - } - if (get_vhost_http_enabled(dir->arg0())) { - sobj->set("http_static", SrsJsonAny::boolean(true)); - } - if (get_vhost_http_remux_enabled(dir->arg0())) { - sobj->set("http_remux", SrsJsonAny::boolean(true)); - } - if (get_hls_enabled(dir->arg0())) { - sobj->set("hls", SrsJsonAny::boolean(true)); - } - if (get_hds_enabled(dir->arg0())) { - sobj->set("hds", SrsJsonAny::boolean(true)); - } - if (get_vhost_http_hooks(dir->arg0())) { - sobj->set("http_hooks", SrsJsonAny::boolean(true)); - } - if (get_exec_enabled(dir->arg0())) { - sobj->set("exec", SrsJsonAny::boolean(true)); - } - if (get_bw_check_enabled(dir->arg0())) { - sobj->set("bandcheck", SrsJsonAny::boolean(true)); - } - if (!get_vhost_is_edge(dir->arg0())) { - sobj->set("origin", SrsJsonAny::boolean(true)); - } - if (get_forward_enabled(dir->arg0())) { - sobj->set("forward", SrsJsonAny::boolean(true)); - } - - if (get_security_enabled(dir->arg0())) { - sobj->set("security", SrsJsonAny::boolean(true)); - } - if (get_refer_enabled(dir->arg0())) { - sobj->set("refer", SrsJsonAny::boolean(true)); - } - - if (get_mr_enabled(dir->arg0())) { - sobj->set("mr", SrsJsonAny::boolean(true)); - } - if (get_realtime_enabled(dir->arg0())) { - sobj->set("min_latency", SrsJsonAny::boolean(true)); - } - if (get_gop_cache(dir->arg0())) { - sobj->set("gop_cache", SrsJsonAny::boolean(true)); - } - if (get_tcp_nodelay(dir->arg0())) { - sobj->set("tcp_nodelay", SrsJsonAny::boolean(true)); - } - - if (get_mix_correct(dir->arg0())) { - sobj->set("mix_correct", SrsJsonAny::boolean(true)); - } - if (get_time_jitter(dir->arg0()) != SrsRtmpJitterAlgorithmOFF) { - sobj->set("time_jitter", SrsJsonAny::boolean(true)); - } - if (get_atc(dir->arg0())) { - sobj->set("atc", SrsJsonAny::boolean(true)); - } - - bool has_transcode = false; - for (int j = 0; !has_transcode && j < (int)dir->directives.size(); j++) { - SrsConfDirective* sdir = dir->directives.at(j); - if (sdir->name != "transcode") { - continue; - } - - if (!get_transcode_enabled(sdir)) { - continue; - } - - for (int k = 0; !has_transcode && k < (int)sdir->directives.size(); k++) { - SrsConfDirective* ssdir = sdir->directives.at(k); - if (ssdir->name != "engine") { - continue; - } - - if (get_engine_enabled(ssdir)) { - has_transcode = true; - break; - } - } - } - if (has_transcode) { - sobj->set("transcode", SrsJsonAny::boolean(has_transcode)); - } - - bool has_ingest = false; - for (int j = 0; !has_ingest && j < (int)dir->directives.size(); j++) { - SrsConfDirective* sdir = dir->directives.at(j); - if (sdir->name != "ingest") { - continue; - } - - if (get_ingest_enabled(sdir)) { - has_ingest = true; - break; - } - } - if (has_ingest) { - sobj->set("ingest", SrsJsonAny::boolean(has_ingest)); - } - } - - obj->set("nb_vhosts", SrsJsonAny::integer(nb_vhosts)); - obj->set("vhosts", sobjs); - - return err; -} - -srs_error_t SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsJsonObject* obj) -{ - srs_error_t err = srs_success; - - SrsConfDirective* dir = NULL; - - // always present in vhost. - SrsStatistic* stat = SrsStatistic::instance(); - - SrsStatisticVhost* svhost = stat->find_vhost_by_name(vhost->arg0()); - if (!svhost) { - return err; - } - obj->set("id", SrsJsonAny::str(svhost->id.c_str())); - - obj->set("name", vhost->dumps_arg0_to_str()); - obj->set("enabled", SrsJsonAny::boolean(get_vhost_enabled(vhost))); - - // vhost scope configs. - if ((dir = vhost->get("chunk_size")) != NULL) { - obj->set("chunk_size", dir->dumps_arg0_to_integer()); - } - if ((dir = vhost->get("min_latency")) != NULL) { - obj->set("min_latency", dir->dumps_arg0_to_boolean()); - } - if ((dir = vhost->get("tcp_nodelay")) != NULL) { - obj->set("tcp_nodelay", dir->dumps_arg0_to_boolean()); - } - - // cluster. - if ((dir = vhost->get("cluster")) != NULL) { - SrsJsonObject* cluster = SrsJsonAny::object(); - obj->set("cluster", cluster); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "mode") { - cluster->set("mode", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "origin") { - cluster->set("origin", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "token_traverse") { - cluster->set("token_traverse", sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "vhost") { - cluster->set("vhost", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "debug_srs_upnode") { - cluster->set("debug_srs_upnode", sdir->dumps_arg0_to_boolean()); - } - } - } - - // forward - if ((dir = vhost->get("forward")) != NULL) { - SrsJsonObject* forward = SrsJsonAny::object(); - obj->set("forward", forward); - - forward->set("enabled", SrsJsonAny::boolean(get_forward_enabled(vhost->name))); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "destination") { - forward->set("destination", sdir->dumps_args()); - } - } - } - - // play - if ((dir = vhost->get("play")) != NULL) { - SrsJsonObject* play = SrsJsonAny::object(); - obj->set("play", play); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "time_jitter") { - play->set("time_jitter", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "mix_correct") { - play->set("mix_correct", sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "atc") { - play->set("atc", sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "atc_auto") { - play->set("atc_auto", sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "mw_latency") { - play->set("mw_latency", sdir->dumps_arg0_to_integer()); - } else if (sdir->name == "gop_cache") { - play->set("gop_cache", sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "queue_length") { - play->set("queue_length", sdir->dumps_arg0_to_integer()); - } else if (sdir->name == "reduce_sequence_header") { - play->set("reduce_sequence_header", sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "send_min_interval") { - play->set("send_min_interval", sdir->dumps_arg0_to_integer()); - } - } - } - - // publish - if ((dir = vhost->get("publish")) != NULL) { - SrsJsonObject* publish = SrsJsonAny::object(); - obj->set("publish", publish); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "mr") { - publish->set("mr", sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "mr_latency") { - publish->set("mr_latency", sdir->dumps_arg0_to_integer()); - } else if (sdir->name == "firstpkt_timeout") { - publish->set("firstpkt_timeout", sdir->dumps_arg0_to_integer()); - } else if (sdir->name == "normal_timeout") { - publish->set("normal_timeout", sdir->dumps_arg0_to_integer()); - } - } - } - - // refer - if ((dir = vhost->get("refer")) != NULL) { - SrsJsonObject* refer = SrsJsonAny::object(); - obj->set("refer", refer); - - refer->set("enabled", SrsJsonAny::boolean(get_refer_enabled(vhost->name))); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "all") { - refer->set("all", sdir->dumps_args()); - } else if (sdir->name == "publish") { - refer->set("publish", sdir->dumps_args()); - } else if (sdir->name == "play") { - refer->set("play", sdir->dumps_args()); - } - } - } - - // bandcheck - if ((dir = vhost->get("bandcheck")) != NULL) { - SrsJsonObject* bandcheck = SrsJsonAny::object(); - obj->set("bandcheck", bandcheck); - - bandcheck->set("enabled", SrsJsonAny::boolean(get_bw_check_enabled(vhost->name))); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "key") { - bandcheck->set("key", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "interval") { - bandcheck->set("interval", sdir->dumps_arg0_to_integer()); - } else if (sdir->name == "limit_kbps") { - bandcheck->set("limit_kbps", sdir->dumps_arg0_to_integer()); - } - } - } - - // security - if ((dir = vhost->get("security")) != NULL) { - SrsJsonObject* security = SrsJsonAny::object(); - obj->set("security", security); - - security->set("enabled", SrsJsonAny::boolean(get_security_enabled(vhost->name))); - - SrsJsonArray* allows = SrsJsonAny::array(); - security->set("allows", allows); - - SrsJsonArray* denies = SrsJsonAny::array(); - security->set("denies", denies); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "allow") { - SrsJsonObject* allow = SrsJsonAny::object(); - allow->set("action", SrsJsonAny::str(sdir->name.c_str())); - allow->set("method", SrsJsonAny::str(sdir->arg0().c_str())); - allow->set("entry", SrsJsonAny::str(sdir->arg1().c_str())); - allows->append(allow); - } else if (sdir->name == "deny") { - SrsJsonObject* deny = SrsJsonAny::object(); - deny->set("action", SrsJsonAny::str(sdir->name.c_str())); - deny->set("method", SrsJsonAny::str(sdir->arg0().c_str())); - deny->set("entry", SrsJsonAny::str(sdir->arg1().c_str())); - denies->append(deny); - } - } - } - - // http_static - if ((dir = vhost->get("http_static")) != NULL) { - SrsJsonObject* http_static = SrsJsonAny::object(); - obj->set("http_static", http_static); - - http_static->set("enabled", SrsJsonAny::boolean(get_vhost_http_enabled(vhost->name))); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - 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) { - SrsJsonObject* http_remux = SrsJsonAny::object(); - obj->set("http_remux", http_remux); - - http_remux->set("enabled", SrsJsonAny::boolean(get_vhost_http_remux_enabled(vhost->name))); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "fast_cache") { - http_remux->set("fast_cache", sdir->dumps_arg0_to_integer()); - } else if (sdir->name == "mount") { - http_remux->set("mount", sdir->dumps_arg0_to_str()); - } - } - } - - // http_hooks - if ((dir = vhost->get("http_hooks")) != NULL) { - SrsJsonObject* http_hooks = SrsJsonAny::object(); - obj->set("http_hooks", http_hooks); - - http_hooks->set("enabled", SrsJsonAny::boolean(get_vhost_http_hooks_enabled(vhost->name))); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "on_connect") { - http_hooks->set("on_connect", sdir->dumps_args()); - } else if (sdir->name == "on_close") { - http_hooks->set("on_close", sdir->dumps_args()); - } else if (sdir->name == "on_publish") { - http_hooks->set("on_publish", sdir->dumps_args()); - } else if (sdir->name == "on_unpublish") { - http_hooks->set("on_unpublish", sdir->dumps_args()); - } else if (sdir->name == "on_play") { - http_hooks->set("on_play", sdir->dumps_args()); - } else if (sdir->name == "on_stop") { - http_hooks->set("on_stop", sdir->dumps_args()); - } else if (sdir->name == "on_dvr") { - http_hooks->set("on_dvr", sdir->dumps_args()); - } else if (sdir->name == "on_hls") { - http_hooks->set("on_hls", sdir->dumps_args()); - } else if (sdir->name == "on_hls_notify") { - http_hooks->set("on_hls_notify", sdir->dumps_arg0_to_str()); - } - } - } - - // hls - if ((dir = vhost->get("hls")) != NULL) { - SrsJsonObject* hls = SrsJsonAny::object(); - obj->set("hls", hls); - - hls->set("enabled", SrsJsonAny::boolean(get_hls_enabled(vhost->name))); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "hls_fragment") { - hls->set("hls_fragment", sdir->dumps_arg0_to_number()); - } else if (sdir->name == "hls_td_ratio") { - hls->set("hls_td_ratio", sdir->dumps_arg0_to_number()); - } else if (sdir->name == "hls_aof_ratio") { - hls->set("hls_aof_ratio", sdir->dumps_arg0_to_number()); - } else if (sdir->name == "hls_window") { - hls->set("hls_window", sdir->dumps_arg0_to_number()); - } else if (sdir->name == "hls_on_error") { - hls->set("hls_on_error", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "hls_storage") { - hls->set("hls_storage", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "hls_path") { - hls->set("hls_path", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "hls_m3u8_file") { - hls->set("hls_m3u8_file", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "hls_ts_file") { - hls->set("hls_ts_file", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "hls_ts_floor") { - hls->set("hls_ts_floor", sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "hls_entry_prefix") { - hls->set("hls_entry_prefix", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "hls_mount") { - hls->set("hls_mount", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "hls_acodec") { - hls->set("hls_acodec", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "hls_vcodec") { - hls->set("hls_vcodec", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "hls_cleanup") { - hls->set("hls_cleanup", sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "hls_dispose") { - hls->set("hls_dispose", sdir->dumps_arg0_to_number()); - } else if (sdir->name == "hls_nb_notify") { - hls->set("hls_nb_notify", sdir->dumps_arg0_to_integer()); - } else if (sdir->name == "hls_dts_directly") { - hls->set("hls_dts_directly", sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "hls_wait_keyframe") { - hls->set("hls_wait_keyframe", sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "hls_keys") { - hls->set("hls_keys", sdir->dumps_arg0_to_boolean()); - } else if (sdir->name == "hls_fragments_per_key") { - hls->set("hls_fragments_per_key", sdir->dumps_arg0_to_number()); - } else if (sdir->name == "hls_key_file") { - hls->set("hls_key_file", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "hls_key_file_path") { - hls->set("hls_key_file_path", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "hls_key_url") { - hls->set("hls_key_url", sdir->dumps_arg0_to_str()); - } - } - } - - // hds - if ((dir = vhost->get("hds")) != NULL) { - SrsJsonObject* hds = SrsJsonAny::object(); - obj->set("hds", hds); - - hds->set("enabled", SrsJsonAny::boolean(get_hds_enabled(vhost->name))); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "hds_fragment") { - hds->set("hds_fragment", sdir->dumps_arg0_to_number()); - } else if (sdir->name == "hds_window") { - hds->set("hds_window", sdir->dumps_arg0_to_number()); - } else if (sdir->name == "hds_path") { - hds->set("hds_path", sdir->dumps_arg0_to_str()); - } - } - } - - // dvr - if ((dir = vhost->get("dvr")) != NULL) { - SrsJsonObject* dvr = SrsJsonAny::object(); - obj->set("dvr", dvr); - - dvr->set("enabled", SrsJsonAny::boolean(get_dvr_enabled(vhost->name))); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "dvr_plan") { - dvr->set("dvr_plan", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "dvr_apply") { - dvr->set("dvr_apply", sdir->dumps_args()); - } 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()); - } - } - } - - // exec - if ((dir = vhost->get("exec")) != NULL) { - SrsJsonObject* ng_exec = SrsJsonAny::object(); - obj->set("exec", ng_exec); - - ng_exec->set("enabled", SrsJsonAny::boolean(get_exec_enabled(vhost->name))); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "publish") { - ng_exec->set("publish", sdir->dumps_args()); - } - } - } - - // ingest - SrsJsonArray* 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 = SrsJsonAny::array(); - obj->set("ingests", ingests); - } - - SrsJsonObject* ingest = SrsJsonAny::object(); - ingest->set("id", dir->dumps_arg0_to_str()); - ingest->set("enabled", SrsJsonAny::boolean(get_ingest_enabled(dir))); - ingests->append(ingest); - - for (int j = 0; j < (int)dir->directives.size(); j++) { - SrsConfDirective* sdir = dir->directives.at(j); - - if (sdir->name == "input") { - SrsJsonObject* input = SrsJsonAny::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") { - SrsJsonObject* engine = SrsJsonAny::object(); - ingest->set("engine", engine); - - if ((err = srs_config_dumps_engine(sdir, engine)) != srs_success) { - return srs_error_wrap(err, "dump engine"); - } - } - } - } - - // transcode - SrsJsonArray* transcodes = NULL; - for (int i = 0; i < (int)vhost->directives.size(); i++) { - dir = vhost->directives.at(i); - if (dir->name != "transcode") { - continue; - } - - if (!transcodes) { - transcodes = SrsJsonAny::array(); - obj->set("transcodes", transcodes); - } - - SrsJsonObject* transcode = SrsJsonAny::object(); - transcodes->append(transcode); - - transcode->set("apply", dir->dumps_arg0_to_str()); - transcode->set("enabled", SrsJsonAny::boolean(get_transcode_enabled(dir))); - - SrsJsonArray* engines = SrsJsonAny::array(); - transcode->set("engines", engines); - - for (int i = 0; i < (int)dir->directives.size(); i++) { - SrsConfDirective* sdir = dir->directives.at(i); - - if (sdir->name == "ffmpeg") { - transcode->set("ffmpeg", sdir->dumps_arg0_to_str()); - } else if (sdir->name == "engine") { - SrsJsonObject* engine = SrsJsonAny::object(); - engines->append(engine); - - if ((err = srs_config_dumps_engine(sdir, engine)) != srs_success) { - return srs_error_wrap(err, "dump engine"); - } - } - } - } - - return err; -} - srs_error_t SrsConfig::raw_to_json(SrsJsonObject* obj) { srs_error_t err = srs_success; - + SrsJsonObject* sobj = SrsJsonAny::object(); obj->set("http_api", sobj); - + sobj->set("enabled", SrsJsonAny::boolean(get_http_api_enabled())); sobj->set("listen", SrsJsonAny::str(get_http_api_listen().c_str())); sobj->set("crossdomain", SrsJsonAny::boolean(get_http_api_crossdomain())); - + SrsJsonObject* ssobj = SrsJsonAny::object(); sobj->set("raw_api", ssobj); - + ssobj->set("enabled", SrsJsonAny::boolean(get_raw_api())); ssobj->set("allow_reload", SrsJsonAny::boolean(get_raw_api_allow_reload())); ssobj->set("allow_query", SrsJsonAny::boolean(get_raw_api_allow_query())); ssobj->set("allow_update", SrsJsonAny::boolean(get_raw_api_allow_update())); - + return err; } -srs_error_t SrsConfig::raw_set_listen(const vector& eps, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get("listen"); - - // nothing changed, ignore. - if (srs_vector_actual_equals(conf->args, eps)) { - return err; - } - - // changed, apply and reload. - conf->args = eps; - - if ((err = do_reload_listen()) != srs_success) { - return srs_error_wrap(err, "reload listen"); - } - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_set_pid(string pid, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get_or_create("pid"); - - if (conf->arg0() == pid) { - return err; - } - - conf->args.clear(); - conf->args.push_back(pid); - - if ((err = do_reload_pid()) != srs_success) { - return srs_error_wrap(err, "reload pid"); - } - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_set_chunk_size(string chunk_size, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get_or_create("chunk_size"); - - if (conf->arg0() == chunk_size) { - return err; - } - - conf->args.clear(); - conf->args.push_back(chunk_size); - - // directly supported reload for chunk_size change. - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_set_ff_log_dir(string ff_log_dir, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get_or_create("ff_log_dir"); - - if (conf->arg0() == ff_log_dir) { - return err; - } - - conf->args.clear(); - conf->args.push_back(ff_log_dir); - - // directly supported reload for ff_log_dir change. - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_set_srs_log_tank(string srs_log_tank, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get_or_create("srs_log_tank"); - - if (conf->arg0() == srs_log_tank) { - return err; - } - - conf->args.clear(); - conf->args.push_back(srs_log_tank); - - if ((err = do_reload_srs_log_tank()) != srs_success) { - return srs_error_wrap(err, "reload log tank"); - } - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_set_srs_log_level(string srs_log_level, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get_or_create("srs_log_level"); - - if (conf->arg0() == srs_log_level) { - return err; - } - - conf->args.clear(); - conf->args.push_back(srs_log_level); - - if ((err = do_reload_srs_log_level()) != srs_success) { - return srs_error_wrap(err, "reload log level"); - } - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_set_srs_log_file(string srs_log_file, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get_or_create("srs_log_file"); - - if (conf->arg0() == srs_log_file) { - return err; - } - - conf->args.clear(); - conf->args.push_back(srs_log_file); - - if ((err = do_reload_srs_log_file()) != srs_success) { - return srs_error_wrap(err, "reload log file"); - } - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_set_max_connections(string max_connections, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get_or_create("max_connections"); - - if (conf->arg0() == max_connections) { - return err; - } - - conf->args.clear(); - conf->args.push_back(max_connections); - - if ((err = do_reload_max_connections()) != srs_success) { - return srs_error_wrap(err, "reload max connection"); - } - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_set_utc_time(string utc_time, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get_or_create("utc_time"); - - if (conf->arg0() == utc_time) { - return err; - } - - conf->args.clear(); - conf->args.push_back(utc_time); - - if ((err = do_reload_utc_time()) != srs_success) { - return srs_error_wrap(err, "reload"); - } - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_set_pithy_print_ms(string pithy_print_ms, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get_or_create("pithy_print_ms"); - - if (conf->arg0() == pithy_print_ms) { - return err; - } - - conf->args.clear(); - conf->args.push_back(pithy_print_ms); - - if ((err = do_reload_pithy_print_ms()) != srs_success) { - return srs_error_wrap(err, "reload pithy print"); - } - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_create_vhost(string vhost, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get_or_create("vhost", vhost); - conf->get_or_create("enabled")->set_arg0("on"); - - if ((err = do_reload_vhost_added(vhost)) != srs_success) { - return srs_error_wrap(err, "reload vhost"); - } - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_update_vhost(string vhost, string name, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - // the vhost must be disabled, so we donot need to reload. - SrsConfDirective* conf = root->get_or_create("vhost", vhost); - conf->set_arg0(name); - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_delete_vhost(string vhost, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - // the vhost must be disabled, so we donot need to reload. - SrsConfDirective* conf = root->get("vhost", vhost); - srs_assert(conf); - - // remove the directive. - root->remove(conf); - srs_freep(conf); - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_disable_vhost(string vhost, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get("vhost", vhost); - srs_assert(conf); - - conf->get_or_create("enabled")->set_arg0("off"); - - if ((err = do_reload_vhost_removed(vhost)) != srs_success) { - return srs_error_wrap(err, "reload vhost removed"); - } - - applied = true; - - return err; -} - -srs_error_t SrsConfig::raw_enable_vhost(string vhost, bool& applied) -{ - srs_error_t err = srs_success; - - applied = false; - - SrsConfDirective* conf = root->get("vhost", vhost); - srs_assert(conf); - - conf->get_or_create("enabled")->set_arg0("on"); - - if ((err = do_reload_vhost_added(vhost)) != srs_success) { - return srs_error_wrap(err, "reload vhost added"); - } - - applied = true; - - return err; -} -// LCOV_EXCL_STOP - srs_error_t SrsConfig::do_reload_listen() { srs_error_t err = srs_success; @@ -6673,9 +5554,15 @@ string SrsConfig::get_ingest_input_url(SrsConfDirective* conf) return conf->arg0(); } +extern bool _srs_in_docker; + bool SrsConfig::get_log_tank_file() { static bool DEFAULT = true; + + if (_srs_in_docker) { + DEFAULT = false; + } SrsConfDirective* conf = root->get("srs_log_tank"); if (!conf || conf->arg0().empty()) { @@ -7607,46 +6494,14 @@ bool SrsConfig::get_raw_api_allow_reload() bool SrsConfig::get_raw_api_allow_query() { - static bool DEFAULT = false; - - SrsConfDirective* conf = root->get("http_api"); - if (!conf) { - return DEFAULT; - } - - conf = conf->get("raw_api"); - if (!conf) { - return DEFAULT; - } - - conf = conf->get("allow_query"); - if (!conf || conf->arg0().empty()) { - return DEFAULT; - } - - return SRS_CONF_PERFER_FALSE(conf->arg0()); + // Disable RAW API query, @see https://github.com/ossrs/srs/issues/2653#issuecomment-939389178 + return false; } bool SrsConfig::get_raw_api_allow_update() { - static bool DEFAULT = false; - - SrsConfDirective* conf = root->get("http_api"); - if (!conf) { - return DEFAULT; - } - - conf = conf->get("raw_api"); - if (!conf) { - return DEFAULT; - } - - conf = conf->get("allow_update"); - if (!conf || conf->arg0().empty()) { - return DEFAULT; - } - - return SRS_CONF_PERFER_FALSE(conf->arg0()); + // Disable RAW API update, @see https://github.com/ossrs/srs/issues/2653#issuecomment-939389178 + return false; } SrsConfDirective* SrsConfig::get_https_api() diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index 76e01ea95..b30b6bdc2 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -100,7 +100,6 @@ extern bool srs_config_ingest_is_stream(std::string type); extern bool srs_config_dvr_is_plan_segment(std::string plan); extern bool srs_config_dvr_is_plan_session(std::string plan); extern bool srs_stream_caster_is_udp(std::string caster); -extern bool srs_stream_caster_is_rtsp(std::string caster); extern bool srs_stream_caster_is_flv(std::string caster); // Whether the dvr_apply active the stream specified by req. extern bool srs_config_apply_filter(SrsConfDirective* dvr_apply, SrsRequest* req); @@ -333,44 +332,8 @@ public: private: virtual srs_error_t do_persistence(SrsFileWriter* fw); public: - // Dumps the global sections to json. - virtual srs_error_t global_to_json(SrsJsonObject* obj); - // Dumps the minimal sections to json. - virtual srs_error_t minimal_to_json(SrsJsonObject* obj); - // Dumps the vhost section to json. - virtual srs_error_t vhost_to_json(SrsConfDirective* vhost, SrsJsonObject* obj); // Dumps the http_api sections to json for raw api info. virtual srs_error_t raw_to_json(SrsJsonObject* obj); - // RAW set the global listen. - virtual srs_error_t raw_set_listen(const std::vector& eps, bool& applied); - // RAW set the global pid. - virtual srs_error_t raw_set_pid(std::string pid, bool& applied); - // RAW set the global chunk size. - virtual srs_error_t raw_set_chunk_size(std::string chunk_size, bool& applied); - // RAW set the global ffmpeg log dir. - virtual srs_error_t raw_set_ff_log_dir(std::string ff_log_dir, bool& applied); - // RAW set the global log tank. - virtual srs_error_t raw_set_srs_log_tank(std::string srs_log_tank, bool& applied); - // RAW set the global log level. - virtual srs_error_t raw_set_srs_log_level(std::string srs_log_level, bool& applied); - // RAW set the global log file path for file tank. - virtual srs_error_t raw_set_srs_log_file(std::string srs_log_file, bool& applied); - // RAW set the global max connections of srs. - virtual srs_error_t raw_set_max_connections(std::string max_connections, bool& applied); - // RAW set the global whether use utc time. - virtual srs_error_t raw_set_utc_time(std::string utc_time, bool& applied); - // RAW set the global pithy print interval in ms. - virtual srs_error_t raw_set_pithy_print_ms(std::string pithy_print_ms, bool& applied); - // RAW create the new vhost. - virtual srs_error_t raw_create_vhost(std::string vhost, bool& applied); - // RAW update the disabled vhost name. - virtual srs_error_t raw_update_vhost(std::string vhost, std::string name, bool& applied); - // RAW delete the disabled vhost. - virtual srs_error_t raw_delete_vhost(std::string vhost, bool& applied); - // RAW disable the enabled vhost. - virtual srs_error_t raw_disable_vhost(std::string vhost, bool& applied); - // RAW enable the disabled vhost. - virtual srs_error_t raw_enable_vhost(std::string vhost, bool& applied); private: virtual srs_error_t do_reload_listen(); virtual srs_error_t do_reload_pid(); @@ -750,7 +713,6 @@ public: // all clients connected to edge must be tranverse to origin to verify. virtual bool get_vhost_edge_token_traverse(std::string vhost); // Get the transformed vhost for edge, - // @see https://github.com/ossrs/srs/issues/372 virtual std::string get_vhost_edge_transform_vhost(std::string vhost); // Whether enable the origin cluster. // @see https://github.com/ossrs/srs/wiki/v3_EN_OriginCluster @@ -925,7 +887,6 @@ public: // Get the hls hls_on_error config. // The ignore will ignore error and disable hls. // The disconnect will disconnect publish connection. - // @see https://github.com/ossrs/srs/issues/264 virtual std::string get_hls_on_error(std::string vhost); // Get the HLS default audio codec. virtual std::string get_hls_acodec(std::string vhost); diff --git a/trunk/src/app/srs_app_edge.cpp b/trunk/src/app/srs_app_edge.cpp index cf99fbb23..853a14235 100644 --- a/trunk/src/app/srs_app_edge.cpp +++ b/trunk/src/app/srs_app_edge.cpp @@ -71,7 +71,6 @@ srs_error_t SrsEdgeRtmpUpstream::connect(SrsRequest* r, SrsLbRoundRobin* lb) if (true) { SrsConfDirective* conf = _srs_config->get_vhost_edge_origin(req->vhost); - // @see https://github.com/ossrs/srs/issues/79 // when origin is error, for instance, server is shutdown, // then user remove the vhost then reload, the conf is empty. if (!conf) { @@ -98,7 +97,6 @@ srs_error_t SrsEdgeRtmpUpstream::connect(SrsRequest* r, SrsLbRoundRobin* lb) selected_port = port; // support vhost tranform for edge, - // @see https://github.com/ossrs/srs/issues/372 std::string vhost = _srs_config->get_vhost_edge_transform_vhost(req->vhost); vhost = srs_string_replace(vhost, "[vhost]", req->vhost); @@ -724,7 +722,6 @@ srs_error_t SrsEdgeForwarder::start() srs_parse_hostport(server, server, port); // support vhost tranform for edge, - // @see https://github.com/ossrs/srs/issues/372 std::string vhost = _srs_config->get_vhost_edge_transform_vhost(req->vhost); vhost = srs_string_replace(vhost, "[vhost]", req->vhost); @@ -1005,7 +1002,6 @@ srs_error_t SrsPublishEdge::on_client_publish() return srs_error_new(ERROR_RTMP_EDGE_PUBLISH_STATE, "invalid state"); } - // @see https://github.com/ossrs/srs/issues/180 // to avoid multiple publish the same stream on the same edge, // directly enter the publish stage. if (true) { @@ -1017,7 +1013,6 @@ srs_error_t SrsPublishEdge::on_client_publish() // start to forward stream to origin. err = forwarder->start(); - // @see https://github.com/ossrs/srs/issues/180 // when failed, revert to init if (err != srs_success) { SrsEdgeState pstate = state; diff --git a/trunk/src/app/srs_app_forward.hpp b/trunk/src/app/srs_app_forward.hpp index ede1d033f..74b58c2be 100644 --- a/trunk/src/app/srs_app_forward.hpp +++ b/trunk/src/app/srs_app_forward.hpp @@ -40,7 +40,6 @@ private: SrsRtmpJitter* jitter; SrsMessageQueue* queue; // Cache the sequence header for retry when slave is failed. - // @see https://github.com/ossrs/srs/issues/150 SrsSharedPtrMessage* sh_audio; SrsSharedPtrMessage* sh_video; public: diff --git a/trunk/src/app/srs_app_hls.hpp b/trunk/src/app/srs_app_hls.hpp index 93fef290f..1c5cad790 100644 --- a/trunk/src/app/srs_app_hls.hpp +++ b/trunk/src/app/srs_app_hls.hpp @@ -153,7 +153,6 @@ private: // The current writing segment. SrsHlsSegment* current; // The ts context, to keep cc continous between ts. - // @see https://github.com/ossrs/srs/issues/375 SrsTsContext* context; public: SrsHlsMuxer(); @@ -187,7 +186,6 @@ public: virtual bool wait_keyframe(); // Whether segment absolutely overflow, for pure audio to reap segment, // that is whether the current segment duration>=2*(the segment in config) - // @see https://github.com/ossrs/srs/issues/151#issuecomment-71155184 virtual bool is_segment_absolutely_overflow(); public: // Whether current hls muxer is pure audio mode. diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 44c8c7102..cf1643e44 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -902,7 +902,7 @@ srs_error_t SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* ////////////////////////////////////////////////////////////////////////// // the rpc is required. // the allowd rpc method check. - if (rpc.empty() || (rpc != "reload" && rpc != "query" && rpc != "raw" && rpc != "update")) { + if (rpc.empty() || rpc != "reload") { return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW); } @@ -916,312 +916,6 @@ srs_error_t SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* return srs_api_response_code(w, r, ERROR_SUCCESS); } - // for rpc=query, to get the configs of server. - // @param scope the scope to query for config, it can be: - // global, the configs belongs to the root, donot includes any sub directives. - // minimal, the minimal summary of server, for preview stream to got the port serving. - // vhost, the configs for specified vhost by @param vhost. - // @param vhost the vhost name for @param scope is vhost to query config. - // for the default vhost, must be __defaultVhost__ - if (rpc == "query") { - if (!allow_query) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_DISABLED); - } - - std::string scope = r->query_get("scope"); - std::string vhost = r->query_get("vhost"); - if (scope.empty() || (scope != "global" && scope != "vhost" && scope != "minimal")) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_NOT_ALLOWED); - } - - if (scope == "vhost") { - // query vhost scope. - if (vhost.empty()) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - SrsConfDirective* root = _srs_config->get_root(); - SrsConfDirective* conf = root->get("vhost", vhost); - if (!conf) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - SrsJsonObject* data = SrsJsonAny::object(); - obj->set("vhost", data); - if ((err = _srs_config->vhost_to_json(conf, data)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (scope == "minimal") { - SrsJsonObject* data = SrsJsonAny::object(); - obj->set("minimal", data); - - // query minimal scope. - if ((err = _srs_config->minimal_to_json(data)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else { - SrsJsonObject* data = SrsJsonAny::object(); - obj->set("global", data); - - // query global scope. - if ((err = _srs_config->global_to_json(data)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } - - return srs_api_response(w, r, obj->dumps()); - } - - // for rpc=update, to update the configs of server. - // @scope the scope to update for config. - // @value the updated value for scope. - // @param the extra param for scope. - // @data the extra data for scope. - // possible updates: - // @scope @value value-description - // listen 1935,1936 the port list. - // pid ./objs/srs.pid the pid file of srs. - // chunk_size 60000 the global RTMP chunk_size. - // ff_log_dir ./objs the dir for ffmpeg log. - // srs_log_tank file the tank to log, file or console. - // srs_log_level trace the level of log, verbose, info, trace, warn, error. - // srs_log_file ./objs/srs.log the log file when tank is file. - // max_connections 1000 the max connections of srs. - // utc_time false whether enable utc time. - // pithy_print_ms 10000 the pithy print interval in ms. - // vhost specified updates: - // @scope @value @param @data description - // vhost ossrs.net create - create vhost ossrs.net - // vhost ossrs.net update new.ossrs.net the new name to update vhost - // dvr specified updates: - // @scope @value @param @data description - // dvr ossrs.net enable live/livestream enable the dvr of stream - // dvr ossrs.net disable live/livestream disable the dvr of stream - if (rpc == "update") { - if (!allow_update) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_DISABLED); - } - - std::string scope = r->query_get("scope"); - std::string value = r->query_get("value"); - if (scope.empty()) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_NOT_ALLOWED); - } - if (scope != "listen" && scope != "pid" && scope != "chunk_size" - && scope != "ff_log_dir" && scope != "srs_log_tank" && scope != "srs_log_level" - && scope != "srs_log_file" && scope != "max_connections" && scope != "utc_time" - && scope != "pithy_print_ms" && scope != "vhost" && scope != "dvr" - ) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_NOT_ALLOWED); - } - - bool applied = false; - string extra = ""; - if (scope == "listen") { - vector eps = srs_string_split(value, ","); - - bool invalid = eps.empty(); - for (int i = 0; i < (int)eps.size(); i++) { - string ep = eps.at(i); - int port = ::atoi(ep.c_str()); - if (port <= 2 || port >= 65535) { - invalid = true; - break; - } - } - if (invalid) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_set_listen(eps, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (scope == "pid") { - if (value.empty() || !srs_string_starts_with(value, "./", "/tmp/", "/var/") || !srs_string_ends_with(value, ".pid")) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_set_pid(value, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (scope == "chunk_size") { - int csv = ::atoi(value.c_str()); - if (csv < 128 || csv > 65535 || !srs_is_digit_number(value)) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_set_chunk_size(value, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (scope == "ff_log_dir") { - if (value.empty() || (value != "/dev/null" && !srs_string_starts_with(value, "./", "/tmp/", "/var/"))) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_set_ff_log_dir(value, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (scope == "srs_log_tank") { - if (value.empty() || (value != "file" && value != "console")) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_set_srs_log_tank(value, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (scope == "srs_log_level") { - if (value != "verbose" && value != "info" && value != "trace" && value != "warn" && value != "error") { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_set_srs_log_level(value, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (scope == "srs_log_file") { - if (value.empty() || !srs_string_starts_with(value, "./", "/tmp/", "/var/") || !srs_string_ends_with(value, ".log")) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_set_srs_log_file(value, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (scope == "max_connections") { - int mcv = ::atoi(value.c_str()); - if (mcv < 10 || mcv > 65535 || !srs_is_digit_number(value)) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_set_max_connections(value, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (scope == "utc_time") { - if (!srs_is_boolean(value)) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_set_utc_time(srs_config_bool2switch(value), applied)) != srs_success) { - return srs_api_response_code(w, r, srs_error_wrap(err, "raw api update utc_time=%s", value.c_str())); - } - } else if (scope == "pithy_print_ms") { - int ppmv = ::atoi(value.c_str()); - if (ppmv < 100 || ppmv > 300000 || !srs_is_digit_number(value)) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_set_pithy_print_ms(value, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (scope == "vhost") { - std::string param = r->query_get("param"); - std::string data = r->query_get("data"); - if (param != "create" && param != "update" && param != "delete" && param != "disable" && param != "enable") { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_NOT_ALLOWED); - } - extra += " " + param; - - if (param == "create") { - // when create, the vhost must not exists. - if (param.empty() || _srs_config->get_vhost(value, false)) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_create_vhost(value, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (param == "update") { - extra += " to " + data; - - // when update, the vhost must exists and disabled. - SrsConfDirective* vhost = _srs_config->get_vhost(value, false); - if (data.empty() || data == value || param.empty() || !vhost || _srs_config->get_vhost_enabled(vhost)) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_update_vhost(value, data, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (param == "delete") { - // when delete, the vhost must exists and disabled. - SrsConfDirective* vhost = _srs_config->get_vhost(value, false); - if (param.empty() || !vhost || _srs_config->get_vhost_enabled(vhost)) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_delete_vhost(value, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (param == "disable") { - // when disable, the vhost must exists and enabled. - SrsConfDirective* vhost = _srs_config->get_vhost(value, false); - if (param.empty() || !vhost || !_srs_config->get_vhost_enabled(vhost)) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_disable_vhost(value, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else if (param == "enable") { - // when enable, the vhost must exists and disabled. - SrsConfDirective* vhost = _srs_config->get_vhost(value, false); - if (param.empty() || !vhost || _srs_config->get_vhost_enabled(vhost)) { - return srs_api_response_code(w, r, ERROR_SYSTEM_CONFIG_RAW_PARAMS); - } - - if ((err = _srs_config->raw_enable_vhost(value, applied)) != srs_success) { - int code = srs_error_code(err); - srs_error_reset(err); - return srs_api_response_code(w, r, code); - } - } else { - // TODO: support other param. - } - } else { - // TODO: support other scope. - } - - // whether the config applied. - if (applied) { - server->on_signal(SRS_SIGNAL_PERSISTENCE_CONFIG); - srs_trace("raw api update %s=%s%s ok.", scope.c_str(), value.c_str(), extra.c_str()); - } else { - srs_warn("raw api update not applied %s=%s%s.", scope.c_str(), value.c_str(), extra.c_str()); - } - - return srs_api_response(w, r, obj->dumps()); - } - return err; } diff --git a/trunk/src/app/srs_app_http_hooks.cpp b/trunk/src/app/srs_app_http_hooks.cpp index 71193ec00..19f12fa1f 100644 --- a/trunk/src/app/srs_app_http_hooks.cpp +++ b/trunk/src/app/srs_app_http_hooks.cpp @@ -509,7 +509,6 @@ srs_error_t SrsHttpHooks::do_post(SrsHttpClient* hc, std::string url, std::strin } // ensure the http status is ok. - // https://github.com/ossrs/srs/issues/158 if (code != SRS_CONSTS_HTTP_OK && code != SRS_CONSTS_HTTP_Created) { return srs_error_new(ERROR_HTTP_STATUS_INVALID, "http: status %d", code); } diff --git a/trunk/src/app/srs_app_http_stream.cpp b/trunk/src/app/srs_app_http_stream.cpp index 231684942..4022c8fc4 100755 --- a/trunk/src/app/srs_app_http_stream.cpp +++ b/trunk/src/app/srs_app_http_stream.cpp @@ -928,7 +928,6 @@ srs_error_t SrsHttpStreamServer::http_mount(SrsLiveSource* s, SrsRequest* r) // mount the http flv stream. // we must register the handler, then start the thread, // for the thread will cause thread switch context. - // @see https://github.com/ossrs/srs/issues/404 if ((err = mux.handle(mount, entry->stream)) != srs_success) { return srs_error_wrap(err, "http: mount flv stream for vhost=%s failed", sid.c_str()); } diff --git a/trunk/src/app/srs_app_mpegts_udp.cpp b/trunk/src/app/srs_app_mpegts_udp.cpp index 148bca262..be4ad4aba 100644 --- a/trunk/src/app/srs_app_mpegts_udp.cpp +++ b/trunk/src/app/srs_app_mpegts_udp.cpp @@ -449,7 +449,6 @@ srs_error_t SrsMpegtsOverUdp::write_h264_ipb_frame(char* frame, int frame_size, srs_error_t err = srs_success; // when sps or pps not sent, ignore the packet. - // @see https://github.com/ossrs/srs/issues/203 if (!h264_sps_pps_sent) { return srs_error_new(ERROR_H264_DROP_BEFORE_SPS_PPS, "drop sps/pps"); } diff --git a/trunk/src/app/srs_app_recv_thread.cpp b/trunk/src/app/srs_app_recv_thread.cpp index 862fe1006..5542482fe 100644 --- a/trunk/src/app/srs_app_recv_thread.cpp +++ b/trunk/src/app/srs_app_recv_thread.cpp @@ -93,8 +93,6 @@ srs_error_t SrsRecvThread::cycle() // the multiple messages writev improve performance large, // but the timeout recv will cause 33% sys call performance, // to use isolate thread to recv, can improve about 33% performance. - // @see https://github.com/ossrs/srs/issues/194 - // @see: https://github.com/ossrs/srs/issues/217 rtmp->set_recv_timeout(SRS_UTIME_NO_TIMEOUT); pumper->on_start(); @@ -279,7 +277,6 @@ SrsPublishRecvThread::SrsPublishRecvThread(SrsRtmpServer* rtmp_sdk, SrsRequest* mr_fd = mr_sock_fd; // the mr settings, - // @see https://github.com/ossrs/srs/issues/241 mr = _srs_config->get_mr_enabled(req->vhost); mr_sleep = _srs_config->get_mr_sleep(req->vhost); @@ -405,7 +402,6 @@ void SrsPublishRecvThread::interrupt(srs_error_t err) recv_error = srs_error_copy(err); // when recv thread error, signal the conn thread to process it. - // @see https://github.com/ossrs/srs/issues/244 srs_cond_signal(error); } @@ -420,7 +416,6 @@ void SrsPublishRecvThread::on_start() set_socket_buffer(mr_sleep); // disable the merge read - // @see https://github.com/ossrs/srs/issues/241 rtmp->set_merge_read(true, this); } #endif @@ -432,13 +427,11 @@ void SrsPublishRecvThread::on_stop() // for we donot set to false yet. // when thread stop, signal the conn thread which wait. - // @see https://github.com/ossrs/srs/issues/244 srs_cond_signal(error); #ifdef SRS_PERF_MERGED_READ if (mr) { // disable the merge read - // @see https://github.com/ossrs/srs/issues/241 rtmp->set_merge_read(false, NULL); } #endif @@ -459,7 +452,6 @@ void SrsPublishRecvThread::on_read(ssize_t nread) * to improve read performance, merge some packets then read, * when it on and read small bytes, we sleep to wait more data., * that is, we merge some data to read together. - * @see https://github.com/ossrs/srs/issues/241 */ if (nread < SRS_MR_SMALL_BYTES) { srs_usleep(mr_sleep); @@ -476,7 +468,6 @@ srs_error_t SrsPublishRecvThread::on_reload_vhost_publish(string vhost) } // the mr settings, - // @see https://github.com/ossrs/srs/issues/241 bool mr_enabled = _srs_config->get_mr_enabled(req->vhost); srs_utime_t sleep_v = _srs_config->get_mr_sleep(req->vhost); @@ -489,13 +480,11 @@ srs_error_t SrsPublishRecvThread::on_reload_vhost_publish(string vhost) // mr enabled=>disabled if (mr && !mr_enabled) { // disable the merge read - // @see https://github.com/ossrs/srs/issues/241 rtmp->set_merge_read(false, NULL); } // mr disabled=>enabled if (!mr && mr_enabled) { // enable the merge read - // @see https://github.com/ossrs/srs/issues/241 rtmp->set_merge_read(true, this); } #endif diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index b50bcf7f6..822067ccb 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -75,7 +75,6 @@ private: // when source id changed, notice all consumers bool should_update_source_id; // The cond wait for mw. - // @see https://github.com/ossrs/srs/issues/251 srs_cond_t mw_wait; bool mw_waiting; int mw_min_msgs; diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index bfb29a0a5..44953e249 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -429,7 +429,6 @@ srs_error_t SrsRtmpConn::service_cycle() // logical accept and retry stream service. if (srs_error_code(err) == ERROR_CONTROL_RTMP_CLOSE) { // TODO: FIXME: use ping message to anti-death of socket. - // @see: https://github.com/ossrs/srs/issues/39 // set timeout to a larger value, for user paused. rtmp->set_recv_timeout(SRS_PAUSED_RECV_TIMEOUT); rtmp->set_send_timeout(SRS_PAUSED_SEND_TIMEOUT); @@ -670,7 +669,6 @@ srs_error_t SrsRtmpConn::playing(SrsLiveSource* source) } // Use receiving thread to receive packets from peer. - // @see: https://github.com/ossrs/srs/issues/217 SrsQueueRecvThread trd(consumer, rtmp, SRS_PERF_MW_SLEEP, _srs_context->get_id()); if ((err = trd.start()) != srs_success) { @@ -731,8 +729,6 @@ srs_error_t SrsRtmpConn::do_playing(SrsLiveSource* source, SrsLiveConsumer* cons pprint->elapse(); // to use isolate thread to recv, can improve about 33% performance. - // @see: https://github.com/ossrs/srs/issues/196 - // @see: https://github.com/ossrs/srs/issues/217 while (!rtrd->empty()) { SrsCommonMessage* msg = rtrd->pump(); if ((err = process_play_control_msg(consumer, msg)) != srs_success) { @@ -1114,7 +1110,6 @@ srs_error_t SrsRtmpConn::process_play_control_msg(SrsLiveConsumer* consumer, Srs SrsAutoFree(SrsPacket, pkt); // for jwplayer/flowplayer, which send close as pause message. - // @see https://github.com/ossrs/srs/issues/6 SrsCloseStreamPacket* close = dynamic_cast(pkt); if (close) { return srs_error_new(ERROR_CONTROL_RTMP_CLOSE, "rtmp: close stream"); @@ -1122,7 +1117,6 @@ srs_error_t SrsRtmpConn::process_play_control_msg(SrsLiveConsumer* consumer, Srs // call msg, // support response null first, - // @see https://github.com/ossrs/srs/issues/106 // TODO: FIXME: response in right way, or forward in edge mode. SrsCallPacket* call = dynamic_cast(pkt); if (call) { diff --git a/trunk/src/app/srs_app_rtmp_conn.hpp b/trunk/src/app/srs_app_rtmp_conn.hpp index ce2b0484d..720dd4452 100644 --- a/trunk/src/app/srs_app_rtmp_conn.hpp +++ b/trunk/src/app/srs_app_rtmp_conn.hpp @@ -82,7 +82,6 @@ private: ISrsWakable* wakable; // The elapsed duration in srs_utime_t // For live play duration, for instance, rtmpdump to record. - // @see https://github.com/ossrs/srs/issues/47 srs_utime_t duration; // The MR(merged-write) sleep time in srs_utime_t. srs_utime_t mw_sleep; diff --git a/trunk/src/app/srs_app_rtsp.cpp b/trunk/src/app/srs_app_rtsp.cpp deleted file mode 100644 index ebf4900ef..000000000 --- a/trunk/src/app/srs_app_rtsp.cpp +++ /dev/null @@ -1,785 +0,0 @@ -// -// Copyright (c) 2013-2021 The SRS Authors -// -// SPDX-License-Identifier: MIT -// - -#include - -#include -using namespace std; - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -SrsRtpConn::SrsRtpConn(SrsRtspConn* r, int p, int sid) -{ - rtsp = r; - _port = p; - stream_id = sid; - // TODO: support listen at <[ip:]port> - listener = new SrsUdpListener(this, srs_any_address_for_listener(), p); - cache = new SrsRtspPacket(); - pprint = SrsPithyPrint::create_caster(); -} - -SrsRtpConn::~SrsRtpConn() -{ - srs_freep(listener); - srs_freep(cache); - srs_freep(pprint); -} - -int SrsRtpConn::port() -{ - return _port; -} - -srs_error_t SrsRtpConn::listen() -{ - return listener->listen(); -} - -srs_error_t SrsRtpConn::on_udp_packet(const sockaddr* from, const int fromlen, char* buf, int nb_buf) -{ - srs_error_t err = srs_success; - - pprint->elapse(); - - if (true) { - SrsBuffer stream(buf, nb_buf); - - SrsRtspPacket pkt; - if ((err = pkt.decode(&stream)) != srs_success) { - return srs_error_wrap(err, "decode"); - } - - if (pkt.chunked) { - if (!cache) { - cache = new SrsRtspPacket(); - } - cache->copy(&pkt); - cache->payload->append(pkt.payload->bytes(), pkt.payload->length()); - if (pprint->can_print()) { - srs_trace("<- " SRS_CONSTS_LOG_STREAM_CASTER " rtsp: rtp chunked %dB, age=%d, vt=%d/%u, sts=%u/%#x/%#x, paylod=%dB", - nb_buf, pprint->age(), cache->version, cache->payload_type, cache->sequence_number, cache->timestamp, cache->ssrc, - cache->payload->length() - ); - } - - if (!cache->completed){ - return err; - } - } else { - srs_freep(cache); - cache = new SrsRtspPacket(); - cache->reap(&pkt); - } - } - - if (pprint->can_print()) { - srs_trace("<- " SRS_CONSTS_LOG_STREAM_CASTER " rtsp: rtp #%d %dB, age=%d, vt=%d/%u, sts=%u/%u/%#x, paylod=%dB, chunked=%d", - stream_id, nb_buf, pprint->age(), cache->version, cache->payload_type, cache->sequence_number, cache->timestamp, cache->ssrc, - cache->payload->length(), cache->chunked - ); - } - - // always free it. - SrsAutoFree(SrsRtspPacket, cache); - - err = rtsp->on_rtp_packet(cache, stream_id); - if (err != srs_success) { - srs_warn("ignore RTP packet err %s", srs_error_desc(err).c_str()); - srs_freep(err); - } - - return err; -} - -SrsRtspAudioCache::SrsRtspAudioCache() -{ - dts = 0; - audio = NULL; - payload = NULL; -} - -SrsRtspAudioCache::~SrsRtspAudioCache() -{ - srs_freep(audio); - srs_freep(payload); -} - -SrsRtspJitter::SrsRtspJitter() -{ - delta = 0; - previous_timestamp = 0; - pts = 0; -} - -SrsRtspJitter::~SrsRtspJitter() -{ -} - -int64_t SrsRtspJitter::timestamp() -{ - return pts; -} - -srs_error_t SrsRtspJitter::correct(int64_t& ts) -{ - srs_error_t err = srs_success; - - if (previous_timestamp == 0) { - previous_timestamp = ts; - } - - delta = srs_max(0, (int)(ts - previous_timestamp)); - if (delta > 90000) { - delta = 0; - } - - previous_timestamp = ts; - - ts = pts + delta; - pts = ts; - - return err; -} - -SrsRtspConn::SrsRtspConn(SrsRtspCaster* c, srs_netfd_t fd, std::string o) -{ - output_template = o; - - session = ""; - video_rtp = NULL; - audio_rtp = NULL; - - caster = c; - stfd = fd; - skt = new SrsStSocket(); - rtsp = new SrsRtspStack(skt); - trd = new SrsSTCoroutine("rtsp", this); - - audio_id = 0; - video_id = 0; - audio_sample_rate = 0; - audio_channel = 0; - - req = NULL; - sdk = NULL; - vjitter = new SrsRtspJitter(); - ajitter = new SrsRtspJitter(); - - avc = new SrsRawH264Stream(); - aac = new SrsRawAacStream(); - acodec = new SrsRawAacStreamCodec(); - acache = new SrsRtspAudioCache(); -} - -SrsRtspConn::~SrsRtspConn() -{ - close(); - - srs_close_stfd(stfd); - - srs_freep(video_rtp); - srs_freep(audio_rtp); - - srs_freep(trd); - srs_freep(skt); - srs_freep(rtsp); - - srs_freep(sdk); - srs_freep(req); - - srs_freep(vjitter); - srs_freep(ajitter); - - srs_freep(avc); - srs_freep(aac); - srs_freep(acodec); - srs_freep(acache); -} - -srs_error_t SrsRtspConn::serve() -{ - srs_error_t err = srs_success; - - if ((err = skt->initialize(stfd)) != srs_success) { - return srs_error_wrap(err, "socket initialize"); - } - - if ((err = trd->start()) != srs_success) { - return srs_error_wrap(err, "rtsp connection"); - } - - return err; -} - -std::string SrsRtspConn::remote_ip() -{ - // TODO: FIXME: Implement it. - return ""; -} - -std::string SrsRtspConn::desc() -{ - return "RtspConn"; -} - -const SrsContextId& SrsRtspConn::get_id() -{ - return _srs_context->get_id(); -} - -srs_error_t SrsRtspConn::do_cycle() -{ - srs_error_t err = srs_success; - - // retrieve ip of client. - int fd = srs_netfd_fileno(stfd); - std::string ip = srs_get_peer_ip(fd); - int port = srs_get_peer_port(fd); - - if (ip.empty() && !_srs_config->empty_ip_ok()) { - srs_warn("empty ip for fd=%d", srs_netfd_fileno(stfd)); - } - srs_trace("rtsp: serve %s:%d", ip.c_str(), port); - - // consume all rtsp messages. - while (true) { - if ((err = trd->pull()) != srs_success) { - return srs_error_wrap(err, "rtsp cycle"); - } - - SrsRtspRequest* req = NULL; - if ((err = rtsp->recv_message(&req)) != srs_success) { - return srs_error_wrap(err, "recv message"); - } - SrsAutoFree(SrsRtspRequest, req); - srs_info("rtsp: got rtsp request"); - - if (req->is_options()) { - SrsRtspOptionsResponse* res = new SrsRtspOptionsResponse((int)req->seq); - res->session = session; - if ((err = rtsp->send_message(res)) != srs_success) { - return srs_error_wrap(err, "response option"); - } - } else if (req->is_announce()) { - if (rtsp_tcUrl.empty()) { - rtsp_tcUrl = req->uri; - } - size_t pos = string::npos; - if ((pos = rtsp_tcUrl.rfind(".sdp")) != string::npos) { - rtsp_tcUrl = rtsp_tcUrl.substr(0, pos); - } - srs_parse_rtmp_url(rtsp_tcUrl, rtsp_tcUrl, rtsp_stream); - - srs_assert(req->sdp); - video_id = ::atoi(req->sdp->video_stream_id.c_str()); - audio_id = ::atoi(req->sdp->audio_stream_id.c_str()); - video_codec = req->sdp->video_codec; - audio_codec = req->sdp->audio_codec; - audio_sample_rate = ::atoi(req->sdp->audio_sample_rate.c_str()); - audio_channel = ::atoi(req->sdp->audio_channel.c_str()); - h264_sps = req->sdp->video_sps; - h264_pps = req->sdp->video_pps; - aac_specific_config = req->sdp->audio_sh; - srs_trace("rtsp: video(#%d, %s, %s/%s), audio(#%d, %s, %s/%s, %dHZ %dchannels), %s/%s", - video_id, video_codec.c_str(), req->sdp->video_protocol.c_str(), req->sdp->video_transport_format.c_str(), - audio_id, audio_codec.c_str(), req->sdp->audio_protocol.c_str(), req->sdp->audio_transport_format.c_str(), - audio_sample_rate, audio_channel, rtsp_tcUrl.c_str(), rtsp_stream.c_str() - ); - - SrsRtspResponse* res = new SrsRtspResponse((int)req->seq); - res->session = session; - if ((err = rtsp->send_message(res)) != srs_success) { - return srs_error_wrap(err, "response announce"); - } - } else if (req->is_setup()) { - srs_assert(req->transport); - int lpm = 0; - if ((err = caster->alloc_port(&lpm)) != srs_success) { - return srs_error_wrap(err, "alloc port"); - } - - SrsRtpConn* rtp = NULL; - if (req->stream_id == video_id) { - srs_freep(video_rtp); - rtp = video_rtp = new SrsRtpConn(this, lpm, video_id); - } else { - srs_freep(audio_rtp); - rtp = audio_rtp = new SrsRtpConn(this, lpm, audio_id); - } - if ((err = rtp->listen()) != srs_success) { - return srs_error_wrap(err, "rtp listen"); - } - srs_trace("rtsp: #%d %s over %s/%s/%s %s client-port=%d-%d, server-port=%d-%d", - req->stream_id, (req->stream_id == video_id)? "Video":"Audio", - req->transport->transport.c_str(), req->transport->profile.c_str(), req->transport->lower_transport.c_str(), - req->transport->cast_type.c_str(), req->transport->client_port_min, req->transport->client_port_max, - lpm, lpm + 1); - - // create session. - if (session.empty()) { - session = "O9EaZ4bf"; // TODO: FIXME: generate session id. - } - - SrsRtspSetupResponse* res = new SrsRtspSetupResponse((int)req->seq); - res->client_port_min = req->transport->client_port_min; - res->client_port_max = req->transport->client_port_max; - res->local_port_min = lpm; - res->local_port_max = lpm + 1; - res->session = session; - if ((err = rtsp->send_message(res)) != srs_success) { - return srs_error_wrap(err, "response setup"); - } - } else if (req->is_record()) { - SrsRtspResponse* res = new SrsRtspResponse((int)req->seq); - res->session = session; - if ((err = rtsp->send_message(res)) != srs_success) { - return srs_error_wrap(err, "response record"); - } - } - } - - return err; -} - -srs_error_t SrsRtspConn::on_rtp_packet(SrsRtspPacket* pkt, int stream_id) -{ - srs_error_t err = srs_success; - - // ensure rtmp connected. - if ((err = connect()) != srs_success) { - return srs_error_wrap(err, "connect"); - } - - if (stream_id == video_id) { - // rtsp tbn is ts tbn. - int64_t pts = pkt->timestamp; - if ((err = vjitter->correct(pts)) != srs_success) { - return srs_error_wrap(err, "jitter"); - } - - // TODO: FIXME: set dts to pts, please finger out the right dts. - int64_t dts = pts; - - return on_rtp_video(pkt, dts, pts); - } else { - // rtsp tbn is ts tbn. - int64_t pts = pkt->timestamp; - if ((err = ajitter->correct(pts)) != srs_success) { - return srs_error_wrap(err, "jitter"); - } - - return on_rtp_audio(pkt, pts); - } - - return err; -} - -srs_error_t SrsRtspConn::cycle() -{ - // serve the rtsp client. - srs_error_t err = do_cycle(); - - caster->remove(this); - - if (err == srs_success) { - srs_trace("client finished."); - } else if (srs_is_client_gracefully_close(err)) { - srs_warn("client disconnect peer. code=%d", srs_error_code(err)); - srs_freep(err); - } - - if (video_rtp) { - caster->free_port(video_rtp->port(), video_rtp->port() + 1); - } - - if (audio_rtp) { - caster->free_port(audio_rtp->port(), audio_rtp->port() + 1); - } - - return err; -} - -srs_error_t SrsRtspConn::on_rtp_video(SrsRtspPacket* pkt, int64_t dts, int64_t pts) -{ - srs_error_t err = srs_success; - - if ((err = kickoff_audio_cache(pkt, dts)) != srs_success) { - return srs_error_wrap(err, "kickoff audio cache"); - } - - char* bytes = pkt->payload->bytes(); - int length = pkt->payload->length(); - uint32_t fdts = (uint32_t)(dts / 90); - uint32_t fpts = (uint32_t)(pts / 90); - if ((err = write_h264_ipb_frame(bytes, length, fdts, fpts)) != srs_success) { - return srs_error_wrap(err, "write ibp frame"); - } - - return err; -} - -srs_error_t SrsRtspConn::on_rtp_audio(SrsRtspPacket* pkt, int64_t dts) -{ - srs_error_t err = srs_success; - - if ((err = kickoff_audio_cache(pkt, dts)) != srs_success) { - return srs_error_wrap(err, "kickoff audio cache"); - } - - // cache current audio to kickoff. - acache->dts = dts; - acache->audio = pkt->audio; - acache->payload = pkt->payload; - - pkt->audio = NULL; - pkt->payload = NULL; - - return err; -} - -srs_error_t SrsRtspConn::kickoff_audio_cache(SrsRtspPacket* pkt, int64_t dts) -{ - srs_error_t err = srs_success; - - // nothing to kick off. - if (!acache->payload) { - return err; - } - - if (dts - acache->dts > 0 && acache->audio->nb_samples > 0) { - int64_t delta = (dts - acache->dts) / acache->audio->nb_samples; - for (int i = 0; i < acache->audio->nb_samples; i++) { - char* frame = acache->audio->samples[i].bytes; - int nb_frame = acache->audio->samples[i].size; - int64_t timestamp = (acache->dts + delta * i) / 90; - acodec->aac_packet_type = 1; - if ((err = write_audio_raw_frame(frame, nb_frame, acodec, (uint32_t)timestamp)) != srs_success) { - return srs_error_wrap(err, "write audio raw frame"); - } - } - } - - acache->dts = 0; - srs_freep(acache->audio); - srs_freep(acache->payload); - - return err; -} - -srs_error_t SrsRtspConn::write_sequence_header() -{ - srs_error_t err = srs_success; - - // use the current dts. - int64_t dts = vjitter->timestamp() / 90; - - // send video sps/pps - if ((err = write_h264_sps_pps((uint32_t)dts, (uint32_t)dts)) != srs_success) { - return srs_error_wrap(err, "write sps/pps"); - } - - // generate audio sh by audio specific config. - if (aac_specific_config.empty()) { - srs_warn("no audio asc"); - return err; - } - - std::string sh = aac_specific_config; - - SrsFormat* format = new SrsFormat(); - SrsAutoFree(SrsFormat, format); - - if ((err = format->on_aac_sequence_header((char*)sh.c_str(), (int)sh.length())) != srs_success) { - return srs_error_wrap(err, "on aac sequence header"); - } - - SrsAudioCodecConfig* dec = format->acodec; - - acodec->sound_format = SrsAudioCodecIdAAC; - acodec->sound_type = (dec->aac_channels == 2)? SrsAudioChannelsStereo : SrsAudioChannelsMono; - acodec->sound_size = SrsAudioSampleBits16bit; - acodec->aac_packet_type = 0; - - static int srs_aac_srates[] = { - 96000, 88200, 64000, 48000, - 44100, 32000, 24000, 22050, - 16000, 12000, 11025, 8000, - 7350, 0, 0, 0 - }; - switch (srs_aac_srates[dec->aac_sample_rate]) { - case 11025: - acodec->sound_rate = SrsAudioSampleRate11025; - break; - case 22050: - acodec->sound_rate = SrsAudioSampleRate22050; - break; - case 44100: - acodec->sound_rate = SrsAudioSampleRate44100; - break; - default: - break; - }; - - if ((err = write_audio_raw_frame((char*)sh.data(), (int)sh.length(), acodec, (uint32_t)dts)) != srs_success) { - return srs_error_wrap(err, "write audio raw frame"); - } - - return err; -} - -srs_error_t SrsRtspConn::write_h264_sps_pps(uint32_t dts, uint32_t pts) -{ - srs_error_t err = srs_success; - - if (h264_sps.empty() || h264_pps.empty()) { - srs_warn("no sps=%dB or pps=%dB", (int)h264_sps.size(), (int)h264_pps.size()); - return err; - } - - // h264 raw to h264 packet. - std::string sh; - if ((err = avc->mux_sequence_header(h264_sps, h264_pps, dts, pts, sh)) != srs_success) { - return srs_error_wrap(err, "mux sequence header"); - } - - // h264 packet to flv packet. - int8_t frame_type = SrsVideoAvcFrameTypeKeyFrame; - int8_t avc_packet_type = SrsVideoAvcFrameTraitSequenceHeader; - char* flv = NULL; - int nb_flv = 0; - if ((err = avc->mux_avc2flv(sh, frame_type, avc_packet_type, dts, pts, &flv, &nb_flv)) != srs_success) { - return srs_error_wrap(err, "mux avc to flv"); - } - - // the timestamp in rtmp message header is dts. - uint32_t timestamp = dts; - if ((err = rtmp_write_packet(SrsFrameTypeVideo, timestamp, flv, nb_flv)) != srs_success) { - return srs_error_wrap(err, "write packet"); - } - - return err; -} - -srs_error_t SrsRtspConn::write_h264_ipb_frame(char* frame, int frame_size, uint32_t dts, uint32_t pts) -{ - srs_error_t err = srs_success; - - // 5bits, 7.3.1 NAL unit syntax, - // ISO_IEC_14496-10-AVC-2003.pdf, page 44. - // 7: SPS, 8: PPS, 5: I Frame, 1: P Frame - SrsAvcNaluType nal_unit_type = (SrsAvcNaluType)(frame[0] & 0x1f); - - // for IDR frame, the frame is keyframe. - SrsVideoAvcFrameType frame_type = SrsVideoAvcFrameTypeInterFrame; - if (nal_unit_type == SrsAvcNaluTypeIDR) { - frame_type = SrsVideoAvcFrameTypeKeyFrame; - } - - std::string ibp; - if ((err = avc->mux_ipb_frame(frame, frame_size, ibp)) != srs_success) { - return srs_error_wrap(err, "mux ibp frame"); - } - - int8_t avc_packet_type = SrsVideoAvcFrameTraitNALU; - char* flv = NULL; - int nb_flv = 0; - if ((err = avc->mux_avc2flv(ibp, frame_type, avc_packet_type, dts, pts, &flv, &nb_flv)) != srs_success) { - return srs_error_wrap(err, "mux avc to flv"); - } - - // the timestamp in rtmp message header is dts. - uint32_t timestamp = dts; - return rtmp_write_packet(SrsFrameTypeVideo, timestamp, flv, nb_flv); -} - -srs_error_t SrsRtspConn::write_audio_raw_frame(char* frame, int frame_size, SrsRawAacStreamCodec* codec, uint32_t dts) -{ - srs_error_t err = srs_success; - - char* data = NULL; - int size = 0; - if ((err = aac->mux_aac2flv(frame, frame_size, codec, dts, &data, &size)) != srs_success) { - return srs_error_wrap(err, "mux aac to flv"); - } - - return rtmp_write_packet(SrsFrameTypeAudio, dts, data, size); -} - -srs_error_t SrsRtspConn::rtmp_write_packet(char type, uint32_t timestamp, char* data, int size) -{ - srs_error_t err = srs_success; - - if ((err = connect()) != srs_success) { - return srs_error_wrap(err, "connect"); - } - - SrsSharedPtrMessage* msg = NULL; - - if ((err = srs_rtmp_create_msg(type, timestamp, data, size, sdk->sid(), &msg)) != srs_success) { - return srs_error_wrap(err, "create message"); - } - srs_assert(msg); - - // send out encoded msg. - if ((err = sdk->send_and_free_message(msg)) != srs_success) { - close(); - return srs_error_wrap(err, "write message"); - } - - return err; -} - -srs_error_t SrsRtspConn::connect() -{ - srs_error_t err = srs_success; - - // Ignore when connected. - if (sdk) { - return err; - } - - // generate rtmp url to connect to. - std::string url; - if (!req) { - std::string schema, host, vhost, app, param; - int port; - srs_discovery_tc_url(rtsp_tcUrl, schema, host, vhost, app, rtsp_stream, port, param); - - // generate output by template. - std::string output = output_template; - output = srs_string_replace(output, "[app]", app); - output = srs_string_replace(output, "[stream]", rtsp_stream); - url = output; - } - - // connect host. - srs_utime_t cto = SRS_CONSTS_RTMP_TIMEOUT; - srs_utime_t sto = SRS_CONSTS_RTMP_PULSE; - sdk = new SrsSimpleRtmpClient(url, cto, sto); - - if ((err = sdk->connect()) != srs_success) { - close(); - return srs_error_wrap(err, "connect %s failed, cto=%dms, sto=%dms.", url.c_str(), srsu2msi(cto), srsu2msi(sto)); - } - - // publish. - if ((err = sdk->publish(SRS_CONSTS_RTMP_PROTOCOL_CHUNK_SIZE)) != srs_success) { - close(); - return srs_error_wrap(err, "publish %s failed", url.c_str()); - } - - return write_sequence_header(); -} - -void SrsRtspConn::close() -{ - srs_freep(sdk); -} - -SrsRtspCaster::SrsRtspCaster(SrsConfDirective* c) -{ - // TODO: FIXME: support reload. - engine = _srs_config->get_stream_caster_engine(c); - output = _srs_config->get_stream_caster_output(c); - local_port_min = _srs_config->get_stream_caster_rtp_port_min(c); - local_port_max = _srs_config->get_stream_caster_rtp_port_max(c); - manager = new SrsResourceManager("CRTSP"); -} - -SrsRtspCaster::~SrsRtspCaster() -{ - std::vector::iterator it; - for (it = clients.begin(); it != clients.end(); ++it) { - SrsRtspConn* conn = *it; - manager->remove(conn); - } - clients.clear(); - used_ports.clear(); - - srs_freep(manager); -} - -srs_error_t SrsRtspCaster::initialize() -{ - srs_error_t err = srs_success; - if ((err = manager->start()) != srs_success) { - return srs_error_wrap(err, "start manager"); - } - return err; -} - -srs_error_t SrsRtspCaster::alloc_port(int* pport) -{ - srs_error_t err = srs_success; - - // use a pair of port. - for (int i = local_port_min; i < local_port_max - 1; i += 2) { - if (!used_ports[i]) { - used_ports[i] = true; - used_ports[i + 1] = true; - *pport = i; - break; - } - } - srs_trace("rtsp: %s alloc port=%d-%d", engine.c_str(), *pport, *pport + 1); - - return err; -} - -void SrsRtspCaster::free_port(int lpmin, int lpmax) -{ - for (int i = lpmin; i < lpmax; i++) { - used_ports[i] = false; - } - srs_trace("rtsp: %s free rtp port=%d-%d", engine.c_str(), lpmin, lpmax); -} - -srs_error_t SrsRtspCaster::on_tcp_client(srs_netfd_t stfd) -{ - srs_error_t err = srs_success; - - SrsRtspConn* conn = new SrsRtspConn(this, stfd, output); - - if ((err = conn->serve()) != srs_success) { - srs_freep(conn); - return srs_error_wrap(err, "serve conn"); - } - - clients.push_back(conn); - - return err; -} - -void SrsRtspCaster::remove(SrsRtspConn* conn) -{ - std::vector::iterator it = find(clients.begin(), clients.end(), conn); - if (it != clients.end()) { - clients.erase(it); - } - srs_info("rtsp: remove connection from caster."); - - manager->remove(conn); -} - diff --git a/trunk/src/app/srs_app_rtsp.hpp b/trunk/src/app/srs_app_rtsp.hpp deleted file mode 100644 index 82d307ec9..000000000 --- a/trunk/src/app/srs_app_rtsp.hpp +++ /dev/null @@ -1,192 +0,0 @@ -// -// Copyright (c) 2013-2021 The SRS Authors -// -// SPDX-License-Identifier: MIT -// - -#ifndef SRS_APP_RTSP_HPP -#define SRS_APP_RTSP_HPP - -#include - -#include -#include -#include - -#include -#include -#include - -class SrsStSocket; -class SrsRtspConn; -class SrsRtspStack; -class SrsRtspCaster; -class SrsConfDirective; -class SrsRtspPacket; -class SrsRequest; -class SrsStSocket; -class SrsRtmpClient; -class SrsRawH264Stream; -class SrsRawAacStream; -struct SrsRawAacStreamCodec; -class SrsSharedPtrMessage; -class SrsAudioFrame; -class SrsSimpleStream; -class SrsPithyPrint; -class SrsSimpleRtmpClient; -class SrsResourceManager; - -// A rtp connection which transport a stream. -class SrsRtpConn: public ISrsUdpHandler -{ -private: - SrsPithyPrint* pprint; - SrsUdpListener* listener; - SrsRtspConn* rtsp; - SrsRtspPacket* cache; - int stream_id; - int _port; -public: - SrsRtpConn(SrsRtspConn* r, int p, int sid); - virtual ~SrsRtpConn(); -public: - virtual int port(); - virtual srs_error_t listen(); -// Interface ISrsUdpHandler -public: - virtual srs_error_t on_udp_packet(const sockaddr* from, const int fromlen, char* buf, int nb_buf); -}; - -// The audio cache, audio is grouped by frames. -struct SrsRtspAudioCache -{ - int64_t dts; - SrsAudioFrame* audio; - SrsSimpleStream* payload; - - SrsRtspAudioCache(); - virtual ~SrsRtspAudioCache(); -}; - -// The time jitter correct for rtsp. -class SrsRtspJitter -{ -private: - int64_t previous_timestamp; - int64_t pts; - int delta; -public: - SrsRtspJitter(); - virtual ~SrsRtspJitter(); -public: - virtual int64_t timestamp(); - virtual srs_error_t correct(int64_t& ts); -}; - -// The rtsp connection serve the fd. -class SrsRtspConn : public ISrsCoroutineHandler, public ISrsConnection -{ -private: - std::string output_template; - std::string rtsp_tcUrl; - std::string rtsp_stream; -private: - std::string session; - // video stream. - int video_id; - std::string video_codec; - SrsRtpConn* video_rtp; - // audio stream. - int audio_id; - std::string audio_codec; - int audio_sample_rate; - int audio_channel; - SrsRtpConn* audio_rtp; -private: - srs_netfd_t stfd; - SrsStSocket* skt; - SrsRtspStack* rtsp; - SrsRtspCaster* caster; - SrsCoroutine* trd; -private: - SrsRequest* req; - SrsSimpleRtmpClient* sdk; - SrsRtspJitter* vjitter; - SrsRtspJitter* ajitter; -private: - SrsRawH264Stream* avc; - std::string h264_sps; - std::string h264_pps; -private: - SrsRawAacStream* aac; - SrsRawAacStreamCodec* acodec; - std::string aac_specific_config; - SrsRtspAudioCache* acache; -public: - SrsRtspConn(SrsRtspCaster* c, srs_netfd_t fd, std::string o); - virtual ~SrsRtspConn(); -public: - virtual srs_error_t serve(); -// Interface ISrsConnection. -public: - virtual std::string remote_ip(); - virtual const SrsContextId& get_id(); - virtual std::string desc(); -private: - virtual srs_error_t do_cycle(); -// internal methods -public: - virtual srs_error_t on_rtp_packet(SrsRtspPacket* pkt, int stream_id); -// Interface ISrsOneCycleThreadHandler -public: - virtual srs_error_t cycle(); -private: - virtual srs_error_t on_rtp_video(SrsRtspPacket* pkt, int64_t dts, int64_t pts); - virtual srs_error_t on_rtp_audio(SrsRtspPacket* pkt, int64_t dts); - virtual srs_error_t kickoff_audio_cache(SrsRtspPacket* pkt, int64_t dts); -private: - virtual srs_error_t write_sequence_header(); - virtual srs_error_t write_h264_sps_pps(uint32_t dts, uint32_t pts); - virtual srs_error_t write_h264_ipb_frame(char* frame, int frame_size, uint32_t dts, uint32_t pts); - virtual srs_error_t write_audio_raw_frame(char* frame, int frame_size, SrsRawAacStreamCodec* codec, uint32_t dts); - virtual srs_error_t rtmp_write_packet(char type, uint32_t timestamp, char* data, int size); -private: - // Connect to RTMP server. - virtual srs_error_t connect(); - // Close the connection to RTMP server. - virtual void close(); -}; - -// The caster for rtsp. -class SrsRtspCaster : public ISrsTcpHandler -{ -private: - std::string engine; - std::string output; - int local_port_min; - int local_port_max; - // The key: port, value: whether used. - std::map used_ports; -private: - std::vector clients; - SrsResourceManager* manager; -public: - SrsRtspCaster(SrsConfDirective* c); - virtual ~SrsRtspCaster(); -public: - // Alloc a rtp port from local ports pool. - // @param pport output the rtp port. - virtual srs_error_t alloc_port(int* pport); - // Free the alloced rtp port. - virtual void free_port(int lpmin, int lpmax); - virtual srs_error_t initialize(); -// Interface ISrsTcpHandler -public: - virtual srs_error_t on_tcp_client(srs_netfd_t stfd); -// internal methods. -public: - virtual void remove(SrsRtspConn* conn); -}; - -#endif - diff --git a/trunk/src/app/srs_app_security.hpp b/trunk/src/app/srs_app_security.hpp index 48973056b..42652f4d8 100644 --- a/trunk/src/app/srs_app_security.hpp +++ b/trunk/src/app/srs_app_security.hpp @@ -16,7 +16,6 @@ class SrsConfDirective; // The security apply on vhost. -// @see https://github.com/ossrs/srs/issues/211 class SrsSecurity { public: diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 1b3109960..9ba3357eb 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -30,7 +30,6 @@ using namespace std; #include #include #include -#include #include #include #include @@ -53,8 +52,6 @@ std::string srs_listener_type2string(SrsListenerType type) return "HTTP-Server"; case SrsListenerMpegTsOverUdp: return "MPEG-TS over UDP"; - case SrsListenerRtsp: - return "RTSP"; case SrsListenerFlv: return "HTTP-FLV"; default: @@ -119,62 +116,6 @@ srs_error_t SrsBufferListener::on_tcp_client(srs_netfd_t stfd) return srs_success; } -SrsRtspListener::SrsRtspListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c) : SrsListener(svr, t) -{ - listener = NULL; - - // the caller already ensure the type is ok, - // we just assert here for unknown stream caster. - srs_assert(type == SrsListenerRtsp); - if (type == SrsListenerRtsp) { - caster = new SrsRtspCaster(c); - - // TODO: FIXME: Must check error. - caster->initialize(); - } -} - -SrsRtspListener::~SrsRtspListener() -{ - srs_freep(caster); - srs_freep(listener); -} - -srs_error_t SrsRtspListener::listen(string i, int p) -{ - srs_error_t err = srs_success; - - // the caller already ensure the type is ok, - // we just assert here for unknown stream caster. - srs_assert(type == SrsListenerRtsp); - - ip = i; - port = p; - - srs_freep(listener); - listener = new SrsTcpListener(this, ip, port); - - if ((err = listener->listen()) != srs_success) { - return srs_error_wrap(err, "rtsp listen %s:%d", ip.c_str(), port); - } - - string v = srs_listener_type2string(type); - srs_trace("%s listen at tcp://%s:%d, fd=%d", v.c_str(), ip.c_str(), port, listener->fd()); - - return err; -} - -srs_error_t SrsRtspListener::on_tcp_client(srs_netfd_t stfd) -{ - srs_error_t err = caster->on_tcp_client(stfd); - if (err != srs_success) { - srs_warn("accept client failed, err is %s", srs_error_desc(err).c_str()); - srs_freep(err); - } - - return srs_success; -} - SrsHttpFlvListener::SrsHttpFlvListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c) : SrsListener(svr, t) { listener = NULL; @@ -629,7 +570,6 @@ void SrsServer::dispose() close_listeners(SrsListenerHttpStream); close_listeners(SrsListenerHttpsStream); close_listeners(SrsListenerMpegTsOverUdp); - close_listeners(SrsListenerRtsp); close_listeners(SrsListenerFlv); // Fast stop to notify FFMPEG to quit, wait for a while then fast kill. @@ -656,7 +596,6 @@ void SrsServer::gracefully_dispose() close_listeners(SrsListenerHttpStream); close_listeners(SrsListenerHttpsStream); close_listeners(SrsListenerMpegTsOverUdp); - close_listeners(SrsListenerRtsp); close_listeners(SrsListenerFlv); srs_trace("listeners closed"); @@ -1359,9 +1298,6 @@ srs_error_t SrsServer::listen_stream_caster() std::string caster = _srs_config->get_stream_caster_engine(stream_caster); if (srs_stream_caster_is_udp(caster)) { listener = new SrsUdpCasterListener(this, SrsListenerMpegTsOverUdp, stream_caster); - } else if (srs_stream_caster_is_rtsp(caster)) { - srs_warn("It's deprecated and will be removed in the future, see https://github.com/ossrs/srs/issues/2304#issuecomment-826009290"); - listener = new SrsRtspListener(this, SrsListenerRtsp, stream_caster); } else if (srs_stream_caster_is_flv(caster)) { listener = new SrsHttpFlvListener(this, SrsListenerFlv, stream_caster); } else { diff --git a/trunk/src/app/srs_app_server.hpp b/trunk/src/app/srs_app_server.hpp index 9c9fecf53..dd4dc0af8 100644 --- a/trunk/src/app/srs_app_server.hpp +++ b/trunk/src/app/srs_app_server.hpp @@ -34,7 +34,6 @@ class ISrsUdpHandler; class SrsUdpListener; class SrsTcpListener; class SrsAppCasterFlv; -class SrsRtspCaster; class SrsResourceManager; class SrsLatestVersion; @@ -50,8 +49,6 @@ enum SrsListenerType SrsListenerHttpStream = 2, // UDP stream, MPEG-TS over udp. SrsListenerMpegTsOverUdp = 3, - // TCP stream, RTSP stream. - SrsListenerRtsp = 4, // TCP stream, FLV stream over HTTP. SrsListenerFlv = 5, // HTTPS api, @@ -92,22 +89,6 @@ public: virtual srs_error_t on_tcp_client(srs_netfd_t stfd); }; -// A TCP listener, for rtsp server. -class SrsRtspListener : public SrsListener, public ISrsTcpHandler -{ -private: - SrsTcpListener* listener; - SrsRtspCaster* caster; -public: - SrsRtspListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c); - virtual ~SrsRtspListener(); -public: - virtual srs_error_t listen(std::string i, int p); -// Interface ISrsTcpHandler -public: - virtual srs_error_t on_tcp_client(srs_netfd_t stfd); -}; - // A TCP listener, for flv stream server. class SrsHttpFlvListener : public SrsListener, public ISrsTcpHandler { diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index 86b36866d..77716b335 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 167 +#define VERSION_REVISION 171 #endif diff --git a/trunk/src/kernel/srs_kernel_codec.cpp b/trunk/src/kernel/srs_kernel_codec.cpp index 48a2c96b5..ae819ce39 100644 --- a/trunk/src/kernel/srs_kernel_codec.cpp +++ b/trunk/src/kernel/srs_kernel_codec.cpp @@ -1078,10 +1078,57 @@ srs_error_t SrsFormat::avc_demux_sps_rbsp(char* rbsp, int nb_rbsp) if ((err = srs_avc_nalu_read_uev(&bs, pic_height_in_map_units_minus1)) != srs_success) { return srs_error_wrap(err, "read pic_height_in_map_units_minus1");; } - - vcodec->width = (int)(pic_width_in_mbs_minus1 + 1) * 16; - vcodec->height = (int)(pic_height_in_map_units_minus1 + 1) * 16; - + + int8_t frame_mbs_only_flag = -1; + if ((err = srs_avc_nalu_read_bit(&bs, frame_mbs_only_flag)) != srs_success) { + return srs_error_wrap(err, "read frame_mbs_only_flag");; + } + if(!frame_mbs_only_flag) { + /* Skip mb_adaptive_frame_field_flag */ + int8_t mb_adaptive_frame_field_flag = -1; + if ((err = srs_avc_nalu_read_bit(&bs, mb_adaptive_frame_field_flag)) != srs_success) { + return srs_error_wrap(err, "read mb_adaptive_frame_field_flag");; + } + } + + /* Skip direct_8x8_inference_flag */ + int8_t direct_8x8_inference_flag = -1; + if ((err = srs_avc_nalu_read_bit(&bs, direct_8x8_inference_flag)) != srs_success) { + return srs_error_wrap(err, "read direct_8x8_inference_flag");; + } + + /* We need the following value to evaluate offsets, if any */ + int8_t frame_cropping_flag = -1; + if ((err = srs_avc_nalu_read_bit(&bs, frame_cropping_flag)) != srs_success) { + return srs_error_wrap(err, "read frame_cropping_flag");; + } + int32_t frame_crop_left_offset = 0, frame_crop_right_offset = 0, + frame_crop_top_offset = 0, frame_crop_bottom_offset = 0; + if(frame_cropping_flag) { + if ((err = srs_avc_nalu_read_uev(&bs, frame_crop_left_offset)) != srs_success) { + return srs_error_wrap(err, "read frame_crop_left_offset");; + } + if ((err = srs_avc_nalu_read_uev(&bs, frame_crop_right_offset)) != srs_success) { + return srs_error_wrap(err, "read frame_crop_right_offset");; + } + if ((err = srs_avc_nalu_read_uev(&bs, frame_crop_top_offset)) != srs_success) { + return srs_error_wrap(err, "read frame_crop_top_offset");; + } + if ((err = srs_avc_nalu_read_uev(&bs, frame_crop_bottom_offset)) != srs_success) { + return srs_error_wrap(err, "read frame_crop_bottom_offset");; + } + } + + /* Skip vui_parameters_present_flag */ + int8_t vui_parameters_present_flag = -1; + if ((err = srs_avc_nalu_read_bit(&bs, vui_parameters_present_flag)) != srs_success) { + return srs_error_wrap(err, "read vui_parameters_present_flag");; + } + + vcodec->width = ((pic_width_in_mbs_minus1 + 1) * 16) - frame_crop_left_offset * 2 - frame_crop_right_offset * 2; + vcodec->height = ((2 - frame_mbs_only_flag) * (pic_height_in_map_units_minus1 + 1) * 16) \ + - (frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2); + return err; } diff --git a/trunk/src/kernel/srs_kernel_mp3.cpp b/trunk/src/kernel/srs_kernel_mp3.cpp index 95f53a904..9571c6d26 100644 --- a/trunk/src/kernel/srs_kernel_mp3.cpp +++ b/trunk/src/kernel/srs_kernel_mp3.cpp @@ -6,7 +6,6 @@ #include -// for srs-librtmp, @see https://github.com/ossrs/srs/issues/213 #ifndef _WIN32 #include #endif diff --git a/trunk/src/kernel/srs_kernel_utility.cpp b/trunk/src/kernel/srs_kernel_utility.cpp index b3ecd91a7..a956bb3b6 100644 --- a/trunk/src/kernel/srs_kernel_utility.cpp +++ b/trunk/src/kernel/srs_kernel_utility.cpp @@ -6,7 +6,6 @@ #include -// for srs-librtmp, @see https://github.com/ossrs/srs/issues/213 #ifndef _WIN32 #include #include @@ -120,7 +119,6 @@ srs_utime_t srs_update_system_time() return -1; } - // @see: https://github.com/ossrs/srs/issues/35 // we must convert the tv_sec/tv_usec to int64_t. int64_t now_us = ((int64_t)now.tv_sec) * 1000 * 1000 + (int64_t)now.tv_usec; @@ -140,7 +138,6 @@ srs_utime_t srs_update_system_time() diff = srs_max(0, diff); if (diff < 0 || diff > 1000 * SYS_TIME_RESOLUTION_US) { srs_warn("clock jump, history=%" PRId64 "us, now=%" PRId64 "us, diff=%" PRId64 "us", _srs_system_time_us_cache, now_us, diff); - // @see: https://github.com/ossrs/srs/issues/109 _srs_system_time_startup_time += diff; } @@ -580,7 +577,6 @@ int srs_do_create_dir_recursively(string dir) } // create curren dir. - // for srs-librtmp, @see https://github.com/ossrs/srs/issues/213 #ifdef _WIN32 if (::_mkdir(dir.c_str()) < 0) { #else diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index b918c3b47..00bb8823b 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -49,6 +49,7 @@ using namespace std; // pre-declare srs_error_t run_directly_or_daemon(); +srs_error_t srs_detect_docker(); srs_error_t run_hybrid_server(); void show_macro_features(); @@ -95,6 +96,11 @@ srs_error_t do_main(int argc, char** argv) #ifdef SRS_GPERF_MP #warning "gmp is not used for memory leak, please use gmc instead." #endif + + // Ignore any error while detecting docker. + if ((err = srs_detect_docker()) != srs_success) { + srs_error_reset(err); + } // never use srs log(srs_trace, srs_error, etc) before config parse the option, // which will load the log config and apply it. @@ -378,11 +384,6 @@ srs_error_t run_directly_or_daemon() { srs_error_t err = srs_success; - // Ignore any error while detecting docker. - if ((err = srs_detect_docker()) != srs_success) { - srs_error_reset(err); - } - // Load daemon from config, disable it for docker. // @see https://github.com/ossrs/srs/issues/1594 bool run_as_daemon = _srs_config->get_daemon(); diff --git a/trunk/src/protocol/srs_protocol_stream.cpp b/trunk/src/protocol/srs_protocol_stream.cpp index 79b4638da..cb3107762 100755 --- a/trunk/src/protocol/srs_protocol_stream.cpp +++ b/trunk/src/protocol/srs_protocol_stream.cpp @@ -167,7 +167,6 @@ srs_error_t SrsFastStream::grow(ISrsReader* reader, int required_size) * to improve read performance, merge some packets then read, * when it on and read small bytes, we sleep to wait more data., * that is, we merge some data to read together. - * @see https://github.com/ossrs/srs/issues/241 */ if (merged_read && _handler) { _handler->on_read(nread); diff --git a/trunk/src/protocol/srs_protocol_utility.cpp b/trunk/src/protocol/srs_protocol_utility.cpp index 3995e9730..a3e1a5939 100644 --- a/trunk/src/protocol/srs_protocol_utility.cpp +++ b/trunk/src/protocol/srs_protocol_utility.cpp @@ -6,7 +6,6 @@ #include -// for srs-librtmp, @see https://github.com/ossrs/srs/issues/213 #ifndef _WIN32 #include #endif @@ -349,7 +348,6 @@ srs_error_t srs_write_large_iovs(ISrsProtocolReadWriter* skt, iovec* iovs, int s srs_error_t err = srs_success; // the limits of writev iovs. - // for srs-librtmp, @see https://github.com/ossrs/srs/issues/213 #ifndef _WIN32 // for linux, generally it's 1024. static int limits = (int)sysconf(_SC_IOV_MAX); diff --git a/trunk/src/protocol/srs_protocol_utility.hpp b/trunk/src/protocol/srs_protocol_utility.hpp index 12e7f5288..b5d8aba38 100644 --- a/trunk/src/protocol/srs_protocol_utility.hpp +++ b/trunk/src/protocol/srs_protocol_utility.hpp @@ -9,7 +9,6 @@ #include -// for srs-librtmp, @see https://github.com/ossrs/srs/issues/213 #ifndef _WIN32 #include #endif diff --git a/trunk/src/protocol/srs_raw_avc.cpp b/trunk/src/protocol/srs_raw_avc.cpp index bc85ecbee..2e1fc48f7 100644 --- a/trunk/src/protocol/srs_raw_avc.cpp +++ b/trunk/src/protocol/srs_raw_avc.cpp @@ -281,7 +281,6 @@ srs_error_t SrsRawAacStream::adts_demux(SrsBuffer* stream, char** pframe, int* p // decode the ADTS. // @see ISO_IEC_13818-7-AAC-2004.pdf, page 26 // 6.2 Audio Data Transport Stream, ADTS - // @see https://github.com/ossrs/srs/issues/212#issuecomment-64145885 // byte_alignment() // adts_fixed_header: @@ -342,7 +341,7 @@ srs_error_t SrsRawAacStream::adts_demux(SrsBuffer* stream, char** pframe, int* p int8_t channel_configuration = (sfiv >> 6) & 0x07; /*int8_t original = (sfiv >> 5) & 0x01;*/ /*int8_t home = (sfiv >> 4) & 0x01;*/ - //int8_t Emphasis; @remark, Emphasis is removed, @see https://github.com/ossrs/srs/issues/212#issuecomment-64154736 + //int8_t Emphasis; @remark, Emphasis is removed // 4bits left. // adts_variable_header(), 1.A.2.2.2 Variable Header of ADTS // copyright_identification_bit 1 bslbf diff --git a/trunk/src/protocol/srs_rtmp_handshake.cpp b/trunk/src/protocol/srs_rtmp_handshake.cpp index cec8c2cb1..7d4750452 100644 --- a/trunk/src/protocol/srs_rtmp_handshake.cpp +++ b/trunk/src/protocol/srs_rtmp_handshake.cpp @@ -571,7 +571,6 @@ namespace srs_internal } // directly generate the public key. - // @see: https://github.com/ossrs/srs/issues/148 int pkey_size = 128; if ((err = dh.copy_shared_key(c1->get_key(), 128, key.key, pkey_size)) != srs_success) { return srs_error_wrap(err, "copy shared key"); diff --git a/trunk/src/protocol/srs_rtmp_stack.cpp b/trunk/src/protocol/srs_rtmp_stack.cpp index a6449c1eb..8128d0503 100644 --- a/trunk/src/protocol/srs_rtmp_stack.cpp +++ b/trunk/src/protocol/srs_rtmp_stack.cpp @@ -1036,7 +1036,6 @@ srs_error_t SrsProtocol::read_message_header(SrsChunkStream* chunk, char fmt) // 0x04 where: message_type=4(protocol control user-control message) // 0x00 0x06 where: event Ping(0x06) // 0x00 0x00 0x0d 0x0f where: event data 4bytes ping timestamp. - // @see: https://github.com/ossrs/srs/issues/98 if (fmt == RTMP_FMT_TYPE1) { srs_warn("fresh chunk starts with fmt=1"); } else { @@ -1175,7 +1174,6 @@ srs_error_t SrsProtocol::read_message_header(SrsChunkStream* chunk, char fmt) pp[0] = *p++; // always use 31bits timestamp, for some server may use 32bits extended timestamp. - // @see https://github.com/ossrs/srs/issues/111 timestamp &= 0x7fffffff; /** diff --git a/trunk/src/protocol/srs_rtmp_stack.hpp b/trunk/src/protocol/srs_rtmp_stack.hpp index b804e57ca..24913c981 100644 --- a/trunk/src/protocol/srs_rtmp_stack.hpp +++ b/trunk/src/protocol/srs_rtmp_stack.hpp @@ -13,7 +13,6 @@ #include #include -// For srs-librtmp, @see https://github.com/ossrs/srs/issues/213 #ifndef _WIN32 #include #endif @@ -161,7 +160,6 @@ private: std::map chunk_streams; // Cache some frequently used chunk header. // cs_cache, the chunk stream cache. - // @see https://github.com/ossrs/srs/issues/249 SrsChunkStream** cs_cache; // The bytes buffer cache, recv from skt, provide services for stream. SrsFastStream* in_buffer; @@ -179,7 +177,6 @@ private: bool show_debug_info; // Whether auto response when recv messages. // default to true for it's very easy to use the protocol stack. - // @see: https://github.com/ossrs/srs/issues/217 bool auto_response_when_recv; // When not auto response message, manual flush the messages in queue. std::vector manual_response_queue; @@ -208,7 +205,6 @@ public: public: // Set the auto response message when recv for protocol stack. // @param v, whether auto response message when recv message. - // @see: https://github.com/ossrs/srs/issues/217 virtual void set_auto_response(bool v); // Flush for manual response when the auto response is disabled // by set_auto_response(false), we default use auto response, so donot @@ -222,13 +218,11 @@ public: // that is, we merge some data to read together. // @param v true to ename merged read. // @param handler the handler when merge read is enabled. - // @see https://github.com/ossrs/srs/issues/241 virtual void set_merge_read(bool v, IMergeReadHandler* handler); // Create buffer with specifeid size. // @param buffer the size of buffer. // @remark when MR(SRS_PERF_MERGED_READ) disabled, always set to 8K. // @remark when buffer changed, the previous ptr maybe invalid. - // @see https://github.com/ossrs/srs/issues/241 virtual void set_recv_buffer(int buffer_size); #endif public: @@ -429,7 +423,6 @@ public: std::string stream; // For play live stream, // used to specified the stop when exceed the duration. - // @see https://github.com/ossrs/srs/issues/45 // in srs_utime_t. srs_utime_t duration; // The token in the connect request, @@ -620,7 +613,6 @@ public: public: // Set the auto response message when recv for protocol stack. // @param v, whether auto response message when recv message. - // @see: https://github.com/ossrs/srs/issues/217 virtual void set_auto_response(bool v); #ifdef SRS_PERF_MERGED_READ // To improve read performance, merge some packets then read, @@ -628,13 +620,11 @@ public: // that is, we merge some data to read together. // @param v true to ename merged read. // @param handler the handler when merge read is enabled. - // @see https://github.com/ossrs/srs/issues/241 virtual void set_merge_read(bool v, IMergeReadHandler* handler); // Create buffer with specifeid size. // @param buffer the size of buffer. // @remark when MR(SRS_PERF_MERGED_READ) disabled, always set to 8K. // @remark when buffer changed, the previous ptr maybe invalid. - // @see https://github.com/ossrs/srs/issues/241 virtual void set_recv_buffer(int buffer_size); #endif // To set/get the recv timeout in srs_utime_t. @@ -675,7 +665,6 @@ public: // @param stream_id, the stream id of packet to send over, 0 for control message. // // @remark performance issue, to support 6k+ 250kbps client, - // @see https://github.com/ossrs/srs/issues/194 virtual srs_error_t send_and_free_messages(SrsSharedPtrMessage** msgs, int nb_msgs, int stream_id); // Send the RTMP packet and always free it. // user must never free or use the packet after this method, @@ -1336,11 +1325,9 @@ public: // Name of command. Set to "|RtmpSampleAccess". std::string command_name; // Whether allow access the sample of video. - // @see: https://github.com/ossrs/srs/issues/49 // @see: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#videoSampleAccess bool video_sample_access; // Whether allow access the sample of audio. - // @see: https://github.com/ossrs/srs/issues/49 // @see: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#audioSampleAccess bool audio_sample_access; public: diff --git a/trunk/src/protocol/srs_service_rtmp_conn.cpp b/trunk/src/protocol/srs_service_rtmp_conn.cpp index ea94ab055..6692cbe48 100644 --- a/trunk/src/protocol/srs_service_rtmp_conn.cpp +++ b/trunk/src/protocol/srs_service_rtmp_conn.cpp @@ -97,7 +97,6 @@ srs_error_t SrsBasicRtmpClient::do_connect_app(string local_ip, bool debug) } // notify server the edge identity, - // @see https://github.com/ossrs/srs/issues/147 SrsAmf0Object* data = req->args; data->set("srs_sig", SrsAmf0Any::str(RTMP_SIG_SRS_KEY)); data->set("srs_server", SrsAmf0Any::str(RTMP_SIG_SRS_SERVER)); @@ -121,7 +120,6 @@ srs_error_t SrsBasicRtmpClient::do_connect_app(string local_ip, bool debug) req->tcUrl = tc_url; // upnode server identity will show in the connect_app of client. - // @see https://github.com/ossrs/srs/issues/160 // the debug_srs_upnode is config in vhost and default to true. SrsServerInfo si; if ((err = client->connect_app(req->app, tc_url, req, debug, &si)) != srs_success) { diff --git a/trunk/src/protocol/srs_service_st.cpp b/trunk/src/protocol/srs_service_st.cpp index 9b7c9b96c..dcc8eeb12 100644 --- a/trunk/src/protocol/srs_service_st.cpp +++ b/trunk/src/protocol/srs_service_st.cpp @@ -41,7 +41,6 @@ srs_error_t srs_st_init() { #ifdef __linux__ // check epoll, some old linux donot support epoll. - // @see https://github.com/ossrs/srs/issues/162 if (!srs_st_epoll_is_supported()) { return srs_error_new(ERROR_ST_SET_EPOLL, "linux epoll disabled"); } @@ -510,7 +509,6 @@ srs_error_t SrsStSocket::read(void* buf, size_t size, ssize_t* nread) // (a value of 0 means the network connection is closed or end of file is reached). // Otherwise, a value of -1 is returned and errno is set to indicate the error. if (nb_read <= 0) { - // @see https://github.com/ossrs/srs/issues/200 if (nb_read < 0 && errno == ETIME) { return srs_error_new(ERROR_SOCKET_TIMEOUT, "timeout %d ms", srsu2msi(rtm)); } @@ -546,7 +544,6 @@ srs_error_t SrsStSocket::read_fully(void* buf, size_t size, ssize_t* nread) // (a value less than nbyte means the network connection is closed or end of file is reached) // Otherwise, a value of -1 is returned and errno is set to indicate the error. if (nb_read != (ssize_t)size) { - // @see https://github.com/ossrs/srs/issues/200 if (nb_read < 0 && errno == ETIME) { return srs_error_new(ERROR_SOCKET_TIMEOUT, "timeout %d ms", srsu2msi(rtm)); } @@ -581,7 +578,6 @@ srs_error_t SrsStSocket::write(void* buf, size_t size, ssize_t* nwrite) // On success a non-negative integer equal to nbyte is returned. // Otherwise, a value of -1 is returned and errno is set to indicate the error. if (nb_write <= 0) { - // @see https://github.com/ossrs/srs/issues/200 if (nb_write < 0 && errno == ETIME) { return srs_error_new(ERROR_SOCKET_TIMEOUT, "write timeout %d ms", srsu2msi(stm)); } @@ -612,7 +608,6 @@ srs_error_t SrsStSocket::writev(const iovec *iov, int iov_size, ssize_t* nwrite) // On success a non-negative integer equal to nbyte is returned. // Otherwise, a value of -1 is returned and errno is set to indicate the error. if (nb_write <= 0) { - // @see https://github.com/ossrs/srs/issues/200 if (nb_write < 0 && errno == ETIME) { return srs_error_new(ERROR_SOCKET_TIMEOUT, "writev timeout %d ms", srsu2msi(stm)); } diff --git a/trunk/src/utest/srs_utest_config.cpp b/trunk/src/utest/srs_utest_config.cpp index f2ad69144..bde52105c 100644 --- a/trunk/src/utest/srs_utest_config.cpp +++ b/trunk/src/utest/srs_utest_config.cpp @@ -2162,9 +2162,6 @@ VOID TEST(ConfigUnitTest, OperatorEquals) EXPECT_TRUE(srs_stream_caster_is_udp("mpegts_over_udp")); EXPECT_FALSE(srs_stream_caster_is_udp("xxx")); - EXPECT_TRUE(srs_stream_caster_is_rtsp("rtsp")); - EXPECT_FALSE(srs_stream_caster_is_rtsp("xxx")); - EXPECT_TRUE(srs_stream_caster_is_flv("flv")); EXPECT_FALSE(srs_stream_caster_is_flv("xxx")); diff --git a/trunk/src/utest/srs_utest_protocol.cpp b/trunk/src/utest/srs_utest_protocol.cpp index 6ea99b372..77251446c 100644 --- a/trunk/src/utest/srs_utest_protocol.cpp +++ b/trunk/src/utest/srs_utest_protocol.cpp @@ -727,7 +727,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvMessage) // 0x04 where: message_type=4(protocol control user-control message) // 0x00 0x06 where: event Ping(0x06) // 0x00 0x00 0x0d 0x0f where: event data 4bytes ping timestamp. -// @see: https://github.com/ossrs/srs/issues/98 VOID TEST(ProtocolStackTest, ProtocolRecvMessageBug98) { MockBufferIO bio; @@ -3824,7 +3823,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage2) * always use 31bits timestamp. */ // always use 31bits timestamp, for some server may use 32bits extended timestamp. -// @see https://github.com/ossrs/srs/issues/111 VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage3) { MockBufferIO bio;