@@ -1027,3 +1027,105 @@ func (p *countingPacketizer) EnableAbsSendTime(value int) {}
10271027func (p * countingPacketizer ) SkipSamples (skippedSamples uint32 ) {
10281028 p .totalSamples += uint64 (skippedSamples )
10291029}
1030+
1031+ type sampleExtensionChecker struct {
1032+ dummyWriter
1033+
1034+ t * testing.T
1035+ errorTest bool
1036+ called atomic.Uint32
1037+ }
1038+
1039+ func (c * sampleExtensionChecker ) WriteRTP (header * rtp.Header , payload []byte ) (int , error ) {
1040+ c .called .Add (1 )
1041+ assert .True (c .t , header .Extension )
1042+ assert .EqualValues (c .t , "hello" , header .GetExtension (1 ))
1043+ if ! c .errorTest {
1044+ assert .EqualValues (c .t , "world" , header .GetExtension (2 ))
1045+ } else {
1046+ assert .Nil (c .t , header .GetExtension (2 ))
1047+ }
1048+
1049+ return 0 , nil
1050+ }
1051+
1052+ func TestTrackLocalStaticSample_WriteSample_Extensions (t * testing.T ) {
1053+ track , err := NewTrackLocalStaticSample (
1054+ RTPCodecCapability {MimeType : MimeTypeVP8 },
1055+ "video" ,
1056+ "pion" ,
1057+ )
1058+ require .NoError (t , err )
1059+
1060+ checker := & sampleExtensionChecker {
1061+ t : t ,
1062+ }
1063+
1064+ track .rtpTrack .mu .Lock ()
1065+ track .rtpTrack .bindings = []trackBinding {{
1066+ id : "b1" ,
1067+ ssrc : 0x1234 ,
1068+ payloadType : 96 ,
1069+ writeStream : checker ,
1070+ }}
1071+ fp := & fakePacketizer {}
1072+ track .packetizer = fp
1073+ track .rtpTrack .mu .Unlock ()
1074+
1075+ sample := media.Sample {
1076+ Data : []byte ("hi" ),
1077+ Duration : 20 * time .Millisecond ,
1078+ }
1079+ extension1 := SampleRTPExtension {
1080+ ID : 1 ,
1081+ Payload : []byte ("hello" ),
1082+ }
1083+ extension2 := SampleRTPExtension {
1084+ ID : 2 ,
1085+ Payload : []byte ("world" ),
1086+ }
1087+ err = track .WriteSample (sample , extension1 , extension2 )
1088+ require .NoError (t , err )
1089+ require .EqualValues (t , 2 , checker .called .Load ())
1090+ }
1091+
1092+ func TestTrackLocalStaticSample_WriteSample_ExtensionsError (t * testing.T ) {
1093+ track , err := NewTrackLocalStaticSample (
1094+ RTPCodecCapability {MimeType : MimeTypeVP8 },
1095+ "video" ,
1096+ "pion" ,
1097+ )
1098+ require .NoError (t , err )
1099+
1100+ checker := & sampleExtensionChecker {
1101+ t : t ,
1102+ errorTest : true ,
1103+ }
1104+
1105+ track .rtpTrack .mu .Lock ()
1106+ track .rtpTrack .bindings = []trackBinding {{
1107+ id : "b1" ,
1108+ ssrc : 0x1234 ,
1109+ payloadType : 96 ,
1110+ writeStream : checker ,
1111+ }}
1112+ fp := & fakePacketizer {}
1113+ track .packetizer = fp
1114+ track .rtpTrack .mu .Unlock ()
1115+
1116+ sample := media.Sample {
1117+ Data : []byte ("hi" ),
1118+ Duration : 20 * time .Millisecond ,
1119+ }
1120+ extension1 := SampleRTPExtension {
1121+ ID : 1 ,
1122+ Payload : []byte ("hello" ),
1123+ }
1124+ extension2 := SampleRTPExtension {
1125+ ID : 2 ,
1126+ Payload : []byte ("this is a long extension payload that will trigger an error" ),
1127+ }
1128+ err = track .WriteSample (sample , extension1 , extension2 )
1129+ assert .ErrorContains (t , err , "one byte extension" )
1130+ require .EqualValues (t , 2 , checker .called .Load ())
1131+ }
0 commit comments