@@ -7,12 +7,10 @@ import (
77 "sync"
88 "time"
99
10- "github.com/cloudwebrtc/go-sip-ua/examples/b2bua/b2bua/buffer"
1110 "github.com/cloudwebrtc/go-sip-ua/pkg/utils"
1211 "github.com/ghettovoice/gosip/util"
1312 "github.com/pion/rtcp"
1413 "github.com/pion/rtp"
15- "github.com/pion/webrtc/v3"
1614 "github.com/pixelbender/go-sdp/sdp"
1715)
1816
@@ -31,32 +29,13 @@ type UdpTansport struct {
3129 closed utils.AtomicBool
3230 ctx context.Context
3331 cancel context.CancelFunc
34-
35- sequencer * sequencer
36- videoPool * sync.Pool
37- audioPool * sync.Pool
38- buff * buffer.Buffer
39- bmu sync.Mutex
4032}
4133
4234func NewUdpTansport (trackInfos []* TrackInfo ) * UdpTansport {
4335 t := & UdpTansport {
4436 trackInfos : trackInfos ,
4537 ports : make (map [TrackType ]* UdpPort ),
4638 videoSSRC : 0 ,
47- sequencer : newSequencer (MaxPacketTrack ),
48- videoPool : & sync.Pool {
49- New : func () interface {} {
50- b := make ([]byte , MaxPacketTrack * maxPktSize )
51- return & b
52- },
53- },
54- audioPool : & sync.Pool {
55- New : func () interface {} {
56- b := make ([]byte , maxPktSize * 25 )
57- return & b
58- },
59- },
6039 }
6140
6241 t .ctx , t .cancel = context .WithCancel (context .TODO ())
@@ -82,7 +61,7 @@ func (c *UdpTansport) Init(config CallConfig) error {
8261 SessionVersion : time .Now ().UnixNano () / 1e6 ,
8362 },
8463 Timing : & sdp.Timing {Start : time.Time {}, Stop : time.Time {}},
85- //Name: "Example",
64+ //Name: "play", // Session Name ("s=")
8665 Connection : & sdp.Connection {
8766 Address : host ,
8867 },
@@ -181,16 +160,6 @@ func (c *UdpTansport) onRtpPacket(trackType TrackType, packet []byte, raddr net.
181160
182161 if trackType == TrackTypeVideo && c .videoSSRC == 0 {
183162 c .videoSSRC = p .SSRC
184-
185- c .bmu .Lock ()
186- if c .buff == nil {
187- c .buff = buffer .NewBuffer (uint32 (p .SSRC ), c .videoPool , c .audioPool , buffer .Logger )
188- c .buff .Bind (webrtc.RTPParameters {}, buffer.Options {
189- MaxBitRate : 1500 ,
190- })
191- c .buff .OnFeedback (func (fb []rtcp.Packet ) {})
192- }
193- c .bmu .Unlock ()
194163 //c.sendPLI(c.videoSSRC)
195164 }
196165
@@ -211,69 +180,6 @@ func (c *UdpTansport) onRtpPacket(trackType TrackType, packet []byte, raddr net.
211180
212181func (c * UdpTansport ) onRtcpPacket (trackType TrackType , packet []byte , raddr net.Addr ) error {
213182 logger .Debugf ("UdpTansport::OnRtcpPacketReceived: %v read %d bytes, raddr %v" , trackType , len (packet ), raddr )
214-
215- pkts , err := rtcp .Unmarshal (packet )
216- if err != nil {
217- logger .Errorf ("Unmarshal rtcp receiver packets err %v" , err )
218- }
219- var fwdPkts []rtcp.Packet
220- pliOnce := true
221- firOnce := true
222- var (
223- maxRatePacketLoss uint8
224- expectedMinBitrate uint64
225- )
226- for _ , pkt := range pkts {
227- switch p := pkt .(type ) {
228- case * rtcp.PictureLossIndication :
229- if pliOnce {
230- fwdPkts = append (fwdPkts , p )
231- logger .Infof ("Picture Loss Indication" )
232- if c .requestKeyFrameHandler != nil {
233- c .requestKeyFrameHandler ()
234- }
235- pliOnce = false
236- }
237- case * rtcp.FullIntraRequest :
238- if firOnce {
239- fwdPkts = append (fwdPkts , p )
240- logger .Infof ("FullIntraRequest" )
241- if c .requestKeyFrameHandler != nil {
242- c .requestKeyFrameHandler ()
243- }
244- firOnce = false
245- }
246- case * rtcp.ReceiverEstimatedMaximumBitrate :
247- if expectedMinBitrate == 0 || expectedMinBitrate > uint64 (p .Bitrate ) {
248- expectedMinBitrate = uint64 (p .Bitrate )
249- //hi.CameraUpdateBitrate(uint32(expectedMinBitrate / 1024))
250- logger .Debugf (" ReceiverEstimatedMaximumBitrate %d" , expectedMinBitrate / 1024 )
251- }
252- case * rtcp.ReceiverReport :
253- for _ , r := range p .Reports {
254- if maxRatePacketLoss == 0 || maxRatePacketLoss < r .FractionLost {
255- maxRatePacketLoss = r .FractionLost
256- logger .Infof ("maxRatePacketLoss %d" , maxRatePacketLoss )
257- }
258- }
259- case * rtcp.TransportLayerNack :
260- logger .Infof ("Nack %v" , p )
261- if c .sequencer != nil {
262- var nackedPackets []packetMeta
263- for _ , pair := range p .Nacks {
264- nackedPackets = append (nackedPackets , c .sequencer .getSeqNoPairs (pair .PacketList ())... )
265- }
266- if len (nackedPackets ) > 0 {
267- //if err = c.RetransmitPackets(nackedPackets); err == nil {
268- // logger.Infof("Nack pair %v", nackedPackets)
269- //}
270- } else {
271- //buf, _ := p.Marshal()
272- //c.onRtcpPacket(TrackTypeVideo, packet)
273- }
274- }
275- }
276- }
277183 c .mu .RLock ()
278184 defer c .mu .RUnlock ()
279185 if c .rtcpHandler != nil {
@@ -283,18 +189,19 @@ func (c *UdpTansport) onRtcpPacket(trackType TrackType, packet []byte, raddr net
283189}
284190
285191func (c * UdpTansport ) WriteRTP (trackType TrackType , packet []byte ) (int , error ) {
192+ /*
193+ p := &rtp.Packet{}
194+ if err := p.Unmarshal(packet); err != nil {
195+ logger.Errorf("tp.Packet Unmarshal: e %v", err)
196+ }
197+ logger.Debugf("UdpTansport::WriteRTP: %v, write %d bytes, seq %d, ts %d", trackType, len(packet), p.SequenceNumber, p.Timestamp)
286198
287- p := & rtp.Packet {}
288- if err := p .Unmarshal (packet ); err != nil {
289- logger .Errorf ("tp.Packet Unmarshal: e %v" , err )
290- }
291- logger .Debugf ("UdpTansport::WriteRTP: %v, write %d bytes, seq %d, ts %d" , trackType , len (packet ), p .SequenceNumber , p .Timestamp )
292-
293- pktbuf , err := p .Marshal ()
199+ pktbuf, err := p.Marshal()
294200
295- if err != nil {
296- logger .Errorf ("UdpTansport::WriteRTP: Marshal rtp receiver packets err %v" , err )
297- }
201+ if err != nil {
202+ logger.Errorf("UdpTansport::WriteRTP: Marshal rtp receiver packets err %v", err)
203+ }
204+ */
298205
299206 port := c .ports [trackType ]
300207
@@ -303,25 +210,24 @@ func (c *UdpTansport) WriteRTP(trackType TrackType, packet []byte) (int, error)
303210 return 0 , nil
304211 }
305212
306- return port .WriteRtp (pktbuf )
213+ return port .WriteRtp (packet )
307214}
308215
309216func (c * UdpTansport ) WriteRTCP (trackType TrackType , packet []byte ) (int , error ) {
217+ /*
218+ pkts, err := rtcp.Unmarshal(packet)
219+ if err != nil {
220+ logger.Errorf("UdpTansport::WriteRTP: Unmarshal rtcp receiver packets err %v", err)
221+ }
310222
311- pkts , err := rtcp .Unmarshal (packet )
312- if err != nil {
313- logger .Errorf ("UdpTansport::WriteRTP: Unmarshal rtcp receiver packets err %v" , err )
314- }
315-
316- logger .Debugf ("UdpTansport::WriteRTCP: %v read %d packets" , trackType , len (pkts ))
317-
223+ logger.Debugf("UdpTansport::WriteRTCP: %v read %d packets", trackType, len(pkts))
224+ */
318225 port := c .ports [trackType ]
319226
320227 if port == nil {
321228 logger .Errorf ("UdpTansport::WriteRTCP: port is nil" )
322229 return 0 , nil
323230 }
324-
325231 return port .WriteRtcp (packet )
326232}
327233
@@ -392,7 +298,11 @@ func (c *UdpTansport) RequestKeyFrame() error {
392298 if c .videoSSRC == 0 {
393299 return fmt .Errorf ("video ssrc is 0" )
394300 }
395- pli := rtcp.PictureLossIndication {MediaSSRC : uint32 (c .videoSSRC )}
301+ return c .sendPLI (c .videoSSRC )
302+ }
303+
304+ func (c * UdpTansport ) sendPLI (ssrc uint32 ) error {
305+ pli := rtcp.PictureLossIndication {MediaSSRC : uint32 (ssrc )}
396306 buf , err := pli .Marshal ()
397307 if err != nil {
398308 logger .Error (err )
@@ -401,13 +311,13 @@ func (c *UdpTansport) RequestKeyFrame() error {
401311 _ , errSend := c .WriteRTCP (TrackTypeVideo , buf )
402312 if errSend != nil {
403313 logger .Error (errSend )
404- return errSend
314+ return err
405315 }
406- logger .Infof ("RequestKeyFrame: Sent PLI %v" , pli )
316+ logger .Infof ("Sent PLI %v" , pli )
407317 return nil
408318}
409319
410- func (c * UdpTansport ) sendPLI (ssrc uint32 ) error {
320+ func (c * UdpTansport ) sendTntervalPlic (ssrc uint32 ) error {
411321 go func () {
412322 ticker := time .NewTicker (time .Second * 1 )
413323 for range ticker .C {
@@ -431,3 +341,53 @@ func (c *UdpTansport) sendPLI(ssrc uint32) error {
431341 }()
432342 return nil
433343}
344+
345+ func (c * UdpTansport ) handleRtcpFeedback (packet []byte ) {
346+ pkts , err := rtcp .Unmarshal (packet )
347+ if err != nil {
348+ logger .Errorf ("Unmarshal rtcp receiver packets err %v" , err )
349+ }
350+ var fwdPkts []rtcp.Packet
351+ pliOnce := true
352+ firOnce := true
353+ var (
354+ maxRatePacketLoss uint8
355+ expectedMinBitrate uint64
356+ )
357+ for _ , pkt := range pkts {
358+ switch p := pkt .(type ) {
359+ case * rtcp.PictureLossIndication :
360+ if pliOnce {
361+ fwdPkts = append (fwdPkts , p )
362+ logger .Infof ("Picture Loss Indication" )
363+ if c .requestKeyFrameHandler != nil {
364+ c .requestKeyFrameHandler ()
365+ }
366+ pliOnce = false
367+ }
368+ case * rtcp.FullIntraRequest :
369+ if firOnce {
370+ fwdPkts = append (fwdPkts , p )
371+ logger .Infof ("FullIntraRequest" )
372+ if c .requestKeyFrameHandler != nil {
373+ c .requestKeyFrameHandler ()
374+ }
375+ firOnce = false
376+ }
377+ case * rtcp.ReceiverEstimatedMaximumBitrate :
378+ if expectedMinBitrate == 0 || expectedMinBitrate > uint64 (p .Bitrate ) {
379+ expectedMinBitrate = uint64 (p .Bitrate )
380+ logger .Debugf (" ReceiverEstimatedMaximumBitrate %d" , expectedMinBitrate / 1024 )
381+ }
382+ case * rtcp.ReceiverReport :
383+ for _ , r := range p .Reports {
384+ if maxRatePacketLoss == 0 || maxRatePacketLoss < r .FractionLost {
385+ maxRatePacketLoss = r .FractionLost
386+ logger .Infof ("maxRatePacketLoss %d" , maxRatePacketLoss )
387+ }
388+ }
389+ case * rtcp.TransportLayerNack :
390+ logger .Infof ("Nack %v" , p )
391+ }
392+ }
393+ }
0 commit comments