[Flac-dev] Decoded files identical, encoded files different (linux vs win encoder)
Brian Willoughby
brianw at sounds.wa.com
Fri Feb 12 22:55:05 PST 2010
On Feb 12, 2010, at 18:06, Erik de Castro Lopo wrote:
> Wow, this is weird.
>
> I have a program thats part of libsndfile called sndfile-cmp. Run as:
>
> sndfile-cmp bandstand-linux.flac bandstand-win32.flac
>
> it shows nothing which means that the decoded audio of the two
> files is
> identical.
>
> However, I also have a hexdiff program which shows the two files to
> contain
> the identical byte data all the way up to offset 0x2080. Then the
> files
> diverge wildly:
>
> 00002070: FF F8 C9 A8 00 8D 4E 00 00 00 00 FF FF FF FF
> FF ......N. ........
> FF F8 C9 A8 00 8D 4E 00 00 00 00 FF FF FF FF
> FF ......N. ........
>
> 00002080: FF FF FE FF FE FF FE B4 A2 7D E8 9D 2E 79 91
> 47 ........ .}...y.G
> FF FF FE FF FE FF FE B4 A2 7D E8 9D 36 79 11
> 47 ........ .}..6y.G
>
> 00002090: 57 05 9F DD 0A 2A 54 52 A5 13 13 2D 4B 2C B2 94
> W....*TR ...-K,..
> 57 05 9F DD 0A 2A 54 52 A5 13 13 2D 4B 2C 59 4A
> W....*TR ...-K,YJ
>
> 000020A0: 95 6A 2D 25 24 85 95 96 26 49 0A 13 53 A9 24 51 .j-%
> $... &I..S.$Q
> 4A B5 16 92 92 42 CA CB 13 24 85 09 A9 D4 92 28
> J....B.. .$.....(
If you're willing to write some code, you could probably write a
simple C program that looks for FLAC block headers in two files, then
compares block by block. Once you get a mismatch in one pair of
blocks, it's probably going to take comparison by FLAC block offset
instead of file byte offset. Unfortunately, FLAC is a bit stream
(the block header is 14 bits, not 16 bits). It seems entirely
possible that after your initial mismatch above, the rest of the FLAC
blocks could be identical between the files, but their offset has
shifted by 1 to 7 bits (if it had shifted by 8 bytes, then you'd
probably notice identical bytes offset by one index).
In other words, all it takes is for one FLAC file to have a block
that is longer or shorter by a multiple of 1 to 7 bits. After that,
even if the rest of the blocks are identical, a byte comparison is
going to be different.
Brian Willoughby
Sound Consulting
More information about the Flac-dev
mailing list