ffmpeg-cvslog
Threads by month
- ----- 2026 -----
- October
- September
- 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
September 2025
- 1 participants
- 195 discussions
[ffmpeg] branch master updated. 7c78a63476 avcodec/mpegaudiodec_float: Don't set AVCodec.sample_fmts directly
by ffmpeg-git@ffmpeg.org 23 Sep '25
by ffmpeg-git@ffmpeg.org 23 Sep '25
23 Sep '25
The branch, master has been updated
via 7c78a63476da6360063d45f74cb1d9fc94047278 (commit)
via cf30a3757fc7459ece7e83d8e6fcce7f80546817 (commit)
from e63e040f0cef2d6af2fb57aefa6250fc450fa049 (commit)
- Log -----------------------------------------------------------------
commit 7c78a63476da6360063d45f74cb1d9fc94047278
Author: Andreas Rheinhardt <andreas.rheinhardt(a)outlook.com>
AuthorDate: Tue Sep 23 05:42:59 2025 +0200
Commit: James Almer <jamrial(a)gmail.com>
CommitDate: Tue Sep 23 22:16:02 2025 +0000
avcodec/mpegaudiodec_float: Don't set AVCodec.sample_fmts directly
It is deprecated and doing so gives warnings from Clang.
Use CODEC_SAMPLEFMTS instead.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt(a)outlook.com>
diff --git a/libavcodec/mpegaudiodec_float.c b/libavcodec/mpegaudiodec_float.c
index 232e2fa201..e713e9e251 100644
--- a/libavcodec/mpegaudiodec_float.c
+++ b/libavcodec/mpegaudiodec_float.c
@@ -115,9 +115,7 @@ const FFCodec ff_ahx_decoder = {
.p.capabilities = AV_CODEC_CAP_CHANNEL_CONF |
AV_CODEC_CAP_DR1,
.flush = flush,
- .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
- AV_SAMPLE_FMT_FLT,
- AV_SAMPLE_FMT_NONE },
+ CODEC_SAMPLEFMTS(AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT),
.bsfs = "ahx_to_mp2",
};
#endif
commit cf30a3757fc7459ece7e83d8e6fcce7f80546817
Author: Andreas Rheinhardt <andreas.rheinhardt(a)outlook.com>
AuthorDate: Tue Sep 23 05:40:39 2025 +0200
Commit: James Almer <jamrial(a)gmail.com>
CommitDate: Tue Sep 23 22:16:02 2025 +0000
configure: Add missing dependencies for AHX decoder
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt(a)outlook.com>
diff --git a/configure b/configure
index a7bb518d70..e5764a17a3 100755
--- a/configure
+++ b/configure
@@ -2979,6 +2979,7 @@ adpcm_n64_decoder_deps="lgpl_gpl"
adpcm_psxc_decoder_deps="lgpl_gpl"
agm_decoder_select="idctdsp"
ahx_decoder_deps="lgpl_gpl"
+ahx_decoder_select="mpegaudio ahx_to_mp2_bsf"
aic_decoder_select="golomb idctdsp"
alac_encoder_select="lpc"
als_decoder_select="bswapdsp mpeg4audio"
-----------------------------------------------------------------------
Summary of changes:
configure | 1 +
libavcodec/mpegaudiodec_float.c | 4 +---
2 files changed, 2 insertions(+), 3 deletions(-)
hooks/post-receive
--
1
0
[ffmpeg] branch master updated. e63e040f0c avformat/rtsp: fix leading space in RTSP reason
by ffmpeg-git@ffmpeg.org 23 Sep '25
by ffmpeg-git@ffmpeg.org 23 Sep '25
23 Sep '25
The branch, master has been updated
via e63e040f0cef2d6af2fb57aefa6250fc450fa049 (commit)
via 2ed47ab72509bbee60288d245a0aebb7eb05e41a (commit)
from 899e497122f793c3d97f5aac7bee62567f23fe29 (commit)
- Log -----------------------------------------------------------------
commit e63e040f0cef2d6af2fb57aefa6250fc450fa049
Author: Marvin Scholz <epirat07(a)gmail.com>
AuthorDate: Fri Aug 22 21:41:26 2025 +0200
Commit: Marvin Scholz <epirat07(a)gmail.com>
CommitDate: Tue Sep 23 21:33:37 2025 +0000
avformat/rtsp: fix leading space in RTSP reason
When parsing the RTSP message reason, the whole remainder
after parsing the status code was used, which would lead to
a leading space in the parsed reason string.
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 13507d1858..d601d63a89 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -1274,6 +1274,7 @@ start:
if (!strncmp(buf1, "RTSP/", 5)) {
get_word(buf1, sizeof(buf1), &p);
reply->status_code = atoi(buf1);
+ p += strspn(p, SPACE_CHARS);
av_strlcpy(reply->reason, p, sizeof(reply->reason));
} else {
av_strlcpy(reply->reason, buf1, sizeof(reply->reason)); // method
commit 2ed47ab72509bbee60288d245a0aebb7eb05e41a
Author: Marvin Scholz <epirat07(a)gmail.com>
AuthorDate: Fri Aug 22 16:50:34 2025 +0200
Commit: Marvin Scholz <epirat07(a)gmail.com>
CommitDate: Tue Sep 23 21:33:37 2025 +0000
avformat/rtsp: do not log invalid values
When reading fails the first time, ch would be uninitialized and
printed in the log message. Instead check for an error early and
log it properly.
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 10355b89b8..13507d1858 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -1239,9 +1239,12 @@ start:
q = buf;
for (;;) {
ret = ffurl_read_complete(rt->rtsp_hd, &ch, 1);
+ if (ret != 1) {
+ ret = (ret < 0) ? ret : AVERROR(EIO);
+ av_log(s, AV_LOG_WARNING, "Failed reading RTSP data: %s\n", av_err2str(ret));
+ return ret;
+ }
av_log(s, AV_LOG_TRACE, "ret=%d c=%02x [%c]\n", ret, ch, ch);
- if (ret != 1)
- return ret < 0 ? ret : AVERROR(EIO);
if (ch == '\n')
break;
if (ch == '$' && q == buf) {
-----------------------------------------------------------------------
Summary of changes:
libavformat/rtsp.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
hooks/post-receive
--
1
0
[ffmpeg] branch master updated. 899e497122 avfilter/vf_libplacebo: force premultiplied blending for linear texture
by ffmpeg-git@ffmpeg.org 23 Sep '25
by ffmpeg-git@ffmpeg.org 23 Sep '25
23 Sep '25
The branch, master has been updated
via 899e497122f793c3d97f5aac7bee62567f23fe29 (commit)
via 6f08ab6c4c2e5eeef3e0704b21c338c512cf97f6 (commit)
from 5c9b2027bc48ae5d39b0d82696895f0834788242 (commit)
- Log -----------------------------------------------------------------
commit 899e497122f793c3d97f5aac7bee62567f23fe29
Author: Niklas Haas <git(a)haasn.dev>
AuthorDate: Thu Sep 11 01:48:32 2025 +0200
Commit: Niklas Haas <ffmpeg(a)haasn.dev>
CommitDate: Tue Sep 23 18:50:03 2025 +0000
avfilter/vf_libplacebo: force premultiplied blending for linear texture
Blending onto independent alpha framebuffers is not possible under the
constraints of the supported blend operators. While we could handle
blending premul-onto-premul, this would break if the base layer is YUV,
since premultiplied alpha does not survive the (nonlinear) YUV conversion.
Fortunately, blending independent-onto-premul is just as easy, and works in
all cases. So just force this mode when using a linear intermediate blend
texture, which is always RGBA.
diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c
index 8f30eb193b..80d3b273bb 100644
--- a/libavfilter/vf_libplacebo.c
+++ b/libavfilter/vf_libplacebo.c
@@ -1033,6 +1033,7 @@ props_done:
.color = orig_target.color,
.rotation = orig_target.rotation,
};
+ target.repr.alpha = PL_ALPHA_PREMULTIPLIED;
target.color.transfer = PL_COLOR_TRC_LINEAR;
use_linear_compositor = true;
}
@@ -1052,7 +1053,8 @@ props_done:
update_crops(ctx, in, &target, target_pts);
pl_render_image_mix(in->renderer, &in->mix, &target, &tmp_params);
- /* Force straight output and set correct blend mode */
+ /* Force straight output and set correct blend operator. This is
+ * required to get correct blending onto YUV target buffers. */
target.repr.alpha = PL_ALPHA_INDEPENDENT;
tmp_params.blend_params = &pl_alpha_overlay;
#if PL_API_VER >= 346
@@ -1065,6 +1067,7 @@ props_done:
if (use_linear_compositor) {
/* Blit the linear intermediate image to the output frame */
target.crop = orig_target.crop = (struct pl_rect2df) {0};
+ target.repr.alpha = PL_ALPHA_PREMULTIPLIED;
pl_render_image(s->linear_rr, &target, &orig_target, &opts->params);
target = orig_target;
} else if (!ref) {
commit 6f08ab6c4c2e5eeef3e0704b21c338c512cf97f6
Author: Niklas Haas <git(a)haasn.dev>
AuthorDate: Thu Sep 11 01:39:46 2025 +0200
Commit: Niklas Haas <ffmpeg(a)haasn.dev>
CommitDate: Tue Sep 23 18:50:03 2025 +0000
avfilter/vf_libplacebo: use temporary params struct for per-pass params
Instead of directly mutating `opts->params`. Avoids any possible leak of
overriden params between invocations of this function, as well as the later
`pl_render_image` during the linear output pass.
diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c
index 5e0a678ff2..8f30eb193b 100644
--- a/libavfilter/vf_libplacebo.c
+++ b/libavfilter/vf_libplacebo.c
@@ -1038,12 +1038,7 @@ props_done:
}
/* Draw first frame opaque, others with blending */
- opts->params.blend_params = NULL;
-#if PL_API_VER >= 346
- opts->params.background = opts->params.border = PL_CLEAR_COLOR;
-#else
- opts->params.skip_target_clearing = false;
-#endif
+ struct pl_render_params tmp_params = opts->params;
for (int i = 0; i < s->nb_inputs; i++) {
LibplaceboInput *in = &s->inputs[i];
FilterLink *il = ff_filter_link(ctx->inputs[i]);
@@ -1053,17 +1048,17 @@ props_done:
pl_renderer_flush_cache(in->renderer);
continue;
}
- opts->params.skip_caching_single_frame = high_fps;
+ tmp_params.skip_caching_single_frame = high_fps;
update_crops(ctx, in, &target, target_pts);
- pl_render_image_mix(in->renderer, &in->mix, &target, &opts->params);
+ pl_render_image_mix(in->renderer, &in->mix, &target, &tmp_params);
/* Force straight output and set correct blend mode */
target.repr.alpha = PL_ALPHA_INDEPENDENT;
- opts->params.blend_params = &pl_alpha_overlay;
+ tmp_params.blend_params = &pl_alpha_overlay;
#if PL_API_VER >= 346
- opts->params.background = opts->params.border = PL_CLEAR_SKIP;
+ tmp_params.background = tmp_params.border = PL_CLEAR_SKIP;
#else
- opts->params.skip_target_clearing = true;
+ tmp_params.skip_target_clearing = true;
#endif
}
-----------------------------------------------------------------------
Summary of changes:
libavfilter/vf_libplacebo.c | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
hooks/post-receive
--
1
0
[ffmpeg] branch master updated. 5c9b2027bc lavc/libsvtav1: set packet durations
by ffmpeg-git@ffmpeg.org 23 Sep '25
by ffmpeg-git@ffmpeg.org 23 Sep '25
23 Sep '25
The branch, master has been updated
via 5c9b2027bc48ae5d39b0d82696895f0834788242 (commit)
from ae03b629db116a8a5b6b40ede912fbb8b1ca0175 (commit)
- Log -----------------------------------------------------------------
commit 5c9b2027bc48ae5d39b0d82696895f0834788242
Author: rcombs <rcombs(a)rcombs.me>
AuthorDate: Tue Sep 23 00:45:58 2025 -0700
Commit: James Almer <jamrial(a)gmail.com>
CommitDate: Tue Sep 23 14:32:47 2025 +0000
lavc/libsvtav1: set packet durations
diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c
index c6a0ff90bc..8ac5fd2d04 100644
--- a/libavcodec/libsvtav1.c
+++ b/libavcodec/libsvtav1.c
@@ -520,6 +520,7 @@ static int eb_send_frame(AVCodecContext *avctx, const AVFrame *frame)
headerPtr->flags = 0;
headerPtr->p_app_private = NULL;
headerPtr->pts = frame->pts;
+ headerPtr->n_tick_count = frame->duration;
switch (frame->pict_type) {
case AV_PICTURE_TYPE_I:
@@ -636,6 +637,7 @@ static int eb_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
pkt->size = headerPtr->n_filled_len;
pkt->pts = headerPtr->pts;
pkt->dts = headerPtr->dts;
+ pkt->duration = headerPtr->n_tick_count;
switch (headerPtr->pic_type) {
case EB_AV1_KEY_PICTURE:
-----------------------------------------------------------------------
Summary of changes:
libavcodec/libsvtav1.c | 2 ++
1 file changed, 2 insertions(+)
hooks/post-receive
--
1
0
[ffmpeg] branch master updated. ae03b629db avformat/mov: Merge tts after building index for old-style uncompressed PCM
by ffmpeg-git@ffmpeg.org 23 Sep '25
by ffmpeg-git@ffmpeg.org 23 Sep '25
23 Sep '25
The branch, master has been updated
via ae03b629db116a8a5b6b40ede912fbb8b1ca0175 (commit)
from 03c054d43c594211b89d5b2931430dccd7424d58 (commit)
- Log -----------------------------------------------------------------
commit ae03b629db116a8a5b6b40ede912fbb8b1ca0175
Author: Derek Buitenhuis <derek.buitenhuis(a)gmail.com>
AuthorDate: Mon Sep 22 20:00:54 2025 +0100
Commit: Derek Buitenhuis <derek.buitenhuis(a)gmail.com>
CommitDate: Tue Sep 23 14:39:13 2025 +0100
avformat/mov: Merge tts after building index for old-style uncompressed PCM
This was a regression introduced in 292c1df7c159c8a1a7afe52613d164ff417e81ce.
Since we don't know the length of the stts data until after building the
index, since we're generating it, we need to merge any ctts data after,
since otherwise tts_count is set to 0, and no packets will be output.
We can't remove the merge entirely, because uncompressed PCM with
a ctts atom is technically valid (e.g. a constant CTS offset).
This fixes old-style uncompressed PCM demuxing.
Fixes #11490.
Signed-off-by: Derek Buitenhuis <derek.buitenhuis(a)gmail.com>
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 216c6a5442..7fe4678234 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -4841,10 +4841,6 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
if (!sc->chunk_count || sc->tts_count)
return;
- ret = mov_merge_tts_data(mov, st, MOV_MERGE_CTTS);
- if (ret < 0)
- return;
-
// compute total chunk count
for (i = 0; i < sc->stsc_count; i++) {
unsigned count, chunk_count;
@@ -4939,6 +4935,10 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
chunk_samples -= samples;
}
}
+
+ ret = mov_merge_tts_data(mov, st, MOV_MERGE_CTTS);
+ if (ret < 0)
+ return;
}
if (!mov->ignore_editlist && mov->advanced_editlist) {
-----------------------------------------------------------------------
Summary of changes:
libavformat/mov.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
hooks/post-receive
--
1
0
[ffmpeg] branch master updated. 03c054d43c avcodec/aarch64/vvc: Implement dmvr_v_8
by ffmpeg-git@ffmpeg.org 23 Sep '25
by ffmpeg-git@ffmpeg.org 23 Sep '25
23 Sep '25
The branch, master has been updated
via 03c054d43c594211b89d5b2931430dccd7424d58 (commit)
via 56a638d8365370b287c53768f2c8a34a4cf3e417 (commit)
from e5ac70042e91d19110a04a52b7e6fa4703f61200 (commit)
- Log -----------------------------------------------------------------
commit 03c054d43c594211b89d5b2931430dccd7424d58
Author: Krzysztof Pyrkosz <ffmpeg(a)szaka.eu>
AuthorDate: Mon Sep 8 20:56:24 2025 +0200
Commit: Martin Storsjö <martin(a)martin.st>
CommitDate: Tue Sep 23 11:20:20 2025 +0000
avcodec/aarch64/vvc: Implement dmvr_v_8
A72
dmvr_v_8_12x20_neon: 207.0 ( 4.15x)
dmvr_v_8_20x12_neon: 170.4 ( 4.37x)
dmvr_v_8_20x20_neon: 273.4 ( 4.58x)
A53
dmvr_v_8_12x20_neon: 450.6 ( 4.21x)
dmvr_v_8_20x12_neon: 342.8 ( 3.70x)
dmvr_v_8_20x20_neon: 550.9 ( 3.79x)
diff --git a/libavcodec/aarch64/vvc/dsp_init.c b/libavcodec/aarch64/vvc/dsp_init.c
index bdfa142a5a..b7dc1d89f8 100644
--- a/libavcodec/aarch64/vvc/dsp_init.c
+++ b/libavcodec/aarch64/vvc/dsp_init.c
@@ -101,6 +101,7 @@ DMVR_FUN(, 12)
DMVR_FUN(h_, 8)
DMVR_FUN(h_, 10)
DMVR_FUN(h_, 12)
+DMVR_FUN(v_, 8)
DMVR_FUN(hv_, 8)
DMVR_FUN(hv_, 10)
DMVR_FUN(hv_, 12)
@@ -195,6 +196,7 @@ void ff_vvc_dsp_init_aarch64(VVCDSPContext *const c, const int bd)
c->inter.w_avg = vvc_w_avg_8;
c->inter.dmvr[0][0] = ff_vvc_dmvr_8_neon;
c->inter.dmvr[0][1] = ff_vvc_dmvr_h_8_neon;
+ c->inter.dmvr[1][0] = ff_vvc_dmvr_v_8_neon;
c->inter.dmvr[1][1] = ff_vvc_dmvr_hv_8_neon;
c->inter.apply_bdof = ff_vvc_apply_bdof_8_neon;
diff --git a/libavcodec/aarch64/vvc/inter.S b/libavcodec/aarch64/vvc/inter.S
index df6b59510d..a874edf889 100644
--- a/libavcodec/aarch64/vvc/inter.S
+++ b/libavcodec/aarch64/vvc/inter.S
@@ -385,6 +385,62 @@ function ff_vvc_dmvr_12_neon, export=1
ret
endfunc
+function ff_vvc_dmvr_v_8_neon, export=1
+ movrel x7, X(ff_vvc_inter_luma_dmvr_filters)
+ add x7, x7, x5, lsl #1
+ ld2r {v0.16b, v1.16b}, [x7]
+ tbz w6, #4, 12f
+
+ ldr s16, [x1, #16]
+ ld1 {v2.16b}, [x1], x2
+20:
+ ldr s17, [x1, #16]
+ umull v4.8h, v0.8b, v2.8b
+ umull2 v5.8h, v0.16b, v2.16b
+ ld1 {v3.16b}, [x1], x2
+ umull v16.8h, v0.8b, v16.8b
+ umull v6.8h, v1.8b, v3.8b
+ umull2 v7.8h, v1.16b, v3.16b
+ add v4.8h, v4.8h, v6.8h
+ umull v18.8h, v1.8b, v17.8b
+ add v5.8h, v5.8h, v7.8h
+ urshr v4.8h, v4.8h, #2
+ add v19.4h, v16.4h, v18.4h
+ urshr v5.8h, v5.8h, #2
+ urshr v19.4h, v19.4h, #2
+ st1 {v4.8h, v5.8h}, [x0], #32
+ subs w3, w3, #1
+ mov v2.16b, v3.16b
+ st1 {v19.4h}, [x0], #8
+ mov v16.16b, v17.16b
+ add x0, x0, #(VVC_MAX_PB_SIZE * 2 - 32 - 8)
+ b.ne 20b
+ ret
+
+12:
+ ldr s16, [x1, #8]
+ ld1 {v2.8b}, [x1], x2
+2:
+ ldr s17, [x1, #8]
+ umull v4.8h, v0.8b, v2.8b
+ ld1 {v3.8b}, [x1], x2
+ umull v16.8h, v0.8b, v16.8b
+ umull v6.8h, v1.8b, v3.8b
+ add v4.8h, v4.8h, v6.8h
+ umull v18.8h, v1.8b, v17.8b
+ srshr v4.8h, v4.8h, #2
+ add v19.4h, v16.4h, v18.4h
+ srshr v19.4h, v19.4h, #2
+ st1 {v4.8h}, [x0], #16
+ subs w3, w3, #1
+ mov v2.16b, v3.16b
+ st1 {v19.4h}, [x0], #8
+ mov v16.16b, v17.16b
+ add x0, x0, #(VVC_MAX_PB_SIZE * 2 - 16 - 8)
+ b.ne 2b
+ ret
+endfunc
+
function ff_vvc_dmvr_h_8_neon, export=1
movrel x7, X(ff_vvc_inter_luma_dmvr_filters)
add x7, x7, x4, lsl #1
commit 56a638d8365370b287c53768f2c8a34a4cf3e417
Author: Krzysztof Pyrkosz <ffmpeg(a)szaka.eu>
AuthorDate: Sun Sep 14 19:13:24 2025 +0200
Commit: Martin Storsjö <martin(a)martin.st>
CommitDate: Tue Sep 23 11:20:11 2025 +0000
avcodec/aarch64/vvc: Unroll vvc_bdof_grad_filter_8x_neon
Before and after:
A53:
apply_bdof_8_16x8_neon: 2733.1 ( 4.88x)
apply_bdof_8_16x16_neon: 5458.6 ( 4.86x)
apply_bdof_10_16x8_neon: 2789.8 ( 4.64x)
apply_bdof_10_16x16_neon: 5523.8 ( 4.68x)
apply_bdof_12_16x8_neon: 2792.8 ( 4.58x)
apply_bdof_12_16x16_neon: 5519.5 ( 4.63x)
apply_bdof_8_16x8_neon: 2571.8 ( 5.12x)
apply_bdof_8_16x16_neon: 5173.3 ( 5.12x)
apply_bdof_10_16x8_neon: 2635.1 ( 4.87x)
apply_bdof_10_16x16_neon: 5243.0 ( 4.89x)
apply_bdof_12_16x8_neon: 2613.0 ( 4.89x)
apply_bdof_12_16x16_neon: 5231.7 ( 4.90x)
A78:
apply_bdof_8_16x8_neon: 565.3 ( 8.43x)
apply_bdof_8_16x16_neon: 1109.5 ( 8.60x)
apply_bdof_10_16x8_neon: 568.2 ( 7.92x)
apply_bdof_10_16x16_neon: 1114.1 ( 8.08x)
apply_bdof_12_16x8_neon: 570.2 ( 7.87x)
apply_bdof_12_16x16_neon: 1116.3 ( 8.03x)
apply_bdof_8_16x8_neon: 541.4 ( 8.81x)
apply_bdof_8_16x16_neon: 1065.9 ( 8.97x)
apply_bdof_10_16x8_neon: 543.2 ( 8.32x)
apply_bdof_10_16x16_neon: 1071.5 ( 8.39x)
apply_bdof_12_16x8_neon: 544.2 ( 8.25x)
apply_bdof_12_16x16_neon: 1074.1 ( 8.37x)
diff --git a/libavcodec/aarch64/vvc/inter.S b/libavcodec/aarch64/vvc/inter.S
index 79ff720cdd..df6b59510d 100644
--- a/libavcodec/aarch64/vvc/inter.S
+++ b/libavcodec/aarch64/vvc/inter.S
@@ -803,28 +803,21 @@ function vvc_bdof_grad_filter_8x_neon, export=0
src1 .req x5
width .req w6
height .req w7
+ tbnz w6, #4, 16f
-1:
- mov x10, src0
- mov w11, width
- mov x12, gh0
- mov x13, gv0
- mov x14, src1
- mov x15, gh1
- mov x16, gv1
-2:
- ldur q0, [x10, #2]
- ldur q1, [x10, #-2]
- ldr q2, [x10, #(VVC_MAX_PB_SIZE << 1)]
- ldr q3, [x10, #-(VVC_MAX_PB_SIZE << 1)]
+8:
+ ldur q0, [src0, #2]
+ ldur q1, [src0, #-2]
+ ldr q2, [src0, #(VVC_MAX_PB_SIZE << 1)]
+ ldr q3, [src0, #-(VVC_MAX_PB_SIZE << 1)]
sshr v0.8h, v0.8h, #6
sshr v1.8h, v1.8h, #6
- ldur q4, [x14, #2]
- ldur q5, [x14, #-2]
+ ldur q4, [src1, #2]
+ ldur q5, [src1, #-2]
sshr v2.8h, v2.8h, #6
sshr v3.8h, v3.8h, #6
- ldr q6, [x14, #(VVC_MAX_PB_SIZE << 1)]
- ldr q7, [x14, #-(VVC_MAX_PB_SIZE << 1)]
+ ldr q6, [src1, #(VVC_MAX_PB_SIZE << 1)]
+ ldr q7, [src1, #-(VVC_MAX_PB_SIZE << 1)]
// results of gradient_h0
sub v0.8h, v0.8h, v1.8h
// results of gradient_v0
@@ -839,26 +832,20 @@ function vvc_bdof_grad_filter_8x_neon, export=0
// results of gradient_v1
sub v6.8h, v6.8h, v7.8h
- add x10, x10, #16
- add x14, x14, #16
-
// (gradient_h0 + gradient_h1) >> 1
shadd v1.8h, v0.8h, v4.8h
// gradient_h0 - gradient_h1
sub v5.8h, v0.8h, v4.8h
- subs w11, w11, #8
-
// (gradient_v0 + gradient_v1) >> 1
shadd v3.8h, v2.8h, v6.8h
// gradient_v0 - gradient_v1
sub v7.8h, v2.8h, v6.8h
- st1 {v1.8h}, [x12], #16
- st1 {v5.8h}, [x15], #16
- st1 {v3.8h}, [x13], #16
- st1 {v7.8h}, [x16], #16
- b.ne 2b
+ st1 {v1.8h}, [gh0]
+ st1 {v5.8h}, [gh1]
+ st1 {v3.8h}, [gv0]
+ st1 {v7.8h}, [gv1]
subs height, height, #1
add gh0, gh0, #(BDOF_BLOCK_SIZE << 1)
@@ -867,7 +854,84 @@ function vvc_bdof_grad_filter_8x_neon, export=0
add gh1, gh1, #(BDOF_BLOCK_SIZE << 1)
add gv1, gv1, #(BDOF_BLOCK_SIZE << 1)
add src1, src1, #(VVC_MAX_PB_SIZE << 1)
- b.ne 1b
+ b.ne 8b
+ ret
+
+16:
+ ldur q0, [src0, #2]
+ ldur q1, [src0, #18]
+ ldur q16, [src0, #-2]
+ sshr v0.8h, v0.8h, #6
+ ldur q17, [src0, #14]
+ sshr v1.8h, v1.8h, #6
+ ldp q18, q19, [src0, #-(VVC_MAX_PB_SIZE << 1)]
+ sshr v16.8h, v16.8h, #6
+ ldp q2, q3, [src0, #(VVC_MAX_PB_SIZE << 1)]!
+ ldur q20, [src1, #2]
+ sshr v17.8h, v17.8h, #6
+ ldur q21, [src1, #18]
+ sshr v2.8h, v2.8h, #6
+ ldur q22, [src1, #-2]
+ sshr v3.8h, v3.8h, #6
+ ldur q23, [src1, #14]
+ sshr v18.8h, v18.8h, #6
+ ldp q26, q27, [src1, #-(VVC_MAX_PB_SIZE << 1)]
+ sshr v19.8h, v19.8h, #6
+ ldp q24, q25, [src1, #(VVC_MAX_PB_SIZE << 1)]!
+
+ // results of gradient_h0
+ sub v0.8h, v0.8h, v16.8h
+ sub v1.8h, v1.8h, v17.8h
+
+ // results of gradient_v0
+ sub v2.8h, v2.8h, v18.8h
+ sub v3.8h, v3.8h, v19.8h
+
+ sshr v20.8h, v20.8h, #6
+ sshr v21.8h, v21.8h, #6
+ sshr v22.8h, v22.8h, #6
+ sshr v23.8h, v23.8h, #6
+
+ // results of gradient_h1
+ sub v20.8h, v20.8h, v22.8h
+ sub v21.8h, v21.8h, v23.8h
+
+ sshr v24.8h, v24.8h, #6
+ sshr v25.8h, v25.8h, #6
+
+ // gradient_h0 - gradient_h1
+ sub v22.8h, v0.8h, v20.8h
+ sub v23.8h, v1.8h, v21.8h
+
+ // (gradient_h0 + gradient_h1) >> 1
+ shadd v16.8h, v0.8h, v20.8h
+ shadd v17.8h, v1.8h, v21.8h
+
+ st1 {v22.8h, v23.8h}, [gh1], #32
+
+ sshr v26.8h, v26.8h, #6
+ sshr v27.8h, v27.8h, #6
+
+ st1 {v16.8h, v17.8h}, [gh0], #32
+
+ // results of gradient_v1
+ sub v24.8h, v24.8h, v26.8h
+ sub v25.8h, v25.8h, v27.8h
+
+ // (gradient_v0 + gradient_v1) >> 1
+ shadd v18.8h, v2.8h, v24.8h
+ shadd v19.8h, v3.8h, v25.8h
+
+ // gradient_v0 - gradient_v1
+ sub v26.8h, v2.8h, v24.8h
+ sub v27.8h, v3.8h, v25.8h
+
+ st1 {v18.8h,v19.8h}, [gv0], #32
+
+ subs height, height, #1
+ st1 {v26.8h,v27.8h}, [gv1], #32
+
+ b.ne 16b
ret
.unreq gh0
-----------------------------------------------------------------------
Summary of changes:
libavcodec/aarch64/vvc/dsp_init.c | 2 +
libavcodec/aarch64/vvc/inter.S | 176 ++++++++++++++++++++++++++++++++------
2 files changed, 150 insertions(+), 28 deletions(-)
hooks/post-receive
--
1
0
[ffmpeg] branch master updated. e5ac70042e avformat/aiff: add support for ADPCM N64 decoder
by ffmpeg-git@ffmpeg.org 23 Sep '25
by ffmpeg-git@ffmpeg.org 23 Sep '25
23 Sep '25
The branch, master has been updated
via e5ac70042e91d19110a04a52b7e6fa4703f61200 (commit)
via 00eef7433641a0af7741eee2b5f6b1c1870c2a15 (commit)
via 745cb6f8c7ffb957c598d12e83791c9f480a157e (commit)
via 97bfb606e33f7457ccf405f755ca01424a7aa0d1 (commit)
via e0638cee0aa1bdd94af0e0898f24afa5e5b54e14 (commit)
via 066432ebcf94a753d44be8b60b9dd725a14e704f (commit)
via 5d6c9a15eb147feb90140e90d04a9340bf8454e2 (commit)
via f6dfb20302ec56dd89bc0ef6fcd98f7e14db90bf (commit)
via a4f778890bbdc351d1abc5da2516fd2ee5e6ba85 (commit)
via 30fc5b1baaa0823f134768823ab6695211d0fe21 (commit)
via 58c0711fca17cb5231506c63f63a2aa5568a4997 (commit)
via 1943b31cdd179c3fc998430c40cde0e28257b692 (commit)
via 5fc9c79f53d799f76a8f69e5821ad0a5867512b0 (commit)
via 648b5d017d0478a0cd30f3753ab556b7721ff2b6 (commit)
via 424dbb03ae2870a1edc9c43890b174f27ffc0746 (commit)
via e95171fbffd8bafcab42f9a22e257dce733c5b97 (commit)
via b2e821310b9c78b866306ad2b01ce63c1481382a (commit)
from b1cbc7c8ff515159130bc4290ef6ab204e7101e8 (commit)
- Log -----------------------------------------------------------------
commit e5ac70042e91d19110a04a52b7e6fa4703f61200
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Mon Nov 25 13:30:45 2024 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avformat/aiff: add support for ADPCM N64 decoder
(cherry picked from commit 0fdf549a890f276243ba62f194e0ec08b10df60f)
Signed-off-by: Michael Niedermayer <michael(a)niedermayer.cc>
diff --git a/libavformat/aiff.c b/libavformat/aiff.c
index 907f7d8d28..3e94dad671 100644
--- a/libavformat/aiff.c
+++ b/libavformat/aiff.c
@@ -50,6 +50,7 @@ const AVCodecTag ff_codec_aiff_tags[] = {
{ AV_CODEC_ID_CBD2_DPCM, MKTAG('C','B','D','2') },
{ AV_CODEC_ID_SDX2_DPCM, MKTAG('S','D','X','2') },
{ AV_CODEC_ID_ADPCM_IMA_WS, MKTAG('A','D','P','4') },
+ { AV_CODEC_ID_ADPCM_N64, MKTAG('V','A','P','C') },
{ AV_CODEC_ID_NONE, 0 },
};
diff --git a/libavformat/aiffdec.c b/libavformat/aiffdec.c
index aeb00cccd0..d9d580bdb5 100644
--- a/libavformat/aiffdec.c
+++ b/libavformat/aiffdec.c
@@ -177,6 +177,9 @@ static int get_aiff_header(AVFormatContext *s, int64_t size,
case AV_CODEC_ID_G728:
par->block_align = 5;
break;
+ case AV_CODEC_ID_ADPCM_N64:
+ par->block_align = 9;
+ break;
default:
aiff->block_duration = 1;
break;
@@ -353,6 +356,31 @@ static int aiff_read_header(AVFormatContext *s)
goto got_sound;
break;
+ case MKTAG('A','P','P','L'):
+ if (size > 4) {
+ uint32_t chunk = avio_rl32(pb);
+
+ size -= 4;
+ if (chunk == MKTAG('s','t','o','c')) {
+ int len = avio_r8(pb);
+
+ size--;
+ if (len == 11 && size > 11) {
+ uint8_t chunk[11];
+
+ ret = avio_read(pb, chunk, 11);
+ if (ret > 0)
+ size -= ret;
+ if (!memcmp(chunk, "VADPCMCODES", sizeof(chunk))) {
+ if ((ret = ff_get_extradata(s, st->codecpar, pb, size)) < 0)
+ return ret;
+ size -= ret;
+ }
+ }
+ }
+ }
+ avio_skip(pb, size);
+ break;
case 0:
if (offset > 0 && st->codecpar->block_align) // COMM && SSND
goto got_sound;
commit 00eef7433641a0af7741eee2b5f6b1c1870c2a15
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Mon Nov 18 19:04:42 2024 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avformat/adxdec: add AHX support
(cherry picked from commit b40bb6ad1e5739dd7927f3be5c2a06fb8aeef0cb)
Signed-off-by: Michael Niedermayer <michael(a)niedermayer.cc>
diff --git a/libavformat/Makefile b/libavformat/Makefile
index 0171f1c480..19ed1d4374 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -92,7 +92,7 @@ OBJS-$(CONFIG_ADP_DEMUXER) += adp.o
OBJS-$(CONFIG_ADS_DEMUXER) += ads.o
OBJS-$(CONFIG_ADTS_MUXER) += adtsenc.o apetag.o img2.o \
id3v2enc.o
-OBJS-$(CONFIG_ADX_DEMUXER) += adxdec.o
+OBJS-$(CONFIG_ADX_DEMUXER) += adxdec.o rawdec.o
OBJS-$(CONFIG_ADX_MUXER) += rawenc.o
OBJS-$(CONFIG_AEA_DEMUXER) += aeadec.o pcm.o
OBJS-$(CONFIG_AEA_MUXER) += aeaenc.o rawenc.o
diff --git a/libavformat/adxdec.c b/libavformat/adxdec.c
index 0909884f19..00b652315f 100644
--- a/libavformat/adxdec.c
+++ b/libavformat/adxdec.c
@@ -27,11 +27,13 @@
#include "avformat.h"
#include "demux.h"
#include "internal.h"
+#include "rawdec.h"
#define BLOCK_SIZE 18
#define BLOCK_SAMPLES 32
typedef struct ADXDemuxerContext {
+ FFRawDemuxerContext rawctx;
int header_size;
} ADXDemuxerContext;
@@ -54,6 +56,9 @@ static int adx_read_packet(AVFormatContext *s, AVPacket *pkt)
AVCodecParameters *par = s->streams[0]->codecpar;
int ret, size;
+ if (par->codec_id == AV_CODEC_ID_AHX)
+ return ff_raw_read_partial_packet(s, pkt);
+
if (avio_feof(s->pb))
return AVERROR_EOF;
@@ -85,6 +90,7 @@ static int adx_read_header(AVFormatContext *s)
{
ADXDemuxerContext *c = s->priv_data;
AVCodecParameters *par;
+ FFStream *sti;
int ret;
int channels;
@@ -118,12 +124,25 @@ static int adx_read_header(AVFormatContext *s)
return AVERROR_INVALIDDATA;
}
+ sti = ffstream(st);
par->ch_layout.nb_channels = channels;
par->codec_type = AVMEDIA_TYPE_AUDIO;
- par->codec_id = AV_CODEC_ID_ADPCM_ADX;
- par->bit_rate = (int64_t)par->sample_rate * par->ch_layout.nb_channels * BLOCK_SIZE * 8LL / BLOCK_SAMPLES;
-
- avpriv_set_pts_info(st, 64, BLOCK_SAMPLES, par->sample_rate);
+ switch (par->extradata[4]) {
+ case 3:
+ sti->need_parsing = AVSTREAM_PARSE_FULL_RAW;
+ par->codec_id = AV_CODEC_ID_ADPCM_ADX;
+ par->bit_rate = (int64_t)par->sample_rate * par->ch_layout.nb_channels * BLOCK_SIZE * 8LL / BLOCK_SAMPLES;
+ avpriv_set_pts_info(st, 64, BLOCK_SAMPLES, par->sample_rate);
+ break;
+ case 16:
+ sti->need_parsing = AVSTREAM_PARSE_FULL_RAW;
+ par->codec_id = AV_CODEC_ID_AHX;
+ avpriv_set_pts_info(st, 64, 1, par->sample_rate);
+ break;
+ default:
+ av_log(s, AV_LOG_ERROR, "Unsupported format: %d\n", par->extradata[4]);
+ return AVERROR_INVALIDDATA;
+ }
return 0;
}
@@ -132,10 +151,10 @@ const FFInputFormat ff_adx_demuxer = {
.p.name = "adx",
.p.long_name = NULL_IF_CONFIG_SMALL("CRI ADX"),
.p.extensions = "adx",
+ .p.priv_class = &ff_raw_demuxer_class,
.p.flags = AVFMT_GENERIC_INDEX,
.read_probe = adx_probe,
.priv_data_size = sizeof(ADXDemuxerContext),
.read_header = adx_read_header,
.read_packet = adx_read_packet,
- .raw_codec_id = AV_CODEC_ID_ADPCM_ADX,
};
commit 745cb6f8c7ffb957c598d12e83791c9f480a157e
Author: Michael Niedermayer <michael(a)niedermayer.cc>
AuthorDate: Mon Aug 25 22:43:43 2025 +0200
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
configure: Put modules added from almpeg under --enable-gpl as suggested by several members of the GA
Signed-off-by: Michael Niedermayer <michael(a)niedermayer.cc>
diff --git a/configure b/configure
index 9d5a6ffc14..a7bb518d70 100755
--- a/configure
+++ b/configure
@@ -2967,9 +2967,18 @@ ac3_fixed_decoder_select="ac3_parser ac3dsp bswapdsp"
ac3_encoder_select="ac3dsp audiodsp me_cmp"
ac3_fixed_encoder_select="ac3dsp audiodsp me_cmp"
acelp_kelvin_decoder_select="audiodsp celp_math"
+adpcm_circus_decoder_deps="lgpl_gpl"
adpcm_g722_decoder_select="g722dsp"
adpcm_g722_encoder_select="g722dsp"
+adpcm_ima_escape_decoder_deps="lgpl_gpl"
+adpcm_ima_hvqm2_decoder_deps="lgpl_gpl"
+adpcm_ima_hvqm4_decoder_deps="lgpl_gpl"
+adpcm_ima_magix_decoder_deps="lgpl_gpl"
+adpcm_ima_pda_decoder_deps="lgpl_gpl"
+adpcm_n64_decoder_deps="lgpl_gpl"
+adpcm_psxc_decoder_deps="lgpl_gpl"
agm_decoder_select="idctdsp"
+ahx_decoder_deps="lgpl_gpl"
aic_decoder_select="golomb idctdsp"
alac_encoder_select="lpc"
als_decoder_select="bswapdsp mpeg4audio"
@@ -3552,6 +3561,7 @@ vvc_qsv_decoder_select="vvc_mp4toannexb_bsf qsvdec"
# parsers
aac_parser_select="adts_header mpeg4audio"
+ahx_parser_deps="lgpl_gpl"
apv_parser_select="cbs_apv"
av1_parser_select="cbs_av1"
evc_parser_select="evcparse"
@@ -3566,6 +3576,7 @@ vvc_parser_select="cbs_h266"
# bitstream_filters
aac_adtstoasc_bsf_select="adts_header mpeg4audio"
+ahx_to_mp2_bsf_deps="lgpl_gpl"
av1_frame_merge_bsf_select="cbs_av1"
av1_frame_split_bsf_select="cbs_av1"
av1_metadata_bsf_select="cbs_av1"
@@ -4633,6 +4644,7 @@ enabled gpl && map "die_license_disabled_gpl nonfree" $EXTERNAL_LIBRARY_NONFREE_
map "die_license_disabled nonfree" $HWACCEL_LIBRARY_NONFREE_LIST
enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
+enabled gpl && enable lgpl_gpl # Files that are marked as LGPL but some developers prefer only building them with --enable-gpl
if enabled nonfree; then
license="nonfree and unredistributable"
commit 97bfb606e33f7457ccf405f755ca01424a7aa0d1
Author: asivery <asivery(a)protonmail.com>
AuthorDate: Sat Jun 15 07:47:40 2024 +0200
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avformat/aeadec, avcodec/atrac1: Fix 8 and 4-channel ATRAC1 support
Signed-off-by: asivery <asivery(a)protonmail.com>
(cherry picked from commit 81cdf42222961c2959f1ede2d86fea0d1dcbbfcb)
diff --git a/libavcodec/atrac1.c b/libavcodec/atrac1.c
index f0bef9b9e6..b708c31897 100644
--- a/libavcodec/atrac1.c
+++ b/libavcodec/atrac1.c
@@ -49,7 +49,7 @@
#define AT1_SU_SAMPLES 512 ///< number of samples in a sound unit
#define AT1_FRAME_SIZE AT1_SU_SIZE * 2
#define AT1_SU_MAX_BITS AT1_SU_SIZE * 8
-#define AT1_MAX_CHANNELS 2
+#define AT1_MAX_CHANNELS 8
#define AT1_QMF_BANDS 3
#define IDX_LOW_BAND 0
@@ -339,7 +339,7 @@ static av_cold int atrac1_decode_init(AVCodecContext *avctx)
AVFloatDSPContext *fdsp;
int channels = avctx->ch_layout.nb_channels;
float scale = -1.0 / (1 << 15);
- int ret;
+ int ret, ch;
avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
@@ -380,10 +380,10 @@ static av_cold int atrac1_decode_init(AVCodecContext *avctx)
q->bands[2] = q->high;
/* Prepare the mdct overlap buffers */
- q->SUs[0].spectrum[0] = q->SUs[0].spec1;
- q->SUs[0].spectrum[1] = q->SUs[0].spec2;
- q->SUs[1].spectrum[0] = q->SUs[1].spec1;
- q->SUs[1].spectrum[1] = q->SUs[1].spec2;
+ for (ch = 0; ch < AT1_MAX_CHANNELS; ch++) {
+ q->SUs[ch].spectrum[0] = q->SUs[ch].spec1;
+ q->SUs[ch].spectrum[1] = q->SUs[ch].spec2;
+ }
return 0;
}
diff --git a/libavformat/aeadec.c b/libavformat/aeadec.c
index be18e7b725..0a3d09a89d 100644
--- a/libavformat/aeadec.c
+++ b/libavformat/aeadec.c
@@ -84,7 +84,7 @@ static int aea_read_header(AVFormatContext *s)
st->codecpar->sample_rate = 44100;
st->codecpar->bit_rate = 146000 * channels;
- if (channels != 1 && channels != 2) {
+ if (channels < 1 || channels > 8) {
av_log(s, AV_LOG_ERROR, "Channels %d not supported!\n", channels);
return AVERROR_INVALIDDATA;
}
commit e0638cee0aa1bdd94af0e0898f24afa5e5b54e14
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Mon Mar 17 21:01:16 2025 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec/adpcm: improve decooding output for 4-bit ADPCM IMA WAV
(cherry picked from commit f11422f1a6251e2b3c42b4044efbc722b863778d)
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 3c6b3601f2..72fbb841a4 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -1551,8 +1551,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
samples = &samples_p[i][1 + n * 8];
for (int m = 0; m < 8; m += 2) {
int v = bytestream2_get_byteu(&gb);
- samples[m ] = adpcm_ima_expand_nibble(cs, v & 0x0F, 3);
- samples[m + 1] = adpcm_ima_expand_nibble(cs, v >> 4 , 3);
+ samples[m ] = ff_adpcm_ima_qt_expand_nibble(cs, v & 0x0F);
+ samples[m + 1] = ff_adpcm_ima_qt_expand_nibble(cs, v >> 4);
}
}
}
diff --git a/tests/ref/acodec/adpcm-ima_wav b/tests/ref/acodec/adpcm-ima_wav
index 44ca53a565..b2cc518b1e 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
-78a2af1c895792d0c221d127bdd48ece *tests/data/fate/acodec-adpcm-ima_wav.out.wav
-stddev: 903.51 PSNR: 37.21 MAXDIFF:34026 bytes: 1058400/ 1061748
+a57d7b0ca564b5fed4bf78fc9f91d8e2 *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 29c28edddf..008d1e4b62 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
-26a9b280c14737b159c56e60181f1170 *tests/data/fate/acodec-adpcm-ima_wav-trellis.out.wav
-stddev: 710.03 PSNR: 39.30 MAXDIFF:25944 bytes: 1058400/ 1061748
+1af83218cde84bd7cd2297c04ef97f79 *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/fate/adpcm-ima_wav-stereo b/tests/ref/fate/adpcm-ima_wav-stereo
index cb6a481999..2a36800951 100644
--- a/tests/ref/fate/adpcm-ima_wav-stereo
+++ b/tests/ref/fate/adpcm-ima_wav-stereo
@@ -1 +1 @@
-1ee96f1efc09251a732621049dc5b66e
+b4697f4f64c12afb37acfebd5f7a756c
commit 066432ebcf94a753d44be8b60b9dd725a14e704f
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Sat Mar 8 19:40:46 2025 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec: add ADPCM IMA Escape audio decoder
(cherry picked from commit 4a663e78c4421da226e7d480d6767de803ee2122)
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 47898dd4ff..ceac4e1159 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -987,6 +987,7 @@ OBJS-$(CONFIG_ADPCM_IMA_DK3_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_DK4_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_EA_EACS_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_EA_SEAD_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_ESCAPE_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_HVQM2_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_HVQM4_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_ISS_DECODER) += adpcm.o adpcm_data.o
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 57966f8da7..3c6b3601f2 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -420,6 +420,29 @@ static inline int16_t adpcm_agm_expand_nibble(ADPCMChannelStatus *c, int8_t nibb
return pred;
}
+static inline int16_t adpcm_ima_escape_expand_nibble(ADPCMChannelStatus *c, int8_t nibble)
+{
+ int step_index;
+ int predictor;
+ int sign, delta, diff, step;
+
+ step = ff_adpcm_step_table[c->step_index];
+ step_index = c->step_index + ff_adpcm_index_table[(unsigned)nibble];
+ step_index = av_clip(step_index, 0, 88);
+
+ sign = nibble & 8;
+ delta = nibble & 7;
+ diff = (delta * step) >> 2;
+ predictor = c->predictor;
+ if (sign) predictor -= diff;
+ else predictor += diff;
+
+ c->predictor = av_clip_int16(predictor);
+ c->step_index = step_index;
+
+ return (int16_t)c->predictor;
+}
+
static inline int16_t adpcm_ima_expand_nibble(ADPCMChannelStatus *c, int8_t nibble, int shift)
{
int step_index;
@@ -1171,6 +1194,7 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
case AV_CODEC_ID_ADPCM_IMA_APC:
case AV_CODEC_ID_ADPCM_IMA_CUNNING:
case AV_CODEC_ID_ADPCM_IMA_EA_SEAD:
+ case AV_CODEC_ID_ADPCM_IMA_ESCAPE:
case AV_CODEC_ID_ADPCM_IMA_OKI:
case AV_CODEC_ID_ADPCM_IMA_WS:
case AV_CODEC_ID_ADPCM_YAMAHA:
@@ -2015,6 +2039,13 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
bytestream2_skip(&gb, bytes_remaining);
}
) /* End of CASE */
+ CASE(ADPCM_IMA_ESCAPE,
+ for (int n = nb_samples >> (1 - st); n > 0; n--) {
+ int byte = bytestream2_get_byteu(&gb);
+ *samples++ = adpcm_ima_escape_expand_nibble(&c->status[0], byte >> 4);
+ *samples++ = adpcm_ima_escape_expand_nibble(&c->status[st], byte & 0xF);
+ }
+ ) /* End of CASE */
CASE(ADPCM_IMA_EA_EACS,
for (int i = 0; i <= st; i++) {
c->status[i].step_index = bytestream2_get_le32u(&gb);
@@ -2958,6 +2989,7 @@ ADPCM_DECODER(ADPCM_IMA_DK3, sample_fmts_s16, adpcm_ima_dk3, "ADPCM IMA
ADPCM_DECODER(ADPCM_IMA_DK4, sample_fmts_s16, adpcm_ima_dk4, "ADPCM IMA Duck DK4")
ADPCM_DECODER(ADPCM_IMA_EA_EACS, sample_fmts_s16, adpcm_ima_ea_eacs, "ADPCM IMA Electronic Arts EACS")
ADPCM_DECODER(ADPCM_IMA_EA_SEAD, sample_fmts_s16, adpcm_ima_ea_sead, "ADPCM IMA Electronic Arts SEAD")
+ADPCM_DECODER(ADPCM_IMA_ESCAPE, sample_fmts_s16, adpcm_ima_escape, "ADPCM IMA Acorn Escape")
ADPCM_DECODER(ADPCM_IMA_HVQM2, sample_fmts_s16, adpcm_ima_hvqm2, "ADPCM IMA HVQM2")
ADPCM_DECODER(ADPCM_IMA_HVQM4, sample_fmts_s16, adpcm_ima_hvqm4, "ADPCM IMA HVQM4")
ADPCM_DECODER(ADPCM_IMA_ISS, sample_fmts_s16, adpcm_ima_iss, "ADPCM IMA Funcom ISS")
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 77a13d9b0c..ae48c414e8 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -678,6 +678,7 @@ extern const FFCodec ff_adpcm_ima_dk3_decoder;
extern const FFCodec ff_adpcm_ima_dk4_decoder;
extern const FFCodec ff_adpcm_ima_ea_eacs_decoder;
extern const FFCodec ff_adpcm_ima_ea_sead_decoder;
+extern const FFCodec ff_adpcm_ima_escape_decoder;
extern const FFCodec ff_adpcm_ima_hvqm2_decoder;
extern const FFCodec ff_adpcm_ima_hvqm4_decoder;
extern const FFCodec ff_adpcm_ima_iss_decoder;
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index 5a33de8d5c..c72271bfad 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -2683,6 +2683,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("ADPCM Circus"),
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
},
+ {
+ .id = AV_CODEC_ID_ADPCM_IMA_ESCAPE,
+ .type = AVMEDIA_TYPE_AUDIO,
+ .name = "adpcm_ima_escape",
+ .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Acorn Escape"),
+ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+ },
/* AMR */
{
diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h
index feb4d61708..8c98ac6335 100644
--- a/libavcodec/codec_id.h
+++ b/libavcodec/codec_id.h
@@ -434,6 +434,7 @@ enum AVCodecID {
AV_CODEC_ID_ADPCM_IMA_MAGIX,
AV_CODEC_ID_ADPCM_PSXC,
AV_CODEC_ID_ADPCM_CIRCUS,
+ AV_CODEC_ID_ADPCM_IMA_ESCAPE,
/* AMR */
AV_CODEC_ID_AMR_NB = 0x12000,
diff --git a/libavformat/rpl.c b/libavformat/rpl.c
index b30d769efb..781dabf7ba 100644
--- a/libavformat/rpl.c
+++ b/libavformat/rpl.c
@@ -250,7 +250,7 @@ static int rpl_read_header(AVFormatContext *s)
// are all unsigned.
ast->codecpar->codec_id = AV_CODEC_ID_PCM_U8;
} else if (ast->codecpar->bits_per_coded_sample == 4) {
- ast->codecpar->codec_id = AV_CODEC_ID_ADPCM_IMA_EA_SEAD;
+ ast->codecpar->codec_id = AV_CODEC_ID_ADPCM_IMA_ESCAPE;
}
break;
}
commit 5d6c9a15eb147feb90140e90d04a9340bf8454e2
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Fri Feb 28 16:05:05 2025 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec: add ADPCM Circus decoder
(cherry picked from commit cdd3d794c7e01e4d6f485e7b975a4b9107d3f2fd)
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index dffa2e534d..47898dd4ff 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -958,6 +958,7 @@ OBJS-$(CONFIG_ADPCM_AGM_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_AICA_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_ARGO_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_ARGO_ENCODER) += adpcm.o adpcm_data.o adpcmenc.o
+OBJS-$(CONFIG_ADPCM_CIRCUS_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_CT_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_DTK_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_EA_DECODER) += adpcm.o adpcm_data.o
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 328d739c8a..57966f8da7 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -740,6 +740,27 @@ static inline int16_t adpcm_mtaf_expand_nibble(ADPCMChannelStatus *c, uint8_t ni
return c->predictor;
}
+static inline int16_t adpcm_circus_expand_nibble(ADPCMChannelStatus *c, uint8_t nibble)
+{
+ int32_t sample = c->predictor;
+ int32_t scale = c->step;
+ int32_t code = sign_extend(nibble, 8);
+
+ sample += code * (1 << scale);
+ if (code == 0) {
+ scale--;
+ } else if (code == 127 || code == -128) {
+ scale++;
+ }
+ scale = av_clip(scale, 0, 8);
+ sample = av_clip_int16(sample);
+
+ c->predictor = sample;
+ c->step = scale;
+
+ return sample;
+}
+
static inline int16_t adpcm_zork_expand_nibble(ADPCMChannelStatus *c, uint8_t nibble)
{
int16_t index = c->step_index;
@@ -1365,6 +1386,7 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
case AV_CODEC_ID_ADPCM_ARGO:
nb_samples = buf_size / avctx->block_align * 32;
break;
+ case AV_CODEC_ID_ADPCM_CIRCUS:
case AV_CODEC_ID_ADPCM_ZORK:
nb_samples = buf_size / ch;
break;
@@ -2796,6 +2818,14 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
}
) /* End of CASE */
+ CASE(ADPCM_CIRCUS,
+ for (int n = 0; n < nb_samples; n++) {
+ for (int ch = 0; ch < channels; ch++) {
+ int v = bytestream2_get_byteu(&gb);
+ *samples++ = adpcm_circus_expand_nibble(&c->status[ch], v);
+ }
+ }
+ ) /* End of CASE */
CASE(ADPCM_ZORK,
for (int n = 0; n < nb_samples * channels; n++) {
int v = bytestream2_get_byteu(&gb);
@@ -2909,6 +2939,7 @@ ADPCM_DECODER(ADPCM_AFC, sample_fmts_s16p, adpcm_afc, "ADPCM Nin
ADPCM_DECODER(ADPCM_AGM, sample_fmts_s16, adpcm_agm, "ADPCM AmuseGraphics Movie")
ADPCM_DECODER(ADPCM_AICA, sample_fmts_s16p, adpcm_aica, "ADPCM Yamaha AICA")
ADPCM_DECODER(ADPCM_ARGO, sample_fmts_s16p, adpcm_argo, "ADPCM Argonaut Games")
+ADPCM_DECODER(ADPCM_CIRCUS, sample_fmts_s16, adpcm_circus, "ADPCM Circus")
ADPCM_DECODER(ADPCM_CT, sample_fmts_s16, adpcm_ct, "ADPCM Creative Technology")
ADPCM_DECODER(ADPCM_DTK, sample_fmts_s16p, adpcm_dtk, "ADPCM Nintendo Gamecube DTK")
ADPCM_DECODER(ADPCM_EA, sample_fmts_s16, adpcm_ea, "ADPCM Electronic Arts")
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 67e02ef7bb..77a13d9b0c 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -649,6 +649,7 @@ extern const FFCodec ff_adpcm_agm_decoder;
extern const FFCodec ff_adpcm_aica_decoder;
extern const FFCodec ff_adpcm_argo_decoder;
extern const FFCodec ff_adpcm_argo_encoder;
+extern const FFCodec ff_adpcm_circus_decoder;
extern const FFCodec ff_adpcm_ct_decoder;
extern const FFCodec ff_adpcm_dtk_decoder;
extern const FFCodec ff_adpcm_ea_decoder;
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index b489cf190b..5a33de8d5c 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -2676,6 +2676,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("ADPCM Playstation C"),
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
},
+ {
+ .id = AV_CODEC_ID_ADPCM_CIRCUS,
+ .type = AVMEDIA_TYPE_AUDIO,
+ .name = "adpcm_circus",
+ .long_name = NULL_IF_CONFIG_SMALL("ADPCM Circus"),
+ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+ },
/* AMR */
{
diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h
index 975ebbe880..feb4d61708 100644
--- a/libavcodec/codec_id.h
+++ b/libavcodec/codec_id.h
@@ -433,6 +433,7 @@ enum AVCodecID {
AV_CODEC_ID_ADPCM_IMA_HVQM2,
AV_CODEC_ID_ADPCM_IMA_MAGIX,
AV_CODEC_ID_ADPCM_PSXC,
+ AV_CODEC_ID_ADPCM_CIRCUS,
/* AMR */
AV_CODEC_ID_AMR_NB = 0x12000,
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index b65e10827e..d89e886a08 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -488,6 +488,7 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id)
case AV_CODEC_ID_CBD2_DPCM:
case AV_CODEC_ID_DERF_DPCM:
case AV_CODEC_ID_WADY_DPCM:
+ case AV_CODEC_ID_ADPCM_CIRCUS:
return 8;
case AV_CODEC_ID_PCM_S16BE:
case AV_CODEC_ID_PCM_S16BE_PLANAR:
commit f6dfb20302ec56dd89bc0ef6fcd98f7e14db90bf
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Mon Feb 24 12:19:03 2025 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec: add ADPCM PSXC audio decoder
(cherry picked from commit a4055b5cc6d77c26867948e24de6bdfd5c0e6a3b)
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 485be1a0f2..dffa2e534d 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -1010,6 +1010,7 @@ OBJS-$(CONFIG_ADPCM_MS_ENCODER) += adpcmenc.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_MTAF_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_N64_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_PSX_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_PSXC_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_SANYO_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_SBPRO_2_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_SBPRO_3_DECODER) += adpcm.o adpcm_data.o
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index e4af793345..328d739c8a 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -292,6 +292,11 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx)
avctx->block_align % (16 * avctx->ch_layout.nb_channels))
return AVERROR_INVALIDDATA;
break;
+ case AV_CODEC_ID_ADPCM_PSXC:
+ max_channels = 8;
+ if (avctx->ch_layout.nb_channels <= 0)
+ return AVERROR_INVALIDDATA;
+ break;
case AV_CODEC_ID_ADPCM_IMA_DAT4:
case AV_CODEC_ID_ADPCM_THP:
case AV_CODEC_ID_ADPCM_THP_LE:
@@ -349,6 +354,7 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx)
case AV_CODEC_ID_ADPCM_AFC:
case AV_CODEC_ID_ADPCM_DTK:
case AV_CODEC_ID_ADPCM_PSX:
+ case AV_CODEC_ID_ADPCM_PSXC:
case AV_CODEC_ID_ADPCM_SANYO:
case AV_CODEC_ID_ADPCM_MTAF:
case AV_CODEC_ID_ADPCM_ARGO:
@@ -1353,6 +1359,9 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
case AV_CODEC_ID_ADPCM_PSX:
nb_samples = buf_size / (16 * ch) * 28;
break;
+ case AV_CODEC_ID_ADPCM_PSXC:
+ nb_samples = ((buf_size - 1) / ch) * 2;
+ break;
case AV_CODEC_ID_ADPCM_ARGO:
nb_samples = buf_size / avctx->block_align * 32;
break;
@@ -2693,6 +2702,40 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
}
) /* End of CASE */
+ CASE(ADPCM_PSXC,
+ for (int block = 0; block < avpkt->size / avctx->block_align; block++) {
+ int nb_samples_per_block = ((avctx->block_align - 1) / channels) * 2;
+ for (int channel = 0; channel < channels; channel++) {
+ int filter, shift, byte;
+
+ samples = samples_p[channel] + block * nb_samples_per_block;
+ av_assert0((block + 1) * nb_samples_per_block <= nb_samples);
+
+ filter = bytestream2_get_byteu(&gb);
+ shift = filter & 0xf;
+ filter = filter >> 4;
+ if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table))
+ return AVERROR_INVALIDDATA;
+
+ for (int n = 0; n < nb_samples_per_block; n++) {
+ int sample = 0, scale;
+
+ if (n & 1) {
+ scale = sign_extend(byte >> 4, 4);
+ } else {
+ byte = bytestream2_get_byteu(&gb);
+ scale = sign_extend(byte & 0xF, 4);
+ }
+
+ scale = scale * (1 << 12);
+ sample = (int)((scale >> shift) + (c->status[channel].sample1 * xa_adpcm_table[filter][0] + c->status[channel].sample2 * xa_adpcm_table[filter][1]) / 64);
+ *samples++ = av_clip_int16(sample);
+ c->status[channel].sample2 = c->status[channel].sample1;
+ c->status[channel].sample1 = sample;
+ }
+ }
+ }
+ ) /* End of CASE */
CASE(ADPCM_SANYO,
int (*expand)(ADPCMChannelStatus *c, int bits);
GetBitContext g;
@@ -2904,6 +2947,7 @@ ADPCM_DECODER(ADPCM_MS, sample_fmts_both, adpcm_ms, "ADPCM Mic
ADPCM_DECODER(ADPCM_MTAF, sample_fmts_s16p, adpcm_mtaf, "ADPCM MTAF")
ADPCM_DECODER(ADPCM_N64, sample_fmts_s16p, adpcm_n64, "ADPCM Silicon Graphics N64")
ADPCM_DECODER(ADPCM_PSX, sample_fmts_s16p, adpcm_psx, "ADPCM Playstation")
+ADPCM_DECODER(ADPCM_PSXC, sample_fmts_s16p, adpcm_psxc, "ADPCM Playstation C")
ADPCM_DECODER(ADPCM_SANYO, sample_fmts_s16p, adpcm_sanyo, "ADPCM Sanyo")
ADPCM_DECODER(ADPCM_SBPRO_2, sample_fmts_s16, adpcm_sbpro_2, "ADPCM Sound Blaster Pro 2-bit")
ADPCM_DECODER(ADPCM_SBPRO_3, sample_fmts_s16, adpcm_sbpro_3, "ADPCM Sound Blaster Pro 2.6-bit")
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 9064e470d3..67e02ef7bb 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -701,6 +701,7 @@ extern const FFCodec ff_adpcm_ms_decoder;
extern const FFCodec ff_adpcm_mtaf_decoder;
extern const FFCodec ff_adpcm_n64_decoder;
extern const FFCodec ff_adpcm_psx_decoder;
+extern const FFCodec ff_adpcm_psxc_decoder;
extern const FFCodec ff_adpcm_sanyo_decoder;
extern const FFCodec ff_adpcm_sbpro_2_decoder;
extern const FFCodec ff_adpcm_sbpro_3_decoder;
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index f6aa863c4a..b489cf190b 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -2669,6 +2669,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Magix"),
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
},
+ {
+ .id = AV_CODEC_ID_ADPCM_PSXC,
+ .type = AVMEDIA_TYPE_AUDIO,
+ .name = "adpcm_psxc",
+ .long_name = NULL_IF_CONFIG_SMALL("ADPCM Playstation C"),
+ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+ },
/* AMR */
{
diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h
index c69e81582a..975ebbe880 100644
--- a/libavcodec/codec_id.h
+++ b/libavcodec/codec_id.h
@@ -432,6 +432,7 @@ enum AVCodecID {
AV_CODEC_ID_ADPCM_N64,
AV_CODEC_ID_ADPCM_IMA_HVQM2,
AV_CODEC_ID_ADPCM_IMA_MAGIX,
+ AV_CODEC_ID_ADPCM_PSXC,
/* AMR */
AV_CODEC_ID_AMR_NB = 0x12000,
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 039315a2ce..b65e10827e 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -677,6 +677,11 @@ static int get_audio_frame_duration(enum AVCodecID id, int sr, int ch, int ba,
if (frame_bytes > INT_MAX / 28)
return 0;
return frame_bytes * 28;
+ case AV_CODEC_ID_ADPCM_PSXC:
+ frame_bytes = (frame_bytes - 1) / ch;
+ if (frame_bytes > INT_MAX / 2)
+ return 0;
+ return frame_bytes * 2;
case AV_CODEC_ID_ADPCM_4XM:
case AV_CODEC_ID_ADPCM_IMA_ACORN:
case AV_CODEC_ID_ADPCM_IMA_DAT4:
commit a4f778890bbdc351d1abc5da2516fd2ee5e6ba85
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Wed Feb 19 20:24:39 2025 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec/adpcm: fix non-4bit adpcm ima wav decoding
(cherry picked from commit f4e05abeded46515bd7b4248fc7d65df82d9af2a)
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 9f7070b701..e4af793345 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -511,7 +511,9 @@ static inline int16_t adpcm_ima_wav_expand_nibble(ADPCMChannelStatus *c, GetBitC
sign = nibble & (1 << shift);
delta = av_zero_extend(nibble, shift);
- diff = ((2 * delta + 1) * step) >> shift;
+ diff = step >> shift;
+ for (int i = 0; i < shift; i++)
+ diff += (step >> (shift-1-i)) * !!(delta & (1 << i));
predictor = c->predictor;
if (sign) predictor -= diff;
else predictor += diff;
commit 30fc5b1baaa0823f134768823ab6695211d0fe21
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Tue Jan 21 17:29:45 2025 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec: add ADPCM IMA Magix decoder
(cherry picked from commit 2ec3ad2122484ce2c84f6ba055c5ebc1661c5b14)
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 5963d0f73e..485be1a0f2 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -989,6 +989,7 @@ OBJS-$(CONFIG_ADPCM_IMA_EA_SEAD_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_HVQM2_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_HVQM4_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_ISS_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_MAGIX_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_MOFLEX_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_MTF_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_PDA_DECODER) += adpcm.o adpcm_data.o
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index b78b86d905..9f7070b701 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -1163,6 +1163,7 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
case AV_CODEC_ID_ADPCM_AGM:
case AV_CODEC_ID_ADPCM_IMA_ACORN:
case AV_CODEC_ID_ADPCM_IMA_DAT4:
+ case AV_CODEC_ID_ADPCM_IMA_MAGIX:
case AV_CODEC_ID_ADPCM_IMA_MOFLEX:
case AV_CODEC_ID_ADPCM_IMA_ISS: header_size = 4 * ch; break;
case AV_CODEC_ID_ADPCM_IMA_SMJPEG: header_size = 4 * ch; break;
@@ -1726,6 +1727,28 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
if ((bytestream2_tell(&gb) & 1))
bytestream2_skip(&gb, 1);
) /* End of CASE */
+ CASE(ADPCM_IMA_MAGIX,
+ for (int channel = 0; channel < channels; channel++) {
+ ADPCMChannelStatus *cs = &c->status[channel];
+ cs->predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
+ cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
+ if (cs->step_index > 88u){
+ av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
+ channel, cs->step_index);
+ return AVERROR_INVALIDDATA;
+ }
+ }
+
+ for (int m = 0; m < avctx->block_align-8; m += 8) {
+ uint32_t v0 = bytestream2_get_le32u(&gb);
+ uint32_t v1 = bytestream2_get_le32u(&gb);
+
+ for (int n = 8; n > 0; n--, v0 >>= 4, v1 >>= 4, samples += 2) {
+ samples[0] = adpcm_ima_expand_nibble(&c->status[0], v0 & 15, 3);
+ samples[1] = adpcm_ima_expand_nibble(&c->status[1], v1 & 15, 3);
+ }
+ }
+ ) /* End of CASE */
CASE(ADPCM_IMA_ISS,
for (int channel = 0; channel < channels; channel++) {
ADPCMChannelStatus *cs = &c->status[channel];
@@ -2862,6 +2885,7 @@ ADPCM_DECODER(ADPCM_IMA_EA_SEAD, sample_fmts_s16, adpcm_ima_ea_sead, "ADPCM IMA
ADPCM_DECODER(ADPCM_IMA_HVQM2, sample_fmts_s16, adpcm_ima_hvqm2, "ADPCM IMA HVQM2")
ADPCM_DECODER(ADPCM_IMA_HVQM4, sample_fmts_s16, adpcm_ima_hvqm4, "ADPCM IMA HVQM4")
ADPCM_DECODER(ADPCM_IMA_ISS, sample_fmts_s16, adpcm_ima_iss, "ADPCM IMA Funcom ISS")
+ADPCM_DECODER(ADPCM_IMA_MAGIX, sample_fmts_s16, adpcm_ima_magix, "ADPCM IMA Magix")
ADPCM_DECODER(ADPCM_IMA_MOFLEX, sample_fmts_s16p, adpcm_ima_moflex, "ADPCM IMA MobiClip MOFLEX")
ADPCM_DECODER(ADPCM_IMA_MTF, sample_fmts_s16, adpcm_ima_mtf, "ADPCM IMA Capcom's MT Framework")
ADPCM_DECODER(ADPCM_IMA_OKI, sample_fmts_s16, adpcm_ima_oki, "ADPCM IMA Dialogic OKI")
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 5891c04211..9064e470d3 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -680,6 +680,7 @@ extern const FFCodec ff_adpcm_ima_ea_sead_decoder;
extern const FFCodec ff_adpcm_ima_hvqm2_decoder;
extern const FFCodec ff_adpcm_ima_hvqm4_decoder;
extern const FFCodec ff_adpcm_ima_iss_decoder;
+extern const FFCodec ff_adpcm_ima_magix_decoder;
extern const FFCodec ff_adpcm_ima_moflex_decoder;
extern const FFCodec ff_adpcm_ima_mtf_decoder;
extern const FFCodec ff_adpcm_ima_oki_decoder;
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index b3d0a2b601..f6aa863c4a 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -2662,6 +2662,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA HVQM2"),
.props = AV_CODEC_PROP_LOSSY,
},
+ {
+ .id = AV_CODEC_ID_ADPCM_IMA_MAGIX,
+ .type = AVMEDIA_TYPE_AUDIO,
+ .name = "adpcm_ima_magix",
+ .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Magix"),
+ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+ },
/* AMR */
{
diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h
index cc22f24ba9..c69e81582a 100644
--- a/libavcodec/codec_id.h
+++ b/libavcodec/codec_id.h
@@ -431,6 +431,7 @@ enum AVCodecID {
AV_CODEC_ID_ADPCM_IMA_PDA,
AV_CODEC_ID_ADPCM_N64,
AV_CODEC_ID_ADPCM_IMA_HVQM2,
+ AV_CODEC_ID_ADPCM_IMA_MAGIX,
/* AMR */
AV_CODEC_ID_AMR_NB = 0x12000,
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index c5230e646a..039315a2ce 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -465,6 +465,7 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id)
case AV_CODEC_ID_ADPCM_IMA_APC:
case AV_CODEC_ID_ADPCM_IMA_APM:
case AV_CODEC_ID_ADPCM_IMA_EA_SEAD:
+ case AV_CODEC_ID_ADPCM_IMA_MAGIX:
case AV_CODEC_ID_ADPCM_IMA_OKI:
case AV_CODEC_ID_ADPCM_IMA_WS:
case AV_CODEC_ID_ADPCM_IMA_SSI:
commit 58c0711fca17cb5231506c63f63a2aa5568a4997
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Mon Nov 25 19:06:53 2024 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec: add ADPCM IMA HVQM2 decoder
(cherry picked from commit 480e36592d5fc27a47e378d62570824613f26b7b)
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 2a32cd4072..5963d0f73e 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -986,7 +986,8 @@ OBJS-$(CONFIG_ADPCM_IMA_DK3_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_DK4_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_EA_EACS_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_EA_SEAD_DECODER) += adpcm.o adpcm_data.o
-OBJS-$(CONFIG_ADPCM_IMA_HVMQ4_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_HVQM2_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_HVQM4_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_ISS_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_MOFLEX_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_MTF_DECODER) += adpcm.o adpcm_data.o
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 83dff65ef2..b78b86d905 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -548,6 +548,43 @@ int16_t ff_adpcm_ima_qt_expand_nibble(ADPCMChannelStatus *c, int nibble)
return c->predictor;
}
+static void decode_adpcm_ima_hvqm2(AVCodecContext *avctx, int16_t *outbuf, int samples_to_do,
+ int frame_format, GetByteContext *gb)
+{
+ ADPCMDecodeContext *c = avctx->priv_data;
+ int st = avctx->ch_layout.nb_channels == 2;
+ uint8_t nibble;
+
+ for (int ch = 0; ch < avctx->ch_layout.nb_channels; ch++) {
+ unsigned tmp;
+
+ switch (frame_format) {
+ case 0: /* combined hist+index */
+ tmp = bytestream2_get_be16(gb);
+ c->status[ch].predictor = sign_extend(tmp & 0xFF80, 16);
+ c->status[ch].step_index = tmp & 0x7f;
+ *outbuf++ = c->status[ch].predictor;
+ samples_to_do--;
+ break;
+ default:
+ break;
+ }
+
+ c->status[ch].step_index = av_clip(c->status[ch].step_index, 0, 88);
+ }
+
+ for (int i = 0; i < samples_to_do; i++) {
+ if (!(i&1)) {
+ nibble = bytestream2_get_byte(gb);
+ *outbuf++ = ff_adpcm_ima_qt_expand_nibble(&c->status[st], nibble >> 4);
+ } else {
+ *outbuf++ = ff_adpcm_ima_qt_expand_nibble(&c->status[ 0], nibble & 0xF);
+ }
+ }
+
+ bytestream2_seek(gb, 0, SEEK_END);
+}
+
static void decode_adpcm_ima_hvqm4(AVCodecContext *avctx, int16_t *outbuf, int samples_to_do,
int frame_format, GetByteContext *gb)
{
@@ -1150,6 +1187,9 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
*coded_samples -= *coded_samples % 28;
nb_samples = (buf_size - 12) / (ch == 2 ? 30 : 15) * 28;
break;
+ case AV_CODEC_ID_ADPCM_IMA_HVQM2:
+ nb_samples = ((bytestream2_peek_be64(gb) >> 16) & 0xFFFF);
+ break;
case AV_CODEC_ID_ADPCM_IMA_HVQM4:
{
int frame_format = bytestream2_get_be16(gb);
@@ -1755,6 +1795,12 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
*samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
}
) /* End of CASE */
+ CASE(ADPCM_IMA_HVQM2,
+ int format = bytestream2_get_be16(&gb);
+
+ bytestream2_skip(&gb, 4);
+ decode_adpcm_ima_hvqm2(avctx, samples, nb_samples, format, &gb);
+ ) /* End of CASE */
CASE(ADPCM_IMA_HVQM4,
int format = bytestream2_get_be16(&gb);
@@ -2813,6 +2859,7 @@ ADPCM_DECODER(ADPCM_IMA_DK3, sample_fmts_s16, adpcm_ima_dk3, "ADPCM IMA
ADPCM_DECODER(ADPCM_IMA_DK4, sample_fmts_s16, adpcm_ima_dk4, "ADPCM IMA Duck DK4")
ADPCM_DECODER(ADPCM_IMA_EA_EACS, sample_fmts_s16, adpcm_ima_ea_eacs, "ADPCM IMA Electronic Arts EACS")
ADPCM_DECODER(ADPCM_IMA_EA_SEAD, sample_fmts_s16, adpcm_ima_ea_sead, "ADPCM IMA Electronic Arts SEAD")
+ADPCM_DECODER(ADPCM_IMA_HVQM2, sample_fmts_s16, adpcm_ima_hvqm2, "ADPCM IMA HVQM2")
ADPCM_DECODER(ADPCM_IMA_HVQM4, sample_fmts_s16, adpcm_ima_hvqm4, "ADPCM IMA HVQM4")
ADPCM_DECODER(ADPCM_IMA_ISS, sample_fmts_s16, adpcm_ima_iss, "ADPCM IMA Funcom ISS")
ADPCM_DECODER(ADPCM_IMA_MOFLEX, sample_fmts_s16p, adpcm_ima_moflex, "ADPCM IMA MobiClip MOFLEX")
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index f3a252e241..5891c04211 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -677,6 +677,7 @@ extern const FFCodec ff_adpcm_ima_dk3_decoder;
extern const FFCodec ff_adpcm_ima_dk4_decoder;
extern const FFCodec ff_adpcm_ima_ea_eacs_decoder;
extern const FFCodec ff_adpcm_ima_ea_sead_decoder;
+extern const FFCodec ff_adpcm_ima_hvqm2_decoder;
extern const FFCodec ff_adpcm_ima_hvqm4_decoder;
extern const FFCodec ff_adpcm_ima_iss_decoder;
extern const FFCodec ff_adpcm_ima_moflex_decoder;
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index 1cc66597ba..b3d0a2b601 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -2655,6 +2655,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("ADPCM Silicon Graphics N64"),
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
},
+ {
+ .id = AV_CODEC_ID_ADPCM_IMA_HVQM2,
+ .type = AVMEDIA_TYPE_AUDIO,
+ .name = "adpcm_ima_hvqm2",
+ .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA HVQM2"),
+ .props = AV_CODEC_PROP_LOSSY,
+ },
/* AMR */
{
diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h
index 8930b2957e..cc22f24ba9 100644
--- a/libavcodec/codec_id.h
+++ b/libavcodec/codec_id.h
@@ -430,6 +430,7 @@ enum AVCodecID {
AV_CODEC_ID_ADPCM_IMA_HVQM4,
AV_CODEC_ID_ADPCM_IMA_PDA,
AV_CODEC_ID_ADPCM_N64,
+ AV_CODEC_ID_ADPCM_IMA_HVQM2,
/* AMR */
AV_CODEC_ID_AMR_NB = 0x12000,
commit 1943b31cdd179c3fc998430c40cde0e28257b692
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Mon Nov 25 19:34:44 2024 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec/adpcm: fix overflow in mono ADPCM IMA HVQM4
(cherry picked from commit 6a9b0f7272a0725abbe6f887f766fb5f1f119a66)
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index f58661c98e..83dff65ef2 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -581,7 +581,7 @@ static void decode_adpcm_ima_hvqm4(AVCodecContext *avctx, int16_t *outbuf, int s
samples_to_do--;
}
- for (int i = 0; i < samples_to_do; i++) {
+ for (int i = 0; i < samples_to_do; i += 1+(!st)) {
uint8_t nibble = bytestream2_get_byte(gb);
*outbuf++ = ff_adpcm_ima_qt_expand_nibble(&c->status[st], nibble & 0xF);
commit 5fc9c79f53d799f76a8f69e5821ad0a5867512b0
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Mon Nov 25 13:01:16 2024 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec: add ADPCM Silicon Graphics N64 decoder
(cherry picked from commit 13484237fdf19c9d927b8a64b81d00100a4178c3)
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index d4643f06d3..2a32cd4072 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -1006,6 +1006,7 @@ OBJS-$(CONFIG_ADPCM_IMA_XBOX_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_MS_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_MS_ENCODER) += adpcmenc.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_MTAF_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_N64_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_PSX_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_SANYO_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_SBPRO_2_DECODER) += adpcm.o adpcm_data.o
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 24dc001180..f58661c98e 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -261,6 +261,7 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx)
switch(avctx->codec->id) {
case AV_CODEC_ID_ADPCM_IMA_AMV:
+ case AV_CODEC_ID_ADPCM_N64:
max_channels = 1;
break;
case AV_CODEC_ID_ADPCM_SANYO:
@@ -352,6 +353,7 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx)
case AV_CODEC_ID_ADPCM_MTAF:
case AV_CODEC_ID_ADPCM_ARGO:
case AV_CODEC_ID_ADPCM_IMA_MOFLEX:
+ case AV_CODEC_ID_ADPCM_N64:
avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
break;
case AV_CODEC_ID_ADPCM_IMA_WS:
@@ -1095,6 +1097,9 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
return 0;
nb_samples = 64;
break;
+ case AV_CODEC_ID_ADPCM_N64:
+ nb_samples = (buf_size / 9) * 16;
+ break;
/* simple 4-bit adpcm */
case AV_CODEC_ID_ADPCM_CT:
case AV_CODEC_ID_ADPCM_IMA_APC:
@@ -2493,6 +2498,89 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
bytestream2_seek(&gb, 0, SEEK_SET);
}
) /* End of CASE */
+ CASE(ADPCM_N64,
+ ADPCMChannelStatus *cs = &c->status[0];
+ int coefs[8*2*8] = { 0 };
+
+ if (avctx->extradata) {
+ int version, order, entries;
+ GetByteContext cb;
+
+ bytestream2_init(&cb, avctx->extradata, avctx->extradata_size);
+
+ version = bytestream2_get_be16(&cb);
+ order = bytestream2_get_be16(&cb);
+ entries = bytestream2_get_be16(&cb);
+ if (version != 1 || order != 2 || entries > 8)
+ return AVERROR_INVALIDDATA;
+
+ for (int n = 0; n < order * entries * 8; n++)
+ coefs[n] = sign_extend(bytestream2_get_be16(&cb), 16);
+ }
+
+ for (int block = 0; block < avpkt->size / 9; block++) {
+ int scale, index, codes[16];
+ int16_t hist[8] = { 0 };
+ const int order = 2;
+ int16_t out[16];
+
+ hist[6] = cs->sample2;
+ hist[7] = cs->sample1;
+
+ samples = samples_p[0] + block * 16;
+
+ scale = (buf[0] >> 4) & 0xF;
+ index = (buf[0] >> 0) & 0xF;
+ scale = 1 << scale;
+ index = FFMIN(index, 8);
+
+ for (int i = 0, j = 0; i < 16; i += 2, j++) {
+ int n0 = (buf[j+1] >> 4) & 0xF;
+ int n1 = (buf[j+1] >> 0) & 0xF;
+
+ if (n0 & 8)
+ n0 = n0 - 16;
+ if (n1 & 8)
+ n1 = n1 - 16;
+
+ codes[i+0] = n0 * scale;
+ codes[i+1] = n1 * scale;
+ }
+
+ for (int j = 0; j < 2; j++) {
+ int *sf_codes = &codes[j*8];
+ int16_t *sf_out = &out[j*8];
+
+ for (int i = 0; i < 8; i++) {
+ int sample, delta = 0;
+
+ for (int o = 0; o < order; o++)
+ delta += coefs[o*8 + i] * hist[(8 - order) + o];
+
+ for (int k = i-1; k > -1; k--) {
+ for (int o = 1; o < order; o++)
+ delta += sf_codes[(i-1) - k] * coefs[(o*8) + k];
+ }
+
+ sample = sf_codes[i] * 2048;
+ sample = (sample + delta) / 2048;
+ sample = av_clip_int16(sample);
+ sf_out[i] = sample;
+ }
+
+ for (int i = 8 - order; i < 8; i++)
+ hist[i] = sf_out[i];
+ }
+
+ memcpy(samples, out, sizeof(out));
+
+ cs->sample2 = hist[6];
+ cs->sample1 = hist[7];
+
+ buf += 9;
+ }
+ bytestream2_seek(&gb, 0, SEEK_END);
+ ) /* End of CASE */
CASE(ADPCM_PSX,
for (int block = 0; block < avpkt->size / FFMAX(avctx->block_align, 16 * channels); block++) {
int nb_samples_per_block = 28 * FFMAX(avctx->block_align, 16 * channels) / (16 * channels);
@@ -2741,6 +2829,7 @@ ADPCM_DECODER(ADPCM_IMA_WS, sample_fmts_both, adpcm_ima_ws, "ADPCM IMA
ADPCM_DECODER(ADPCM_IMA_XBOX, sample_fmts_s16p, adpcm_ima_xbox, "ADPCM IMA Xbox")
ADPCM_DECODER(ADPCM_MS, sample_fmts_both, adpcm_ms, "ADPCM Microsoft")
ADPCM_DECODER(ADPCM_MTAF, sample_fmts_s16p, adpcm_mtaf, "ADPCM MTAF")
+ADPCM_DECODER(ADPCM_N64, sample_fmts_s16p, adpcm_n64, "ADPCM Silicon Graphics N64")
ADPCM_DECODER(ADPCM_PSX, sample_fmts_s16p, adpcm_psx, "ADPCM Playstation")
ADPCM_DECODER(ADPCM_SANYO, sample_fmts_s16p, adpcm_sanyo, "ADPCM Sanyo")
ADPCM_DECODER(ADPCM_SBPRO_2, sample_fmts_s16, adpcm_sbpro_2, "ADPCM Sound Blaster Pro 2-bit")
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 2fb3b0c2ea..f3a252e241 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -697,6 +697,7 @@ extern const FFCodec ff_adpcm_ima_xbox_decoder;
extern const FFCodec ff_adpcm_ms_encoder;
extern const FFCodec ff_adpcm_ms_decoder;
extern const FFCodec ff_adpcm_mtaf_decoder;
+extern const FFCodec ff_adpcm_n64_decoder;
extern const FFCodec ff_adpcm_psx_decoder;
extern const FFCodec ff_adpcm_sanyo_decoder;
extern const FFCodec ff_adpcm_sbpro_2_decoder;
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index b655374a92..1cc66597ba 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -2648,6 +2648,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA PlayDate"),
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
},
+ {
+ .id = AV_CODEC_ID_ADPCM_N64,
+ .type = AVMEDIA_TYPE_AUDIO,
+ .name = "adpcm_n64",
+ .long_name = NULL_IF_CONFIG_SMALL("ADPCM Silicon Graphics N64"),
+ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+ },
/* AMR */
{
diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h
index 6e4b215bf1..8930b2957e 100644
--- a/libavcodec/codec_id.h
+++ b/libavcodec/codec_id.h
@@ -429,6 +429,7 @@ enum AVCodecID {
AV_CODEC_ID_ADPCM_SANYO,
AV_CODEC_ID_ADPCM_IMA_HVQM4,
AV_CODEC_ID_ADPCM_IMA_PDA,
+ AV_CODEC_ID_ADPCM_N64,
/* AMR */
AV_CODEC_ID_AMR_NB = 0x12000,
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 735edaf7a6..c5230e646a 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -665,6 +665,11 @@ static int get_audio_frame_duration(enum AVCodecID id, int sr, int ch, int ba,
return (frame_bytes - 4 * ch) / (128 * ch) * 256;
case AV_CODEC_ID_ADPCM_AFC:
return frame_bytes / (9 * ch) * 16;
+ case AV_CODEC_ID_ADPCM_N64:
+ frame_bytes /= 9 * ch;
+ if (frame_bytes > INT_MAX / 16)
+ return 0;
+ return frame_bytes * 16;
case AV_CODEC_ID_ADPCM_PSX:
case AV_CODEC_ID_ADPCM_DTK:
frame_bytes /= 16 * ch;
commit 648b5d017d0478a0cd30f3753ab556b7721ff2b6
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Mon May 13 10:20:06 2024 +0200
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec: add ADPCM IMA PDA decoder
(cherry picked from commit ab9f7513d55cfd87d1a1ce22d02abffbfb9bb296)
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index d0f2ca0833..d4643f06d3 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -990,6 +990,7 @@ OBJS-$(CONFIG_ADPCM_IMA_HVMQ4_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_ISS_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_MOFLEX_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_MTF_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_PDA_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_OKI_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_QT_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_QT_ENCODER) += adpcmenc.o adpcm_data.o
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 97a6fc6182..24dc001180 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -1209,6 +1209,11 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
buf_size = FFMIN(buf_size, avctx->block_align);
nb_samples = (buf_size - 4 * ch) * 2 / ch;
break;
+ case AV_CODEC_ID_ADPCM_IMA_PDA:
+ if (avctx->block_align > 0)
+ buf_size = FFMIN(buf_size, avctx->block_align);
+ nb_samples = (buf_size - 4 * ch) * 2 / ch;
+ break;
CASE(ADPCM_IMA_WAV,
int bsize = ff_adpcm_ima_block_sizes[avctx->bits_per_coded_sample - 2];
int bsamples = ff_adpcm_ima_block_samples[avctx->bits_per_coded_sample - 2];
@@ -2204,6 +2209,25 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
}
) /* End of CASE */
+ CASE(ADPCM_IMA_PDA,
+ for (int i = 0; i < channels; i++) {
+ c->status[i].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
+ c->status[i].step_index = bytestream2_get_byteu(&gb);
+ bytestream2_skipu(&gb, 1);
+ if (c->status[i].step_index > 88u) {
+ av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n",
+ c->status[i].step_index);
+ return AVERROR_INVALIDDATA;
+ }
+ }
+
+ for (int n = nb_samples >> (1 - st); n > 0; n--) {
+ int v = bytestream2_get_byteu(&gb);
+
+ *samples++ = ff_adpcm_ima_qt_expand_nibble(&c->status[0 ], v >> 4 );
+ *samples++ = ff_adpcm_ima_qt_expand_nibble(&c->status[st], v & 0xf);
+ }
+ ) /* End of CASE */
CASE(ADPCM_IMA_SMJPEG,
for (int i = 0; i < channels; i++) {
c->status[i].predictor = sign_extend(bytestream2_get_be16u(&gb), 16);
@@ -2706,6 +2730,7 @@ ADPCM_DECODER(ADPCM_IMA_ISS, sample_fmts_s16, adpcm_ima_iss, "ADPCM IMA
ADPCM_DECODER(ADPCM_IMA_MOFLEX, sample_fmts_s16p, adpcm_ima_moflex, "ADPCM IMA MobiClip MOFLEX")
ADPCM_DECODER(ADPCM_IMA_MTF, sample_fmts_s16, adpcm_ima_mtf, "ADPCM IMA Capcom's MT Framework")
ADPCM_DECODER(ADPCM_IMA_OKI, sample_fmts_s16, adpcm_ima_oki, "ADPCM IMA Dialogic OKI")
+ADPCM_DECODER(ADPCM_IMA_PDA, sample_fmts_s16, adpcm_ima_pda, "ADPCM IMA PlayDate")
ADPCM_DECODER(ADPCM_IMA_QT, sample_fmts_s16p, adpcm_ima_qt, "ADPCM IMA QuickTime")
ADPCM_DECODER(ADPCM_IMA_RAD, sample_fmts_s16, adpcm_ima_rad, "ADPCM IMA Radical")
ADPCM_DECODER(ADPCM_IMA_SSI, sample_fmts_s16, adpcm_ima_ssi, "ADPCM IMA Simon & Schuster Interactive")
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index b81dda8161..2fb3b0c2ea 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -682,6 +682,7 @@ extern const FFCodec ff_adpcm_ima_iss_decoder;
extern const FFCodec ff_adpcm_ima_moflex_decoder;
extern const FFCodec ff_adpcm_ima_mtf_decoder;
extern const FFCodec ff_adpcm_ima_oki_decoder;
+extern const FFCodec ff_adpcm_ima_pda_decoder;
extern const FFCodec ff_adpcm_ima_qt_encoder;
extern const FFCodec ff_adpcm_ima_qt_decoder;
extern const FFCodec ff_adpcm_ima_rad_decoder;
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index 7a4adb7d02..b655374a92 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -2641,6 +2641,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA HVQM4"),
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
},
+ {
+ .id = AV_CODEC_ID_ADPCM_IMA_PDA,
+ .type = AVMEDIA_TYPE_AUDIO,
+ .name = "adpcm_ima_pda",
+ .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA PlayDate"),
+ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+ },
/* AMR */
{
diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h
index ee964184a5..6e4b215bf1 100644
--- a/libavcodec/codec_id.h
+++ b/libavcodec/codec_id.h
@@ -428,6 +428,7 @@ enum AVCodecID {
AV_CODEC_ID_ADPCM_IMA_XBOX,
AV_CODEC_ID_ADPCM_SANYO,
AV_CODEC_ID_ADPCM_IMA_HVQM4,
+ AV_CODEC_ID_ADPCM_IMA_PDA,
/* AMR */
AV_CODEC_ID_AMR_NB = 0x12000,
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index cfa35d0e04..735edaf7a6 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -675,6 +675,7 @@ static int get_audio_frame_duration(enum AVCodecID id, int sr, int ch, int ba,
case AV_CODEC_ID_ADPCM_IMA_ACORN:
case AV_CODEC_ID_ADPCM_IMA_DAT4:
case AV_CODEC_ID_ADPCM_IMA_ISS:
+ case AV_CODEC_ID_ADPCM_IMA_PDA:
return (frame_bytes - 4 * ch) * 2 / ch;
case AV_CODEC_ID_ADPCM_IMA_SMJPEG:
return (frame_bytes - 4) * 2 / ch;
commit 424dbb03ae2870a1edc9c43890b174f27ffc0746
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Sun Aug 1 21:12:55 2021 +0200
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec: add ADPCM IMA HVQM4 decoder
Signed-off-by: Paul B Mahol <onemda(a)gmail.com>
(cherry picked from commit bae3cecfa6f1fbc765d95d84ef4a377aedbca8bb)
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 6e7e37e755..d0f2ca0833 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -986,6 +986,7 @@ OBJS-$(CONFIG_ADPCM_IMA_DK3_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_DK4_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_EA_EACS_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_EA_SEAD_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_HVMQ4_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_ISS_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_MOFLEX_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_MTF_DECODER) += adpcm.o adpcm_data.o
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 26323507e3..97a6fc6182 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -546,6 +546,49 @@ int16_t ff_adpcm_ima_qt_expand_nibble(ADPCMChannelStatus *c, int nibble)
return c->predictor;
}
+static void decode_adpcm_ima_hvqm4(AVCodecContext *avctx, int16_t *outbuf, int samples_to_do,
+ int frame_format, GetByteContext *gb)
+{
+ ADPCMDecodeContext *c = avctx->priv_data;
+ int st = avctx->ch_layout.nb_channels == 2;
+ unsigned tmp;
+
+ for (int ch = 0; ch < avctx->ch_layout.nb_channels; ch++) {
+ switch (frame_format) {
+ case 1: /* combined hist+index */
+ tmp = bytestream2_get_be16(gb);
+ c->status[ch].predictor = sign_extend(tmp & 0xFF80, 16);
+ c->status[ch].step_index = tmp & 0x7f;
+ break;
+ case 2: /* no hist/index (continues from previous frame) */
+ default:
+ break;
+ case 3: /* separate hist+index */
+ tmp = bytestream2_get_be16(gb);
+ c->status[ch].predictor = sign_extend(tmp, 16);
+ c->status[ch].step_index = bytestream2_get_byte(gb);
+ break;
+ }
+
+ c->status[ch].step_index = av_clip(c->status[ch].step_index, 0, 88);
+ }
+
+ if (frame_format == 1 || frame_format == 3) {
+ for (int ch = 0; ch < avctx->ch_layout.nb_channels; ch++)
+ *outbuf++ = (int16_t)c->status[st - ch].predictor;
+ samples_to_do--;
+ }
+
+ for (int i = 0; i < samples_to_do; i++) {
+ uint8_t nibble = bytestream2_get_byte(gb);
+
+ *outbuf++ = ff_adpcm_ima_qt_expand_nibble(&c->status[st], nibble & 0xF);
+ *outbuf++ = ff_adpcm_ima_qt_expand_nibble(&c->status[ 0], nibble >> 4);
+ }
+
+ bytestream2_seek(gb, 0, SEEK_END);
+}
+
static inline int16_t adpcm_ms_expand_nibble(ADPCMChannelStatus *c, int nibble)
{
int predictor;
@@ -1102,6 +1145,20 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
*coded_samples -= *coded_samples % 28;
nb_samples = (buf_size - 12) / (ch == 2 ? 30 : 15) * 28;
break;
+ case AV_CODEC_ID_ADPCM_IMA_HVQM4:
+ {
+ int frame_format = bytestream2_get_be16(gb);
+ int skip = 6;
+
+ if (frame_format == 1)
+ skip += 2 * ch;
+ if (frame_format == 3)
+ skip += 3 * ch;
+
+ nb_samples = (buf_size - skip) * 2 / ch;
+ bytestream2_seek(gb, 0, SEEK_SET);
+ }
+ break;
case AV_CODEC_ID_ADPCM_IMA_EA_EACS:
has_coded_samples = 1;
*coded_samples = bytestream2_get_le32(gb);
@@ -1688,6 +1745,12 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
*samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
}
) /* End of CASE */
+ CASE(ADPCM_IMA_HVQM4,
+ int format = bytestream2_get_be16(&gb);
+
+ bytestream2_skip(&gb, 4);
+ decode_adpcm_ima_hvqm4(avctx, samples, nb_samples, format, &gb);
+ ) /* End of CASE */
CASE(ADPCM_IMA_SSI,
for (int n = nb_samples >> (1 - st); n > 0; n--) {
int v = bytestream2_get_byteu(&gb);
@@ -2638,6 +2701,7 @@ ADPCM_DECODER(ADPCM_IMA_DK3, sample_fmts_s16, adpcm_ima_dk3, "ADPCM IMA
ADPCM_DECODER(ADPCM_IMA_DK4, sample_fmts_s16, adpcm_ima_dk4, "ADPCM IMA Duck DK4")
ADPCM_DECODER(ADPCM_IMA_EA_EACS, sample_fmts_s16, adpcm_ima_ea_eacs, "ADPCM IMA Electronic Arts EACS")
ADPCM_DECODER(ADPCM_IMA_EA_SEAD, sample_fmts_s16, adpcm_ima_ea_sead, "ADPCM IMA Electronic Arts SEAD")
+ADPCM_DECODER(ADPCM_IMA_HVQM4, sample_fmts_s16, adpcm_ima_hvqm4, "ADPCM IMA HVQM4")
ADPCM_DECODER(ADPCM_IMA_ISS, sample_fmts_s16, adpcm_ima_iss, "ADPCM IMA Funcom ISS")
ADPCM_DECODER(ADPCM_IMA_MOFLEX, sample_fmts_s16p, adpcm_ima_moflex, "ADPCM IMA MobiClip MOFLEX")
ADPCM_DECODER(ADPCM_IMA_MTF, sample_fmts_s16, adpcm_ima_mtf, "ADPCM IMA Capcom's MT Framework")
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 017d100848..b81dda8161 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -677,6 +677,7 @@ extern const FFCodec ff_adpcm_ima_dk3_decoder;
extern const FFCodec ff_adpcm_ima_dk4_decoder;
extern const FFCodec ff_adpcm_ima_ea_eacs_decoder;
extern const FFCodec ff_adpcm_ima_ea_sead_decoder;
+extern const FFCodec ff_adpcm_ima_hvqm4_decoder;
extern const FFCodec ff_adpcm_ima_iss_decoder;
extern const FFCodec ff_adpcm_ima_moflex_decoder;
extern const FFCodec ff_adpcm_ima_mtf_decoder;
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index cd146a1f5f..7a4adb7d02 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -2634,6 +2634,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("ADPCM Sanyo"),
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
},
+ {
+ .id = AV_CODEC_ID_ADPCM_IMA_HVQM4,
+ .type = AVMEDIA_TYPE_AUDIO,
+ .name = "adpcm_ima_hvqm4",
+ .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA HVQM4"),
+ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+ },
/* AMR */
{
diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h
index 455bc4b839..ee964184a5 100644
--- a/libavcodec/codec_id.h
+++ b/libavcodec/codec_id.h
@@ -427,6 +427,7 @@ enum AVCodecID {
AV_CODEC_ID_ADPCM_XMD,
AV_CODEC_ID_ADPCM_IMA_XBOX,
AV_CODEC_ID_ADPCM_SANYO,
+ AV_CODEC_ID_ADPCM_IMA_HVQM4,
/* AMR */
AV_CODEC_ID_AMR_NB = 0x12000,
commit e95171fbffd8bafcab42f9a22e257dce733c5b97
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Tue Nov 19 09:20:52 2024 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec: add AHX parser
(cherry picked from commit ddcb47c4c512bf49b22cc6b2d07fade0f96377e3)
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index cfe60ee2d4..6e7e37e755 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -1219,6 +1219,7 @@ OBJS-$(CONFIG_AAC_PARSER) += aac_parser.o aac_ac3_parser.o
OBJS-$(CONFIG_AC3_PARSER) += aac_ac3_parser.o ac3tab.o \
ac3_channel_layout_tab.o
OBJS-$(CONFIG_ADX_PARSER) += adx_parser.o
+OBJS-$(CONFIG_AHX_PARSER) += ahx_parser.o
OBJS-$(CONFIG_AMR_PARSER) += amr_parser.o
OBJS-$(CONFIG_APV_PARSER) += apv_parser.o
OBJS-$(CONFIG_AV1_PARSER) += av1_parser.o av1_parse.o
diff --git a/libavcodec/ahx_parser.c b/libavcodec/ahx_parser.c
new file mode 100644
index 0000000000..4be037f666
--- /dev/null
+++ b/libavcodec/ahx_parser.c
@@ -0,0 +1,78 @@
+/*
+ * 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
+ * AHX audio parser
+ *
+ * Splits packets into individual blocks.
+ */
+
+#include "libavutil/intreadwrite.h"
+#include "parser.h"
+
+typedef struct AHXParseContext {
+ ParseContext pc;
+ uint32_t header;
+ int size;
+} AHXParseContext;
+
+static int ahx_parse(AVCodecParserContext *s1,
+ AVCodecContext *avctx,
+ const uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size)
+{
+ AHXParseContext *s = s1->priv_data;
+ ParseContext *pc = &s->pc;
+ uint32_t state = pc->state;
+ int next = END_NOT_FOUND;
+
+ for (int i = 0; i < buf_size; i++) {
+ state = (state << 8) | buf[i];
+ s->size++;
+ if (s->size == 4 && !s->header)
+ s->header = state;
+ if (s->size > 4 && state == s->header) {
+ next = i - 3;
+ s->size = 0;
+ break;
+ }
+ }
+ pc->state = state;
+
+ if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) {
+ *poutbuf = NULL;
+ *poutbuf_size = 0;
+ return buf_size;
+ }
+
+ s1->duration = 1152;
+ s1->key_frame = 1;
+
+ *poutbuf = buf;
+ *poutbuf_size = buf_size;
+
+ return next;
+}
+
+const AVCodecParser ff_ahx_parser = {
+ .codec_ids = { AV_CODEC_ID_AHX },
+ .priv_data_size = sizeof(AHXParseContext),
+ .parser_parse = ahx_parse,
+ .parser_close = ff_parse_close,
+};
diff --git a/libavcodec/parsers.c b/libavcodec/parsers.c
index b12c48f79f..42b40643f9 100644
--- a/libavcodec/parsers.c
+++ b/libavcodec/parsers.c
@@ -24,6 +24,7 @@ extern const AVCodecParser ff_aac_parser;
extern const AVCodecParser ff_aac_latm_parser;
extern const AVCodecParser ff_ac3_parser;
extern const AVCodecParser ff_adx_parser;
+extern const AVCodecParser ff_ahx_parser;
extern const AVCodecParser ff_amr_parser;
extern const AVCodecParser ff_apv_parser;
extern const AVCodecParser ff_av1_parser;
commit b2e821310b9c78b866306ad2b01ce63c1481382a
Author: Paul B Mahol <onemda(a)gmail.com>
AuthorDate: Mon Nov 18 19:04:23 2024 +0000
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 23:46:29 2025 +0000
avcodec: add AHX decoder
(cherry picked from commit 039dc23d185214b8b0ef2bbccae197ceb5ad42a2)
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index a321cda3a5..cfe60ee2d4 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -221,6 +221,7 @@ OBJS-$(CONFIG_AC3_FIXED_ENCODER) += ac3enc_fixed.o ac3enc.o ac3tab.o ac3.o
OBJS-$(CONFIG_AC3_MF_ENCODER) += mfenc.o mf_utils.o
OBJS-$(CONFIG_ACELP_KELVIN_DECODER) += g729dec.o lsp.o celp_filters.o acelp_filters.o acelp_pitch_delay.o acelp_vectors.o g729postfilter.o
OBJS-$(CONFIG_AGM_DECODER) += agm.o jpegquanttables.o
+OBJS-$(CONFIG_AHX_DECODER) += mpegaudiodec_float.o
OBJS-$(CONFIG_AIC_DECODER) += aic.o
OBJS-$(CONFIG_ALAC_DECODER) += alac.o alac_data.o alacdsp.o
OBJS-$(CONFIG_ALAC_ENCODER) += alacenc.o alac_data.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index f5ec2e01e8..017d100848 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -434,6 +434,7 @@ extern const FFCodec ff_ac3_decoder;
extern const FFCodec ff_ac3_fixed_encoder;
extern const FFCodec ff_ac3_fixed_decoder;
extern const FFCodec ff_acelp_kelvin_decoder;
+extern const FFCodec ff_ahx_decoder;
extern const FFCodec ff_alac_encoder;
extern const FFCodec ff_alac_decoder;
extern const FFCodec ff_als_decoder;
diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c
index c277bc1a71..b4b852c7e6 100644
--- a/libavcodec/bitstream_filters.c
+++ b/libavcodec/bitstream_filters.c
@@ -25,6 +25,7 @@
#include "bsf_internal.h"
extern const FFBitStreamFilter ff_aac_adtstoasc_bsf;
+extern const FFBitStreamFilter ff_ahx_to_mp2_bsf;
extern const FFBitStreamFilter ff_apv_metadata_bsf;
extern const FFBitStreamFilter ff_av1_frame_merge_bsf;
extern const FFBitStreamFilter ff_av1_frame_split_bsf;
diff --git a/libavcodec/bsf/Makefile b/libavcodec/bsf/Makefile
index 8e2e6f7b14..360fd1e32f 100644
--- a/libavcodec/bsf/Makefile
+++ b/libavcodec/bsf/Makefile
@@ -2,6 +2,7 @@ clean::
$(RM) $(CLEANSUFFIXES:%=libavcodec/bsf/%)
OBJS-$(CONFIG_AAC_ADTSTOASC_BSF) += bsf/aac_adtstoasc.o
+OBJS-$(CONFIG_AHX_TO_MP2_BSF) += bsf/ahx_to_mp2.o
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
diff --git a/libavcodec/bsf/ahx_to_mp2.c b/libavcodec/bsf/ahx_to_mp2.c
new file mode 100644
index 0000000000..eae71fe5ee
--- /dev/null
+++ b/libavcodec/bsf/ahx_to_mp2.c
@@ -0,0 +1,62 @@
+/*
+ * AHX to MP2 bitstream filter
+ * Copyright (c) 2024 Paul B Mahol
+ *
+ * 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
+ * AHX to MP2 bitstream filter.
+ */
+
+#include "libavutil/intreadwrite.h"
+#include "bsf.h"
+#include "bsf_internal.h"
+
+static av_cold int init(AVBSFContext *ctx)
+{
+ ctx->par_out->codec_id = AV_CODEC_ID_MP2;
+
+ return 0;
+}
+
+static int filter(AVBSFContext *ctx, AVPacket *pkt)
+{
+ int ret;
+
+ ret = ff_bsf_get_packet_ref(ctx, pkt);
+ if (ret < 0)
+ return ret;
+
+ if (pkt->size < 1044) {
+ ret = av_grow_packet(pkt, 1044-pkt->size);
+ if (ret < 0) {
+ av_packet_unref(pkt);
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+const FFBitStreamFilter ff_ahx_to_mp2_bsf = {
+ .p.name = "ahx_to_mp2",
+ .p.codec_ids = (const enum AVCodecID []){ AV_CODEC_ID_AHX, AV_CODEC_ID_NONE },
+ .init = init,
+ .filter = filter,
+};
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index d5d178cc7e..cd146a1f5f 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -3495,6 +3495,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("G.728"),
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
},
+ {
+ .id = AV_CODEC_ID_AHX,
+ .type = AVMEDIA_TYPE_AUDIO,
+ .name = "ahx",
+ .long_name = NULL_IF_CONFIG_SMALL("CRI AHX"),
+ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+ },
/* subtitle codecs */
{
diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h
index c4842e61ff..455bc4b839 100644
--- a/libavcodec/codec_id.h
+++ b/libavcodec/codec_id.h
@@ -556,6 +556,7 @@ enum AVCodecID {
AV_CODEC_ID_QOA,
AV_CODEC_ID_LC3,
AV_CODEC_ID_G728,
+ AV_CODEC_ID_AHX,
/* subtitle codecs */
AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs.
diff --git a/libavcodec/mpegaudiodec_float.c b/libavcodec/mpegaudiodec_float.c
index 05e2e399e4..232e2fa201 100644
--- a/libavcodec/mpegaudiodec_float.c
+++ b/libavcodec/mpegaudiodec_float.c
@@ -103,6 +103,24 @@ const FFCodec ff_mp2float_decoder = {
CODEC_SAMPLEFMTS(AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT),
};
#endif
+#if CONFIG_AHX_DECODER
+const FFCodec ff_ahx_decoder = {
+ .p.name = "ahx",
+ CODEC_LONG_NAME("CRI AHX"),
+ .p.type = AVMEDIA_TYPE_AUDIO,
+ .p.id = AV_CODEC_ID_AHX,
+ .priv_data_size = sizeof(MPADecodeContext),
+ .init = decode_init,
+ FF_CODEC_DECODE_CB(decode_frame),
+ .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF |
+ AV_CODEC_CAP_DR1,
+ .flush = flush,
+ .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
+ AV_SAMPLE_FMT_FLT,
+ AV_SAMPLE_FMT_NONE },
+ .bsfs = "ahx_to_mp2",
+};
+#endif
#if CONFIG_MP3FLOAT_DECODER
const FFCodec ff_mp3float_decoder = {
.p.name = "mp3float",
diff --git a/libavcodec/mpegaudiodec_template.c b/libavcodec/mpegaudiodec_template.c
index 0efcf9853d..fa2efa023f 100644
--- a/libavcodec/mpegaudiodec_template.c
+++ b/libavcodec/mpegaudiodec_template.c
@@ -1608,7 +1608,8 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *frame,
if (ret >= 0) {
s->frame->nb_samples = avctx->frame_size;
*got_frame_ptr = 1;
- avctx->sample_rate = s->sample_rate;
+ if (avctx->codec_id != AV_CODEC_ID_AHX)
+ avctx->sample_rate = s->sample_rate;
//FIXME maybe move the other codec info stuff from above here too
} else {
av_log(avctx, AV_LOG_ERROR, "Error while decoding MPEG audio frame.\n");
-----------------------------------------------------------------------
Summary of changes:
configure | 12 +
libavcodec/Makefile | 10 +
libavcodec/adpcm.c | 364 ++++++++++++++++++++++++++++++-
libavcodec/ahx_parser.c | 78 +++++++
libavcodec/allcodecs.c | 9 +
libavcodec/atrac1.c | 12 +-
libavcodec/bitstream_filters.c | 1 +
libavcodec/bsf/Makefile | 1 +
libavcodec/bsf/{chomp.c => ahx_to_mp2.c} | 39 +++-
libavcodec/codec_desc.c | 63 ++++++
libavcodec/codec_id.h | 9 +
libavcodec/mpegaudiodec_float.c | 18 ++
libavcodec/mpegaudiodec_template.c | 3 +-
libavcodec/parsers.c | 1 +
libavcodec/utils.c | 13 ++
libavformat/Makefile | 2 +-
libavformat/adxdec.c | 29 ++-
libavformat/aeadec.c | 2 +-
libavformat/aiff.c | 1 +
libavformat/aiffdec.c | 28 +++
libavformat/rpl.c | 2 +-
tests/ref/acodec/adpcm-ima_wav | 4 +-
tests/ref/acodec/adpcm-ima_wav-trellis | 4 +-
tests/ref/fate/adpcm-ima_wav-stereo | 2 +-
24 files changed, 673 insertions(+), 34 deletions(-)
create mode 100644 libavcodec/ahx_parser.c
copy libavcodec/bsf/{chomp.c => ahx_to_mp2.c} (56%)
hooks/post-receive
--
1
0
[ffmpeg] branch master updated. b1cbc7c8ff configure: strip non numeric trailer from gcc version
by ffmpeg-git@ffmpeg.org 22 Sep '25
by ffmpeg-git@ffmpeg.org 22 Sep '25
22 Sep '25
The branch, master has been updated
via b1cbc7c8ff515159130bc4290ef6ab204e7101e8 (commit)
from b815431126c8feb7557f61bb16bf6b572993089a (commit)
- Log -----------------------------------------------------------------
commit b1cbc7c8ff515159130bc4290ef6ab204e7101e8
Author: Michael Niedermayer <michael(a)niedermayer.cc>
AuthorDate: Sun Sep 21 16:49:45 2025 +0200
Commit: michaelni <michael(a)niedermayer.cc>
CommitDate: Mon Sep 22 21:41:42 2025 +0000
configure: strip non numeric trailer from gcc version
Fixes: ../configure: 7820: [: Illegal number: 13-win32
Signed-off-by: Michael Niedermayer <michael(a)niedermayer.cc>
diff --git a/configure b/configure
index 98de8e5dff..9d5a6ffc14 100755
--- a/configure
+++ b/configure
@@ -7816,7 +7816,7 @@ if enabled icc; then
fi
elif enabled gcc; then
gcc_version=$($cc -dumpversion)
- major_version=${gcc_version%%.*}
+ major_version=${gcc_version%%[!0-9]*}
if [ $major_version -lt 13 ]; then
# Disable tree-vectorize for GCC <13 - it has historically been buggy.
check_optflags -fno-tree-vectorize
-----------------------------------------------------------------------
Summary of changes:
configure | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
hooks/post-receive
--
1
0
[ffmpeg] branch release/8.0 updated. b9adbf0fcc fftools/ffmpeg: fix gracefully shutdown
by ffmpeg-git@ffmpeg.org 22 Sep '25
by ffmpeg-git@ffmpeg.org 22 Sep '25
22 Sep '25
The branch, release/8.0 has been updated
via b9adbf0fcc26e04a0f291c9f8857affb4540a6e3 (commit)
from e322e2e5d94100a2be0853033d6c124ec8249b78 (commit)
- Log -----------------------------------------------------------------
commit b9adbf0fcc26e04a0f291c9f8857affb4540a6e3
Author: Patrick Wang <mail6543210(a)gmail.com>
AuthorDate: Fri Aug 29 02:58:16 2025 +0800
Commit: Marton Balint <cus(a)passwd.hu>
CommitDate: Mon Sep 22 22:46:25 2025 +0200
fftools/ffmpeg: fix gracefully shutdown
d119ae2fd82a494d9430ff4d4fc262961a68c598 removed the loop-breaking condition
received_sigterm.
Thus, signals no longer gracefully shutdown ffmpeg.
Fixes: #10834
Signed-off-by: Patrick Wang <mail6543210(a)gmail.com>
Signed-off-by: Michael Niedermayer <michael(a)niedermayer.cc>
(cherry picked from commit d7173e982ec815dcf70999c8683c465b99ce249c)
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index de607cac93..cbeefb71d6 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -806,8 +806,6 @@ static int check_keyboard_interaction(int64_t cur_time)
{
int i, key;
static int64_t last_time;
- if (received_nb_signals)
- return AVERROR_EXIT;
/* read_key() returns 0 on EOF */
if (cur_time - last_time >= 100000) {
key = read_key();
@@ -891,6 +889,9 @@ static int transcode(Scheduler *sch)
while (!sch_wait(sch, stats_period, &transcode_ts)) {
int64_t cur_time= av_gettime_relative();
+ if (received_nb_signals)
+ break;
+
/* if 'q' pressed, exits */
if (stdin_interaction)
if (check_keyboard_interaction(cur_time) < 0)
-----------------------------------------------------------------------
Summary of changes:
fftools/ffmpeg.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
hooks/post-receive
--
1
0
[ffmpeg] branch master updated. b815431126 Revert "avformat/tls_openssl: add av_assert0() for tls_shared"
by ffmpeg-git@ffmpeg.org 22 Sep '25
by ffmpeg-git@ffmpeg.org 22 Sep '25
22 Sep '25
The branch, master has been updated
via b815431126c8feb7557f61bb16bf6b572993089a (commit)
from db6cd6c6bfe6f306dd8d9de2a0086586cbd27ec1 (commit)
- Log -----------------------------------------------------------------
commit b815431126c8feb7557f61bb16bf6b572993089a
Author: Andreas Rheinhardt <andreas.rheinhardt(a)outlook.com>
AuthorDate: Thu Sep 18 14:58:55 2025 +0200
Commit: Andreas Rheinhardt <andreas.rheinhardt(a)outlook.com>
CommitDate: Mon Sep 22 22:02:03 2025 +0200
Revert "avformat/tls_openssl: add av_assert0() for tls_shared"
This reverts commits fd55c4b5f72a157fbb128d0ef203e9922b53552b
(for tls_openssl.c) and c74181a04b5f4e650eae662231e56518daef64d4
(for tls_gnutls.c).
It is impossible for a pointer to a member of a structure
to be NULL: If the containing structure exists, the member
exists and can't have a NULL address; if the containing
structure does not exist, then getting a pointer to the
substructure via &c->tls_shared would already be undefined
behavior.
Reviewed-by: Kacper Michajłow <kasper93(a)gmail.com>
Reviewed-by: Steven Liu <lingjiujianke(a)gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt(a)outlook.com>
diff --git a/libavformat/tls_gnutls.c b/libavformat/tls_gnutls.c
index fe2fd53291..e4fe53318c 100644
--- a/libavformat/tls_gnutls.c
+++ b/libavformat/tls_gnutls.c
@@ -30,7 +30,6 @@
#include "os_support.h"
#include "url.h"
#include "tls.h"
-#include "libavutil/avassert.h"
#include "libavutil/opt.h"
#include "libavutil/thread.h"
@@ -156,7 +155,6 @@ static int tls_open(URLContext *h, const char *uri, int flags, AVDictionary **op
TLSShared *s = &c->tls_shared;
uint16_t gnutls_flags = 0;
int ret;
- av_assert0(s);
ff_gnutls_init();
@@ -262,7 +260,6 @@ static int dtls_open(URLContext *h, const char *uri, int flags, AVDictionary **o
{
TLSContext *c = h->priv_data;
TLSShared *s = &c->tls_shared;
- av_assert0(s);
s->is_dtls = 1;
return tls_open(h, uri, flags, options);
}
diff --git a/libavformat/tls_openssl.c b/libavformat/tls_openssl.c
index 86b4d21799..5fc0b639d7 100644
--- a/libavformat/tls_openssl.c
+++ b/libavformat/tls_openssl.c
@@ -20,7 +20,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "libavutil/avassert.h"
#include "libavutil/mem.h"
#include "network.h"
#include "os_support.h"
@@ -746,7 +745,6 @@ static int dtls_start(URLContext *h, const char *url, int flags, AVDictionary **
TLSContext *c = h->priv_data;
TLSShared *s = &c->tls_shared;
int ret = 0;
- av_assert0(s);
s->is_dtls = 1;
c->ctx = SSL_CTX_new(s->listen ? DTLS_server_method() : DTLS_client_method());
@@ -847,7 +845,6 @@ static int tls_open(URLContext *h, const char *uri, int flags, AVDictionary **op
TLSShared *s = &c->tls_shared;
int ret;
- av_assert0(s);
if ((ret = ff_tls_open_underlying(s, h, uri, options)) < 0)
goto fail;
-----------------------------------------------------------------------
Summary of changes:
libavformat/tls_gnutls.c | 3 ---
libavformat/tls_openssl.c | 3 ---
2 files changed, 6 deletions(-)
hooks/post-receive
--
1
0