From b102a409e1c62dcf3907536021f8b455d9e760a3 Mon Sep 17 00:00:00 2001
From: Mattias Wadman <wader@spotify.com>
Date: Mon, 11 Oct 2021 15:38:13 +0200
Subject: [PATCH 05/15] libavformat/flacdec: Export samples md5 as metadata
Will be used by mal to compare metadat md5 with decoded samples md5.
Part of fixing https://jira.spotify.net/browse/GOL-681
---
libavformat/flacdec.c | 6 ++++++
tests/ref/fate/cover-art-aiff-id3v2-remux | 5 +++--
tests/ref/fate/cover-art-flac-remux | 1 +
tests/ref/fate/id3v2-utf16-bom | 5 +++--
4 files changed, 13 insertions(+), 4 deletions(-)
@@ -33,6 +33,7 @@
#include "replaygain.h"
#define SEEKPOINT_SIZE 18
+#define MD5_BYTE_SIZE 16
typedef struct FLACDecContext {
FFRawDemuxerContext rawctx;
@@ -109,6 +110,7 @@ static int flac_read_header(AVFormatContext *s)
if (metadata_type == FLAC_METADATA_TYPE_STREAMINFO) {
uint32_t samplerate;
uint64_t samples;
+ char md5hex[MD5_BYTE_SIZE*2+1]; // hex representation plus null terminator
/* STREAMINFO can only occur once */
if (found_streaminfo) {
@@ -133,6 +135,10 @@ static int flac_read_header(AVFormatContext *s)
if (samples > 0)
st->duration = samples;
}
+
+ ff_data_to_hex(md5hex, st->codecpar->extradata+18, MD5_BYTE_SIZE, 1 /* lowercase */);
+ md5hex[sizeof(md5hex)-1] = '\0';
+ av_dict_set(&s->metadata, "samples_md5", md5hex, 0);
} else if (metadata_type == FLAC_METADATA_TYPE_CUESHEET) {
uint8_t isrc[13];
uint64_t start;
@@ -1,5 +1,5 @@
-330ad2bf538e91a31752b38024461df1 *tests/data/fate/cover-art-aiff-id3v2-remux.aiff
-608914 tests/data/fate/cover-art-aiff-id3v2-remux.aiff
+d8caddad3af3879f5957f71adcaedd23 *tests/data/fate/cover-art-aiff-id3v2-remux.aiff
+608970 tests/data/fate/cover-art-aiff-id3v2-remux.aiff
#tb 0: 1/44100
#media_type 0: audio
#codec_id 0: pcm_s16be
@@ -68,6 +68,7 @@ TAG:comment=Composer
[/STREAM]
[FORMAT]
TAG:artist=Мельница
+TAG:samples_md5=03462731b2dba8e6a9da639b07054121
TAG:RATING=0
TAG:album=Ангелофрения
TAG:title=Дороги
@@ -90,6 +90,7 @@ TAG:comment=Publisher/Studio logotype
TAG:title=White King Granulated Soap
[/STREAM]
[FORMAT]
+TAG:samples_md5=496206705f222f9a63bf23dc874d9d71
TAG:major_brand=M4A
TAG:minor_version=0
TAG:compatible_brands=M4A mp42isom
@@ -1,5 +1,5 @@
-9b8bfdf87a8d3d089819ef9f6f264ec4 *tests/data/fate/id3v2-utf16-bom.aiff
-885482 tests/data/fate/id3v2-utf16-bom.aiff
+b712d97d4ab0cfd77d79235c312c438a *tests/data/fate/id3v2-utf16-bom.aiff
+885538 tests/data/fate/id3v2-utf16-bom.aiff
#tb 0: 1/90000
#media_type 0: video
#codec_id 0: mjpeg
@@ -31,6 +31,7 @@ TAG:comment=Other
[/STREAM]
[FORMAT]
TAG:artist=Мельница
+TAG:samples_md5=03462731b2dba8e6a9da639b07054121
TAG:RATING=0
TAG:album=Ангелофрения
TAG:title=Дороги
--
2.39.2
Could maybe use some kind of compile-time assert that FLAC_STREAMINFO_SIZE == MD5_BYTE_SIZE + 18. I'm thinking putting in st- >codecpar->extradata + st->codecpar->extradata_size - MD5_BYTE_SIZE for the offset Spotify comments ---------------- Make it possible to verify sample checksum for FLAC files Possible other solutions: • Make ffmpeg FLAC demuxer capable of optionally check sample checksum. One tricky thing is that we currently have heuristics to not trust the checksums based on other metadata (known broken transcoding software) /Tomas