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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 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
}