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"` Database DatabaseConfig `json:"database,omitempty" groups:"api,config"` dbManager *DatabaseManager // 数据库管理器,不序列化 } // 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"` DatabaseEnabled bool `json:"database_enabled" 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 }