Merge pull request #5 from LdDl/master

Handle 302, handle another stream index
This commit is contained in:
Andrey Semochkin 2020-06-26 12:02:26 +04:00 committed by GitHub
commit dd7f04e5cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 67 additions and 20 deletions

View File

@ -8,13 +8,6 @@ import (
"encoding/binary" "encoding/binary"
"encoding/hex" "encoding/hex"
"fmt" "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" "io"
"log" "log"
"net" "net"
@ -23,6 +16,14 @@ import (
"strconv" "strconv"
"strings" "strings"
"time" "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()") var ErrCodecDataChange = fmt.Errorf("rtsp: codec data change, please call HandleCodecDataChange()")
@ -309,6 +310,11 @@ func (self *Client) handleResp(res *Response) (err error) {
self.session = fields[0] self.session = fields[0]
} }
} }
if res.StatusCode == 302 {
if err = self.handle302(res); err != nil {
return
}
}
if res.StatusCode == 401 { if res.StatusCode == 401 {
if err = self.handle401(res); err != nil { if err = self.handle401(res); err != nil {
return return
@ -317,6 +323,31 @@ func (self *Client) handleResp(res *Response) (err error) {
return 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) { func (self *Client) handle401(res *Response) (err error) {
/* /*
RTSP/1.0 401 Unauthorized RTSP/1.0 401 Unauthorized
@ -440,11 +471,15 @@ func (self *Client) findRTSP() (block []byte, data []byte, err error) {
} }
if blocklen, _, ok := self.parseBlockHeader(peek); ok { if blocklen, _, ok := self.parseBlockHeader(peek); ok {
left := blocklen + 4 - len(peek) left := blocklen + 4 - len(peek)
if left >= 0 {
block = append(peek, make([]byte, left)...) block = append(peek, make([]byte, left)...)
if _, err = io.ReadFull(self.brconn, block[len(peek):]); err != nil { if _, err = io.ReadFull(self.brconn, block[len(peek):]); err != nil {
return return
} }
return return
} else {
fmt.Println("Left < 0 ", blocklen, len(peek), left)
}
} }
stat = 0 stat = 0
peek = _peek[0:0] peek = _peek[0:0]

View File

@ -110,7 +110,10 @@ func Parse(content string) (sess Session, medias []Media) {
} }
} }
default:
media = nil
} }
} }
} }
return return

View File

@ -15,7 +15,8 @@ var CodecTypes = []av.CodecType{av.H264, av.AAC}
type Muxer struct { type Muxer struct {
w io.Writer w io.Writer
streams []*Stream streams map[int]*Stream
PaddingToMakeCounterCont bool PaddingToMakeCounterCont bool
psidata []byte 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 ok := false
for _, c := range CodecTypes { for _, c := range CodecTypes {
if codec.Type() == c { if codec.Type() == c {
@ -55,14 +56,14 @@ func (self *Muxer) newStream(codec av.CodecData) (err error) {
return return
} }
pid := uint16(len(self.streams) + 0x100) pid := uint16(idx + 0x100)
stream := &Stream{ stream := &Stream{
muxer: self, muxer: self,
CodecData: codec, CodecData: codec,
pid: pid, pid: pid,
tsw: tsio.NewTSWriter(pid), tsw: tsio.NewTSWriter(pid),
} }
self.streams = append(self.streams, stream) self.streams[idx] = stream
return return
} }
@ -140,10 +141,11 @@ func (self *Muxer) WritePATPMT() (err error) {
} }
func (self *Muxer) WriteHeader(streams []av.CodecData) (err error) { func (self *Muxer) WriteHeader(streams []av.CodecData) (err error) {
self.streams = []*Stream{} self.streams = map[int]*Stream{}
for _, stream := range streams {
if err = self.newStream(stream); err != nil { for idx, stream := range streams {
return if err = self.newStream(idx, stream); err != nil {
fmt.Println(err)
} }
} }
@ -154,7 +156,14 @@ func (self *Muxer) WriteHeader(streams []av.CodecData) (err error) {
} }
func (self *Muxer) WritePacket(pkt av.Packet) (err error) { func (self *Muxer) WritePacket(pkt av.Packet) (err error) {
stream := self.streams[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
}
pkt.Time += time.Second pkt.Time += time.Second
switch stream.Type() { switch stream.Type() {