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]
