mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-11-02 12:34:08 +08:00
80 lines
1.4 KiB
Go
80 lines
1.4 KiB
Go
package mpegts
|
|
|
|
import (
|
|
"github.com/AlexxIT/go2rtc/pkg/core"
|
|
"net/http"
|
|
)
|
|
|
|
type Client struct {
|
|
core.Listener
|
|
|
|
medias []*core.Media
|
|
receivers []*core.Receiver
|
|
|
|
res *http.Response
|
|
|
|
recv int
|
|
}
|
|
|
|
func NewClient(res *http.Response) *Client {
|
|
return &Client{res: res}
|
|
}
|
|
|
|
func (c *Client) Handle() error {
|
|
reader := NewReader()
|
|
|
|
b := make([]byte, 1024*1024*256) // 256K
|
|
|
|
probe := core.NewProbe(c.medias == nil)
|
|
for probe == nil || probe.Active() {
|
|
n, err := c.res.Body.Read(b)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.recv += n
|
|
|
|
reader.AppendBuffer(b[:n])
|
|
|
|
reading:
|
|
for {
|
|
packet := reader.GetPacket()
|
|
if packet == nil {
|
|
break
|
|
}
|
|
|
|
for _, receiver := range c.receivers {
|
|
if receiver.ID == packet.PayloadType {
|
|
receiver.WriteRTP(packet)
|
|
continue reading
|
|
}
|
|
}
|
|
|
|
// count track on probe state even if not support it
|
|
probe.Append(packet.PayloadType)
|
|
|
|
media := GetMedia(packet)
|
|
if media == nil {
|
|
continue // unsupported codec
|
|
}
|
|
|
|
c.medias = append(c.medias, media)
|
|
|
|
receiver := core.NewReceiver(media, media.Codecs[0])
|
|
receiver.ID = packet.PayloadType
|
|
c.receivers = append(c.receivers, receiver)
|
|
|
|
receiver.WriteRTP(packet)
|
|
|
|
//log.Printf("[AVC] %v, len: %d, pts: %d ts: %10d", h264.Types(packet.Payload), len(packet.Payload), pkt.PTS, packet.Timestamp)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (c *Client) Close() error {
|
|
_ = c.res.Body.Close()
|
|
return nil
|
|
}
|