diff --git a/isom/isom.go b/isom/isom.go index 7650eaf..951330f 100644 --- a/isom/isom.go +++ b/isom/isom.go @@ -181,6 +181,17 @@ func writeSampleRateIndex(w *bits.Writer, index uint) (err error) { return } +func (self MPEG4AudioConfig) Complete() (config MPEG4AudioConfig) { + config = self + if int(config.SampleRateIndex) < len(sampleRateTable) { + config.SampleRate = sampleRateTable[config.SampleRateIndex] + } + if int(config.ChannelConfig) < len(chanConfigTable) { + config.ChannelCount = chanConfigTable[config.ChannelConfig] + } + return +} + // copied from libavcodec/mpeg4audio.c avpriv_mpeg4audio_get_config() func ReadMPEG4AudioConfig(r io.Reader) (config MPEG4AudioConfig, err error) { br := &bits.Reader{R: r} @@ -191,15 +202,9 @@ func ReadMPEG4AudioConfig(r io.Reader) (config MPEG4AudioConfig, err error) { if config.SampleRateIndex, err = readSampleRateIndex(br); err != nil { return } - if int(config.SampleRateIndex) < len(sampleRateTable) { - config.SampleRate = sampleRateTable[config.SampleRateIndex] - } if config.ChannelConfig, err = br.ReadBits(4); err != nil { return } - if int(config.ChannelConfig) < len(chanConfigTable) { - config.ChannelCount = chanConfigTable[config.ChannelConfig] - } return } @@ -432,6 +437,17 @@ func ReadElemStreamDesc(r io.Reader) (decConfig []byte, err error) { return } +func ReadElemStreamDescAAC(r io.Reader) (config MPEG4AudioConfig, err error) { + var data []byte + if data, err = ReadElemStreamDesc(r); err != nil { + return + } + if config, err = ReadMPEG4AudioConfig(bytes.NewReader(data)); err != nil { + return + } + return +} + func WriteElemStreamDescAAC(w io.Writer, config MPEG4AudioConfig) (err error) { // MP4ESDescrTag(ESDesc MP4DecConfigDescrTag(objectId streamType bufSize avgBitrate MP4DecSpecificDescrTag(decConfig))) diff --git a/isom/isom_test.go b/isom/isom_test.go index 00722fe..13a7558 100644 --- a/isom/isom_test.go +++ b/isom/isom_test.go @@ -1,10 +1,9 @@ - package isom import ( - "testing" - "encoding/hex" "bytes" + "encoding/hex" + "testing" ) func TestReadElemStreamDesc(t *testing.T) { @@ -23,6 +22,7 @@ func TestReadElemStreamDesc(t *testing.T) { if aconfig, err = ReadMPEG4AudioConfig(bytes.NewReader(decConfig)); err != nil { t.Error(err) } + aconfig = aconfig.Complete() t.Logf("aconfig=%v", aconfig) bw := &bytes.Buffer{} @@ -46,4 +46,3 @@ func TestReadElemStreamDesc(t *testing.T) { objectType, sampleRateIndex, chanConfig, frameLength := ReadADTSHeader(data) t.Logf("objectType=%d sampleRateIndex=%d chanConfig=%d frameLength=%d", objectType, sampleRateIndex, chanConfig, frameLength) } -