@@ -335,22 +335,19 @@ type Client struct {
335
335
keepalivePeriod time.Duration
336
336
keepaliveTimer * time.Timer
337
337
closeError error
338
- writer asyncProcessor
338
+ writer * asyncProcessor
339
339
reader * clientReader
340
340
timeDecoder * rtptime.GlobalDecoder2
341
341
mustClose bool
342
342
343
343
// in
344
- chOptions chan optionsReq
345
- chDescribe chan describeReq
346
- chAnnounce chan announceReq
347
- chSetup chan setupReq
348
- chPlay chan playReq
349
- chRecord chan recordReq
350
- chPause chan pauseReq
351
- chReadError chan error
352
- chReadResponse chan * base.Response
353
- chReadRequest chan * base.Request
344
+ chOptions chan optionsReq
345
+ chDescribe chan describeReq
346
+ chAnnounce chan announceReq
347
+ chSetup chan setupReq
348
+ chPlay chan playReq
349
+ chRecord chan recordReq
350
+ chPause chan pauseReq
354
351
355
352
// out
356
353
done chan struct {}
@@ -462,9 +459,6 @@ func (c *Client) Start(scheme string, host string) error {
462
459
c .chPlay = make (chan playReq )
463
460
c .chRecord = make (chan recordReq )
464
461
c .chPause = make (chan pauseReq )
465
- c .chReadError = make (chan error )
466
- c .chReadResponse = make (chan * base.Response )
467
- c .chReadRequest = make (chan * base.Request )
468
462
c .done = make (chan struct {})
469
463
470
464
go c .run ()
@@ -530,6 +524,34 @@ func (c *Client) run() {
530
524
531
525
func (c * Client ) runInner () error {
532
526
for {
527
+ chReaderResponse := func () chan * base.Response {
528
+ if c .reader != nil {
529
+ return c .reader .chResponse
530
+ }
531
+ return nil
532
+ }()
533
+
534
+ chReaderRequest := func () chan * base.Request {
535
+ if c .reader != nil {
536
+ return c .reader .chRequest
537
+ }
538
+ return nil
539
+ }()
540
+
541
+ chReaderError := func () chan error {
542
+ if c .reader != nil {
543
+ return c .reader .chError
544
+ }
545
+ return nil
546
+ }()
547
+
548
+ chWriterError := func () chan error {
549
+ if c .writer != nil {
550
+ return c .writer .chError
551
+ }
552
+ return nil
553
+ }()
554
+
533
555
select {
534
556
case req := <- c .chOptions :
535
557
res , err := c .doOptions (req .url )
@@ -601,15 +623,18 @@ func (c *Client) runInner() error {
601
623
}
602
624
c .keepaliveTimer = time .NewTimer (c .keepalivePeriod )
603
625
604
- case err := <- c .chReadError :
626
+ case err := <- chWriterError :
627
+ return err
628
+
629
+ case err := <- chReaderError :
605
630
c .reader = nil
606
631
return err
607
632
608
- case res := <- c . chReadResponse :
633
+ case res := <- chReaderResponse :
609
634
c .OnResponse (res )
610
635
// these are responses to keepalives, ignore them.
611
636
612
- case req := <- c . chReadRequest :
637
+ case req := <- chReaderRequest :
613
638
err := c .handleServerRequest (req )
614
639
if err != nil {
615
640
return err
@@ -630,19 +655,19 @@ func (c *Client) waitResponse(requestCseqStr string) (*base.Response, error) {
630
655
case <- t .C :
631
656
return nil , liberrors.ErrClientRequestTimedOut {}
632
657
633
- case err := <- c .chReadError :
658
+ case err := <- c .reader . chError :
634
659
c .reader = nil
635
660
return nil , err
636
661
637
- case res := <- c .chReadResponse :
662
+ case res := <- c .reader . chResponse :
638
663
c .OnResponse (res )
639
664
640
665
// accept response if CSeq equals request CSeq, or if CSeq is not present
641
666
if cseq , ok := res .Header ["CSeq" ]; ! ok || len (cseq ) != 1 || strings .TrimSpace (cseq [0 ]) == requestCseqStr {
642
667
return res , nil
643
668
}
644
669
645
- case req := <- c .chReadRequest :
670
+ case req := <- c .reader . chRequest :
646
671
err := c .handleServerRequest (req )
647
672
if err != nil {
648
673
return nil , err
@@ -682,8 +707,8 @@ func (c *Client) handleServerRequest(req *base.Request) error {
682
707
683
708
func (c * Client ) doClose () {
684
709
if c .state == clientStatePlay || c .state == clientStateRecord {
685
- c .stopWriter ()
686
- c .stopReadRoutines ()
710
+ c .writer . stop ()
711
+ c .stopTransportRoutines ()
687
712
}
688
713
689
714
if c .nconn != nil && c .baseURL != nil {
@@ -808,15 +833,21 @@ func (c *Client) trySwitchingProtocol2(medi *description.Media, baseURL *base.UR
808
833
return c .doSetup (baseURL , medi , 0 , 0 )
809
834
}
810
835
811
- func (c * Client ) startReadRoutines () {
836
+ func (c * Client ) startTransportRoutines () {
812
837
// allocate writer here because it's needed by RTCP receiver / sender
813
838
if c .state == clientStateRecord || c .backChannelSetupped {
814
- c .writer .allocateBuffer (c .WriteQueueSize )
839
+ c .writer = & asyncProcessor {
840
+ bufferSize : c .WriteQueueSize ,
841
+ }
842
+ c .writer .initialize ()
815
843
} else {
816
844
// when reading, buffer is only used to send RTCP receiver reports,
817
845
// that are much smaller than RTP packets and are sent at a fixed interval.
818
846
// decrease RAM consumption by allocating less buffers.
819
- c .writer .allocateBuffer (8 )
847
+ c .writer = & asyncProcessor {
848
+ bufferSize : 8 ,
849
+ }
850
+ c .writer .initialize ()
820
851
}
821
852
822
853
c .timeDecoder = rtptime .NewGlobalDecoder2 ()
@@ -848,7 +879,7 @@ func (c *Client) startReadRoutines() {
848
879
}
849
880
}
850
881
851
- func (c * Client ) stopReadRoutines () {
882
+ func (c * Client ) stopTransportRoutines () {
852
883
if c .reader != nil {
853
884
c .reader .setAllowInterleavedFrames (false )
854
885
}
@@ -861,14 +892,8 @@ func (c *Client) stopReadRoutines() {
861
892
}
862
893
863
894
c .timeDecoder = nil
864
- }
865
-
866
- func (c * Client ) startWriter () {
867
- c .writer .start ()
868
- }
869
895
870
- func (c * Client ) stopWriter () {
871
- c .writer .stop ()
896
+ c .writer = nil
872
897
}
873
898
874
899
func (c * Client ) connOpen () error {
@@ -1637,7 +1662,7 @@ func (c *Client) doPlay(ra *headers.Range) (*base.Response, error) {
1637
1662
}
1638
1663
1639
1664
c .state = clientStatePlay
1640
- c .startReadRoutines ()
1665
+ c .startTransportRoutines ()
1641
1666
1642
1667
// Range is mandatory in Parrot Streaming Server
1643
1668
if ra == nil {
@@ -1662,13 +1687,13 @@ func (c *Client) doPlay(ra *headers.Range) (*base.Response, error) {
1662
1687
Header : header ,
1663
1688
}, false )
1664
1689
if err != nil {
1665
- c .stopReadRoutines ()
1690
+ c .stopTransportRoutines ()
1666
1691
c .state = clientStatePrePlay
1667
1692
return nil , err
1668
1693
}
1669
1694
1670
1695
if res .StatusCode != base .StatusOK {
1671
- c .stopReadRoutines ()
1696
+ c .stopTransportRoutines ()
1672
1697
c .state = clientStatePrePlay
1673
1698
return nil , liberrors.ErrClientBadStatusCode {
1674
1699
Code : res .StatusCode , Message : res .StatusMessage ,
@@ -1689,7 +1714,7 @@ func (c *Client) doPlay(ra *headers.Range) (*base.Response, error) {
1689
1714
}
1690
1715
}
1691
1716
1692
- c .startWriter ()
1717
+ c .writer . start ()
1693
1718
c .lastRange = ra
1694
1719
1695
1720
return res , nil
@@ -1718,27 +1743,27 @@ func (c *Client) doRecord() (*base.Response, error) {
1718
1743
}
1719
1744
1720
1745
c .state = clientStateRecord
1721
- c .startReadRoutines ()
1746
+ c .startTransportRoutines ()
1722
1747
1723
1748
res , err := c .do (& base.Request {
1724
1749
Method : base .Record ,
1725
1750
URL : c .baseURL ,
1726
1751
}, false )
1727
1752
if err != nil {
1728
- c .stopReadRoutines ()
1753
+ c .stopTransportRoutines ()
1729
1754
c .state = clientStatePreRecord
1730
1755
return nil , err
1731
1756
}
1732
1757
1733
1758
if res .StatusCode != base .StatusOK {
1734
- c .stopReadRoutines ()
1759
+ c .stopTransportRoutines ()
1735
1760
c .state = clientStatePreRecord
1736
1761
return nil , liberrors.ErrClientBadStatusCode {
1737
1762
Code : res .StatusCode , Message : res .StatusMessage ,
1738
1763
}
1739
1764
}
1740
1765
1741
- c .startWriter ()
1766
+ c .writer . start ()
1742
1767
1743
1768
return nil , nil
1744
1769
}
@@ -1766,25 +1791,25 @@ func (c *Client) doPause() (*base.Response, error) {
1766
1791
return nil , err
1767
1792
}
1768
1793
1769
- c .stopWriter ()
1794
+ c .writer . stop ()
1770
1795
1771
1796
res , err := c .do (& base.Request {
1772
1797
Method : base .Pause ,
1773
1798
URL : c .baseURL ,
1774
1799
}, false )
1775
1800
if err != nil {
1776
- c .startWriter ()
1801
+ c .writer . start ()
1777
1802
return nil , err
1778
1803
}
1779
1804
1780
1805
if res .StatusCode != base .StatusOK {
1781
- c .startWriter ()
1806
+ c .writer . start ()
1782
1807
return nil , liberrors.ErrClientBadStatusCode {
1783
1808
Code : res .StatusCode , Message : res .StatusMessage ,
1784
1809
}
1785
1810
}
1786
1811
1787
- c .stopReadRoutines ()
1812
+ c .stopTransportRoutines ()
1788
1813
1789
1814
switch c .state {
1790
1815
case clientStatePlay :
@@ -1929,15 +1954,3 @@ func (c *Client) PacketNTP(medi *description.Media, pkt *rtp.Packet) (time.Time,
1929
1954
ct := cm .formats [pkt .PayloadType ]
1930
1955
return ct .rtcpReceiver .PacketNTP (pkt .Timestamp )
1931
1956
}
1932
-
1933
- func (c * Client ) readResponse (res * base.Response ) {
1934
- c .chReadResponse <- res
1935
- }
1936
-
1937
- func (c * Client ) readRequest (req * base.Request ) {
1938
- c .chReadRequest <- req
1939
- }
1940
-
1941
- func (c * Client ) readError (err error ) {
1942
- c .chReadError <- err
1943
- }
0 commit comments