141 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package rtspv2
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"math/rand"
 | |
| 	"net"
 | |
| 	"net/url"
 | |
| 	"time"
 | |
| 
 | |
| 	"git.r-2.top/kunmeng/vdk/av"
 | |
| )
 | |
| 
 | |
| 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
 | |
| }
 | 
