diff --git a/pkg/h264/annexb.go b/pkg/h264/annexb.go index c59989f0..693b6097 100644 --- a/pkg/h264/annexb.go +++ b/pkg/h264/annexb.go @@ -65,14 +65,23 @@ outer: return ret, nil } +func annexBEncodeSize(nalus [][]byte) int { + n := 0 + for _, nalu := range nalus { + n += 4 + len(nalu) + } + return n +} + // AnnexBEncode encodes NALUs into the Annex-B stream format. func AnnexBEncode(nalus [][]byte) ([]byte, error) { - var ret []byte + buf := make([]byte, annexBEncodeSize(nalus)) + pos := 0 for _, nalu := range nalus { - ret = append(ret, []byte{0x00, 0x00, 0x00, 0x01}...) - ret = append(ret, nalu...) + pos += copy(buf[pos:], []byte{0x00, 0x00, 0x00, 0x01}) + pos += copy(buf[pos:], nalu) } - return ret, nil + return buf, nil } diff --git a/pkg/h264/avcc.go b/pkg/h264/avcc.go index c3324262..8db073df 100644 --- a/pkg/h264/avcc.go +++ b/pkg/h264/avcc.go @@ -32,24 +32,25 @@ func AVCCDecode(byts []byte) ([][]byte, error) { return ret, nil } +func avccEncodeSize(nalus [][]byte) int { + n := 0 + for _, nalu := range nalus { + n += 4 + len(nalu) + } + return n +} + // AVCCEncode encodes NALUs into the AVCC stream format. func AVCCEncode(nalus [][]byte) ([]byte, error) { - le := 0 - for _, nalu := range nalus { - le += 4 + len(nalu) - } - - ret := make([]byte, le) + buf := make([]byte, avccEncodeSize(nalus)) pos := 0 for _, nalu := range nalus { - ln := len(nalu) - binary.BigEndian.PutUint32(ret[pos:], uint32(ln)) + binary.BigEndian.PutUint32(buf[pos:], uint32(len(nalu))) pos += 4 - copy(ret[pos:], nalu) - pos += ln + pos += copy(buf[pos:], nalu) } - return ret, nil + return buf, nil }