diff --git a/app/demo/analyseflv/analyseflv.go b/app/demo/analyseflv/analyseflv.go index db6cbd1..a574864 100644 --- a/app/demo/analyseflv/analyseflv.go +++ b/app/demo/analyseflv/analyseflv.go @@ -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 { diff --git a/pkg/avc/avc.go b/pkg/avc/avc.go index dc11540..cdc8cee 100644 --- a/pkg/avc/avc.go +++ b/pkg/avc/avc.go @@ -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 diff --git a/pkg/avc/avc_test.go b/pkg/avc/avc_test.go index a2411e0..395e7a3 100644 --- a/pkg/avc/avc_test.go +++ b/pkg/avc/avc_test.go @@ -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) } diff --git a/pkg/hls/streamer.go b/pkg/hls/streamer.go index 61ce815..d545d50 100644 --- a/pkg/hls/streamer.go +++ b/pkg/hls/streamer.go @@ -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 diff --git a/pkg/remux/avpacket2flv.go b/pkg/remux/avpacket2flv.go index 70abfd9..5872924 100644 --- a/pkg/remux/avpacket2flv.go +++ b/pkg/remux/avpacket2flv.go @@ -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 } diff --git a/pkg/remux/avpacket2rtmp.go b/pkg/remux/avpacket2rtmp.go index 0e01e4c..046f720 100644 --- a/pkg/remux/avpacket2rtmp.go +++ b/pkg/remux/avpacket2rtmp.go @@ -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 } diff --git a/pkg/rtprtcp/rtp_packer_avc.go b/pkg/rtprtcp/rtp_packer_avc.go index 3b457e2..f202137 100644 --- a/pkg/rtprtcp/rtp_packer_avc.go +++ b/pkg/rtprtcp/rtp_packer_avc.go @@ -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 }