You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lal/pkg/h2645/h2645.go

114 lines
3.0 KiB
Go

// Copyright 2022, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package h2645
import (
"github.com/q191201771/lal/pkg/avc"
"github.com/q191201771/lal/pkg/hevc"
"github.com/q191201771/naza/pkg/bele"
)
// TODO(chef): 逐渐将package avc, hevc迁移到package h2645这个package处于开发阶段如果内容不全请使用package avc, hevc
// 无特殊说明的函数则同时支持h264和h265两种格式
var (
NaluStartCode4 = []byte{0x0, 0x0, 0x0, 0x1}
)
const (
H264NaluTypeSlice uint8 = 1
H264NaluTypeIdrSlice uint8 = 5
H264NaluTypeSei uint8 = 6
H264NaluTypeSps uint8 = 7
H264NaluTypePps uint8 = 8
H264NaluTypeAud uint8 = 9 // Access Unit Delimiter
H264NaluTypeFd uint8 = 12 // Filler Data
)
// ISO_IEC_23008-2_2013.pdf
// Table 7-1 NAL unit type codes and NAL unit type classes
const (
H265NaluTypeSliceTrailN uint8 = 0 // 0x0
H265NaluTypeSliceTrailR uint8 = 1 // 0x01
H265NaluTypeSliceTsaN uint8 = 2 // 0x02
H265NaluTypeSliceTsaR uint8 = 3 // 0x03
H265NaluTypeSliceStsaN uint8 = 4 // 0x04
H265NaluTypeSliceStsaR uint8 = 5 // 0x05
H265NaluTypeSliceRadlN uint8 = 6 // 0x06
H265NaluTypeSliceRadlR uint8 = 7 // 0x07
H265NaluTypeSliceRaslN uint8 = 8 // 0x06
H265NaluTypeSliceRaslR uint8 = 9 // 0x09
H265NaluTypeSliceBlaWlp uint8 = 16 // 0x10
H265NaluTypeSliceBlaWradl uint8 = 17 // 0x11
H265NaluTypeSliceBlaNlp uint8 = 18 // 0x12
H265NaluTypeSliceIdr uint8 = 19 // 0x13
H265NaluTypeSliceIdrNlp uint8 = 20 // 0x14
H265NaluTypeSliceCranut uint8 = 21 // 0x15
H265NaluTypeSliceRsvIrapVcl22 uint8 = 22 // 0x16
H265NaluTypeSliceRsvIrapVcl23 uint8 = 23 // 0x17
H265NaluTypeVps uint8 = 32 // 0x20
H265NaluTypeSps uint8 = 33 // 0x21
H265NaluTypePps uint8 = 34 // 0x22
H265NaluTypeAud uint8 = 35 // 0x23
H265NaluTypeSei uint8 = 39 // 0x27
H265NaluTypeSeiSuffix uint8 = 40 // 0x28
)
// IterateNaluAvcc 遍历Avcc格式的nalu流
func IterateNaluAvcc(nals []byte, handler func(nal []byte)) error {
return avc.IterateNaluAvcc(nals, handler)
}
func IterateNaluStartCode(nalu []byte, start int) (pos, length int) {
return avc.IterateNaluStartCode(nalu, start)
}
func ParseNaluType(isH264 bool, v uint8) uint8 {
if isH264 {
return avc.ParseNaluType(v)
}
return hevc.ParseNaluType(v)
}
func SeqHeader2Annexb(isH264 bool, payload []byte) ([]byte, error) {
if isH264 {
return avc.SpsPpsSeqHeader2Annexb(payload)
}
return hevc.VpsSpsPpsSeqHeader2Annexb(payload)
}
func H265IsIrapNalu(typ uint8) bool {
return hevc.IsIrapNalu(typ)
}
func JoinNaluAvcc(naluList ...[]byte) []byte {
n := len(naluList)
if n == 0 {
return nil
}
n *= 4
for _, item := range naluList {
n += len(item)
}
ret := make([]byte, n)
pos := 0
for _, item := range naluList {
bele.BePutUint32(ret[pos:], uint32(len(item)))
pos += 4
copy(ret[pos:], item)
pos += len(item)
}
return ret
}