|
|
// Copyright 2020, Chef. All rights reserved.
|
|
|
// https://github.com/q191201771/lal
|
|
|
//
|
|
|
// Use of this source code is governed by a MIT-style license
|
|
|
// that can be found in the License file.
|
|
|
//
|
|
|
// Author: Chef (191201771@qq.com)
|
|
|
|
|
|
package sdp
|
|
|
|
|
|
import (
|
|
|
"encoding/base64"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
|
|
|
"github.com/q191201771/lal/pkg/base"
|
|
|
)
|
|
|
|
|
|
func ParseASC(a *AFmtPBase) ([]byte, error) {
|
|
|
if a.Format != base.RTPPacketTypeAAC {
|
|
|
return nil, ErrSDP
|
|
|
}
|
|
|
|
|
|
v, ok := a.Parameters["config"]
|
|
|
if !ok {
|
|
|
return nil, ErrSDP
|
|
|
}
|
|
|
if len(v) < 4 || (len(v)%2) != 0 {
|
|
|
return nil, ErrSDP
|
|
|
}
|
|
|
l := len(v) / 2
|
|
|
r := make([]byte, l)
|
|
|
for i := 0; i < l; i++ {
|
|
|
b, err := strconv.ParseInt(v[i*2:i*2+2], 16, 0)
|
|
|
if err != nil {
|
|
|
return nil, ErrSDP
|
|
|
}
|
|
|
r[i] = uint8(b)
|
|
|
}
|
|
|
|
|
|
return r, nil
|
|
|
}
|
|
|
|
|
|
func ParseVPSSPSPPS(a *AFmtPBase) (vps, sps, pps []byte, err error) {
|
|
|
v, ok := a.Parameters["sprop-vps"]
|
|
|
if !ok {
|
|
|
return nil, nil, nil, ErrSDP
|
|
|
}
|
|
|
if vps, err = base64.StdEncoding.DecodeString(v); err != nil {
|
|
|
return nil, nil, nil, err
|
|
|
}
|
|
|
|
|
|
v, ok = a.Parameters["sprop-sps"]
|
|
|
if !ok {
|
|
|
return nil, nil, nil, ErrSDP
|
|
|
}
|
|
|
if sps, err = base64.StdEncoding.DecodeString(v); err != nil {
|
|
|
return nil, nil, nil, err
|
|
|
}
|
|
|
|
|
|
v, ok = a.Parameters["sprop-pps"]
|
|
|
if !ok {
|
|
|
return nil, nil, nil, ErrSDP
|
|
|
}
|
|
|
if pps, err = base64.StdEncoding.DecodeString(v); err != nil {
|
|
|
return nil, nil, nil, err
|
|
|
}
|
|
|
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// 解析AVC/H264的sps,pps
|
|
|
// 例子见单元测试
|
|
|
func ParseSPSPPS(a *AFmtPBase) (sps, pps []byte, err error) {
|
|
|
v, ok := a.Parameters["sprop-parameter-sets"]
|
|
|
if !ok {
|
|
|
return nil, nil, ErrSDP
|
|
|
}
|
|
|
|
|
|
items := strings.SplitN(v, ",", 2)
|
|
|
if len(items) != 2 {
|
|
|
return nil, nil, ErrSDP
|
|
|
}
|
|
|
|
|
|
sps, err = base64.StdEncoding.DecodeString(items[0])
|
|
|
if err != nil {
|
|
|
return nil, nil, ErrSDP
|
|
|
}
|
|
|
|
|
|
pps, err = base64.StdEncoding.DecodeString(items[1])
|
|
|
return
|
|
|
}
|