mirror of
https://github.com/wader/fq.git
synced 2024-10-26 20:06:29 +03:00
Merge pull request #763 from wader/mp3_frmae_xing-better-lame-ext-detect
mp3_frame_xing: Detect lame ext more similar to ffmpeg and mediainfo
This commit is contained in:
commit
d90772e6a6
@ -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
|
||||
}
|
||||
|
3
format/mp3/testdata/mp3_frame_info.fqtest
vendored
3
format/mp3/testdata/mp3_frame_info.fqtest
vendored
@ -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)
|
||||
|
3
format/mp3/testdata/mp3_frame_xing.fqtest
vendored
3
format/mp3/testdata/mp3_frame_xing.fqtest
vendored
@ -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)
|
||||
|
9
pkg/interp/testdata/display.fqtest
vendored
9
pkg/interp/testdata/display.fqtest
vendored
@ -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)
|
||||
|
2
pkg/interp/testdata/value_array.fqtest
vendored
2
pkg/interp/testdata/value_array.fqtest
vendored
@ -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
|
||||
|
2
pkg/interp/testdata/value_object.fqtest
vendored
2
pkg/interp/testdata/value_object.fqtest
vendored
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user