From 15a2ce0a4ec4b910a9a3699d6d828f8cdfaef252 Mon Sep 17 00:00:00 2001 From: nareix Date: Mon, 18 Apr 2016 00:21:26 +0800 Subject: [PATCH] rename funcs add MakeADTSHeader() --- isom/isom.go | 48 +++++++++++++++++++++++++++++++---------------- isom/isom_test.go | 11 +++++++++-- 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/isom/isom.go b/isom/isom.go index ce7c1ec..64197c1 100644 --- a/isom/isom.go +++ b/isom/isom.go @@ -81,40 +81,56 @@ var chanConfigTable = []int{ 0, 1, 2, 3, 4, 5, 6, 8, } -func IsADTSPayload(frames []byte) bool { +func IsADTSFrame(frames []byte) bool { return len(frames) > 7 && frames[0]==0xff&&frames[1]&0xf0==0xf0 } -func ReadADTSPayload(frames []byte) (config MPEG4AudioConfig, payload []byte, n int, next []byte, err error) { - if !IsADTSPayload(frames) { +func ReadADTSFrame(frame []byte) (config MPEG4AudioConfig, payload []byte, samples int, framelen int, err error) { + if !IsADTSFrame(frame) { err = fmt.Errorf("not adts frame") return } - config.ObjectType = uint(frames[2]>>6)+1 - config.SampleRateIndex = uint(frames[2]>>2&0xf) - config.ChannelConfig = uint(frames[2]<<2&0x4|frames[3]>>6&0x3) - framelen := int(frames[3]&0x3)<<11|int(frames[4])<<3|int(frames[5]>>5) - n = (int(frames[6]&0x3)+1)*1024 + config.ObjectType = uint(frame[2]>>6)+1 + config.SampleRateIndex = uint(frame[2]>>2&0xf) + config.ChannelConfig = uint(frame[2]<<2&0x4|frame[3]>>6&0x3) + framelen = int(frame[3]&0x3)<<11|int(frame[4])<<3|int(frame[5]>>5) + samples = (int(frame[6]&0x3)+1)*1024 hdrlen := 7 - if frames[1]&0x1 == 0 { + if frame[1]&0x1 == 0 { hdrlen = 9 } - if framelen < hdrlen || len(frames) < framelen { + if framelen < hdrlen || len(frame) < framelen { err = fmt.Errorf("invalid adts header length") return } - payload = append(payload, frames[hdrlen:framelen]...) - next = frames[framelen:] + payload = frame[hdrlen:framelen] return } -func ExtractADTSPayload(frames []byte) (config MPEG4AudioConfig, payload []byte, total int, err error) { +func MakeADTSHeader(config MPEG4AudioConfig, samples int, payloadLength int) (header []byte) { + payloadLength += 7 + //AAAAAAAA AAAABCCD EEFFFFGH HHIJKLMM MMMMMMMM MMMOOOOO OOOOOOPP (QQQQQQQQ QQQQQQQQ) + header = []byte{0xff,0xf1,0x50,0x80,0x043,0xff,0xcd} + //config.ObjectType = uint(frames[2]>>6)+1 + //config.SampleRateIndex = uint(frames[2]>>2&0xf) + //config.ChannelConfig = uint(frames[2]<<2&0x4|frames[3]>>6&0x3) + header[2] = (byte(config.ObjectType-1)&0x3)<<6|(byte(config.SampleRateIndex)&0xf)<<2|byte(config.ChannelConfig>>2)&0x1 + header[3] = header[3]&0x3f|byte(config.ChannelConfig&0x3)<<6 + header[3] = header[3]&0xfc|byte(payloadLength>>11)&0x3 + header[4] = byte(payloadLength>>3) + header[5] = header[5]&0x1f|(byte(payloadLength)&0x7)<<5 + header[6] = header[6]&0xfc|byte(samples/1024-1) + return +} + +func ExtractADTSFrames(frames []byte) (config MPEG4AudioConfig, payload []byte, samples int, err error) { for len(frames) > 0 { - var n int - if config, payload, n, frames, err = ReadADTSPayload(frames); err != nil { + var n, framelen int + if config, payload, n, framelen, err = ReadADTSFrame(frames); err != nil { return } - total += n + frames = frames[framelen:] + samples += n } return } diff --git a/isom/isom_test.go b/isom/isom_test.go index 4bf32d7..29903b1 100644 --- a/isom/isom_test.go +++ b/isom/isom_test.go @@ -41,6 +41,13 @@ func TestReadElemStreamDesc(t *testing.T) { //00000010 61 63 20 31 2e 32 38 00 00 42 40 93 20 04 32 00 |ac 1.28..B@. .2.| //00000020 47 ff f1 50 80 05 1f fc 21 42 fe ed b2 5c a8 00 |G..P....!B...\..| data, _ = hex.DecodeString("fff15080043ffcde040000") - aconfig, frameLength := ReadADTSHeader(data) - t.Logf("%v frameLength=%d", aconfig.Complete(), frameLength) + var n, framelen int + aconfig, _, n, _, _ = ReadADTSFrame(data) + t.Logf("%v n=%d", aconfig.Complete(), n) + + data = MakeADTSHeader(aconfig, 1024*3, 33) + data = append(data, []byte{1,2,3,4,5}...) + t.Logf("%x", data) + aconfig, _, n, framelen, err = ReadADTSFrame(data) + t.Logf("%v n=%d framelen=%d err=%v", aconfig.Complete(), n, framelen, err) }