1
1
mirror of https://github.com/wader/fq.git synced 2024-09-11 20:07:11 +03:00

mp3_frame_xing: Detect lame ext more similar to ffmpeg and mediainfo

This commit is contained in:
Mattias Wadman 2023-09-08 11:59:17 +02:00
parent 6c14ceb210
commit 0699c80bac
6 changed files with 47 additions and 23 deletions

View File

@ -22,12 +22,14 @@ func init() {
func mp3FrameTagXingDecode(d *decode.D) any {
d.FieldUTF8("header", 4, d.StrAssert("Xing", "Info"))
lamePresent := false
qualityPresent := false
tocPresent := false
bytesPresent := false
framesPresent := false
d.FieldStruct("present_flags", func(d *decode.D) {
d.FieldU("unused", 28)
d.FieldU("unused", 27)
lamePresent = d.FieldBool("lame")
qualityPresent = d.FieldBool("quality")
tocPresent = d.FieldBool("toc")
bytesPresent = d.FieldBool("bytes")
@ -51,24 +53,35 @@ func mp3FrameTagXingDecode(d *decode.D) any {
d.FieldU32BE("quality")
}
d.FieldUTF8("encoder", 9)
d.FieldU4("tag_revision")
d.FieldU4("vbr_method")
d.FieldU8("lowpass_filter") // TODO: /100
d.FieldU32("replay_gain_peak")
d.FieldU16("radio_replay_gain")
d.FieldU16("audiophile_replay_gain")
d.FieldU4("lame_flags")
d.FieldU4("lame_ath_type")
d.FieldU8("abr_vbr") // TODO:
d.FieldU12("encoder_delay") // TODO:
d.FieldU12("encoder_padding") // TODO:
d.FieldU8("misc") // TODO:
d.FieldU8("mp3_gain") // TODO:
d.FieldU16("preset") // TODO:
d.FieldU32("length")
d.FieldU16("music_crc") // TODO:
d.FieldU16("tag_crc") // TODO:
// this is mix of what ffmpeg and mediainfo does to detect lame extensions
peekLame, _ := d.TryPeekBytes(4)
peekLaneStr := string(peekLame)
hasLameHeader := (peekLaneStr == "LAME" ||
peekLaneStr == "Lavf" ||
peekLaneStr == "Lavc" ||
peekLaneStr == "GOGO" ||
peekLaneStr == "L3.9")
if lamePresent || hasLameHeader {
d.FieldUTF8("encoder", 9)
d.FieldU4("tag_revision")
d.FieldU4("vbr_method")
d.FieldU8("lowpass_filter") // TODO: /100
d.FieldU32("replay_gain_peak")
d.FieldU16("radio_replay_gain")
d.FieldU16("audiophile_replay_gain")
d.FieldU4("lame_flags")
d.FieldU4("lame_ath_type")
d.FieldU8("abr_vbr") // TODO:
d.FieldU12("encoder_delay") // TODO:
d.FieldU12("encoder_padding") // TODO:
d.FieldU8("misc") // TODO:
d.FieldU8("mp3_gain") // TODO:
d.FieldU16("preset") // TODO:
d.FieldU32("length")
d.FieldU16("music_crc") // TODO:
d.FieldU16("tag_crc") // TODO:
}
return nil
}

View File

@ -3,7 +3,8 @@ $ fq -d mp3_frame_xing dv mp3_frame_info
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: mp3_frame_info (mp3_frame_xing) 0x0-0x9b.7 (156)
0x00|49 6e 66 6f |Info | header: "Info" (valid) 0x0-0x3.7 (4)
| | | present_flags{}: 0x4-0x7.7 (4)
0x00| 00 00 00 0f | .... | unused: 0 0x4-0x7.3 (3.4)
0x00| 00 00 00 0f | .... | unused: 0 0x4-0x7.2 (3.3)
0x00| 0f | . | lame: false 0x7.3-0x7.3 (0.1)
0x00| 0f | . | quality: true 0x7.4-0x7.4 (0.1)
0x00| 0f | . | toc: true 0x7.5-0x7.5 (0.1)
0x00| 0f | . | bytes: true 0x7.6-0x7.6 (0.1)

View File

@ -3,7 +3,8 @@ $ fq -d mp3_frame_xing dv mp3_frame_xing
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.{}: mp3_frame_xing (mp3_frame_xing) 0x0-0x9b.7 (156)
0x00|58 69 6e 67 |Xing | header: "Xing" (valid) 0x0-0x3.7 (4)
| | | present_flags{}: 0x4-0x7.7 (4)
0x00| 00 00 00 0f | .... | unused: 0 0x4-0x7.3 (3.4)
0x00| 00 00 00 0f | .... | unused: 0 0x4-0x7.2 (3.3)
0x00| 0f | . | lame: false 0x7.3-0x7.3 (0.1)
0x00| 0f | . | quality: true 0x7.4-0x7.4 (0.1)
0x00| 0f | . | toc: true 0x7.5-0x7.5 (0.1)
0x00| 0f | . | bytes: true 0x7.6-0x7.6 (0.1)

View File

@ -86,6 +86,7 @@ mp3> .frames[0].tag | "d", d, "da", da, "dd", dd, "dv", dv, "ddv", ddv
0x40| 49 6e 66 6f | Info | header: "Info" (valid)
| | | present_flags{}:
0x40| 00 00 00 0f | .... | unused: 0
0x40| 0f | . | lame: false
0x40| 0f | . | quality: true
0x40| 0f | . | toc: true
0x40| 0f | . | bytes: true
@ -171,6 +172,7 @@ mp3> .frames[0].tag | "d", d, "da", da, "dd", dd, "dv", dv, "ddv", ddv
0x40| 49 6e 66 6f | Info | header: "Info" (valid)
| | | present_flags{}:
0x40| 00 00 00 0f | .... | unused: 0
0x40| 0f | . | lame: false
0x40| 0f | . | quality: true
0x40| 0f | . | toc: true
0x40| 0f | . | bytes: true
@ -305,6 +307,7 @@ mp3> .frames[0].tag | "d", d, "da", da, "dd", dd, "dv", dv, "ddv", ddv
0x40| 49 6e 66 6f | Info | header: "Info" (valid)
| | | present_flags{}:
0x40| 00 00 00 0f | .... | unused: 0
0x40| 0f | . | lame: false
0x40| 0f | . | quality: true
0x40| 0f | . | toc: true
0x40| 0f | . | bytes: true
@ -438,7 +441,8 @@ mp3> .frames[0].tag | "d", d, "da", da, "dd", dd, "dv", dv, "ddv", ddv
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.frames[0].tag{}: (mp3_frame_xing) 0x42-0xdd.7 (156)
0x40| 49 6e 66 6f | Info | header: "Info" (valid) 0x42-0x45.7 (4)
| | | present_flags{}: 0x46-0x49.7 (4)
0x40| 00 00 00 0f | .... | unused: 0 0x46-0x49.3 (3.4)
0x40| 00 00 00 0f | .... | unused: 0 0x46-0x49.2 (3.3)
0x40| 0f | . | lame: false 0x49.3-0x49.3 (0.1)
0x40| 0f | . | quality: true 0x49.4-0x49.4 (0.1)
0x40| 0f | . | toc: true 0x49.5-0x49.5 (0.1)
0x40| 0f | . | bytes: true 0x49.6-0x49.6 (0.1)
@ -572,7 +576,8 @@ mp3> .frames[0].tag | "d", d, "da", da, "dd", dd, "dv", dv, "ddv", ddv
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.frames[0].tag{}: (mp3_frame_xing) 0x42-0xdd.7 (156)
0x40| 49 6e 66 6f | Info | header: "Info" (valid) 0x42-0x45.7 (4)
| | | present_flags{}: 0x46-0x49.7 (4)
0x40| 00 00 00 0f | .... | unused: 0 0x46-0x49.3 (3.4)
0x40| 00 00 00 0f | .... | unused: 0 0x46-0x49.2 (3.3)
0x40| 0f | . | lame: false 0x49.3-0x49.3 (0.1)
0x40| 0f | . | quality: true 0x49.4-0x49.4 (0.1)
0x40| 0f | . | toc: true 0x49.5-0x49.5 (0.1)
0x40| 0f | . | bytes: true 0x49.6-0x49.6 (0.1)

View File

@ -275,6 +275,7 @@ mp3> .headers[0] = 1
"present_flags": {
"bytes": true,
"frames": true,
"lame": false,
"quality": true,
"toc": true,
"unused": 0
@ -608,6 +609,7 @@ mp3> .headers[0] |= empty
"present_flags": {
"bytes": true,
"frames": true,
"lame": false,
"quality": true,
"toc": true,
"unused": 0

View File

@ -192,6 +192,7 @@ mp3> .headers[0].header.flags.a = 1
"present_flags": {
"bytes": true,
"frames": true,
"lame": false,
"quality": true,
"toc": true,
"unused": 0
@ -561,6 +562,7 @@ mp3> .headers[0].header.flags.a |= empty
"present_flags": {
"bytes": true,
"frames": true,
"lame": false,
"quality": true,
"toc": true,
"unused": 0