#79 [refactor] package avc: func SplitNALU***, IterateNALU***

pull/200/head^2
q191201771 4 years ago
parent a41dc6d8ee
commit 48a8d8da7b

@ -200,7 +200,7 @@ func analysisVideoTag(tag httpflv.Tag) {
}
} else {
body := tag.Raw[httpflv.TagHeaderSize+5 : len(tag.Raw)-httpflv.PrevTagSizeFieldSize]
nals, err := avc.IterateNALUAVCC(body)
nals, err := avc.SplitNALUAVCC(body)
nazalog.Assert(nil, err)
for _, nal := range nals {

@ -377,33 +377,50 @@ func IterateNALUStartCode(nalu []byte, start int) (pos, length int) {
//
// 具体见单元测试
//
func IterateNALUAnnexB(nals []byte) (nalList [][]byte, err error) {
func SplitNALUAnnexB(nals []byte) (nalList [][]byte, err error) {
err = IterateNALUAnnexB(nals, func(nal []byte) {
nalList = append(nalList, nal)
})
return
}
// 遍历AVCC格式去掉4字节长度获取nal包正常情况下可能返回1个或多个异常情况下可能一个也没有
//
// 具体见单元测试
//
func SplitNALUAVCC(nals []byte) (nalList [][]byte, err error) {
err = IterateNALUAVCC(nals, func(nal []byte) {
nalList = append(nalList, nal)
})
return
}
func IterateNALUAnnexB(nals []byte, handler func(nal []byte)) error {
if nals == nil {
err = ErrAVC
return
return ErrAVC
}
prePos, preLength := IterateNALUStartCode(nals, 0)
if prePos == -1 {
nalList = append(nalList, nals)
err = ErrAVC
return
handler(nals)
return ErrAVC
}
for {
pos, length := IterateNALUStartCode(nals, prePos+preLength)
start := prePos + preLength
pos, length := IterateNALUStartCode(nals, start)
if pos == -1 {
if start < len(nals) {
nalList = append(nalList, nals[start:])
handler(nals[start:])
return nil
} else {
err = ErrAVC
return ErrAVC
}
return
}
if start < pos {
nalList = append(nalList, nals[start:pos])
handler(nals[start:pos])
} else {
err = ErrAVC
return ErrAVC
}
prePos = pos
@ -411,44 +428,34 @@ func IterateNALUAnnexB(nals []byte) (nalList [][]byte, err error) {
}
}
// 遍历AVCC格式去掉4字节长度获取nal包正常情况下可能返回1个或多个异常情况下可能一个也没有
//
// 具体见单元测试
//
func IterateNALUAVCC(nals []byte) (nalList [][]byte, err error) {
func IterateNALUAVCC(nals []byte, handler func(nal []byte)) error {
if nals == nil {
err = ErrAVC
return
return ErrAVC
}
pos := 0
for {
if len(nals[pos:]) < 4 {
err = ErrAVC
return
return ErrAVC
}
length := int(bele.BEUint32(nals[pos:]))
pos += 4
if pos == len(nals) {
err = ErrAVC
return
return ErrAVC
}
epos := pos + length
if epos < len(nals) {
// 非最后一个
nalList = append(nalList, nals[pos:epos])
handler(nals[pos:epos])
pos += length
} else if epos == len(nals) {
// 最后一个
nalList = append(nalList, nals[pos:epos])
return
handler(nals[pos:epos])
return nil
} else {
nalList = append(nalList, nals[pos:])
err = ErrAVC
return
handler(nals[pos:])
return ErrAVC
}
}
}
// TODO(chef)
// func NALUAVCC2AnnexB
// func NALUAnnexB2AVCC
// TODO(chef): 是否需要 func NALUAVCC2AnnexB, func NALUAnnexB2AVCC

@ -240,7 +240,7 @@ func TestIterateNALUAnnexB(t *testing.T) {
},
}
for _, v := range golden {
nalList, err := avc.IterateNALUAnnexB(v.nals)
nalList, err := avc.SplitNALUAnnexB(v.nals)
assert.Equal(t, v.nalList, nalList)
assert.Equal(t, v.err, err, fmt.Sprintf("%+v", v))
}
@ -291,7 +291,7 @@ func TestIterateNALUAVCC(t *testing.T) {
},
}
for _, v := range golden {
nalList, err := avc.IterateNALUAVCC(v.nals)
nalList, err := avc.SplitNALUAVCC(v.nals)
assert.Equal(t, v.nalList, nalList)
assert.Equal(t, v.err, err)
}

@ -128,7 +128,7 @@ func (s *Streamer) feedVideo(msg base.RTMPMsg) {
out := s.videoOut[0:0]
// msg中可能有多个NALU逐个获取
nals, err := avc.IterateNALUAVCC(msg.Payload[5:])
nals, err := avc.SplitNALUAVCC(msg.Payload[5:])
if err != nil {
nazalog.Errorf("[%s] iterate nalu failed. err=%+v, payload=%s", err, s.UniqueKey, hex.Dump(nazastring.SubSliceSafety(msg.Payload, 32)))
return

@ -147,7 +147,7 @@ func AVPacket2FLVTag(pkt base.AVPacket) (tag httpflv.Tag, err error) {
tag.Raw[10] = 0
var nals [][]byte
nals, err = avc.IterateNALUAVCC(pkt.Payload)
nals, err = avc.SplitNALUAVCC(pkt.Payload)
if err != nil {
return
}

@ -139,7 +139,7 @@ func AVPacket2RTMPMsg(pkt base.AVPacket) (msg base.RTMPMsg, err error) {
msg.Payload = make([]byte, msg.Header.MsgLen)
var nals [][]byte
nals, err = avc.IterateNALUAVCC(pkt.Payload)
nals, err = avc.SplitNALUAVCC(pkt.Payload)
if err != nil {
return
}

@ -27,7 +27,7 @@ func (*RTPPackerAVC) Pack(nalu []byte, maxSize int) (ret [][]byte) {
return
}
nals, err := avc.IterateNALUAVCC(nalu)
nals, err := avc.SplitNALUAVCC(nalu)
if err != nil {
return
}

Loading…
Cancel
Save