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/aac/seqheader.go

81 lines
2.4 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 2021, 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 aac
import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazaerrors"
"github.com/q191201771/naza/pkg/nazabits"
)
// TODO(chef) 这个文件的部分内容可以考虑放到package base中
// SequenceHeaderContext
//
// <spec-video_file_format_spec_v10.pdf>, <Audio tags, AUDIODATA>, <page 10/48>
// ----------------------------------------------------------------------------
// soundFormat [4b] 10=AAC
// soundRate [2b] 3=44kHz. AAC always 3
// soundSize [1b] 0=snd8Bit, 1=snd16Bit
// soundType [1b] 0=sndMono, 1=sndStereo. AAC always 1
// aacPackageType [8b] 0=seq header, 1=AAC raw
type SequenceHeaderContext struct {
SoundFormat uint8 // [4b]
SoundRate uint8 // [2b]
SoundSize uint8 // [1b]
SoundType uint8 // [1b]
AacPacketType uint8 // [8b]
}
// Unpack
//
// @param b: rtmp/flv的message/tag的payload的前2个字节。
//
// 函数调用结束后,内部不持有该内存块
func (shCtx *SequenceHeaderContext) Unpack(b []byte) {
br := nazabits.NewBitReader(b)
shCtx.SoundFormat, _ = br.ReadBits8(4)
shCtx.SoundRate, _ = br.ReadBits8(2)
shCtx.SoundSize, _ = br.ReadBits8(1)
shCtx.SoundType, _ = br.ReadBits8(1)
shCtx.AacPacketType, _ = br.ReadBits8(8)
}
// MakeAudioDataSeqHeaderWithAsc
//
// @param asc: 函数调用结束后,内部不持有该内存块
//
// @return out: 内存块为独立新申请;函数调用结束后,内部不持有该内存块
func MakeAudioDataSeqHeaderWithAsc(asc []byte) (out []byte, err error) {
if len(asc) < minAscLength {
return nil, nazaerrors.Wrap(base.ErrShortBuffer)
}
// 注意前两个字节是SequenceHeaderContext后面跟着asc
out = make([]byte, 2+len(asc))
out[0] = 0xaf
out[1] = 0
copy(out[2:], asc)
return
}
// MakeAudioDataSeqHeaderWithAdtsHeader
//
// @param adtsHeader: 函数调用结束后,内部不持有该内存块
//
// @return out: 内存块为独立新申请;函数调用结束后,内部不持有该内存块
func MakeAudioDataSeqHeaderWithAdtsHeader(adtsHeader []byte) (out []byte, err error) {
var asc []byte
if asc, err = MakeAscWithAdtsHeader(adtsHeader); err != nil {
return nil, err
}
return MakeAudioDataSeqHeaderWithAsc(asc)
}