@ -11,108 +11,136 @@ import (
@@ -11,108 +11,136 @@ import (
)
func TestSRTServer ( t * testing . T ) {
p , ok := newInstance ( "paths:\n" +
" all:\n" )
require . Equal ( t , true , ok )
defer p . Close ( )
conf := srt . DefaultConfig ( )
address , err := conf . UnmarshalURL ( "srt://localhost:8890?streamid=publish:mypath" )
require . NoError ( t , err )
err = conf . Validate ( )
require . NoError ( t , err )
publisher , err := srt . Dial ( "srt" , address , conf )
require . NoError ( t , err )
defer publisher . Close ( )
track := & mpegts . Track {
Codec : & mpegts . CodecH264 { } ,
}
bw := bufio . NewWriter ( publisher )
w := mpegts . NewWriter ( bw , [ ] * mpegts . Track { track } )
require . NoError ( t , err )
err = w . WriteH26x ( track , 0 , 0 , true , [ ] [ ] byte {
{ // SPS
0x67 , 0x42 , 0xc0 , 0x28 , 0xd9 , 0x00 , 0x78 , 0x02 ,
0x27 , 0xe5 , 0x84 , 0x00 , 0x00 , 0x03 , 0x00 , 0x04 ,
0x00 , 0x00 , 0x03 , 0x00 , 0xf0 , 0x3c , 0x60 , 0xc9 ,
0x20 ,
} ,
{ // PPS
0x08 , 0x06 , 0x07 , 0x08 ,
} ,
{ // IDR
0x05 , 1 ,
} ,
} )
require . NoError ( t , err )
err = bw . Flush ( )
require . NoError ( t , err )
time . Sleep ( 500 * time . Millisecond )
conf = srt . DefaultConfig ( )
address , err = conf . UnmarshalURL ( "srt://localhost:8890?streamid=read:mypath" )
require . NoError ( t , err )
err = conf . Validate ( )
require . NoError ( t , err )
reader , err := srt . Dial ( "srt" , address , conf )
require . NoError ( t , err )
defer reader . Close ( )
err = w . WriteH26x ( track , 2 * 90000 , 1 * 90000 , true , [ ] [ ] byte {
{ // IDR
0x05 , 2 ,
} ,
} )
require . NoError ( t , err )
err = bw . Flush ( )
require . NoError ( t , err )
r , err := mpegts . NewReader ( reader )
require . NoError ( t , err )
require . Equal ( t , [ ] * mpegts . Track { {
PID : 256 ,
Codec : & mpegts . CodecH264 { } ,
} } , r . Tracks ( ) )
received := false
r . OnDataH26x ( r . Tracks ( ) [ 0 ] , func ( pts int64 , dts int64 , au [ ] [ ] byte ) error {
require . Equal ( t , int64 ( 0 ) , pts )
require . Equal ( t , int64 ( 0 ) , dts )
require . Equal ( t , [ ] [ ] byte {
{ // SPS
0x67 , 0x42 , 0xc0 , 0x28 , 0xd9 , 0x00 , 0x78 , 0x02 ,
0x27 , 0xe5 , 0x84 , 0x00 , 0x00 , 0x03 , 0x00 , 0x04 ,
0x00 , 0x00 , 0x03 , 0x00 , 0xf0 , 0x3c , 0x60 , 0xc9 ,
0x20 ,
} ,
{ // PPS
0x08 , 0x06 , 0x07 , 0x08 ,
} ,
{ // IDR
0x05 , 1 ,
} ,
} , au )
received = true
return nil
} )
for {
err = r . Read ( )
require . NoError ( t , err )
if received {
break
}
for _ , ca := range [ ] string {
"no passphrase" ,
"publish passphrase" ,
"read passphrase" ,
} {
t . Run ( ca , func ( t * testing . T ) {
conf := "paths:\n" +
" all:\n"
switch ca {
case "publish passphrase" :
conf += " srtPublishPassphrase: 123456789abcde"
case "read passphrase" :
conf += " srtReadPassphrase: 123456789abcde"
}
p , ok := newInstance ( conf )
require . Equal ( t , true , ok )
defer p . Close ( )
u := "srt://localhost:8890?streamid=publish:mypath"
if ca == "publish passphrase" {
u += "&passphrase=123456789abcde"
}
srtConf := srt . DefaultConfig ( )
address , err := srtConf . UnmarshalURL ( u )
require . NoError ( t , err )
err = srtConf . Validate ( )
require . NoError ( t , err )
publisher , err := srt . Dial ( "srt" , address , srtConf )
require . NoError ( t , err )
defer publisher . Close ( )
track := & mpegts . Track {
Codec : & mpegts . CodecH264 { } ,
}
bw := bufio . NewWriter ( publisher )
w := mpegts . NewWriter ( bw , [ ] * mpegts . Track { track } )
require . NoError ( t , err )
err = w . WriteH26x ( track , 0 , 0 , true , [ ] [ ] byte {
{ // SPS
0x67 , 0x42 , 0xc0 , 0x28 , 0xd9 , 0x00 , 0x78 , 0x02 ,
0x27 , 0xe5 , 0x84 , 0x00 , 0x00 , 0x03 , 0x00 , 0x04 ,
0x00 , 0x00 , 0x03 , 0x00 , 0xf0 , 0x3c , 0x60 , 0xc9 ,
0x20 ,
} ,
{ // PPS
0x08 , 0x06 , 0x07 , 0x08 ,
} ,
{ // IDR
0x05 , 1 ,
} ,
} )
require . NoError ( t , err )
err = bw . Flush ( )
require . NoError ( t , err )
time . Sleep ( 500 * time . Millisecond )
u = "srt://localhost:8890?streamid=read:mypath"
if ca == "read passphrase" {
u += "&passphrase=123456789abcde"
}
srtConf = srt . DefaultConfig ( )
address , err = srtConf . UnmarshalURL ( u )
require . NoError ( t , err )
err = srtConf . Validate ( )
require . NoError ( t , err )
reader , err := srt . Dial ( "srt" , address , srtConf )
require . NoError ( t , err )
defer reader . Close ( )
err = w . WriteH26x ( track , 2 * 90000 , 1 * 90000 , true , [ ] [ ] byte {
{ // IDR
0x05 , 2 ,
} ,
} )
require . NoError ( t , err )
err = bw . Flush ( )
require . NoError ( t , err )
r , err := mpegts . NewReader ( reader )
require . NoError ( t , err )
require . Equal ( t , [ ] * mpegts . Track { {
PID : 256 ,
Codec : & mpegts . CodecH264 { } ,
} } , r . Tracks ( ) )
received := false
r . OnDataH26x ( r . Tracks ( ) [ 0 ] , func ( pts int64 , dts int64 , au [ ] [ ] byte ) error {
require . Equal ( t , int64 ( 0 ) , pts )
require . Equal ( t , int64 ( 0 ) , dts )
require . Equal ( t , [ ] [ ] byte {
{ // SPS
0x67 , 0x42 , 0xc0 , 0x28 , 0xd9 , 0x00 , 0x78 , 0x02 ,
0x27 , 0xe5 , 0x84 , 0x00 , 0x00 , 0x03 , 0x00 , 0x04 ,
0x00 , 0x00 , 0x03 , 0x00 , 0xf0 , 0x3c , 0x60 , 0xc9 ,
0x20 ,
} ,
{ // PPS
0x08 , 0x06 , 0x07 , 0x08 ,
} ,
{ // IDR
0x05 , 1 ,
} ,
} , au )
received = true
return nil
} )
for {
err = r . Read ( )
require . NoError ( t , err )
if received {
break
}
}
} )
}
}