vdk/format/rtspv2/server.go

141 lines
2.4 KiB
Go
Raw Normal View History

2021-09-25 22:37:55 +08:00
package rtspv2
import (
"fmt"
"math/rand"
"net"
"net/url"
"time"
"git.r-2.top/kunmeng/vdk/av"
2021-09-25 22:37:55 +08:00
)
const (
StartCodePS = 0x000001ba
StartCodeSYS = 0x000001bb
StartCodeMAP = 0x000001bc
StartCodeVideo = 0x000001e0
StartCodeAudio = 0x000001c0
MEPGProgramEndCode = 0x000001b9
)
const (
StreamIDVideo = 0xe0
StreamIDAudio = 0xc0
)
const (
UDPTransfer int = 0
TCPTransferActive int = 1
TCPTransferPassive int = 2
LocalCache int = 3
)
const (
StreamTypeH264 = 0x1b
StreamTypeH265 = 0x24
StreamTypeAAC = 0x90
)
type encPSPacket struct {
crc32 uint64
}
type Conn struct {
URL *url.URL
netconn net.Conn
readbuf []byte
writebuf []byte
playing bool
psEnc *encPSPacket
cseq int
ssrc uint32
protocol int
}
type Server struct {
Addr string
HandleDescribe func(*Conn)
HandleOptions func(*Conn)
HandleSetup func(*Conn)
HandlePlay func(*Conn)
HandleConn func(*Conn)
}
func NewConn(netconn net.Conn) *Conn {
conn := &Conn{}
conn.netconn = netconn
conn.writebuf = make([]byte, 4096)
conn.readbuf = make([]byte, 4096)
conn.ssrc = rand.Uint32()
conn.protocol = TCPTransferPassive
return conn
}
func (self *Conn) Close() (err error) {
return nil
}
func (self *Conn) WritePacket(pkt *av.Packet) (err error) {
return nil
}
func timeToTs(tm time.Duration, timeScale int64) int64 {
return int64(tm * time.Duration(timeScale) / time.Second)
}
func (self *Conn) WriteHeader(codec []av.CodecData) (err error) {
return nil
}
func (self *Conn) NetConn() net.Conn {
return self.netconn
}
func (self *Server) ListenAndServe() (err error) {
addr := self.Addr
if addr == "" {
addr = ":554"
}
var tcpaddr *net.TCPAddr
if tcpaddr, err = net.ResolveTCPAddr("tcp", addr); err != nil {
err = fmt.Errorf("rtsp: ListenAndServe: %s", err)
return
}
var listener *net.TCPListener
if listener, err = net.ListenTCP("tcp", tcpaddr); err != nil {
return
}
if Debug {
fmt.Println("rtsp: server: listening on", addr)
}
for {
var netconn net.Conn
if netconn, err = listener.Accept(); err != nil {
return
}
if Debug {
fmt.Println("rtsp: server: accepted")
}
conn := NewConn(netconn)
go func() {
err := self.handleConn(conn)
if Debug {
fmt.Println("rtsp: server: client closed err:", err)
}
//defer conn.Close()
}()
}
}
func (self *Server) handleConn(conn *Conn) (err error) {
return
}
func (self *Conn) prepare() error {
return nil
}