diff --git a/trunk/3rdparty/httpx-static/main.go b/trunk/3rdparty/httpx-static/main.go
index 39cffa1e3..f2a86bf26 100644
--- a/trunk/3rdparty/httpx-static/main.go
+++ b/trunk/3rdparty/httpx-static/main.go
@@ -262,6 +262,12 @@ func run(ctx context.Context) error {
flag.Var(&skeys, "skey", "the SSL key for domain")
flag.Var(&scerts, "scert", "the SSL cert for domain")
+ var trimSlashLimit int
+ var noRedirectIndex, trimLastSlash bool
+ flag.BoolVar(&noRedirectIndex, "no-redirect-index", false, "Whether serve with index.html without redirect.")
+ flag.BoolVar(&trimLastSlash, "trim-last-slash", false, "Whether trim last slash by HTTP redirect(302).")
+ flag.IntVar(&trimSlashLimit, "trim-slash-limit", 0, "Only trim last slash when got enough directories.")
+
flag.Usage = func() {
fmt.Println(fmt.Sprintf("Usage: %v -t http -s https -d domains -r root -e cache -l lets -k ssk -c ssc -p proxy", os.Args[0]))
fmt.Println(fmt.Sprintf(" "))
@@ -272,6 +278,8 @@ func run(ctx context.Context) error {
fmt.Println(fmt.Sprintf(" Listen at port for HTTPS server. Default: 0, disable HTTPS."))
fmt.Println(fmt.Sprintf(" -r, -root string"))
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(" -no-redirect-index=bool"))
+ fmt.Println(fmt.Sprintf(" Whether serve with index.html without redirect. Default: false"))
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"))
@@ -317,6 +325,12 @@ func run(ctx context.Context) error {
os.Exit(-1)
}
+ // If trim last slash, we should enable no redirect index, to avoid infinitely redirect.
+ if trimLastSlash {
+ noRedirectIndex = true
+ }
+ fmt.Println(fmt.Sprintf("Config trimLastSlash=%v, trimSlashLimit=%v, noRedirectIndex=%v", trimLastSlash, trimSlashLimit, noRedirectIndex))
+
var proxyUrls []*url.URL
proxies := make(map[string]*url.URL)
for _, oproxy := range []string(oproxies) {
@@ -366,7 +380,34 @@ func run(ctx context.Context) error {
html = path.Join(path.Dir(os.Args[0]), html)
}
- fs := http.FileServer(http.Dir(html))
+ serveFileNoRedirect := func (w http.ResponseWriter, r *http.Request, name string) {
+ upath := path.Join(html, path.Clean(r.URL.Path))
+
+ // Redirect without the last slash.
+ if trimLastSlash && r.URL.Path != "/" && strings.HasSuffix(r.URL.Path, "/") {
+ u := strings.TrimSuffix(r.URL.Path, "/")
+ if r.URL.RawQuery != "" {
+ u += "?" + r.URL.RawQuery
+ }
+ if strings.Count(u, "/") >= trimSlashLimit {
+ http.Redirect(w, r, u, http.StatusFound)
+ return
+ }
+ }
+
+ // Append the index.html path if access a directory.
+ if noRedirectIndex && !strings.Contains(path.Base(upath), ".") {
+ if d, err := os.Stat(upath); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ } else if d.IsDir() {
+ upath = path.Join(upath, "index.html")
+ }
+ }
+
+ http.ServeFile(w, r, upath)
+ }
+
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
oh.SetHeader(w)
@@ -388,7 +429,7 @@ func run(ctx context.Context) error {
return
}
- fs.ServeHTTP(w, r)
+ serveFileNoRedirect(w, r, path.Join(html, path.Clean(r.URL.Path)))
return
}
@@ -417,7 +458,7 @@ func run(ctx context.Context) error {
}
}
- fs.ServeHTTP(w, r)
+ serveFileNoRedirect(w, r, path.Join(html, path.Clean(r.URL.Path)))
})
var protos []string
diff --git a/trunk/3rdparty/httpx-static/version.go b/trunk/3rdparty/httpx-static/version.go
index 3a48b053b..12a9cdbb1 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 19
+ return 26
}
func Version() string {
diff --git a/trunk/configure b/trunk/configure
index af078f077..7798be411 100755
--- a/trunk/configure
+++ b/trunk/configure
@@ -387,9 +387,10 @@ fi
#
# utest, the unit-test cases of srs, base on gtest1.6
if [ $SRS_UTEST = YES ]; then
- MODULE_FILES=("srs_utest" "srs_utest_amf0" "srs_utest_protocol" "srs_utest_kernel" "srs_utest_core"
+ MODULE_FILES=("srs_utest" "srs_utest_amf0" "srs_utest_kernel" "srs_utest_core"
"srs_utest_config" "srs_utest_rtmp" "srs_utest_http" "srs_utest_avc" "srs_utest_reload"
- "srs_utest_mp4" "srs_utest_service" "srs_utest_app" "srs_utest_rtc" "srs_utest_protocol2")
+ "srs_utest_mp4" "srs_utest_service" "srs_utest_app" "srs_utest_rtc"
+ "srs_utest_protocol")
if [[ $SRS_SRT == YES ]]; then
MODULE_FILES+=("srs_utest_srt")
fi
diff --git a/trunk/research/console/js/srs.console.js b/trunk/research/console/js/srs.console.js
index 18d452276..031786e7a 100644
--- a/trunk/research/console/js/srs.console.js
+++ b/trunk/research/console/js/srs.console.js
@@ -578,6 +578,23 @@ scApp.filter('sc_filter_preview_url', ['$sc_server', function($sc_server){
};
}]);
+scApp.filter('sc_filter_streamURL', function(){
+ return function(v){
+ if (!v || !v.url) return '';
+
+ const pos = v.url.lastIndexOf('/');
+ const stream = pos < 0 ? '' : v.url.substr(pos);
+
+ const pos2 = v.tcUrl.indexOf('?');
+ const tcUrl = pos2 < 0 ? v.tcUrl : v.tcUrl.substr(0, pos2);
+
+ let params = pos2 < 0 ? '' : v.tcUrl.substr(pos2);
+ if (params === '?vhost=__defaultVhost__' || params === '?domain=__defaultVhost__') params = '';
+
+ return `${tcUrl}${stream}${params}`;
+ };
+});
+
// the sc nav is the nevigator
scApp.provider("$sc_nav", function(){
this.$get = function(){
diff --git a/trunk/research/console/views/clients.html b/trunk/research/console/views/clients.html
index 368ed8c7a..1724148ba 100644
--- a/trunk/research/console/views/clients.html
+++ b/trunk/research/console/views/clients.html
@@ -16,7 +16,8 @@
Stream |
类型 |
时长 |
- TcUrl |
+ URL |
+ 分类 |
管理 |
@@ -26,7 +27,8 @@
{{client.stream}} |
{{client.publish| sc_filter_ctype}} |
{{client.alive| sc_filter_time}} |
- {{client.tcUrl}} |
+ {{client |sc_filter_streamURL}} |
+ {{client.type}} |
踢Ta
|
diff --git a/trunk/research/console/views/clients_en.html b/trunk/research/console/views/clients_en.html
index b13b2a81e..01dda4535 100644
--- a/trunk/research/console/views/clients_en.html
+++ b/trunk/research/console/views/clients_en.html
@@ -16,7 +16,8 @@
Stream |
Type |
Duration |
- TcUrl |
+ URL |
+ Category |
Manage |
@@ -26,7 +27,8 @@
{{client.stream}} |
{{client.publish| sc_filter_ctype}} |
{{client.alive| sc_filter_time}} |
- {{client.tcUrl}} |
+ {{client |sc_filter_streamURL}} |
+ {{client.type}} |
Kickoff It
|
diff --git a/trunk/src/utest/srs_utest_protocol.cpp b/trunk/src/utest/srs_utest_protocol.cpp
index 8bc6a34da..7b3cacee5 100644
--- a/trunk/src/utest/srs_utest_protocol.cpp
+++ b/trunk/src/utest/srs_utest_protocol.cpp
@@ -1994,2055 +1994,6 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVAVFmt3)
}
}
-/**
-* recv video, audio, video and video, interlaced in chunks.
-*/
-VOID TEST(ProtocolStackTest, ProtocolRecvVAVVMessage)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x04,
- 0x00, 0x00, 0x15, // timestamp
- 0x00, 0x00, 0x90, // length, 144
- 0x08, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x20, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC4, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x30, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
-
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x10, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_audio());
- EXPECT_EQ(0x15, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x20, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x30, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
-}
-
-/**
-* recv video, audio, video and video, interlaced in chunks.
-* the continue chunks use fmt=1 header
-*/
-VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt1)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- /**
- * parse the message header.
- * 3bytes: timestamp delta, fmt=0,1,2
- * 3bytes: payload length, fmt=0,1
- * 1bytes: message type, fmt=0,1
- * 4bytes: stream id, fmt=0
- * where:
- * fmt=0, 0x0X
- * fmt=1, 0x4X
- * fmt=2, 0x8X
- * fmt=3, 0xCX
- */
-
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x04,
- 0x00, 0x00, 0x15, // timestamp
- 0x00, 0x00, 0x90, // length, 144
- 0x08, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x43,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC4, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x43,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
-
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x10, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_audio());
- EXPECT_EQ(0x15, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x20, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x30, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
-}
-
-/**
-* recv video, audio, video and video, interlaced in chunks.
-* the continue chunks use fmt=2 header
-*/
-VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt2)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- /**
- * parse the message header.
- * 3bytes: timestamp delta, fmt=0,1,2
- * 3bytes: payload length, fmt=0,1
- * 1bytes: message type, fmt=0,1
- * 4bytes: stream id, fmt=0
- * where:
- * fmt=0, 0x0X
- * fmt=1, 0x4X
- * fmt=2, 0x8X
- * fmt=3, 0xCX
- */
-
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x04,
- 0x00, 0x00, 0x15, // timestamp
- 0x00, 0x00, 0x90, // length, 144
- 0x08, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x83,
- 0x00, 0x00, 0x10, // timestamp
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC4, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x83,
- 0x00, 0x00, 0x10, // timestamp
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
-
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x10, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_audio());
- EXPECT_EQ(0x15, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x20, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x30, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
-}
-
-/**
-* recv video, audio, video and video, interlaced in chunks.
-* the continue chunks use fmt=3 header
-*/
-VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt3)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- /**
- * parse the message header.
- * 3bytes: timestamp delta, fmt=0,1,2
- * 3bytes: payload length, fmt=0,1
- * 1bytes: message type, fmt=0,1
- * 4bytes: stream id, fmt=0
- * where:
- * fmt=0, 0x0X
- * fmt=1, 0x4X
- * fmt=2, 0x8X
- * fmt=3, 0xCX
- */
-
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x04,
- 0x00, 0x00, 0x15, // timestamp
- 0x00, 0x00, 0x90, // length, 144
- 0x08, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0xC3,
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC4, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0xC3,
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
-
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x10, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_audio());
- EXPECT_EQ(0x15, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x20, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x30, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
-}
-
-/**
-* recv video, audio, video and video, interlaced in chunks.
-* the continue chunks use fmt=1, last video with fmt=1 header
-*/
-VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- /**
- * parse the message header.
- * 3bytes: timestamp delta, fmt=0,1,2
- * 3bytes: payload length, fmt=0,1
- * 1bytes: message type, fmt=0,1
- * 4bytes: stream id, fmt=0
- * where:
- * fmt=0, 0x0X
- * fmt=1, 0x4X
- * fmt=2, 0x8X
- * fmt=3, 0xCX
- */
-
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x04,
- 0x00, 0x00, 0x15, // timestamp
- 0x00, 0x00, 0x90, // length, 144
- 0x08, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x43,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC4, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x43,
- 0x00, 0x00, 0x20, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
-
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x10, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_audio());
- EXPECT_EQ(0x15, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x20, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x40, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
-}
-
-/**
-* recv video, audio, video and video, interlaced in chunks.
-* the continue chunks use fmt=1, last video with fmt=1 header,
-* last video changed length
-*/
-VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11Length)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- /**
- * parse the message header.
- * 3bytes: timestamp delta, fmt=0,1,2
- * 3bytes: payload length, fmt=0,1
- * 1bytes: message type, fmt=0,1
- * 4bytes: stream id, fmt=0
- * where:
- * fmt=0, 0x0X
- * fmt=1, 0x4X
- * fmt=2, 0x8X
- * fmt=3, 0xCX
- */
-
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x04,
- 0x00, 0x00, 0x15, // timestamp
- 0x00, 0x00, 0x90, // length, 144
- 0x08, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x43,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x20, // length, 288
- 0x09, // message_type
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC4, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x43,
- 0x00, 0x00, 0x20, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
-
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x10, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_audio());
- EXPECT_EQ(0x15, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x20, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x40, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
-}
-
-/**
-* recv video, audio, video and video, interlaced in chunks.
-* the continue chunks use fmt=1, last video with fmt=2 header
-*/
-VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- /**
- * parse the message header.
- * 3bytes: timestamp delta, fmt=0,1,2
- * 3bytes: payload length, fmt=0,1
- * 1bytes: message type, fmt=0,1
- * 4bytes: stream id, fmt=0
- * where:
- * fmt=0, 0x0X
- * fmt=1, 0x4X
- * fmt=2, 0x8X
- * fmt=3, 0xCX
- */
-
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x04,
- 0x00, 0x00, 0x15, // timestamp
- 0x00, 0x00, 0x90, // length, 144
- 0x08, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x43,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC4, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x83,
- 0x00, 0x00, 0x20, // timestamp
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
-
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x10, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_audio());
- EXPECT_EQ(0x15, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x20, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x40, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
-}
-
-/**
-* recv video, audio, video and video, interlaced in chunks.
-* the continue chunks use fmt=1, last video with fmt=2 header,
-* last video changed length
-*/
-VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12Length)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- /**
- * parse the message header.
- * 3bytes: timestamp delta, fmt=0,1,2
- * 3bytes: payload length, fmt=0,1
- * 1bytes: message type, fmt=0,1
- * 4bytes: stream id, fmt=0
- * where:
- * fmt=0, 0x0X
- * fmt=1, 0x4X
- * fmt=2, 0x8X
- * fmt=3, 0xCX
- */
-
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x04,
- 0x00, 0x00, 0x15, // timestamp
- 0x00, 0x00, 0x90, // length, 144
- 0x08, // message_type
- 0x01, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x43,
- 0x00, 0x00, 0x10, // timestamp
- 0x00, 0x01, 0x20, // length, 288
- 0x09, // message_type
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // audio message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC4, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#1
- if (true) {
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x83,
- 0x00, 0x00, 0x20, // timestamp
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#2
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
- // video message, chunk#3
- if (true) {
- uint8_t data[] = {
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
- }
-
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x10, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- EXPECT_EQ(0x110, msg->header.payload_length);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_audio());
- EXPECT_EQ(0x15, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x20, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- EXPECT_EQ(0x120, msg->header.payload_length);
- }
- if (true) {
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x40, msg->header.timestamp);
- EXPECT_EQ(0x01, msg->header.stream_id);
- EXPECT_EQ(0x120, msg->header.payload_length);
- }
-}
-
-/**
-* recv video, with extended timestamp.
-* small timestamp < 0xffffff
-*/
-VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- /**
- * parse the message header.
- * 3bytes: timestamp delta, fmt=0,1,2
- * 3bytes: payload length, fmt=0,1
- * 1bytes: message type, fmt=0,1
- * 4bytes: stream id, fmt=0
- * where:
- * fmt=0, 0x0X
- * fmt=1, 0x4X
- * fmt=2, 0x8X
- * fmt=3, 0xCX
- */
-
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0xff, 0xff, 0xff, // timestamp
- 0x00, 0x00, 0x04, // length
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- 0x00, 0x00, 0x00, 0x10, // extended timestamp
- // msg payload start
- 0x00, 0x00, 0x07, 0x63
- };
- bio.in_buffer.append((char*)data, sizeof(data));
-
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x10, msg->header.timestamp);
-}
-
-/**
-* recv video, with extended timestamp.
-* big timestamp > 0xffffff
-*/
-VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage2)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- /**
- * parse the message header.
- * 3bytes: timestamp delta, fmt=0,1,2
- * 3bytes: payload length, fmt=0,1
- * 1bytes: message type, fmt=0,1
- * 4bytes: stream id, fmt=0
- * where:
- * fmt=0, 0x0X
- * fmt=1, 0x4X
- * fmt=2, 0x8X
- * fmt=3, 0xCX
- */
-
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0xff, 0xff, 0xff, // timestamp
- 0x00, 0x00, 0x04, // length
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- 0x7f, 0x01, 0x02, 0x03, // extended timestamp
- // msg payload start
- 0x00, 0x00, 0x07, 0x63
- };
- bio.in_buffer.append((char*)data, sizeof(data));
-
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- EXPECT_EQ(0x7f010203, msg->header.timestamp);
-}
-
-/**
-* recv video, with extended timestamp.
-* always use 31bits timestamp.
-*/
-// always use 31bits timestamp, for some server may use 32bits extended timestamp.
-VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage3)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- /**
- * parse the message header.
- * 3bytes: timestamp delta, fmt=0,1,2
- * 3bytes: payload length, fmt=0,1
- * 1bytes: message type, fmt=0,1
- * 4bytes: stream id, fmt=0
- * where:
- * fmt=0, 0x0X
- * fmt=1, 0x4X
- * fmt=2, 0x8X
- * fmt=3, 0xCX
- */
-
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0xff, 0xff, 0xff, // timestamp
- 0x00, 0x00, 0x04, // length
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- 0xff, 0x01, 0x02, 0x03, // extended timestamp
- // msg payload start
- 0x00, 0x00, 0x07, 0x63
- };
- bio.in_buffer.append((char*)data, sizeof(data));
-
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- // always use 31bits timestamp
- EXPECT_EQ(0x7f010203, msg->header.timestamp);
-}
-
-/**
-* recv video, with extended timestamp, in 2 chunks packet.
-* always send extended timestamp in 0xCX chunk packets.
-*/
-/**
-* RTMP specification and ffmpeg/librtmp is false,
-* but, adobe changed the specification, so flash/FMLE/FMS always true.
-* default to true to support flash/FMLE/FMS.
-*
-* ffmpeg/librtmp may donot send this filed, need to detect the value.
-* @see also: http://blog.csdn.net/win_lin/article/details/13363699
-* compare to the chunk timestamp, which is set by chunk message header
-* type 0,1 or 2.
-*
-* @remark, nginx send the extended-timestamp in sequence-header,
-* and timestamp delta in continue C1 chunks, and so compatible with ffmpeg,
-* that is, there is no continue chunks and extended-timestamp in nginx-rtmp.
-*
-* @remark, srs always send the extended-timestamp, to keep simple,
-* and compatible with adobe products.
-*/
-VOID TEST(ProtocolStackTest, ProtocolRecvVExtTime2Trunk)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- // video message
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0xff, 0xff, 0xff, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- 0x00, 0x01, 0x02, 0x03, // extended timestamp
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- // chunk #2
- 0xC3,
- 0x00, 0x01, 0x02, 0x03, // extended timestamp
- /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // chunk #2
- 0xC3,
- 0x00, 0x01, 0x02, 0x03, // extended timestamp
- /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
-
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- // 0xCX with extended timestamp.
- EXPECT_EQ(0x00010203, msg->header.timestamp);
-}
-
-/**
-* recv video, with extended timestamp, in 2 chunks packet.
-* never send extended timestamp in 0xCX chunk packets.
-*/
-// FFMPEG/librtmp, RTMP specification standard protocol.
-VOID TEST(ProtocolStackTest, ProtocolRecvVExtTime2Trunk2)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- // video message
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0xff, 0xff, 0xff, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- 0x00, 0x01, 0x02, 0x03, // extended timestamp
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- // chunk #2
- 0xC3,
- /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // chunk #2
- 0xC3,
- /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
-
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- // 0xCX without extended timestamp.
- EXPECT_EQ(0x00010203, msg->header.timestamp);
-}
-
-/**
-* a video message, in 2 chunks packet.
-* use 1B chunk header, min chunk id is 2.
-*/
-VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BMin)
-{
- MockBufferIO bio;
- SrsProtocol proto(&bio);
-
- // video message
- uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x02,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- // chunk #2
- 0xC2, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // chunk #2
- 0xC2, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
- };
- bio.in_buffer.append((char*)data, sizeof(data));
-
- SrsCommonMessage* msg = NULL;
- ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
- SrsAutoFree(SrsCommonMessage, msg);
- EXPECT_TRUE(msg->header.is_video());
- // 1B cid(6bits), min is 2
- EXPECT_EQ(0x02, msg->header.perfer_cid);
-}
-
/**
* a video message, in 2 chunks packet.
* use 1B chunk header, cid in 2-63
@@ -4204,41 +2155,41 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BNormal)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// video message
uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x00, 0x10,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- // chunk #2
- 0xC0, 0x10, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // chunk #2
- 0xC0, 0x10, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x00, 0x10,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ // chunk #2
+ 0xC0, 0x10, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // chunk #2
+ 0xC0, 0x10, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
};
bio.in_buffer.append((char*)data, sizeof(data));
-
+
SrsCommonMessage* msg = NULL;
ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
SrsAutoFree(SrsCommonMessage, msg);
@@ -4255,41 +2206,41 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BNormal2)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// video message
uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x00, 0x11,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- // chunk #2
- 0xC0, 0x11, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // chunk #2
- 0xC0, 0x11, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x00, 0x11,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ // chunk #2
+ 0xC0, 0x11, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // chunk #2
+ 0xC0, 0x11, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
};
bio.in_buffer.append((char*)data, sizeof(data));
-
+
SrsCommonMessage* msg = NULL;
ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
SrsAutoFree(SrsCommonMessage, msg);
@@ -4306,41 +2257,41 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid2BMax)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// video message
uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x00, 0xFF,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- // chunk #2
- 0xC0, 0xFF, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // chunk #2
- 0xC0, 0xFF, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x00, 0xFF,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ // chunk #2
+ 0xC0, 0xFF, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // chunk #2
+ 0xC0, 0xFF, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
};
bio.in_buffer.append((char*)data, sizeof(data));
-
+
SrsCommonMessage* msg = NULL;
ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
SrsAutoFree(SrsCommonMessage, msg);
@@ -4357,41 +2308,41 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BMin)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// video message
uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- // chunk #2
- 0xC1, 0x00, 0x00, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // chunk #2
- 0xC1, 0x00, 0x00, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ // chunk #2
+ 0xC1, 0x00, 0x00, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // chunk #2
+ 0xC1, 0x00, 0x00, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
};
bio.in_buffer.append((char*)data, sizeof(data));
-
+
SrsCommonMessage* msg = NULL;
ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
SrsAutoFree(SrsCommonMessage, msg);
@@ -4408,41 +2359,41 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// video message
uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x01, 0x00, 0x10,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- // chunk #2
- 0xC1, 0x00, 0x10, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // chunk #2
- 0xC1, 0x00, 0x10, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x01, 0x00, 0x10,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ // chunk #2
+ 0xC1, 0x00, 0x10, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // chunk #2
+ 0xC1, 0x00, 0x10, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
};
bio.in_buffer.append((char*)data, sizeof(data));
-
+
SrsCommonMessage* msg = NULL;
ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
SrsAutoFree(SrsCommonMessage, msg);
@@ -4459,41 +2410,41 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal2)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// video message
uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x01, 0x01, 0x10,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- // chunk #2
- 0xC1, 0x01, 0x10, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // chunk #2
- 0xC1, 0x01, 0x10, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x01, 0x01, 0x10,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ // chunk #2
+ 0xC1, 0x01, 0x10, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // chunk #2
+ 0xC1, 0x01, 0x10, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
};
bio.in_buffer.append((char*)data, sizeof(data));
-
+
SrsCommonMessage* msg = NULL;
ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
SrsAutoFree(SrsCommonMessage, msg);
@@ -4510,41 +2461,41 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal3)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// video message
uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x01, 0xFF, 0x10,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- // chunk #2
- 0xC1, 0xFF, 0x10, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // chunk #2
- 0xC1, 0xFF, 0x10, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x01, 0xFF, 0x10,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ // chunk #2
+ 0xC1, 0xFF, 0x10, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // chunk #2
+ 0xC1, 0xFF, 0x10, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
};
bio.in_buffer.append((char*)data, sizeof(data));
-
+
SrsCommonMessage* msg = NULL;
ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
SrsAutoFree(SrsCommonMessage, msg);
@@ -4561,41 +2512,41 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BNormal4)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// video message
uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x01, 0x02, 0x10,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- // chunk #2
- 0xC1, 0x02, 0x10, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // chunk #2
- 0xC1, 0x02, 0x10, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x01, 0x02, 0x10,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ // chunk #2
+ 0xC1, 0x02, 0x10, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // chunk #2
+ 0xC1, 0x02, 0x10, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
};
bio.in_buffer.append((char*)data, sizeof(data));
-
+
SrsCommonMessage* msg = NULL;
ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
SrsAutoFree(SrsCommonMessage, msg);
@@ -4612,41 +2563,41 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVCid3BMax)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// video message
uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x01, 0xFF, 0xFF,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- // chunk #2
- 0xC1, 0xFF, 0xFF, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- // chunk #2
- 0xC1, 0xFF, 0xFF, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x01, 0xFF, 0xFF,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ // chunk #2
+ 0xC1, 0xFF, 0xFF, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // chunk #2
+ 0xC1, 0xFF, 0xFF, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
};
bio.in_buffer.append((char*)data, sizeof(data));
-
+
SrsCommonMessage* msg = NULL;
ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
SrsAutoFree(SrsCommonMessage, msg);
@@ -4662,29 +2613,29 @@ VOID TEST(ProtocolStackTest, ProtocolRecvV0LenMessage)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// video message
uint8_t data[] = {
- // video #1
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x00, 0x00, // length
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
-
- // video #2
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x00, 0x04, // length
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x00, 0x00, 0x07, 0x63
+ // video #1
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x00, 0x00, // length
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+
+ // video #2
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x00, 0x04, // length
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x00, 0x00, 0x07, 0x63
};
bio.in_buffer.append((char*)data, sizeof(data));
-
+
SrsCommonMessage* msg = NULL;
ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
SrsAutoFree(SrsCommonMessage, msg);
@@ -4700,17 +2651,17 @@ VOID TEST(ProtocolStackTest, ProtocolSendVMessage)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
uint8_t data[] = {0x01, 0x02, 0x03, 0x04};
-
+
SrsCommonMessage* msg = new SrsCommonMessage();
msg->size = sizeof(data);
msg->payload = new char[msg->size];
memcpy(msg->payload, data, msg->size);
-
+
SrsSharedPtrMessage m;
ASSERT_TRUE(ERROR_SUCCESS == m.create(msg));
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_message(m.copy(), 0));
EXPECT_EQ(16, bio.out_buffer.length());
}
@@ -4722,37 +2673,37 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsCallPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsAmf0Object* args = SrsAmf0Any::object();
-
+
SrsCallPacket* pkt = new SrsCallPacket();
pkt->command_name = "my_call";
pkt->command_object = SrsAmf0Any::null();
pkt->arguments = args;
-
+
args->set("video_id", SrsAmf0Any::number(100));
args->set("url", SrsAmf0Any::str("http://ossrs.net/api/v1/videos/100"));
args->set("date", SrsAmf0Any::str("2014-07-11 16:20:10.2984"));
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x14,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x6d,
- 0x79, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
- 0x03, 0x00, 0x08, 0x76, 0x69, 0x64, 0x65, 0x6f,
- 0x5f, 0x69, 0x64, 0x00, 0x40, 0x59, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72,
- 0x6c, 0x02, 0x00, 0x22, 0x68, 0x74, 0x74, 0x70,
- 0x3a, 0x2f, 0x2f, 0x6f, 0x73, 0x73, 0x72, 0x73,
- 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x70, 0x69,
- 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x69, 0x64, 0x65,
- 0x6f, 0x73, 0x2f, 0x31, 0x30, 0x30, 0x00, 0x04,
- 0x64, 0x61, 0x74, 0x65, 0x02, 0x00, 0x18, 0x32,
- 0x30, 0x31, 0x34, 0x2d, 0x30, 0x37, 0x2d, 0x31,
- 0x31, 0x20, 0x31, 0x36, 0x3a, 0x32, 0x30, 0x3a,
- 0x31, 0x30, 0x2e, 0x32, 0x39, 0x38, 0x34, 0x00,
- 0x00, 0x09
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x14,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x6d,
+ 0x79, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
+ 0x03, 0x00, 0x08, 0x76, 0x69, 0x64, 0x65, 0x6f,
+ 0x5f, 0x69, 0x64, 0x00, 0x40, 0x59, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72,
+ 0x6c, 0x02, 0x00, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x6f, 0x73, 0x73, 0x72, 0x73,
+ 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x70, 0x69,
+ 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x69, 0x64, 0x65,
+ 0x6f, 0x73, 0x2f, 0x31, 0x30, 0x30, 0x00, 0x04,
+ 0x64, 0x61, 0x74, 0x65, 0x02, 0x00, 0x18, 0x32,
+ 0x30, 0x31, 0x34, 0x2d, 0x30, 0x37, 0x2d, 0x31,
+ 0x31, 0x20, 0x31, 0x36, 0x3a, 0x32, 0x30, 0x3a,
+ 0x31, 0x30, 0x2e, 0x32, 0x39, 0x38, 0x34, 0x00,
+ 0x00, 0x09
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@@ -4764,37 +2715,37 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsCallResPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsAmf0Object* args = SrsAmf0Any::object();
-
+
SrsCallResPacket* pkt = new SrsCallResPacket(0);
pkt->command_name = "_result";
pkt->command_object = SrsAmf0Any::null();
pkt->response = args;
-
+
args->set("video_id", SrsAmf0Any::number(100));
args->set("url", SrsAmf0Any::str("http://ossrs.net/api/v1/videos/100"));
args->set("date", SrsAmf0Any::str("2014-07-11 16:20:10.2984"));
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x14,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x5f,
- 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
- 0x03, 0x00, 0x08, 0x76, 0x69, 0x64, 0x65, 0x6f,
- 0x5f, 0x69, 0x64, 0x00, 0x40, 0x59, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72,
- 0x6c, 0x02, 0x00, 0x22, 0x68, 0x74, 0x74, 0x70,
- 0x3a, 0x2f, 0x2f, 0x6f, 0x73, 0x73, 0x72, 0x73,
- 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x70, 0x69,
- 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x69, 0x64, 0x65,
- 0x6f, 0x73, 0x2f, 0x31, 0x30, 0x30, 0x00, 0x04,
- 0x64, 0x61, 0x74, 0x65, 0x02, 0x00, 0x18, 0x32,
- 0x30, 0x31, 0x34, 0x2d, 0x30, 0x37, 0x2d, 0x31,
- 0x31, 0x20, 0x31, 0x36, 0x3a, 0x32, 0x30, 0x3a,
- 0x31, 0x30, 0x2e, 0x32, 0x39, 0x38, 0x34, 0x00,
- 0x00, 0x09
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x14,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x5f,
+ 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
+ 0x03, 0x00, 0x08, 0x76, 0x69, 0x64, 0x65, 0x6f,
+ 0x5f, 0x69, 0x64, 0x00, 0x40, 0x59, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72,
+ 0x6c, 0x02, 0x00, 0x22, 0x68, 0x74, 0x74, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x6f, 0x73, 0x73, 0x72, 0x73,
+ 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x70, 0x69,
+ 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x69, 0x64, 0x65,
+ 0x6f, 0x73, 0x2f, 0x31, 0x30, 0x30, 0x00, 0x04,
+ 0x64, 0x61, 0x74, 0x65, 0x02, 0x00, 0x18, 0x32,
+ 0x30, 0x31, 0x34, 0x2d, 0x30, 0x37, 0x2d, 0x31,
+ 0x31, 0x20, 0x31, 0x36, 0x3a, 0x32, 0x30, 0x3a,
+ 0x31, 0x30, 0x2e, 0x32, 0x39, 0x38, 0x34, 0x00,
+ 0x00, 0x09
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@@ -4806,17 +2757,17 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsCreateStreamPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsCreateStreamPacket* pkt = new SrsCreateStreamPacket();
pkt->command_object = SrsAmf0Any::null();
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x14,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x63,
- 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72,
- 0x65, 0x61, 0x6d, 0x00, 0x40, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x05
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x14,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x63,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72,
+ 0x65, 0x61, 0x6d, 0x00, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x05
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@@ -4828,20 +2779,20 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsFMLEStartPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsFMLEStartPacket* pkt = new SrsFMLEStartPacket();
pkt->command_name = "FMLEStart";
pkt->command_object = SrsAmf0Any::null();
pkt->stream_name = "livestream";
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x14,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x46,
- 0x4d, 0x4c, 0x45, 0x53, 0x74, 0x61, 0x72, 0x74,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x05, 0x02, 0x00, 0x0a, 0x6c, 0x69, 0x76,
- 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x14,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x46,
+ 0x4d, 0x4c, 0x45, 0x53, 0x74, 0x61, 0x72, 0x74,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x05, 0x02, 0x00, 0x0a, 0x6c, 0x69, 0x76,
+ 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@@ -4853,24 +2804,24 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsFMLEStartResPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsAmf0Object* args = SrsAmf0Any::object();
-
+
SrsFMLEStartResPacket* pkt = new SrsFMLEStartResPacket(1);
pkt->command_name = "FMLEStart";
pkt->command_object = SrsAmf0Any::null();
pkt->args = args;
-
+
args->set("stream" , SrsAmf0Any::str("livestream"));
args->set("start" , SrsAmf0Any::number(0));
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
uint8_t buf[] = {
- 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x14,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x46,
- 0x4d, 0x4c, 0x45, 0x53, 0x74, 0x61, 0x72, 0x74,
- 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x05, 0x06
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x14,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x46,
+ 0x4d, 0x4c, 0x45, 0x53, 0x74, 0x61, 0x72, 0x74,
+ 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x05, 0x06
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), (char*)buf, sizeof(buf)));
}
@@ -4882,22 +2833,22 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsPublishPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsPublishPacket* pkt = new SrsPublishPacket();
pkt->command_name = "publish";
pkt->command_object = SrsAmf0Any::null();
pkt->stream_name = "livestream";
pkt->type = "live";
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
uint8_t buf[] = {
- 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x14,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x70,
- 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
- 0x02, 0x00, 0x0a, 0x6c, 0x69, 0x76, 0x65, 0x73,
- 0x74, 0x72, 0x65, 0x61, 0x6d, 0x02, 0x00, 0x04,
- 0x6c, 0x69, 0x76, 0x65
+ 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x14,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x70,
+ 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
+ 0x02, 0x00, 0x0a, 0x6c, 0x69, 0x76, 0x65, 0x73,
+ 0x74, 0x72, 0x65, 0x61, 0x6d, 0x02, 0x00, 0x04,
+ 0x6c, 0x69, 0x76, 0x65
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), (char*)buf, sizeof(buf)));
}
@@ -4909,29 +2860,29 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsPlayResPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsAmf0Object* args = SrsAmf0Any::object();
-
+
SrsPlayResPacket* pkt = new SrsPlayResPacket();
pkt->command_name = "_result";
pkt->command_object = SrsAmf0Any::null();
pkt->desc = args;
-
+
args->set("stream" , SrsAmf0Any::str("livestream"));
args->set("start" , SrsAmf0Any::number(0));
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x14,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x5f,
- 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
- 0x03, 0x00, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61,
- 0x6d, 0x02, 0x00, 0x0a, 0x6c, 0x69, 0x76, 0x65,
- 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x00, 0x05,
- 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x09
+ 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x14,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x5f,
+ 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
+ 0x03, 0x00, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61,
+ 0x6d, 0x02, 0x00, 0x0a, 0x6c, 0x69, 0x76, 0x65,
+ 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x00, 0x05,
+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x09
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@@ -4943,18 +2894,18 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnBWDonePacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsOnBWDonePacket* pkt = new SrsOnBWDonePacket();
pkt->command_name = "onBWDone";
pkt->args = SrsAmf0Any::null();
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x14,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x6f,
- 0x6e, 0x42, 0x57, 0x44, 0x6f, 0x6e, 0x65, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x05
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x14,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x6f,
+ 0x6e, 0x42, 0x57, 0x44, 0x6f, 0x6e, 0x65, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x05
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@@ -4966,29 +2917,29 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnStatusCallPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsAmf0Object* args = SrsAmf0Any::object();
-
+
args->set("stream" , SrsAmf0Any::str("livestream"));
args->set("start" , SrsAmf0Any::number(0));
-
+
SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
pkt->command_name = "onStatus";
pkt->args = SrsAmf0Any::null();
pkt->data = args;
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x14,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x6f,
- 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x05, 0x03, 0x00, 0x06, 0x73, 0x74, 0x72, 0x65,
- 0x61, 0x6d, 0x02, 0x00, 0x0a, 0x6c, 0x69, 0x76,
- 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x00,
- 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x09
+ 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x14,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x6f,
+ 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x05, 0x03, 0x00, 0x06, 0x73, 0x74, 0x72, 0x65,
+ 0x61, 0x6d, 0x02, 0x00, 0x0a, 0x6c, 0x69, 0x76,
+ 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x00,
+ 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x09
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@@ -5000,26 +2951,26 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnStatusDataPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsAmf0Object* args = SrsAmf0Any::object();
-
+
args->set("stream" , SrsAmf0Any::str("livestream"));
args->set("start" , SrsAmf0Any::number(0));
-
+
SrsOnStatusDataPacket* pkt = new SrsOnStatusDataPacket();
pkt->command_name = "onData";
pkt->data = args;
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x12,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x6f,
- 0x6e, 0x44, 0x61, 0x74, 0x61, 0x03, 0x00, 0x06,
- 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x02, 0x00,
- 0x0a, 0x6c, 0x69, 0x76, 0x65, 0x73, 0x74, 0x72,
- 0x65, 0x61, 0x6d, 0x00, 0x05, 0x73, 0x74, 0x61,
- 0x72, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x09
+ 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x12,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x6f,
+ 0x6e, 0x44, 0x61, 0x74, 0x61, 0x03, 0x00, 0x06,
+ 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x02, 0x00,
+ 0x0a, 0x6c, 0x69, 0x76, 0x65, 0x73, 0x74, 0x72,
+ 0x65, 0x61, 0x6d, 0x00, 0x05, 0x73, 0x74, 0x61,
+ 0x72, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x09
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@@ -5031,19 +2982,19 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSampleAccessPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsSampleAccessPacket* pkt = new SrsSampleAccessPacket();
pkt->command_name = "|RtmpSampleAccess";
pkt->video_sample_access = true;
pkt->audio_sample_access = true;
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x12,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x7c,
- 0x52, 0x74, 0x6d, 0x70, 0x53, 0x61, 0x6d, 0x70,
- 0x6c, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73,
- 0x01, 0x01, 0x01, 0x01
+ 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x12,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x7c,
+ 0x52, 0x74, 0x6d, 0x70, 0x53, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73,
+ 0x01, 0x01, 0x01, 0x01
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@@ -5055,26 +3006,26 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsOnMetaDataPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsAmf0Object* args = SrsAmf0Any::object();
-
+
args->set("width" , SrsAmf0Any::number(1024));
args->set("height" , SrsAmf0Any::number(576));
-
+
SrsOnMetaDataPacket* pkt = new SrsOnMetaDataPacket();
pkt->name = "onMetaData";
pkt->metadata = args;
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
uint8_t buf[] = {
- 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x12,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x6f,
- 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74,
- 0x61, 0x03, 0x00, 0x05, 0x77, 0x69, 0x64, 0x74,
- 0x68, 0x00, 0x40, 0x90, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x06, 0x68, 0x65, 0x69, 0x67,
- 0x68, 0x74, 0x00, 0x40, 0x82, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x09
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x12,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x6f,
+ 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74,
+ 0x61, 0x03, 0x00, 0x05, 0x77, 0x69, 0x64, 0x74,
+ 0x68, 0x00, 0x40, 0x90, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x68, 0x65, 0x69, 0x67,
+ 0x68, 0x74, 0x00, 0x40, 0x82, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x09
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), (char*)buf, sizeof(buf)));
}
@@ -5086,14 +3037,14 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetWindowAckSizePacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsSetWindowAckSizePacket* pkt = new SrsSetWindowAckSizePacket();
pkt->ackowledgement_window_size = 102400;
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
uint8_t buf[] = {
- 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), (char*)buf, sizeof(buf)));
}
@@ -5105,14 +3056,14 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsAcknowledgementPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsAcknowledgementPacket* pkt = new SrsAcknowledgementPacket();
pkt->sequence_number = 1024;
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@@ -5124,14 +3075,14 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetChunkSizePacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket();
pkt->chunk_size = 1024;
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@@ -5143,16 +3094,16 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsSetPeerBandwidthPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsSetPeerBandwidthPacket* pkt = new SrsSetPeerBandwidthPacket();
pkt->type = SrsPeerBandwidthSoft;
pkt->bandwidth = 1024;
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
- 0x01
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
+ 0x01
};
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
}
@@ -5164,19 +3115,19 @@ VOID TEST(ProtocolStackTest, ProtocolSendSrsUserControlPacket)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
SrsUserControlPacket* pkt = new SrsUserControlPacket();
pkt->event_type = SrcPCUCSetBufferLength;
pkt->event_data = 0x01;
pkt->extra_data = 0x10;
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
char buf[] = {
- 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00, 0x01, 0x00, 0x00, 0x00, 0x10
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x10
};
-
+
EXPECT_TRUE(srs_bytes_equals(bio.out_buffer.bytes(), buf, sizeof(buf)));
EXPECT_TRUE(true);
}
@@ -5191,39 +3142,39 @@ VOID TEST(ProtocolStackTest, ProtocolRecvVMessageFmtInvalid)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// video message
uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03,
- 0x00, 0x00, 0x00, // timestamp
- 0x00, 0x01, 0x10, // length, 272
- 0x09, // message_type
- 0x00, 0x00, 0x00, 0x00, // stream_id
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- 0x03, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xC3, /*next chunk.*/
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ 0x03, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
};
bio.in_buffer.append((char*)data, sizeof(data));
-
+
SrsCommonMessage* msg = NULL;
EXPECT_FALSE(ERROR_SUCCESS == proto.recv_message(&msg));
}
@@ -5235,34 +3186,34 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
if (true) {
SrsSetWindowAckSizePacket* pkt = new SrsSetWindowAckSizePacket();
pkt->ackowledgement_window_size = 512;
-
+
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_packet(pkt, 0));
}
-
+
if (true) {
SrsCommonMessage* msg = new SrsCommonMessage();
msg->header.payload_length = msg->size = 4096;
msg->payload = new char[msg->size];
-
+
msg->header.message_type = 9;
EXPECT_TRUE(msg->header.is_video());
-
+
SrsSharedPtrMessage m;
ASSERT_TRUE(ERROR_SUCCESS == m.create(msg));
EXPECT_TRUE(ERROR_SUCCESS == proto.send_and_free_message(m.copy(), 1));
}
-
+
// copy output to input
if (true) {
bio.in_buffer.append(bio.out_buffer.bytes(), bio.out_buffer.length());
bio.out_buffer.erase(bio.out_buffer.length());
}
-
+
// recv SrsSetWindowAckSizePacket
if (true) {
SrsCommonMessage* msg = NULL;
@@ -5277,7 +3228,7 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow)
SrsAutoFree(SrsCommonMessage, msg);
ASSERT_TRUE(msg->header.is_video());
}
-
+
// copy output to input
if (true) {
bio.in_buffer.append(bio.out_buffer.bytes(), bio.out_buffer.length());
@@ -5290,16 +3241,16 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow)
SrsAutoFree(SrsCommonMessage, msg);
ASSERT_TRUE(msg->header.is_ackledgement());
}
-
+
// send again
if (true) {
SrsCommonMessage* msg = new SrsCommonMessage();
msg->header.payload_length = msg->size = 4096;
msg->payload = new char[msg->size];
-
+
msg->header.message_type = 9;
EXPECT_TRUE(msg->header.is_video());
-
+
SrsSharedPtrMessage m;
ASSERT_TRUE(ERROR_SUCCESS == m.create(msg));
@@ -5317,7 +3268,7 @@ VOID TEST(ProtocolStackTest, ProtocolAckSizeFlow)
SrsAutoFree(SrsCommonMessage, msg);
ASSERT_TRUE(msg->header.is_video());
}
-
+
// copy output to input
if (true) {
bio.in_buffer.append(bio.out_buffer.bytes(), bio.out_buffer.length());
@@ -5339,7 +3290,7 @@ VOID TEST(ProtocolStackTest, ProtocolPingFlow)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// ping request
if (true) {
SrsUserControlPacket* pkt = new SrsUserControlPacket();
@@ -5359,7 +3310,7 @@ VOID TEST(ProtocolStackTest, ProtocolPingFlow)
SrsAutoFree(SrsCommonMessage, msg);
EXPECT_TRUE(msg->header.is_user_control_message());
}
-
+
// recv the server auto send ping response message
// copy output to input
if (true) {
@@ -5372,12 +3323,12 @@ VOID TEST(ProtocolStackTest, ProtocolPingFlow)
ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
SrsAutoFree(SrsCommonMessage, msg);
ASSERT_TRUE(msg->header.is_user_control_message());
-
+
SrsPacket* pkt = NULL;
ASSERT_TRUE(ERROR_SUCCESS == proto.decode_message(msg, &pkt));
SrsUserControlPacket* spkt = dynamic_cast(pkt);
ASSERT_TRUE(spkt != NULL);
-
+
EXPECT_TRUE(SrcPCUCPingResponse == spkt->event_type);
EXPECT_TRUE(0x3456 == spkt->event_data);
}
@@ -5390,45 +3341,45 @@ VOID TEST(ProtocolStackTest, ProtocolExcpectMessage)
{
MockBufferIO bio;
SrsProtocol proto(&bio);
-
+
// packet is SrsConnectAppPacket
uint8_t data[] = {
- // 12bytes header, 1byts chunk header, 11bytes msg heder
- 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0xa1, 0x14, 0x00, 0x00, 0x00, 0x00,
- // msg payload start
- 0x02, 0x00, 0x07, 0x63,
- 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
- 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
- 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
- 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
- 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
- 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
- 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
- 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
- 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
- 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
- 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
- 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
- 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
- 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xC3, /*next chunk.*/ 0x0d, 0x76, 0x69, 0x64,
- 0x65, 0x6f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x07, 0x70, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x62, 0x68,
- 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72, 0x73, 0x2e,
- 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73,
- 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c,
- 0x3f, 0x76, 0x68, 0x6f, 0x73, 0x74, 0x3d, 0x64, 0x65, 0x76, 0x26, 0x73, 0x74, 0x72, 0x65, 0x61,
- 0x6d, 0x3d, 0x6c, 0x69, 0x76, 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x26, 0x73, 0x65, 0x72,
- 0x76, 0x65, 0x72, 0x3d, 0x64, 0x65, 0x76, 0x26, 0x70, 0x6f, 0x72, 0x74,
- 0xC3, /*next chunk.*/ 0x3d, 0x31, 0x39, 0x33,
- 0x35, 0x00, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
- 0x67, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0xa1, 0x14, 0x00, 0x00, 0x00, 0x00,
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xC3, /*next chunk.*/ 0x0d, 0x76, 0x69, 0x64,
+ 0x65, 0x6f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x07, 0x70, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x62, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72, 0x73, 0x2e,
+ 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73,
+ 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c,
+ 0x3f, 0x76, 0x68, 0x6f, 0x73, 0x74, 0x3d, 0x64, 0x65, 0x76, 0x26, 0x73, 0x74, 0x72, 0x65, 0x61,
+ 0x6d, 0x3d, 0x6c, 0x69, 0x76, 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x26, 0x73, 0x65, 0x72,
+ 0x76, 0x65, 0x72, 0x3d, 0x64, 0x65, 0x76, 0x26, 0x70, 0x6f, 0x72, 0x74,
+ 0xC3, /*next chunk.*/ 0x3d, 0x31, 0x39, 0x33,
+ 0x35, 0x00, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
+ 0x67, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09
};
bio.in_buffer.append((char*)data, sizeof(data));
-
+
SrsCommonMessage* msg = NULL;
SrsConnectAppPacket* pkt = NULL;
ASSERT_TRUE(ERROR_SUCCESS == proto.expect_message(&msg, &pkt));
@@ -5441,47 +3392,47 @@ VOID TEST(ProtocolRTMPTest, RTMPRequest)
{
SrsRequest req;
std::string param;
-
+
req.stream = "livestream";
- srs_discovery_tc_url("rtmp://std.ossrs.net/live",
- req.schema, req.host, req.vhost, req.app, req.stream, req.port, param);
+ srs_discovery_tc_url("rtmp://std.ossrs.net/live",
+ req.schema, req.host, req.vhost, req.app, req.stream, req.port, param);
req.strip();
EXPECT_STREQ("rtmp", req.schema.c_str());
EXPECT_STREQ("std.ossrs.net", req.host.c_str());
EXPECT_STREQ("std.ossrs.net", req.vhost.c_str());
EXPECT_STREQ("live", req.app.c_str());
EXPECT_EQ(1935, req.port);
-
+
req.stream = "livestream";
- srs_discovery_tc_url("rtmp://s td.os srs.n et/li v e",
- req.schema, req.host, req.vhost, req.app, req.stream, req.port, param);
+ srs_discovery_tc_url("rtmp://s td.os srs.n et/li v e",
+ req.schema, req.host, req.vhost, req.app, req.stream, req.port, param);
req.strip();
EXPECT_STREQ("rtmp", req.schema.c_str());
EXPECT_STREQ("std.ossrs.net", req.host.c_str());
EXPECT_STREQ("std.ossrs.net", req.vhost.c_str());
EXPECT_STREQ("live", req.app.c_str());
EXPECT_EQ(1935, req.port);
-
+
req.stream = "livestream";
- srs_discovery_tc_url("rtmp://s\ntd.o\rssrs.ne\nt/li\nve",
- req.schema, req.host, req.vhost, req.app, req.stream, req.port, param);
+ srs_discovery_tc_url("rtmp://s\ntd.o\rssrs.ne\nt/li\nve",
+ req.schema, req.host, req.vhost, req.app, req.stream, req.port, param);
req.strip();
EXPECT_STREQ("rtmp", req.schema.c_str());
EXPECT_STREQ("std.ossrs.net", req.host.c_str());
EXPECT_STREQ("std.ossrs.net", req.vhost.c_str());
EXPECT_STREQ("live", req.app.c_str());
EXPECT_EQ(1935, req.port);
-
+
req.stream = "livestream";
- srs_discovery_tc_url("rtmp://std.ossrs.net/live ",
- req.schema, req.host, req.vhost, req.app, req.stream, req.port, param);
+ srs_discovery_tc_url("rtmp://std.ossrs.net/live ",
+ req.schema, req.host, req.vhost, req.app, req.stream, req.port, param);
req.strip();
EXPECT_STREQ("rtmp", req.schema.c_str());
EXPECT_STREQ("std.ossrs.net", req.host.c_str());
EXPECT_STREQ("std.ossrs.net", req.vhost.c_str());
EXPECT_STREQ("live", req.app.c_str());
EXPECT_EQ(1935, req.port);
-
+
EXPECT_TRUE(NULL == req.args);
SrsRequest req1;
req1.args = SrsAmf0Any::object();
@@ -5494,59 +3445,59 @@ VOID TEST(ProtocolRTMPTest, RTMPHandshakeBytes)
{
MockBufferIO bio;
SrsHandshakeBytes bytes;
-
+
char hs[3073];
bio.in_buffer.append(hs, sizeof(hs));
bio.in_buffer.append(hs, sizeof(hs));
-
+
EXPECT_TRUE(ERROR_SUCCESS == bytes.read_c0c1(&bio));
EXPECT_TRUE(bytes.c0c1 != NULL);
-
+
EXPECT_TRUE(ERROR_SUCCESS == bytes.read_c2(&bio));
EXPECT_TRUE(bytes.c2 != NULL);
-
+
EXPECT_TRUE(ERROR_SUCCESS == bytes.read_s0s1s2(&bio));
EXPECT_TRUE(bytes.s0s1s2 != NULL);
}
struct MockStage
{
- http_parser parser;
- const char* at;
- size_t length;
+ http_parser parser;
+ const char* at;
+ size_t length;
- MockStage(http_parser* from);
+ MockStage(http_parser* from);
};
MockStage::MockStage(http_parser* from)
{
- parser = *from;
- at = NULL;
- length = 0;
+ parser = *from;
+ at = NULL;
+ length = 0;
}
class MockParser
{
private:
- http_parser_settings settings;
- http_parser* parser;
- size_t parsed;
+ http_parser_settings settings;
+ http_parser* parser;
+ size_t parsed;
public:
- MockStage* message_begin;
- MockStage* url;
- MockStage* status;
- MockStage* header_field;
- MockStage* header_value;
- MockStage* headers_complete;
- MockStage* body;
- MockStage* message_complete;
- MockStage* chunk_header;
- MockStage* chunk_complete;
+ MockStage* message_begin;
+ MockStage* url;
+ MockStage* status;
+ MockStage* header_field;
+ MockStage* header_value;
+ MockStage* headers_complete;
+ MockStage* body;
+ MockStage* message_complete;
+ MockStage* chunk_header;
+ MockStage* chunk_complete;
public:
- MockParser();
- virtual ~MockParser();
+ MockParser();
+ virtual ~MockParser();
public:
- srs_error_t parse(string data);
+ srs_error_t parse(string data);
private:
static int on_message_begin(http_parser* parser);
static int on_url(http_parser* parser, const char* at, size_t length);
@@ -5562,8 +3513,8 @@ private:
MockParser::MockParser()
{
- parser = new http_parser();
- http_parser_init(parser, HTTP_REQUEST);
+ parser = new http_parser();
+ http_parser_init(parser, HTTP_REQUEST);
parser->data = (void*)this;
parsed = 0;
@@ -5579,32 +3530,32 @@ MockParser::MockParser()
settings.on_chunk_header = on_chunk_header;
settings.on_chunk_complete = on_chunk_complete;
- message_begin = NULL;
- url = NULL;
- status = NULL;
- header_field = NULL;
- header_value = NULL;
- headers_complete = NULL;
- body = NULL;
- message_complete = NULL;
- chunk_header = NULL;
- chunk_complete = NULL;
+ message_begin = NULL;
+ url = NULL;
+ status = NULL;
+ header_field = NULL;
+ header_value = NULL;
+ headers_complete = NULL;
+ body = NULL;
+ message_complete = NULL;
+ chunk_header = NULL;
+ chunk_complete = NULL;
}
MockParser::~MockParser()
{
- srs_freep(parser);
+ srs_freep(parser);
- srs_freep(message_begin);
- srs_freep(url);
- srs_freep(status);
- srs_freep(header_field);
- srs_freep(header_value);
- srs_freep(headers_complete);
- srs_freep(body);
- srs_freep(message_complete);
- srs_freep(chunk_header);
- srs_freep(chunk_complete);
+ srs_freep(message_begin);
+ srs_freep(url);
+ srs_freep(status);
+ srs_freep(header_field);
+ srs_freep(header_value);
+ srs_freep(headers_complete);
+ srs_freep(body);
+ srs_freep(message_complete);
+ srs_freep(chunk_header);
+ srs_freep(chunk_complete);
}
int MockParser::on_message_begin(http_parser* parser)
@@ -5612,7 +3563,7 @@ int MockParser::on_message_begin(http_parser* parser)
MockParser* obj = (MockParser*)parser->data;
srs_assert(obj);
- srs_freep(obj->message_begin);
+ srs_freep(obj->message_begin);
obj->message_begin = new MockStage(parser);
return 0;
@@ -5623,7 +3574,7 @@ int MockParser::on_url(http_parser* parser, const char* at, size_t length)
MockParser* obj = (MockParser*)parser->data;
srs_assert(obj);
- srs_freep(obj->url);
+ srs_freep(obj->url);
obj->url = new MockStage(parser);
obj->url->at = at;
obj->url->length = length;
@@ -5636,7 +3587,7 @@ int MockParser::on_status(http_parser* parser, const char* at, size_t length)
MockParser* obj = (MockParser*)parser->data;
srs_assert(obj);
- srs_freep(obj->status);
+ srs_freep(obj->status);
obj->status = new MockStage(parser);
obj->status->at = at;
obj->status->length = length;
@@ -5649,7 +3600,7 @@ int MockParser::on_header_field(http_parser* parser, const char* at, size_t leng
MockParser* obj = (MockParser*)parser->data;
srs_assert(obj);
- srs_freep(obj->header_field);
+ srs_freep(obj->header_field);
obj->header_field = new MockStage(parser);
obj->header_field->at = at;
obj->header_field->length = length;
@@ -5662,7 +3613,7 @@ int MockParser::on_header_value(http_parser* parser, const char* at, size_t leng
MockParser* obj = (MockParser*)parser->data;
srs_assert(obj);
- srs_freep(obj->header_value);
+ srs_freep(obj->header_value);
obj->header_value = new MockStage(parser);
obj->header_value->at = at;
obj->header_value->length = length;
@@ -5675,7 +3626,7 @@ int MockParser::on_headers_complete(http_parser* parser)
MockParser* obj = (MockParser*)parser->data;
srs_assert(obj);
- srs_freep(obj->headers_complete);
+ srs_freep(obj->headers_complete);
obj->headers_complete = new MockStage(parser);
return 0;
@@ -5686,7 +3637,7 @@ int MockParser::on_body(http_parser* parser, const char* at, size_t length)
MockParser* obj = (MockParser*)parser->data;
srs_assert(obj);
- srs_freep(obj->body);
+ srs_freep(obj->body);
obj->body = new MockStage(parser);
obj->body->at = at;
obj->body->length = length;
@@ -5699,7 +3650,7 @@ int MockParser::on_message_complete(http_parser* parser)
MockParser* obj = (MockParser*)parser->data;
srs_assert(obj);
- srs_freep(obj->message_complete);
+ srs_freep(obj->message_complete);
obj->message_complete = new MockStage(parser);
return 0;
@@ -5710,7 +3661,7 @@ int MockParser::on_chunk_header(http_parser* parser)
MockParser* obj = (MockParser*)parser->data;
srs_assert(obj);
- srs_freep(obj->chunk_header);
+ srs_freep(obj->chunk_header);
obj->chunk_header = new MockStage(parser);
return 0;
@@ -5721,7 +3672,7 @@ int MockParser::on_chunk_complete(http_parser* parser)
MockParser* obj = (MockParser*)parser->data;
srs_assert(obj);
- srs_freep(obj->chunk_complete);
+ srs_freep(obj->chunk_complete);
obj->chunk_complete = new MockStage(parser);
return 0;
@@ -5729,221 +3680,221 @@ int MockParser::on_chunk_complete(http_parser* parser)
srs_error_t MockParser::parse(string data)
{
- srs_error_t err = srs_success;
+ srs_error_t err = srs_success;
- const char* buf = (const char*)data.data();
- size_t size = (size_t)data.length();
- size_t nparsed = http_parser_execute(parser, &settings, buf, size);
- parsed = nparsed;
+ const char* buf = (const char*)data.data();
+ size_t size = (size_t)data.length();
+ size_t nparsed = http_parser_execute(parser, &settings, buf, size);
+ parsed = nparsed;
- if (nparsed != size) {
- return srs_error_new(-1, "nparsed=%d, size=%d", nparsed, size);
- }
+ if (nparsed != size) {
+ return srs_error_new(-1, "nparsed=%d, size=%d", nparsed, size);
+ }
- return err;
+ return err;
}
VOID TEST(ProtocolHTTPTest, HTTPParser)
{
- srs_error_t err;
+ srs_error_t err;
- if (true) {
- MockParser parser;
- // size = 70, nparsed = 70, nread = 0
- HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\n"));
- EXPECT_EQ(70, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- EXPECT_TRUE(!parser.body);
- EXPECT_TRUE(parser.headers_complete);
- EXPECT_TRUE(!parser.message_complete);
- }
+ if (true) {
+ MockParser parser;
+ // size = 70, nparsed = 70, nread = 0
+ HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\n"));
+ EXPECT_EQ(70, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ EXPECT_TRUE(!parser.body);
+ EXPECT_TRUE(parser.headers_complete);
+ EXPECT_TRUE(!parser.message_complete);
+ }
- if (true) {
- MockParser parser;
- // size = 75, nparsed = 75, nread = 0
- HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nHello"));
- EXPECT_EQ(75, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- EXPECT_TRUE(parser.body && 5 == parser.body->length);
- EXPECT_TRUE(parser.headers_complete);
- EXPECT_TRUE(parser.message_complete);
- }
+ if (true) {
+ MockParser parser;
+ // size = 75, nparsed = 75, nread = 0
+ HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nHello"));
+ EXPECT_EQ(75, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ EXPECT_TRUE(parser.body && 5 == parser.body->length);
+ EXPECT_TRUE(parser.headers_complete);
+ EXPECT_TRUE(parser.message_complete);
+ }
- if (true) {
- MockParser parser;
- // size = 150, nparsed = 150, nread = 0
- HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nHelloGET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nWorld"));
- EXPECT_EQ(150, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- }
+ if (true) {
+ MockParser parser;
+ // size = 150, nparsed = 150, nread = 0
+ HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nHelloGET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nWorld"));
+ EXPECT_EQ(150, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ }
- if (true) {
- MockParser parser;
- // size = 70, nparsed = 70, nread = 0, content_length = 5, Header("Content-Length", 5)
- HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\n"));
- EXPECT_EQ(70, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- EXPECT_EQ(5, (int)parser.parser->content_length);
+ if (true) {
+ MockParser parser;
+ // size = 70, nparsed = 70, nread = 0, content_length = 5, Header("Content-Length", 5)
+ HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\n"));
+ EXPECT_EQ(70, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ EXPECT_EQ(5, (int)parser.parser->content_length);
- // size = 79, nparsed = 5, nread = 1, content_length = -1, Header("Content-Length", 5)
- HELPER_EXPECT_FAILED(parser.parse("elloGET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nHello"));
- EXPECT_EQ(5, (int)parser.parsed);
- EXPECT_EQ(1, (int)parser.parser->nread);
- EXPECT_EQ(-1, (int64_t)parser.parser->content_length);
- }
+ // size = 79, nparsed = 5, nread = 1, content_length = -1, Header("Content-Length", 5)
+ HELPER_EXPECT_FAILED(parser.parse("elloGET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nHello"));
+ EXPECT_EQ(5, (int)parser.parsed);
+ EXPECT_EQ(1, (int)parser.parser->nread);
+ EXPECT_EQ(-1, (int64_t)parser.parser->content_length);
+ }
- if (true) {
- MockParser parser;
- // size = 70, nparsed = 70, nread = 0, content_length = 5, Header("Content-Length", 5)
- HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\n"));
- EXPECT_EQ(70, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- EXPECT_EQ(5, (int)parser.parser->content_length);
+ if (true) {
+ MockParser parser;
+ // size = 70, nparsed = 70, nread = 0, content_length = 5, Header("Content-Length", 5)
+ HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\n"));
+ EXPECT_EQ(70, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ EXPECT_EQ(5, (int)parser.parser->content_length);
- // size = 80, nparsed = 70, nread = 0, content_length = 0, Header("Content-Length", 5)
- HELPER_EXPECT_SUCCESS(parser.parse("HelloGET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nWorld"));
- EXPECT_EQ(80, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- EXPECT_EQ(0, (int)parser.parser->content_length);
- }
+ // size = 80, nparsed = 70, nread = 0, content_length = 0, Header("Content-Length", 5)
+ HELPER_EXPECT_SUCCESS(parser.parse("HelloGET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nWorld"));
+ EXPECT_EQ(80, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ EXPECT_EQ(0, (int)parser.parser->content_length);
+ }
- if (true) {
- MockParser parser;
- // size = 73, nparsed = 73, nread = 0, content_length = 2, Header("Content-Length", 5)
- HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nHel"));
- EXPECT_EQ(73, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- EXPECT_EQ(2, (int)parser.parser->content_length);
- }
+ if (true) {
+ MockParser parser;
+ // size = 73, nparsed = 73, nread = 0, content_length = 2, Header("Content-Length", 5)
+ HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nHel"));
+ EXPECT_EQ(73, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ EXPECT_EQ(2, (int)parser.parser->content_length);
+ }
- if (true) {
- MockParser parser;
- // size = 82, nparsed = 75, nread = 1, content_length = -1, Header("Content-Length", 5)
- HELPER_EXPECT_FAILED(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nHello World!"));
- EXPECT_EQ(75, (int)parser.parsed);
- EXPECT_EQ(1, (int)parser.parser->nread);
- EXPECT_EQ(-1, (int64_t)parser.parser->content_length);
- }
+ if (true) {
+ MockParser parser;
+ // size = 82, nparsed = 75, nread = 1, content_length = -1, Header("Content-Length", 5)
+ HELPER_EXPECT_FAILED(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nHello World!"));
+ EXPECT_EQ(75, (int)parser.parsed);
+ EXPECT_EQ(1, (int)parser.parser->nread);
+ EXPECT_EQ(-1, (int64_t)parser.parser->content_length);
+ }
- if (true) {
- MockParser parser;
- // size = 34, nparsed = 34, nread = 34
- HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHo"));
- EXPECT_EQ(34, (int)parser.parsed);
- EXPECT_EQ(34, (int)parser.parser->nread);
+ if (true) {
+ MockParser parser;
+ // size = 34, nparsed = 34, nread = 34
+ HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHo"));
+ EXPECT_EQ(34, (int)parser.parsed);
+ EXPECT_EQ(34, (int)parser.parser->nread);
- // size = 41, nparsed = 41, nread = 0
- HELPER_EXPECT_SUCCESS(parser.parse("st: ossrs.net\r\nContent-Length: 5\r\n\r\nHello"));
- EXPECT_EQ(41, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- }
+ // size = 41, nparsed = 41, nread = 0
+ HELPER_EXPECT_SUCCESS(parser.parse("st: ossrs.net\r\nContent-Length: 5\r\n\r\nHello"));
+ EXPECT_EQ(41, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ }
- if (true) {
- MockParser parser;
- // size = 41, nparsed = 41, nread = 41
- HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: oss"));
- EXPECT_EQ(41, (int)parser.parsed);
- EXPECT_EQ(41, (int)parser.parser->nread);
+ if (true) {
+ MockParser parser;
+ // size = 41, nparsed = 41, nread = 41
+ HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: oss"));
+ EXPECT_EQ(41, (int)parser.parsed);
+ EXPECT_EQ(41, (int)parser.parser->nread);
- // size = 34, nparsed = 34, nread = 0
- HELPER_EXPECT_SUCCESS(parser.parse("rs.net\r\nContent-Length: 5\r\n\r\nHello"));
- EXPECT_EQ(34, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- }
+ // size = 34, nparsed = 34, nread = 0
+ HELPER_EXPECT_SUCCESS(parser.parse("rs.net\r\nContent-Length: 5\r\n\r\nHello"));
+ EXPECT_EQ(34, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ }
- if (true) {
- MockParser parser;
- // size = 48, nparsed = 48, nread = 48
- HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r"));
- EXPECT_EQ(48, (int)parser.parsed);
- EXPECT_EQ(48, (int)parser.parser->nread);
+ if (true) {
+ MockParser parser;
+ // size = 48, nparsed = 48, nread = 48
+ HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r"));
+ EXPECT_EQ(48, (int)parser.parsed);
+ EXPECT_EQ(48, (int)parser.parser->nread);
- // size = 27, nparsed = 27, nread = 0
- HELPER_EXPECT_SUCCESS(parser.parse("\nContent-Length: 5\r\n\r\nHello"));
- EXPECT_EQ(27, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- }
+ // size = 27, nparsed = 27, nread = 0
+ HELPER_EXPECT_SUCCESS(parser.parse("\nContent-Length: 5\r\n\r\nHello"));
+ EXPECT_EQ(27, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ }
- if (true) {
- MockParser parser;
- // size = 68, nparsed = 68, nread = 68
- HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n"));
- EXPECT_EQ(68, (int)parser.parsed);
- EXPECT_EQ(68, (int)parser.parser->nread);
+ if (true) {
+ MockParser parser;
+ // size = 68, nparsed = 68, nread = 68
+ HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n"));
+ EXPECT_EQ(68, (int)parser.parsed);
+ EXPECT_EQ(68, (int)parser.parser->nread);
- // size = 7, nparsed = 7, nread = 0
- HELPER_EXPECT_SUCCESS(parser.parse("\r\nHello"));
- EXPECT_EQ(7, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- }
+ // size = 7, nparsed = 7, nread = 0
+ HELPER_EXPECT_SUCCESS(parser.parse("\r\nHello"));
+ EXPECT_EQ(7, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ }
- if (true) {
- MockParser parser;
- // size = 69, nparsed = 69, nread = 69
- HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r"));
- EXPECT_EQ(69, (int)parser.parsed);
- EXPECT_EQ(69, (int)parser.parser->nread);
+ if (true) {
+ MockParser parser;
+ // size = 69, nparsed = 69, nread = 69
+ HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r"));
+ EXPECT_EQ(69, (int)parser.parsed);
+ EXPECT_EQ(69, (int)parser.parser->nread);
- // size = 6, nparsed = 6, nread = 0
- HELPER_EXPECT_SUCCESS(parser.parse("\nHello"));
- EXPECT_EQ(6, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- }
+ // size = 6, nparsed = 6, nread = 0
+ HELPER_EXPECT_SUCCESS(parser.parse("\nHello"));
+ EXPECT_EQ(6, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ }
- if (true) {
- MockParser parser;
- // size = 75, nparsed = 75, nread = 0
- HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nHello"));
- EXPECT_EQ(75, (int)parser.parsed);
- EXPECT_EQ(0, (int)parser.parser->nread);
- }
+ if (true) {
+ MockParser parser;
+ // size = 75, nparsed = 75, nread = 0
+ HELPER_EXPECT_SUCCESS(parser.parse("GET /gslb/v1/versions HTTP/1.1\r\nHost: ossrs.net\r\nContent-Length: 5\r\n\r\nHello"));
+ EXPECT_EQ(75, (int)parser.parsed);
+ EXPECT_EQ(0, (int)parser.parser->nread);
+ }
- if (true) {
- MockParser parser;
- // nparsed = 2, size = 2, nread = 2
- HELPER_EXPECT_SUCCESS(parser.parse("GE"));
- EXPECT_EQ(2, (int)parser.parsed);
- EXPECT_EQ(2, (int)parser.parser->nread);
+ if (true) {
+ MockParser parser;
+ // nparsed = 2, size = 2, nread = 2
+ HELPER_EXPECT_SUCCESS(parser.parse("GE"));
+ EXPECT_EQ(2, (int)parser.parsed);
+ EXPECT_EQ(2, (int)parser.parser->nread);
- // size = 0, nparsed = 1, nread=2
- HELPER_EXPECT_FAILED(parser.parse(""));
- EXPECT_EQ(1, (int)parser.parsed);
- EXPECT_EQ(2, (int)parser.parser->nread);
- }
+ // size = 0, nparsed = 1, nread=2
+ HELPER_EXPECT_FAILED(parser.parse(""));
+ EXPECT_EQ(1, (int)parser.parsed);
+ EXPECT_EQ(2, (int)parser.parser->nread);
+ }
- if (true) {
- MockParser parser;
- // size = 2, nparsed = 2, nread = 2
- HELPER_EXPECT_SUCCESS(parser.parse("GE"));
- EXPECT_EQ(2, (int)parser.parsed);
- EXPECT_EQ(2, (int)parser.parser->nread);
+ if (true) {
+ MockParser parser;
+ // size = 2, nparsed = 2, nread = 2
+ HELPER_EXPECT_SUCCESS(parser.parse("GE"));
+ EXPECT_EQ(2, (int)parser.parsed);
+ EXPECT_EQ(2, (int)parser.parser->nread);
- // size = 1, nparsed = 0, nread = 3
- HELPER_EXPECT_FAILED(parser.parse("X"));
- EXPECT_EQ(0, (int)parser.parsed);
- EXPECT_EQ(3, (int)parser.parser->nread);
- }
+ // size = 1, nparsed = 0, nread = 3
+ HELPER_EXPECT_FAILED(parser.parse("X"));
+ EXPECT_EQ(0, (int)parser.parsed);
+ EXPECT_EQ(3, (int)parser.parser->nread);
+ }
- if (true) {
- MockParser parser;
- // size = 2, nparsed = 2, nread = 2
- HELPER_EXPECT_SUCCESS(parser.parse("GE"));
- EXPECT_EQ(2, (int)parser.parsed);
- EXPECT_EQ(2, (int)parser.parser->nread);
+ if (true) {
+ MockParser parser;
+ // size = 2, nparsed = 2, nread = 2
+ HELPER_EXPECT_SUCCESS(parser.parse("GE"));
+ EXPECT_EQ(2, (int)parser.parsed);
+ EXPECT_EQ(2, (int)parser.parser->nread);
- // size = 1, nparsed = 1, nread = 3
- HELPER_EXPECT_SUCCESS(parser.parse("T"));
- EXPECT_EQ(1, (int)parser.parsed);
- EXPECT_EQ(3, (int)parser.parser->nread);
- }
+ // size = 1, nparsed = 1, nread = 3
+ HELPER_EXPECT_SUCCESS(parser.parse("T"));
+ EXPECT_EQ(1, (int)parser.parsed);
+ EXPECT_EQ(3, (int)parser.parser->nread);
+ }
- if (true) {
- MockParser parser;
- // size = 3, nparsed = 3, nread = 3
- HELPER_EXPECT_SUCCESS(parser.parse("GET"));
- EXPECT_EQ(3, (int)parser.parsed);
- EXPECT_EQ(3, (int)parser.parser->nread);
- }
+ if (true) {
+ MockParser parser;
+ // size = 3, nparsed = 3, nread = 3
+ HELPER_EXPECT_SUCCESS(parser.parse("GET"));
+ EXPECT_EQ(3, (int)parser.parsed);
+ EXPECT_EQ(3, (int)parser.parser->nread);
+ }
}
VOID TEST(ProtocolHTTPTest, ParseHTTPMessage)
@@ -5965,7 +3916,7 @@ VOID TEST(ProtocolHTTPTest, ParseHTTPMessage)
EXPECT_FALSE(req->body_reader()->eof());
srs_freep(req);
- // Got new packet, notice that previous body still exists in bio.
+ // Got new packet, notice that previous body still exists in bio.
bio.append("GET /gslb/v2/versions HTTP/1.1\r\nContent-Length: 5\r\n\r\nHello");
// Should fail because there is body which not read.
@@ -5981,61 +3932,61 @@ VOID TEST(ProtocolHTTPTest, ParseHTTPMessage)
bio.append("GET");
HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
- // Should fail if not completed message.
+ // Should fail if not completed message.
ISrsHttpMessage* req = NULL;
HELPER_ASSERT_FAILED(hp.parse_message(&bio, &req));
srs_freep(req);
}
-
+
if (true) {
MockBufferIO bio;
SrsHttpParser hp;
-
+
bio.append("GET /gslb/v1/versions HTTP/1.1\r\nContent-Length: 5\r\n\r\nHello");
HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
-
+
ISrsHttpMessage* req = NULL;
SrsAutoFree(ISrsHttpMessage, req);
HELPER_ASSERT_SUCCESS(hp.parse_message(&bio, &req));
-
+
char v[64] = {0};
HELPER_ASSERT_SUCCESS(req->body_reader()->read(v, sizeof(v), NULL));
EXPECT_TRUE(string("Hello") == string(v));
-
+
EXPECT_TRUE(req->body_reader()->eof());
}
-
+
if (true) {
MockBufferIO bio;
SrsHttpParser hp;
-
+
bio.append("GET /gslb/v1/versions HTTP/1.1\r\nContent-Length: 0\r\n\r\n");
HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
-
+
ISrsHttpMessage* req = NULL;
SrsAutoFree(ISrsHttpMessage, req);
HELPER_ASSERT_SUCCESS(hp.parse_message(&bio, &req));
}
-
+
if (true) {
MockBufferIO bio;
SrsHttpParser hp;
-
+
bio.append("GET /gslb/v1/versions HTTP/1.1\r\n\r\n");
HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
-
+
ISrsHttpMessage* req = NULL;
SrsAutoFree(ISrsHttpMessage, req);
HELPER_ASSERT_SUCCESS(hp.parse_message(&bio, &req));
}
-
+
if (true) {
MockBufferIO bio;
SrsHttpParser hp;
-
+
bio.append("GET /gslb/v1/versions HTTP/1.1\r\n\r\n");
HELPER_ASSERT_SUCCESS(hp.initialize(HTTP_REQUEST));
-
+
ISrsHttpMessage* req = NULL;
SrsAutoFree(ISrsHttpMessage, req);
HELPER_ASSERT_SUCCESS(hp.parse_message(&bio, &req));
@@ -6338,3 +4289,2737 @@ VOID TEST(ProtocolKbpsTest, NewDelta)
}
}
+/**
+* recv video, audio, video and video, interlaced in chunks.
+*/
+VOID TEST(ProtocolStackTest, ProtocolRecvVAVVMessage)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x04,
+ 0x00, 0x00, 0x15, // timestamp
+ 0x00, 0x00, 0x90, // length, 144
+ 0x08, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x20, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC4, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x30, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x10, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_audio());
+ EXPECT_EQ(0x15, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x20, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x30, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+}
+
+/**
+* recv video, audio, video and video, interlaced in chunks.
+* the continue chunks use fmt=1 header
+*/
+VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt1)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ /**
+ * parse the message header.
+ * 3bytes: timestamp delta, fmt=0,1,2
+ * 3bytes: payload length, fmt=0,1
+ * 1bytes: message type, fmt=0,1
+ * 4bytes: stream id, fmt=0
+ * where:
+ * fmt=0, 0x0X
+ * fmt=1, 0x4X
+ * fmt=2, 0x8X
+ * fmt=3, 0xCX
+ */
+
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x04,
+ 0x00, 0x00, 0x15, // timestamp
+ 0x00, 0x00, 0x90, // length, 144
+ 0x08, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x43,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC4, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x43,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x10, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_audio());
+ EXPECT_EQ(0x15, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x20, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x30, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+}
+
+/**
+* recv video, audio, video and video, interlaced in chunks.
+* the continue chunks use fmt=2 header
+*/
+VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt2)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ /**
+ * parse the message header.
+ * 3bytes: timestamp delta, fmt=0,1,2
+ * 3bytes: payload length, fmt=0,1
+ * 1bytes: message type, fmt=0,1
+ * 4bytes: stream id, fmt=0
+ * where:
+ * fmt=0, 0x0X
+ * fmt=1, 0x4X
+ * fmt=2, 0x8X
+ * fmt=3, 0xCX
+ */
+
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x04,
+ 0x00, 0x00, 0x15, // timestamp
+ 0x00, 0x00, 0x90, // length, 144
+ 0x08, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x83,
+ 0x00, 0x00, 0x10, // timestamp
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC4, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x83,
+ 0x00, 0x00, 0x10, // timestamp
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x10, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_audio());
+ EXPECT_EQ(0x15, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x20, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x30, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+}
+
+/**
+* recv video, audio, video and video, interlaced in chunks.
+* the continue chunks use fmt=3 header
+*/
+VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt3)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ /**
+ * parse the message header.
+ * 3bytes: timestamp delta, fmt=0,1,2
+ * 3bytes: payload length, fmt=0,1
+ * 1bytes: message type, fmt=0,1
+ * 4bytes: stream id, fmt=0
+ * where:
+ * fmt=0, 0x0X
+ * fmt=1, 0x4X
+ * fmt=2, 0x8X
+ * fmt=3, 0xCX
+ */
+
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x04,
+ 0x00, 0x00, 0x15, // timestamp
+ 0x00, 0x00, 0x90, // length, 144
+ 0x08, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0xC3,
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC4, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0xC3,
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x10, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_audio());
+ EXPECT_EQ(0x15, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x20, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x30, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+}
+
+/**
+* recv video, audio, video and video, interlaced in chunks.
+* the continue chunks use fmt=1, last video with fmt=1 header
+*/
+VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ /**
+ * parse the message header.
+ * 3bytes: timestamp delta, fmt=0,1,2
+ * 3bytes: payload length, fmt=0,1
+ * 1bytes: message type, fmt=0,1
+ * 4bytes: stream id, fmt=0
+ * where:
+ * fmt=0, 0x0X
+ * fmt=1, 0x4X
+ * fmt=2, 0x8X
+ * fmt=3, 0xCX
+ */
+
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x04,
+ 0x00, 0x00, 0x15, // timestamp
+ 0x00, 0x00, 0x90, // length, 144
+ 0x08, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x43,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC4, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x43,
+ 0x00, 0x00, 0x20, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x10, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_audio());
+ EXPECT_EQ(0x15, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x20, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x40, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+}
+
+/**
+* recv video, audio, video and video, interlaced in chunks.
+* the continue chunks use fmt=1, last video with fmt=1 header,
+* last video changed length
+*/
+VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt11Length)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ /**
+ * parse the message header.
+ * 3bytes: timestamp delta, fmt=0,1,2
+ * 3bytes: payload length, fmt=0,1
+ * 1bytes: message type, fmt=0,1
+ * 4bytes: stream id, fmt=0
+ * where:
+ * fmt=0, 0x0X
+ * fmt=1, 0x4X
+ * fmt=2, 0x8X
+ * fmt=3, 0xCX
+ */
+
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x04,
+ 0x00, 0x00, 0x15, // timestamp
+ 0x00, 0x00, 0x90, // length, 144
+ 0x08, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x43,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x20, // length, 288
+ 0x09, // message_type
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC4, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x43,
+ 0x00, 0x00, 0x20, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x10, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_audio());
+ EXPECT_EQ(0x15, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x20, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x40, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+}
+
+/**
+* recv video, audio, video and video, interlaced in chunks.
+* the continue chunks use fmt=1, last video with fmt=2 header
+*/
+VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ /**
+ * parse the message header.
+ * 3bytes: timestamp delta, fmt=0,1,2
+ * 3bytes: payload length, fmt=0,1
+ * 1bytes: message type, fmt=0,1
+ * 4bytes: stream id, fmt=0
+ * where:
+ * fmt=0, 0x0X
+ * fmt=1, 0x4X
+ * fmt=2, 0x8X
+ * fmt=3, 0xCX
+ */
+
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x04,
+ 0x00, 0x00, 0x15, // timestamp
+ 0x00, 0x00, 0x90, // length, 144
+ 0x08, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x43,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC4, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x83,
+ 0x00, 0x00, 0x20, // timestamp
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x10, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_audio());
+ EXPECT_EQ(0x15, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x20, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x40, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+}
+
+/**
+* recv video, audio, video and video, interlaced in chunks.
+* the continue chunks use fmt=1, last video with fmt=2 header,
+* last video changed length
+*/
+VOID TEST(ProtocolStackTest, ProtocolRecvVAVVFmt12Length)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ /**
+ * parse the message header.
+ * 3bytes: timestamp delta, fmt=0,1,2
+ * 3bytes: payload length, fmt=0,1
+ * 1bytes: message type, fmt=0,1
+ * 4bytes: stream id, fmt=0
+ * where:
+ * fmt=0, 0x0X
+ * fmt=1, 0x4X
+ * fmt=2, 0x8X
+ * fmt=3, 0xCX
+ */
+
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x04,
+ 0x00, 0x00, 0x15, // timestamp
+ 0x00, 0x00, 0x90, // length, 144
+ 0x08, // message_type
+ 0x01, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x43,
+ 0x00, 0x00, 0x10, // timestamp
+ 0x00, 0x01, 0x20, // length, 288
+ 0x09, // message_type
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // audio message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC4, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#1
+ if (true) {
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x83,
+ 0x00, 0x00, 0x20, // timestamp
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#2
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+ // video message, chunk#3
+ if (true) {
+ uint8_t data[] = {
+ 0xC3, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+ }
+
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x10, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ EXPECT_EQ(0x110, msg->header.payload_length);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_audio());
+ EXPECT_EQ(0x15, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x20, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ EXPECT_EQ(0x120, msg->header.payload_length);
+ }
+ if (true) {
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x40, msg->header.timestamp);
+ EXPECT_EQ(0x01, msg->header.stream_id);
+ EXPECT_EQ(0x120, msg->header.payload_length);
+ }
+}
+
+/**
+* recv video, with extended timestamp.
+* small timestamp < 0xffffff
+*/
+VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ /**
+ * parse the message header.
+ * 3bytes: timestamp delta, fmt=0,1,2
+ * 3bytes: payload length, fmt=0,1
+ * 1bytes: message type, fmt=0,1
+ * 4bytes: stream id, fmt=0
+ * where:
+ * fmt=0, 0x0X
+ * fmt=1, 0x4X
+ * fmt=2, 0x8X
+ * fmt=3, 0xCX
+ */
+
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0xff, 0xff, 0xff, // timestamp
+ 0x00, 0x00, 0x04, // length
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ 0x00, 0x00, 0x00, 0x10, // extended timestamp
+ // msg payload start
+ 0x00, 0x00, 0x07, 0x63
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x10, msg->header.timestamp);
+}
+
+/**
+* recv video, with extended timestamp.
+* big timestamp > 0xffffff
+*/
+VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage2)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ /**
+ * parse the message header.
+ * 3bytes: timestamp delta, fmt=0,1,2
+ * 3bytes: payload length, fmt=0,1
+ * 1bytes: message type, fmt=0,1
+ * 4bytes: stream id, fmt=0
+ * where:
+ * fmt=0, 0x0X
+ * fmt=1, 0x4X
+ * fmt=2, 0x8X
+ * fmt=3, 0xCX
+ */
+
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0xff, 0xff, 0xff, // timestamp
+ 0x00, 0x00, 0x04, // length
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ 0x7f, 0x01, 0x02, 0x03, // extended timestamp
+ // msg payload start
+ 0x00, 0x00, 0x07, 0x63
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ EXPECT_EQ(0x7f010203, msg->header.timestamp);
+}
+
+/**
+* recv video, with extended timestamp.
+* always use 31bits timestamp.
+*/
+// always use 31bits timestamp, for some server may use 32bits extended timestamp.
+VOID TEST(ProtocolStackTest, ProtocolRecvExtTimeMessage3)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ /**
+ * parse the message header.
+ * 3bytes: timestamp delta, fmt=0,1,2
+ * 3bytes: payload length, fmt=0,1
+ * 1bytes: message type, fmt=0,1
+ * 4bytes: stream id, fmt=0
+ * where:
+ * fmt=0, 0x0X
+ * fmt=1, 0x4X
+ * fmt=2, 0x8X
+ * fmt=3, 0xCX
+ */
+
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0xff, 0xff, 0xff, // timestamp
+ 0x00, 0x00, 0x04, // length
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ 0xff, 0x01, 0x02, 0x03, // extended timestamp
+ // msg payload start
+ 0x00, 0x00, 0x07, 0x63
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ // always use 31bits timestamp
+ EXPECT_EQ(0x7f010203, msg->header.timestamp);
+}
+
+/**
+* recv video, with extended timestamp, in 2 chunks packet.
+* always send extended timestamp in 0xCX chunk packets.
+*/
+/**
+* RTMP specification and ffmpeg/librtmp is false,
+* but, adobe changed the specification, so flash/FMLE/FMS always true.
+* default to true to support flash/FMLE/FMS.
+*
+* ffmpeg/librtmp may donot send this filed, need to detect the value.
+* @see also: http://blog.csdn.net/win_lin/article/details/13363699
+* compare to the chunk timestamp, which is set by chunk message header
+* type 0,1 or 2.
+*
+* @remark, nginx send the extended-timestamp in sequence-header,
+* and timestamp delta in continue C1 chunks, and so compatible with ffmpeg,
+* that is, there is no continue chunks and extended-timestamp in nginx-rtmp.
+*
+* @remark, srs always send the extended-timestamp, to keep simple,
+* and compatible with adobe products.
+*/
+VOID TEST(ProtocolStackTest, ProtocolRecvVExtTime2Trunk)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ // video message
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0xff, 0xff, 0xff, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ 0x00, 0x01, 0x02, 0x03, // extended timestamp
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ // chunk #2
+ 0xC3,
+ 0x00, 0x01, 0x02, 0x03, // extended timestamp
+ /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // chunk #2
+ 0xC3,
+ 0x00, 0x01, 0x02, 0x03, // extended timestamp
+ /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ // 0xCX with extended timestamp.
+ EXPECT_EQ(0x00010203, msg->header.timestamp);
+}
+
+/**
+* recv video, with extended timestamp, in 2 chunks packet.
+* never send extended timestamp in 0xCX chunk packets.
+*/
+// FFMPEG/librtmp, RTMP specification standard protocol.
+VOID TEST(ProtocolStackTest, ProtocolRecvVExtTime2Trunk2)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ // video message
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x03,
+ 0xff, 0xff, 0xff, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ 0x00, 0x01, 0x02, 0x03, // extended timestamp
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ // chunk #2
+ 0xC3,
+ /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // chunk #2
+ 0xC3,
+ /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ // 0xCX without extended timestamp.
+ EXPECT_EQ(0x00010203, msg->header.timestamp);
+}
+
+/**
+* a video message, in 2 chunks packet.
+* use 1B chunk header, min chunk id is 2.
+*/
+VOID TEST(ProtocolStackTest, ProtocolRecvVCid1BMin)
+{
+ MockBufferIO bio;
+ SrsProtocol proto(&bio);
+
+ // video message
+ uint8_t data[] = {
+ // 12bytes header, 1byts chunk header, 11bytes msg heder
+ 0x02,
+ 0x00, 0x00, 0x00, // timestamp
+ 0x00, 0x01, 0x10, // length, 272
+ 0x09, // message_type
+ 0x00, 0x00, 0x00, 0x00, // stream_id
+ // msg payload start
+ 0x02, 0x00, 0x07, 0x63,
+ 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x03, 0x61, 0x70, 0x70, 0x02, 0x00, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x00, 0x08, 0x66, 0x6c,
+ 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x57, 0x49, 0x4e, 0x20, 0x31, 0x32, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2c, 0x34, 0x31, 0x00, 0x06, 0x73, 0x77, 0x66, 0x55, 0x72, 0x6c, 0x02, 0x00,
+ 0x51, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x73, 0x73, 0x72,
+ 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x35, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65,
+ 0x72, 0x73, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65,
+ 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2f, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x6c,
+ // chunk #2
+ 0xC2, /*next chunk.*/ 0x61, 0x79, 0x65, 0x72,
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e,
+ 0x32, 0x33, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, 0x02, 0x00, 0x14, 0x72, 0x74, 0x6d, 0x70,
+ 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x76, 0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x6c, 0x69, 0x76, 0x65,
+ 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x6d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xab, 0xee,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65,
+ 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ // chunk #2
+ 0xC2, /*next chunk.*/
+ 0x2e, 0x73, 0x77, 0x66, 0x3f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x31, 0x2e
+ };
+ bio.in_buffer.append((char*)data, sizeof(data));
+
+ SrsCommonMessage* msg = NULL;
+ ASSERT_TRUE(ERROR_SUCCESS == proto.recv_message(&msg));
+ SrsAutoFree(SrsCommonMessage, msg);
+ EXPECT_TRUE(msg->header.is_video());
+ // 1B cid(6bits), min is 2
+ EXPECT_EQ(0x02, msg->header.perfer_cid);
+}
+
+VOID TEST(ProtocolKbpsTest, Connections)
+{
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+
+ SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
+ SrsAutoFree(SrsKbps, kbps);
+
+ SrsNetworkDelta* delta = new SrsNetworkDelta();
+ SrsAutoFree(SrsNetworkDelta, delta);
+ delta->set_io(io, io);
+
+ // No data, 0kbps.
+ kbps->add_delta(delta);
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 30s.
+ clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_in(30 * 100 * 1000)->set_out(30 * 100 * 1000);
+ kbps->add_delta(delta);
+ kbps->sample();
+
+ EXPECT_EQ(800, kbps->get_recv_kbps());
+ EXPECT_EQ(800, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(800, kbps->get_send_kbps());
+ EXPECT_EQ(800, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 300s.
+ clock->set_clock(330 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_in(330 * 100 * 1000)->set_out(330 * 100 * 1000);
+ kbps->add_delta(delta);
+ kbps->sample();
+
+ EXPECT_EQ(800, kbps->get_recv_kbps());
+ EXPECT_EQ(800, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(800, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(800, kbps->get_send_kbps());
+ EXPECT_EQ(800, kbps->get_send_kbps_30s());
+ EXPECT_EQ(800, kbps->get_send_kbps_5m());
+ }
+
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+
+ SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
+ SrsAutoFree(SrsKbps, kbps);
+
+ SrsNetworkDelta* delta = new SrsNetworkDelta();
+ SrsAutoFree(SrsNetworkDelta, delta);
+ delta->set_io(io, io);
+
+ // No data, 0kbps.
+ kbps->add_delta(delta);
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 30s.
+ clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_in(30 * 100 * 1000);
+ kbps->add_delta(delta);
+ kbps->sample();
+
+ EXPECT_EQ(800, kbps->get_recv_kbps());
+ EXPECT_EQ(800, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 300s.
+ clock->set_clock(330 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_in(330 * 100 * 1000);
+ kbps->add_delta(delta);
+ kbps->sample();
+
+ EXPECT_EQ(800, kbps->get_recv_kbps());
+ EXPECT_EQ(800, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(800, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+ }
+
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+
+ SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
+ SrsAutoFree(SrsKbps, kbps);
+
+ SrsNetworkDelta* delta = new SrsNetworkDelta();
+ SrsAutoFree(SrsNetworkDelta, delta);
+ delta->set_io(io, io);
+
+ // No data, 0kbps.
+ kbps->add_delta(delta);
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 30s.
+ clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_out(30 * 100 * 1000);
+ kbps->add_delta(delta);
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(800, kbps->get_send_kbps());
+ EXPECT_EQ(800, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 300s.
+ clock->set_clock(330 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_out(330 * 100 * 1000);
+ kbps->add_delta(delta);
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(800, kbps->get_send_kbps());
+ EXPECT_EQ(800, kbps->get_send_kbps_30s());
+ EXPECT_EQ(800, kbps->get_send_kbps_5m());
+ }
+}
+
+VOID TEST(ProtocolKbpsTest, Delta)
+{
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+
+ SrsNetworkDelta* delta = new SrsNetworkDelta();
+ SrsAutoFree(SrsNetworkDelta, delta);
+ delta->set_io(io, io);
+
+ // No data.
+ int64_t in, out;
+ delta->remark(&in, &out);
+ EXPECT_EQ(0, in);
+ EXPECT_EQ(0, out);
+
+ // 800kb.
+ io->set_in(100 * 1000)->set_out(100 * 1000);
+ delta->remark(&in, &out);
+ EXPECT_EQ(100 * 1000, in);
+ EXPECT_EQ(100 * 1000, out);
+
+ // No data.
+ delta->remark(&in, &out);
+ EXPECT_EQ(0, in);
+ EXPECT_EQ(0, out);
+ }
+
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+
+ SrsNetworkDelta* delta = new SrsNetworkDelta();
+ SrsAutoFree(SrsNetworkDelta, delta);
+ delta->set_io(io, io);
+
+ // No data.
+ int64_t in, out;
+ delta->remark(&in, &out);
+ EXPECT_EQ(0, in);
+ EXPECT_EQ(0, out);
+
+ // 800kb.
+ io->set_in(100 * 1000)->set_out(100 * 1000);
+ delta->remark(&in, &out);
+ EXPECT_EQ(100 * 1000, in);
+ EXPECT_EQ(100 * 1000, out);
+
+ // Kbps without io, gather delta.
+ SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
+ SrsAutoFree(SrsKbps, kbps);
+
+ // No data, 0kbps.
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 30s.
+ clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
+ kbps->add_delta(30 * in, 30 * out);
+ kbps->sample();
+
+ EXPECT_EQ(800, kbps->get_recv_kbps());
+ EXPECT_EQ(800, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(800, kbps->get_send_kbps());
+ EXPECT_EQ(800, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+ }
+}
+
+VOID TEST(ProtocolKbpsTest, RAWStatistic)
+{
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+
+ SrsNetworkDelta* delta = new SrsNetworkDelta();
+ SrsAutoFree(SrsNetworkDelta, delta);
+ delta->set_io(io, io);
+
+ SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
+ SrsAutoFree(SrsKbps, kbps);
+
+ // No data, 0kbps.
+ kbps->add_delta(delta);
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 30s.
+ clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_out(30 * 100 * 1000);
+ kbps->add_delta(delta);
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(800, kbps->get_send_kbps());
+ EXPECT_EQ(800, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+ }
+
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+
+ SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
+ SrsAutoFree(SrsKbps, kbps);
+
+ // No io, no data.
+ EXPECT_EQ(0, kbps->get_recv_bytes());
+ EXPECT_EQ(0, kbps->get_send_bytes());
+
+ // With io, zero data.
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+
+ SrsNetworkDelta* delta = new SrsNetworkDelta();
+ SrsAutoFree(SrsNetworkDelta, delta);
+ delta->set_io(io, io);
+
+ kbps->add_delta(delta);
+ kbps->sample();
+ EXPECT_EQ(0, kbps->get_recv_bytes());
+ EXPECT_EQ(0, kbps->get_send_bytes());
+
+ // With io with data.
+ io->set_in(100 * 1000)->set_out(100 * 1000);
+ kbps->add_delta(delta);
+ kbps->sample();
+ EXPECT_EQ(100 * 1000, kbps->get_recv_bytes());
+ EXPECT_EQ(100 * 1000, kbps->get_send_bytes());
+
+ // No io, cached data.
+ delta->set_io(NULL, NULL);
+ kbps->add_delta(delta);
+ kbps->sample();
+ EXPECT_EQ(100 * 1000, kbps->get_recv_bytes());
+ EXPECT_EQ(100 * 1000, kbps->get_send_bytes());
+
+ // Use the same IO, but as a fresh io.
+ delta->set_io(io, io);
+ kbps->add_delta(delta);
+ kbps->sample();
+ EXPECT_EQ(200 * 1000, kbps->get_recv_bytes());
+ EXPECT_EQ(200 * 1000, kbps->get_send_bytes());
+
+ io->set_in(150 * 1000)->set_out(150 * 1000);
+ kbps->add_delta(delta);
+ kbps->sample();
+ EXPECT_EQ(250 * 1000, kbps->get_recv_bytes());
+ EXPECT_EQ(250 * 1000, kbps->get_send_bytes());
+
+ // No io, cached data.
+ delta->set_io(NULL, NULL);
+ kbps->add_delta(delta);
+ kbps->sample();
+ EXPECT_EQ(250 * 1000, kbps->get_recv_bytes());
+ EXPECT_EQ(250 * 1000, kbps->get_send_bytes());
+ }
+}
+
+VOID TEST(ProtocolKbpsTest, WriteLargeIOVs)
+{
+ srs_error_t err;
+
+ if (true) {
+ iovec iovs[1];
+ iovs[0].iov_base = (char*)"Hello";
+ iovs[0].iov_len = 5;
+
+ MockBufferIO io;
+ ssize_t nn = 0;
+ HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, 1, &nn));
+ EXPECT_EQ(5, nn);
+ EXPECT_EQ(5, io.sbytes);
+ }
+
+ if (true) {
+ iovec iovs[1024];
+ int nn_iovs = (int)(sizeof(iovs)/sizeof(iovec));
+ for (int i = 0; i < nn_iovs; i++) {
+ iovs[i].iov_base = (char*)"Hello";
+ iovs[i].iov_len = 5;
+ }
+
+ MockBufferIO io;
+ ssize_t nn = 0;
+ HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, nn_iovs, &nn));
+ EXPECT_EQ(5 * nn_iovs, nn);
+ EXPECT_EQ(5 * nn_iovs, io.sbytes);
+ }
+
+ if (true) {
+ iovec iovs[1025];
+ int nn_iovs = (int)(sizeof(iovs)/sizeof(iovec));
+ for (int i = 0; i < nn_iovs; i++) {
+ iovs[i].iov_base = (char*)"Hello";
+ iovs[i].iov_len = 5;
+ }
+
+ MockBufferIO io;
+ ssize_t nn = 0;
+ HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, nn_iovs, &nn));
+ EXPECT_EQ(5 * nn_iovs, nn);
+ EXPECT_EQ(5 * nn_iovs, io.sbytes);
+ }
+
+ if (true) {
+ iovec iovs[4096];
+ int nn_iovs = (int)(sizeof(iovs)/sizeof(iovec));
+ for (int i = 0; i < nn_iovs; i++) {
+ iovs[i].iov_base = (char*)"Hello";
+ iovs[i].iov_len = 5;
+ }
+
+ MockBufferIO io;
+ ssize_t nn = 0;
+ HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, nn_iovs, &nn));
+ EXPECT_EQ(5 * nn_iovs, nn);
+ EXPECT_EQ(5 * nn_iovs, io.sbytes);
+ }
+}
+
+VOID TEST(ProtocolKbpsTest, ConnectionsSugar)
+{
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+
+ SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
+ SrsAutoFree(SrsNetworkKbps, kbps);
+ kbps->set_io(io, io);
+
+ // No data, 0kbps.
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 30s.
+ clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_in(30 * 100 * 1000)->set_out(30 * 100 * 1000);
+ kbps->sample();
+
+ EXPECT_EQ(800, kbps->get_recv_kbps());
+ EXPECT_EQ(800, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(800, kbps->get_send_kbps());
+ EXPECT_EQ(800, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 300s.
+ clock->set_clock(330 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_in(330 * 100 * 1000)->set_out(330 * 100 * 1000);
+ kbps->sample();
+
+ EXPECT_EQ(800, kbps->get_recv_kbps());
+ EXPECT_EQ(800, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(800, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(800, kbps->get_send_kbps());
+ EXPECT_EQ(800, kbps->get_send_kbps_30s());
+ EXPECT_EQ(800, kbps->get_send_kbps_5m());
+ }
+
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+
+ SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
+ SrsAutoFree(SrsNetworkKbps, kbps);
+ kbps->set_io(io, io);
+
+ // No data, 0kbps.
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 30s.
+ clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_in(30 * 100 * 1000);
+ kbps->sample();
+
+ EXPECT_EQ(800, kbps->get_recv_kbps());
+ EXPECT_EQ(800, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 300s.
+ clock->set_clock(330 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_in(330 * 100 * 1000);
+ kbps->sample();
+
+ EXPECT_EQ(800, kbps->get_recv_kbps());
+ EXPECT_EQ(800, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(800, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+ }
+
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+
+ SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
+ SrsAutoFree(SrsNetworkKbps, kbps);
+ kbps->set_io(io, io);
+
+ // No data, 0kbps.
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 30s.
+ clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_out(30 * 100 * 1000);
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(800, kbps->get_send_kbps());
+ EXPECT_EQ(800, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 300s.
+ clock->set_clock(330 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_out(330 * 100 * 1000);
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(800, kbps->get_send_kbps());
+ EXPECT_EQ(800, kbps->get_send_kbps_30s());
+ EXPECT_EQ(800, kbps->get_send_kbps_5m());
+ }
+}
+
+VOID TEST(ProtocolKbpsTest, DeltaSugar)
+{
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+
+ // Kbps without io, gather delta.
+ SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
+ SrsAutoFree(SrsNetworkKbps, kbps);
+ kbps->set_io(io, io);
+
+ // No data, 0kbps.
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 30s.
+ clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_in(30 * 100 * 1000)->set_out(30 * 100 * 1000);
+ kbps->sample();
+
+ EXPECT_EQ(800, kbps->get_recv_kbps());
+ EXPECT_EQ(800, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(800, kbps->get_send_kbps());
+ EXPECT_EQ(800, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+ }
+}
+
+VOID TEST(ProtocolKbpsTest, RAWStatisticSugar)
+{
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+
+ SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
+ SrsAutoFree(SrsNetworkKbps, kbps);
+ kbps->set_io(io, io);
+
+ // No data, 0kbps.
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(0, kbps->get_send_kbps());
+ EXPECT_EQ(0, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+
+ // 800kbps in 30s.
+ clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
+ io->set_out(30 * 100 * 1000);
+ kbps->sample();
+
+ EXPECT_EQ(0, kbps->get_recv_kbps());
+ EXPECT_EQ(0, kbps->get_recv_kbps_30s());
+ EXPECT_EQ(0, kbps->get_recv_kbps_5m());
+
+ EXPECT_EQ(800, kbps->get_send_kbps());
+ EXPECT_EQ(800, kbps->get_send_kbps_30s());
+ EXPECT_EQ(0, kbps->get_send_kbps_5m());
+ }
+
+ if (true) {
+ MockWallClock* clock = new MockWallClock();
+ SrsAutoFree(MockWallClock, clock);
+
+ SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
+ SrsAutoFree(SrsNetworkKbps, kbps);
+
+ // No io, no data.
+ EXPECT_EQ(0, kbps->get_recv_bytes());
+ EXPECT_EQ(0, kbps->get_send_bytes());
+
+ // With io, zero data.
+ MockStatistic* io = new MockStatistic();
+ SrsAutoFree(MockStatistic, io);
+ kbps->set_io(io, io);
+
+ kbps->sample();
+ EXPECT_EQ(0, kbps->get_recv_bytes());
+ EXPECT_EQ(0, kbps->get_send_bytes());
+
+ // With io with data.
+ io->set_in(100 * 1000)->set_out(100 * 1000);
+ kbps->sample();
+ EXPECT_EQ(100 * 1000, kbps->get_recv_bytes());
+ EXPECT_EQ(100 * 1000, kbps->get_send_bytes());
+
+ // No io, cached data.
+ kbps->set_io(NULL, NULL);
+ kbps->sample();
+ EXPECT_EQ(100 * 1000, kbps->get_recv_bytes());
+ EXPECT_EQ(100 * 1000, kbps->get_send_bytes());
+
+ // Use the same IO, but as a fresh io.
+ kbps->set_io(io, io);
+ kbps->sample();
+ EXPECT_EQ(200 * 1000, kbps->get_recv_bytes());
+ EXPECT_EQ(200 * 1000, kbps->get_send_bytes());
+
+ io->set_in(150 * 1000)->set_out(150 * 1000);
+ kbps->sample();
+ EXPECT_EQ(250 * 1000, kbps->get_recv_bytes());
+ EXPECT_EQ(250 * 1000, kbps->get_send_bytes());
+
+ // No io, cached data.
+ kbps->set_io(NULL, NULL);
+ kbps->sample();
+ EXPECT_EQ(250 * 1000, kbps->get_recv_bytes());
+ EXPECT_EQ(250 * 1000, kbps->get_send_bytes());
+ }
+}
+
diff --git a/trunk/src/utest/srs_utest_protocol2.cpp b/trunk/src/utest/srs_utest_protocol2.cpp
deleted file mode 100644
index c1bca05ed..000000000
--- a/trunk/src/utest/srs_utest_protocol2.cpp
+++ /dev/null
@@ -1,707 +0,0 @@
-//
-// Copyright (c) 2013-2022 The SRS Authors
-//
-// SPDX-License-Identifier: MIT or MulanPSL-2.0
-//
-#include
-
-using namespace std;
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-VOID TEST(ProtocolKbpsTest, Connections)
-{
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
-
- SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
- SrsAutoFree(SrsKbps, kbps);
-
- SrsNetworkDelta* delta = new SrsNetworkDelta();
- SrsAutoFree(SrsNetworkDelta, delta);
- delta->set_io(io, io);
-
- // No data, 0kbps.
- kbps->add_delta(delta);
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 30s.
- clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_in(30 * 100 * 1000)->set_out(30 * 100 * 1000);
- kbps->add_delta(delta);
- kbps->sample();
-
- EXPECT_EQ(800, kbps->get_recv_kbps());
- EXPECT_EQ(800, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(800, kbps->get_send_kbps());
- EXPECT_EQ(800, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 300s.
- clock->set_clock(330 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_in(330 * 100 * 1000)->set_out(330 * 100 * 1000);
- kbps->add_delta(delta);
- kbps->sample();
-
- EXPECT_EQ(800, kbps->get_recv_kbps());
- EXPECT_EQ(800, kbps->get_recv_kbps_30s());
- EXPECT_EQ(800, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(800, kbps->get_send_kbps());
- EXPECT_EQ(800, kbps->get_send_kbps_30s());
- EXPECT_EQ(800, kbps->get_send_kbps_5m());
- }
-
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
-
- SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
- SrsAutoFree(SrsKbps, kbps);
-
- SrsNetworkDelta* delta = new SrsNetworkDelta();
- SrsAutoFree(SrsNetworkDelta, delta);
- delta->set_io(io, io);
-
- // No data, 0kbps.
- kbps->add_delta(delta);
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 30s.
- clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_in(30 * 100 * 1000);
- kbps->add_delta(delta);
- kbps->sample();
-
- EXPECT_EQ(800, kbps->get_recv_kbps());
- EXPECT_EQ(800, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 300s.
- clock->set_clock(330 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_in(330 * 100 * 1000);
- kbps->add_delta(delta);
- kbps->sample();
-
- EXPECT_EQ(800, kbps->get_recv_kbps());
- EXPECT_EQ(800, kbps->get_recv_kbps_30s());
- EXPECT_EQ(800, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
- }
-
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
-
- SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
- SrsAutoFree(SrsKbps, kbps);
-
- SrsNetworkDelta* delta = new SrsNetworkDelta();
- SrsAutoFree(SrsNetworkDelta, delta);
- delta->set_io(io, io);
-
- // No data, 0kbps.
- kbps->add_delta(delta);
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 30s.
- clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_out(30 * 100 * 1000);
- kbps->add_delta(delta);
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(800, kbps->get_send_kbps());
- EXPECT_EQ(800, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 300s.
- clock->set_clock(330 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_out(330 * 100 * 1000);
- kbps->add_delta(delta);
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(800, kbps->get_send_kbps());
- EXPECT_EQ(800, kbps->get_send_kbps_30s());
- EXPECT_EQ(800, kbps->get_send_kbps_5m());
- }
-}
-
-VOID TEST(ProtocolKbpsTest, Delta)
-{
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
-
- SrsNetworkDelta* delta = new SrsNetworkDelta();
- SrsAutoFree(SrsNetworkDelta, delta);
- delta->set_io(io, io);
-
- // No data.
- int64_t in, out;
- delta->remark(&in, &out);
- EXPECT_EQ(0, in);
- EXPECT_EQ(0, out);
-
- // 800kb.
- io->set_in(100 * 1000)->set_out(100 * 1000);
- delta->remark(&in, &out);
- EXPECT_EQ(100 * 1000, in);
- EXPECT_EQ(100 * 1000, out);
-
- // No data.
- delta->remark(&in, &out);
- EXPECT_EQ(0, in);
- EXPECT_EQ(0, out);
- }
-
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
-
- SrsNetworkDelta* delta = new SrsNetworkDelta();
- SrsAutoFree(SrsNetworkDelta, delta);
- delta->set_io(io, io);
-
- // No data.
- int64_t in, out;
- delta->remark(&in, &out);
- EXPECT_EQ(0, in);
- EXPECT_EQ(0, out);
-
- // 800kb.
- io->set_in(100 * 1000)->set_out(100 * 1000);
- delta->remark(&in, &out);
- EXPECT_EQ(100 * 1000, in);
- EXPECT_EQ(100 * 1000, out);
-
- // Kbps without io, gather delta.
- SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
- SrsAutoFree(SrsKbps, kbps);
-
- // No data, 0kbps.
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 30s.
- clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
- kbps->add_delta(30 * in, 30 * out);
- kbps->sample();
-
- EXPECT_EQ(800, kbps->get_recv_kbps());
- EXPECT_EQ(800, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(800, kbps->get_send_kbps());
- EXPECT_EQ(800, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
- }
-}
-
-VOID TEST(ProtocolKbpsTest, RAWStatistic)
-{
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
-
- SrsNetworkDelta* delta = new SrsNetworkDelta();
- SrsAutoFree(SrsNetworkDelta, delta);
- delta->set_io(io, io);
-
- SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
- SrsAutoFree(SrsKbps, kbps);
-
- // No data, 0kbps.
- kbps->add_delta(delta);
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 30s.
- clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_out(30 * 100 * 1000);
- kbps->add_delta(delta);
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(800, kbps->get_send_kbps());
- EXPECT_EQ(800, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
- }
-
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
-
- SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
- SrsAutoFree(SrsKbps, kbps);
-
- // No io, no data.
- EXPECT_EQ(0, kbps->get_recv_bytes());
- EXPECT_EQ(0, kbps->get_send_bytes());
-
- // With io, zero data.
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
-
- SrsNetworkDelta* delta = new SrsNetworkDelta();
- SrsAutoFree(SrsNetworkDelta, delta);
- delta->set_io(io, io);
-
- kbps->add_delta(delta);
- kbps->sample();
- EXPECT_EQ(0, kbps->get_recv_bytes());
- EXPECT_EQ(0, kbps->get_send_bytes());
-
- // With io with data.
- io->set_in(100 * 1000)->set_out(100 * 1000);
- kbps->add_delta(delta);
- kbps->sample();
- EXPECT_EQ(100 * 1000, kbps->get_recv_bytes());
- EXPECT_EQ(100 * 1000, kbps->get_send_bytes());
-
- // No io, cached data.
- delta->set_io(NULL, NULL);
- kbps->add_delta(delta);
- kbps->sample();
- EXPECT_EQ(100 * 1000, kbps->get_recv_bytes());
- EXPECT_EQ(100 * 1000, kbps->get_send_bytes());
-
- // Use the same IO, but as a fresh io.
- delta->set_io(io, io);
- kbps->add_delta(delta);
- kbps->sample();
- EXPECT_EQ(200 * 1000, kbps->get_recv_bytes());
- EXPECT_EQ(200 * 1000, kbps->get_send_bytes());
-
- io->set_in(150 * 1000)->set_out(150 * 1000);
- kbps->add_delta(delta);
- kbps->sample();
- EXPECT_EQ(250 * 1000, kbps->get_recv_bytes());
- EXPECT_EQ(250 * 1000, kbps->get_send_bytes());
-
- // No io, cached data.
- delta->set_io(NULL, NULL);
- kbps->add_delta(delta);
- kbps->sample();
- EXPECT_EQ(250 * 1000, kbps->get_recv_bytes());
- EXPECT_EQ(250 * 1000, kbps->get_send_bytes());
- }
-}
-
-VOID TEST(ProtocolKbpsTest, WriteLargeIOVs)
-{
- srs_error_t err;
-
- if (true) {
- iovec iovs[1];
- iovs[0].iov_base = (char*)"Hello";
- iovs[0].iov_len = 5;
-
- MockBufferIO io;
- ssize_t nn = 0;
- HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, 1, &nn));
- EXPECT_EQ(5, nn);
- EXPECT_EQ(5, io.sbytes);
- }
-
- if (true) {
- iovec iovs[1024];
- int nn_iovs = (int)(sizeof(iovs)/sizeof(iovec));
- for (int i = 0; i < nn_iovs; i++) {
- iovs[i].iov_base = (char*)"Hello";
- iovs[i].iov_len = 5;
- }
-
- MockBufferIO io;
- ssize_t nn = 0;
- HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, nn_iovs, &nn));
- EXPECT_EQ(5 * nn_iovs, nn);
- EXPECT_EQ(5 * nn_iovs, io.sbytes);
- }
-
- if (true) {
- iovec iovs[1025];
- int nn_iovs = (int)(sizeof(iovs)/sizeof(iovec));
- for (int i = 0; i < nn_iovs; i++) {
- iovs[i].iov_base = (char*)"Hello";
- iovs[i].iov_len = 5;
- }
-
- MockBufferIO io;
- ssize_t nn = 0;
- HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, nn_iovs, &nn));
- EXPECT_EQ(5 * nn_iovs, nn);
- EXPECT_EQ(5 * nn_iovs, io.sbytes);
- }
-
- if (true) {
- iovec iovs[4096];
- int nn_iovs = (int)(sizeof(iovs)/sizeof(iovec));
- for (int i = 0; i < nn_iovs; i++) {
- iovs[i].iov_base = (char*)"Hello";
- iovs[i].iov_len = 5;
- }
-
- MockBufferIO io;
- ssize_t nn = 0;
- HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, nn_iovs, &nn));
- EXPECT_EQ(5 * nn_iovs, nn);
- EXPECT_EQ(5 * nn_iovs, io.sbytes);
- }
-}
-
-VOID TEST(ProtocolKbpsTest, ConnectionsSugar)
-{
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
-
- SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
- SrsAutoFree(SrsNetworkKbps, kbps);
- kbps->set_io(io, io);
-
- // No data, 0kbps.
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 30s.
- clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_in(30 * 100 * 1000)->set_out(30 * 100 * 1000);
- kbps->sample();
-
- EXPECT_EQ(800, kbps->get_recv_kbps());
- EXPECT_EQ(800, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(800, kbps->get_send_kbps());
- EXPECT_EQ(800, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 300s.
- clock->set_clock(330 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_in(330 * 100 * 1000)->set_out(330 * 100 * 1000);
- kbps->sample();
-
- EXPECT_EQ(800, kbps->get_recv_kbps());
- EXPECT_EQ(800, kbps->get_recv_kbps_30s());
- EXPECT_EQ(800, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(800, kbps->get_send_kbps());
- EXPECT_EQ(800, kbps->get_send_kbps_30s());
- EXPECT_EQ(800, kbps->get_send_kbps_5m());
- }
-
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
-
- SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
- SrsAutoFree(SrsNetworkKbps, kbps);
- kbps->set_io(io, io);
-
- // No data, 0kbps.
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 30s.
- clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_in(30 * 100 * 1000);
- kbps->sample();
-
- EXPECT_EQ(800, kbps->get_recv_kbps());
- EXPECT_EQ(800, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 300s.
- clock->set_clock(330 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_in(330 * 100 * 1000);
- kbps->sample();
-
- EXPECT_EQ(800, kbps->get_recv_kbps());
- EXPECT_EQ(800, kbps->get_recv_kbps_30s());
- EXPECT_EQ(800, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
- }
-
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
-
- SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
- SrsAutoFree(SrsNetworkKbps, kbps);
- kbps->set_io(io, io);
-
- // No data, 0kbps.
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 30s.
- clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_out(30 * 100 * 1000);
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(800, kbps->get_send_kbps());
- EXPECT_EQ(800, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 300s.
- clock->set_clock(330 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_out(330 * 100 * 1000);
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(800, kbps->get_send_kbps());
- EXPECT_EQ(800, kbps->get_send_kbps_30s());
- EXPECT_EQ(800, kbps->get_send_kbps_5m());
- }
-}
-
-VOID TEST(ProtocolKbpsTest, DeltaSugar)
-{
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
-
- // Kbps without io, gather delta.
- SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
- SrsAutoFree(SrsNetworkKbps, kbps);
- kbps->set_io(io, io);
-
- // No data, 0kbps.
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 30s.
- clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_in(30 * 100 * 1000)->set_out(30 * 100 * 1000);
- kbps->sample();
-
- EXPECT_EQ(800, kbps->get_recv_kbps());
- EXPECT_EQ(800, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(800, kbps->get_send_kbps());
- EXPECT_EQ(800, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
- }
-}
-
-VOID TEST(ProtocolKbpsTest, RAWStatisticSugar)
-{
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
-
- SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
- SrsAutoFree(SrsNetworkKbps, kbps);
- kbps->set_io(io, io);
-
- // No data, 0kbps.
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(0, kbps->get_send_kbps());
- EXPECT_EQ(0, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
-
- // 800kbps in 30s.
- clock->set_clock(30 * 1000 * SRS_UTIME_MILLISECONDS);
- io->set_out(30 * 100 * 1000);
- kbps->sample();
-
- EXPECT_EQ(0, kbps->get_recv_kbps());
- EXPECT_EQ(0, kbps->get_recv_kbps_30s());
- EXPECT_EQ(0, kbps->get_recv_kbps_5m());
-
- EXPECT_EQ(800, kbps->get_send_kbps());
- EXPECT_EQ(800, kbps->get_send_kbps_30s());
- EXPECT_EQ(0, kbps->get_send_kbps_5m());
- }
-
- if (true) {
- MockWallClock* clock = new MockWallClock();
- SrsAutoFree(MockWallClock, clock);
-
- SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
- SrsAutoFree(SrsNetworkKbps, kbps);
-
- // No io, no data.
- EXPECT_EQ(0, kbps->get_recv_bytes());
- EXPECT_EQ(0, kbps->get_send_bytes());
-
- // With io, zero data.
- MockStatistic* io = new MockStatistic();
- SrsAutoFree(MockStatistic, io);
- kbps->set_io(io, io);
-
- kbps->sample();
- EXPECT_EQ(0, kbps->get_recv_bytes());
- EXPECT_EQ(0, kbps->get_send_bytes());
-
- // With io with data.
- io->set_in(100 * 1000)->set_out(100 * 1000);
- kbps->sample();
- EXPECT_EQ(100 * 1000, kbps->get_recv_bytes());
- EXPECT_EQ(100 * 1000, kbps->get_send_bytes());
-
- // No io, cached data.
- kbps->set_io(NULL, NULL);
- kbps->sample();
- EXPECT_EQ(100 * 1000, kbps->get_recv_bytes());
- EXPECT_EQ(100 * 1000, kbps->get_send_bytes());
-
- // Use the same IO, but as a fresh io.
- kbps->set_io(io, io);
- kbps->sample();
- EXPECT_EQ(200 * 1000, kbps->get_recv_bytes());
- EXPECT_EQ(200 * 1000, kbps->get_send_bytes());
-
- io->set_in(150 * 1000)->set_out(150 * 1000);
- kbps->sample();
- EXPECT_EQ(250 * 1000, kbps->get_recv_bytes());
- EXPECT_EQ(250 * 1000, kbps->get_send_bytes());
-
- // No io, cached data.
- kbps->set_io(NULL, NULL);
- kbps->sample();
- EXPECT_EQ(250 * 1000, kbps->get_recv_bytes());
- EXPECT_EQ(250 * 1000, kbps->get_send_bytes());
- }
-}
-
diff --git a/trunk/src/utest/srs_utest_protocol2.hpp b/trunk/src/utest/srs_utest_protocol2.hpp
deleted file mode 100644
index 29289306e..000000000
--- a/trunk/src/utest/srs_utest_protocol2.hpp
+++ /dev/null
@@ -1,16 +0,0 @@
-//
-// Copyright (c) 2013-2022 The SRS Authors
-//
-// SPDX-License-Identifier: MIT or MulanPSL-2.0
-//
-
-#ifndef SRS_UTEST_PROTOCOL2_HPP
-#define SRS_UTEST_PROTOCOL2_HPP
-
-/*
-#include
-*/
-#include
-
-#endif
-