MCPcopy Index your code
hub / github.com/Monibuca/engine / AudioSpecificConfigToADTS

Function AudioSpecificConfigToADTS

codec/codec.go:181–231  ·  view source on GitHub ↗

CopyrightIdentificationBit, CopyrightIdentificationStart, AACFrameLength, 一个ADTS帧的长度包括ADTS头和raw data block. ADTSBufferFullness, 0x7FF 说明是码率可变的码流. NumberOfRawDataBlockInFrame, 表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧 所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有一个AAC数据块并不是说没有。(一

(asc *AudioSpecificConfig, rawDataLength int, adtsByte []byte)

Source from the content-addressed store, hash-verified

179// 所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有一个AAC数据块并不是说没有。(一个AAC原始帧包含一段时间内1024个采样及相关数据)
180
181func AudioSpecificConfigToADTS(asc *AudioSpecificConfig, rawDataLength int, adtsByte []byte) (adts ADTS, err error) {
182 if asc.ChannelConfiguration > 8 || asc.FrameLengthFlag > 13 {
183 err = errors.New("Reserved field.")
184 return
185 }
186
187 // ADTSFixedHeader
188 adts.SyncWord = 0xfff
189 adts.ID = 0
190 adts.Layer = 0
191 adts.ProtectionAbsent = 1
192
193 // SyncWord(12) + ID(1) + Layer(2) + ProtectionAbsent(1)
194 adtsByte[0] = 0xFF
195 adtsByte[1] = 0xF1
196 if asc.AudioObjectType >= 3 || asc.AudioObjectType == 0 {
197 adts.Profile = 1
198 } else {
199 adts.Profile = asc.AudioObjectType - 1
200 }
201
202 adts.SamplingFrequencyIndex = asc.SamplingFrequencyIndex
203 adts.PrivateBit = 0
204 adts.ChannelConfiguration = asc.ChannelConfiguration
205 adts.OriginalCopy = 0
206 adts.Home = 0
207
208 // Profile(2) + SamplingFrequencyIndex(4) + PrivateBit(1) + ChannelConfiguration(3)(取高1位)
209 adtsByte[2] = uint8(adts.Profile<<6) + uint8(adts.SamplingFrequencyIndex<<2) + uint8(adts.PrivateBit<<1) + uint8((adts.ChannelConfiguration&0x7)>>2)
210 // ADTSVariableHeader
211 adts.CopyrightIdentificationBit = 0
212 adts.CopyrightIdentificationStart = 0
213 adts.AACFrameLength = 7 + uint16(rawDataLength)
214 adts.ADTSBufferFullness = 0x7ff
215 adts.NumberOfRawDataBlockInFrame = 0
216
217 // ChannelConfiguration(3)(取低2位) + OriginalCopy(1) + Home(1) + CopyrightIdentificationBit(1) + CopyrightIdentificationStart(1) + AACFrameLength(13)(取高2位)
218 adtsByte[3] = uint8((adts.ChannelConfiguration&0x3)<<6) + uint8((adts.AACFrameLength&0x1fff)>>11)
219
220 // AACFrameLength(13)
221 // xx xxxxxxxx xxx
222 // 取中间的部分
223 adtsByte[4] = uint8(((adts.AACFrameLength & 0x1fff) >> 3) & 0x0ff)
224
225 // AACFrameLength(13)(取低3位) + ADTSBufferFullness(11)(取高5位)
226 adtsByte[5] = uint8((adts.AACFrameLength&0x0007)<<5) + 0x1f
227
228 // ADTSBufferFullness(11)(取低6位) + NumberOfRawDataBlockInFrame(2)
229 adtsByte[6] = 0xfc
230 return
231}

Callers 1

ToADTSMethod · 0.85

Calls 1

NewMethod · 0.80

Tested by

no test coverage detected