Merge pull request #5 from LdDl/master
Handle 302, handle another stream index
This commit is contained in:
commit
dd7f04e5cf
@ -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)
|
||||||
block = append(peek, make([]byte, left)...)
|
if left >= 0 {
|
||||||
if _, err = io.ReadFull(self.brconn, block[len(peek):]); err != nil {
|
block = append(peek, make([]byte, left)...)
|
||||||
|
if _, err = io.ReadFull(self.brconn, block[len(peek):]); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
return
|
return
|
||||||
|
} else {
|
||||||
|
fmt.Println("Left < 0 ", blocklen, len(peek), left)
|
||||||
}
|
}
|
||||||
return
|
|
||||||
}
|
}
|
||||||
stat = 0
|
stat = 0
|
||||||
peek = _peek[0:0]
|
peek = _peek[0:0]
|
||||||
|
@ -110,7 +110,10 @@ func Parse(content string) (sess Session, medias []Media) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
media = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
@ -14,8 +14,9 @@ import (
|
|||||||
var CodecTypes = []av.CodecType{av.H264, av.AAC}
|
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() {
|
||||||
|
Loading…
Reference in New Issue
Block a user