mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-10-04 07:56:33 +08:00
55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
package h265
|
|
|
|
import "github.com/AlexxIT/go2rtc/pkg/h264"
|
|
|
|
const forbiddenZeroBit = 0x80
|
|
const nalUnitType = 0x3F
|
|
|
|
// Deprecated: DecodeStream - find and return first AU in AVC format
|
|
// useful for processing live streams with unknown separator size
|
|
func DecodeStream(annexb []byte) ([]byte, int) {
|
|
startPos := -1
|
|
|
|
i := 0
|
|
for {
|
|
// search next separator
|
|
if i = h264.IndexFrom(annexb, []byte{0, 0, 1}, i); i < 0 {
|
|
break
|
|
}
|
|
|
|
// move i to next AU
|
|
if i += 3; i >= len(annexb) {
|
|
break
|
|
}
|
|
|
|
// check if AU type valid
|
|
octet := annexb[i]
|
|
if octet&forbiddenZeroBit != 0 {
|
|
continue
|
|
}
|
|
|
|
nalType := (octet >> 1) & nalUnitType
|
|
if startPos >= 0 {
|
|
switch nalType {
|
|
case NALUTypeVPS, NALUTypePFrame:
|
|
if annexb[i-4] == 0 {
|
|
return h264.DecodeAnnexB(annexb[startPos : i-4]), i - 4
|
|
} else {
|
|
return h264.DecodeAnnexB(annexb[startPos : i-3]), i - 3
|
|
}
|
|
}
|
|
} else {
|
|
switch nalType {
|
|
case NALUTypeVPS, NALUTypePFrame:
|
|
if i >= 4 && annexb[i-4] == 0 {
|
|
startPos = i - 4
|
|
} else {
|
|
startPos = i - 3
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil, 0
|
|
}
|