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