11package main
22
33import (
4- "bufio"
5- "encoding/binary"
64 "errors"
75 "fmt"
86 "io"
2321
2422type rtspClient struct {
2523 p * program
26- nconn net .Conn
24+ rconn * rtsp .Conn
2725 state string
2826 IP net.IP
2927 rtpProto string
@@ -34,7 +32,7 @@ type rtspClient struct {
3432func newRtspClient (p * program , nconn net.Conn ) * rtspClient {
3533 c := & rtspClient {
3634 p : p ,
37- nconn : nconn ,
35+ rconn : rtsp . NewConn ( nconn ) ,
3836 state : "STARTING" ,
3937 }
4038
@@ -52,7 +50,7 @@ func (c *rtspClient) close() error {
5250 }
5351
5452 delete (c .p .clients , c )
55- c .nconn .Close ()
53+ c .rconn .Close ()
5654
5755 if c .p .streamAuthor == c {
5856 c .p .streamAuthor = nil
@@ -69,7 +67,7 @@ func (c *rtspClient) close() error {
6967}
7068
7169func (c * rtspClient ) log (format string , args ... interface {}) {
72- format = "[RTSP client " + c .nconn .RemoteAddr ().String () + "] " + format
70+ format = "[RTSP client " + c .rconn .RemoteAddr ().String () + "] " + format
7371 log .Printf (format , args ... )
7472}
7573
@@ -81,15 +79,13 @@ func (c *rtspClient) run() {
8179 c .close ()
8280 }()
8381
84- ipstr , _ , _ := net .SplitHostPort (c .nconn .RemoteAddr ().String ())
82+ ipstr , _ , _ := net .SplitHostPort (c .rconn .RemoteAddr ().String ())
8583 c .IP = net .ParseIP (ipstr )
8684
87- rconn := & rtsp.Conn {c .nconn }
88-
8985 c .log ("connected" )
9086
9187 for {
92- req , err := rconn .ReadRequest ()
88+ req , err := c . rconn .ReadRequest ()
9389 if err != nil {
9490 if err != io .EOF {
9591 c .log ("ERR: %s" , err )
@@ -104,7 +100,7 @@ func (c *rtspClient) run() {
104100 switch err {
105101 // normal response
106102 case nil :
107- err = rconn .WriteResponse (res )
103+ err = c . rconn .WriteResponse (res )
108104 if err != nil {
109105 c .log ("ERR: %s" , err )
110106 return
@@ -119,7 +115,7 @@ func (c *rtspClient) run() {
119115 // before the response
120116 // then switch to RTP if TCP
121117 case errPlay :
122- err = rconn .WriteResponse (res )
118+ err = c . rconn .WriteResponse (res )
123119 if err != nil {
124120 c .log ("ERR: %s" , err )
125121 return
@@ -134,18 +130,21 @@ func (c *rtspClient) run() {
134130 // when rtp protocol is TCP, the RTSP connection becomes a RTP connection
135131 // receive RTP feedback, do not parse it, wait until connection closes
136132 if c .rtpProto == "tcp" {
137- buf := make ([]byte , 1024 )
133+ buf := make ([]byte , 2048 )
138134 for {
139- _ , err := c .nconn . Read (buf )
135+ _ , err := c .rconn . ReadInterleavedFrame (buf )
140136 if err != nil {
137+ if err != io .EOF {
138+ c .log ("ERR: %s" , err )
139+ }
141140 return
142141 }
143142 }
144143 }
145144
146145 // RECORD: switch to RTP if TCP
147146 case errRecord :
148- err = rconn .WriteResponse (res )
147+ err = c . rconn .WriteResponse (res )
149148 if err != nil {
150149 c .log ("ERR: %s" , err )
151150 return
@@ -160,37 +159,17 @@ func (c *rtspClient) run() {
160159 // when rtp protocol is TCP, the RTSP connection becomes a RTP connection
161160 // receive RTP data and parse it
162161 if c .rtpProto == "tcp" {
163- packet := make ([]byte , 2048 )
164- bconn := bufio .NewReader (c .nconn )
162+ buf := make ([]byte , 2048 )
165163 for {
166- byts , err := bconn .Peek (4 )
167- if err != nil {
168- return
169- }
170- bconn .Discard (4 )
171-
172- if byts [0 ] != 0x24 {
173- c .log ("ERR: wrong magic byte" )
174- return
175- }
176-
177- if byts [1 ] != 0x00 {
178- c .log ("ERR: wrong channel" )
179- return
180- }
181-
182- plen := binary .BigEndian .Uint16 (byts [2 :])
183- if plen > 2048 {
184- c .log ("ERR: packet len > 2048" )
185- return
186- }
187-
188- _ , err = io .ReadFull (bconn , packet [:plen ])
164+ n , err := c .rconn .ReadInterleavedFrame (buf )
189165 if err != nil {
166+ if err != io .EOF {
167+ c .log ("ERR: %s" , err )
168+ }
190169 return
191170 }
192171
193- c .p .handleRtp (packet [: plen ])
172+ c .p .handleRtp (buf [: n ])
194173 }
195174 }
196175
@@ -199,15 +178,15 @@ func (c *rtspClient) run() {
199178 c .log ("ERR: %s" , err )
200179
201180 if cseq , ok := req .Headers ["cseq" ]; ok {
202- rconn .WriteResponse (& rtsp.Response {
181+ c . rconn .WriteResponse (& rtsp.Response {
203182 StatusCode : 400 ,
204183 Status : "Bad Request" ,
205184 Headers : map [string ]string {
206185 "CSeq" : cseq ,
207186 },
208187 })
209188 } else {
210- rconn .WriteResponse (& rtsp.Response {
189+ c . rconn .WriteResponse (& rtsp.Response {
211190 StatusCode : 400 ,
212191 Status : "Bad Request" ,
213192 })
0 commit comments