mirror of
https://github.com/lkmio/lkm.git
synced 2025-09-26 19:21:14 +08:00
86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
package jt1078
|
|
|
|
import (
|
|
"github.com/lkmio/avformat/utils"
|
|
"github.com/lkmio/lkm/log"
|
|
"github.com/lkmio/lkm/stream"
|
|
"github.com/lkmio/transport"
|
|
"net"
|
|
"strconv"
|
|
)
|
|
|
|
type Session struct {
|
|
stream.PublishSource
|
|
decoder *transport.DelimiterFrameDecoder
|
|
receiveBuffer []byte
|
|
}
|
|
|
|
func (s *Session) Input(data []byte) (int, error) {
|
|
var n int
|
|
for length := len(data); n < length; {
|
|
i, bytes, err := s.decoder.Input(data[n:])
|
|
if err != nil {
|
|
return -1, err
|
|
} else if len(bytes) < 1 {
|
|
break
|
|
}
|
|
|
|
n += i
|
|
demuxer := s.TransDemuxer.(*Demuxer)
|
|
firstOfPacket := demuxer.prevPacket == nil
|
|
_, err = s.PublishSource.Input(bytes)
|
|
if err != nil {
|
|
return -1, err
|
|
}
|
|
|
|
// 首包处理, hook通知
|
|
if firstOfPacket && demuxer.prevPacket != nil {
|
|
s.SetID(demuxer.sim + "/" + strconv.Itoa(demuxer.channel))
|
|
|
|
go func() {
|
|
_, state := stream.PreparePublishSource(s, true)
|
|
if utils.HookStateOK != state {
|
|
log.Sugar.Errorf("1078推流失败 source: %s", demuxer.sim)
|
|
|
|
if s.Conn != nil {
|
|
s.Conn.Close()
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
}
|
|
|
|
return 0, nil
|
|
}
|
|
|
|
func (s *Session) Close() {
|
|
log.Sugar.Infof("1078推流结束 %s", s.String())
|
|
|
|
if s.Conn != nil {
|
|
s.Conn.Close()
|
|
s.Conn = nil
|
|
}
|
|
|
|
s.PublishSource.Close()
|
|
stream.TCPReceiveBufferPool.Put(s.receiveBuffer[:cap(s.receiveBuffer)])
|
|
}
|
|
|
|
func NewSession(conn net.Conn) *Session {
|
|
delimiter := [4]byte{0x30, 0x31, 0x63, 0x64}
|
|
session := Session{
|
|
PublishSource: stream.PublishSource{
|
|
Conn: conn,
|
|
Type: stream.SourceType1078,
|
|
TransDemuxer: NewDemuxer(),
|
|
},
|
|
|
|
decoder: transport.NewDelimiterFrameDecoder(1024*1024*2, delimiter[:]),
|
|
receiveBuffer: stream.TCPReceiveBufferPool.Get().([]byte),
|
|
}
|
|
|
|
session.TransDemuxer.SetHandler(&session)
|
|
session.Init()
|
|
stream.LoopEvent(&session)
|
|
return &session
|
|
}
|