mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-10-05 16:26:50 +08:00
85 lines
1.6 KiB
Go
85 lines
1.6 KiB
Go
package dvrip
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"time"
|
|
|
|
"github.com/AlexxIT/go2rtc/pkg/core"
|
|
"github.com/pion/rtp"
|
|
)
|
|
|
|
type Consumer struct {
|
|
core.SuperConsumer
|
|
client *Client
|
|
}
|
|
|
|
func (c *Consumer) GetTrack(media *core.Media, codec *core.Codec) (*core.Receiver, error) {
|
|
return nil, core.ErrCantGetTrack
|
|
}
|
|
|
|
func (c *Consumer) Start() error {
|
|
if err := c.client.conn.SetReadDeadline(time.Time{}); err != nil {
|
|
return err
|
|
}
|
|
|
|
b := make([]byte, 4096)
|
|
for {
|
|
if _, err := c.client.rd.Read(b); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
func (c *Consumer) Stop() error {
|
|
_ = c.SuperConsumer.Close()
|
|
return c.client.Close()
|
|
}
|
|
|
|
func (c *Consumer) AddTrack(media *core.Media, _ *core.Codec, track *core.Receiver) error {
|
|
if err := c.client.Talk(); err != nil {
|
|
return err
|
|
}
|
|
|
|
const PacketSize = 320
|
|
|
|
buf := make([]byte, 8+PacketSize)
|
|
binary.BigEndian.PutUint32(buf, 0x1FA)
|
|
|
|
switch track.Codec.Name {
|
|
case core.CodecPCMU:
|
|
buf[4] = 10
|
|
case core.CodecPCMA:
|
|
buf[4] = 14
|
|
}
|
|
|
|
//for i, rate := range sampleRates {
|
|
// if rate == track.Codec.ClockRate {
|
|
// buf[5] = byte(i) + 1
|
|
// break
|
|
// }
|
|
//}
|
|
buf[5] = 2 // ClockRate=8000
|
|
|
|
binary.LittleEndian.PutUint16(buf[6:], PacketSize)
|
|
|
|
var payload []byte
|
|
|
|
sender := core.NewSender(media, track.Codec)
|
|
sender.Handler = func(packet *rtp.Packet) {
|
|
payload = append(payload, packet.Payload...)
|
|
|
|
for len(payload) >= PacketSize {
|
|
buf = append(buf[:8], payload[:PacketSize]...)
|
|
if n, err := c.client.WriteCmd(OPTalkData, buf); err != nil {
|
|
c.Send += n
|
|
}
|
|
|
|
payload = payload[PacketSize:]
|
|
}
|
|
}
|
|
|
|
sender.HandleRTP(track)
|
|
c.Senders = append(c.Senders, sender)
|
|
return nil
|
|
}
|