h264

package
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 8, 2023 License: MIT Imports: 6 Imported by: 1

Documentation

Index

Constants

View Source
const (
	NaluTypeSlice    uint8 = 1
	NaluTypeIdrSlice uint8 = 5
	NaluTypeSei      uint8 = 6
	NaluTypeSps      uint8 = 7
	NaluTypePps      uint8 = 8
	NaluTypeAud      uint8 = 9  // Access Unit Delimiter
	NaluTypeFd       uint8 = 12 // Filler Data
)
View Source
const (
	SliceTypeP  uint8 = 0
	SliceTypeB  uint8 = 1
	SliceTypeI  uint8 = 2
	SliceTypeSp uint8 = 3
	SliceTypeSi uint8 = 4
)

Variables

View Source
var (
	NaluStartCode3 = []byte{0x0, 0x0, 0x1}
	NaluStartCode4 = []byte{0x0, 0x0, 0x0, 0x1}

	// AudNalu aud nalu
	AudNalu = []byte{0x00, 0x00, 0x00, 0x01, 0x09, 0xf0}

	ErrShortBuffer = errors.New("err short buffer")
	ErrAvc         = errors.New("err avc")
)
View Source
var NaluTypeMapping = map[uint8]string{
	1:  "SLICE",
	5:  "IDR",
	6:  "SEI",
	7:  "SPS",
	8:  "PPS",
	9:  "AUD",
	12: "FD",
}

NaluTypeMapping

H.264-AVC-ISO_IEC_14496-15.pdf Table 1 - NAL unit types in elementary streams

View Source
var SliceTypeMapping = map[uint8]string{
	0: "P",
	1: "B",
	2: "I",
	3: "SP",
	4: "SI",
	5: "P",
	6: "B",
	7: "I",
	8: "SP",
	9: "SI",
}

Functions

func Annexb2Avcc

func Annexb2Avcc(nals []byte) []byte

func Avcc2Annexb

func Avcc2Annexb(nals []byte) ([]byte, error)

func BuildSeqHeaderFromSpsPps

func BuildSeqHeaderFromSpsPps(sps, pps []byte) ([]byte, error)

BuildSeqHeaderFromSpsPps *****************************************************

  • @Description: 生成flv的 video seqHeader
  • @param sps
  • @param pps
  • @return []byte 内存块为内部独立新申请
  • @return error *****************************************************

func BuildSpsPps2Annexb

func BuildSpsPps2Annexb(sps, pps []byte) []byte

BuildSpsPps2Annexb

根据sps pps构建payload

func CaptureAvcc2Annexb

func CaptureAvcc2Annexb(w io.Writer, payload []byte) error

CaptureAvcc2Annexb *****************************************************

  • @Description: AVCC转换为Annexb格式。
  • @param w
  • @param payload rtmp message的payload部分或者flv tag的payload部分。 注意,包含了头部2字节类型以及3字节的cts
  • @return error *****************************************************

func IterateNaluAvcc

func IterateNaluAvcc(nals []byte, handler func(nal []byte)) error

func IterateNaluStartCode

func IterateNaluStartCode(nalu []byte, start int) (pos, length int)

IterateNaluStartCode *****************************************************

  • @Description: 遍历直到找到第一个nalu start code的位置。
  • @param nalu
  • @param start 从`nalu`的start位置开始查找。
  • @return pos start code的起始位置(包含start code自身)。
  • @return length start code的长度,可能是3或者4。注意,如果找不到start code,则返回-1, -1。 *****************************************************

func ParseNaluType

func ParseNaluType(v uint8) uint8

func ParseNaluTypeReadable

func ParseNaluTypeReadable(v uint8) string

func ParseSliceType

func ParseSliceType(nalu []byte) (uint8, error)

func ParseSliceTypeReadable

func ParseSliceTypeReadable(nalu []byte) (string, error)

func ParseSps

func ParseSps(payload []byte, ctx *Context) error

func ParseSpsPpsFromSeqHeader

func ParseSpsPpsFromSeqHeader(payload []byte) (sps, pps []byte, err error)

ParseSpsPpsFromSeqHeader *****************************************************

  • @Description: 见func ParseSpsPpsFromSeqHeaderWithoutMalloc
  • @param payload
  • @return sps 内存块为内部独立新申请
  • @return pps 内存块为内部独立新申请
  • @return err *****************************************************

func ParseSpsPpsFromSeqHeaderWithoutMalloc

func ParseSpsPpsFromSeqHeaderWithoutMalloc(payload []byte) (sps, pps []byte, err error)

