diff --git a/README.md b/README.md index df3e3cd815..866b441af8 100755 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ git clone https://git.oschina.net/winlinvip/srs.oschina.git 公用机器(LiveShow): [https://github.com/winlinvip/simple-rtmp-server/wiki/v1_CN_LiveShow](https://github.com/winlinvip/simple-rtmp-server/wiki/v1_CN_LiveShow)
捐款(Donation): [GitHub](http://winlinvip.github.io/srs.release/donation/index.html) 或 [阿里云镜像](http://www.ossrs.net/srs.release/donation/index.html) ,查看 -[捐献墙(Donations)](https://github.com/winlinvip/simple-rtmp-server/blob/master/DONATIONS.txt)
+[捐献墙(Donations)](https://github.com/winlinvip/simple-rtmp-server/blob/develop/DONATIONS.txt)
## About @@ -216,6 +216,16 @@ the GIT usage( git clone https://git.oschina.net/winlinvip/srs.oschina.git ``` +Gitlab: [https://gitlab.com/winlinvip/srs-gitlab](https://gitlab.com/winlinvip/srs-gitlab) , +the GIT usage( +[CN](https://github.com/winlinvip/simple-rtmp-server/wiki/v1_CN_Git), +[EN](https://github.com/winlinvip/simple-rtmp-server/wiki/v1_EN_Git) +) + +```bash +git clone https://gitlab.com/winlinvip/srs-gitlab.git +``` + ## Usage Step 1: get SRS @@ -306,13 +316,13 @@ Donation:
[http://www.ossrs.net/srs.release/donation/index.html](http://www.ossrs.net/srs.release/donation/index.html) Donations:
-[https://github.com/winlinvip/simple-rtmp-server/blob/master/DONATIONS.txt] -(https://github.com/winlinvip/simple-rtmp-server/blob/master/DONATIONS.txt) +[https://github.com/winlinvip/simple-rtmp-server/blob/develop/DONATIONS.txt] +(https://github.com/winlinvip/simple-rtmp-server/blob/develop/DONATIONS.txt) ## System Requirements Supported operating systems and hardware: * All Linux , both 32 and 64 bits -* All hardware. +* All hardware with x86/x86_64/arm/mips cpu. ## Summary 1. 简洁稳定:Simple, also stable enough. @@ -373,6 +383,14 @@ Supported operating systems and hardware: * 2013-10-17, Created.
## History +* v1.0, 2015-01-15, [1.0r1 release(1.0.20)](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0r1) released. 59472 lines. +* v1.0, 2015-01-08, hotfix [#281](https://github.com/winlinvip/simple-rtmp-server/issues/281), fix hls bug ignore type-9 send aud. 1.0.20 +* v1.0, 2015-01-03, hotfix to remove the pageUrl for http callback. 1.0.19 +* v1.0, 2015-01-02, hotfix [#207](https://github.com/winlinvip/simple-rtmp-server/issues/207), trim the last 0 of log. 1.0.18 +* v1.0, 2015-01-02, hotfix [#216](https://github.com/winlinvip/simple-rtmp-server/issues/216), http-callback post in application/json content-type. 1.0.17 +* v1.0, 2015-01-01, hotfix [#270](https://github.com/winlinvip/simple-rtmp-server/issues/270), memory leak for http client post. 1.0.16 +* v1.0, 2014-12-29, hotfix [#267](https://github.com/winlinvip/simple-rtmp-server/issues/267), the forward dest ep should use server. 1.0.15 +* v1.0, 2014-12-29, hotfix [#268](https://github.com/winlinvip/simple-rtmp-server/issues/268), the hls pcr is negative when startup. 1.0.14 * v1.0, 2014-12-26, use master as main stable branch with hotfixes. 1.0.13 * v1.0, 2014-12-22, hotfix [#264](https://github.com/winlinvip/simple-rtmp-server/issues/264), ignore NALU when sequence header to make HLS happy. 1.0.12 * v1.0, 2014-12-20, hotfix [#264](https://github.com/winlinvip/simple-rtmp-server/issues/264), support disconnect publish connect when hls error. 1.0.11 @@ -723,41 +741,6 @@ Schema#2: SRS RTMP Edge server pull stream from origin (or upstream SRS RTMP Edge server), then delivery to Client. -### (plan) SRS Multiple processes Architecture(design by wenjie) - -
-                 +---------------+              +--------+
-                 | upnode server |              + client +
-                 +-------+-------+              +---+----+
-            -------------+------------network-------+---------
-                         |                          |
- +--------+         +----+-----------+         +----+----------+
- | master +--fork->-+ back source(1) +-->-pull-+ stream 1-N(2) +
- +---+----+         +----------------+         +-------+-------+
-     |                                                 |
-     +-------------------------------------fork--->-----+
-     |                           +-------------+
-     +-------------------fork-->-+ http/vod(3) |
-                                 +-------------+
-Remark:
-(1) back source process: create by master process, get stream from 
-    upnode server if edge, create stream if origin, serve the stream 
-    process.
-(2) stream process: create by master process, get stream from back
-    source process, serve the client.
-(3) the embeded mininum http server, also provides vod service. for
-    http server, it provides http api, hls(live/vod) delivery. for
-    vod server, it slice the file to hls(m3u8/ts).
-Remark:
-(a) This multiple processes architecture is design by wenjie, it's a
-    very simple and powerful multiple process architecture, for the
-    master no need to pass between stream process.
-(b) The CLI architecture is similar to this, instead, cli process
-    will collect informations from all stream process, master process
-    only send signals to child processes.
-(c) Maybe multiple thread is ok? By winlin.
-
- ### Bandwidth Test Workflow
diff --git a/trunk/scripts/git.commit.sh b/trunk/scripts/git.commit.sh
index 38932fdfff..7426b9237b 100755
--- a/trunk/scripts/git.commit.sh
+++ b/trunk/scripts/git.commit.sh
@@ -2,7 +2,7 @@
 
 cat <>/dev/null
 touch git-ensure-commit &&
-echo "cd `pwd` && git checkout master &&" >git-ensure-commit &&
+echo "cd `pwd` && git checkout develop &&" >git-ensure-commit &&
 echo "bash `pwd`/git.commit.sh" >>git-ensure-commit &&
 chmod +x git-ensure-commit &&
 sudo rm -f /bin/git-ensure-commit &&
@@ -23,7 +23,7 @@ work_dir=`(cd ${work_dir}/.. && pwd)`
 product_dir=$work_dir
 
 # allow start script from any dir
-cd $work_dir && git checkout master
+cd $work_dir && git checkout develop
 
 . ${product_dir}/scripts/_log.sh
 ret=$?; if [[ $ret -ne 0 ]]; then exit $ret; fi
@@ -44,6 +44,7 @@ function remote_check()
 remote_check origin git@github.com:winlinvip/simple-rtmp-server.git
 remote_check srs.csdn git@code.csdn.net:winlinvip/srs-csdn.git
 remote_check srs.oschina git@git.oschina.net:winlinvip/srs.oschina.git
+remote_check srs.gitlab git@gitlab.com:winlinvip/srs-gitlab.git
 ok_msg "remote check ok"
 
 function sync_push()
@@ -64,10 +65,12 @@ function sync_push()
 sync_push --all origin
 sync_push --all srs.csdn
 sync_push --all srs.oschina
+sync_push --all srs.gitlab
 ok_msg "push refs ok"
 
 sync_push --tags srs.csdn
 sync_push --tags srs.oschina
+sync_push --tags srs.gitlab
 ok_msg "push tags ok"
 
 exit 0
diff --git a/trunk/src/app/srs_app_avc_aac.cpp b/trunk/src/app/srs_app_avc_aac.cpp
index 9682a0f7b3..1611b58195 100644
--- a/trunk/src/app/srs_app_avc_aac.cpp
+++ b/trunk/src/app/srs_app_avc_aac.cpp
@@ -337,6 +337,13 @@ int SrsAvcAacCodec::video_avc_demux(char* data, int size, SrsCodecSample* sample
     
     sample->frame_type = (SrsCodecVideoAVCFrame)frame_type;
     
+    // ignore info frame without error,
+    // @see https://github.com/winlinvip/simple-rtmp-server/issues/288#issuecomment-69863909
+    if (sample->frame_type == SrsCodecVideoAVCFrameVideoInfoFrame) {
+        srs_warn("hls igone the info frame, ret=%d", ret);
+        return ret;
+    }
+    
     // only support h.264/avc
     if (codec_id != SrsCodecVideoAVC) {
         ret = ERROR_HLS_DECODE_ERROR;
diff --git a/trunk/src/app/srs_app_forward.cpp b/trunk/src/app/srs_app_forward.cpp
index 39066fa7a0..5f45051505 100644
--- a/trunk/src/app/srs_app_forward.cpp
+++ b/trunk/src/app/srs_app_forward.cpp
@@ -119,7 +119,7 @@ int SrsForwarder::on_publish()
     if (_ep_forward == SRS_CONSTS_LOCALHOST) {
         dest_ep += req->host;
     } else {
-        dest_ep += _ep_forward;
+        dest_ep += server;
     }
     dest_ep += ":";
     dest_ep += port;
diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp
index 34d9eb446c..af294ddb2b 100644
--- a/trunk/src/app/srs_app_hls.cpp
+++ b/trunk/src/app/srs_app_hls.cpp
@@ -368,11 +368,16 @@ class SrsMpegtsWriter
     }
     static char* write_pcr(char* p, int64_t pcr)
     {
-        *p++ = (char) (pcr >> 25);
-        *p++ = (char) (pcr >> 17);
-        *p++ = (char) (pcr >> 9);
-        *p++ = (char) (pcr >> 1);
-        *p++ = (char) (pcr << 7 | 0x7e);
+        // the pcr=dts-delay
+        // and the pcr maybe negative
+        // @see https://github.com/winlinvip/simple-rtmp-server/issues/268
+        int64_t v = srs_max(0, pcr);
+        
+        *p++ = (char) (v >> 25);
+        *p++ = (char) (v >> 17);
+        *p++ = (char) (v >> 9);
+        *p++ = (char) (v >> 1);
+        *p++ = (char) (v << 7 | 0x7e);
         *p++ = 0;
     
         return p;
@@ -1271,9 +1276,13 @@ int SrsHlsCache::cache_video(SrsAvcAacCodec* codec, SrsCodecSample* sample)
         // 6: Supplemental enhancement information (SEI) sei_rbsp( ), page 61
         // @see: ngx_rtmp_hls_append_aud
         if (!aud_sent) {
-            if (nal_unit_type == 9) {
+            // @remark, when got type 9, we donot send aud_nal, but it will make 
+            //      ios unhappy, so we remove it.
+            // @see https://github.com/winlinvip/simple-rtmp-server/issues/281
+            /*if (nal_unit_type == 9) {
                 aud_sent = true;
-            }
+            }*/
+            
             if (nal_unit_type == 1 || nal_unit_type == 5 || nal_unit_type == 6) {
                 // for type 6, append a aud with type 9.
                 vb->append((const char*)aud_nal, sizeof(aud_nal));
@@ -1486,6 +1495,12 @@ int SrsHls::on_video(SrsSharedPtrMessage* video)
         return ret;
     }
     
+    // ignore info frame,
+    // @see https://github.com/winlinvip/simple-rtmp-server/issues/288#issuecomment-69863909
+    if (sample->frame_type == SrsCodecVideoAVCFrameVideoInfoFrame) {
+        return ret;
+    }
+    
     if (codec->video_codec_id != SrsCodecVideoAVC) {
         return ret;
     }
diff --git a/trunk/src/app/srs_app_http_client.cpp b/trunk/src/app/srs_app_http_client.cpp
index 0fb7afa22e..978777599c 100644
--- a/trunk/src/app/srs_app_http_client.cpp
+++ b/trunk/src/app/srs_app_http_client.cpp
@@ -81,7 +81,7 @@ int SrsHttpClient::post(SrsHttpUri* uri, string req, string& res)
         << "Connection: Keep-Alive" << __SRS_CRLF
         << "Content-Length: " << std::dec << req.length() << __SRS_CRLF
         << "User-Agent: " << RTMP_SIG_SRS_NAME << RTMP_SIG_SRS_VERSION << __SRS_CRLF
-        << "Content-Type: text/html" << __SRS_CRLF
+        << "Content-Type: application/json" << __SRS_CRLF
         << __SRS_CRLF
         << req;
     
@@ -111,6 +111,8 @@ int SrsHttpClient::post(SrsHttpUri* uri, string req, string& res)
     }
     srs_info("parse http post response success.");
     
+    srs_freep(msg);
+    
     return ret;
 }
 
diff --git a/trunk/src/app/srs_app_http_hooks.cpp b/trunk/src/app/srs_app_http_hooks.cpp
index 4c4c835af1..3d96c501ab 100644
--- a/trunk/src/app/srs_app_http_hooks.cpp
+++ b/trunk/src/app/srs_app_http_hooks.cpp
@@ -112,8 +112,7 @@ void SrsHttpHooks::on_close(string url, int client_id, string ip, SrsRequest* re
         << __SRS_JFIELD_ORG("client_id", client_id) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("ip", ip) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("vhost", req->vhost) << __SRS_JFIELD_CONT
-        << __SRS_JFIELD_STR("app", req->app) << __SRS_JFIELD_CONT
-        << __SRS_JFIELD_STR("pageUrl", req->pageUrl)
+        << __SRS_JFIELD_STR("app", req->app)
         << __SRS_JOBJECT_END;
     std::string data = ss.str();
     std::string res;
@@ -158,7 +157,6 @@ int SrsHttpHooks::on_publish(string url, int client_id, string ip, SrsRequest* r
         << __SRS_JFIELD_STR("ip", ip) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("vhost", req->vhost) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("app", req->app) << __SRS_JFIELD_CONT
-        << __SRS_JFIELD_STR("pageUrl", req->pageUrl) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("stream", req->stream)
         << __SRS_JOBJECT_END;
     std::string data = ss.str();
@@ -204,7 +202,6 @@ void SrsHttpHooks::on_unpublish(string url, int client_id, string ip, SrsRequest
         << __SRS_JFIELD_STR("ip", ip) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("vhost", req->vhost) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("app", req->app) << __SRS_JFIELD_CONT
-        << __SRS_JFIELD_STR("pageUrl", req->pageUrl) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("stream", req->stream)
         << __SRS_JOBJECT_END;
     std::string data = ss.str();
@@ -250,7 +247,6 @@ int SrsHttpHooks::on_play(string url, int client_id, string ip, SrsRequest* req)
         << __SRS_JFIELD_STR("ip", ip) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("vhost", req->vhost) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("app", req->app) << __SRS_JFIELD_CONT
-        << __SRS_JFIELD_STR("pageUrl", req->pageUrl) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("stream", req->stream)
         << __SRS_JOBJECT_END;
     std::string data = ss.str();
@@ -296,7 +292,6 @@ void SrsHttpHooks::on_stop(string url, int client_id, string ip, SrsRequest* req
         << __SRS_JFIELD_STR("ip", ip) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("vhost", req->vhost) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("app", req->app) << __SRS_JFIELD_CONT
-        << __SRS_JFIELD_STR("pageUrl", req->pageUrl) << __SRS_JFIELD_CONT
         << __SRS_JFIELD_STR("stream", req->stream)
         << __SRS_JOBJECT_END;
     std::string data = ss.str();
diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp
index 0c29a7282e..c27e654019 100644
--- a/trunk/src/core/srs_core.hpp
+++ b/trunk/src/core/srs_core.hpp
@@ -31,7 +31,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 // current release version
 #define VERSION_MAJOR       1
 #define VERSION_MINOR       0
-#define VERSION_REVISION    13
+#define VERSION_REVISION    21
+
 // server info.
 #define RTMP_SIG_SRS_KEY "SRS"
 #define RTMP_SIG_SRS_ROLE "origin/edge server"
diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp
index 166981cc84..c0a9d333e9 100644
--- a/trunk/src/utest/srs_utest_kernel.cpp
+++ b/trunk/src/utest/srs_utest_kernel.cpp
@@ -1207,12 +1207,12 @@ VOID TEST(KernelStreamTest, StreamRead8Bytes)
     data[18] = 0x13;
     data[19] = 0x14;
     
-    EXPECT_EQ(0x0102030405060708, s.read_8bytes());
-    EXPECT_EQ(0x090a0b0c0d0e0f10, s.read_8bytes());
+    EXPECT_EQ(0x0102030405060708LL, s.read_8bytes());
+    EXPECT_EQ(0x090a0b0c0d0e0f10LL, s.read_8bytes());
 
     s.skip(-1 * s.pos());
     s.skip(5);
-    EXPECT_EQ(0x060708090a0b0c0d, s.read_8bytes());
+    EXPECT_EQ(0x060708090a0b0c0dLL, s.read_8bytes());
 }
 
 /**
@@ -1365,8 +1365,8 @@ VOID TEST(KernelStreamTest, StreamWrite8Bytes)
     
     EXPECT_TRUE(ERROR_SUCCESS == s.initialize(data, 1024));
     
-    s.write_8bytes(0x1011121314151617);
-    s.write_8bytes(0x1819202122232425);
+    s.write_8bytes(0x1011121314151617LL);
+    s.write_8bytes(0x1819202122232425LL);
 
     s.skip(-1 * s.pos());
     EXPECT_EQ(0x10, s.read_1bytes());