fix: send rtcp

This commit is contained in:
langhuihui
2024-11-30 22:56:13 +08:00
parent 2eb847c0c4
commit 305ef1834a
2 changed files with 42 additions and 12 deletions

View File

@@ -21,26 +21,52 @@ func ParseLevel(level string) slog.Level {
return lv.Level() return lv.Level()
} }
type HandlerInfo struct {
slog.Handler
origin slog.Handler
}
type MultiLogHandler struct { type MultiLogHandler struct {
handlers []slog.Handler handlers []HandlerInfo
attrChildren sync.Map attrChildren, groupChildren sync.Map
parentLevel *slog.Level parentLevel *slog.Level
level *slog.Level level *slog.Level
} }
func (m *MultiLogHandler) Add(h slog.Handler) { func (m *MultiLogHandler) Add(h slog.Handler) {
m.handlers = append(m.handlers, h) m.add(h, h)
}
func (m *MultiLogHandler) add(origin slog.Handler, warp slog.Handler) {
m.handlers = append(m.handlers, HandlerInfo{origin: origin, Handler: warp})
m.attrChildren.Range(func(key, value any) bool { m.attrChildren.Range(func(key, value any) bool {
child := key.(*MultiLogHandler) child := key.(*MultiLogHandler)
child.Add(h.WithAttrs(value.([]slog.Attr))) child.add(origin, origin.WithAttrs(value.([]slog.Attr)))
return true
})
m.groupChildren.Range(func(key, value any) bool {
child := key.(*MultiLogHandler)
child.add(origin, origin.WithGroup(value.(string)))
return true return true
}) })
} }
func (m *MultiLogHandler) Remove(h slog.Handler) { func (m *MultiLogHandler) Remove(h slog.Handler) {
if i := slices.Index(m.handlers, h); i != -1 { if i := slices.IndexFunc(m.handlers, func(info HandlerInfo) bool {
return info.origin == h
}); i != -1 {
m.handlers = slices.Delete(m.handlers, i, i+1) m.handlers = slices.Delete(m.handlers, i, i+1)
} }
m.attrChildren.Range(func(key, value any) bool {
child := key.(*MultiLogHandler)
child.Remove(h)
return true
})
m.groupChildren.Range(func(key, value any) bool {
child := key.(*MultiLogHandler)
child.Remove(h)
return true
})
} }
func (m *MultiLogHandler) SetLevel(level slog.Level) { func (m *MultiLogHandler) SetLevel(level slog.Level) {
@@ -72,7 +98,7 @@ func (m *MultiLogHandler) Handle(ctx context.Context, rec slog.Record) error {
// WithAttrs implements slog.Handler. // WithAttrs implements slog.Handler.
func (m *MultiLogHandler) WithAttrs(attrs []slog.Attr) slog.Handler { func (m *MultiLogHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
result := &MultiLogHandler{ result := &MultiLogHandler{
handlers: make([]slog.Handler, len(m.handlers)), handlers: make([]HandlerInfo, len(m.handlers)),
parentLevel: m.parentLevel, parentLevel: m.parentLevel,
} }
m.attrChildren.Store(result, attrs) m.attrChildren.Store(result, attrs)
@@ -80,7 +106,7 @@ func (m *MultiLogHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
result.parentLevel = m.level result.parentLevel = m.level
} }
for i, h := range m.handlers { for i, h := range m.handlers {
result.handlers[i] = h.WithAttrs(attrs) result.handlers[i] = HandlerInfo{origin: h.origin, Handler: h.WithAttrs(attrs)}
} }
return result return result
} }
@@ -88,14 +114,15 @@ func (m *MultiLogHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
// WithGroup implements slog.Handler. // WithGroup implements slog.Handler.
func (m *MultiLogHandler) WithGroup(name string) slog.Handler { func (m *MultiLogHandler) WithGroup(name string) slog.Handler {
result := &MultiLogHandler{ result := &MultiLogHandler{
handlers: make([]slog.Handler, len(m.handlers)), handlers: make([]HandlerInfo, len(m.handlers)),
parentLevel: m.parentLevel, parentLevel: m.parentLevel,
} }
m.groupChildren.Store(result, name)
if m.level != nil { if m.level != nil {
result.parentLevel = m.level result.parentLevel = m.level
} }
for i, h := range m.handlers { for i, h := range m.handlers {
result.handlers[i] = h.WithGroup(name) result.handlers[i] = HandlerInfo{origin: h.origin, Handler: h.WithGroup(name)}
} }
return result return result
} }

View File

@@ -176,8 +176,11 @@ func (r *Receiver) Receive() (err error) {
if err != nil { if err != nil {
return err return err
} }
length := len(rawRR) + len(rawSDES)
rtcp := append([]byte{'$', 0x03, byte(length >> 8), byte(length)}, rawRR...)
rtcp = append(rtcp, rawSDES...)
// Send RTCP packets // Send RTCP packets
if _, err = r.NetConnection.Write(append(rawRR, rawSDES...)); err != nil { if _, err = r.NetConnection.Write(rtcp); err != nil {
return err return err
} }
} }