ParseSpsPpsFromSeqHeaderWithoutMalloc *****************************************************

  • @Description: 从AVCC格式的Seq Header中得到SPS和PPS内存块。
  • @param payload rtmp message的payload部分或者flv tag的payload部分。注意,包含了头部2字节类型以及3字节的cts。
  • @return sps 复用传入参数`payload`的内存块
  • @return pps 复用传入参数`payload`的内存块
  • @return err *****************************************************

func SplitNaluAnnexb

func SplitNaluAnnexb(nalu []byte) (nalList [][]byte)

SplitNaluAnnexb *****************************************************

  • @Description: 遍历Annexb格式,去掉start code,获取nal包,正常情况下可能为1个或多个,异常情况下可能一个也没有
  • @param nals
  • @return nalList 内存块元素引用输入参数`nals`的内存
  • @return err *****************************************************

func SplitNaluAvcc

func SplitNaluAvcc(nals []byte) (nalList [][]byte, err error)

SplitNaluAvcc

遍历AVCC格式,去掉4字节长度,获取nal包,正常情况下可能返回1个或多个,异常情况下可能一个也没有

具体见单元测试

func SpsPpsSeqHeader2Annexb

func SpsPpsSeqHeader2Annexb(payload []byte) ([]byte, error)

SpsPpsSeqHeader2Annexb *****************************************************

  • @Description: AVCC Seq Header转换为Annexb格式。
  • @param payload rtmp message的payload部分或者flv tag的payload部分。 注意,包含了头部2字节类型以及3字节的cts。
  • @return []byte
  • @return error 返回的内存块为内部独立新申请。 *****************************************************

func TryParsePps

func TryParsePps(payload []byte) error

TryParsePps 尝试解析PPS所有字段,实验中,请勿直接使用该函数

func TryParseSeqHeader

func TryParseSeqHeader(payload []byte) error

TryParseSeqHeader *****************************************************

  • @Description: 尝试解析SeqHeader所有字段,实验中,请勿直接使用该函数。
  • @param payload rtmp message的payload部分或者flv tag的payload部分。注意,包含了头部2字节类型以及3字节的cts。
  • @return error *****************************************************

Types

type Context

type Context struct {
	Profile uint8
	Level   uint8
	Width   uint32
	Height  uint32
}

type DecoderConfigurationRecord

type DecoderConfigurationRecord struct {
	ConfigurationVersion uint8
	AvcProfileIndication uint8
	ProfileCompatibility uint8
	AvcLevelIndication   uint8
	LengthSizeMinusOne   uint8
	NumOfSps             uint8
	SpsLength            uint16
	NumOfPps             uint8
	PpsLength            uint16
}

DecoderConfigurationRecord

H.264-AVC-ISO_IEC_14496-15.pdf 5.2.4 Decoder configuration information

type Sps

type Sps struct {
	ProfileIdc         uint8
	ConstraintSet0Flag uint8
	ConstraintSet1Flag uint8
	ConstraintSet2Flag uint8
	LevelIdc           uint8
	SpsId              uint32

	ChromaFormatIdc            uint32
	ResidualColorTransformFlag uint8
	BitDepthLuma               uint32
	BitDepthChroma             uint32
	TransFormBypass            uint8

	Log2MaxFrameNumMinus4 uint32
	PicOrderCntType       uint32
	Log2MaxPicOrderCntLsb uint32

	NumRefFrames                   uint32 // num_ref_frames
	GapsInFrameNumValueAllowedFlag uint8  // gaps_in_frame_num_value_allowed_flag
	PicWidthInMbsMinusOne          uint32 // pic_width_in_mbs_minus1
	PicHeightInMapUnitsMinusOne    uint32 // pic_height_in_map_units_minus1

	FrameMbsOnlyFlag         uint8 // frame_mbs_only_flag
	MbAdaptiveFrameFieldFlag uint8 // mb_adaptive_frame_field_flag

	Direct8X8InferenceFlag uint8 // direct_8x8_inference_flag

	FrameCroppingFlag     uint8  // frame_cropping_flag
	FrameCropLeftOffset   uint32 // frame_crop_left_offset
	FrameCropRightOffset  uint32 // frame_crop_right_offset
	FrameCropTopOffset    uint32 // frame_crop_top_offset
	FrameCropBottomOffset uint32 // frame_crop_bottom_offset

	SarNum int
	SarDen int
}

Sps

ISO-14496-10.pdf 7.3.2.1 Sequence parameter set RBSP syntax 7.4.2.1 Sequence parameter set RBSP semantics

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL