[FFmpeg-devel] [PATCH v2 4/5] avformat/chromaprint: Fix writing raw fingerprint
Andriy Gelman
andriy.gelman at gmail.com
Tue Oct 15 22:41:19 EEST 2019
On Sun, 06. Oct 01:49, Andriy Gelman wrote:
> From: Andriy Gelman <andriy.gelman at gmail.com>
>
> The pointer fp after the call to chromaprint_get_raw_fingerpoint() points to an array of uint32_t whereas the current code assumed just a char stream. Thus when writing the raw fingerprint, the output would be truncated by a factor of 4. This is fixed in the commit.
>
> For reference the declaration of the function from chromaprint.h is:
> int chromaprint_get_raw_fingerprint(ChromaprintContext *ctx, uint32_t **fingerprint, int *size);
> ---
> libavformat/chromaprint.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/libavformat/chromaprint.c b/libavformat/chromaprint.c
> index a4c0b97d99..faa92ca0db 100644
> --- a/libavformat/chromaprint.c
> +++ b/libavformat/chromaprint.c
> @@ -136,7 +136,7 @@ static int write_trailer(AVFormatContext *s)
>
> switch (cpr->fp_format) {
> case FINGERPRINT_RAW:
> - avio_write(pb, fp, size);
> + avio_write(pb, fp, size * 4); //fp points to array of uint32_t
> break;
> case FINGERPRINT_COMPRESSED:
> case FINGERPRINT_BASE64:
> --
> 2.23.0
ping
To reproduce the error, we can compare the results to fpcalc (chromaprint
utility https://acoustid.org/chromaprint)
$ ffmpeg -f lavfi -i sine=d=4 -f s16le testsample.raw
$ fpcalc -format s16le -raw -plain testsample.raw
558758263,558758263,558758263,558758263,558758263,558758263,558758263,558758263,558758263,558758263,558758263
#with ffmpeg (need to typecast output bytesteam to uint32 to compare)
$ ffmpeg -f lavfi -i sine=d=4 -f s16le -f chromaprint -fp_format raw fingerprint.raw
$ python3 -c "import numpy; print(numpy.fromfile(\"fingerprint.raw\", dtype=numpy.uint32))"
[558758263 558758263]
Applying this commit makes the outputs same size
--
Andriy
More information about the ffmpeg-devel
mailing list