Files
lkm/gb28181/talk_stream.go
2025-06-11 16:40:58 +08:00

51 lines
1.2 KiB
Go

package gb28181
import (
"github.com/lkmio/avformat"
"github.com/lkmio/avformat/collections"
"github.com/lkmio/lkm/stream"
"github.com/lkmio/rtp"
)
type TalkStream struct {
*stream.RtpStream
muxer rtp.Muxer
packet []byte
}
func (s *TalkStream) WriteHeader() error {
return nil
}
func (s *TalkStream) Input(packet *avformat.AVPacket, index int) ([]*collections.ReferenceCounter[[]byte], int64, bool, error) {
var size int
s.muxer.Input(packet.Data, uint32(packet.Dts), func() []byte {
return s.packet
}, func(pkt []byte) {
size = len(pkt)
})
packet = &avformat.AVPacket{Data: s.packet[:size]}
return s.RtpStream.Input(packet, index)
}
func NewTalkTransStream(ssrc uint32) (stream.TransStream, error) {
return &TalkStream{
RtpStream: stream.NewRtpTransStream(stream.TransStreamGBTalk, 1024),
muxer: rtp.NewMuxer(8, 0, ssrc),
packet: make([]byte, 1500),
}, nil
}
func TalkTransStreamFactory(_ stream.Source, _ stream.TransStreamProtocol, _ []*stream.Track, sink stream.Sink) (stream.TransStream, error) {
var ssrc uint32 = 0xFFFFFFFF
if sink != nil {
forwardSink, ok := sink.(*stream.ForwardSink)
if ok {
ssrc = forwardSink.GetSSRC()
}
}
return NewTalkTransStream(ssrc)
}