1
1
mirror of https://github.com/wader/fq.git synced 2024-12-26 23:15:04 +03:00
fq/format/mp3/mp3_frame_vbri.go
2023-05-01 13:19:04 +02:00

41 lines
1.3 KiB
Go

package mp3
// https://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header
import (
"github.com/wader/fq/format"
"github.com/wader/fq/pkg/decode"
"github.com/wader/fq/pkg/interp"
"github.com/wader/fq/pkg/scalar"
)
func init() {
interp.RegisterFormat(
format.MP3_Frame_VBRI,
&decode.Format{
Description: "MP3 frame Fraunhofer encoder variable bitrate tag",
Groups: []*decode.Group{format.MP3_Frame_Tags},
DecodeFn: mp3FrameTagVBRIDecode,
})
}
func mp3FrameTagVBRIDecode(d *decode.D) any {
d.FieldUTF8("header", 4, d.StrAssert("VBRI"))
d.FieldU16("version_id")
d.FieldU16("delay")
d.FieldU16("quality")
d.FieldU32("length", scalar.UintDescription("Number of bytes"))
d.FieldU32("frames", scalar.UintDescription("Number of frames"))
tocEntries := d.FieldU16("toc_entries", scalar.UintDescription("Number of entries within TOC table"))
d.FieldU16("scale_factor", scalar.UintDescription("Scale factor of TOC table entries"))
tocEntrySize := d.FieldU16("toc_entry_size", d.UintAssert(1, 2, 3, 4), scalar.UintDescription("Size per table entry"))
d.FieldU16("frame_per_entry", scalar.UintDescription("Frames per table entry"))
d.FieldArray("toc", func(d *decode.D) {
for i := 0; i < int(tocEntries); i++ {
d.FieldU("entry", int(tocEntrySize)*8)
}
})
return nil
}