From 2f1e32821553fab44863f6455b98c98c22d76524 Mon Sep 17 00:00:00 2001 From: Dimitrii Lopanov Date: Fri, 26 Jun 2020 08:28:33 +0300 Subject: [PATCH 1/5] default behaviour for SDP parser --- format/rtsp/sdp/parser.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/format/rtsp/sdp/parser.go b/format/rtsp/sdp/parser.go index 1bf1213..6faf909 100644 --- a/format/rtsp/sdp/parser.go +++ b/format/rtsp/sdp/parser.go @@ -110,7 +110,10 @@ func Parse(content string) (sess Session, medias []Media) { } } + default: + media = nil } + } } return From b652f1bfba3a2e30494425b5c594e2483b5c77d4 Mon Sep 17 00:00:00 2001 From: Dimitrii Lopanov Date: Fri, 26 Jun 2020 08:30:43 +0300 Subject: [PATCH 2/5] find rtsp must have left > 0 --- format/rtsp/client.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/format/rtsp/client.go b/format/rtsp/client.go index 21854b8..907afbd 100644 --- a/format/rtsp/client.go +++ b/format/rtsp/client.go @@ -8,13 +8,6 @@ import ( "encoding/binary" "encoding/hex" "fmt" - "github.com/deepch/vdk/av" - "github.com/deepch/vdk/av/avutil" - "github.com/deepch/vdk/codec" - "github.com/deepch/vdk/codec/aacparser" - "github.com/deepch/vdk/codec/h264parser" - "github.com/deepch/vdk/format/rtsp/sdp" - "github.com/deepch/vdk/utils/bits/pio" "io" "log" "net" @@ -23,6 +16,14 @@ import ( "strconv" "strings" "time" + + "github.com/deepch/vdk/av" + "github.com/deepch/vdk/av/avutil" + "github.com/deepch/vdk/codec" + "github.com/deepch/vdk/codec/aacparser" + "github.com/deepch/vdk/codec/h264parser" + "github.com/deepch/vdk/format/rtsp/sdp" + "github.com/deepch/vdk/utils/bits/pio" ) var ErrCodecDataChange = fmt.Errorf("rtsp: codec data change, please call HandleCodecDataChange()") @@ -440,11 +441,15 @@ func (self *Client) findRTSP() (block []byte, data []byte, err error) { } if blocklen, _, ok := self.parseBlockHeader(peek); ok { left := blocklen + 4 - len(peek) - block = append(peek, make([]byte, left)...) - if _, err = io.ReadFull(self.brconn, block[len(peek):]); err != nil { + if left >= 0 { + block = append(peek, make([]byte, left)...) + if _, err = io.ReadFull(self.brconn, block[len(peek):]); err != nil { + return + } return + } else { + fmt.Println("Left < 0 ", blocklen, len(peek), left) } - return } stat = 0 peek = _peek[0:0] From ce2edddbebd9b51114cb644307aed41731509d37 Mon Sep 17 00:00:00 2001 From: Dimitrii Lopanov Date: Fri, 26 Jun 2020 08:32:49 +0300 Subject: [PATCH 3/5] handle redirecting via 302 code --- format/rtsp/client.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/format/rtsp/client.go b/format/rtsp/client.go index 907afbd..0238c62 100644 --- a/format/rtsp/client.go +++ b/format/rtsp/client.go @@ -310,6 +310,11 @@ func (self *Client) handleResp(res *Response) (err error) { self.session = fields[0] } } + if res.StatusCode == 302 { + if err = self.handle302(res); err != nil { + return + } + } if res.StatusCode == 401 { if err = self.handle401(res); err != nil { return @@ -318,6 +323,31 @@ func (self *Client) handleResp(res *Response) (err error) { return } +func (self *Client) handle302(res *Response) (err error) { + /* + RTSP/1.0 200 OK + CSeq: 302 + */ + newLocation := res.Headers.Get("Location") + fmt.Printf("\tRedirecting stream to other location: %s\n", newLocation) + + err = self.Close() + if err != nil { + return err + } + + newConnect, err := Dial(newLocation) + if err != nil { + return err + } + + self.requestUri = newLocation + self.conn = newConnect.conn + self.brconn = newConnect.brconn + + return err +} + func (self *Client) handle401(res *Response) (err error) { /* RTSP/1.0 401 Unauthorized From 0435cfa11ad4acdd9b01c73b242a6b372cdfc281 Mon Sep 17 00:00:00 2001 From: Dimitrii Lopanov Date: Fri, 26 Jun 2020 08:34:23 +0300 Subject: [PATCH 4/5] handle panic error on non-existing packet index (for audio, as example) --- format/ts/muxer.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/format/ts/muxer.go b/format/ts/muxer.go index 4394975..7b6f365 100644 --- a/format/ts/muxer.go +++ b/format/ts/muxer.go @@ -154,6 +154,9 @@ func (self *Muxer) WriteHeader(streams []av.CodecData) (err error) { } func (self *Muxer) WritePacket(pkt av.Packet) (err error) { + if int(pkt.Idx) >= len(self.streams) { + return fmt.Errorf("Wrong stream index: %d", pkt.Idx) + } stream := self.streams[pkt.Idx] pkt.Time += time.Second From 4f6b86b2978fbc3d6cd18e91b6cd1afcada3f959 Mon Sep 17 00:00:00 2001 From: Dimitrii Lopanov Date: Fri, 26 Jun 2020 08:41:55 +0300 Subject: [PATCH 5/5] more smart handling of another packat index (audio, as example) --- format/ts/muxer.go | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/format/ts/muxer.go b/format/ts/muxer.go index 7b6f365..7551590 100644 --- a/format/ts/muxer.go +++ b/format/ts/muxer.go @@ -14,8 +14,9 @@ import ( var CodecTypes = []av.CodecType{av.H264, av.AAC} type Muxer struct { - w io.Writer - streams []*Stream + w io.Writer + streams map[int]*Stream + PaddingToMakeCounterCont bool psidata []byte @@ -42,7 +43,7 @@ func NewMuxer(w io.Writer) *Muxer { } } -func (self *Muxer) newStream(codec av.CodecData) (err error) { +func (self *Muxer) newStream(idx int, codec av.CodecData) (err error) { ok := false for _, c := range CodecTypes { if codec.Type() == c { @@ -55,14 +56,14 @@ func (self *Muxer) newStream(codec av.CodecData) (err error) { return } - pid := uint16(len(self.streams) + 0x100) + pid := uint16(idx + 0x100) stream := &Stream{ muxer: self, CodecData: codec, pid: pid, tsw: tsio.NewTSWriter(pid), } - self.streams = append(self.streams, stream) + self.streams[idx] = stream return } @@ -140,10 +141,11 @@ func (self *Muxer) WritePATPMT() (err error) { } func (self *Muxer) WriteHeader(streams []av.CodecData) (err error) { - self.streams = []*Stream{} - for _, stream := range streams { - if err = self.newStream(stream); err != nil { - return + self.streams = map[int]*Stream{} + + for idx, stream := range streams { + if err = self.newStream(idx, stream); err != nil { + fmt.Println(err) } } @@ -154,10 +156,14 @@ func (self *Muxer) WriteHeader(streams []av.CodecData) (err error) { } func (self *Muxer) WritePacket(pkt av.Packet) (err error) { - if int(pkt.Idx) >= len(self.streams) { - return fmt.Errorf("Wrong stream index: %d", pkt.Idx) + var stream *Stream = nil + + stream, ok := self.streams[int(pkt.Idx)] + if !ok { + fmt.Printf("Warning, unsupported stream index: %d\n", pkt.Idx) + return } - stream := self.streams[pkt.Idx] + pkt.Time += time.Second switch stream.Type() {