PR #20830 opened by Daniel Stadelmann (dstadelmann-iis)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20830
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20830.patch

Consists of 2 related changes:

* Fixes the timestamp calculation for input samples to the decoder, as per 
@mkver's https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20602#issue-1151.
* Adds FATE tests for decoding select streams into different channel layouts


>From a81098d201749bf2b2bc2233688bb822669574ff Mon Sep 17 00:00:00 2001
From: "Stadelmann, Daniel" <[email protected]>
Date: Mon, 3 Nov 2025 14:27:17 +0100
Subject: [PATCH 1/2] fate/mpegh3da: Add FATE tests for libmpeghdec decoder

Signed-off-by: Stadelmann, Daniel <[email protected]>
---
 tests/Makefile          |  1 +
 tests/fate/mpegh3da.mak | 42 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+)
 create mode 100644 tests/fate/mpegh3da.mak

diff --git a/tests/Makefile b/tests/Makefile
index 3eef290e41..8789e8489f 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -221,6 +221,7 @@ include $(SRC_PATH)/tests/fate/mov.mak
 include $(SRC_PATH)/tests/fate/mp3.mak
 include $(SRC_PATH)/tests/fate/mpc.mak
 include $(SRC_PATH)/tests/fate/mpeg4.mak
+include $(SRC_PATH)/tests/fate/mpegh3da.mak
 include $(SRC_PATH)/tests/fate/mpegps.mak
 include $(SRC_PATH)/tests/fate/mpegts.mak
 include $(SRC_PATH)/tests/fate/mxf.mak
diff --git a/tests/fate/mpegh3da.mak b/tests/fate/mpegh3da.mak
new file mode 100644
index 0000000000..d76c33da1e
--- /dev/null
+++ b/tests/fate/mpegh3da.mak
@@ -0,0 +1,42 @@
+FATE_MPEGH3DA += fate-mpegh3da-decode-2-2
+fate-mpegh3da-decode-2-2: CMD = ffmpeg -auto_conversion_filters -c:a 
libmpeghdec -ch_layout stereo -i 
$(TARGET_SAMPLES)/mpegh3da/mpegh_cicp_02_baseline_32kbps.mp4 -f s16le -
+fate-mpegh3da-decode-2-2: REF = 
$(SAMPLES)/mpegh3da/reference_stereo_to_stereo.pcm
+
+FATE_MPEGH3DA += fate-mpegh3da-decode-2-13
+fate-mpegh3da-decode-2-13: CMD = ffmpeg -auto_conversion_filters -c:a 
libmpeghdec -ch_layout 22.2 -i 
$(TARGET_SAMPLES)/mpegh3da/mpegh_cicp_02_baseline_32kbps.mp4 -f s16le -
+fate-mpegh3da-decode-2-13: REF = 
$(SAMPLES)/mpegh3da/reference_stereo_to_22.2.pcm
+
+FATE_MPEGH3DA += fate-mpegh3da-decode-2-1
+fate-mpegh3da-decode-2-1: CMD = ffmpeg -auto_conversion_filters -c:a 
libmpeghdec -ch_layout mono -i 
$(TARGET_SAMPLES)/mpegh3da/mpegh_cicp_02_baseline_32kbps.mp4 -f s16le -
+fate-mpegh3da-decode-2-1: REF = 
$(SAMPLES)/mpegh3da/reference_stereo_to_mono.pcm
+
+FATE_MPEGH3DA += fate-mpegh3da-decode-13-2
+fate-mpegh3da-decode-13-2: CMD = ffmpeg -auto_conversion_filters -c:a 
libmpeghdec -ch_layout stereo -i 
$(TARGET_SAMPLES)/mpegh3da/mpegh_cicp_13_lc_baseline_compatible_32kbps.mp4 -f 
s16le -
+fate-mpegh3da-decode-13-2: REF = 
$(SAMPLES)/mpegh3da/reference_22.2_to_stereo.pcm
+
+FATE_MPEGH3DA += fate-mpegh3da-decode-13-13
+fate-mpegh3da-decode-13-13: CMD = ffmpeg -auto_conversion_filters -c:a 
libmpeghdec -ch_layout 22.2 -i 
$(TARGET_SAMPLES)/mpegh3da/mpegh_cicp_13_lc_baseline_compatible_32kbps.mp4 -f 
s16le -
+fate-mpegh3da-decode-13-13: REF = 
$(SAMPLES)/mpegh3da/reference_22.2_to_22.2.pcm
+
+FATE_MPEGH3DA += fate-mpegh3da-decode-13-1
+fate-mpegh3da-decode-13-1: CMD = ffmpeg -auto_conversion_filters -c:a 
libmpeghdec -ch_layout mono -i 
$(TARGET_SAMPLES)/mpegh3da/mpegh_cicp_13_lc_baseline_compatible_32kbps.mp4 -f 
s16le -
+fate-mpegh3da-decode-13-1: REF = $(SAMPLES)/mpegh3da/reference_22.2_to_mono.pcm
+
+FATE_MPEGH3DA += fate-mpegh3da-decode-change-2
+fate-mpegh3da-decode-change-2: CMD = ffmpeg -auto_conversion_filters -c:a 
libmpeghdec -ch_layout stereo -i 
$(TARGET_SAMPLES)/mpegh3da/mpegh_config_change_cicp_2_14_6_lc_baseline_compatible_32kbps.mp4
 -f s16le -
