format_parser 2.9.0 → 2.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/format_parser/version.rb +1 -1
- data/lib/parsers/wav_parser.rb +9 -12
- data/spec/parsers/wav_parser_spec.rb +3 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 922909c34fc304a86a75f6396bd9627cdacf009aba5191da863064811ca2906f
|
4
|
+
data.tar.gz: 864b73aa70b7ec650dab326f677b17f7ed1905d05560deb669a564bb9fdc3d37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f2527d385f3270f9b11976d478030108787a165e4440825c4ffa8c6a56054e67e5a7fb1a88d18d25dcb945ab6c2befc97156e7a2a5d5ad98f2e11e7c558ce2a
|
7
|
+
data.tar.gz: 788254d0f2e40625a6f2fd17c3c7f8959456ad1018fceb62305c5a877a3a8fd52ad5587915b0d3711a8ab68c6dc0ca6d283d9556f68a3234bbd3ecb7a50ece95
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
## 2.10.0
|
2
|
+
* Improve WAV parser by focusing on performance rather than on attempting a best-effort when extracting metadata from files that do not strictly follow the format spec.
|
3
|
+
|
1
4
|
## 2.9.0
|
2
5
|
* Improve WAV parser by performing a best-effort when extracting metadata from files that do not strictly follow the format spec.
|
3
6
|
|
data/lib/parsers/wav_parser.rb
CHANGED
@@ -21,30 +21,27 @@ class FormatParser::WAVParser
|
|
21
21
|
# The specification does not require the Format chunk to be the first chunk
|
22
22
|
# after the RIFF header.
|
23
23
|
# https://www.mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
|
24
|
+
fmt_processed = false
|
25
|
+
data_processed = false
|
24
26
|
fmt_data = {}
|
25
27
|
data_size = 0
|
26
|
-
total_sample_frames = nil
|
27
28
|
loop do
|
28
29
|
chunk_type, chunk_size = safe_read(io, 8).unpack('a4l')
|
29
30
|
case chunk_type
|
30
31
|
when 'fmt ' # watch out: the chunk ID of the format chunk ends with a space
|
31
32
|
fmt_data = unpack_fmt_chunk(io, chunk_size)
|
33
|
+
fmt_processed = true
|
32
34
|
when 'data'
|
33
35
|
data_size = chunk_size
|
34
|
-
|
35
|
-
total_sample_frames = safe_read(io, 4).unpack('l').first
|
36
|
-
safe_skip(io, chunk_size - 4)
|
36
|
+
data_processed = true
|
37
37
|
else
|
38
38
|
# Skip this chunk until a known chunk is encountered
|
39
39
|
safe_skip(io, chunk_size)
|
40
40
|
end
|
41
|
-
|
42
|
-
# We've reached EOF, so it's time to make the most out of the metadata we
|
43
|
-
# managed to parse
|
44
|
-
break
|
41
|
+
break if fmt_processed && data_processed
|
45
42
|
end
|
46
43
|
|
47
|
-
file_info(fmt_data, data_size
|
44
|
+
file_info(fmt_data, data_size)
|
48
45
|
end
|
49
46
|
|
50
47
|
def unpack_fmt_chunk(io, chunk_size)
|
@@ -70,10 +67,10 @@ class FormatParser::WAVParser
|
|
70
67
|
}
|
71
68
|
end
|
72
69
|
|
73
|
-
def file_info(fmt_data, data_size
|
70
|
+
def file_info(fmt_data, data_size)
|
74
71
|
# NOTE: Each sample includes information for each channel
|
75
|
-
sample_frames
|
76
|
-
duration_in_seconds = sample_frames / fmt_data[:sample_rate].to_f if fmt_data[:
|
72
|
+
sample_frames = data_size / (fmt_data[:channels] * fmt_data[:bits_per_sample] / 8) if fmt_data[:channels] > 0 && fmt_data[:bits_per_sample] > 0
|
73
|
+
duration_in_seconds = sample_frames / fmt_data[:sample_rate].to_f if sample_frames && fmt_data[:byte_rate] > 0
|
77
74
|
FormatParser::Audio.new(
|
78
75
|
format: :wav,
|
79
76
|
num_audio_channels: fmt_data[:channels],
|
@@ -20,8 +20,9 @@ describe FormatParser::WAVParser do
|
|
20
20
|
expect(parse_result.format).to eq(:wav)
|
21
21
|
expect(parse_result.num_audio_channels).to eq(1)
|
22
22
|
expect(parse_result.audio_sample_rate_hz).to eq(8000)
|
23
|
-
|
24
|
-
expect(parse_result.
|
23
|
+
# Fixture does not define bits_per_sample in the fmt chunk
|
24
|
+
expect(parse_result.media_duration_frames).to be_nil
|
25
|
+
expect(parse_result.media_duration_seconds).to be_nil
|
25
26
|
end
|
26
27
|
|
27
28
|
it 'returns correct info about pcm files with more channels' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: format_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Noah Berman
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-07-
|
12
|
+
date: 2024-07-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exifr
|