diff mbox series

[FFmpeg-devel,05/15] libavformat/flacdec: Export samples md5 as metadata

Message ID a9f88de2ccfac08e94194dcd6def065f2d7527cf.camel@haerdin.se
State New
Headers show
Series Spotify patchset | expand

Checks

Context Check Description
andriy/configure_x86 warning Failed to apply patch
yinshiyou/configure_loongarch64 warning Failed to apply patch

Commit Message

Tomas Härdin Oct. 29, 2024, 2:47 p.m. UTC
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

Comments

James Almer Oct. 29, 2024, 2:57 p.m. UTC | #1
On 10/29/2024 11:47 AM, Tomas Härdin wrote:
> 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)

If this is available in extradata, why export it a second time as metadata?
Tomas Härdin Oct. 29, 2024, 3:01 p.m. UTC | #2
tis 2024-10-29 klockan 11:57 -0300 skrev James Almer:
> On 10/29/2024 11:47 AM, Tomas Härdin wrote:
> > 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)
> 
> If this is available in extradata, why export it a second time as
> metadata?

Good question. My guess is it's because extradata isn't available in
ffprobe output

/Tomas
diff mbox series

Patch

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(-)

diff --git a/libavformat/flacdec.c b/libavformat/flacdec.c
index 3c317acaee..9f65c25864 100644
--- a/libavformat/flacdec.c
+++ b/libavformat/flacdec.c
@@ -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;
diff --git a/tests/ref/fate/cover-art-aiff-id3v2-remux b/tests/ref/fate/cover-art-aiff-id3v2-remux
index a59ba37c65..57c5a9f387 100644
--- a/tests/ref/fate/cover-art-aiff-id3v2-remux
+++ b/tests/ref/fate/cover-art-aiff-id3v2-remux
@@ -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=Дороги
diff --git a/tests/ref/fate/cover-art-flac-remux b/tests/ref/fate/cover-art-flac-remux
index fa91975881..109bf7395e 100644
--- a/tests/ref/fate/cover-art-flac-remux
+++ b/tests/ref/fate/cover-art-flac-remux
@@ -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
diff --git a/tests/ref/fate/id3v2-utf16-bom b/tests/ref/fate/id3v2-utf16-bom
index dd2566de2b..a1adb4730d 100644
--- a/tests/ref/fate/id3v2-utf16-bom
+++ b/tests/ref/fate/id3v2-utf16-bom
@@ -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