Commit 46d13a8385 for ffmpeg

commit 46d13a83853b71739300cdce1d514f9be7d05a59
Author: Michael Niedermayer <michael@niedermayer.cc>
Date:   Sun Nov 8 17:17:19 2026 +0100

    avcodec/pcm-dvdenc: pad the last frame to a whole block

    The FATE test encodes 85 samples with and without a fixed frame size.

    Fixes: up to 3 samples dropped at the end of a 24 bit stream
    Testcase: ffmpeg -f lavfi -i "sine=r=48000,atrim=end_sample=85" -c:a pcm_dvd -sample_fmt s32 -f framecrc -

diff --git a/libavcodec/pcm-dvdenc.c b/libavcodec/pcm-dvdenc.c
index dc5224cc24..9d4d0c9e98 100644
--- a/libavcodec/pcm-dvdenc.c
+++ b/libavcodec/pcm-dvdenc.c
@@ -25,6 +25,7 @@
 #include "bytestream.h"
 #include "codec_internal.h"
 #include "encode.h"
+#include "internal.h"

 typedef struct PCMDVDContext {
     uint8_t header[3];       // Header added to every frame
@@ -107,6 +108,7 @@ static av_cold int pcm_dvd_encode_init(AVCodecContext *avctx)
     s->header[2] = 0x80;

     avctx->frame_size = frame_size;
+    avctx->internal->pad_samples = s->samples_per_block;

     return 0;
 }
@@ -179,8 +181,7 @@ const FFCodec ff_pcm_dvd_encoder = {
     CODEC_LONG_NAME("PCM signed 16|20|24-bit big-endian for DVD-Video media"),
     .p.type         = AVMEDIA_TYPE_AUDIO,
     .p.id           = AV_CODEC_ID_PCM_DVD,
-    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SMALL_LAST_FRAME |
-                      AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
+    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
     .priv_data_size = sizeof(PCMDVDContext),
     .init           = pcm_dvd_encode_init,
     FF_CODEC_ENCODE_CB(pcm_dvd_encode_frame),
diff --git a/tests/fate/pcm.mak b/tests/fate/pcm.mak
index 6046244491..f06004ea29 100644
--- a/tests/fate/pcm.mak
+++ b/tests/fate/pcm.mak
@@ -62,6 +62,14 @@ FATE_PCM-$(call TRANSCODE, PCM_DVD, MPEG2VOB MPEGPS, WAV_DEMUXER PCM_S16LE_DECOD
 fate-pcm_dvd-16-1-96000: tests/data/asynth-96000-1.wav
 fate-pcm_dvd-16-1-96000: CMD = transcode wav $(TARGET_PATH)/tests/data/asynth-96000-1.wav vob "-c:a pcm_dvd" "-t 0.2"

+FATE_PCM-$(call ALLYES, PCM_DVD_ENCODER LAVFI_INDEV SINE_FILTER ATRIM_FILTER ARESAMPLE_FILTER \
+                       PCM_S16$(if $(filter yes,$(HAVE_BIGENDIAN)),BE,LE)_DECODER FRAMECRC_MUXER PIPE_PROTOCOL) += fate-pcm-dvd-last-block
+fate-pcm-dvd-last-block: CMD = framecrc -auto_conversion_filters -f lavfi -i "sine=r=48000,atrim=end_sample=85" -c:a pcm_dvd -sample_fmt s32 -map 0:a -map 0:a -flags2:a:1 +fixed_frame_size
+
+FATE_PCM-$(call ALLYES, PCM_DVD_ENCODER LAVFI_INDEV SINE_FILTER ATRIM_FILTER ARESAMPLE_FILTER \
+                       PCM_S16$(if $(filter yes,$(HAVE_BIGENDIAN)),BE,LE)_DECODER FRAMECRC_MUXER PIPE_PROTOCOL) += fate-pcm-dvd-last-block-coarse-tb
+fate-pcm-dvd-last-block-coarse-tb: CMD = framecrc -auto_conversion_filters -f lavfi -i "sine=r=48000,atrim=end_sample=69" -c:a pcm_dvd -sample_fmt s32 -enc_time_base 1/1000
+
 # PCM Blu-ray encoder/decoder roundtrip tests (s16, locally generated sources)
 FATE_PCM_BLURAY_S16 = fate-pcm-bluray-s16-mono                                \
                       fate-pcm-bluray-s16-stereo                               \
diff --git a/tests/ref/fate/audio-enc-pcm-dvd-short-tail b/tests/ref/fate/audio-enc-pcm-dvd-short-tail
index c91c63430d..6eaef1ef30 100644
--- a/tests/ref/fate/audio-enc-pcm-dvd-short-tail
+++ b/tests/ref/fate/audio-enc-pcm-dvd-short-tail
@@ -4,3 +4,4 @@
 #sample_rate 0: 48000
 #channel_layout_name 0: mono
 0,          0,          0,      168,      507, 0x9073936f
+0,        168,        168,        3,       15, 0x2c84046b, S=1, Skip Samples,       10, 0x00060001
diff --git a/tests/ref/fate/pcm-dvd-last-block b/tests/ref/fate/pcm-dvd-last-block
new file mode 100644
index 0000000000..92d75383a7
--- /dev/null
+++ b/tests/ref/fate/pcm-dvd-last-block
@@ -0,0 +1,12 @@
+#tb 0: 1/48000
+#media_type 0: audio
+#codec_id 0: pcm_dvd
+#sample_rate 0: 48000
+#channel_layout_name 0: mono
+#tb 1: 1/48000
+#media_type 1: audio
+#codec_id 1: pcm_dvd
+#sample_rate 1: 48000
+#channel_layout_name 1: mono
+0,          0,          0,       85,      267, 0x7f3a49be, S=1, Skip Samples,       10, 0x00120003
+1,          0,          0,       85,      507, 0xa56549be, S=1, Skip Samples,       10, 0x01f20053
diff --git a/tests/ref/fate/pcm-dvd-last-block-coarse-tb b/tests/ref/fate/pcm-dvd-last-block-coarse-tb
new file mode 100644
index 0000000000..798d84fb4a
--- /dev/null
+++ b/tests/ref/fate/pcm-dvd-last-block-coarse-tb
@@ -0,0 +1,6 @@
+#tb 0: 1/1000
+#media_type 0: audio
+#codec_id 0: pcm_dvd
+#sample_rate 0: 48000
+#channel_layout_name 0: mono
+0,          0,          0,        1,      219, 0x99c43631, S=1, Skip Samples,       10, 0x00120003