1
2mp3guessenc changelog
3======================
4
5version 0.27.5 (2020/08/10 "Lo stretto necessario")
6 - overall review of all comments, now more and clearer
7 - updated ID3v1 genre codes (yeah, I should have done this long ago)
8
9
10version 0.27.4 (2018/07/15 "It's happened before it'll happen again")
11 - fixed detection of metadata tags at the file head which wrongly aborted when
12   a large padding area was found at the tail of the search buffer
13
14
15version 0.27.3 (2018/02/11 "I Still Do")
16 - more efficient detection of metadata tags at the file head, now using a fast
17   memory buffer for seeking tag signatures. This allows detection even in
18   troubled files where tags are stored among bytes of junk.
19 - the program now returns a useful exit code after successful encoder
20   detection. It is a positive non zero value and it is internally used as an
21   index into an encoder_table, so it brings out the same information. The
22   exit code will be zero when no detection is performed or layerI/II streams
23   are analysed. It will be less than zero in case of errors.
24 - fixed wrong calculation in id3v2 footer detection
25 - forced message "Music CRC verification" when `-r' is used. When a valid lame
26   tag is found, a crc verification is performed, otherwise the message will
27   simply report "not performed".
28 - re-arranged "length of original audio" field into its own tag. When it comes
29   from the lame tag, then it'll be showed with the lame tag, when it comes
30   from ofl block, then it'll appear into the ofl block (created on purpose).
31 - lame music verification. A crc16 calculated over the whole audio bitstream
32   is also stored into the tag, so this is now used to validate the audio data.
33   Due to byte reflection, the computation is quite slow, so this is disabled
34   by default. You can force it with command line switch `-r'.
35 - lame tag verification. lame stores several useful information into its own
36   tag, such as a crc16 sum for valitading the tag itself. The issue is this
37   crc IS NOT the same involved into audio frame validation, but it's a similar
38   algorithm using byte reflection. This means every byte feeded into the
39   algorithm has to be reflected first, and the stored crc has to be reflected
40   before final comparison. (WTH!!!)
41 - compute "Length of original audio" using the number of frames reported by
42   Lame tag, not the detected frame amount (this may vary and leads to wrong
43   results).
44   NOTE: around 2003/2004, some development versions of lame created tags
45   reporting a wrong frame amount, that is the real number of frames created,
46   increased by 1 (the tag itself). Reading those tags leads to wrong sample
47   count estimation, because the number of frames stored is misleading. There
48   is no way of telling how many lame alpha/beta versions affected by that bug
49   got used at that time, so discrepancies may appear. When facing some
50   unmatched sample amount, use your common sense.
51   The bug was finally fixed into the stable 3.94 release (early 2004).
52 - fixed install command into Makefile
53 - fix for some wrong xing tags reporting a disabled 'original' flag while the
54   whole bitstream shows it enabled
55
56
57version 0.27.2 (2017/08/25 "Roundabout")
58 - small changes into I/O header mp3g_io_config and now mp3guessenc can also
59   be built on AmigaOS and OS/2 (and it works, of course!)
60 - detection for mpeg multi channel streams!
61   ISO MPEG-2 provides specifications for a new bitstream for center,
62   surround channels, low frequency enhancement channel and multi lingual
63   audio, described into ancillary data of mpeg1 layerII streams (usually,
64   but it may also fit into other layers).
65   Poor free documentation available (and the standard itself has not been
66   widly adopted), nevertheless stream recognition works in almost any cases.
67 - fixes into tags.c for every integer field found into tags. Now any integer
68   field is read in an endian indipendent way, so the routines will work on
69   big-endian machines too
70 - fixes into crc16 calculation routine (never used till now)
71 - support for "reduced" lame tag written by Lavc when encoding layerIII
72   files. The encoding engine is lame indeed, nevertheless the tool fills some
73   tag fields with unreliable infos
74 - fix for some wrong lame tags reporting a disabled 'original' flag while the
75   whole bitstream shows it enabled
76
77
78version 0.27.1 (2017/05/03 "Italian Espresso")
79 - read whole audio data from layerII streams and report ancillary amount
80 - read whole audio data from layerI streams and report ancillary amount
81 - retrieve bitrate from freeformat stream frames and reject those causing
82   bitrates > 640 kbps
83 - new fix for crc-protected vbr streams created by fhg encoders. Their VBRI
84   tag has a disabled CRC flag in contrast with the one stored into the real
85   audio stream, and this caused mp3guessenc to reject valid audio frames
86 - re-arranged the search for the very first frame. The two code blocks, one
87   seeking a corrupted freeframe index (written by ancient lame encoders) and
88   the other seeking for a vbr tag (both into the first frame) are now
89   merged together. This makes seeking valid frames among the junk even more
90   robust
91 - set every floating point variable as single precision (no need for double)
92 - fix off-by-one bug into memsrch which failed searches in some particular
93   cases
94
95
96version 0.27 (2016/12/15, "Ancient Melodies Enchanting Lightnings Into Art")
97 - convert any bit read operations to memory (byte arrays) accesses, instead of
98   file stream access (UP TO 24% FASTER ANALYSIS!!!)
99 - shorten analysis of a last broken layerIII frame when even side information
100   is incomplete
101 - check validity of bit allocation area in layerI frames
102 - take apart side information analysis (for layerIII) and error check
103 - check crc16 validity in all layers
104 - better macro bounds around "seek option"
105 - restored warning message from broken frames also for non-layerIII
106 - changed most of the variable signed-ness: if something needs to have a sign,
107   then it will have, everything else won't
108
109
110version 0.26.2 (2016/12/14, "Dark Black")
111 - fixes into mp3g_io_config.h for recent mingw compliancy
112 - fixed a misplaced (and very dangerous) buffer pointer
113
114
115version 0.26.1 (2016/02/26, "Black")
116 - limited the most cpu-demanding computations to few challenging bitstreams,
117   so in most cases the analysis will run faster
118 - detect wave riff header for mpeg audio bitstreams wrapped into wav files.
119 - avoid warning message about uncomplete frame when non-layerIII
120 - fixed ape tag detection for 64 bit builds
121 - replaced some old forgotten off_t casts
122 - check for id3v2 at the end of the file (may be found for revisions >=4)
123 - detect broken/corrupted musicmatch tag, with extraction of minimal information
124
125
126version 0.26 (2016/01/17, "Hotel Torino")
127 - the search for metadata tags is now a loop (so, more useless tags appeared, both
128   at the head and at the tail of several files)
129 - check for ape tags at the head of the file also
130 - print offset (hex) for any metadata tags found
131 - stop using `off_t' for bit pointers, created a new data type `bitoffs_t' which is
132   in fact a `long long'. This allows mp3guessenc to be cleaner and run smooth under
133   Android also, where the `stat' struct doesn't use `off_t' for file size (st_size)
134   but `long long', since `off_t' type is 32 bit long only.
135 - fix: check file size before beginning analysis, the file may be too large even when
136   its size doesn't make the `st_size' field (stat) overflow. (Check updated with
137   respect to the new data type, as above)
138
139
140version 0.26preview (2015/02/19, "Let It Snow")
141(this had to be 0.25.3 but the amount of new features
142and changes in source code made me decide for the jump)
143 - Small fixes into Makefile
144 - Do not scan empty files
145 - Added detection for the ancient (yet free and open source) Blade Encoder.
146 - Added support for MusicMatch tag used (only) in early versions of MM Jukebox software.
147 - Added support for Lyrics3v2 tag
148 - Added support for Lyrics3v1 tag
149 - Enhanced robustness of mpeg frame detection - now after a freeformat frame mp3guessenc
150   seeks for more freeformat ones, and vice versa.
151 - Replaced `strstr' with the new, more reliable `memsrch' (I like it more than the GNU
152   extension `memmem')
153 - Added comfortable `-S' (skip) option you can use if you suspect the junk at the head of a
154   file can make difficult its recognition by mp3guessenc. When a long scanning can bring only
155   a meaningless bunch of frames and a ton of sync errors, well, try it!
156   While I'm on it, I want to say more about this feature. I always thought the ability to skip
157   a given amount of bytes could be useful, yet I never wanted to have it into mp3guessenc. In
158   a "perfect final" release, mp3guessenc should be able to recognize each and every kind of
159   tag/data/junk any mad encoding software added at the head of an mpeg stream, but truth is,
160   we're still not there. I can't even tell if it will remain available forever as other command
161   line options will, but now I really need it, and now it's there.
162 - Added a full set of command line options, offering flexible control about what mp3guessenc
163   goes to report after analysis. Old behaviour is still kept as long as you set no options
164   on the command line (or just type `-e' to show everything). For quiet detection, use `-g'
165   (show only the guessing) or even `-n' for absolutely silent operation - only the encoder
166   name will be printed.
167
168
169version 0.25.2 (2014/07/16, "25 Days A Stranger")
170 - Same consistency enhancements of `skip_p23b' went into `skipback_p23b'
171 - More accuracy in `skip_p23b' which returned meaningless values when the subsequent block was
172   missing. This is now fixed and when the block is not present, the skip operation stops,
173   returning proper results
174 - Fixed behaviour with odd frames reporting they have part2+part3 data block with 0 bit
175 - Fixed calls to part2+part3 handling routines in order not to move the bit pointer toward
176   bits that are not yet loaded
177 - Replaced cryptic `A!' and `B!' alerts with intelligible warning messages.
178 - Fixed pointer handling into `skip_p23b', now p23b_pos can only have allowed values and
179   function calls got slighly modified
180 - Logical fixes into `skipback_p23b' which was always assuming p23b_pos was at the last bit of
181   the block
182 - Renamed `bitstreamcpy' to more friendly `p23b_cpy'
183 - Optimized search into `seek_p23b', now performing up to 2 cycles (the same function used to
184   cycle up to NP23B-1 times!) most of the times - BREEZING SPEED!
185 - Removed redundant seek code into `load_into_p23b'
186 - Added consistency check for endOfLastPart3 pointer (avoids resetting by mistake the enhanced
187   feature bytes)
188 - New handling for endOfLastPart3 pointer, bringing a few more ancillary data blocks detected
189 - Removed useless and redundant (and even harmful) seek before scan for ancillary data
190 - Print large file support status (yes/no). Yeah, I added this to 0.25.1 but forgot to mention
191
192
193version 0.25.1 (2014/04/28, "Fuori Dal Tempo")
194 - Fixed a very old (and critical) bug in `load_into_p23b'
195 - Replaced the old `readOneByte_p23b' function with the shiny new `bitstreamcpy', useful
196   when collecting bytes from ancillary data. This new function is born with speed, efficiency
197   and reliability in mind. The old function returned one byte at a time, it was error-prone
198   and the whole process was slow. (for more detail, see comments to the functions themselves)
199 - Various fixes into `bit_utils' module in order to decrease complexity and increase speed.
200 - Fixed analysis of the very last frame for files having it shorter than expected
201   (see http://sourceforge.net/p/mp3guessenc/news/2014/04/unexpected-hassle-behind-a-simple-idea/).
202   Be aware that some subtle changes in your results may appear due to this enhanced
203   precision in mp3guessenc. In fact, now a new valid shorter frame may (or may not) slightly
204   decrease the overall data rate (this is always calculated as amount_of_data/duration);
205   further, the detected amount of ancillary data is likely to decrease because some data
206   once taken as useless padding, are now a compliant frame. (btw, I was wrong)
207 - Faster, more robust, more flexible `strencode' utility
208
209
210version 0.25 final (2013/09/22, "Farewell")
211 - increased number of frames stored in memory due to most demanding streams (lsf)
212 - source cleanup
213
214
215version 0.25 beta 2 (2013/05/24, "List Games")
216 - minor fixes
217 - print min/max global gain values
218 - small updates to the guessing engine
219 - new unique function for analyzing ancillary data
220 - decoded original length and encoder delay into OFL (original file length) block, hence
221   mp3guessenc is now able to show both these infos (this block may be found into streams
222   produced by fraunhofer encoders, such as mp3pro and mp3surround ones but also in recent
223   `plain' mp3 streams. Please note that in those cases VBRI tag often reports a wrong value
224   for encoder delay, thus a bug lies into the encoder, not mp3guessenc -- the program just
225   prints out what it reads). In case of mp3pro streams, both encoder delay and original
226   file length values (in sample units) refer to the original full-quality wave file.
227
228
229version 0.25 beta 1 (2013/03/24, "Please Please Please Let Me Release What I Want")
230 - added a version check on the lame string found in xing vbr tag in order to
231   avoid reading a lame tag where there isn't one (first lame tag appeared in v3.90,
232   previous versions just added a signature string to the xing vbr tag)
233 - detection of Ape tag v1/v2 - actually read main data, then skip it
234 - increased buffer size due to the maximum length freeformat frames can have (5760 bytes
235   when encoding 8 kHz content into a 640 kbps stream -- quite strange, yet still feasible)
236 - fixed detection of mp3Surround streams encoded with OFL (original file length) feature
237 - added detection of mp3Surround streams too!
238   (mp3Surround is another extension of mp3 which brings multi channel audio out of a
239   regular mp3 stream. Almost an un-flexible (only encodes 5.1 channels - 44.1 kHz and
240   48 kHz, and that's all) and unknown one, though)
241 - mp3guessenc is now able to detect mp3PRO streams!
242   (Well, the detection method is somewhat trivial but it works with any sample stream I
243   could test. Actually, I'm not aware of any other utility able to tell `normal'
244   mp3 streams from mp3PRO ones without the need of external closed libraries.)
245 - many integer variables are now declared as off_t (which can become 64 bit integers
246   on systems supporting them) for correct handling of large files (> 256MB)
247   Now mp3guessenc can scan files up to 2^60 bytes long. Thanks to Matthias Andree for
248   pointing me to a portable solution for large files support.
249 - show ancillary data infos (for layerIII only)
250 - fixed encoder delay info for both fhg and lame encodings
251
252
253version 0.25 alpha 24 (2013/02/21, the "Owner Of A Lonely Release" release)
254 - added workaround for buggy lame vbr tag in freeformat streams
255 - enhanced detection of frame size in layerIII free format streams
256 - sync error counter now gets updated
257 - update GUESSING ENGINE! Added support for gogo, helix and updated detection for known
258   encoders (xing/lame/fhg)
259 - refined memory requirements: less buffers, better managed
260 - more comments in bit-handling routines (now everything is clear to me, eh eh)
261 - fixed out-of-bound write in `extract_lame_string'
262 - enhanced modularity: source was splitted into modules (so mp3guessenc.c is lighter now!)
263 - refined detection of lame string into the first frame (xing/lame tag)
264 - fixed regression in lame string detection into the very last frame
265 - added missing structure initialization
266 - added tag offset value (for xing/lame/vbri tags)
267 - replaced old `for' cycles with more efficient memset/memcpy routines
268 - replaced `stat' with `stat64' in order to avoid crashes when managing large files
269 - fixed detection of long/mixed/switch blocks in compliance with lame results (short blocks
270   were already correctly detected)
271 - mp3guessenc is now lame-preset aware
272 - fixed nice coherent alignment
273
274
275version 0.25 alpha 23 (2012/04/22, the "Sparrow's Nightmare" Haiku Powered Re-release)
276 - minor modifications applied so now you can build and run mp3guessenc on Haiku R1 alpha3 also!
277
278
279version 0.25 alpha 23 (2012/04/21, the "Sparrow's Nightmare" release)
280 - added a check so now the very last frame won't be read if broken (it will be reported as garbage)
281 - enlarged buffers in order to accomodate big free format frames (I see this as a workaround and I
282   will have to fix the whole memory allocation issue when I'm into the layer III decoding details)
283 - fixed framesize detection for the very first frame
284 - fixed accurate info tag detection
285 - offset of the first frame is now printed in hex base too
286 - updated to a comfortable time print
287 - redefined some macros, optimized integer variables
288
289
290version 0.25 alpha 22 (2012/01/16, the "70 Years Are Not Enough" release)
291 - Reduced printed details if the file is not layerIII (part of the scan is not performed)
292 - Fixed details about JStereo encodings in layer I/II, now simple stereo frames are clearly printed.
293 - Updated frame histogram in order to also show custom frames generated in free format encodings
294 - Free format bitstreams are now supported!
295 - Changed the framesize handling: framesize values are now calculated before any scanning and so
296   the process is *very* fast! Before this modification, in a N-frame stream we had N calls to
297   get_framesize, now this routine is called just 14 times, regardless of the stream size!
298 - Optimized the size for bitrate arrays and histogram, since it can go up to 14, not 15
299   (bitrate index 15 is invalid!)
300 - Added a check about file type, so now special files (directory/block/char dev) are no more scanned
301
302
303version 0.25 alpha 21 (2011/12/26, the "Smells Like Release Spirit" release)
304 - `print_version()' has now two operation modes: brief and verbose.
305 - Detection (and warning about) of garbage/unrecognizable stuff at the head and tail of the mpeg file.
306 - Updated `scan' routine! Stripped off many fat statements, redundant checks, and several unused
307   variables, so now the code is light, fast and readable!
308 - A makefile appeared! Sooo comfortable :-)
309 - fixed a buffer overflow into extract_lame_string (sorry, my fault...)
310 - renamed `VbrTag.h' into `mp3guessenc.h' (I really thought I already did this before)
311 - fixed information about Mode Extension field (it changes its meaning depending upon actual layer)
312 - fixed compilation warnings even when running `gcc -Wextra ...'
313
314
315version 0.25 alpha 20 (2011/11/30, the "A Release With No Name" release)
316 - fixed the `get_framesize' routine so it now does return the right value for ANY layer and ANY mpeg
317   version.
318 - slightly reworked the `scan' routine, now calling a `scan_layerIII' sub-routine from within itself
319   just when investigating layerIII streams. Now I can check layerI, layerII and layerIII streams, even
320   if layerI is not actually giving reliable results (now fixed).
321 - fixed the check for LAME tag into the very first mpeg frame (lame 3.99alpha up to 3.99.1 compliancy)
322 - stop checks if we already are at the end of bitstream
323   [This fix allowed several alerts to disappear, uhm...]
324 - more flexible resync_mp3(): we can now skip the fseek at the beginning just calling
325   resync_mp3(fp, &h, RESYNC_POS_CURRENT), which makes the function start searching from current
326   position
327 - modified checkid3v1 and checkid3v2 in order to perform (if needed) silent detection
328 - finally fixed *ALL* compilation warnings (I usually run `gcc -Wall ...')
329 - slightly changed summary output about L/R frames, M/S frames and average bitrate so now it's
330   similar to lame cli executable messages.
331 - enriched frame histogram! Now it takes into account for different frame sizes due to
332   padding (when it's used). Output example:
333    160 kbps : 3693 (100.0%), size distr: [2035x522 bytes, 1658x523 bytes]
334   Here you can see a cbr 160 kbps encoded mp3 (44.1 kHz audio source). It uses 2035 frames without
335   padding (522 bites) and 1658 ones with padding (523 bytes). Of course, in VBR encoded files you
336   won't find any padding.
337
338
339version 0.25 alpha 19 (2011/05/03)
340 - added workaround for a random-appearing stack smashing error also causing data corruption (fixing it is another story...)
341 - finally moved all segments of the code into their own subroutines, so now main() is light and (most important!) readable
342
343
344version 0.25 alpha 18 (somewhere in the middle)
345 - fixed an insidious bug into ExtractI4 and ExtractI2 due to signedness of char
346 - completely rewritten extract_lame_string (thanks to Robert - lame-dev list on sourceforge.net)
347
348
349version 0.25 alpha (until 2011/03/04)
350 - clarify software license
351 - extended support to all layers (I/II/III) (TO BE FINISHED, eventually make guessing optional)
352 - fixed detection of xing/lame vbr/cbr tag
353 - added details about lame tag
354 - added checks to head_check2 (now just `head_check') in order to perform the full range of integrity checks on mpeg header
355 - added an on-purpose routine to compute the frame size (get_framesize)
356 - faster resync_mp3 (less in/out calls)
357 - removed gotos in extract_lame_string (oh, yeah!)
358 - added check for not-allowed modes in LayerII streams
359 - added version information
360 - added basic support for command line options (to be extended)
361 - added accurate handling of ID3tag-1.0 and ID3tag-1.1
362 - fixed detection for ID3tagV2 up to 2.3.0 (although it is still skipped at all)
363 - added nice alignment for output strings
364 - added comments to many parts of the code
365 - commented out several unused identifiers
366 - fixed most of the compilation warnings
367 - added detection of VBRI tag (added to vbr files by Fraunhofer encoders)
368
369
370