ffmpeg-devel
Threads by month
- ----- 2026 -----
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
December 2025
- 42 participants
- 307 discussions
Currently if you encode a large wav, ffmpeg will hint after the fact
that the resultant file is corrupted, because traditional wav cannot
handle lengths greater than 32-bits. This isn't very useful; nobody
benefits from getting garbage files.
You can manually work around this by adding `-rf64 always`, which most
players have support for. Most people don't remember to do this until
after the fact when their file is corrupted, or they don't figure it out
at all and wind up using the w64 container instead.
And so that's what `-rf64 auto` is for. It uses the larger format when
needed, and if not, uses the traditional wav that is probably more
compatible. The result of using `-rf64 auto` is that you can add it to
every command line -- and should add it to every command line -- to get
either a normal small file, or a non-corrupt large file.
This is a very sensible default to have on, rather than just producing
corrupt files and having users scrambling for solutions, and then having
to do a potentially expensive reencode after. With `-rf64 auto` on by
default, the user always gets a readable good file. And for users who
sometimes want corrupt files, there still exists `-rf64 never` that can
be enabled.
The fate changes needed to be regenerated, though, because this does
change the size of the normal non 64-bit RIFF header, because the `-rf64
auto` code path still makes room for it, even if it doesn't wind up
being used. Though some old buggy players relied on having fixed 44-byte
RIFF headers, those old buggy players actually haven't worked with
ffmpeg's wav files for a long time anyway, even in `-rf64 no` mode,
because ffmpeg adds the ISFT filed for the libavformat version. So this
patch shouldn't make any difference in terms of current compatibility.
---
libavformat/wavenc.c | 2 +-
tests/ref/acodec/adpcm-adx | 2 +-
tests/ref/acodec/adpcm-argo | 2 +-
tests/ref/acodec/adpcm-ima_alp | 2 +-
tests/ref/acodec/adpcm-ima_apm | 2 +-
tests/ref/acodec/adpcm-ima_qt | 2 +-
tests/ref/acodec/adpcm-ima_qt-trellis | 2 +-
tests/ref/acodec/adpcm-ima_ssi | 2 +-
tests/ref/acodec/adpcm-ima_wav | 6 +--
tests/ref/acodec/adpcm-ima_wav-trellis | 6 +--
tests/ref/acodec/adpcm-ima_ws | 2 +-
tests/ref/acodec/adpcm-ms | 6 +--
tests/ref/acodec/adpcm-ms-trellis | 6 +--
tests/ref/acodec/adpcm-swf | 2 +-
tests/ref/acodec/adpcm-swf-trellis | 2 +-
tests/ref/acodec/adpcm-swf-wav | 6 +--
tests/ref/acodec/adpcm-yamaha | 6 +--
tests/ref/acodec/adpcm-yamaha-trellis | 6 +--
tests/ref/acodec/alac | 2 +-
tests/ref/acodec/flac | 2 +-
tests/ref/acodec/flac-exact-rice | 2 +-
tests/ref/acodec/g723_1 | 2 +-
tests/ref/acodec/mp2 | 2 +-
tests/ref/acodec/mp2fixed | 2 +-
tests/ref/acodec/pcm-alaw | 6 +--
tests/ref/acodec/pcm-f32be | 2 +-
tests/ref/acodec/pcm-f32le | 6 +--
tests/ref/acodec/pcm-f64be | 2 +-
tests/ref/acodec/pcm-f64le | 6 +--
tests/ref/acodec/pcm-mulaw | 6 +--
tests/ref/acodec/pcm-s16be | 2 +-
tests/ref/acodec/pcm-s16be_planar | 2 +-
tests/ref/acodec/pcm-s16le | 6 +--
tests/ref/acodec/pcm-s16le_planar | 2 +-
tests/ref/acodec/pcm-s24be | 2 +-
tests/ref/acodec/pcm-s24le | 6 +--
tests/ref/acodec/pcm-s24le_planar | 2 +-
tests/ref/acodec/pcm-s32be | 2 +-
tests/ref/acodec/pcm-s32le | 6 +--
tests/ref/acodec/pcm-s32le_planar | 2 +-
tests/ref/acodec/pcm-s8 | 2 +-
tests/ref/acodec/pcm-s8_planar | 2 +-
tests/ref/acodec/pcm-u16be | 2 +-
tests/ref/acodec/pcm-u16le | 2 +-
tests/ref/acodec/pcm-u24be | 2 +-
tests/ref/acodec/pcm-u24le | 2 +-
tests/ref/acodec/pcm-u32be | 2 +-
tests/ref/acodec/pcm-u32le | 2 +-
tests/ref/acodec/pcm-u8 | 6 +--
tests/ref/acodec/roqaudio | 2 +-
tests/ref/acodec/s302m | 2 +-
tests/ref/acodec/tta | 2 +-
tests/ref/acodec/wavpack | 2 +-
tests/ref/fate/gapless-mp3 | 4 +-
tests/ref/lavf/peak.wav | 4 +-
tests/ref/lavf/peak_only.wav | 4 +-
tests/ref/lavf/wav | 4 +-
tests/ref/seek/acodec-adpcm-ima_wav | 54 ++++++++++-----------
tests/ref/seek/acodec-adpcm-ima_wav-trellis | 54 ++++++++++-----------
tests/ref/seek/acodec-adpcm-ms | 54 ++++++++++-----------
tests/ref/seek/acodec-adpcm-ms-trellis | 54 ++++++++++-----------
tests/ref/seek/acodec-adpcm-yamaha | 54 ++++++++++-----------
tests/ref/seek/acodec-adpcm-yamaha-trellis | 54 ++++++++++-----------
tests/ref/seek/acodec-pcm-alaw | 54 ++++++++++-----------
tests/ref/seek/acodec-pcm-f32le | 54 ++++++++++-----------
tests/ref/seek/acodec-pcm-f64le | 54 ++++++++++-----------
tests/ref/seek/acodec-pcm-mulaw | 54 ++++++++++-----------
tests/ref/seek/acodec-pcm-s16le | 54 ++++++++++-----------
tests/ref/seek/acodec-pcm-s24le | 54 ++++++++++-----------
tests/ref/seek/acodec-pcm-s32le | 54 ++++++++++-----------
tests/ref/seek/acodec-pcm-u8 | 54 ++++++++++-----------
tests/ref/seek/lavf-wav | 30 ++++++------
72 files changed, 484 insertions(+), 484 deletions(-)
diff --git a/libavformat/wavenc.c b/libavformat/wavenc.c
index a515f4e2a2..835a2157bc 100644
--- a/libavformat/wavenc.c
+++ b/libavformat/wavenc.c
@@ -487,7 +487,7 @@ static const AVOption options[] = {
{ "off", "Do not write peak chunk.", 0, AV_OPT_TYPE_CONST, { .i64 = PEAK_OFF }, 0, 0, ENC, .unit = "peak" },
{ "on", "Append peak chunk after wav data.", 0, AV_OPT_TYPE_CONST, { .i64 = PEAK_ON }, 0, 0, ENC, .unit = "peak" },
{ "only", "Write only peak chunk, omit wav data.", 0, AV_OPT_TYPE_CONST, { .i64 = PEAK_ONLY }, 0, 0, ENC, .unit = "peak" },
- { "rf64", "Use RF64 header rather than RIFF for large files.", OFFSET(rf64), AV_OPT_TYPE_INT, { .i64 = RF64_NEVER },-1, 1, ENC, .unit = "rf64" },
+ { "rf64", "Use RF64 header rather than RIFF for large files.", OFFSET(rf64), AV_OPT_TYPE_INT, { .i64 = RF64_AUTO },-1, 1, ENC, .unit = "rf64" },
{ "auto", "Write RF64 header if file grows large enough.", 0, AV_OPT_TYPE_CONST, { .i64 = RF64_AUTO }, 0, 0, ENC, .unit = "rf64" },
{ "always", "Always write RF64 header regardless of file size.", 0, AV_OPT_TYPE_CONST, { .i64 = RF64_ALWAYS }, 0, 0, ENC, .unit = "rf64" },
{ "never", "Never write RF64 header regardless of file size.", 0, AV_OPT_TYPE_CONST, { .i64 = RF64_NEVER }, 0, 0, ENC, .unit = "rf64" },
diff --git a/tests/ref/acodec/adpcm-adx b/tests/ref/acodec/adpcm-adx
index 2c8550fb72..9dbe2c3dd6 100644
--- a/tests/ref/acodec/adpcm-adx
+++ b/tests/ref/acodec/adpcm-adx
@@ -1,4 +1,4 @@
c257001314241b469a6512616fd56548 *tests/data/fate/acodec-adpcm-adx.adx
297738 tests/data/fate/acodec-adpcm-adx.adx
-5b5a436ec9d528d6eb0bebaf667521b0 *tests/data/fate/acodec-adpcm-adx.out.wav
+7c8ce1b968483c2be151d6b68fe6ee9a *tests/data/fate/acodec-adpcm-adx.out.wav
stddev: 2549.93 PSNR: 28.20 MAXDIFF:57514 bytes: 1058400/ 1058432
diff --git a/tests/ref/acodec/adpcm-argo b/tests/ref/acodec/adpcm-argo
index 4032a8f1fe..e9eee4e6ad 100644
--- a/tests/ref/acodec/adpcm-argo
+++ b/tests/ref/acodec/adpcm-argo
@@ -1,4 +1,4 @@
14b2507d14e95c20bb7ae49b4fcbcbf1 *tests/data/fate/acodec-adpcm-argo.argo_asf
281190 tests/data/fate/acodec-adpcm-argo.argo_asf
-446f28460bdb7ff4361cf7d82ac22c3e *tests/data/fate/acodec-adpcm-argo.out.wav
+02635f8d99a0f965b0bff18a796abe6b *tests/data/fate/acodec-adpcm-argo.out.wav
stddev: 1542.05 PSNR: 32.57 MAXDIFF:59667 bytes: 1058400/ 1058432
diff --git a/tests/ref/acodec/adpcm-ima_alp b/tests/ref/acodec/adpcm-ima_alp
index a4e7143277..48d4021d9a 100644
--- a/tests/ref/acodec/adpcm-ima_alp
+++ b/tests/ref/acodec/adpcm-ima_alp
@@ -1,4 +1,4 @@
d84466bdfbe6405fa31e44df255f6aad *tests/data/fate/acodec-adpcm-ima_alp.alp
264620 tests/data/fate/acodec-adpcm-ima_alp.alp
-d60c48654568a1cf0abd56b565b12f00 *tests/data/fate/acodec-adpcm-ima_alp.out.wav
+0bc6902a854ca28230606584e2401de9 *tests/data/fate/acodec-adpcm-ima_alp.out.wav
stddev: 1467.15 PSNR: 33.00 MAXDIFF:33866 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/adpcm-ima_apm b/tests/ref/acodec/adpcm-ima_apm
index 83bd21f831..71dc885d9f 100644
--- a/tests/ref/acodec/adpcm-ima_apm
+++ b/tests/ref/acodec/adpcm-ima_apm
@@ -1,4 +1,4 @@
2e795c6c06baabe01ab92864d963e71b *tests/data/fate/acodec-adpcm-ima_apm.apm
264700 tests/data/fate/acodec-adpcm-ima_apm.apm
-201607bf7610f062b9a1e6524354c569 *tests/data/fate/acodec-adpcm-ima_apm.out.wav
+bf17cd56a9e4054f573e512ba76beecf *tests/data/fate/acodec-adpcm-ima_apm.out.wav
stddev: 904.76 PSNR: 37.20 MAXDIFF:34029 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/adpcm-ima_qt b/tests/ref/acodec/adpcm-ima_qt
index 364dfa1e0e..6e070192dd 100644
--- a/tests/ref/acodec/adpcm-ima_qt
+++ b/tests/ref/acodec/adpcm-ima_qt
@@ -1,4 +1,4 @@
44691f14cf5bbef5005df27c692b93ab *tests/data/fate/acodec-adpcm-ima_qt.aiff
281252 tests/data/fate/acodec-adpcm-ima_qt.aiff
-7d2f26ea48731b2399718de0f6c39f0c *tests/data/fate/acodec-adpcm-ima_qt.out.wav
+3ad813a6694be91ec3cf1a7e6f3d1ea9 *tests/data/fate/acodec-adpcm-ima_qt.out.wav
stddev: 904.76 PSNR: 37.20 MAXDIFF:34029 bytes: 1058400/ 1058560
diff --git a/tests/ref/acodec/adpcm-ima_qt-trellis b/tests/ref/acodec/adpcm-ima_qt-trellis
index 0a09965e1e..4a2fea14f8 100644
--- a/tests/ref/acodec/adpcm-ima_qt-trellis
+++ b/tests/ref/acodec/adpcm-ima_qt-trellis
@@ -1,4 +1,4 @@
15f895c2e7119714f94333e3214d8426 *tests/data/fate/acodec-adpcm-ima_qt-trellis.aiff
281252 tests/data/fate/acodec-adpcm-ima_qt-trellis.aiff
-593d68369c87d4e3b7323b1bea3e9315 *tests/data/fate/acodec-adpcm-ima_qt-trellis.out.wav
+50656603e3a0ec215e5582979d21d63e *tests/data/fate/acodec-adpcm-ima_qt-trellis.out.wav
stddev: 716.74 PSNR: 39.22 MAXDIFF:29633 bytes: 1058400/ 1058560
diff --git a/tests/ref/acodec/adpcm-ima_ssi b/tests/ref/acodec/adpcm-ima_ssi
index 63cc9ce277..9bc07105d9 100644
--- a/tests/ref/acodec/adpcm-ima_ssi
+++ b/tests/ref/acodec/adpcm-ima_ssi
@@ -1,4 +1,4 @@
91c6a0d8eb3544e402af17a1b77a22e5 *tests/data/fate/acodec-adpcm-ima_ssi.kvag
264614 tests/data/fate/acodec-adpcm-ima_ssi.kvag
-201607bf7610f062b9a1e6524354c569 *tests/data/fate/acodec-adpcm-ima_ssi.out.wav
+bf17cd56a9e4054f573e512ba76beecf *tests/data/fate/acodec-adpcm-ima_ssi.out.wav
stddev: 904.76 PSNR: 37.20 MAXDIFF:34029 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/adpcm-ima_wav b/tests/ref/acodec/adpcm-ima_wav
index b2cc518b1e..3c04331238 100644
--- a/tests/ref/acodec/adpcm-ima_wav
+++ b/tests/ref/acodec/adpcm-ima_wav
@@ -1,4 +1,4 @@
-af0b82a719762cc6e1a952a6081231cf *tests/data/fate/acodec-adpcm-ima_wav.wav
-267324 tests/data/fate/acodec-adpcm-ima_wav.wav
-a57d7b0ca564b5fed4bf78fc9f91d8e2 *tests/data/fate/acodec-adpcm-ima_wav.out.wav
+39d9c3b49fdae7e37b6e2ad08e41f445 *tests/data/fate/acodec-adpcm-ima_wav.wav
+267360 tests/data/fate/acodec-adpcm-ima_wav.wav
+59beba12e0ec894c78a7b46dde9896fe *tests/data/fate/acodec-adpcm-ima_wav.out.wav
stddev: 903.56 PSNR: 37.21 MAXDIFF:34029 bytes: 1058400/ 1061748
diff --git a/tests/ref/acodec/adpcm-ima_wav-trellis b/tests/ref/acodec/adpcm-ima_wav-trellis
index 008d1e4b62..959aaf2f3e 100644
--- a/tests/ref/acodec/adpcm-ima_wav-trellis
+++ b/tests/ref/acodec/adpcm-ima_wav-trellis
@@ -1,4 +1,4 @@
-6f0df0f3275f833c341d63b9054caebb *tests/data/fate/acodec-adpcm-ima_wav-trellis.wav
-267324 tests/data/fate/acodec-adpcm-ima_wav-trellis.wav
-1af83218cde84bd7cd2297c04ef97f79 *tests/data/fate/acodec-adpcm-ima_wav-trellis.out.wav
+80e7d95c1a4788006304953634b368c9 *tests/data/fate/acodec-adpcm-ima_wav-trellis.wav
+267360 tests/data/fate/acodec-adpcm-ima_wav-trellis.wav
+4a3eada38f9b6aabd5b99d53926d02ce *tests/data/fate/acodec-adpcm-ima_wav-trellis.out.wav
stddev: 710.09 PSNR: 39.30 MAXDIFF:25941 bytes: 1058400/ 1061748
diff --git a/tests/ref/acodec/adpcm-ima_ws b/tests/ref/acodec/adpcm-ima_ws
index ad2b876f0d..7916ab9f5d 100644
--- a/tests/ref/acodec/adpcm-ima_ws
+++ b/tests/ref/acodec/adpcm-ima_ws
@@ -1,4 +1,4 @@
64808f6c710d62f18a6a12e27dca1e2e *tests/data/fate/acodec-adpcm-ima_ws.wsaud
266684 tests/data/fate/acodec-adpcm-ima_ws.wsaud
-5ca78409893d1917cc42a49c96f51df8 *tests/data/fate/acodec-adpcm-ima_ws.out.wav
+433407022e9dbae44514095f984c4a6e *tests/data/fate/acodec-adpcm-ima_ws.out.wav
stddev: 905.02 PSNR: 37.20 MAXDIFF:34026 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/adpcm-ms b/tests/ref/acodec/adpcm-ms
index 9f546c9b77..7ccfb9583f 100644
--- a/tests/ref/acodec/adpcm-ms
+++ b/tests/ref/acodec/adpcm-ms
@@ -1,4 +1,4 @@
-ed29590dc005c64940c46cfe4a0e8eba *tests/data/fate/acodec-adpcm-ms.wav
-268378 tests/data/fate/acodec-adpcm-ms.wav
-7be370f937c51e8a967e6a3d08d5156a *tests/data/fate/acodec-adpcm-ms.out.wav
+590a0e48833c9202bd232d043f6c492b *tests/data/fate/acodec-adpcm-ms.wav
+268414 tests/data/fate/acodec-adpcm-ms.wav
+bcf0549dc8eebee9a29591f55464c6bd *tests/data/fate/acodec-adpcm-ms.out.wav
stddev: 1050.01 PSNR: 35.91 MAXDIFF:29806 bytes: 1058400/ 1060576
diff --git a/tests/ref/acodec/adpcm-ms-trellis b/tests/ref/acodec/adpcm-ms-trellis
index e7ea230dba..c83dc5ac81 100644
--- a/tests/ref/acodec/adpcm-ms-trellis
+++ b/tests/ref/acodec/adpcm-ms-trellis
@@ -1,4 +1,4 @@
-70deb036ed0bf3dd03699eafbbfa51b7 *tests/data/fate/acodec-adpcm-ms-trellis.wav
-268378 tests/data/fate/acodec-adpcm-ms-trellis.wav
-ed9d9cdfd264f2ec6c79127c04dd224e *tests/data/fate/acodec-adpcm-ms-trellis.out.wav
+0ff306362cda6c7de345a391acfb68eb *tests/data/fate/acodec-adpcm-ms-trellis.wav
+268414 tests/data/fate/acodec-adpcm-ms-trellis.wav
+121b756ca25b5bfe13ee32e648bb26be *tests/data/fate/acodec-adpcm-ms-trellis.out.wav
stddev: 896.03 PSNR: 37.28 MAXDIFF:28029 bytes: 1058400/ 1060576
diff --git a/tests/ref/acodec/adpcm-swf b/tests/ref/acodec/adpcm-swf
index 0bc9d6ffd0..9ab28f08ef 100644
--- a/tests/ref/acodec/adpcm-swf
+++ b/tests/ref/acodec/adpcm-swf
@@ -1,4 +1,4 @@
03bda567604b31c86c8740a044eedb1d *tests/data/fate/acodec-adpcm-swf.flv
267801 tests/data/fate/acodec-adpcm-swf.flv
-9d061488fdc1a557bdc454b9d1aba59c *tests/data/fate/acodec-adpcm-swf.out.wav
+c0373567ebdc5907034d0a7967482b24 *tests/data/fate/acodec-adpcm-swf.out.wav
stddev: 919.82 PSNR: 37.06 MAXDIFF:51119 bytes: 1058400/ 1064960
diff --git a/tests/ref/acodec/adpcm-swf-trellis b/tests/ref/acodec/adpcm-swf-trellis
index a6f9b10ac0..b8c809419e 100644
--- a/tests/ref/acodec/adpcm-swf-trellis
+++ b/tests/ref/acodec/adpcm-swf-trellis
@@ -1,4 +1,4 @@
83d6efddeb11bb0f0a4131a6384c7e4b *tests/data/fate/acodec-adpcm-swf-trellis.flv
267801 tests/data/fate/acodec-adpcm-swf-trellis.flv
-6a0007e42d92a225a8becddedccf9a0f *tests/data/fate/acodec-adpcm-swf-trellis.out.wav
+dfa3cae55be2a740a7203409e5a327e7 *tests/data/fate/acodec-adpcm-swf-trellis.out.wav
stddev: 731.05 PSNR: 39.05 MAXDIFF:51119 bytes: 1058400/ 1064960
diff --git a/tests/ref/acodec/adpcm-swf-wav b/tests/ref/acodec/adpcm-swf-wav
index a6c51c565e..3b02621067 100644
--- a/tests/ref/acodec/adpcm-swf-wav
+++ b/tests/ref/acodec/adpcm-swf-wav
@@ -1,4 +1,4 @@
-e8a4ac69e50211f3ef828d26b7051397 *tests/data/fate/acodec-adpcm-swf-wav.wav
-266624 tests/data/fate/acodec-adpcm-swf-wav.wav
-9d061488fdc1a557bdc454b9d1aba59c *tests/data/fate/acodec-adpcm-swf-wav.out.wav
+2eec671f5f766a3646f9fe87c4a5838f *tests/data/fate/acodec-adpcm-swf-wav.wav
+266660 tests/data/fate/acodec-adpcm-swf-wav.wav
+c0373567ebdc5907034d0a7967482b24 *tests/data/fate/acodec-adpcm-swf-wav.out.wav
stddev: 919.82 PSNR: 37.06 MAXDIFF:51119 bytes: 1058400/ 1064960
diff --git a/tests/ref/acodec/adpcm-yamaha b/tests/ref/acodec/adpcm-yamaha
index 8b94979245..6017ef531a 100644
--- a/tests/ref/acodec/adpcm-yamaha
+++ b/tests/ref/acodec/adpcm-yamaha
@@ -1,4 +1,4 @@
-4719ae6d28c4b13c270caefb34fde140 *tests/data/fate/acodec-adpcm-yamaha.wav
-265274 tests/data/fate/acodec-adpcm-yamaha.wav
-758b4aee62964831d0a335ada9672104 *tests/data/fate/acodec-adpcm-yamaha.out.wav
+ebcc01ca3fcdb47788d63d874e15a393 *tests/data/fate/acodec-adpcm-yamaha.wav
+265310 tests/data/fate/acodec-adpcm-yamaha.wav
+d24a84ab759df3cc6290caf9c5a8fcbd *tests/data/fate/acodec-adpcm-yamaha.out.wav
stddev: 1242.71 PSNR: 34.44 MAXDIFF:39960 bytes: 1058400/ 1060864
diff --git a/tests/ref/acodec/adpcm-yamaha-trellis b/tests/ref/acodec/adpcm-yamaha-trellis
index f653f21492..b5a6c6d370 100644
--- a/tests/ref/acodec/adpcm-yamaha-trellis
+++ b/tests/ref/acodec/adpcm-yamaha-trellis
@@ -1,4 +1,4 @@
-6601c0c29d2ac6ed2eee94b13bc3f289 *tests/data/fate/acodec-adpcm-yamaha-trellis.wav
-265274 tests/data/fate/acodec-adpcm-yamaha-trellis.wav
-8ad27b0ea7e13e70ed334b5ec26c62ef *tests/data/fate/acodec-adpcm-yamaha-trellis.out.wav
+a57a37cd6be88020d84a82c466bb9a52 *tests/data/fate/acodec-adpcm-yamaha-trellis.wav
+265310 tests/data/fate/acodec-adpcm-yamaha-trellis.wav
+d65c971e040825a5140d67afae9d7308 *tests/data/fate/acodec-adpcm-yamaha-trellis.out.wav
stddev: 926.56 PSNR: 36.99 MAXDIFF:33570 bytes: 1058400/ 1060864
diff --git a/tests/ref/acodec/alac b/tests/ref/acodec/alac
index da2a84a880..dc81bbe699 100644
--- a/tests/ref/acodec/alac
+++ b/tests/ref/acodec/alac
@@ -1,4 +1,4 @@
61b22c509780e86dfb2fd1be816d8c68 *tests/data/fate/acodec-alac.mov
389018 tests/data/fate/acodec-alac.mov
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-alac.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-alac.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/flac b/tests/ref/acodec/flac
index c2e7f2099b..b818dcc2b5 100644
--- a/tests/ref/acodec/flac
+++ b/tests/ref/acodec/flac
@@ -1,4 +1,4 @@
151eef9097f944726968bec48649f00a *tests/data/fate/acodec-flac.flac
361582 tests/data/fate/acodec-flac.flac
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-flac.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-flac.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/flac-exact-rice b/tests/ref/acodec/flac-exact-rice
index 6f6d27427d..1a3011c5bc 100644
--- a/tests/ref/acodec/flac-exact-rice
+++ b/tests/ref/acodec/flac-exact-rice
@@ -1,4 +1,4 @@
aab144de213ae684ca008a3e0afe5e28 *tests/data/fate/acodec-flac-exact-rice.flac
360454 tests/data/fate/acodec-flac-exact-rice.flac
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-flac-exact-rice.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-flac-exact-rice.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/g723_1 b/tests/ref/acodec/g723_1
index e33fe3d207..06e734b972 100644
--- a/tests/ref/acodec/g723_1
+++ b/tests/ref/acodec/g723_1
@@ -1,4 +1,4 @@
dec0deb2425e908d232d2471acff04a3 *tests/data/fate/acodec-g723_1.g723_1
4800 tests/data/fate/acodec-g723_1.g723_1
-c3b9055d1830969c10d08762fae0b787 *tests/data/fate/acodec-g723_1.out.wav
+9f28ae24ae06d9e6bd895ebb78c510e3 *tests/data/fate/acodec-g723_1.out.wav
stddev: 8423.47 PSNR: 17.82 MAXDIFF:53292 bytes: 95992/ 96000
diff --git a/tests/ref/acodec/mp2 b/tests/ref/acodec/mp2
index 57b83ac747..ffa18f50e2 100644
--- a/tests/ref/acodec/mp2
+++ b/tests/ref/acodec/mp2
@@ -1,4 +1,4 @@
f6eb0a205350bbd7fb1028a01c7ae8aa *tests/data/fate/acodec-mp2.mp2
96130 tests/data/fate/acodec-mp2.mp2
-74c7b6b15a001add199619fafe4059a1 *tests/data/fate/acodec-mp2.out.wav
+947dd52db88fa9b49994af37a884578e *tests/data/fate/acodec-mp2.out.wav
stddev: 4384.33 PSNR: 23.49 MAXDIFF:52631 bytes: 1058400/ 1057916
diff --git a/tests/ref/acodec/mp2fixed b/tests/ref/acodec/mp2fixed
index bf8cc7f372..42b9000c37 100644
--- a/tests/ref/acodec/mp2fixed
+++ b/tests/ref/acodec/mp2fixed
@@ -1,4 +1,4 @@
05445de0f0305df85db4ed0ce94e5f4c *tests/data/fate/acodec-mp2fixed.mp2
288391 tests/data/fate/acodec-mp2fixed.mp2
-b1b4a13e42db11e9fb1bd2c93692d548 *tests/data/fate/acodec-mp2fixed.out.wav
+965e8d38f8a64fc51c9020ef10578698 *tests/data/fate/acodec-mp2fixed.out.wav
stddev: 3653.84 PSNR: 25.07 MAXDIFF:39970 bytes: 1058400/ 1057916
diff --git a/tests/ref/acodec/pcm-alaw b/tests/ref/acodec/pcm-alaw
index 00555e3341..f574bb202b 100644
--- a/tests/ref/acodec/pcm-alaw
+++ b/tests/ref/acodec/pcm-alaw
@@ -1,4 +1,4 @@
-a2dd6a934ec6d5ec901a211652e85227 *tests/data/fate/acodec-pcm-alaw.wav
-529258 tests/data/fate/acodec-pcm-alaw.wav
-0568b0b9a72e31559e150e7e09d301cd *tests/data/fate/acodec-pcm-alaw.out.wav
+2c572139484868ca9f0f33cd02a347fa *tests/data/fate/acodec-pcm-alaw.wav
+529294 tests/data/fate/acodec-pcm-alaw.wav
+c3f5fe757d8d2ea9f4bbcf925c912bcc *tests/data/fate/acodec-pcm-alaw.out.wav
stddev: 101.67 PSNR: 56.19 MAXDIFF: 515 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-f32be b/tests/ref/acodec/pcm-f32be
index b98c0b7a23..5cf541a4c7 100644
--- a/tests/ref/acodec/pcm-f32be
+++ b/tests/ref/acodec/pcm-f32be
@@ -1,4 +1,4 @@
e74eb6b65cb397ce541bac120b00680a *tests/data/fate/acodec-pcm-f32be.au
2116832 tests/data/fate/acodec-pcm-f32be.au
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-f32be.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-f32be.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-f32le b/tests/ref/acodec/pcm-f32le
index c63a2c4b70..5194b47b6f 100644
--- a/tests/ref/acodec/pcm-f32le
+++ b/tests/ref/acodec/pcm-f32le
@@ -1,4 +1,4 @@
-03ae40a19deacaca6e0c4ec08dd35956 *tests/data/fate/acodec-pcm-f32le.wav
-2116858 tests/data/fate/acodec-pcm-f32le.wav
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-f32le.out.wav
+650309a7c874cb2e67f7d51218921624 *tests/data/fate/acodec-pcm-f32le.wav
+2116894 tests/data/fate/acodec-pcm-f32le.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-f32le.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-f64be b/tests/ref/acodec/pcm-f64be
index e0e03079d0..230646e13a 100644
--- a/tests/ref/acodec/pcm-f64be
+++ b/tests/ref/acodec/pcm-f64be
@@ -1,4 +1,4 @@
8c8ba9d2c68384c5f077306e220f1188 *tests/data/fate/acodec-pcm-f64be.au
4233632 tests/data/fate/acodec-pcm-f64be.au
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-f64be.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-f64be.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-f64le b/tests/ref/acodec/pcm-f64le
index 894d593ac1..cdf2f15b6b 100644
--- a/tests/ref/acodec/pcm-f64le
+++ b/tests/ref/acodec/pcm-f64le
@@ -1,4 +1,4 @@
-69ffdb079600c53a00c5b0119b586a98 *tests/data/fate/acodec-pcm-f64le.wav
-4233658 tests/data/fate/acodec-pcm-f64le.wav
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-f64le.out.wav
+d7aaf5f912e65841e0a250be82fcc4bb *tests/data/fate/acodec-pcm-f64le.wav
+4233694 tests/data/fate/acodec-pcm-f64le.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-f64le.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-mulaw b/tests/ref/acodec/pcm-mulaw
index f5c117de18..943752b471 100644
--- a/tests/ref/acodec/pcm-mulaw
+++ b/tests/ref/acodec/pcm-mulaw
@@ -1,4 +1,4 @@
-fd10ee54bd298fc29fd6fc70baa71414 *tests/data/fate/acodec-pcm-mulaw.wav
-529258 tests/data/fate/acodec-pcm-mulaw.wav
-1c3eeaa8814ebd4916780dff80ed6dc5 *tests/data/fate/acodec-pcm-mulaw.out.wav
+29b9a81ed6b36bf357379e368ee59f98 *tests/data/fate/acodec-pcm-mulaw.wav
+529294 tests/data/fate/acodec-pcm-mulaw.wav
+d38d97bd8646120812a121468114023b *tests/data/fate/acodec-pcm-mulaw.out.wav
stddev: 103.38 PSNR: 56.04 MAXDIFF: 644 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-s16be b/tests/ref/acodec/pcm-s16be
index 2c9dc4eb42..e95e3644c8 100644
--- a/tests/ref/acodec/pcm-s16be
+++ b/tests/ref/acodec/pcm-s16be
@@ -1,4 +1,4 @@
203b3a036a6403f1393e14f0916b12d7 *tests/data/fate/acodec-pcm-s16be.mov
1059069 tests/data/fate/acodec-pcm-s16be.mov
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s16be.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-s16be.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-s16be_planar b/tests/ref/acodec/pcm-s16be_planar
index 89b96f4ec8..eaa9cab5c7 100644
--- a/tests/ref/acodec/pcm-s16be_planar
+++ b/tests/ref/acodec/pcm-s16be_planar
@@ -1,4 +1,4 @@
70d169feea255cb1675342dead3457d5 *tests/data/fate/acodec-pcm-s16be_planar.nut
1060414 tests/data/fate/acodec-pcm-s16be_planar.nut
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s16be_planar.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-s16be_planar.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-s16le b/tests/ref/acodec/pcm-s16le
index 5fa80bd7a2..c75c5d17c9 100644
--- a/tests/ref/acodec/pcm-s16le
+++ b/tests/ref/acodec/pcm-s16le
@@ -1,4 +1,4 @@
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s16le.wav
-1058444 tests/data/fate/acodec-pcm-s16le.wav
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s16le.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-s16le.wav
+1058480 tests/data/fate/acodec-pcm-s16le.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-s16le.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-s16le_planar b/tests/ref/acodec/pcm-s16le_planar
index 1a0f4ae9ee..1b99a5e429 100644
--- a/tests/ref/acodec/pcm-s16le_planar
+++ b/tests/ref/acodec/pcm-s16le_planar
@@ -1,4 +1,4 @@
2c3156c45b72cbb37ffd17a2d05bd244 *tests/data/fate/acodec-pcm-s16le_planar.nut
1060414 tests/data/fate/acodec-pcm-s16le_planar.nut
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s16le_planar.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-s16le_planar.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-s24be b/tests/ref/acodec/pcm-s24be
index 165fca64e7..f8de3177eb 100644
--- a/tests/ref/acodec/pcm-s24be
+++ b/tests/ref/acodec/pcm-s24be
@@ -1,4 +1,4 @@
90ed890d45e9ea8edb37d2e2e09227df *tests/data/fate/acodec-pcm-s24be.mov
1588323 tests/data/fate/acodec-pcm-s24be.mov
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s24be.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-s24be.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-s24le b/tests/ref/acodec/pcm-s24le
index cf5ae1a2ac..c144c663c0 100644
--- a/tests/ref/acodec/pcm-s24le
+++ b/tests/ref/acodec/pcm-s24le
@@ -1,4 +1,4 @@
-18ea73985dbdf59e23f5aba66145e6fe *tests/data/fate/acodec-pcm-s24le.wav
-1587668 tests/data/fate/acodec-pcm-s24le.wav
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s24le.out.wav
+eaba228b69cc1e78a3215be66e4d1705 *tests/data/fate/acodec-pcm-s24le.wav
+1587704 tests/data/fate/acodec-pcm-s24le.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-s24le.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-s24le_planar b/tests/ref/acodec/pcm-s24le_planar
index 2ba195af0c..1efbf0a7fe 100644
--- a/tests/ref/acodec/pcm-s24le_planar
+++ b/tests/ref/acodec/pcm-s24le_planar
@@ -1,4 +1,4 @@
a490736ae2b5c358fbd6d81f63efc143 *tests/data/fate/acodec-pcm-s24le_planar.nut
1589636 tests/data/fate/acodec-pcm-s24le_planar.nut
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s24le_planar.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-s24le_planar.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-s32be b/tests/ref/acodec/pcm-s32be
index 0c4e64fd34..071cb1fd81 100644
--- a/tests/ref/acodec/pcm-s32be
+++ b/tests/ref/acodec/pcm-s32be
@@ -1,4 +1,4 @@
d18a498075997bf7221bb28ff566f0fa *tests/data/fate/acodec-pcm-s32be.mov
2117527 tests/data/fate/acodec-pcm-s32be.mov
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s32be.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-s32be.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-s32le b/tests/ref/acodec/pcm-s32le
index 47c736b9c1..5ab8f9ce22 100644
--- a/tests/ref/acodec/pcm-s32le
+++ b/tests/ref/acodec/pcm-s32le
@@ -1,4 +1,4 @@
-8d8849fa5c5d91b9cb74f5c74e937faf *tests/data/fate/acodec-pcm-s32le.wav
-2116868 tests/data/fate/acodec-pcm-s32le.wav
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s32le.out.wav
+0aee36449f86f3690243fb25f01c1715 *tests/data/fate/acodec-pcm-s32le.wav
+2116904 tests/data/fate/acodec-pcm-s32le.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-s32le.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-s32le_planar b/tests/ref/acodec/pcm-s32le_planar
index 45ab786814..f181a1dd0d 100644
--- a/tests/ref/acodec/pcm-s32le_planar
+++ b/tests/ref/acodec/pcm-s32le_planar
@@ -1,4 +1,4 @@
0fe5f93bda9400e0f1f4234eca9364eb *tests/data/fate/acodec-pcm-s32le_planar.nut
2118837 tests/data/fate/acodec-pcm-s32le_planar.nut
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s32le_planar.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-s32le_planar.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-s8 b/tests/ref/acodec/pcm-s8
index 9e9f4172b7..4b65eecdbb 100644
--- a/tests/ref/acodec/pcm-s8
+++ b/tests/ref/acodec/pcm-s8
@@ -1,4 +1,4 @@
65f02f9b48be05cf7b4d104c8a9d3566 *tests/data/fate/acodec-pcm-s8.mov
529853 tests/data/fate/acodec-pcm-s8.mov
-652edf30f35ad89bf27bcc9d2f9c7b53 *tests/data/fate/acodec-pcm-s8.out.wav
+5ec32de35bd47bd92506fc5cc507077f *tests/data/fate/acodec-pcm-s8.out.wav
stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-s8_planar b/tests/ref/acodec/pcm-s8_planar
index 7710543393..0499053cc4 100644
--- a/tests/ref/acodec/pcm-s8_planar
+++ b/tests/ref/acodec/pcm-s8_planar
@@ -1,4 +1,4 @@
f58ac9f9bca0f4b1382761b2af584a8a *tests/data/fate/acodec-pcm-s8_planar.nut
530223 tests/data/fate/acodec-pcm-s8_planar.nut
-652edf30f35ad89bf27bcc9d2f9c7b53 *tests/data/fate/acodec-pcm-s8_planar.out.wav
+5ec32de35bd47bd92506fc5cc507077f *tests/data/fate/acodec-pcm-s8_planar.out.wav
stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-u16be b/tests/ref/acodec/pcm-u16be
index 2842961bff..75cf748c2b 100644
--- a/tests/ref/acodec/pcm-u16be
+++ b/tests/ref/acodec/pcm-u16be
@@ -1,4 +1,4 @@
7d3553681858a275611288f4c3101ffe *tests/data/fate/acodec-pcm-u16be.nut
1060407 tests/data/fate/acodec-pcm-u16be.nut
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-u16be.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-u16be.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-u16le b/tests/ref/acodec/pcm-u16le
index 2bccd15b77..07af17c8de 100644
--- a/tests/ref/acodec/pcm-u16le
+++ b/tests/ref/acodec/pcm-u16le
@@ -1,4 +1,4 @@
fdaa2a0c3b8830e80187ccd4d62e0c26 *tests/data/fate/acodec-pcm-u16le.nut
1060407 tests/data/fate/acodec-pcm-u16le.nut
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-u16le.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-u16le.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-u24be b/tests/ref/acodec/pcm-u24be
index 912bb9ed0b..1916dd88aa 100644
--- a/tests/ref/acodec/pcm-u24be
+++ b/tests/ref/acodec/pcm-u24be
@@ -1,4 +1,4 @@
67f6e0040f65830ad408903a9565417c *tests/data/fate/acodec-pcm-u24be.nut
1589629 tests/data/fate/acodec-pcm-u24be.nut
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-u24be.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-u24be.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-u24le b/tests/ref/acodec/pcm-u24le
index c98e9d495d..b96758de81 100644
--- a/tests/ref/acodec/pcm-u24le
+++ b/tests/ref/acodec/pcm-u24le
@@ -1,4 +1,4 @@
ad263ac0fc0bc92f1bc20739c54b4904 *tests/data/fate/acodec-pcm-u24le.nut
1589629 tests/data/fate/acodec-pcm-u24le.nut
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-u24le.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-u24le.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-u32be b/tests/ref/acodec/pcm-u32be
index e7352254ee..5c49030b5a 100644
--- a/tests/ref/acodec/pcm-u32be
+++ b/tests/ref/acodec/pcm-u32be
@@ -1,4 +1,4 @@
114b4a686b05672f77594dfdae57694b *tests/data/fate/acodec-pcm-u32be.nut
2118830 tests/data/fate/acodec-pcm-u32be.nut
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-u32be.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-u32be.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-u32le b/tests/ref/acodec/pcm-u32le
index c1586b24eb..ebb3603539 100644
--- a/tests/ref/acodec/pcm-u32le
+++ b/tests/ref/acodec/pcm-u32le
@@ -1,4 +1,4 @@
fb33ec03170dcdb86ef17f6b0d77a3e3 *tests/data/fate/acodec-pcm-u32le.nut
2118830 tests/data/fate/acodec-pcm-u32le.nut
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-u32le.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-pcm-u32le.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/pcm-u8 b/tests/ref/acodec/pcm-u8
index c9bf04acd5..10f56201e4 100644
--- a/tests/ref/acodec/pcm-u8
+++ b/tests/ref/acodec/pcm-u8
@@ -1,4 +1,4 @@
-98cadb3502dbdc99e6e077c28b1a036c *tests/data/fate/acodec-pcm-u8.wav
-529244 tests/data/fate/acodec-pcm-u8.wav
-652edf30f35ad89bf27bcc9d2f9c7b53 *tests/data/fate/acodec-pcm-u8.out.wav
+92ed6f923664d45cc74b5bcc1f8269f9 *tests/data/fate/acodec-pcm-u8.wav
+529280 tests/data/fate/acodec-pcm-u8.wav
+5ec32de35bd47bd92506fc5cc507077f *tests/data/fate/acodec-pcm-u8.out.wav
stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/roqaudio b/tests/ref/acodec/roqaudio
index f513a03975..4abd9cb318 100644
--- a/tests/ref/acodec/roqaudio
+++ b/tests/ref/acodec/roqaudio
@@ -1,4 +1,4 @@
75859976d7098588aeaebbc5551484a9 *tests/data/fate/acodec-roqaudio.roq
265992 tests/data/fate/acodec-roqaudio.roq
-2057ed235e9d4e727e13bf57f3891093 *tests/data/fate/acodec-roqaudio.out.wav
+c51f641270f55fc9f92326955461d7ac *tests/data/fate/acodec-roqaudio.out.wav
stddev: 4481.70 PSNR: 23.30 MAXDIFF:46250 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/s302m b/tests/ref/acodec/s302m
index bc4986cabd..f2b9884e60 100644
--- a/tests/ref/acodec/s302m
+++ b/tests/ref/acodec/s302m
@@ -1,4 +1,4 @@
08a3bec0e1626ad8c8a13b181ee1afb5 *tests/data/fate/acodec-s302m.mpegts
1496104 tests/data/fate/acodec-s302m.mpegts
-abc1b26737c8103c3f122539d239f6be *tests/data/fate/acodec-s302m.out.wav
+1f69769019b318d1c1d393bb369a2907 *tests/data/fate/acodec-s302m.out.wav
stddev: 986.15 PSNR: 36.45 MAXDIFF:18571 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/tta b/tests/ref/acodec/tta
index 8e183f9922..b7fde488c3 100644
--- a/tests/ref/acodec/tta
+++ b/tests/ref/acodec/tta
@@ -1,4 +1,4 @@
847d065f082ac94825728b5f1af853eb *tests/data/fate/acodec-tta.tta
330583 tests/data/fate/acodec-tta.tta
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-tta.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-tta.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/acodec/wavpack b/tests/ref/acodec/wavpack
index 02f09ae5ed..32d66c71e6 100644
--- a/tests/ref/acodec/wavpack
+++ b/tests/ref/acodec/wavpack
@@ -1,4 +1,4 @@
000420796cc3e526650ce6f4c6334471 *tests/data/fate/acodec-wavpack.wv
338166 tests/data/fate/acodec-wavpack.wv
-95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-wavpack.out.wav
+1e55fbd7f6f2f6b916bf49dbda00ebdf *tests/data/fate/acodec-wavpack.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
diff --git a/tests/ref/fate/gapless-mp3 b/tests/ref/fate/gapless-mp3
index 98f6936c66..700908a34a 100644
--- a/tests/ref/fate/gapless-mp3
+++ b/tests/ref/fate/gapless-mp3
@@ -1,5 +1,5 @@
893b264ed688f8433d4f39f5f97aba2d *tests/data/fate/gapless-mp3.out-1
-c96c3ae7bd3300fd2f4debac222de5b7
+8170c6858a166253e6d0647789848bd6
6a87144f2777524625af4cf276b058d9 *tests/data/fate/gapless-mp3.out-2
-c96c3ae7bd3300fd2f4debac222de5b7
+8170c6858a166253e6d0647789848bd6
dc29c4091e880bbb352c668b84824ca7 *tests/data/fate/gapless-mp3.out-3
diff --git a/tests/ref/lavf/peak.wav b/tests/ref/lavf/peak.wav
index 573d53221f..51c24a8a23 100644
--- a/tests/ref/lavf/peak.wav
+++ b/tests/ref/lavf/peak.wav
@@ -1,3 +1,3 @@
-105805963fb767d00da056f42f32d9f3 *tests/data/lavf/lavf.peak.wav
-89094 tests/data/lavf/lavf.peak.wav
+fdab4bbac72e8f562878fb584ac469f8 *tests/data/lavf/lavf.peak.wav
+89130 tests/data/lavf/lavf.peak.wav
tests/data/lavf/lavf.peak.wav CRC=0x3a1da17e
diff --git a/tests/ref/lavf/peak_only.wav b/tests/ref/lavf/peak_only.wav
index 9548e639f8..78a0bb472c 100644
--- a/tests/ref/lavf/peak_only.wav
+++ b/tests/ref/lavf/peak_only.wav
@@ -1,2 +1,2 @@
-f1a8aeeae8069f3992c4d780436c3d23 *tests/data/lavf/lavf.peak_only.wav
-832 tests/data/lavf/lavf.peak_only.wav
+63bfe87d41fbaf3a0ec6f9efc0525dd7 *tests/data/lavf/lavf.peak_only.wav
+868 tests/data/lavf/lavf.peak_only.wav
diff --git a/tests/ref/lavf/wav b/tests/ref/lavf/wav
index 0540eab07c..35e5142542 100644
--- a/tests/ref/lavf/wav
+++ b/tests/ref/lavf/wav
@@ -1,3 +1,3 @@
-fc958a32b4fca7b1c40cbdaef2d1416e *tests/data/lavf/lavf.wav
-88274 tests/data/lavf/lavf.wav
+ffe686b3a063dc23c4df34b555fbedda *tests/data/lavf/lavf.wav
+88310 tests/data/lavf/lavf.wav
tests/data/lavf/lavf.wav CRC=0x3a1da17e
diff --git a/tests/ref/seek/acodec-adpcm-ima_wav b/tests/ref/seek/acodec-adpcm-ima_wav
index b6517c5438..7397c9e205 100644
--- a/tests/ref/seek/acodec-adpcm-ima_wav
+++ b/tests/ref/seek/acodec-adpcm-ima_wav
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.856009 pts: 1.856009 pos: 29756 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.856009 pts: 1.856009 pos: 29792 size: 4096
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.831995 pts: 0.831995 pos: 13372 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.831995 pts: 0.831995 pos: 13408 size: 4096
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.623991 pts: 2.623991 pos: 42044 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.623991 pts: 2.623991 pos: 42080 size: 4096
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.408005 pts: 1.408005 pos: 22588 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.408005 pts: 1.408005 pos: 22624 size: 4096
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.383991 pts: 0.383991 pos: 6204 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.383991 pts: 0.383991 pos: 6240 size: 4096
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.176009 pts: 2.176009 pos: 34876 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.176009 pts: 2.176009 pos: 34912 size: 4096
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.023991 pts: 1.023991 pos: 16444 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.023991 pts: 1.023991 pos: 16480 size: 4096
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.816009 pts: 2.816009 pos: 45116 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.816009 pts: 2.816009 pos: 45152 size: 4096
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.791995 pts: 1.791995 pos: 28732 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.791995 pts: 1.791995 pos: 28768 size: 4096
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.576009 pts: 0.576009 pos: 9276 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.576009 pts: 0.576009 pos: 9312 size: 4096
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.368005 pts: 2.368005 pos: 37948 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.368005 pts: 2.368005 pos: 37984 size: 4096
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.343991 pts: 1.343991 pos: 21564 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.343991 pts: 1.343991 pos: 21600 size: 4096
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.191995 pts: 0.191995 pos: 3132 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.191995 pts: 0.191995 pos: 3168 size: 4096
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.983991 pts: 1.983991 pos: 31804 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.983991 pts: 1.983991 pos: 31840 size: 4096
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.896009 pts: 0.896009 pos: 14396 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.896009 pts: 0.896009 pos: 14432 size: 4096
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.688005 pts: 2.688005 pos: 43068 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.688005 pts: 2.688005 pos: 43104 size: 4096
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.536009 pts: 1.536009 pos: 24636 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.536009 pts: 1.536009 pos: 24672 size: 4096
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.511995 pts: 0.511995 pos: 8252 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.511995 pts: 0.511995 pos: 8288 size: 4096
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
diff --git a/tests/ref/seek/acodec-adpcm-ima_wav-trellis b/tests/ref/seek/acodec-adpcm-ima_wav-trellis
index b6517c5438..7397c9e205 100644
--- a/tests/ref/seek/acodec-adpcm-ima_wav-trellis
+++ b/tests/ref/seek/acodec-adpcm-ima_wav-trellis
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.856009 pts: 1.856009 pos: 29756 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.856009 pts: 1.856009 pos: 29792 size: 4096
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.831995 pts: 0.831995 pos: 13372 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.831995 pts: 0.831995 pos: 13408 size: 4096
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.623991 pts: 2.623991 pos: 42044 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.623991 pts: 2.623991 pos: 42080 size: 4096
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.408005 pts: 1.408005 pos: 22588 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.408005 pts: 1.408005 pos: 22624 size: 4096
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.383991 pts: 0.383991 pos: 6204 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.383991 pts: 0.383991 pos: 6240 size: 4096
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.176009 pts: 2.176009 pos: 34876 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.176009 pts: 2.176009 pos: 34912 size: 4096
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.023991 pts: 1.023991 pos: 16444 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.023991 pts: 1.023991 pos: 16480 size: 4096
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.816009 pts: 2.816009 pos: 45116 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.816009 pts: 2.816009 pos: 45152 size: 4096
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.791995 pts: 1.791995 pos: 28732 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.791995 pts: 1.791995 pos: 28768 size: 4096
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.576009 pts: 0.576009 pos: 9276 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.576009 pts: 0.576009 pos: 9312 size: 4096
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.368005 pts: 2.368005 pos: 37948 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.368005 pts: 2.368005 pos: 37984 size: 4096
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.343991 pts: 1.343991 pos: 21564 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.343991 pts: 1.343991 pos: 21600 size: 4096
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.191995 pts: 0.191995 pos: 3132 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.191995 pts: 0.191995 pos: 3168 size: 4096
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.983991 pts: 1.983991 pos: 31804 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.983991 pts: 1.983991 pos: 31840 size: 4096
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.896009 pts: 0.896009 pos: 14396 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.896009 pts: 0.896009 pos: 14432 size: 4096
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.688005 pts: 2.688005 pos: 43068 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.688005 pts: 2.688005 pos: 43104 size: 4096
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.536009 pts: 1.536009 pos: 24636 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.536009 pts: 1.536009 pos: 24672 size: 4096
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.511995 pts: 0.511995 pos: 8252 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.511995 pts: 0.511995 pos: 8288 size: 4096
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 60 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 96 size: 4096
diff --git a/tests/ref/seek/acodec-adpcm-ms b/tests/ref/seek/acodec-adpcm-ms
index 579be7f416..936a91f2e0 100644
--- a/tests/ref/seek/acodec-adpcm-ms
+++ b/tests/ref/seek/acodec-adpcm-ms
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.856009 pts: 1.856009 pos: 29786 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.856009 pts: 1.856009 pos: 29822 size: 4096
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.831995 pts: 0.831995 pos: 13402 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.831995 pts: 0.831995 pos: 13438 size: 4096
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.623991 pts: 2.623991 pos: 42074 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.623991 pts: 2.623991 pos: 42110 size: 4096
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.408005 pts: 1.408005 pos: 22618 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.408005 pts: 1.408005 pos: 22654 size: 4096
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.383991 pts: 0.383991 pos: 6234 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.383991 pts: 0.383991 pos: 6270 size: 4096
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.176009 pts: 2.176009 pos: 34906 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.176009 pts: 2.176009 pos: 34942 size: 4096
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.023991 pts: 1.023991 pos: 16474 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.023991 pts: 1.023991 pos: 16510 size: 4096
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.816009 pts: 2.816009 pos: 45146 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.816009 pts: 2.816009 pos: 45182 size: 4096
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.791995 pts: 1.791995 pos: 28762 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.791995 pts: 1.791995 pos: 28798 size: 4096
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.576009 pts: 0.576009 pos: 9306 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.576009 pts: 0.576009 pos: 9342 size: 4096
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.368005 pts: 2.368005 pos: 37978 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.368005 pts: 2.368005 pos: 38014 size: 4096
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.343991 pts: 1.343991 pos: 21594 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.343991 pts: 1.343991 pos: 21630 size: 4096
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.191995 pts: 0.191995 pos: 3162 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.191995 pts: 0.191995 pos: 3198 size: 4096
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.983991 pts: 1.983991 pos: 31834 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.983991 pts: 1.983991 pos: 31870 size: 4096
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.896009 pts: 0.896009 pos: 14426 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.896009 pts: 0.896009 pos: 14462 size: 4096
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.688005 pts: 2.688005 pos: 43098 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.688005 pts: 2.688005 pos: 43134 size: 4096
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.536009 pts: 1.536009 pos: 24666 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.536009 pts: 1.536009 pos: 24702 size: 4096
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.511995 pts: 0.511995 pos: 8282 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.511995 pts: 0.511995 pos: 8318 size: 4096
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
diff --git a/tests/ref/seek/acodec-adpcm-ms-trellis b/tests/ref/seek/acodec-adpcm-ms-trellis
index 579be7f416..936a91f2e0 100644
--- a/tests/ref/seek/acodec-adpcm-ms-trellis
+++ b/tests/ref/seek/acodec-adpcm-ms-trellis
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.856009 pts: 1.856009 pos: 29786 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.856009 pts: 1.856009 pos: 29822 size: 4096
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.831995 pts: 0.831995 pos: 13402 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.831995 pts: 0.831995 pos: 13438 size: 4096
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.623991 pts: 2.623991 pos: 42074 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.623991 pts: 2.623991 pos: 42110 size: 4096
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.408005 pts: 1.408005 pos: 22618 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.408005 pts: 1.408005 pos: 22654 size: 4096
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.383991 pts: 0.383991 pos: 6234 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.383991 pts: 0.383991 pos: 6270 size: 4096
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.176009 pts: 2.176009 pos: 34906 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.176009 pts: 2.176009 pos: 34942 size: 4096
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.023991 pts: 1.023991 pos: 16474 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.023991 pts: 1.023991 pos: 16510 size: 4096
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.816009 pts: 2.816009 pos: 45146 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.816009 pts: 2.816009 pos: 45182 size: 4096
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.791995 pts: 1.791995 pos: 28762 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.791995 pts: 1.791995 pos: 28798 size: 4096
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.576009 pts: 0.576009 pos: 9306 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.576009 pts: 0.576009 pos: 9342 size: 4096
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.368005 pts: 2.368005 pos: 37978 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.368005 pts: 2.368005 pos: 38014 size: 4096
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.343991 pts: 1.343991 pos: 21594 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.343991 pts: 1.343991 pos: 21630 size: 4096
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.191995 pts: 0.191995 pos: 3162 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.191995 pts: 0.191995 pos: 3198 size: 4096
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.983991 pts: 1.983991 pos: 31834 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.983991 pts: 1.983991 pos: 31870 size: 4096
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.896009 pts: 0.896009 pos: 14426 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.896009 pts: 0.896009 pos: 14462 size: 4096
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.688005 pts: 2.688005 pos: 43098 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.688005 pts: 2.688005 pos: 43134 size: 4096
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.536009 pts: 1.536009 pos: 24666 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.536009 pts: 1.536009 pos: 24702 size: 4096
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.511995 pts: 0.511995 pos: 8282 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.511995 pts: 0.511995 pos: 8318 size: 4096
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 90 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 126 size: 4096
diff --git a/tests/ref/seek/acodec-adpcm-yamaha b/tests/ref/seek/acodec-adpcm-yamaha
index 5cbfaed73e..c149e2c077 100644
--- a/tests/ref/seek/acodec-adpcm-yamaha
+++ b/tests/ref/seek/acodec-adpcm-yamaha
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.856009 pts: 1.856009 pos: 29754 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.856009 pts: 1.856009 pos: 29790 size: 4096
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.831995 pts: 0.831995 pos: 13370 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.831995 pts: 0.831995 pos: 13406 size: 4096
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.623991 pts: 2.623991 pos: 42042 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.623991 pts: 2.623991 pos: 42078 size: 4096
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.408005 pts: 1.408005 pos: 22586 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.408005 pts: 1.408005 pos: 22622 size: 4096
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.383991 pts: 0.383991 pos: 6202 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.383991 pts: 0.383991 pos: 6238 size: 4096
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.176009 pts: 2.176009 pos: 34874 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.176009 pts: 2.176009 pos: 34910 size: 4096
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.023991 pts: 1.023991 pos: 16442 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.023991 pts: 1.023991 pos: 16478 size: 4096
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.816009 pts: 2.816009 pos: 45114 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.816009 pts: 2.816009 pos: 45150 size: 4096
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.791995 pts: 1.791995 pos: 28730 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.791995 pts: 1.791995 pos: 28766 size: 4096
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.576009 pts: 0.576009 pos: 9274 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.576009 pts: 0.576009 pos: 9310 size: 4096
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.368005 pts: 2.368005 pos: 37946 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.368005 pts: 2.368005 pos: 37982 size: 4096
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.343991 pts: 1.343991 pos: 21562 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.343991 pts: 1.343991 pos: 21598 size: 4096
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.191995 pts: 0.191995 pos: 3130 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.191995 pts: 0.191995 pos: 3166 size: 4096
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.983991 pts: 1.983991 pos: 31802 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.983991 pts: 1.983991 pos: 31838 size: 4096
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.896009 pts: 0.896009 pos: 14394 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.896009 pts: 0.896009 pos: 14430 size: 4096
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.688005 pts: 2.688005 pos: 43066 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.688005 pts: 2.688005 pos: 43102 size: 4096
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.536009 pts: 1.536009 pos: 24634 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.536009 pts: 1.536009 pos: 24670 size: 4096
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.511995 pts: 0.511995 pos: 8250 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.511995 pts: 0.511995 pos: 8286 size: 4096
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
diff --git a/tests/ref/seek/acodec-adpcm-yamaha-trellis b/tests/ref/seek/acodec-adpcm-yamaha-trellis
index 5cbfaed73e..c149e2c077 100644
--- a/tests/ref/seek/acodec-adpcm-yamaha-trellis
+++ b/tests/ref/seek/acodec-adpcm-yamaha-trellis
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.856009 pts: 1.856009 pos: 29754 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.856009 pts: 1.856009 pos: 29790 size: 4096
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.831995 pts: 0.831995 pos: 13370 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.831995 pts: 0.831995 pos: 13406 size: 4096
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.623991 pts: 2.623991 pos: 42042 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.623991 pts: 2.623991 pos: 42078 size: 4096
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.408005 pts: 1.408005 pos: 22586 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.408005 pts: 1.408005 pos: 22622 size: 4096
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.383991 pts: 0.383991 pos: 6202 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.383991 pts: 0.383991 pos: 6238 size: 4096
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.176009 pts: 2.176009 pos: 34874 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.176009 pts: 2.176009 pos: 34910 size: 4096
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.023991 pts: 1.023991 pos: 16442 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.023991 pts: 1.023991 pos: 16478 size: 4096
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.816009 pts: 2.816009 pos: 45114 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.816009 pts: 2.816009 pos: 45150 size: 4096
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.791995 pts: 1.791995 pos: 28730 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.791995 pts: 1.791995 pos: 28766 size: 4096
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.576009 pts: 0.576009 pos: 9274 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.576009 pts: 0.576009 pos: 9310 size: 4096
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.368005 pts: 2.368005 pos: 37946 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.368005 pts: 2.368005 pos: 37982 size: 4096
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.343991 pts: 1.343991 pos: 21562 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.343991 pts: 1.343991 pos: 21598 size: 4096
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.191995 pts: 0.191995 pos: 3130 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.191995 pts: 0.191995 pos: 3166 size: 4096
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.983991 pts: 1.983991 pos: 31802 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.983991 pts: 1.983991 pos: 31838 size: 4096
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.896009 pts: 0.896009 pos: 14394 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.896009 pts: 0.896009 pos: 14430 size: 4096
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.688005 pts: 2.688005 pos: 43066 size: 4096
+ret: 0 st: 0 flags:1 dts: 2.688005 pts: 2.688005 pos: 43102 size: 4096
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.536009 pts: 1.536009 pos: 24634 size: 4096
+ret: 0 st: 0 flags:1 dts: 1.536009 pts: 1.536009 pos: 24670 size: 4096
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.511995 pts: 0.511995 pos: 8250 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.511995 pts: 0.511995 pos: 8286 size: 4096
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 4096
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 4096
diff --git a/tests/ref/seek/acodec-pcm-alaw b/tests/ref/seek/acodec-pcm-alaw
index dacf75d365..aba81aa513 100644
--- a/tests/ref/seek/acodec-pcm-alaw
+++ b/tests/ref/seek/acodec-pcm-alaw
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 167124 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 167160 size: 8192
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 69590 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 69626 size: 8192
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 227320 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 227356 size: 8192
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 129786 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 129822 size: 8192
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 32252 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 32288 size: 8192
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 189982 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 190018 size: 8192
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 92448 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 92484 size: 8192
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos: 250178 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos: 250214 size: 8192
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 152644 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 152680 size: 8192
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 55110 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 55146 size: 8192
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 212840 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 212876 size: 8192
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 115306 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 115342 size: 8192
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 17772 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 17808 size: 8192
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 175504 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 175540 size: 8192
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 77968 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 78004 size: 8192
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 235700 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 235736 size: 8192
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 138166 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 138202 size: 8192
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 40630 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 40666 size: 8192
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
diff --git a/tests/ref/seek/acodec-pcm-f32le b/tests/ref/seek/acodec-pcm-f32le
index 145d9fc9ad..ab8a22faf4 100644
--- a/tests/ref/seek/acodec-pcm-f32le
+++ b/tests/ref/seek/acodec-pcm-f32le
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 32768
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 32768
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 668322 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 668358 size: 32768
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 278186 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 278222 size: 32768
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 32768
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 909106 size: 32768
+ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 909142 size: 32768
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 518970 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 519006 size: 32768
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 128834 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 128870 size: 32768
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 32768
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 759754 size: 32768
+ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 759790 size: 32768
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 369618 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 369654 size: 32768
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 32768
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos:1000538 size: 32768
+ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos:1000574 size: 32768
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 610402 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 610438 size: 32768
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 220266 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 220302 size: 32768
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 32768
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 851186 size: 32768
+ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 851222 size: 32768
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 461050 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 461086 size: 32768
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 70914 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 70950 size: 32768
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 32768
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 701842 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 701878 size: 32768
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 311698 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 311734 size: 32768
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 32768
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 942626 size: 32768
+ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 942662 size: 32768
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 552490 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 552526 size: 32768
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 162346 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 162382 size: 32768
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 32768
diff --git a/tests/ref/seek/acodec-pcm-f64le b/tests/ref/seek/acodec-pcm-f64le
index 7d7d73dd81..51bf758cda 100644
--- a/tests/ref/seek/acodec-pcm-f64le
+++ b/tests/ref/seek/acodec-pcm-f64le
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 65536
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 65536
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos:1336586 size: 65536
+ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos:1336622 size: 65536
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 556314 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 556350 size: 65536
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 65536
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos:1818154 size: 65536
+ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos:1818190 size: 65536
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos:1037882 size: 65536
+ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos:1037918 size: 65536
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 257610 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 257646 size: 65536
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 65536
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos:1519450 size: 65536
+ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos:1519486 size: 65536
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 739178 size: 65536
+ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 739214 size: 65536
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 65536
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos:2001018 size: 65536
+ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos:2001054 size: 65536
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos:1220746 size: 65536
+ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos:1220782 size: 65536
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 440474 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 440510 size: 65536
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 65536
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos:1702314 size: 65536
+ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos:1702350 size: 65536
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 922042 size: 65536
+ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 922078 size: 65536
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 141770 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 141806 size: 65536
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 65536
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos:1403626 size: 65536
+ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos:1403662 size: 65536
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 623338 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 623374 size: 65536
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 65536
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos:1885194 size: 65536
+ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos:1885230 size: 65536
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos:1104922 size: 65536
+ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos:1104958 size: 65536
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 324634 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 324670 size: 65536
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 65536
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 65536
diff --git a/tests/ref/seek/acodec-pcm-mulaw b/tests/ref/seek/acodec-pcm-mulaw
index dacf75d365..aba81aa513 100644
--- a/tests/ref/seek/acodec-pcm-mulaw
+++ b/tests/ref/seek/acodec-pcm-mulaw
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 167124 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 167160 size: 8192
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 69590 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 69626 size: 8192
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 227320 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 227356 size: 8192
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 129786 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 129822 size: 8192
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 32252 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 32288 size: 8192
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 189982 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 190018 size: 8192
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 92448 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 92484 size: 8192
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos: 250178 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos: 250214 size: 8192
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 152644 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 152680 size: 8192
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 55110 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 55146 size: 8192
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 212840 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 212876 size: 8192
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 115306 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 115342 size: 8192
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 17772 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 17808 size: 8192
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 175504 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 175540 size: 8192
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 77968 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 78004 size: 8192
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 235700 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 235736 size: 8192
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 138166 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 138202 size: 8192
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 40630 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 40666 size: 8192
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 58 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 94 size: 8192
diff --git a/tests/ref/seek/acodec-pcm-s16le b/tests/ref/seek/acodec-pcm-s16le
index c2ec8dd933..9a6727f2d1 100644
--- a/tests/ref/seek/acodec-pcm-s16le
+++ b/tests/ref/seek/acodec-pcm-s16le
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 16384
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 16384
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 334176 size: 16384
+ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 334212 size: 16384
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 139108 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 139144 size: 16384
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 16384
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 454568 size: 16384
+ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 454604 size: 16384
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 259500 size: 16384
+ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 259536 size: 16384
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 64432 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 64468 size: 16384
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 16384
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 379892 size: 16384
+ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 379928 size: 16384
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 184824 size: 16384
+ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 184860 size: 16384
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 16384
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos: 500284 size: 16384
+ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos: 500320 size: 16384
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 305216 size: 16384
+ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 305252 size: 16384
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 110148 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 110184 size: 16384
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 16384
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 425608 size: 16384
+ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 425644 size: 16384
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 230540 size: 16384
+ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 230576 size: 16384
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 35472 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 35508 size: 16384
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 16384
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 350936 size: 16384
+ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 350972 size: 16384
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 155864 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 155900 size: 16384
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 16384
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 471328 size: 16384
+ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 471364 size: 16384
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 276260 size: 16384
+ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 276296 size: 16384
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 81188 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 81224 size: 16384
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 16384
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 16384
diff --git a/tests/ref/seek/acodec-pcm-s24le b/tests/ref/seek/acodec-pcm-s24le
index 05beb56e95..f998433e46 100644
--- a/tests/ref/seek/acodec-pcm-s24le
+++ b/tests/ref/seek/acodec-pcm-s24le
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 24576
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 24576
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 501266 size: 24576
+ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 501302 size: 24576
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 208664 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 208700 size: 24576
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 24576
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 681854 size: 24576
+ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 681890 size: 24576
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 389252 size: 24576
+ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 389288 size: 24576
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 96650 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 96686 size: 24576
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 24576
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 569840 size: 24576
+ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 569876 size: 24576
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 277238 size: 24576
+ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 277274 size: 24576
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 24576
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos: 750428 size: 24576
+ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos: 750464 size: 24576
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 457826 size: 24576
+ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 457862 size: 24576
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 165224 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 165260 size: 24576
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 24576
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 638414 size: 24576
+ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 638450 size: 24576
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 345812 size: 24576
+ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 345848 size: 24576
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 53210 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 53246 size: 24576
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 24576
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 526406 size: 24576
+ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 526442 size: 24576
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 233798 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 233834 size: 24576
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 24576
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 706994 size: 24576
+ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 707030 size: 24576
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 414392 size: 24576
+ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 414428 size: 24576
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 121784 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 121820 size: 24576
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 24576
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 24576
diff --git a/tests/ref/seek/acodec-pcm-s32le b/tests/ref/seek/acodec-pcm-s32le
index f2b15c2a68..6602ccece9 100644
--- a/tests/ref/seek/acodec-pcm-s32le
+++ b/tests/ref/seek/acodec-pcm-s32le
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 32768
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 32768
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 668332 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 668368 size: 32768
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 278196 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 278232 size: 32768
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 32768
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 909116 size: 32768
+ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 909152 size: 32768
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 518980 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 519016 size: 32768
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 128844 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 128880 size: 32768
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 32768
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 759764 size: 32768
+ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 759800 size: 32768
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 369628 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 369664 size: 32768
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 32768
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos:1000548 size: 32768
+ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos:1000584 size: 32768
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 610412 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 610448 size: 32768
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 220276 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 220312 size: 32768
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 32768
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 851196 size: 32768
+ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 851232 size: 32768
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 461060 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 461096 size: 32768
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 70924 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 70960 size: 32768
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 32768
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 701852 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 701888 size: 32768
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 311708 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 311744 size: 32768
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 32768
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 942636 size: 32768
+ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 942672 size: 32768
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 552500 size: 32768
+ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 552536 size: 32768
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 162356 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 162392 size: 32768
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 68 size: 32768
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 104 size: 32768
diff --git a/tests/ref/seek/acodec-pcm-u8 b/tests/ref/seek/acodec-pcm-u8
index 5a02f6b845..6b4e066a1c 100644
--- a/tests/ref/seek/acodec-pcm-u8
+++ b/tests/ref/seek/acodec-pcm-u8
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 8192
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 8192
ret: 0 st:-1 flags:1 ts: 1.894167
-ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 167110 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.894172 pts: 1.894172 pos: 167146 size: 8192
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 69576 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 69612 size: 8192
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 8192
ret: 0 st:-1 flags:0 ts: 2.576668
-ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 227306 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.576667 pts: 2.576667 pos: 227342 size: 8192
ret: 0 st:-1 flags:1 ts: 1.470835
-ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 129772 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos: 129808 size: 8192
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 32238 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 32274 size: 8192
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 8192
ret: 0 st:-1 flags:0 ts: 2.153336
-ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 189968 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.153333 pts: 2.153333 pos: 190004 size: 8192
ret: 0 st:-1 flags:1 ts: 1.047503
-ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 92434 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.047506 pts: 1.047506 pos: 92470 size: 8192
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 8192
ret: 0 st: 0 flags:1 ts: 2.835828
-ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos: 250164 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.835828 pts: 2.835828 pos: 250200 size: 8192
ret: 0 st:-1 flags:0 ts: 1.730004
-ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 152630 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.730000 pts: 1.730000 pos: 152666 size: 8192
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 55096 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 55132 size: 8192
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 8192
ret: 0 st: 0 flags:1 ts: 2.412494
-ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 212826 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.412494 pts: 2.412494 pos: 212862 size: 8192
ret: 0 st:-1 flags:0 ts: 1.306672
-ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 115292 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos: 115328 size: 8192
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 17758 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 17794 size: 8192
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 8192
ret: 0 st: 0 flags:1 ts: 1.989184
-ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 175490 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.989184 pts: 1.989184 pos: 175526 size: 8192
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 77954 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 77990 size: 8192
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 8192
ret: 0 st: 0 flags:0 ts: 2.671678
-ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 235686 size: 8192
+ret: 0 st: 0 flags:1 dts: 2.671678 pts: 2.671678 pos: 235722 size: 8192
ret: 0 st: 0 flags:1 ts: 1.565850
-ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 138152 size: 8192
+ret: 0 st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos: 138188 size: 8192
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 40616 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 40652 size: 8192
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 44 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 80 size: 8192
diff --git a/tests/ref/seek/lavf-wav b/tests/ref/seek/lavf-wav
index c3e90b6a22..20362552bd 100644
--- a/tests/ref/seek/lavf-wav
+++ b/tests/ref/seek/lavf-wav
@@ -1,53 +1,53 @@
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 74 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 110 size: 8192
ret: 0 st:-1 flags:0 ts:-1.000000
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 74 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 110 size: 8192
ret: 0 st:-1 flags:1 ts: 1.894167
ret:-EOF
ret: 0 st: 0 flags:0 ts: 0.788345
-ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 69606 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos: 69642 size: 8192
ret: 0 st: 0 flags:1 ts:-0.317506
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 74 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 110 size: 8192
ret: 0 st:-1 flags:0 ts: 2.576668
ret:-EOF
ret: 0 st:-1 flags:1 ts: 1.470835
ret:-EOF
ret: 0 st: 0 flags:0 ts: 0.365011
-ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 32268 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.365011 pts: 0.365011 pos: 32304 size: 8192
ret: 0 st: 0 flags:1 ts:-0.740839
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 74 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 110 size: 8192
ret: 0 st:-1 flags:0 ts: 2.153336
ret:-EOF
ret: 0 st:-1 flags:1 ts: 1.047503
ret:-EOF
ret: 0 st: 0 flags:0 ts:-0.058322
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 74 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 110 size: 8192
ret: 0 st: 0 flags:1 ts: 2.835828
ret:-EOF
ret: 0 st:-1 flags:0 ts: 1.730004
ret:-EOF
ret: 0 st:-1 flags:1 ts: 0.624171
-ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 55126 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos: 55162 size: 8192
ret: 0 st: 0 flags:0 ts:-0.481655
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 74 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 110 size: 8192
ret: 0 st: 0 flags:1 ts: 2.412494
ret:-EOF
ret: 0 st:-1 flags:0 ts: 1.306672
ret:-EOF
ret: 0 st:-1 flags:1 ts: 0.200839
-ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 17788 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.200839 pts: 0.200839 pos: 17824 size: 8192
ret: 0 st: 0 flags:0 ts:-0.904989
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 74 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 110 size: 8192
ret: 0 st: 0 flags:1 ts: 1.989184
ret:-EOF
ret: 0 st:-1 flags:0 ts: 0.883340
-ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 77984 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.883333 pts: 0.883333 pos: 78020 size: 8192
ret: 0 st:-1 flags:1 ts:-0.222493
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 74 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 110 size: 8192
ret: 0 st: 0 flags:0 ts: 2.671678
ret:-EOF
ret: 0 st: 0 flags:1 ts: 1.565850
ret:-EOF
ret: 0 st:-1 flags:0 ts: 0.460008
-ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 40646 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos: 40682 size: 8192
ret: 0 st:-1 flags:1 ts:-0.645825
-ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 74 size: 8192
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 110 size: 8192
--
2.52.0
3
2
PR #21307 opened by Jun Zhao (mypopydev)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21307
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21307.patch
This patch series V2 adds support for carrying AV1 video streams in MPEG-2 Transport Stream
containers, following the AOM "Carriage of AV1 in MPEG-2 TS" specification.
Key Features
- MPEG-TS Muxer: Converts AV1 from Section 5 (low overhead) format to start code format,
where each OBU is prefixed with a 0x000001 start code. Includes Registration Descriptor ('AV01')
and AV1 Video Descriptor (0x80) in PMT.
- MPEG-TS Demuxer: Identifies AV1 streams by stream_type 0x06 (private data) and
Registration Descriptor. Outputs AV1 data in start code format.
- av1_tstosection5 BSF: Converts AV1 from MPEG-TS start code format back to Section 5
format for compatibility with other containers and decoders. Automatically inserted when
remuxing to MP4, MKV, FLV, IVF, and raw OBU files.
- Decoder Support: Both libdav1d and libaom decoders can directly decode AV1 in start code format.
From 30f8ecd7c946e1a422318c547b4c663e8e27c53f Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:11:18 +0800
Subject: [PATCH 01/16] lavc/av1_parse: add start code format parsing support
Add functions to parse AV1 OBUs in MPEG-TS start code format
(0x000001 prefix). This is needed for AV1 streams from MPEG-TS
containers per AOM AV1 in MPEG-2 TS specification.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
libavcodec/av1_parse.c | 133 +++++++++++++++++++++++++++++++++++++++++
libavcodec/av1_parse.h | 36 +++++++++++
2 files changed, 169 insertions(+)
diff --git a/libavcodec/av1_parse.c b/libavcodec/av1_parse.c
index 061636815f..146c8aff79 100644
--- a/libavcodec/av1_parse.c
+++ b/libavcodec/av1_parse.c
@@ -20,6 +20,7 @@
#include "config.h"
+#include "libavutil/intreadwrite.h"
#include "libavutil/mem.h"
#include "av1.h"
@@ -120,3 +121,135 @@ AVRational ff_av1_framerate(int64_t ticks_per_frame, int64_t units_per_tick,
return (AVRational){ 0, 1 };
}
+
+int ff_av1_is_startcode_format(const uint8_t *buf, int length)
+{
+ if (length < 4)
+ return 0;
+
+ /* Check for 3-byte start code (MPEG-TS AV1 spec) */
+ if (AV_RB24(buf) == 0x000001)
+ return 1;
+
+ return 0;
+}
+
+/**
+ * Find the next 3-byte start code (0x000001) in buffer.
+ * Note: MPEG-TS AV1 uses only 3-byte start codes per the specification.
+ */
+static const uint8_t *find_next_startcode(const uint8_t *p, const uint8_t *end)
+{
+ while (p + 3 <= end) {
+ if (AV_RB24(p) == 0x000001)
+ return p;
+ p++;
+ }
+ return end;
+}
+
+int ff_av1_extract_obu_startcode(AV1OBU *obu, const uint8_t *buf, int length,
+ void *logctx)
+{
+ int start_code_size = 3; /* MPEG-TS AV1 uses only 3-byte start codes */
+ int64_t obu_size;
+ int start_pos, type, temporal_id, spatial_id;
+ int ret;
+
+ if (length < 4)
+ return AVERROR_INVALIDDATA;
+
+ /* Verify 3-byte start code */
+ if (AV_RB24(buf) != 0x000001) {
+ av_log(logctx, AV_LOG_ERROR, "Invalid AV1 start code\n");
+ return AVERROR_INVALIDDATA;
+ }
+
+ if (length - start_code_size < 1)
+ return AVERROR_INVALIDDATA;
+
+ /* Parse OBU header after start code */
+ ret = parse_obu_header(buf + start_code_size,
+ length - start_code_size,
+ &obu_size, &start_pos, &type,
+ &temporal_id, &spatial_id);
+ if (ret < 0) {
+ av_log(logctx, AV_LOG_ERROR, "Failed to parse OBU header\n");
+ return ret;
+ }
+
+ obu->type = type;
+ obu->temporal_id = temporal_id;
+ obu->spatial_id = spatial_id;
+ obu->raw_data = buf + start_code_size;
+ obu->raw_size = ret;
+ obu->data = buf + start_code_size + start_pos;
+ obu->size = obu_size;
+ obu->size_bits = get_obu_bit_length(obu->data, obu->size, type);
+
+ av_log(logctx, AV_LOG_DEBUG,
+ "startcode obu_type: %d, temporal_id: %d, spatial_id: %d, payload size: %d\n",
+ obu->type, obu->temporal_id, obu->spatial_id, obu->size);
+
+ return start_code_size + ret;
+}
+
+int ff_av1_packet_split_startcode(AV1Packet *pkt, const uint8_t *buf,
+ int length, void *logctx)
+{
+ const uint8_t *p = buf;
+ const uint8_t *end = buf + length;
+ int ret;
+
+ pkt->nb_obus = 0;
+
+ /* Find first start code */
+ p = find_next_startcode(p, end);
+
+ while (p < end) {
+ AV1OBU *obu;
+ int consumed;
+
+ /* Ensure OBU array has space */
+ if (pkt->obus_allocated < pkt->nb_obus + 1) {
+ int new_size = pkt->obus_allocated + 1;
+ AV1OBU *tmp;
+
+ if (new_size >= INT_MAX / sizeof(*tmp))
+ return AVERROR(ENOMEM);
+ tmp = av_fast_realloc(pkt->obus, &pkt->obus_allocated_size,
+ new_size * sizeof(*tmp));
+ if (!tmp)
+ return AVERROR(ENOMEM);
+
+ pkt->obus = tmp;
+ memset(pkt->obus + pkt->obus_allocated, 0, sizeof(*pkt->obus));
+ pkt->obus_allocated = new_size;
+ }
+
+ obu = &pkt->obus[pkt->nb_obus];
+
+ /* Extract OBU using its size field, not by finding next start code */
+ ret = ff_av1_extract_obu_startcode(obu, p, end - p, logctx);
+ if (ret < 0) {
+ av_log(logctx, AV_LOG_WARNING,
+ "Failed to extract OBU at offset %td, skipping to next start code\n",
+ p - buf);
+ /* On error, try to find next start code and continue */
+ p = find_next_startcode(p + 3, end);
+ continue;
+ }
+
+ consumed = ret; /* Total bytes consumed including start code */
+
+ pkt->nb_obus++;
+ p += consumed;
+
+ /* Skip to next start code if there's gap */
+ if (p < end && AV_RB24(p) != 0x000001) {
+ p = find_next_startcode(p, end);
+ }
+ }
+
+ return 0;
+}
diff --git a/libavcodec/av1_parse.h b/libavcodec/av1_parse.h
index 2b8cce4835..cfbef53a1b 100644
--- a/libavcodec/av1_parse.h
+++ b/libavcodec/av1_parse.h
@@ -169,4 +169,40 @@ static inline int get_obu_bit_length(const uint8_t *buf, int size, int type)
AVRational ff_av1_framerate(int64_t ticks_per_frame, int64_t units_per_tick,
int64_t time_scale);
+/**
+ * Check if data is in MPEG-TS start code format.
+ *
+ * MPEG-TS AV1 uses start codes (0x000001) to delimit OBUs,
+ * unlike Section 5 (Low Overhead) format.
+ *
+ * @param buf input buffer
+ * @param length buffer length
+ * @return 1 if start code format, 0 otherwise
+ */
+int ff_av1_is_startcode_format(const uint8_t *buf, int length);
+
+/**
+ * Extract a single OBU from MPEG-TS start code format.
+ *
+ * @param obu output OBU structure
+ * @param buf input buffer (should start with 0x000001 or 0x00000001)
+ * @param length input length
+ * @param logctx logging context
+ * @return bytes consumed on success, negative error code on failure
+ */
+int ff_av1_extract_obu_startcode(AV1OBU *obu, const uint8_t *buf, int length,
+ void *logctx);
+
+/**
+ * Split start code format packet into OBU list.
+ *
+ * @param pkt output OBU list
+ * @param buf input buffer
+ * @param length input length
+ * @param logctx logging context
+ * @return 0 on success, negative error code on failure
+ */
+int ff_av1_packet_split_startcode(AV1Packet *pkt, const uint8_t *buf,
+ int length, void *logctx);
+
#endif /* AVCODEC_AV1_PARSE_H */
--
2.49.1
From 46dbfa94d86d193dad1065f2f75ba6e2504458ef Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:11:35 +0800
Subject: [PATCH 02/16] lavc/av1_parser: add start code format detection and
conversion
Detect MPEG-TS start code format input and convert to Section 5
format for CBS parsing.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
libavcodec/av1_parser.c | 85 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 84 insertions(+), 1 deletion(-)
diff --git a/libavcodec/av1_parser.c b/libavcodec/av1_parser.c
index 32135a23cb..ba3710853b 100644
--- a/libavcodec/av1_parser.c
+++ b/libavcodec/av1_parser.c
@@ -22,6 +22,7 @@
#include "libavutil/attributes.h"
#include "libavutil/avassert.h"
+#include "libavutil/mem.h"
#include "av1_parse.h"
#include "avcodec.h"
@@ -33,6 +34,9 @@ typedef struct AV1ParseContext {
CodedBitstreamContext *cbc;
CodedBitstreamFragment temporal_unit;
int parsed_extradata;
+
+ /* Start code format detection for MPEG-TS input */
+ int in_startcode_mode;
} AV1ParseContext;
static const enum AVPixelFormat pix_fmts_8bit[2][2] = {
@@ -52,6 +56,54 @@ static const enum AVPixelFormat pix_fmts_rgb[3] = {
AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12,
};
+/**
+ * Convert start code format to Section 5 format for parsing.
+ */
+static int convert_startcode_to_section5(const uint8_t *src, int src_size,
+ uint8_t **dst, int *dst_size,
+ void *logctx)
+{
+ AV1Packet pkt = { 0 };
+ int ret, i;
+ size_t total_size = 0;
+ uint8_t *out, *p;
+
+ ret = ff_av1_packet_split_startcode(&pkt, src, src_size, logctx);
+ if (ret < 0)
+ return ret;
+
+ /* Calculate output size */
+ for (i = 0; i < pkt.nb_obus; i++)
+ total_size += pkt.obus[i].raw_size;
+
+ if (total_size == 0) {
+ ff_av1_packet_uninit(&pkt);
+ *dst = NULL;
+ *dst_size = 0;
+ return 0;
+ }
+
+ out = av_malloc(total_size + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!out) {
+ ff_av1_packet_uninit(&pkt);
+ return AVERROR(ENOMEM);
+ }
+
+ /* Copy OBUs without start codes */
+ p = out;
+ for (i = 0; i < pkt.nb_obus; i++) {
+ memcpy(p, pkt.obus[i].raw_data, pkt.obus[i].raw_size);
+ p += pkt.obus[i].raw_size;
+ }
+ memset(p, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+
+ ff_av1_packet_uninit(&pkt);
+
+ *dst = out;
+ *dst_size = total_size;
+ return 0;
+}
+
static int av1_parser_parse(AVCodecParserContext *ctx,
AVCodecContext *avctx,
const uint8_t **out_data, int *out_size,
@@ -62,6 +114,10 @@ static int av1_parser_parse(AVCodecParserContext *ctx,
const CodedBitstreamAV1Context *av1 = s->cbc->priv_data;
const AV1RawSequenceHeader *seq;
const AV1RawColorConfig *color;
+ uint8_t *converted_data = NULL;
+ int converted_size = 0;
+ const uint8_t *parse_data;
+ int parse_size;
int ret;
*out_data = data;
@@ -71,6 +127,25 @@ static int av1_parser_parse(AVCodecParserContext *ctx,
ctx->pict_type = AV_PICTURE_TYPE_NONE;
ctx->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN;
+ /* Detect and handle start code format from MPEG-TS */
+ if (ff_av1_is_startcode_format(data, size)) {
+ s->in_startcode_mode = 1;
+ av_log(avctx, AV_LOG_DEBUG, "Detected AV1 start code format input\n");
+
+ ret = convert_startcode_to_section5(data, size, &converted_data,
+ &converted_size, avctx);
+ if (ret < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Failed to convert start code format\n");
+ return size;
+ }
+
+ parse_data = converted_data;
+ parse_size = converted_size;
+ } else {
+ parse_data = data;
+ parse_size = size;
+ }
+
s->cbc->log_ctx = avctx;
if (avctx->extradata_size && !s->parsed_extradata) {
@@ -84,7 +159,14 @@ static int av1_parser_parse(AVCodecParserContext *ctx,
ff_cbs_fragment_reset(td);
}
- ret = ff_cbs_read(s->cbc, td, NULL, data, size);
+ if (parse_size == 0) {
+ av_freep(&converted_data);
+ goto end_no_parse;
+ }
+
+ ret = ff_cbs_read(s->cbc, td, NULL, parse_data, parse_size);
+ av_freep(&converted_data);
+
if (ret < 0) {
av_log(avctx, AV_LOG_ERROR, "Failed to parse temporal unit.\n");
goto end;
@@ -174,6 +256,7 @@ static int av1_parser_parse(AVCodecParserContext *ctx,
end:
ff_cbs_fragment_reset(td);
+end_no_parse:
s->cbc->log_ctx = NULL;
return size;
--
2.49.1
From 089eddfe29a87652b1812dce299871640ab45868 Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:12:47 +0800
Subject: [PATCH 03/16] lavc/bsf: add av1_tstosection5 bitstream filter
Convert AV1 from MPEG-TS start code format (0x000001 prefix) to
Section 5 (low overhead) format. This is needed when remuxing AV1
streams from MPEG-TS to other containers like MP4, MKV, or IVF.
Acts as no-op if input is already in Section 5 format, following
the pattern of h264_mp4toannexb and hevc_mp4toannexb BSFs.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
libavcodec/bitstream_filters.c | 1 +
libavcodec/bsf/Makefile | 1 +
libavcodec/bsf/av1_tstosection5.c | 191 ++++++++++++++++++++++++++++++
3 files changed, 193 insertions(+)
create mode 100644 libavcodec/bsf/av1_tstosection5.c
diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c
index b4b852c7e6..f32beec8fe 100644
--- a/libavcodec/bitstream_filters.c
+++ b/libavcodec/bitstream_filters.c
@@ -30,6 +30,7 @@ extern const FFBitStreamFilter ff_apv_metadata_bsf;
extern const FFBitStreamFilter ff_av1_frame_merge_bsf;
extern const FFBitStreamFilter ff_av1_frame_split_bsf;
extern const FFBitStreamFilter ff_av1_metadata_bsf;
+extern const FFBitStreamFilter ff_av1_tstosection5_bsf;
extern const FFBitStreamFilter ff_chomp_bsf;
extern const FFBitStreamFilter ff_dump_extradata_bsf;
extern const FFBitStreamFilter ff_dca_core_bsf;
diff --git a/libavcodec/bsf/Makefile b/libavcodec/bsf/Makefile
index 360fd1e32f..b1c9e459be 100644
--- a/libavcodec/bsf/Makefile
+++ b/libavcodec/bsf/Makefile
@@ -7,6 +7,7 @@ OBJS-$(CONFIG_APV_METADATA_BSF) += bsf/apv_metadata.o
OBJS-$(CONFIG_AV1_FRAME_MERGE_BSF) += bsf/av1_frame_merge.o
OBJS-$(CONFIG_AV1_FRAME_SPLIT_BSF) += bsf/av1_frame_split.o
OBJS-$(CONFIG_AV1_METADATA_BSF) += bsf/av1_metadata.o
+OBJS-$(CONFIG_AV1_TSTOSECTION5_BSF) += bsf/av1_tstosection5.o
OBJS-$(CONFIG_CHOMP_BSF) += bsf/chomp.o
OBJS-$(CONFIG_DCA_CORE_BSF) += bsf/dca_core.o
OBJS-$(CONFIG_DTS2PTS_BSF) += bsf/dts2pts.o
diff --git a/libavcodec/bsf/av1_tstosection5.c b/libavcodec/bsf/av1_tstosection5.c
new file mode 100644
index 0000000000..2981602d70
--- /dev/null
+++ b/libavcodec/bsf/av1_tstosection5.c
@@ -0,0 +1,191 @@
+/*
+ * AV1 MPEG-TS to Section 5 (Low Overhead) bitstream filter
+ * Copyright (c) 2025 Jun Zhao <barryjzhao(a)tencent.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * This bitstream filter converts AV1 from MPEG-TS start code format
+ * to Section 5 (Low Overhead) format.
+ *
+ * If the input is already in Section 5 format, it passes through unchanged.
+ *
+ * Note: Per AOM AV1-MPEG2-TS spec section 3.6.2.1, emulation prevention bytes
+ * should be handled, but for now we rely on the obu_size field for boundary
+ * detection which makes emulation prevention optional in practice.
+ */
+
+#include "libavutil/mem.h"
+
+#include "bsf.h"
+#include "bsf_internal.h"
+#include "av1.h"
+#include "av1_parse.h"
+
+typedef struct AV1TsToSection5Context {
+ AVPacket *buffer_pkt;
+
+ uint8_t *output_buffer;
+ size_t output_buffer_size;
+ size_t output_buffer_capacity;
+} AV1TsToSection5Context;
+
+static int ensure_output_buffer(AV1TsToSection5Context *s, size_t required)
+{
+ if (s->output_buffer_capacity >= required)
+ return 0;
+
+ size_t new_capacity = FFMAX(required, s->output_buffer_capacity * 2);
+ new_capacity = FFMAX(new_capacity, 4096);
+
+ uint8_t *new_buffer = av_realloc(s->output_buffer,
+ new_capacity + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!new_buffer)
+ return AVERROR(ENOMEM);
+
+ s->output_buffer = new_buffer;
+ s->output_buffer_capacity = new_capacity;
+ return 0;
+}
+
+static int convert_startcode_to_section5(AV1TsToSection5Context *s,
+ const uint8_t *src, int src_size,
+ void *logctx)
+{
+ AV1Packet pkt = { 0 };
+ int ret, i;
+ size_t total_size = 0;
+ uint8_t *p;
+
+ /* Parse start code format */
+ ret = ff_av1_packet_split_startcode(&pkt, src, src_size, logctx);
+ if (ret < 0)
+ return ret;
+
+ /* Calculate output size (Section 5 format without start codes) */
+ for (i = 0; i < pkt.nb_obus; i++) {
+ total_size += pkt.obus[i].raw_size;
+ }
+
+ /* Ensure output buffer capacity */
+ ret = ensure_output_buffer(s, total_size);
+ if (ret < 0) {
+ ff_av1_packet_uninit(&pkt);
+ return ret;
+ }
+
+ /* Write Section 5 format (no start codes) */
+ p = s->output_buffer;
+ for (i = 0; i < pkt.nb_obus; i++) {
+ memcpy(p, pkt.obus[i].raw_data, pkt.obus[i].raw_size);
+ p += pkt.obus[i].raw_size;
+ }
+
+ s->output_buffer_size = total_size;
+
+ /* Fill padding */
+ memset(s->output_buffer + total_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+
+ ff_av1_packet_uninit(&pkt);
+ return 0;
+}
+
+static int av1_ts_to_section5_filter(AVBSFContext *ctx, AVPacket *pkt)
+{
+ AV1TsToSection5Context *s = ctx->priv_data;
+ int ret;
+
+ ret = ff_bsf_get_packet_ref(ctx, s->buffer_pkt);
+ if (ret < 0)
+ return ret;
+
+ /* If already Section 5 format, pass through (no-op) */
+ if (!ff_av1_is_startcode_format(s->buffer_pkt->data, s->buffer_pkt->size)) {
+ av_packet_move_ref(pkt, s->buffer_pkt);
+ return 0;
+ }
+
+ /* Convert format */
+ ret = convert_startcode_to_section5(s, s->buffer_pkt->data,
+ s->buffer_pkt->size, ctx);
+ if (ret < 0) {
+ av_packet_unref(s->buffer_pkt);
+ return ret;
+ }
+
+ /* Create output packet */
+ ret = av_new_packet(pkt, s->output_buffer_size);
+ if (ret < 0) {
+ av_packet_unref(s->buffer_pkt);
+ return ret;
+ }
+
+ memcpy(pkt->data, s->output_buffer, s->output_buffer_size);
+
+ /* Copy metadata */
+ ret = av_packet_copy_props(pkt, s->buffer_pkt);
+ if (ret < 0) {
+ av_packet_unref(pkt);
+ av_packet_unref(s->buffer_pkt);
+ return ret;
+ }
+
+ av_packet_unref(s->buffer_pkt);
+ return 0;
+}
+
+static int av1_ts_to_section5_init(AVBSFContext *ctx)
+{
+ AV1TsToSection5Context *s = ctx->priv_data;
+
+ s->buffer_pkt = av_packet_alloc();
+ if (!s->buffer_pkt)
+ return AVERROR(ENOMEM);
+
+ return 0;
+}
+
+static void av1_ts_to_section5_flush(AVBSFContext *ctx)
+{
+ AV1TsToSection5Context *s = ctx->priv_data;
+ av_packet_unref(s->buffer_pkt);
+}
+
+static void av1_ts_to_section5_close(AVBSFContext *ctx)
+{
+ AV1TsToSection5Context *s = ctx->priv_data;
+
+ av_packet_free(&s->buffer_pkt);
+ av_freep(&s->output_buffer);
+}
+
+static const enum AVCodecID av1_ts_to_section5_codec_ids[] = {
+ AV_CODEC_ID_AV1, AV_CODEC_ID_NONE,
+};
+
+const FFBitStreamFilter ff_av1_tstosection5_bsf = {
+ .p.name = "av1_tstosection5",
+ .p.codec_ids = av1_ts_to_section5_codec_ids,
+ .priv_data_size = sizeof(AV1TsToSection5Context),
+ .init = av1_ts_to_section5_init,
+ .flush = av1_ts_to_section5_flush,
+ .close = av1_ts_to_section5_close,
+ .filter = av1_ts_to_section5_filter,
+};
+
--
2.49.1
From 8ca6212b38b5f9242ff7100678b121e9114dce30 Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:13:06 +0800
Subject: [PATCH 04/16] lavf/mpegts: add AV1 demuxing support
Add AV1 stream type (0x46) and AV1 Video Descriptor (0x80) parsing
per AOM AV1 in MPEG-2 TS specification. Extract sequence parameters
(profile, level, tier, bitdepth, chroma) from descriptor.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
libavformat/mpegts.c | 34 ++++++++++++++++++++++++++++++++++
libavformat/mpegts.h | 5 +++++
2 files changed, 39 insertions(+)
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 7c19abaf76..7ae52bbe22 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -817,6 +817,7 @@ static const StreamType ISO_types[] = {
{ STREAM_TYPE_VIDEO_HEVC, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC },
{ STREAM_TYPE_VIDEO_JPEGXS, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_JPEGXS },
{ STREAM_TYPE_VIDEO_VVC, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VVC },
+ { STREAM_TYPE_VIDEO_AV1, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_AV1 },
{ STREAM_TYPE_VIDEO_CAVS, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_CAVS },
{ STREAM_TYPE_VIDEO_DIRAC, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },
{ STREAM_TYPE_VIDEO_AVS2, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_AVS2 },
@@ -874,6 +875,7 @@ static const StreamType REGD_types[] = {
{ MKTAG('E', 'A', 'C', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 },
{ MKTAG('H', 'E', 'V', 'C'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC },
{ MKTAG('V', 'V', 'C', ' '), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VVC },
+ { MKTAG('A', 'V', '0', '1'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_AV1 },
{ MKTAG('K', 'L', 'V', 'A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },
{ MKTAG('V', 'A', 'N', 'C'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_2038 },
{ MKTAG('I', 'D', '3', ' '), AVMEDIA_TYPE_DATA, AV_CODEC_ID_TIMED_ID3 },
@@ -2294,6 +2296,38 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
sti->need_parsing = 0;
}
break;
+ case AV1_VIDEO_DESCRIPTOR:
+ /* Parse AV1 video descriptor per AOM "Carriage of AV1 in MPEG-2 TS" Section 2.2 */
+ if (st->codecpar->codec_id == AV_CODEC_ID_AV1 && desc_len >= 4) {
+ int marker_version, seq_profile, seq_level_idx_0;
+ int seq_tier_0, high_bitdepth, twelve_bit, monochrome;
+ int byte1, byte2;
+
+ marker_version = get8(pp, desc_end);
+ /* marker should be 1, version should be 1 */
+ if ((marker_version & 0x80) && (marker_version & 0x7F) == 1) {
+ byte1 = get8(pp, desc_end);
+ byte2 = get8(pp, desc_end);
+ (void)get8(pp, desc_end); /* byte3: hdr_wcg_idc, reserved, etc. */
+
+ seq_profile = (byte1 >> 5) & 0x07;
+ seq_level_idx_0 = byte1 & 0x1F;
+ seq_tier_0 = (byte2 >> 7) & 0x01;
+ high_bitdepth = (byte2 >> 6) & 0x01;
+ twelve_bit = (byte2 >> 5) & 0x01;
+ monochrome = (byte2 >> 4) & 0x01;
+
+ /* Set profile and level */
+ st->codecpar->profile = seq_profile;
+ st->codecpar->level = seq_level_idx_0;
+
+ av_log(fc, AV_LOG_TRACE, "AV1 video descriptor: profile=%d, level=%d, "
+ "tier=%d, bitdepth=%d, mono=%d\n",
+ seq_profile, seq_level_idx_0, seq_tier_0,
+ high_bitdepth ? (twelve_bit ? 12 : 10) : 8, monochrome);
+ }
+ }
+ break;
case DOVI_VIDEO_STREAM_DESCRIPTOR:
{
uint32_t buf;
diff --git a/libavformat/mpegts.h b/libavformat/mpegts.h
index 223962d18e..c2bd5ca6e6 100644
--- a/libavformat/mpegts.h
+++ b/libavformat/mpegts.h
@@ -146,6 +146,7 @@
#define STREAM_TYPE_VIDEO_HEVC 0x24
#define STREAM_TYPE_VIDEO_JPEGXS 0x32
#define STREAM_TYPE_VIDEO_VVC 0x33
+#define STREAM_TYPE_VIDEO_AV1 0x06 /* Per AOM AV1-MPEG2-TS draft spec */
#define STREAM_TYPE_VIDEO_CAVS 0x42
#define STREAM_TYPE_VIDEO_AVS2 0xd2
#define STREAM_TYPE_VIDEO_AVS3 0xd4
@@ -230,6 +231,10 @@ https://developer.apple.com/library/archive/documentation/AudioVideo/Concep…
https://professional.dolby.com/siteassets/content-creation/dolby-vision-for… */
#define DOVI_VIDEO_STREAM_DESCRIPTOR 0xb0
+/** AV1 video descriptor per AOM "Carriage of AV1 in MPEG-2 TS" Section 2.2
+ https://aomediacodec.github.io/av1-mpeg2-ts/ */
+#define AV1_VIDEO_DESCRIPTOR 0x80
+
#define DATA_COMPONENT_DESCRIPTOR 0xfd /* ARIB STD-B10 */
typedef struct MpegTSContext MpegTSContext;
--
2.49.1
From e5c105d0bd22e87b1c1aac3d60f90cba129c0078 Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:13:35 +0800
Subject: [PATCH 05/16] lavf/mpegtsenc: add AV1 muxing support
Add AV1 muxing support per AOM AV1 in MPEG-2 TS specification:
- Stream type 0x46 and 'AV01' registration descriptor
- Convert Section 5 format to start code format (0x000001 prefix)
- Write AV1 Video Descriptor (0x80) with sequence parameters
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
libavformat/mpegtsenc.c | 221 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 221 insertions(+)
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index ea7c6065a0..ff7e2d131f 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -34,9 +34,12 @@
#include "libavcodec/h264.h"
#include "libavcodec/hevc/hevc.h"
#include "libavcodec/vvc.h"
+#include "libavcodec/av1.h"
+#include "libavcodec/av1_parse.h"
#include "libavcodec/startcode.h"
#include "avformat.h"
+#include "av1.h"
#include "avio_internal.h"
#include "internal.h"
#include "mpegts.h"
@@ -351,6 +354,86 @@ static void put_registration_descriptor(uint8_t **q_ptr, uint32_t tag)
*q_ptr = q;
}
+/**
+ * Write AV1 video descriptor per AOM AV1 in MPEG-2 TS spec Section 2.2.
+ *
+ * The descriptor uses the same data structure as AV1CodecConfigurationRecord
+ * from ISOBMFF with two reserved bits repurposed for HDR/WCG identification.
+ */
+static int put_av1_video_descriptor(AVFormatContext *s, uint8_t **q_ptr,
+ AVCodecParameters *par)
+{
+ AV1SequenceParameters seq;
+ uint8_t *q = *q_ptr;
+ int ret;
+ uint8_t high_bitdepth, twelve_bit;
+ uint8_t hdr_wcg_idc = 0; /* SDR by default */
+
+ if (!par->extradata || par->extradata_size < 4) {
+ av_log(s, AV_LOG_WARNING, "AV1 extradata not available for video descriptor\n");
+ return 0; /* Skip descriptor if no extradata */
+ }
+
+ ret = ff_av1_parse_seq_header(&seq, par->extradata, par->extradata_size);
+ if (ret < 0) {
+ av_log(s, AV_LOG_WARNING, "Failed to parse AV1 sequence header\n");
+ return 0; /* Skip descriptor on error */
+ }
+
+ /* Determine high_bitdepth and twelve_bit from bitdepth */
+ if (seq.bitdepth == 12) {
+ high_bitdepth = 1;
+ twelve_bit = 1;
+ } else if (seq.bitdepth == 10) {
+ high_bitdepth = 1;
+ twelve_bit = 0;
+ } else {
+ high_bitdepth = 0;
+ twelve_bit = 0;
+ }
+
+ /* Determine HDR/WCG indicator based on color info */
+ /* hdr_wcg_idc: 0=SDR, 1=WCG only, 2=HDR and WCG, 3=no indication */
+ if (seq.color_description_present_flag) {
+ /* Check for HDR transfer characteristics (PQ or HLG) */
+ int is_hdr = (seq.transfer_characteristics == 16 || /* PQ (SMPTE ST 2084) */
+ seq.transfer_characteristics == 18); /* HLG (ARIB STD-B67) */
+ /* Check for WCG (BT.2020 primaries) */
+ int is_wcg = (seq.color_primaries == 9); /* BT.2020 */
+
+ if (is_hdr && is_wcg)
+ hdr_wcg_idc = 2;
+ else if (is_wcg)
+ hdr_wcg_idc = 1;
+ /* else SDR (0) */
+ }
+
+ /* descriptor_tag = 0x80 (AV1 video descriptor) */
+ *q++ = 0x80;
+ /* descriptor_length = 4 */
+ *q++ = 4;
+ /* Byte 0: marker (1) | version (7) = 0x81 (marker=1, version=1) */
+ *q++ = 0x81;
+ /* Byte 1: seq_profile (3) | seq_level_idx_0 (5) */
+ *q++ = (seq.profile << 5) | (seq.level & 0x1F);
+ /* Byte 2: seq_tier_0 (1) | high_bitdepth (1) | twelve_bit (1) | monochrome (1) |
+ * chroma_subsampling_x (1) | chroma_subsampling_y (1) | chroma_sample_position (2) */
+ *q++ = (seq.tier << 7) |
+ (high_bitdepth << 6) |
+ (twelve_bit << 5) |
+ (seq.monochrome << 4) |
+ (seq.chroma_subsampling_x << 3) |
+ (seq.chroma_subsampling_y << 2) |
+ (seq.chroma_sample_position & 0x03);
+ /* Byte 3: hdr_wcg_idc (2) | reserved_zeros (1) | initial_presentation_delay_present (1) |
+ * reserved_zeros (4) */
+ /* We don't use initial_presentation_delay, so set to 0 */
+ *q++ = (hdr_wcg_idc << 6);
+
+ *q_ptr = q;
+ return 0;
+}
+
static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
{
MpegTSWrite *ts = s->priv_data;
@@ -374,6 +457,9 @@ static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
case AV_CODEC_ID_VVC:
stream_type = STREAM_TYPE_VIDEO_VVC;
break;
+ case AV_CODEC_ID_AV1:
+ stream_type = STREAM_TYPE_PRIVATE_DATA;
+ break;
case AV_CODEC_ID_CAVS:
stream_type = STREAM_TYPE_VIDEO_CAVS;
break;
@@ -807,6 +893,9 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
put_registration_descriptor(&q, MKTAG('V', 'C', '-', '1'));
} else if (stream_type == STREAM_TYPE_VIDEO_HEVC && s->strict_std_compliance <= FF_COMPLIANCE_NORMAL) {
put_registration_descriptor(&q, MKTAG('H', 'E', 'V', 'C'));
+ } else if (codec_id == AV_CODEC_ID_AV1 && s->strict_std_compliance <= FF_COMPLIANCE_NORMAL) {
+ put_registration_descriptor(&q, MKTAG('A', 'V', '0', '1'));
+ put_av1_video_descriptor(s, &q, st->codecpar);
} else if (stream_type == STREAM_TYPE_VIDEO_CAVS || stream_type == STREAM_TYPE_VIDEO_AVS2 ||
stream_type == STREAM_TYPE_VIDEO_AVS3) {
put_registration_descriptor(&q, MKTAG('A', 'V', 'S', 'V'));
@@ -1453,6 +1542,9 @@ static int get_pes_stream_id(AVFormatContext *s, AVStream *st, int stream_id, in
if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
if (st->codecpar->codec_id == AV_CODEC_ID_DIRAC)
return STREAM_ID_EXTENDED_STREAM_ID;
+ else if (st->codecpar->codec_id == AV_CODEC_ID_AV1)
+ /* Per AOM AV1-MPEG2-TS draft spec: AV1 uses private_stream_1 (0xBD) */
+ return STREAM_ID_PRIVATE_STREAM_1;
else
return STREAM_ID_VIDEO_STREAM_0;
} else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
@@ -1789,6 +1881,106 @@ int ff_check_h264_startcode(AVFormatContext *s, const AVStream *st, const AVPack
return check_h26x_startcode(s, st, pkt, "h264");
}
+/**
+ * Check if this is the start of a Temporal Unit.
+ */
+static int av1_is_temporal_unit_start(const uint8_t *data, int size)
+{
+ AV1Packet pkt = { 0 };
+ int ret, result = 0;
+
+ ret = ff_av1_packet_split(&pkt, data, size, NULL);
+ if (ret < 0)
+ return 1; /* Assume TU start on error */
+
+ /* Check if first OBU is TD */
+ if (pkt.nb_obus > 0 &&
+ pkt.obus[0].type == AV1_OBU_TEMPORAL_DELIMITER) {
+ result = 1;
+ }
+
+ ff_av1_packet_uninit(&pkt);
+ return result;
+}
+
+/**
+ * Convert Section 5 format to MPEG-TS start code format.
+ *
+ * @param is_tu_start whether this is the start of a Temporal Unit,
+ * determines if TD OBU should be inserted
+ *
+ * Note: Per AOM AV1-MPEG2-TS spec section 3.6.2.1, emulation prevention bytes
+ * should be handled, but for now we rely on the obu_size field for boundary
+ * detection which makes emulation prevention optional in practice.
+ */
+static int av1_section5_to_startcode(const uint8_t *src, int src_size,
+ uint8_t **dst, int *dst_size,
+ int is_tu_start, void *logctx)
+{
+ AV1Packet pkt = { 0 };
+ int ret, i;
+ int total_size = 0;
+ uint8_t *out, *p;
+
+ /* Parse Section 5 format OBUs */
+ ret = ff_av1_packet_split(&pkt, src, src_size, logctx);
+ if (ret < 0)
+ return ret;
+
+ /* Calculate output size */
+ /* TD OBU if needed: 3 (start code) + 2 (header + size) */
+ if (is_tu_start)
+ total_size += 5;
+
+ for (i = 0; i < pkt.nb_obus; i++) {
+ /* Skip TD OBU in input (we control insertion) */
+ if (pkt.obus[i].type == AV1_OBU_TEMPORAL_DELIMITER)
+ continue;
+ /* Each OBU: 3 (start code) + raw_size */
+ total_size += 3 + pkt.obus[i].raw_size;
+ }
+
+ out = av_malloc(total_size + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!out) {
+ ff_av1_packet_uninit(&pkt);
+ return AVERROR(ENOMEM);
+ }
+ p = out;
+
+ /* Insert TD OBU at TU start */
+ if (is_tu_start) {
+ /* Start code */
+ AV_WB24(p, 0x000001);
+ p += 3;
+ /* TD OBU header: type=2, extension_flag=0, has_size_field=1 */
+ *p++ = (AV1_OBU_TEMPORAL_DELIMITER << 3) | 0x02;
+ /* obu_size = 0 */
+ *p++ = 0x00;
+ }
+
+ /* Write other OBUs with start codes */
+ for (i = 0; i < pkt.nb_obus; i++) {
+ if (pkt.obus[i].type == AV1_OBU_TEMPORAL_DELIMITER)
+ continue;
+
+ /* Start code */
+ AV_WB24(p, 0x000001);
+ p += 3;
+ /* OBU data */
+ memcpy(p, pkt.obus[i].raw_data, pkt.obus[i].raw_size);
+ p += pkt.obus[i].raw_size;
+ }
+
+ memset(p, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+
+ ff_av1_packet_uninit(&pkt);
+
+ *dst = out;
+ *dst_size = total_size;
+
+ return 0;
+}
+
/* Based on GStreamer's gst-plugins-base/ext/ogg/gstoggstream.c
* Released under the LGPL v2.1+, written by
* Vincent Penquerc'h <vincent.penquerch(a)collabora.co.uk>
@@ -2063,6 +2255,22 @@ static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
if (!data)
return AVERROR(ENOMEM);
}
+ } else if (st->codecpar->codec_id == AV_CODEC_ID_AV1) {
+ int is_tu_start;
+ int new_size = 0;
+ int av1_ret;
+
+ /* Check if this is start of Temporal Unit */
+ is_tu_start = av1_is_temporal_unit_start(buf, size);
+
+ /* Convert Section 5 to start code format */
+ av1_ret = av1_section5_to_startcode(buf, size, &data, &new_size,
+ is_tu_start, s);
+ if (av1_ret < 0)
+ return av1_ret;
+
+ buf = data;
+ size = new_size;
} else if (st->codecpar->codec_id == AV_CODEC_ID_OPUS) {
if (pkt->size < 2) {
av_log(s, AV_LOG_ERROR, "Opus packet too short\n");
@@ -2325,6 +2533,19 @@ static int mpegts_check_bitstream(AVFormatContext *s, AVStream *st,
((st->codecpar->extradata[0] & e->mask) == e->value))))
return ff_stream_add_bitstream_filter(st, e->bsf_name, NULL);
}
+
+ /* AV1: Per MPEG-TS AV1 spec section 3.3, each PES packet should contain a
+ * single Access Unit (frame's OBUs). The av1_frame_split BSF can split
+ * multi-frame Temporal Units, but this causes DTS conflicts because all
+ * split frames inherit the same DTS, and modifying DTS causes pts < dts
+ * errors when the shown frame is not first in decode order.
+ *
+ * Most AV1 encoders (libaom, SVT-AV1) produce single-frame TUs, so the
+ * current implementation works without av1_frame_split. For multi-frame TUs
+ * (e.g., SVC content), users should manually apply av1_frame_split with
+ * appropriate timestamp handling.
+ */
+
return 1;
}
--
2.49.1
From 95b193dc201614613988eca0006c8587fc23007e Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:13:48 +0800
Subject: [PATCH 06/16] lavf/movenc: add automatic av1_tstosection5 BSF
insertion
Automatically insert av1_tstosection5 BSF when muxing AV1 streams
from MPEG-TS start code format to MP4/MOV.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
libavformat/movenc.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 8d8acd2aff..8de7308434 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -45,6 +45,7 @@
#include "libavcodec/internal.h"
#include "libavcodec/put_bits.h"
+#include "libavcodec/av1_parse.h"
#include "libavcodec/vc1_common.h"
#include "libavcodec/raw.h"
#include "internal.h"
@@ -8799,6 +8800,10 @@ static int mov_check_bitstream(AVFormatContext *s, AVStream *st,
ret = ff_stream_add_bitstream_filter(st, "aac_adtstoasc", NULL);
} else if (st->codecpar->codec_id == AV_CODEC_ID_VP9) {
ret = ff_stream_add_bitstream_filter(st, "vp9_superframe", NULL);
+ } else if (st->codecpar->codec_id == AV_CODEC_ID_AV1) {
+ /* Convert MPEG-TS start code format to Section 5 if needed */
+ if (ff_av1_is_startcode_format(pkt->data, pkt->size))
+ ret = ff_stream_add_bitstream_filter(st, "av1_tstosection5", NULL);
}
return ret;
--
2.49.1
From 7e6fab1faee9819b953edcf6314754a5b6593c26 Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:13:56 +0800
Subject: [PATCH 07/16] lavf/flvenc: add automatic av1_tstosection5 BSF
insertion
Automatically insert av1_tstosection5 BSF when muxing AV1 streams
from MPEG-TS start code format to FLV.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
libavformat/flvenc.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
index a0503c1799..497e93f460 100644
--- a/libavformat/flvenc.c
+++ b/libavformat/flvenc.c
@@ -39,6 +39,7 @@
#include "nal.h"
#include "mux.h"
#include "libavutil/opt.h"
+#include "libavcodec/av1_parse.h"
#include "libavcodec/put_bits.h"
@@ -1473,6 +1474,11 @@ static int flv_check_bitstream(AVFormatContext *s, AVStream *st,
if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0)
return ff_stream_add_bitstream_filter(st, "aac_adtstoasc", NULL);
}
+ /* Convert MPEG-TS start code format to Section 5 if needed */
+ if (st->codecpar->codec_id == AV_CODEC_ID_AV1 &&
+ ff_av1_is_startcode_format(pkt->data, pkt->size))
+ return ff_stream_add_bitstream_filter(st, "av1_tstosection5", NULL);
+ /* Extract extradata if needed */
if (!st->codecpar->extradata_size &&
(st->codecpar->codec_id == AV_CODEC_ID_H264 ||
st->codecpar->codec_id == AV_CODEC_ID_HEVC ||
--
2.49.1
From 15bea4efcfa04c1ceb80664d22c62067dd87ccda Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:14:06 +0800
Subject: [PATCH 08/16] lavf/matroskaenc: add automatic av1_tstosection5 BSF
insertion
Automatically insert av1_tstosection5 BSF when muxing AV1 streams
from MPEG-TS start code format to MKV/WebM.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
libavformat/matroskaenc.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 18f17f4329..45f870e9f2 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -24,6 +24,7 @@
#include "config_components.h"
#include "av1.h"
+#include "libavcodec/av1_parse.h"
#include "avc.h"
#include "hevc.h"
#include "avformat.h"
@@ -3513,6 +3514,10 @@ static int mkv_check_bitstream(AVFormatContext *s, AVStream *st,
} else if (CONFIG_MATROSKA_MUXER &&
st->codecpar->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE) {
ret = ff_stream_add_bitstream_filter(st, "pgs_frame_merge", NULL);
+ } else if (st->codecpar->codec_id == AV_CODEC_ID_AV1) {
+ /* Convert MPEG-TS start code format to Section 5 if needed */
+ if (ff_av1_is_startcode_format(pkt->data, pkt->size))
+ return ff_stream_add_bitstream_filter(st, "av1_tstosection5", NULL);
}
return ret;
--
2.49.1
From 3193e5f52772e27f46942fc929b22c72b4efce7a Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:14:17 +0800
Subject: [PATCH 09/16] lavf/ivfenc: add automatic av1_tstosection5 BSF
insertion
Automatically insert av1_tstosection5 BSF when muxing AV1 streams
from MPEG-TS start code format to IVF.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
libavformat/ivfenc.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/libavformat/ivfenc.c b/libavformat/ivfenc.c
index 9feaea3516..267574fb09 100644
--- a/libavformat/ivfenc.c
+++ b/libavformat/ivfenc.c
@@ -21,6 +21,7 @@
#include "internal.h"
#include "mux.h"
#include "libavutil/intreadwrite.h"
+#include "libavcodec/av1_parse.h"
typedef struct IVFEncContext {
unsigned frame_cnt;
@@ -42,15 +43,26 @@ static int ivf_init(AVFormatContext *s)
int ret = ff_stream_add_bitstream_filter(s->streams[0], "vp9_superframe", NULL);
if (ret < 0)
return ret;
- } else if (par->codec_id == AV_CODEC_ID_AV1) {
- int ret = ff_stream_add_bitstream_filter(s->streams[0], "av1_metadata", "td=insert");
- if (ret < 0)
- return ret;
}
+ /* AV1 BSFs (av1_tstosection5 and av1_metadata) are added in check_bitstream
+ * to properly handle MPEG-TS start code format input */
return 0;
}
+static int ivf_check_bitstream(AVFormatContext *s, AVStream *st,
+ const AVPacket *pkt)
+{
+ if (st->codecpar->codec_id == AV_CODEC_ID_AV1) {
+ /* Convert from MPEG-TS start code format to Section 5 if needed */
+ if (ff_av1_is_startcode_format(pkt->data, pkt->size))
+ return ff_stream_add_bitstream_filter(st, "av1_tstosection5", NULL);
+ /* Add av1_metadata to insert Temporal Delimiter OBUs */
+ return ff_stream_add_bitstream_filter(st, "av1_metadata", "td=insert");
+ }
+ return 1;
+}
+
static int ivf_write_header(AVFormatContext *s)
{
AVCodecParameters *par = s->streams[0]->codecpar;
@@ -125,4 +137,5 @@ const FFOutputFormat ff_ivf_muxer = {
.write_header = ivf_write_header,
.write_packet = ivf_write_packet,
.write_trailer = ivf_write_trailer,
+ .check_bitstream = ivf_check_bitstream,
};
--
2.49.1
From 8032da04596c1773f738daf6e61d1b4033cbf2c6 Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:14:25 +0800
Subject: [PATCH 10/16] lavf/rawenc: add automatic av1_tstosection5 BSF
insertion for OBU
Automatically insert av1_tstosection5 BSF when muxing AV1 streams
from MPEG-TS start code format to OBU raw format.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
libavformat/rawenc.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/libavformat/rawenc.c b/libavformat/rawenc.c
index cf298d223d..4e03e24f9b 100644
--- a/libavformat/rawenc.c
+++ b/libavformat/rawenc.c
@@ -24,6 +24,8 @@
#include "libavutil/intreadwrite.h"
+#include "libavcodec/av1_parse.h"
+
#include "avformat.h"
#include "rawenc.h"
#include "mux.h"
@@ -569,6 +571,10 @@ const FFOutputFormat ff_mpeg2video_muxer = {
static int obu_check_bitstream(AVFormatContext *s, AVStream *st,
const AVPacket *pkt)
{
+ /* Convert from MPEG-TS start code format to Section 5 if needed */
+ if (ff_av1_is_startcode_format(pkt->data, pkt->size))
+ return ff_stream_add_bitstream_filter(st, "av1_tstosection5", NULL);
+
return ff_stream_add_bitstream_filter(st, "av1_metadata", "td=insert");
}
--
2.49.1
From 14989d57511e54b36fbadb39be1c2f204a70040c Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:14:55 +0800
Subject: [PATCH 11/16] lavc/libdav1d: add MPEG-TS start code format support
Automatically detect and convert MPEG-TS start code format to
Section 5 format before passing to libdav1d. This allows direct
decoding of AV1 streams from MPEG-TS without manual BSF application.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
libavcodec/libdav1d.c | 66 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
index 7f63bb1b15..67f30e52ba 100644
--- a/libavcodec/libdav1d.c
+++ b/libavcodec/libdav1d.c
@@ -299,6 +299,48 @@ static void libdav1d_user_data_free(const uint8_t *data, void *opaque) {
av_packet_free(&pkt);
}
+/**
+ * Convert start code format to Section 5 format for libdav1d.
+ * This is needed when receiving AV1 data from MPEG-TS demuxer.
+ */
+static int libdav1d_convert_startcode(AVCodecContext *c, AVPacket *pkt)
+{
+ AV1Packet av1_pkt = { 0 };
+ uint8_t *new_data;
+ size_t new_size = 0;
+ int ret, i;
+
+ ret = ff_av1_packet_split_startcode(&av1_pkt, pkt->data, pkt->size, c);
+ if (ret < 0)
+ return ret;
+
+ /* Calculate output size */
+ for (i = 0; i < av1_pkt.nb_obus; i++)
+ new_size += av1_pkt.obus[i].raw_size;
+
+ if (new_size == 0) {
+ ff_av1_packet_uninit(&av1_pkt);
+ return 0;
+ }
+
+ /* Allocate new buffer */
+ ret = av_new_packet(pkt, new_size);
+ if (ret < 0) {
+ ff_av1_packet_uninit(&av1_pkt);
+ return ret;
+ }
+
+ /* Copy OBUs without start codes */
+ new_data = pkt->data;
+ for (i = 0; i < av1_pkt.nb_obus; i++) {
+ memcpy(new_data, av1_pkt.obus[i].raw_data, av1_pkt.obus[i].raw_size);
+ new_data += av1_pkt.obus[i].raw_size;
+ }
+
+ ff_av1_packet_uninit(&av1_pkt);
+ return 0;
+}
+
static int libdav1d_receive_frame_internal(AVCodecContext *c, Dav1dPicture *p)
{
Libdav1dContext *dav1d = c->priv_data;
@@ -318,6 +360,30 @@ static int libdav1d_receive_frame_internal(AVCodecContext *c, Dav1dPicture *p)
}
if (pkt->size) {
+ /* Convert MPEG-TS start code format to Section 5 if needed */
+ if (ff_av1_is_startcode_format(pkt->data, pkt->size)) {
+ AVPacket *new_pkt = av_packet_alloc();
+ if (!new_pkt) {
+ av_packet_free(&pkt);
+ return AVERROR(ENOMEM);
+ }
+
+ res = av_packet_ref(new_pkt, pkt);
+ if (res < 0) {
+ av_packet_free(&pkt);
+ av_packet_free(&new_pkt);
+ return res;
+ }
+ av_packet_free(&pkt);
+ pkt = new_pkt;
+
+ res = libdav1d_convert_startcode(c, pkt);
+ if (res < 0) {
+ av_packet_free(&pkt);
+ return res;
+ }
+ }
+
res = dav1d_data_wrap(data, pkt->data, pkt->size,
libdav1d_data_free, pkt->buf);
if (res < 0) {
--
2.49.1
From efc3c68c602f77471c4f92c2c261bf015801fd9a Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:15:04 +0800
Subject: [PATCH 12/16] lavc/libaomdec: add MPEG-TS start code format support
Automatically detect and convert MPEG-TS start code format to
Section 5 format before passing to libaom. This allows direct
decoding of AV1 streams from MPEG-TS without manual BSF application.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
libavcodec/libaomdec.c | 71 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 70 insertions(+), 1 deletion(-)
diff --git a/libavcodec/libaomdec.c b/libavcodec/libaomdec.c
index 9e9c4d18c5..cbd28626a5 100644
--- a/libavcodec/libaomdec.c
+++ b/libavcodec/libaomdec.c
@@ -30,8 +30,10 @@
#include "libavutil/cpu.h"
#include "libavutil/hdr_dynamic_metadata.h"
#include "libavutil/imgutils.h"
+#include "libavutil/mem.h"
#include "avcodec.h"
+#include "av1_parse.h"
#include "bytestream.h"
#include "codec_internal.h"
#include "decode.h"
@@ -195,15 +197,79 @@ static int decode_metadata(AVFrame *frame, const struct aom_image *img)
return 0;
}
+/**
+ * Convert start code format to Section 5 format for libaom.
+ * This is needed when receiving AV1 data from MPEG-TS demuxer.
+ */
+static int libaom_convert_startcode(AVCodecContext *avctx,
+ const uint8_t *src, int src_size,
+ uint8_t **dst, int *dst_size)
+{
+ AV1Packet pkt = { 0 };
+ uint8_t *out;
+ size_t total_size = 0;
+ int ret, i;
+
+ ret = ff_av1_packet_split_startcode(&pkt, src, src_size, avctx);
+ if (ret < 0)
+ return ret;
+
+ /* Calculate output size */
+ for (i = 0; i < pkt.nb_obus; i++)
+ total_size += pkt.obus[i].raw_size;
+
+ if (total_size == 0) {
+ ff_av1_packet_uninit(&pkt);
+ *dst = NULL;
+ *dst_size = 0;
+ return 0;
+ }
+
+ /* Allocate output buffer */
+ out = av_malloc(total_size + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!out) {
+ ff_av1_packet_uninit(&pkt);
+ return AVERROR(ENOMEM);
+ }
+
+ /* Copy OBUs without start codes */
+ *dst_size = 0;
+ for (i = 0; i < pkt.nb_obus; i++) {
+ memcpy(out + *dst_size, pkt.obus[i].raw_data, pkt.obus[i].raw_size);
+ *dst_size += pkt.obus[i].raw_size;
+ }
+ memset(out + *dst_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+
+ ff_av1_packet_uninit(&pkt);
+ *dst = out;
+ return 0;
+}
+
static int aom_decode(AVCodecContext *avctx, AVFrame *picture,
int *got_frame, AVPacket *avpkt)
{
AV1DecodeContext *ctx = avctx->priv_data;
const void *iter = NULL;
struct aom_image *img;
+ const uint8_t *data = avpkt->data;
+ int size = avpkt->size;
+ uint8_t *converted_data = NULL;
int ret;
- if (aom_codec_decode(&ctx->decoder, avpkt->data, avpkt->size, NULL) !=
+ /* Convert MPEG-TS start code format to Section 5 if needed */
+ if (ff_av1_is_startcode_format(avpkt->data, avpkt->size)) {
+ int converted_size;
+ ret = libaom_convert_startcode(avctx, avpkt->data, avpkt->size,
+ &converted_data, &converted_size);
+ if (ret < 0)
+ return ret;
+ if (converted_data) {
+ data = converted_data;
+ size = converted_size;
+ }
+ }
+
+ if (aom_codec_decode(&ctx->decoder, data, size, NULL) !=
AOM_CODEC_OK) {
const char *error = aom_codec_error(&ctx->decoder);
const char *detail = aom_codec_error_detail(&ctx->decoder);
@@ -212,9 +278,12 @@ static int aom_decode(AVCodecContext *avctx, AVFrame *picture,
if (detail)
av_log(avctx, AV_LOG_ERROR, " Additional information: %s\n",
detail);
+ av_freep(&converted_data);
return AVERROR_INVALIDDATA;
}
+ av_freep(&converted_data);
+
if ((img = aom_codec_get_frame(&ctx->decoder, &iter))) {
if (img->d_w > img->w || img->d_h > img->h) {
av_log(avctx, AV_LOG_ERROR, "Display dimensions %dx%d exceed storage %dx%d\n",
--
2.49.1
From 8597bc3e63d3b7355560da4a603c7aaf8d792639 Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:15:43 +0800
Subject: [PATCH 13/16] doc/bitstream_filters: add av1_tstosection5 BSF
documentation
Document the av1_tstosection5 bitstream filter for converting AV1
from MPEG-TS start code format to Section 5 format.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
doc/bitstream_filters.texi | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi
index fb31ca7380..03a8abfc5d 100644
--- a/doc/bitstream_filters.texi
+++ b/doc/bitstream_filters.texi
@@ -92,6 +92,38 @@ Deletes Padding OBUs.
@end table
+@section av1_tstosection5
+
+Convert AV1 bitstream from MPEG-TS start code format to Section 5 (low overhead)
+format.
+
+This filter is used to convert AV1 streams from the format used in MPEG-TS
+containers (with 0x000001 start codes prefixing each OBU) to the standard
+Section 5 format used by most other containers and decoders.
+
+If the input is already in Section 5 format, this filter acts as a no-op and
+passes the data through unchanged.
+
+This filter is automatically inserted when remuxing from MPEG-TS to containers
+that require Section 5 format, such as MP4, MKV, FLV, IVF, and raw OBU files.
+
+@subsection Examples
+
+@itemize
+@item
+Convert an AV1 stream from MPEG-TS to MP4:
+@example
+ffmpeg -i input.ts -c:v copy output.mp4
+@end example
+The filter is automatically inserted when needed.
+
+@item
+Explicitly apply the filter:
+@example
+ffmpeg -i input.ts -bsf:v av1_tstosection5 -c:v copy output.ivf
+@end example
+@end itemize
+
@section chomp
Remove zero padding at the end of a packet.
--
2.49.1
From 8e7edb18d1112cf00e1a61794a968235f6baa9f1 Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:16:01 +0800
Subject: [PATCH 14/16] doc/muxers: add AV1 support documentation for mpegts
muxer
Document AV1 muxing support in MPEG-TS per AOM specification,
including stream type, registration descriptor, and video descriptor.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
doc/muxers.texi | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/doc/muxers.texi b/doc/muxers.texi
index a2e356187a..9f17bc5c42 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -3191,6 +3191,36 @@ ffmpeg -i file.mpg -c copy \
out.ts
@end example
+@subsection AV1 Support
+
+The MPEG-TS muxer supports AV1 video streams according to the AOM
+"Carriage of AV1 in MPEG-2 TS" specification.
+
+AV1 streams are identified by stream type 0x06 (private data) and include:
+@itemize
+@item Registration descriptor with format identifier @samp{AV01}
+@item AV1 video descriptor (descriptor tag 0x80) containing sequence parameters
+@end itemize
+
+The muxer automatically converts AV1 from Section 5 (low overhead) format to
+the start code format required by MPEG-TS, where each OBU is prefixed with
+a 0x000001 start code.
+
+Temporal Delimiter OBUs are inserted at the beginning of each Temporal Unit
+to mark the access unit boundaries.
+
+@subsubsection Example
+
+Mux an AV1 video file to MPEG-TS:
+@example
+ffmpeg -i input.mp4 -c:v copy -f mpegts output.ts
+@end example
+
+Encode and mux AV1 to MPEG-TS:
+@example
+ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 -f mpegts output.ts
+@end example
+
@section mxf, mxf_d10, mxf_opatom
MXF muxer.
--
2.49.1
From 3a227dd7f19ba02a9c987e487b420edd07f110f4 Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:16:09 +0800
Subject: [PATCH 15/16] doc/demuxers: add AV1 support documentation for mpegts
demuxer
Document AV1 demuxing support in MPEG-TS, including stream type
identification and av1_tstosection5 BSF usage for format conversion.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
doc/demuxers.texi | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/doc/demuxers.texi b/doc/demuxers.texi
index c1dda7f1eb..93c842261d 100644
--- a/doc/demuxers.texi
+++ b/doc/demuxers.texi
@@ -1003,6 +1003,37 @@ Set maximum size, in bytes, of packet emitted by the demuxer. Payloads above thi
are split across multiple packets. Range is 1 to INT_MAX/2. Default is 204800 bytes.
@end table
+@subsection AV1 Support
+
+The MPEG-TS demuxer supports AV1 video streams according to the AOM
+"Carriage of AV1 in MPEG-2 TS" specification.
+
+AV1 streams are identified by:
+@itemize
+@item Stream type 0x06 (private data) in the PMT
+@item Registration descriptor with format identifier @samp{AV01}
+@end itemize
+
+The demuxer outputs AV1 data in the MPEG-TS start code format, where each OBU
+is prefixed with a 0x000001 start code. To convert to the standard Section 5
+format used by other containers and decoders, the @code{av1_tstosection5}
+bitstream filter can be used.
+
+When remuxing to other containers (MP4, MKV, FLV, IVF, etc.), the
+@code{av1_tstosection5} filter is automatically inserted.
+
+The AV1 video descriptor (descriptor tag 0x80) is parsed to extract stream
+parameters such as profile, level, tier, and color information.
+
+@subsubsection Example
+
+Demux and convert AV1 from MPEG-TS to MP4:
+@example
+ffmpeg -i input.ts -c:v copy output.mp4
+@end example
+
+The bitstream filter is automatically applied when needed.
+
@section mpjpeg
MJPEG encapsulated in multi-part MIME demuxer.
--
2.49.1
From 33e1ce44bb62d0e4b8406b9ded8438376a56b51d Mon Sep 17 00:00:00 2001
From: Jun Zhao <barryjzhao(a)tencent.com>
Date: Mon, 29 Dec 2025 01:16:23 +0800
Subject: [PATCH 16/16] fate: add AV1 in MPEG-TS tests
Add FATE tests for AV1 muxing, demuxing, roundtrip, and BSF
conversion in MPEG-TS.
Signed-off-by: Jun Zhao <barryjzhao(a)tencent.com>
---
tests/fate/cbs.mak | 10 ++++++++++
tests/fate/mpegts.mak | 17 ++++++++++++++++-
tests/ref/fate/av1-bsf-tstosection5 | 11 +++++++++++
tests/ref/fate/mpegts-av1-mux | 10 ++++++++++
tests/ref/fate/mpegts-av1-roundtrip | 11 +++++++++++
5 files changed, 58 insertions(+), 1 deletion(-)
create mode 100644 tests/ref/fate/av1-bsf-tstosection5
create mode 100644 tests/ref/fate/mpegts-av1-mux
create mode 100644 tests/ref/fate/mpegts-av1-roundtrip
diff --git a/tests/fate/cbs.mak b/tests/fate/cbs.mak
index d9200debc9..eda673426f 100644
--- a/tests/fate/cbs.mak
+++ b/tests/fate/cbs.mak
@@ -66,6 +66,16 @@ FATE_CBS_AV1-$(call FATE_CBS_DEPS, IVF, AV1, AV1, AV1, RAWVIDEO) = $(FATE_CBS_av
FATE_SAMPLES_AVCONV += $(FATE_CBS_AV1-yes)
fate-cbs-av1: $(FATE_CBS_AV1-yes)
+# AV1 MPEG-TS to Section 5 BSF test
+# This tests the av1_tstosection5 bitstream filter that converts from
+# MPEG-TS start code format to Section 5 (low overhead) format.
+# The test generates an MPEG-TS file from IVF, then converts back using the BSF.
+FATE_AV1_BSF-$(call ALLYES, IVF_DEMUXER MPEGTS_MUXER MPEGTS_DEMUXER AV1_PARSER AV1_TSTOSECTION5_BSF IVF_MUXER) += fate-av1-bsf-tstosection5
+fate-av1-bsf-tstosection5: SRC = $(TARGET_SAMPLES)/av1-test-vectors/av1-1-b8-05-mv.ivf
+fate-av1-bsf-tstosection5: CMD = transcode ivf "$(SRC)" mpegts "-c:v copy" "-c:v copy -bsf:v av1_tstosection5 -f ivf"
+
+FATE_SAMPLES_FFMPEG += $(FATE_AV1_BSF-yes)
+
# H.264 read/write
FATE_CBS_H264_CONFORMANCE_SAMPLES = \
diff --git a/tests/fate/mpegts.mak b/tests/fate/mpegts.mak
index eaca8ec289..e768039aed 100644
--- a/tests/fate/mpegts.mak
+++ b/tests/fate/mpegts.mak
@@ -22,4 +22,19 @@ fate-mpegts-probe-pmt-merge: CMD = run $(PROBE_CODEC_NAME_COMMAND) -merge_pmt_ve
FATE_SAMPLES_FFPROBE += $(FATE_MPEGTS_PROBE-yes)
-fate-mpegts: $(FATE_MPEGTS_PROBE-yes)
+#
+# Test AV1 muxing/demuxing in MPEG-TS
+#
+# AV1 muxing: IVF -> MPEG-TS (Section 5 to start code format)
+FATE_MPEGTS_AV1-$(call REMUX, MPEGTS, IVF_DEMUXER AV1_PARSER) += fate-mpegts-av1-mux
+fate-mpegts-av1-mux: SRC = $(TARGET_SAMPLES)/av1-test-vectors/av1-1-b8-05-mv.ivf
+fate-mpegts-av1-mux: CMD = framecrc -i "$(SRC)" -c:v copy -f mpegts
+
+# AV1 roundtrip: IVF -> MPEG-TS -> IVF (tests both muxing and demuxing)
+FATE_MPEGTS_AV1-$(call REMUX, IVF MPEGTS, IVF_DEMUXER MPEGTS_DEMUXER AV1_PARSER AV1_TSTOSECTION5_BSF) += fate-mpegts-av1-roundtrip
+fate-mpegts-av1-roundtrip: SRC = $(TARGET_SAMPLES)/av1-test-vectors/av1-1-b8-05-mv.ivf
+fate-mpegts-av1-roundtrip: CMD = transcode ivf "$(SRC)" mpegts "-c:v copy" "-c:v copy -f ivf"
+
+FATE_SAMPLES_FFMPEG += $(FATE_MPEGTS_AV1-yes)
+
+fate-mpegts: $(FATE_MPEGTS_PROBE-yes) $(FATE_MPEGTS_AV1-yes)
diff --git a/tests/ref/fate/av1-bsf-tstosection5 b/tests/ref/fate/av1-bsf-tstosection5
new file mode 100644
index 0000000000..06f51b0a64
--- /dev/null
+++ b/tests/ref/fate/av1-bsf-tstosection5
@@ -0,0 +1,11 @@
+db041646a729b26618465bf2acb8b053 *tests/data/fate/av1-bsf-tstosection5.mpegts
+57904 tests/data/fate/av1-bsf-tstosection5.mpegts
+#tb 0: 1/90000
+#media_type 0: video
+#codec_id 0: av1
+#dimensions 0: 352x288
+#sar 0: 1/1
+0, 0, 0, 3000, 30833, 0xfb97b07f, S=1, MPEGTS Stream ID, 1, 0x00bd00bd
+0, 3000, 3000, 3000, 20779, 0xd71f36d5, F=0x0, S=1, MPEGTS Stream ID, 1, 0x00bd00bd
+0, 6000, 6000, 3000, 3526, 0x643de3e4, F=0x0, S=1, MPEGTS Stream ID, 1, 0x00bd00bd
+0, 9000, 9000, 3000, 5, 0x01920115, F=0x0, S=1, MPEGTS Stream ID, 1, 0x00bd00bd
diff --git a/tests/ref/fate/mpegts-av1-mux b/tests/ref/fate/mpegts-av1-mux
new file mode 100644
index 0000000000..2d39bcf9aa
--- /dev/null
+++ b/tests/ref/fate/mpegts-av1-mux
@@ -0,0 +1,10 @@
+#extradata 0: 13, 0x0fc303f5
+#tb 0: 1/30
+#media_type 0: video
+#codec_id 0: av1
+#dimensions 0: 352x288
+#sar 0: 1/1
+0, 0, 0, 1, 30833, 0xfb97b07f
+0, 1, 1, 1, 20779, 0xd71f36d5, F=0x0
+0, 2, 2, 1, 3526, 0x643de3e4, F=0x0
+0, 3, 3, 1, 5, 0x01920115, F=0x0
diff --git a/tests/ref/fate/mpegts-av1-roundtrip b/tests/ref/fate/mpegts-av1-roundtrip
new file mode 100644
index 0000000000..fbd8f76996
--- /dev/null
+++ b/tests/ref/fate/mpegts-av1-roundtrip
@@ -0,0 +1,11 @@
+db041646a729b26618465bf2acb8b053 *tests/data/fate/mpegts-av1-roundtrip.mpegts
+57904 tests/data/fate/mpegts-av1-roundtrip.mpegts
+#tb 0: 1/90000
+#media_type 0: video
+#codec_id 0: av1
+#dimensions 0: 352x288
+#sar 0: 1/1
+0, 0, 0, 3000, 30842, 0x714eb082, S=1, MPEGTS Stream ID, 1, 0x00bd00bd
+0, 3000, 3000, 3000, 20788, 0x180636d8, F=0x0, S=1, MPEGTS Stream ID, 1, 0x00bd00bd
+0, 6000, 6000, 3000, 3532, 0x8002e3e6, F=0x0, S=1, MPEGTS Stream ID, 1, 0x00bd00bd
+0, 9000, 9000, 3000, 11, 0x01d50117, F=0x0, S=1, MPEGTS Stream ID, 1, 0x00bd00bd
--
2.49.1
5
15
10 Jan '26
Signed-off-by: Raja Rathour <imraja729(a)gmail.com>
This patch implements asynchronous model execution for the LibTorch backend
in FFmpeg's DNN module.
Key changes:
- Integrated a worker thread and a pending queue to handle inference.
- Prevents the main filter thread from blocking during model execution.
- Aligns LibTorch backend behavior with the existing OpenVINO async implementation.
- Improves overall throughput for deep learning filters using LibTorch.
The implementation has been tested with various torch models to ensure
stability and correct frame synchronization.
---
libavfilter/dnn/dnn_backend_torch.cpp | 115 +++++++++++++++++++++++++-
1 file changed, 111 insertions(+), 4 deletions(-)
diff --git a/libavfilter/dnn/dnn_backend_torch.cpp b/libavfilter/dnn/dnn_backend_torch.cpp
index 2e4326d9d4..ad81aff8da 100644
--- a/libavfilter/dnn/dnn_backend_torch.cpp
+++ b/libavfilter/dnn/dnn_backend_torch.cpp
@@ -25,6 +25,10 @@
#include <torch/torch.h>
#include <torch/script.h>
+#include <thread>
+#include <mutex>
+#include <condition_variable>
+#include <atomic>
extern "C" {
#include "dnn_io_proc.h"
@@ -39,9 +43,16 @@ typedef struct THModel {
DNNModel model;
DnnContext *ctx;
torch::jit::Module *jit_model;
- SafeQueue *request_queue;
+ SafeQueue *request_queue; // Holds available/idle request slots
Queue *task_queue;
Queue *lltask_queue;
+
+ // --- Async Support ---
+ SafeQueue *pending_queue; // Holds requests waiting for inference
+ std::thread *worker_thread; // The background worker
+ std::mutex *mutex; // Protects the condition variable
+ std::condition_variable *cond; // Wakes up worker when new task arrives
+ std::atomic<bool> worker_stop; // Flag to stop the thread
} THModel;
typedef struct THInferRequest {
@@ -119,6 +130,32 @@ static void dnn_free_model_th(DNNModel **model)
return;
th_model = (THModel *) (*model);
+
+ // --- Stop and Join Worker Thread ---
+ if (th_model->worker_thread) {
+ {
+ std::lock_guard<std::mutex> lock(*th_model->mutex);
+ th_model->worker_stop = true;
+ }
+ th_model->cond->notify_all();
+
+ if (th_model->worker_thread->joinable()) {
+ th_model->worker_thread->join();
+ }
+ delete th_model->worker_thread;
+ delete th_model->mutex;
+ delete th_model->cond;
+ }
+
+ if (th_model->pending_queue) {
+ // Clear remaining items (if any)
+ while (ff_safe_queue_size(th_model->pending_queue) != 0) {
+ ff_safe_queue_pop_front(th_model->pending_queue);
+ }
+ ff_safe_queue_destroy(th_model->pending_queue);
+ }
+ // -----------------------------------
+
while (ff_safe_queue_size(th_model->request_queue) != 0) {
THRequestItem *item = (THRequestItem *)ff_safe_queue_pop_front(th_model->request_queue);
destroy_request_item(&item);
@@ -318,6 +355,41 @@ err:
}
}
+// --- Worker Thread Function ---
+static void th_worker_thread(THModel *th_model) {
+ while (true) {
+ THRequestItem *request = NULL;
+
+ {
+ // Acquire lock to check condition
+ std::unique_lock<std::mutex> lock(*th_model->mutex);
+
+ // Wait until: We are told to stop OR there is work in the queue
+ th_model->cond->wait(lock, [&]{
+ return th_model->worker_stop || ff_safe_queue_size(th_model->pending_queue) > 0;
+ });
+
+ // If stopped and no work left, exit
+ if (th_model->worker_stop && ff_safe_queue_size(th_model->pending_queue) == 0) {
+ break;
+ }
+
+ // Get work
+ request = (THRequestItem *)ff_safe_queue_pop_front(th_model->pending_queue);
+ }
+
+ // Process work (Lock released so we don't block submission)
+ if (request) {
+ int ret = th_start_inference(request);
+ if (ret != 0) {
+ av_log(th_model->ctx, AV_LOG_ERROR, "Async inference failed\n");
+ }
+ // Always callback to clean up and notify FFmpeg
+ infer_completion_callback(request);
+ }
+ }
+}
+
static int execute_model_th(THRequestItem *request, Queue *lltask_queue)
{
THModel *th_model = NULL;
@@ -343,9 +415,24 @@ static int execute_model_th(THRequestItem *request, Queue *lltask_queue)
if ( ret != 0) {
goto err;
}
+
+ // --- EXECUTION LOGIC (ASYNC vs SYNC) ---
if (task->async) {
- avpriv_report_missing_feature(th_model->ctx, "LibTorch async");
+ // 1. Acquire lock
+ std::lock_guard<std::mutex> lock(*th_model->mutex);
+
+ // 2. Push to pending queue
+ if (ff_safe_queue_push_back(th_model->pending_queue, request) < 0) {
+ return AVERROR(ENOMEM);
+ }
+
+ // 3. Wake up worker
+ th_model->cond->notify_one();
+
+ // 4. Return immediately (Success)
+ return 0;
} else {
+ // Synchronous fallback
ret = th_start_inference((void *)(request));
if (ret != 0) {
goto err;
@@ -484,6 +571,25 @@ static DNNModel *dnn_load_model_th(DnnContext *ctx, DNNFunctionType func_type, A
goto fail;
}
+ // --- INITIALIZE ASYNC QUEUE AND THREAD ---
+ th_model->pending_queue = ff_safe_queue_create();
+ if (!th_model->pending_queue) {
+ av_log(ctx, AV_LOG_ERROR, "Failed to create pending queue\n");
+ goto fail;
+ }
+
+ try {
+ th_model->mutex = new std::mutex();
+ th_model->cond = new std::condition_variable();
+ th_model->worker_stop = false;
+
+ // Start worker thread
+ th_model->worker_thread = new std::thread(th_worker_thread, th_model);
+ } catch (...) {
+ av_log(ctx, AV_LOG_ERROR, "Failed to initialize worker thread or mutexes\n");
+ goto fail;
+ }
+
model->get_input = &get_input_th;
model->get_output = &get_output_th;
model->filter_ctx = filter_ctx;
@@ -519,7 +625,8 @@ static int dnn_execute_model_th(const DNNModel *model, DNNExecBaseParams *exec_p
return AVERROR(ENOMEM);
}
- ret = ff_dnn_fill_task(task, exec_params, th_model, 0, 1);
+ // Set 'async' flag based on context (ctx->async) instead of hardcoded 0
+ ret = ff_dnn_fill_task(task, exec_params, th_model, ctx->async, 1);
if (ret != 0) {
av_freep(&task);
av_log(ctx, AV_LOG_ERROR, "unable to fill task.\n");
@@ -580,4 +687,4 @@ extern const DNNModule ff_dnn_backend_torch = {
.get_result = dnn_get_result_th,
.flush = dnn_flush_th,
.free_model = dnn_free_model_th,
-};
+};
\ No newline at end of file
--
2.48.1
2
6
---
libavfilter/vf_blackframe.c | 80 ++++++++++++++++++++++++++++++++-----
1 file changed, 71 insertions(+), 9 deletions(-)
diff --git a/libavfilter/vf_blackframe.c b/libavfilter/vf_blackframe.c
index f0aa53e133..f09d564bf7 100644
--- a/libavfilter/vf_blackframe.c
+++ b/libavfilter/vf_blackframe.c
@@ -32,6 +32,7 @@
#include "libavutil/internal.h"
#include "libavutil/opt.h"
+#include "libavutil/mem.h"
#include "avfilter.h"
#include "filters.h"
#include "video.h"
@@ -45,6 +46,14 @@ typedef struct BlackFrameContext {
unsigned int last_keyframe; ///< frame number of the last received key-frame
} BlackFrameContext;
+typedef struct ThreadData {
+ const uint8_t *data; // Pointer to the image data
+ int linesize; // How wide is the memory line
+ int bthresh; // The black threshold
+ int width; // Image width
+ unsigned int *counts; // POINTER to the array where threads write results
+} ThreadData;
+
static const enum AVPixelFormat pix_fmts[] = {
AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_GRAY8, AV_PIX_FMT_NV12,
AV_PIX_FMT_NV21, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV411P,
@@ -55,22 +64,72 @@ static const enum AVPixelFormat pix_fmts[] = {
snprintf(buf, sizeof(buf), format, value); \
av_dict_set(metadata, key, buf, 0)
+static int blackframe_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+ ThreadData *td = arg;
+ // --- C90 HARD FIX: ALL DECLARATIONS AT THE VERY TOP ---
+ int slice_start, slice_end, x, y;
+ const uint8_t *p;
+ unsigned int local_nblack = 0;
+ // ------------------------------------------------------
+
+ // Safety check
+ if (!td || !td->data || !td->counts) return 0;
+
+ slice_start = (ctx->inputs[0]->h * jobnr) / nb_jobs;
+ slice_end = (ctx->inputs[0]->h * (jobnr+1)) / nb_jobs;
+
+ p = td->data + slice_start * td->linesize;
+
+ for (y = slice_start; y < slice_end; y++) {
+ for (x = 0; x < td->width; x++)
+ local_nblack += p[x] < td->bthresh;
+ p += td->linesize;
+ }
+
+ // Save my private count
+ td->counts[jobnr] = local_nblack;
+ return 0;
+}
+
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
{
AVFilterContext *ctx = inlink->dst;
BlackFrameContext *s = ctx->priv;
- int x, i;
+ // --- C90 HARD FIX: ALL DECLARATIONS AT THE VERY TOP ---
int pblack = 0;
- uint8_t *p = frame->data[0];
AVDictionary **metadata;
char buf[32];
-
- for (i = 0; i < frame->height; i++) {
- for (x = 0; x < inlink->w; x++)
- s->nblack += p[x] < s->bthresh;
- p += frame->linesize[0];
+ ThreadData td;
+ int nb_threads;
+ unsigned int *thread_counts;
+ int nb_jobs;
+ int i; // <--- This was the MSVC killer. Moved to top.
+ // ------------------------------------------------------
+
+ nb_threads = ff_filter_get_nb_threads(ctx);
+
+ thread_counts = av_calloc(nb_threads, sizeof(*thread_counts));
+ if (!thread_counts) {
+ av_log(ctx, AV_LOG_ERROR, "Failed to allocate thread_counts\n");
+ return AVERROR(ENOMEM);
}
+ td.data = frame->data[0];
+ td.linesize = frame->linesize[0];
+ td.width = inlink->w;
+ td.bthresh = s->bthresh;
+ td.counts = thread_counts;
+
+ nb_jobs = FFMIN(frame->height, nb_threads);
+
+ ff_filter_execute(ctx, blackframe_slice, &td, NULL, nb_jobs);
+
+ s->nblack = 0;
+ for (i = 0; i < nb_jobs; i++) {
+ s->nblack += thread_counts[i];
+ }
+
if (frame->flags & AV_FRAME_FLAG_KEY)
s->last_keyframe = s->frame;
@@ -89,6 +148,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
s->frame++;
s->nblack = 0;
+
+ av_free(thread_counts);
+
return ff_filter_frame(inlink->dst->outputs[0], frame);
}
@@ -118,9 +180,9 @@ const FFFilter ff_vf_blackframe = {
.p.name = "blackframe",
.p.description = NULL_IF_CONFIG_SMALL("Detect frames that are (almost) black."),
.p.priv_class = &blackframe_class,
- .p.flags = AVFILTER_FLAG_METADATA_ONLY,
+ .p.flags = AVFILTER_FLAG_METADATA_ONLY | AVFILTER_FLAG_SLICE_THREADS,
.priv_size = sizeof(BlackFrameContext),
FILTER_INPUTS(avfilter_vf_blackframe_inputs),
FILTER_OUTPUTS(ff_video_default_filterpad),
FILTER_PIXFMTS_ARRAY(pix_fmts),
-};
+};
\ No newline at end of file
--
2.48.1
3
9
05 Jan '26
The 'sidx' earliest_presentation_time field is defined as PTS. Previously, it was incorrectly assigned to DTS, which could cause sync issues. This commit fixes the assignment to PTS as noted in the existing FIXME comment.
---
libavformat/mov.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 009ddfec80..f651d0387b 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -5892,9 +5892,9 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
} else if (has_sidx && !c->use_tfdt || fallback_sidx) {
// FIXME: sidx earliest_presentation_time is *PTS*, s.b.
// pts = frag_stream_info->sidx_pts;
- dts = frag_stream_info->sidx_pts;
+ pts = frag_stream_info->sidx_pts; // <--- FIXED
av_log(c->fc, AV_LOG_DEBUG, "found sidx time %"PRId64
- ", using it for dts\n", frag_stream_info->sidx_pts);
+ ", using it for pts\n", frag_stream_info->sidx_pts); // Update log message too if you like, but logically just changing to pts is the key.
} else {
dts = sc->track_end - sc->time_offset;
av_log(c->fc, AV_LOG_DEBUG, "found track end time %"PRId64
--
2.49.0.windows.1
--
Disclaimer
This email is governed by the Disclaimer Terms of
somaiya.edu <http://somaiya.edu> which may be viewed at
https://www.somaiya.edu/en/email-disclaimer
<https://www.somaiya.edu/en/email-disclaimer>
Finally, please do not
print this email unless it is necessary. Every unprinted email helps the
environment.
2
1
03 Jan '26
PR #20698 opened by michaelni
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20698
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20698.patch
From 93794583405909cfe8e7abffdd84c2454959ff18 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <michael(a)niedermayer.cc>
Date: Mon, 13 Oct 2025 14:32:45 +0200
Subject: [PATCH 1/2] swscale/output: Fix integer overflow in
yuv2ya16_X_c_template()
Found-by: colod colod <colodcolod7(a)gmail.com>
Signed-off-by: Michael Niedermayer <michael(a)niedermayer.cc>
---
libswscale/output.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libswscale/output.c b/libswscale/output.c
index b873276c00..cb6630bd73 100644
--- a/libswscale/output.c
+++ b/libswscale/output.c
@@ -1028,7 +1028,7 @@ yuv2ya16_X_c_template(SwsInternal *c, const int16_t *lumFilter,
int A = 0xffff;
for (j = 0; j < lumFilterSize; j++)
- Y += (unsigned)(lumSrc[j][i] * lumFilter[j]);
+ Y += lumSrc[j][i] * (unsigned)lumFilter[j];
Y >>= 15;
Y += (1<<3) + 0x8000;
@@ -1037,7 +1037,7 @@ yuv2ya16_X_c_template(SwsInternal *c, const int16_t *lumFilter,
if (hasAlpha) {
A = -0x40000000 + (1<<14);
for (j = 0; j < lumFilterSize; j++)
- A += (unsigned)(alpSrc[j][i] * lumFilter[j]);
+ A += alpSrc[j][i] * (unsigned)lumFilter[j];
A >>= 15;
A += 0x8000;
--
2.49.1
From 9d0761453e5ecaa1344d63e2fcc9bd3cc6d4d0f6 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <michael(a)niedermayer.cc>
Date: Mon, 13 Oct 2025 14:46:16 +0200
Subject: [PATCH 2/2] swscale/output: Fix unsigned cast position in yuv2*
Fixes: signed overflow
Signed-off-by: Michael Niedermayer <michael(a)niedermayer.cc>
---
libswscale/output.c | 90 ++++++++++++++++++++++-----------------------
1 file changed, 45 insertions(+), 45 deletions(-)
diff --git a/libswscale/output.c b/libswscale/output.c
index cb6630bd73..877db04f36 100644
--- a/libswscale/output.c
+++ b/libswscale/output.c
@@ -503,8 +503,8 @@ static void yuv2nv12cX_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
int v = chrDither[(i + 3) & 7] << 12;
int j;
for (j=0; j<chrFilterSize; j++) {
- u += (unsigned)(chrUSrc[j][i] * chrFilter[j]);
- v += (unsigned)(chrVSrc[j][i] * chrFilter[j]);
+ u += chrUSrc[j][i] * (unsigned)chrFilter[j];
+ v += chrVSrc[j][i] * (unsigned)chrFilter[j];
}
dest[2*i]= av_clip_uint8(u>>19);
@@ -516,8 +516,8 @@ static void yuv2nv12cX_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
int v = chrDither[(i + 3) & 7] << 12;
int j;
for (j=0; j<chrFilterSize; j++) {
- u += (unsigned)(chrUSrc[j][i] * chrFilter[j]);
- v += (unsigned)(chrVSrc[j][i] * chrFilter[j]);
+ u += chrUSrc[j][i] * (unsigned)chrFilter[j];
+ v += chrVSrc[j][i] * (unsigned)chrFilter[j];
}
dest[2*i]= av_clip_uint8(v>>19);
@@ -577,8 +577,8 @@ static void yuv2p01xcX_c(int big_endian, const uint8_t *chrDither,
int v = 1 << (shift - 1);
for (j = 0; j < chrFilterSize; j++) {
- u += (unsigned)(chrUSrc[j][i] * chrFilter[j]);
- v += (unsigned)(chrVSrc[j][i] * chrFilter[j]);
+ u += chrUSrc[j][i] * (unsigned)chrFilter[j];
+ v += chrVSrc[j][i] * (unsigned)chrFilter[j];
}
output_pixel(&dest[2*i] , u);
@@ -678,8 +678,8 @@ yuv2mono_X_c_template(SwsInternal *c, const int16_t *lumFilter,
int Y2 = 1 << 18;
for (j = 0; j < lumFilterSize; j++) {
- Y1 += (unsigned)(lumSrc[j][i] * lumFilter[j]);
- Y2 += (unsigned)(lumSrc[j][i+1] * lumFilter[j]);
+ Y1 += lumSrc[j][i] * (unsigned)lumFilter[j];
+ Y2 += lumSrc[j][i+1] * (unsigned)lumFilter[j];
}
Y1 >>= 19;
Y2 >>= 19;
@@ -896,12 +896,12 @@ yuv2422_X_c_template(SwsInternal *c, const int16_t *lumFilter,
int V = 1 << 18;
for (j = 0; j < lumFilterSize; j++) {
- Y1 += (unsigned)(lumSrc[j][i * 2] * lumFilter[j]);
- Y2 += (unsigned)(lumSrc[j][i * 2 + 1] * lumFilter[j]);
+ Y1 += lumSrc[j][i * 2] * (unsigned)lumFilter[j];
+ Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
}
for (j = 0; j < chrFilterSize; j++) {
- U += (unsigned)(chrUSrc[j][i] * chrFilter[j]);
- V += (unsigned)(chrVSrc[j][i] * chrFilter[j]);
+ U += chrUSrc[j][i] * (unsigned)chrFilter[j];
+ V += chrVSrc[j][i] * (unsigned)chrFilter[j];
}
Y1 >>= 19;
Y2 >>= 19;
@@ -1802,12 +1802,12 @@ yuv2rgb_X_c_template(SwsInternal *c, const int16_t *lumFilter,
const void *r, *g, *b;
for (j = 0; j < lumFilterSize; j++) {
- Y1 += (unsigned)(lumSrc[j][i * 2] * lumFilter[j]);
- Y2 += (unsigned)(lumSrc[j][i * 2 + 1] * lumFilter[j]);
+ Y1 += lumSrc[j][i * 2] * (unsigned)lumFilter[j];
+ Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
}
for (j = 0; j < chrFilterSize; j++) {
- U += (unsigned)(chrUSrc[j][i] * chrFilter[j]);
- V += (unsigned)(chrVSrc[j][i] * chrFilter[j]);
+ U += chrUSrc[j][i] * (unsigned)chrFilter[j];
+ V += chrVSrc[j][i] * (unsigned)chrFilter[j];
}
Y1 >>= 19;
Y2 >>= 19;
@@ -1817,8 +1817,8 @@ yuv2rgb_X_c_template(SwsInternal *c, const int16_t *lumFilter,
A1 = 1 << 18;
A2 = 1 << 18;
for (j = 0; j < lumFilterSize; j++) {
- A1 += (unsigned)(alpSrc[j][i * 2 ] * lumFilter[j]);
- A2 += (unsigned)(alpSrc[j][i * 2 + 1] * lumFilter[j]);
+ A1 += alpSrc[j][i * 2 ] * (unsigned)lumFilter[j];
+ A2 += alpSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
}
A1 >>= 19;
A2 >>= 19;
@@ -2179,11 +2179,11 @@ yuv2rgb_full_X_c_template(SwsInternal *c, const int16_t *lumFilter,
int V = (1<<9)-(128 << 19);
for (j = 0; j < lumFilterSize; j++) {
- Y += (unsigned)(lumSrc[j][i] * lumFilter[j]);
+ Y += lumSrc[j][i] * (unsigned)lumFilter[j];
}
for (j = 0; j < chrFilterSize; j++) {
- U += (unsigned)(chrUSrc[j][i] * chrFilter[j]);
- V += (unsigned)(chrVSrc[j][i] * chrFilter[j]);
+ U += chrUSrc[j][i] * (unsigned)chrFilter[j];
+ V += chrVSrc[j][i] * (unsigned)chrFilter[j];
}
Y >>= 10;
U >>= 10;
@@ -2191,7 +2191,7 @@ yuv2rgb_full_X_c_template(SwsInternal *c, const int16_t *lumFilter,
if (hasAlpha) {
A = 1 << 18;
for (j = 0; j < lumFilterSize; j++) {
- A += (unsigned)(alpSrc[j][i] * lumFilter[j]);
+ A += alpSrc[j][i] * (unsigned)lumFilter[j];
}
A >>= 19;
if (A & 0x100)
@@ -2360,11 +2360,11 @@ yuv2gbrp_full_X_c(SwsInternal *c, const int16_t *lumFilter,
int R, G, B;
for (j = 0; j < lumFilterSize; j++)
- Y += (unsigned)(lumSrc[j][i] * lumFilter[j]);
+ Y += lumSrc[j][i] * (unsigned)lumFilter[j];
for (j = 0; j < chrFilterSize; j++) {
- U += (unsigned)(chrUSrc[j][i] * chrFilter[j]);
- V += (unsigned)(chrVSrc[j][i] * chrFilter[j]);
+ U += chrUSrc[j][i] * (unsigned)chrFilter[j];
+ V += chrVSrc[j][i] * (unsigned)chrFilter[j];
}
Y >>= 10;
@@ -2375,7 +2375,7 @@ yuv2gbrp_full_X_c(SwsInternal *c, const int16_t *lumFilter,
A = 1 << 18;
for (j = 0; j < lumFilterSize; j++)
- A += (unsigned)(alpSrc[j][i] * lumFilter[j]);
+ A += alpSrc[j][i] * (unsigned)lumFilter[j];
if (A & 0xF8000000)
A = av_clip_uintp2(A, 27);
@@ -2679,7 +2679,7 @@ yuv2ya8_X_c(SwsInternal *c, const int16_t *lumFilter,
int Y = 1 << 18, A = 1 << 18;
for (j = 0; j < lumFilterSize; j++)
- Y += (unsigned)(lumSrc[j][i] * lumFilter[j]);
+ Y += lumSrc[j][i] * (unsigned)lumFilter[j];
Y >>= 19;
if (Y & 0x100)
@@ -2687,7 +2687,7 @@ yuv2ya8_X_c(SwsInternal *c, const int16_t *lumFilter,
if (hasAlpha) {
for (j = 0; j < lumFilterSize; j++)
- A += (unsigned)(alpSrc[j][i] * lumFilter[j]);
+ A += alpSrc[j][i] * (unsigned)lumFilter[j];
A >>= 19;
@@ -2793,11 +2793,11 @@ yuv2v30_X_c_template(SwsInternal *c, const int16_t *lumFilter,
int j;
for (j = 0; j < lumFilterSize; j++)
- Y += (unsigned)(lumSrc[j][i] * lumFilter[j]);
+ Y += lumSrc[j][i] * (unsigned)lumFilter[j];
for (j = 0; j < chrFilterSize; j++) {
- U += (unsigned)(chrUSrc[j][i] * chrFilter[j]);
- V += (unsigned)(chrVSrc[j][i] * chrFilter[j]);
+ U += chrUSrc[j][i] * (unsigned)chrFilter[j];
+ V += chrVSrc[j][i] * (unsigned)chrFilter[j];
}
Y = av_clip_uintp2(Y >> 17, 10);
@@ -2847,11 +2847,11 @@ yuv2xv36_X_c(SwsInternal *c, const int16_t *lumFilter,
int j;
for (j = 0; j < lumFilterSize; j++)
- Y += (unsigned)(lumSrc[j][i] * lumFilter[j]);
+ Y += lumSrc[j][i] * (unsigned)lumFilter[j];
for (j = 0; j < chrFilterSize; j++) {
- U += (unsigned)(chrUSrc[j][i] * chrFilter[j]);
- V += (unsigned)(chrVSrc[j][i] * chrFilter[j]);
+ U += chrUSrc[j][i] * (unsigned)chrFilter[j];
+ V += chrVSrc[j][i] * (unsigned)chrFilter[j];
}
output_pixels(dest + 8 * i + 2, Y, 15, 12, 4)
@@ -3011,13 +3011,13 @@ yuv2ayuv_X_c_template(SwsInternal *c, const int16_t *lumFilter,
int V = 1 << 18, A = 255;
for (j = 0; j < lumFilterSize; j++)
- Y += (unsigned)(lumSrc[j][i] * lumFilter[j]);
+ Y += lumSrc[j][i] * (unsigned)lumFilter[j];
for (j = 0; j < chrFilterSize; j++)
- U += (unsigned)(chrUSrc[j][i] * chrFilter[j]);
+ U += chrUSrc[j][i] * (unsigned)chrFilter[j];
for (j = 0; j < chrFilterSize; j++)
- V += (unsigned)(chrVSrc[j][i] * chrFilter[j]);
+ V += chrVSrc[j][i] * (unsigned)chrFilter[j];
Y >>= 19;
U >>= 19;
@@ -3034,7 +3034,7 @@ yuv2ayuv_X_c_template(SwsInternal *c, const int16_t *lumFilter,
A = 1 << 18;
for (j = 0; j < lumFilterSize; j++)
- A += (unsigned)(alpSrc[j][i] * lumFilter[j]);
+ A += alpSrc[j][i] * (unsigned)lumFilter[j];
A >>= 19;
@@ -3105,13 +3105,13 @@ AYUVPACKEDWRAPPER(uyva, AV_PIX_FMT_UYVA)
int U = 1 << (shift - 1), V = 1 << (shift - 1); \
\
for (j = 0; j < lumFilterSize; j++) { \
- Y1 += (unsigned)(lumSrc[j][i * 2] * lumFilter[j]); \
- Y2 += (unsigned)(lumSrc[j][i * 2 + 1] * lumFilter[j]); \
+ Y1 += lumSrc[j][i * 2] * (unsigned)lumFilter[j]; \
+ Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j]; \
} \
\
for (j = 0; j < chrFilterSize; j++) { \
- U += (unsigned)(chrUSrc[j][i] * chrFilter[j]); \
- V += (unsigned)(chrVSrc[j][i] * chrFilter[j]); \
+ U += chrUSrc[j][i] * (unsigned)chrFilter[j]; \
+ V += chrVSrc[j][i] * (unsigned)chrFilter[j]; \
} \
\
output_pixel(dest + 8 * i + 0, Y1, bits); \
@@ -3259,13 +3259,13 @@ yuv2vyu444_X_c(SwsInternal *c, const int16_t *lumFilter,
int V = 1 << 18;
for (j = 0; j < lumFilterSize; j++)
- Y += (unsigned)(lumSrc[j][i] * lumFilter[j]);
+ Y += lumSrc[j][i] * (unsigned)lumFilter[j];
for (j = 0; j < chrFilterSize; j++)
- U += (unsigned)(chrUSrc[j][i] * chrFilter[j]);
+ U += chrUSrc[j][i] * (unsigned)chrFilter[j];
for (j = 0; j < chrFilterSize; j++)
- V += (unsigned)(chrVSrc[j][i] * chrFilter[j]);
+ V += chrVSrc[j][i] * (unsigned)chrFilter[j];
Y >>= 19;
U >>= 19;
--
2.49.1
3
3
Currently if you encode a large wav, ffmpeg will hint after the fact
that the resultant file is corrupted, because traditional wav cannot
handle lengths greater than 32-bits. This isn't very useful; nobody
benefits from getting garbage files.
You can manually work around this by adding `-rf64 always`, which most
players have support for. Most people don't remember to do this until
after the fact when their file is corrupted, or they don't figure it out
at all and wind up using the w64 container instead.
And so that's what `-rf64 auto` is for. It uses the larger format when
needed, and if not, uses the traditional wav that is probably more
compatible. The result of using `-rf64 auto` is that you can add it to
every command line -- and should add it to every command line -- to get
either a normal small file, or a non-corrupt large file.
This is a very sensible default to have on, rather than just producing
corrupt files and having users scrambling for solutions, and then having
to do a potentially expensive reencode after. With `-rf64 auto` on by
default, the user always gets a readable good file. And for users who
sometimes want corrupt files, there still exists `-rf64 never` that can
be enabled.
---
libavformat/wavenc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libavformat/wavenc.c b/libavformat/wavenc.c
index a515f4e2a2..835a2157bc 100644
--- a/libavformat/wavenc.c
+++ b/libavformat/wavenc.c
@@ -487,7 +487,7 @@ static const AVOption options[] = {
{ "off", "Do not write peak chunk.", 0, AV_OPT_TYPE_CONST, { .i64 = PEAK_OFF }, 0, 0, ENC, .unit = "peak" },
{ "on", "Append peak chunk after wav data.", 0, AV_OPT_TYPE_CONST, { .i64 = PEAK_ON }, 0, 0, ENC, .unit = "peak" },
{ "only", "Write only peak chunk, omit wav data.", 0, AV_OPT_TYPE_CONST, { .i64 = PEAK_ONLY }, 0, 0, ENC, .unit = "peak" },
- { "rf64", "Use RF64 header rather than RIFF for large files.", OFFSET(rf64), AV_OPT_TYPE_INT, { .i64 = RF64_NEVER },-1, 1, ENC, .unit = "rf64" },
+ { "rf64", "Use RF64 header rather than RIFF for large files.", OFFSET(rf64), AV_OPT_TYPE_INT, { .i64 = RF64_AUTO },-1, 1, ENC, .unit = "rf64" },
{ "auto", "Write RF64 header if file grows large enough.", 0, AV_OPT_TYPE_CONST, { .i64 = RF64_AUTO }, 0, 0, ENC, .unit = "rf64" },
{ "always", "Always write RF64 header regardless of file size.", 0, AV_OPT_TYPE_CONST, { .i64 = RF64_ALWAYS }, 0, 0, ENC, .unit = "rf64" },
{ "never", "Never write RF64 header regardless of file size.", 0, AV_OPT_TYPE_CONST, { .i64 = RF64_NEVER }, 0, 0, ENC, .unit = "rf64" },
--
2.52.0
3
6
[PR] avcodec/exr: enforce maximum channel limit to avoid excessive memory allocations (PR #21347)
by Timo Rothenpieler 31 Dec '25
by Timo Rothenpieler 31 Dec '25
31 Dec '25
PR #21347 opened by Timo Rothenpieler (BtbN)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21347
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21347.patch
A specially crafted file could define an unlimited number of channels,
leading to ever-growing memory allocations and even overflows in the
size calculation.
Also fixes the not properly checked allocation via av_realloc.
Fixes #YWH-PGM40646-33
From 025e88a32c87eaf3e6f912ed51521d020a9a85b2 Mon Sep 17 00:00:00 2001
From: Timo Rothenpieler <timo(a)rothenpieler.org>
Date: Wed, 31 Dec 2025 22:02:34 +0100
Subject: [PATCH 1/2] avcodec/exr: only assign result of av_realloc on
allocation success
---
libavcodec/exr.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/libavcodec/exr.c b/libavcodec/exr.c
index 536a55c5be..8b9fe4b3fc 100644
--- a/libavcodec/exr.c
+++ b/libavcodec/exr.c
@@ -1603,6 +1603,7 @@ static int decode_header(EXRContext *s, AVFrame *frame)
int layer_match = 0;
int ret;
int dup_channels = 0;
+ void *tmp;
s->current_channel_offset = 0;
s->xmin = ~0;
@@ -1807,12 +1808,13 @@ static int decode_header(EXRContext *s, AVFrame *frame)
}
}
- s->channels = av_realloc(s->channels,
- ++s->nb_channels * sizeof(EXRChannel));
- if (!s->channels) {
+ tmp = av_realloc(s->channels, ++s->nb_channels * sizeof(EXRChannel));
+ if (!tmp) {
ret = AVERROR(ENOMEM);
goto fail;
}
+ s->channels = tmp;
+
channel = &s->channels[s->nb_channels - 1];
channel->pixel_type = current_pixel_type;
channel->xsub = xsub;
--
2.49.1
From c97c5fa2f3598c14858ec6fb357537ae4fe1c36b Mon Sep 17 00:00:00 2001
From: Timo Rothenpieler <timo(a)rothenpieler.org>
Date: Wed, 31 Dec 2025 22:02:52 +0100
Subject: [PATCH 2/2] avcodec/exr: enforce maximum channel limit to avoid
excessive memory allocations
A specially crafted file could define an unlimited number of channels,
leading to ever growing memory allocations and even overflows in the
size calculation.
Fixes #YWH-PGM40646-33
---
libavcodec/exr.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/libavcodec/exr.c b/libavcodec/exr.c
index 8b9fe4b3fc..10078b462f 100644
--- a/libavcodec/exr.c
+++ b/libavcodec/exr.c
@@ -59,6 +59,8 @@
#include "mathops.h"
#include "thread.h"
+#define MAX_CHANNELS 1024
+
enum ExrCompr {
EXR_RAW,
EXR_RLE,
@@ -1808,6 +1810,12 @@ static int decode_header(EXRContext *s, AVFrame *frame)
}
}
+ if (s->nb_channels >= MAX_CHANNELS) {
+ av_log(s->avctx, AV_LOG_ERROR, "Number of channels exceeds supported maximum of %d.\n", MAX_CHANNELS);
+ ret = AVERROR_INVALIDDATA;
+ goto fail;
+ }
+
tmp = av_realloc(s->channels, ++s->nb_channels * sizeof(EXRChannel));
if (!tmp) {
ret = AVERROR(ENOMEM);
--
2.49.1
1
0
PR #21346 opened by michaelni
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21346
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21346.patch
Signed-off-by: Michael Niedermayer <michael(a)niedermayer.cc>
From 334bc7276c0a3bca4b0959e4c096ac1f6ce1acbe Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <michael(a)niedermayer.cc>
Date: Wed, 31 Dec 2025 21:34:26 +0100
Subject: [PATCH] fftools/ffmpeg_filter: Simplify median3()
Signed-off-by: Michael Niedermayer <michael(a)niedermayer.cc>
---
fftools/ffmpeg_filter.c | 13 +------------
1 file changed, 1 insertion(+), 12 deletions(-)
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 4387c992da..1ed9681ad2 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -2488,18 +2488,7 @@ early_exit:
static int64_t median3(int64_t a, int64_t b, int64_t c)
{
- int64_t max2, min2, m;
-
- if (a >= b) {
- max2 = a;
- min2 = b;
- } else {
- max2 = b;
- min2 = a;
- }
- m = (c >= max2) ? max2 : c;
-
- return (m >= min2) ? m : min2;
+ return a + (uint64_t)b + c - FFMIN3(a,b,c) - FFMAX3(a,b,c);
}
--
2.49.1
1
0
PR #21345 opened by Zhao Zhili (quink)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21345
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21345.patch
Fix #21141
The performance improved a little bit.
On A76:
Before After
put_pixels_tab[0][1]_neon: 32.4 ( 3.91x) 31.6 ( 3.99x)
put_pixels_tab[0][3]_neon: 88.0 ( 4.50x) 74.6 ( 5.31x)
put_pixels_tab[1][1]_neon: 33.5 ( 2.52x) 31.2 ( 2.71x)
put_pixels_tab[1][3]_neon: 30.5 ( 3.61x) 21.7 ( 5.08x)
On A55:
Before After
put_pixels_tab[0][1]_neon: 175.2 ( 2.41x) 138.7 ( 3.04x)
put_pixels_tab[0][3]_neon: 334.3 ( 2.71x) 296.1 ( 3.07x)
put_pixels_tab[1][1]_neon: 168.3 ( 1.78x) 94.1 ( 3.19x)
put_pixels_tab[1][3]_neon: 112.3 ( 2.20x) 90.0 ( 2.74x)
From 1d4f113c75befc460ce02ee9898705c8a4fcf882 Mon Sep 17 00:00:00 2001
From: Zhao Zhili <zhilizhao(a)tencent.com>
Date: Thu, 1 Jan 2026 00:52:44 +0800
Subject: [PATCH] aarch64/hpeldsp_neon: fix overread
Fix #21141
The performance improved a little bit.
On A76:
Before After
put_pixels_tab[0][1]_neon: 32.4 ( 3.91x) 31.6 ( 3.99x)
put_pixels_tab[0][3]_neon: 88.0 ( 4.50x) 74.6 ( 5.31x)
put_pixels_tab[1][1]_neon: 33.5 ( 2.52x) 31.2 ( 2.71x)
put_pixels_tab[1][3]_neon: 30.5 ( 3.61x) 21.7 ( 5.08x)
On A55:
Before After
put_pixels_tab[0][1]_neon: 175.2 ( 2.41x) 138.7 ( 3.04x)
put_pixels_tab[0][3]_neon: 334.3 ( 2.71x) 296.1 ( 3.07x)
put_pixels_tab[1][1]_neon: 168.3 ( 1.78x) 94.1 ( 3.19x)
put_pixels_tab[1][3]_neon: 112.3 ( 2.20x) 90.0 ( 2.74x)
---
libavcodec/aarch64/hpeldsp_neon.S | 58 ++++++++++++++++---------------
1 file changed, 30 insertions(+), 28 deletions(-)
diff --git a/libavcodec/aarch64/hpeldsp_neon.S b/libavcodec/aarch64/hpeldsp_neon.S
index e7c1549c40..fd2c2c98c4 100644
--- a/libavcodec/aarch64/hpeldsp_neon.S
+++ b/libavcodec/aarch64/hpeldsp_neon.S
@@ -50,12 +50,13 @@
.endm
.macro pixels16_x2 rnd=1, avg=0
-1: ld1 {v0.16b, v1.16b}, [x1], x2
- ld1 {v2.16b, v3.16b}, [x1], x2
+1:
+ ldur q1, [x1, #1]
+ ld1 {v0.16b}, [x1], x2
subs w3, w3, #2
- ext v1.16b, v0.16b, v1.16b, #1
+ ldur q3, [x1, #1]
+ ld1 {v2.16b}, [x1], x2
avg v0.16b, v0.16b, v1.16b
- ext v3.16b, v2.16b, v3.16b, #1
avg v2.16b, v2.16b, v3.16b
.if \avg
ld1 {v1.16b}, [x0], x2
@@ -108,20 +109,20 @@
.macro pixels16_xy2 rnd=1, avg=0
sub w3, w3, #2
- ld1 {v0.16b, v1.16b}, [x1], x2
- ld1 {v4.16b, v5.16b}, [x1], x2
+ ldur q1, [x1, #1]
+ ld1 {v0.16b}, [x1], x2
NRND movi v26.8H, #1
- ext v1.16b, v0.16b, v1.16b, #1
- ext v5.16b, v4.16b, v5.16b, #1
+ ldur q5, [x1, #1]
+ ld1 {v4.16b}, [x1], x2
uaddl v16.8h, v0.8b, v1.8b
uaddl2 v20.8h, v0.16b, v1.16b
uaddl v18.8h, v4.8b, v5.8b
uaddl2 v22.8h, v4.16b, v5.16b
1: subs w3, w3, #2
- ld1 {v0.16b, v1.16b}, [x1], x2
+ ldur q30, [x1, #1]
+ ld1 {v0.16b}, [x1], x2
add v24.8h, v16.8h, v18.8h
NRND add v24.8H, v24.8H, v26.8H
- ext v30.16b, v0.16b, v1.16b, #1
add v1.8h, v20.8h, v22.8h
mshrn v28.8b, v24.8h, #2
NRND add v1.8H, v1.8H, v26.8H
@@ -131,12 +132,12 @@ NRND add v1.8H, v1.8H, v26.8H
urhadd v28.16b, v28.16b, v16.16b
.endif
uaddl v16.8h, v0.8b, v30.8b
- ld1 {v2.16b, v3.16b}, [x1], x2
+ ldur q3, [x1, #1]
+ ld1 {v2.16b}, [x1], x2
uaddl2 v20.8h, v0.16b, v30.16b
st1 {v28.16b}, [x0], x2
add v24.8h, v16.8h, v18.8h
NRND add v24.8H, v24.8H, v26.8H
- ext v3.16b, v2.16b, v3.16b, #1
add v0.8h, v20.8h, v22.8h
mshrn v30.8b, v24.8h, #2
NRND add v0.8H, v0.8H, v26.8H
@@ -150,10 +151,10 @@ NRND add v0.8H, v0.8H, v26.8H
st1 {v30.16b}, [x0], x2
b.gt 1b
- ld1 {v0.16b, v1.16b}, [x1], x2
+ ldur q30, [x1, #1]
+ ld1 {v0.16b}, [x1], x2
add v24.8h, v16.8h, v18.8h
NRND add v24.8H, v24.8H, v26.8H
- ext v30.16b, v0.16b, v1.16b, #1
add v1.8h, v20.8h, v22.8h
mshrn v28.8b, v24.8h, #2
NRND add v1.8H, v1.8H, v26.8H
@@ -206,10 +207,11 @@ NRND add v0.8H, v0.8H, v26.8H
.endm
.macro pixels8_x2 rnd=1, avg=0
-1: ld1 {v0.8b, v1.8b}, [x1], x2
- ext v1.8b, v0.8b, v1.8b, #1
- ld1 {v2.8b, v3.8b}, [x1], x2
- ext v3.8b, v2.8b, v3.8b, #1
+1:
+ ldur d1, [x1, #1]
+ ld1 {v0.8b}, [x1], x2
+ ldur d3, [x1, #1]
+ ld1 {v2.8b}, [x1], x2
subs w3, w3, #2
avg v0.8b, v0.8b, v1.8b
avg v2.8b, v2.8b, v3.8b
@@ -263,22 +265,23 @@ NRND add v0.8H, v0.8H, v26.8H
.endm
.macro pixels8_xy2 rnd=1, avg=0
+ ldur d4, [x1, #1]
sub w3, w3, #2
- ld1 {v0.16b}, [x1], x2
- ld1 {v1.16b}, [x1], x2
+ ld1 {v0.8b}, [x1], x2
NRND movi v19.8H, #1
- ext v4.16b, v0.16b, v4.16b, #1
- ext v6.16b, v1.16b, v6.16b, #1
+ ldur d6, [x1, #1]
+ ld1 {v1.8b}, [x1], x2
uaddl v16.8h, v0.8b, v4.8b
uaddl v17.8h, v1.8b, v6.8b
1: subs w3, w3, #2
- ld1 {v0.16b}, [x1], x2
+ ldur d4, [x1, #1]
+ ld1 {v0.8b}, [x1], x2
add v18.8h, v16.8h, v17.8h
- ext v4.16b, v0.16b, v4.16b, #1
NRND add v18.8H, v18.8H, v19.8H
uaddl v16.8h, v0.8b, v4.8b
mshrn v5.8b, v18.8h, #2
- ld1 {v1.16b}, [x1], x2
+ ldur d6, [x1, #1]
+ ld1 {v1.8b}, [x1], x2
add v18.8h, v16.8h, v17.8h
.if \avg
ld1 {v7.8b}, [x0]
@@ -291,14 +294,13 @@ NRND add v18.8H, v18.8H, v19.8H
ld1 {v5.8b}, [x0]
urhadd v7.8b, v7.8b, v5.8b
.endif
- ext v6.16b, v1.16b, v6.16b, #1
uaddl v17.8h, v1.8b, v6.8b
st1 {v7.8b}, [x0], x2
b.gt 1b
- ld1 {v0.16b}, [x1], x2
+ ldur d4, [x1, #1]
+ ld1 {v0.8b}, [x1], x2
add v18.8h, v16.8h, v17.8h
- ext v4.16b, v0.16b, v4.16b, #1
NRND add v18.8H, v18.8H, v19.8H
uaddl v16.8h, v0.8b, v4.8b
mshrn v5.8b, v18.8h, #2
--
2.49.1
1
0