golanggohlsrtmpwebrtcmedia-serverobs-studiortcprtmp-proxyrtmp-serverrtprtsprtsp-proxyrtsp-relayrtsp-serversrtstreamingwebrtc-proxy
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
313 lines
10 KiB
313 lines
10 KiB
package amf0 |
|
|
|
import ( |
|
"testing" |
|
|
|
"github.com/stretchr/testify/require" |
|
) |
|
|
|
var cases = []struct { |
|
name string |
|
enc []byte |
|
dec []interface{} |
|
}{ |
|
{ |
|
"on metadata", |
|
[]byte{ |
|
0x02, 0x00, 0x0d, 0x40, 0x73, 0x65, 0x74, 0x44, |
|
0x61, 0x74, 0x61, 0x46, 0x72, 0x61, 0x6d, 0x65, |
|
0x02, 0x00, 0x0a, 0x6f, 0x6e, 0x4d, 0x65, 0x74, |
|
0x61, 0x44, 0x61, 0x74, 0x61, 0x08, 0x00, 0x00, |
|
0x00, 0x0d, 0x00, 0x08, 0x64, 0x75, 0x72, 0x61, |
|
0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x77, |
|
0x69, 0x64, 0x74, 0x68, 0x00, 0x40, 0x94, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x68, |
|
0x65, 0x69, 0x67, 0x68, 0x74, 0x00, 0x40, 0x86, |
|
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, |
|
0x76, 0x69, 0x64, 0x65, 0x6f, 0x64, 0x61, 0x74, |
|
0x61, 0x72, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, |
|
0x66, 0x72, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x74, |
|
0x65, 0x00, 0x40, 0x4d, 0xf8, 0x53, 0xe2, 0x55, |
|
0x6b, 0x28, 0x00, 0x0c, 0x76, 0x69, 0x64, 0x65, |
|
0x6f, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x69, 0x64, |
|
0x00, 0x40, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x0d, 0x61, 0x75, 0x64, 0x69, 0x6f, |
|
0x64, 0x61, 0x74, 0x61, 0x72, 0x61, 0x74, 0x65, |
|
0x00, 0x40, 0x57, 0x58, 0x90, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x0f, 0x61, 0x75, 0x64, 0x69, 0x6f, |
|
0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x61, |
|
0x74, 0x65, 0x00, 0x40, 0xe7, 0x70, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x0f, 0x61, 0x75, 0x64, |
|
0x69, 0x6f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, |
|
0x73, 0x69, 0x7a, 0x65, 0x00, 0x40, 0x30, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x73, |
|
0x74, 0x65, 0x72, 0x65, 0x6f, 0x01, 0x01, 0x00, |
|
0x0c, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x63, 0x6f, |
|
0x64, 0x65, 0x63, 0x69, 0x64, 0x00, 0x40, 0x24, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, |
|
0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x02, |
|
0x00, 0x0d, 0x4c, 0x61, 0x76, 0x66, 0x35, 0x36, |
|
0x2e, 0x33, 0x36, 0x2e, 0x31, 0x30, 0x30, 0x00, |
|
0x08, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x69, 0x7a, |
|
0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x09, |
|
}, |
|
[]interface{}{ |
|
"@setDataFrame", |
|
"onMetaData", |
|
ECMAArray{ |
|
{ |
|
Key: "duration", |
|
Value: float64(0), |
|
}, |
|
{ |
|
Key: "width", |
|
Value: float64(1280), |
|
}, |
|
{ |
|
Key: "height", |
|
Value: float64(720), |
|
}, |
|
{ |
|
Key: "videodatarate", |
|
Value: float64(0), |
|
}, |
|
{ |
|
Key: "framerate", |
|
Value: float64(59.94005994005994), |
|
}, |
|
{ |
|
Key: "videocodecid", |
|
Value: float64(7), |
|
}, |
|
{ |
|
Key: "audiodatarate", |
|
Value: float64(93.3837890625), |
|
}, |
|
{ |
|
Key: "audiosamplerate", |
|
Value: float64(48000), |
|
}, |
|
{ |
|
Key: "audiosamplesize", |
|
Value: float64(16), |
|
}, |
|
{ |
|
Key: "stereo", |
|
Value: true, |
|
}, |
|
{ |
|
Key: "audiocodecid", |
|
Value: float64(10), |
|
}, |
|
{ |
|
Key: "encoder", |
|
Value: "Lavf56.36.100", |
|
}, |
|
{ |
|
Key: "filesize", |
|
Value: float64(0), |
|
}, |
|
}, |
|
}, |
|
}, |
|
{ |
|
"connect", |
|
[]byte{ |
|
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, 0x02, 0x61, 0x70, 0x00, 0x04, |
|
0x74, 0x79, 0x70, 0x65, 0x02, 0x00, 0x0a, 0x6e, |
|
0x6f, 0x6e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, |
|
0x65, 0x00, 0x08, 0x66, 0x6c, 0x61, 0x73, 0x68, |
|
0x56, 0x65, 0x72, 0x02, 0x00, 0x24, 0x46, 0x4d, |
|
0x4c, 0x45, 0x2f, 0x33, 0x2e, 0x30, 0x20, 0x28, |
|
0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, |
|
0x6c, 0x65, 0x3b, 0x20, 0x4c, 0x61, 0x76, 0x66, |
|
0x35, 0x36, 0x2e, 0x31, 0x35, 0x2e, 0x31, 0x30, |
|
0x32, 0x29, 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, |
|
0x6c, 0x02, 0x00, 0x1c, 0x72, 0x74, 0x6d, 0x70, |
|
0x3a, 0x2f, 0x2f, 0x31, 0x39, 0x32, 0x2e, 0x31, |
|
0x36, 0x38, 0x2e, 0x31, 0x2e, 0x32, 0x33, 0x33, |
|
0x3a, 0x31, 0x39, 0x33, 0x35, 0x2f, 0x61, 0x70, |
|
0x00, 0x00, 0x09, |
|
}, |
|
[]interface{}{ |
|
"connect", |
|
float64(1), |
|
Object{ |
|
{Key: "app", Value: "ap"}, |
|
{Key: "type", Value: "nonprivate"}, |
|
{Key: "flashVer", Value: "FMLE/3.0 (compatible; Lavf56.15.102)"}, |
|
{Key: "tcUrl", Value: "rtmp://192.168.1.233:1935/ap"}, |
|
}, |
|
}, |
|
}, |
|
{ |
|
"srs", |
|
[]byte{ |
|
0x02, 0x00, 0x07, 0x5f, 0x72, 0x65, 0x73, 0x75, |
|
0x6c, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x66, 0x6d, |
|
0x73, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0d, 0x46, |
|
0x4d, 0x53, 0x2f, 0x33, 0x2c, 0x35, 0x2c, 0x33, |
|
0x2c, 0x38, 0x38, 0x38, 0x00, 0x0c, 0x63, 0x61, |
|
0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, |
|
0x65, 0x73, 0x00, 0x40, 0x5f, 0xc0, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x04, 0x6d, 0x6f, 0x64, |
|
0x65, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x05, |
|
0x6c, 0x65, 0x76, 0x65, 0x6c, 0x02, 0x00, 0x06, |
|
0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x00, 0x04, |
|
0x63, 0x6f, 0x64, 0x65, 0x02, 0x00, 0x1d, 0x4e, |
|
0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, |
|
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, |
|
0x6e, 0x65, 0x63, 0x74, 0x2e, 0x53, 0x75, 0x63, |
|
0x63, 0x65, 0x73, 0x73, 0x00, 0x0b, 0x64, 0x65, |
|
0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, |
|
0x6e, 0x02, 0x00, 0x14, 0x43, 0x6f, 0x6e, 0x6e, |
|
0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, |
|
0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, |
|
0x00, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, |
|
0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x04, 0x64, 0x61, 0x74, 0x61, 0x08, |
|
0x00, 0x00, 0x00, 0x0f, 0x00, 0x07, 0x76, 0x65, |
|
0x72, 0x73, 0x69, 0x6f, 0x6e, 0x02, 0x00, 0x09, |
|
0x33, 0x2c, 0x35, 0x2c, 0x33, 0x2c, 0x38, 0x38, |
|
0x38, 0x00, 0x07, 0x73, 0x72, 0x73, 0x5f, 0x73, |
|
0x69, 0x67, 0x02, 0x00, 0x03, 0x53, 0x52, 0x53, |
|
0x00, 0x0a, 0x73, 0x72, 0x73, 0x5f, 0x73, 0x65, |
|
0x72, 0x76, 0x65, 0x72, 0x02, 0x00, 0x34, 0x53, |
|
0x52, 0x53, 0x20, 0x31, 0x2e, 0x30, 0x2e, 0x31, |
|
0x30, 0x20, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, |
|
0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x69, |
|
0x6e, 0x6c, 0x69, 0x6e, 0x76, 0x69, 0x70, 0x2f, |
|
0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2d, 0x72, |
|
0x74, 0x6d, 0x70, 0x2d, 0x73, 0x65, 0x72, 0x76, |
|
0x65, 0x72, 0x29, 0x00, 0x0b, 0x73, 0x72, 0x73, |
|
0x5f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, |
|
0x02, 0x00, 0x15, 0x54, 0x68, 0x65, 0x20, 0x4d, |
|
0x49, 0x54, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, |
|
0x73, 0x65, 0x20, 0x28, 0x4d, 0x49, 0x54, 0x29, |
|
0x00, 0x08, 0x73, 0x72, 0x73, 0x5f, 0x72, 0x6f, |
|
0x6c, 0x65, 0x02, 0x00, 0x12, 0x6f, 0x72, 0x69, |
|
0x67, 0x69, 0x6e, 0x2f, 0x65, 0x64, 0x67, 0x65, |
|
0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x00, |
|
0x07, 0x73, 0x72, 0x73, 0x5f, 0x75, 0x72, 0x6c, |
|
0x02, 0x00, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x73, |
|
0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, |
|
0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x69, |
|
0x6e, 0x6c, 0x69, 0x6e, 0x76, 0x69, 0x70, 0x2f, |
|
0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x2d, 0x72, |
|
0x74, 0x6d, 0x70, 0x2d, 0x73, 0x65, 0x72, 0x76, |
|
0x65, 0x72, 0x00, 0x0b, 0x73, 0x72, 0x73, 0x5f, |
|
0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x02, |
|
0x00, 0x06, 0x31, 0x2e, 0x30, 0x2e, 0x31, 0x30, |
|
0x00, 0x08, 0x73, 0x72, 0x73, 0x5f, 0x73, 0x69, |
|
0x74, 0x65, 0x02, 0x00, 0x1c, 0x68, 0x74, 0x74, |
|
0x70, 0x3a, 0x2f, 0x2f, 0x62, 0x6c, 0x6f, 0x67, |
|
0x2e, 0x63, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, |
|
0x74, 0x2f, 0x77, 0x69, 0x6e, 0x5f, 0x6c, 0x69, |
|
0x6e, 0x00, 0x09, 0x73, 0x72, 0x73, 0x5f, 0x65, |
|
0x6d, 0x61, 0x69, 0x6c, 0x02, 0x00, 0x12, 0x77, |
|
0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x40, 0x76, 0x69, |
|
0x70, 0x2e, 0x31, 0x32, 0x36, 0x2e, 0x63, 0x6f, |
|
0x6d, 0x00, 0x0d, 0x73, 0x72, 0x73, 0x5f, 0x63, |
|
0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, |
|
0x02, 0x00, 0x1e, 0x43, 0x6f, 0x70, 0x79, 0x72, |
|
0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, |
|
0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, 0x32, 0x30, |
|
0x31, 0x34, 0x20, 0x77, 0x69, 0x6e, 0x6c, 0x69, |
|
0x6e, 0x00, 0x0b, 0x73, 0x72, 0x73, 0x5f, 0x70, |
|
0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x02, 0x00, |
|
0x06, 0x77, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x00, |
|
0x0b, 0x73, 0x72, 0x73, 0x5f, 0x61, 0x75, 0x74, |
|
0x68, 0x6f, 0x72, 0x73, 0x02, 0x00, 0x0b, 0x77, |
|
0x65, 0x6e, 0x6a, 0x69, 0x65, 0x2e, 0x7a, 0x68, |
|
0x61, 0x6f, 0x00, 0x0d, 0x73, 0x72, 0x73, 0x5f, |
|
0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, |
|
0x70, 0x02, 0x00, 0x0b, 0x31, 0x37, 0x32, 0x2e, |
|
0x31, 0x37, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x00, |
|
0x07, 0x73, 0x72, 0x73, 0x5f, 0x70, 0x69, 0x64, |
|
0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x06, 0x73, 0x72, 0x73, 0x5f, 0x69, |
|
0x64, 0x00, 0x40, 0x5a, 0x40, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, |
|
}, |
|
[]interface{}{ |
|
"_result", |
|
float64(1), |
|
Object{ |
|
{Key: "fmsVer", Value: "FMS/3,5,3,888"}, |
|
{Key: "capabilities", Value: float64(127)}, |
|
{Key: "mode", Value: float64(1)}, |
|
}, |
|
Object{ |
|
{Key: "level", Value: "status"}, |
|
{Key: "code", Value: "NetConnection.Connect.Success"}, |
|
{Key: "description", Value: "Connection succeeded"}, |
|
{Key: "objectEncoding", Value: float64(0)}, |
|
{ |
|
Key: "data", |
|
Value: ECMAArray{ |
|
{Key: "version", Value: "3,5,3,888"}, |
|
{Key: "srs_sig", Value: "SRS"}, |
|
{Key: "srs_server", Value: "SRS 1.0.10 (github.com/winlinvip/simple-rtmp-server)"}, |
|
{Key: "srs_license", Value: "The MIT License (MIT)"}, |
|
{Key: "srs_role", Value: "origin/edge server"}, |
|
{Key: "srs_url", Value: "https://github.com/winlinvip/simple-rtmp-server"}, |
|
{Key: "srs_version", Value: "1.0.10"}, |
|
{Key: "srs_site", Value: "http://blog.csdn.net/win_lin"}, |
|
{Key: "srs_email", Value: "winlin@vip.126.com"}, |
|
{Key: "srs_copyright", Value: "Copyright (c) 2013-2014 winlin"}, |
|
{Key: "srs_primary", Value: "winlin"}, |
|
{Key: "srs_authors", Value: "wenjie.zhao"}, |
|
{Key: "srs_server_ip", Value: "172.17.0.10"}, |
|
{Key: "srs_pid", Value: float64(1)}, |
|
{Key: "srs_id", Value: float64(105)}, |
|
}, |
|
}, |
|
}, |
|
}, |
|
}, |
|
{ |
|
"play", |
|
[]byte{ |
|
0x02, 0x00, 0x04, 0x70, 0x6c, 0x61, 0x79, 0x00, |
|
0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
0x05, 0x02, 0x00, 0x01, 0x31, 0x00, 0x00, 0x00, |
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
}, |
|
[]interface{}{ |
|
"play", |
|
float64(3), |
|
nil, |
|
"1", |
|
float64(0), |
|
}, |
|
}, |
|
} |
|
|
|
func TestUnmarshal(t *testing.T) { |
|
for _, ca := range cases { |
|
t.Run(ca.name, func(t *testing.T) { |
|
dec, err := Unmarshal(ca.enc) |
|
require.NoError(t, err) |
|
require.Equal(t, ca.dec, dec) |
|
}) |
|
} |
|
} |
|
|
|
func FuzzUnmarshal(f *testing.F) { |
|
for _, ca := range cases { |
|
f.Add(ca.enc) |
|
} |
|
|
|
f.Fuzz(func(_ *testing.T, b []byte) { |
|
Unmarshal(b) //nolint:errcheck |
|
}) |
|
}
|
|
|