BIG rewrite stream info

This commit is contained in:
Alex X
2024-06-15 16:46:03 +03:00
parent ecfe802065
commit 96504e2fb0
88 changed files with 1043 additions and 854 deletions
+1 -1
View File
@@ -71,7 +71,7 @@ func (c *Conn) SetAnswer(answer string) (err error) {
return
}
c.medias = UnmarshalMedias(sd.MediaDescriptions)
c.Medias = UnmarshalMedias(sd.MediaDescriptions)
return nil
}
+35 -16
View File
@@ -1,6 +1,9 @@
package webrtc
import (
"encoding/json"
"fmt"
"strings"
"time"
"github.com/AlexxIT/go2rtc/pkg/core"
@@ -10,28 +13,25 @@ import (
)
type Conn struct {
core.Connection
core.Listener
UserAgent string
Desc string
Mode core.Mode
Mode core.Mode `json:"mode"`
pc *webrtc.PeerConnection
medias []*core.Media
receivers []*core.Receiver
senders []*core.Sender
recv int
send int
offer string
remote string
closed core.Waiter
}
func NewConn(pc *webrtc.PeerConnection) *Conn {
c := &Conn{pc: pc}
c := &Conn{
Connection: core.Connection{
ID: core.NewID(),
FormatName: "webrtc",
},
pc: pc,
}
pc.OnICECandidate(func(candidate *webrtc.ICECandidate) {
// last candidate will be empty
@@ -50,7 +50,15 @@ func NewConn(pc *webrtc.PeerConnection) *Conn {
}
pc.SCTP().Transport().ICETransport().OnSelectedCandidatePairChange(
func(pair *webrtc.ICECandidatePair) {
c.remote = pair.Remote.String()
c.Protocol += "+" + pair.Remote.Protocol.String()
c.RemoteAddr = fmt.Sprintf(
"%s:%d %s", sanitizeIP6(pair.Remote.Address), pair.Remote.Port, pair.Remote.Typ,
)
if pair.Remote.RelatedAddress != "" {
c.RemoteAddr += fmt.Sprintf(
" %s:%d", sanitizeIP6(pair.Remote.RelatedAddress), pair.Remote.RelatedPort,
)
}
},
)
})
@@ -92,7 +100,7 @@ func NewConn(pc *webrtc.PeerConnection) *Conn {
return
}
c.recv += n
c.Recv += n
packet := &rtp.Packet{}
if err := packet.Unmarshal(b[:n]); err != nil {
@@ -121,7 +129,7 @@ func NewConn(pc *webrtc.PeerConnection) *Conn {
switch state {
case webrtc.PeerConnectionStateConnected:
for _, sender := range c.senders {
for _, sender := range c.Senders {
sender.Start()
}
case webrtc.PeerConnectionStateDisconnected, webrtc.PeerConnectionStateFailed, webrtc.PeerConnectionStateClosed:
@@ -134,6 +142,10 @@ func NewConn(pc *webrtc.PeerConnection) *Conn {
return c
}
func (c *Conn) MarshalJSON() ([]byte, error) {
return json.Marshal(c.Connection)
}
func (c *Conn) Close() error {
c.closed.Done(nil)
return c.pc.Close()
@@ -172,7 +184,7 @@ func (c *Conn) getMediaCodec(remote *webrtc.TrackRemote) (*core.Media, *core.Cod
}
// search Media for this MID
for _, media := range c.medias {
for _, media := range c.Medias {
if media.ID != tr.Mid() || media.Direction != core.DirectionRecvonly {
continue
}
@@ -194,3 +206,10 @@ func (c *Conn) getMediaCodec(remote *webrtc.TrackRemote) (*core.Media, *core.Cod
return nil, nil
}
func sanitizeIP6(host string) string {
if strings.IndexByte(host, ':') > 0 {
return "[" + host + "]"
}
return host
}
+4 -19
View File
@@ -1,7 +1,6 @@
package webrtc
import (
"encoding/json"
"errors"
"github.com/AlexxIT/go2rtc/pkg/core"
@@ -12,13 +11,13 @@ import (
)
func (c *Conn) GetMedias() []*core.Media {
return WithResampling(c.medias)
return WithResampling(c.Medias)
}
func (c *Conn) AddTrack(media *core.Media, codec *core.Codec, track *core.Receiver) error {
core.Assert(media.Direction == core.DirectionSendonly)
for _, sender := range c.senders {
for _, sender := range c.Senders {
if sender.Codec == codec {
sender.Bind(track)
return nil
@@ -42,7 +41,7 @@ func (c *Conn) AddTrack(media *core.Media, codec *core.Codec, track *core.Receiv
sender := core.NewSender(media, codec)
sender.Handler = func(packet *rtp.Packet) {
c.send += packet.MarshalSize()
c.Send += packet.MarshalSize()
//important to send with remote PayloadType
_ = localTrack.WriteRTP(payloadType, packet)
}
@@ -85,20 +84,6 @@ func (c *Conn) AddTrack(media *core.Media, codec *core.Codec, track *core.Receiv
sender.HandleRTP(track)
}
c.senders = append(c.senders, sender)
c.Senders = append(c.Senders, sender)
return nil
}
func (c *Conn) MarshalJSON() ([]byte, error) {
info := &core.Info{
Type: c.Desc + " " + c.Mode.String(),
RemoteAddr: c.remote,
UserAgent: c.UserAgent,
Medias: c.medias,
Receivers: c.receivers,
Senders: c.senders,
Recv: c.recv,
Send: c.send,
}
return json.Marshal(info)
}
+2 -12
View File
@@ -8,7 +8,7 @@ import (
func (c *Conn) GetTrack(media *core.Media, codec *core.Codec) (*core.Receiver, error) {
core.Assert(media.Direction == core.DirectionRecvonly)
for _, track := range c.receivers {
for _, track := range c.Receivers {
if track.Codec == codec {
return track, nil
}
@@ -39,7 +39,7 @@ func (c *Conn) GetTrack(media *core.Media, codec *core.Codec) (*core.Receiver, e
}
track := core.NewReceiver(media, codec)
c.receivers = append(c.receivers, track)
c.Receivers = append(c.Receivers, track)
return track, nil
}
@@ -47,13 +47,3 @@ func (c *Conn) Start() error {
c.closed.Wait()
return nil
}
func (c *Conn) Stop() error {
for _, receiver := range c.receivers {
receiver.Close()
}
for _, sender := range c.senders {
sender.Close()
}
return c.pc.Close()
}
+2 -2
View File
@@ -42,7 +42,7 @@ func (c *Conn) SetOffer(offer string) (err error) {
}
}
c.medias = UnmarshalMedias(sd.MediaDescriptions)
c.Medias = UnmarshalMedias(sd.MediaDescriptions)
return
}
@@ -57,7 +57,7 @@ func (c *Conn) GetAnswer() (answer string, err error) {
// disable transceivers if we don't have track, make direction=inactive
transeivers:
for _, tr := range c.pc.GetTransceivers() {
for _, sender := range c.senders {
for _, sender := range c.Senders {
if sender.Media.ID == tr.Mid() {
continue transeivers
}