You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
4.6 KiB
Go
124 lines
4.6 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/deepch/vdk/av"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var Storage = NewStreamCore()
|
|
|
|
//Default stream type
|
|
const (
|
|
MSE = iota
|
|
WEBRTC
|
|
RTSP
|
|
)
|
|
|
|
//Default stream status type
|
|
const (
|
|
OFFLINE = iota
|
|
ONLINE
|
|
)
|
|
|
|
//Default stream errors
|
|
var (
|
|
Success = "success"
|
|
ErrorStreamNotFound = errors.New("stream not found")
|
|
ErrorStreamAlreadyExists = errors.New("stream already exists")
|
|
ErrorStreamChannelAlreadyExists = errors.New("stream channel already exists")
|
|
ErrorStreamNotHLSSegments = errors.New("stream hls not ts seq found")
|
|
ErrorStreamNoVideo = errors.New("stream no video")
|
|
ErrorStreamNoClients = errors.New("stream no clients")
|
|
ErrorStreamRestart = errors.New("stream restart")
|
|
ErrorStreamStopCoreSignal = errors.New("stream stop core signal")
|
|
ErrorStreamStopRTSPSignal = errors.New("stream stop rtsp signal")
|
|
ErrorStreamChannelNotFound = errors.New("stream channel not found")
|
|
ErrorStreamChannelCodecNotFound = errors.New("stream channel codec not ready, possible stream offline")
|
|
ErrorStreamsLen0 = errors.New("streams len zero")
|
|
ErrorStreamUnauthorized = errors.New("stream request unauthorized")
|
|
)
|
|
|
|
//StorageST main storage struct
|
|
type StorageST struct {
|
|
mutex sync.RWMutex
|
|
Server ServerST `json:"server" groups:"api,config"`
|
|
Streams map[string]StreamST `json:"streams,omitempty" groups:"api,config"`
|
|
ChannelDefaults ChannelST `json:"channel_defaults,omitempty" groups:"api,config"`
|
|
}
|
|
|
|
//ServerST server storage section
|
|
type ServerST struct {
|
|
Debug bool `json:"debug" groups:"api,config"`
|
|
LogLevel logrus.Level `json:"log_level" groups:"api,config"`
|
|
HTTPDemo bool `json:"http_demo" groups:"api,config"`
|
|
HTTPDebug bool `json:"http_debug" groups:"api,config"`
|
|
HTTPLogin string `json:"http_login" groups:"api,config"`
|
|
HTTPPassword string `json:"http_password" groups:"api,config"`
|
|
HTTPDir string `json:"http_dir" groups:"api,config"`
|
|
HTTPPort string `json:"http_port" groups:"api,config"`
|
|
RTSPPort string `json:"rtsp_port" groups:"api,config"`
|
|
HTTPS bool `json:"https" groups:"api,config"`
|
|
HTTPSPort string `json:"https_port" groups:"api,config"`
|
|
HTTPSCert string `json:"https_cert" groups:"api,config"`
|
|
HTTPSKey string `json:"https_key" groups:"api,config"`
|
|
HTTPSAutoTLSEnable bool `json:"https_auto_tls" groups:"api,config"`
|
|
HTTPSAutoTLSName string `json:"https_auto_tls_name" groups:"api,config"`
|
|
ICEServers []string `json:"ice_servers" groups:"api,config"`
|
|
ICEUsername string `json:"ice_username" groups:"api,config"`
|
|
ICECredential string `json:"ice_credential" groups:"api,config"`
|
|
Token Token `json:"token,omitempty" groups:"api,config"`
|
|
WebRTCPortMin uint16 `json:"webrtc_port_min" groups:"api,config"`
|
|
WebRTCPortMax uint16 `json:"webrtc_port_max" groups:"api,config"`
|
|
}
|
|
|
|
//Token auth
|
|
type Token struct {
|
|
Enable bool `json:"enable" groups:"api,config"`
|
|
Backend string `json:"backend" groups:"api,config"`
|
|
}
|
|
|
|
//ServerST stream storage section
|
|
type StreamST struct {
|
|
Name string `json:"name,omitempty" groups:"api,config"`
|
|
Channels map[string]ChannelST `json:"channels,omitempty" groups:"api,config"`
|
|
}
|
|
|
|
type ChannelST struct {
|
|
Name string `json:"name,omitempty" groups:"api,config"`
|
|
URL string `json:"url,omitempty" groups:"api,config"`
|
|
OnDemand bool `json:"on_demand,omitempty" groups:"api,config"`
|
|
Debug bool `json:"debug,omitempty" groups:"api,config"`
|
|
Status int `json:"status,omitempty" groups:"api"`
|
|
InsecureSkipVerify bool `json:"insecure_skip_verify,omitempty" groups:"api,config"`
|
|
Audio bool `json:"audio,omitempty" groups:"api,config"`
|
|
runLock bool
|
|
codecs []av.CodecData
|
|
sdp []byte
|
|
signals chan int
|
|
hlsSegmentBuffer map[int]SegmentOld
|
|
hlsSegmentNumber int
|
|
clients map[string]ClientST
|
|
ack time.Time
|
|
hlsMuxer *MuxerHLS `json:"-"`
|
|
}
|
|
|
|
//ClientST client storage section
|
|
type ClientST struct {
|
|
mode int
|
|
signals chan int
|
|
outgoingAVPacket chan *av.Packet
|
|
outgoingRTPPacket chan *[]byte
|
|
socket net.Conn
|
|
}
|
|
|
|
//SegmentOld HLS cache section
|
|
type SegmentOld struct {
|
|
dur time.Duration
|
|
data []*av.Packet
|
|
}
|