Documentation
¶
Overview ¶
Package codecreg holds the SIP audio codec negotiation registry.
Pre-refactor: pkg/sip/session/negotiate.go 把 pcmu/pcma/g722/opus 的协商规则 用一个大 switch 写死,添加新 codec(例如 G.729 / iLBC / EVS)要同时改:
- NegotiateOffer 的 case 分支
- InternalPCMSampleRate 的 case 分支
- preferred 排序 map
- 容错文案
这个包把每个 codec 抽象成 Descriptor,注册到全局表里。新增 codec 写一个 Descriptor + 在 init() 里 Register 即可,协商代码不再动。
编解码字节流(PCM ↔ 网络字节)的工厂在 pkg/media/encoder/registry.go, 那是单独一层;本包只关心"协商哪个 codec、桥接 PCM 用什么采样率"。
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func InternalPCMSampleRate ¶
func InternalPCMSampleRate(src media.CodecConfig) int
InternalPCMSampleRate 把已协商 codec 桥接到 MediaSession PCM 时用的采样率。 未注册 codec 走最保守的回退:使用 src.SampleRate(若有)或 16 kHz。
func NegotiateOffer ¶
NegotiateOffer 从远端 SDP offer 中挑一个我们支持的 codec。 选择策略:先按本地 Descriptor.Preference 排序,第一个能匹配上的就用。
注意:偏好排序基于"我们注册了的"codec,对端没有 offer 的 codec 自然 不会被选出来。这避免了"远端把奇怪 codec 排前面我们却被迫选它"的坑。
func Register ¶
func Register(d Descriptor)
Register 注册或覆盖一个 codec 描述符。 重复 Register 同名 codec 会覆盖(用例:业务想替换默认 opus 的桥接策略)。
Types ¶
type Descriptor ¶
type Descriptor struct {
Name string
Preference int
BuildNegotiated func(offer sdp.Codec) (media.CodecConfig, sdp.Codec)
InternalPCMRate func(src media.CodecConfig) int
}
Descriptor 描述一种 SIP 音频 codec 的协商规则。
设计:
- Name 全部 lowercase,匹配时统一 ToLower。
- Preference 数值越小越优先,便于在 offer 列表里挑出首选。
- BuildNegotiated 从 offer 的原始 sdp.Codec 派生: (a) 落到媒体 codec config(送给 pkg/media encoder/decoder); (b) 落到 sdp 应答 codec(送回对端);
- InternalPCMRate 决定 MediaSession 内部 PCM 桥的采样率,避免不必要的重采样。
注:BuildNegotiated 永远不应返回 error;如果 offer 字段非法,应在内部 兜底为合理默认(同既有逻辑)。这样负责协商的代码不必对每个 codec 做 if-err。