mirror of
https://github.com/flavioribeiro/donut.git
synced 2025-09-27 19:32:08 +08:00
60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
package controllers
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
|
|
"github.com/flavioribeiro/donut/internal/entities"
|
|
)
|
|
|
|
func ParseNALUs(data []byte) (entities.NALUs, error) {
|
|
var nalus entities.NALUs
|
|
|
|
rawNALUs := bytes.Split(data, []byte{0x00, 0x00, 0x01})
|
|
|
|
for _, rawNALU := range rawNALUs[1:] {
|
|
nal, err := ParseNAL(rawNALU)
|
|
if err != nil {
|
|
return entities.NALUs{}, err
|
|
|
|
}
|
|
nalus.Units = append(nalus.Units, nal)
|
|
}
|
|
|
|
return nalus, nil
|
|
}
|
|
|
|
func ParseNAL(data []byte) (entities.NAL, error) {
|
|
index := 0
|
|
n := entities.NAL{}
|
|
if data[index]>>7&0x01 != 0 {
|
|
return entities.NAL{}, fmt.Errorf("forbidden_zero_bit is not 0")
|
|
}
|
|
n.RefIDC = (data[index] >> 5) & 0x03
|
|
n.UnitType = entities.NALUnitType(data[index] & 0x1f)
|
|
numBytesInRBSP := 0
|
|
nalUnitHeaderBytes := 1
|
|
n.HeaderBytes = data[:nalUnitHeaderBytes]
|
|
|
|
index += nalUnitHeaderBytes
|
|
|
|
n.RBSPByte = make([]byte, 0, 16)
|
|
i := 0
|
|
for i = index; i < len(data); i++ {
|
|
if (i+2) < len(data) && (data[i] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x03) {
|
|
n.RBSPByte = append(n.RBSPByte, data[i], data[i+1])
|
|
i += 2
|
|
numBytesInRBSP += 2
|
|
// 0x03
|
|
} else {
|
|
n.RBSPByte = append(n.RBSPByte, data[i])
|
|
numBytesInRBSP++
|
|
}
|
|
}
|
|
index += numBytesInRBSP
|
|
|
|
n.ParseRBSP()
|
|
|
|
return n, nil
|
|
}
|