On Sat, Aug 30, 2025 at 04:27:25PM -0700, Spencer Alves via ffmpeg-devel wrote: > The 'smpl' chunk is used for sampling music synthesizers, and includes > things like the pitch of the sample and how to loop it. This exposes the > loop points as "loop_start" and "loop_end" metadata, that the brstm, mca, > and scd demuxers already support. > > Tested with file output from "Polyphone" soundfont editor. > > Signed-off-by: Spencer Alves > --- > libavformat/wavdec.c | 22 ++++++++++++++++++++++ > 1 file changed, 22 insertions(+) > > diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c > index c65e0a2723..fb3749d64d 100644 > --- a/libavformat/wavdec.c > +++ b/libavformat/wavdec.c > @@ -595,6 +595,28 @@ static int wav_read_header(AVFormatContext *s) > } > } > break; > + case MKTAG('s', 'm', 'p', 'l'): > + if (size >= 36 && got_fmt && st->codecpar->sample_rate > 0) { > + unsigned sample_loop_count; > + avio_skip(pb, 28); > + sample_loop_count = avio_rl32(pb); > + avio_skip(pb, 4); > + for (unsigned i = 0; i < sample_loop_count; i++) { > + avio_skip(pb, 8); > + if (av_dict_set_int(&s->metadata, "loop_start", > + av_rescale(avio_rl32(pb), AV_TIME_BASE, > + st->codecpar->sample_rate), > + AV_DICT_MULTIKEY) < 0) > + return AVERROR(ENOMEM); > + avio_skip(pb, 8); > + if (av_dict_set_int(&s->metadata, "loop_end", > + av_rescale(avio_rl32(pb), AV_TIME_BASE, > + st->codecpar->sample_rate), > + AV_DICT_MULTIKEY) < 0) > + return AVERROR(ENOMEM); > + } > + } > + break; > } > /* seek to next tag unless we know that we'll run into EOF */ > -- error: corrupt patch at line 38 [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Opposition brings concord. Out of discord comes the fairest harmony. -- Heraclitus