+fate-mpegh3da-decode-change-2: REF = 
$(SAMPLES)/mpegh3da/reference_config_change_to_stereo.pcm
+
+FATE_MPEGH3DA += fate-mpegh3da-decode-change-13
+fate-mpegh3da-decode-change-13: CMD = ffmpeg -auto_conversion_filters -c:a 
libmpeghdec -ch_layout 22.2 -i 
$(TARGET_SAMPLES)/mpegh3da/mpegh_config_change_cicp_2_14_6_lc_baseline_compatible_32kbps.mp4
 -f s16le -
+fate-mpegh3da-decode-change-13: REF = 
$(SAMPLES)/mpegh3da/reference_config_change_to_22.2.pcm
+
+FATE_MPEGH3DA += fate-mpegh3da-decode-change-1
+fate-mpegh3da-decode-change-1: CMD = ffmpeg -auto_conversion_filters -c:a 
libmpeghdec -ch_layout mono -i 
$(TARGET_SAMPLES)/mpegh3da/mpegh_config_change_cicp_2_14_6_lc_baseline_compatible_32kbps.mp4
 -f s16le -
+fate-mpegh3da-decode-change-1: REF = 
$(SAMPLES)/mpegh3da/reference_config_change_to_mono.pcm
+
+$(FATE_MPEGH3DA): CMP = oneoff
+$(FATE_MPEGH3DA): CMP_UNIT = s16
+
+FATE_MPEGH3DA-$(call DEMDEC, MOV, LIBMPEGHDEC) += $(FATE_MPEGH3DA)
+FATE_SAMPLES_FFMPEG += $(FATE_MPEGH3DA-yes)
+fate-mpegh3da: $(FATE_MPEGH3DA-yes)
-- 
2.49.1


>From 7bfa871a10a89144240457e9d9cebbe110d42848 Mon Sep 17 00:00:00 2001
From: "Stadelmann, Daniel" <[email protected]>
Date: Mon, 3 Nov 2025 14:33:26 +0100
Subject: [PATCH 2/2] avcodec/libmpeghdec: Use correct time base for timestamp
 calculation

Signed-off-by: Stadelmann, Daniel <[email protected]>
---
 libavcodec/libmpeghdec.c | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/libavcodec/libmpeghdec.c b/libavcodec/libmpeghdec.c
index ecc3a2dc09..2dc697952c 100644
--- a/libavcodec/libmpeghdec.c
+++ b/libavcodec/libmpeghdec.c
@@ -152,15 +152,10 @@ static int mpegh3dadec_decode_frame(AVCodecContext 
*avctx, AVFrame *frame,
     MPEGH_DECODER_ERROR err;
     MPEGH_DECODER_OUTPUT_INFO out_info;
 
-    if (!avctx->sample_rate) {
-        av_log(avctx, AV_LOG_ERROR, "Audio sample rate is not set");
-        return AVERROR_INVALIDDATA;
-    }
-
     if (avpkt->data != NULL && avpkt->size > 0) {
-        if ((err = mpeghdecoder_processTimescale(s->decoder, avpkt->data,
-                                                 avpkt->size, avpkt->pts,
-                                                 avctx->sample_rate))) {
+        if ((err = mpeghdecoder_processTimescale(
+                 s->decoder, avpkt->data, avpkt->size,
+                 avpkt->pts * avctx->pkt_timebase.num, 
avctx->pkt_timebase.den))) {
             av_log(avctx, AV_LOG_ERROR, "mpeghdecoder_process() failed: %x\n",
                    err);
             return AVERROR_INVALIDDATA;
@@ -189,8 +184,7 @@ static int mpegh3dadec_decode_frame(AVCodecContext *avctx, 
AVFrame *frame,
     frame->nb_samples  = out_info.numSamplesPerChannel;
     frame->sample_rate = avctx->sample_rate = out_info.sampleRate;
     frame->pts = out_info.ticks;
-    frame->time_base.num = 1;
-    frame->time_base.den = out_info.sampleRate;
+    frame->time_base = av_make_q(1, out_info.sampleRate);
 
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
         return ret;
-- 
2.49.1

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to