2020-06-08 03:29:51 +03:00
|
|
|
package mpeg
|
|
|
|
|
|
|
|
// https://wiki.multimedia.cx/index.php/MPEG-4_Audio
|
|
|
|
|
|
|
|
import (
|
2021-08-17 13:06:32 +03:00
|
|
|
"github.com/wader/fq/format"
|
|
|
|
"github.com/wader/fq/pkg/decode"
|
2022-07-16 19:39:57 +03:00
|
|
|
"github.com/wader/fq/pkg/interp"
|
2021-12-02 00:48:25 +03:00
|
|
|
"github.com/wader/fq/pkg/scalar"
|
2020-06-08 03:29:51 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
2022-07-16 19:39:57 +03:00
|
|
|
interp.RegisterFormat(decode.Format{
|
2020-06-08 03:29:51 +03:00
|
|
|
Name: format.MPEG_ASC,
|
|
|
|
Description: "MPEG-4 Audio Specific Config",
|
|
|
|
DecodeFn: ascDecoder,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2021-12-14 19:31:31 +03:00
|
|
|
var frequencyIndexHzMap = scalar.UToSymU{
|
2020-06-08 03:29:51 +03:00
|
|
|
0x0: 96000,
|
|
|
|
0x1: 88200,
|
|
|
|
0x2: 64000,
|
|
|
|
0x3: 48000,
|
|
|
|
0x4: 44100,
|
|
|
|
0x5: 32000,
|
|
|
|
0x6: 24000,
|
|
|
|
0x7: 22050,
|
|
|
|
0x8: 16000,
|
|
|
|
0x9: 12000,
|
|
|
|
0xa: 11025,
|
|
|
|
0xb: 8000,
|
|
|
|
0xc: 7350,
|
|
|
|
}
|
|
|
|
|
2022-04-07 19:25:23 +03:00
|
|
|
var channelConfigurationNames = scalar.UToDescription{
|
|
|
|
0: "defined in AOT Specifc Config",
|
|
|
|
1: "front-center",
|
|
|
|
2: "front-left, front-right",
|
|
|
|
3: "front-center, front-left, front-right",
|
|
|
|
4: "front-center, front-left, front-right, back-center",
|
|
|
|
5: "front-center, front-left, front-right, back-left, back-right",
|
|
|
|
6: "front-center, front-left, front-right, back-left, back-right, LFE-channel",
|
|
|
|
7: "front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel",
|
2020-06-08 03:29:51 +03:00
|
|
|
}
|
|
|
|
|
2022-07-19 19:33:50 +03:00
|
|
|
func ascDecoder(d *decode.D, _ any) any {
|
2021-12-14 19:31:31 +03:00
|
|
|
objectType := d.FieldUFn("object_type", decodeEscapeValueCarryFn(5, 6, 0), format.MPEGAudioObjectTypeNames)
|
|
|
|
d.FieldUFn("sampling_frequency", decodeEscapeValueAbsFn(4, 24, 0), frequencyIndexHzMap)
|
2021-12-02 00:48:25 +03:00
|
|
|
d.FieldU4("channel_configuration", channelConfigurationNames)
|
2020-06-08 03:29:51 +03:00
|
|
|
// TODO: GASpecificConfig etc
|
2021-11-05 17:04:26 +03:00
|
|
|
d.FieldRawLen("var_aot_or_byte_align", d.BitsLeft())
|
2020-06-08 03:29:51 +03:00
|
|
|
|
|
|
|
return format.MPEGASCOut{ObjectType: int(objectType)}
|
|
|
|
}
|