mirror of
https://github.com/aler9/rtsp-simple-server
synced 2025-10-05 15:46:58 +08:00
314 lines
10 KiB
Go
314 lines
10 KiB
Go
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
|
|
})
|
|
}
|