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 <impi...@gmail.com>
---
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 */
--
2.48.1
_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-le...@ffmpeg.org