PR #21746 opened by James Almer (jamrial)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21746
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21746.patch


>From c42c5fe94c4332a6ef758dca617f5e8cb8aa894b Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Fri, 13 Feb 2026 13:00:10 -0300
Subject: [PATCH 1/6] avcodec/encode: add a helper to convert from a duration
 to samples

Signed-off-by: James Almer <[email protected]>
---
 libavcodec/encode.h | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/libavcodec/encode.h b/libavcodec/encode.h
index 82bd3c9431..b66b387030 100644
--- a/libavcodec/encode.h
+++ b/libavcodec/encode.h
@@ -99,6 +99,18 @@ static av_always_inline int64_t 
ff_samples_to_time_base(const AVCodecContext *av
                         avctx->time_base);
 }
 
+/**
+ * Rescale from time base to AVCodecContext.sample_rate.
+ */
+static av_always_inline int64_t ff_samples_from_time_base(const AVCodecContext 
*avctx,
+                                                          int64_t duration)
+{
+    if (!duration)
+        return duration;
+    return av_rescale_q(duration, avctx->time_base,
+                        (AVRational){ 1, avctx->sample_rate });
+}
+
 /**
  * Check if the elements of codec context matrices (intra_matrix, inter_matrix 
or
  * chroma_intra_matrix) are within the specified range.
-- 
2.52.0


>From 6ce1c604682b9a4a2429aaac2e0b8cd4d3854f2c Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Fri, 13 Feb 2026 13:01:28 -0300
Subject: [PATCH 2/6] avcodec/libfdk-aacenc: rescale packet duration when
 calculating discarded samples

Signed-off-by: James Almer <[email protected]>
---
 libavcodec/libfdk-aacenc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/libfdk-aacenc.c b/libavcodec/libfdk-aacenc.c
index 1a3f127d37..6c28633fba 100644
--- a/libavcodec/libfdk-aacenc.c
+++ b/libavcodec/libfdk-aacenc.c
@@ -530,7 +530,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket 
*avpkt,
     ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts,
                        &avpkt->duration);
 
-    discard_padding = avctx->frame_size - avpkt->duration;
+    discard_padding = avctx->frame_size - ff_samples_from_time_base(avctx, 
avpkt->duration);
     // Check if subtraction resulted in an overflow
     if ((discard_padding < avctx->frame_size) != (avpkt->duration > 0)) {
         av_log(avctx, AV_LOG_ERROR, "discard padding overflow\n");
-- 
2.52.0


>From 35bbcdf7efdacd9f92dfd8cac6b676d169d08669 Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Fri, 13 Feb 2026 13:01:54 -0300
Subject: [PATCH 3/6] avcodec/libmp3lame: rescale packet duration when
 calculating discarded samples

Signed-off-by: James Almer <[email protected]>
---
 libavcodec/libmp3lame.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/libmp3lame.c b/libavcodec/libmp3lame.c
index 01b8985b8c..339505ccfe 100644
--- a/libavcodec/libmp3lame.c
+++ b/libavcodec/libmp3lame.c
@@ -285,7 +285,7 @@ static int mp3lame_encode_frame(AVCodecContext *avctx, 
AVPacket *avpkt,
         ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts,
                            &avpkt->duration);
 
-        discard_padding = avctx->frame_size - avpkt->duration;
+        discard_padding = avctx->frame_size - ff_samples_from_time_base(avctx, 
avpkt->duration);
         // Check if subtraction resulted in an overflow
         if ((discard_padding < avctx->frame_size) != (avpkt->duration > 0)) {
             av_log(avctx, AV_LOG_ERROR, "discard padding overflow\n");
-- 
2.52.0


>From 7f3199617cc6add47b7d74e4ea1c658b74baf9c3 Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Fri, 13 Feb 2026 13:02:07 -0300
Subject: [PATCH 4/6] avcodec/libopusenc: rescale packet duration when
 calculating discarded samples

Signed-off-by: James Almer <[email protected]>
---
 libavcodec/libopusenc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c
index 131886c8ea..927776bbca 100644
--- a/libavcodec/libopusenc.c
+++ b/libavcodec/libopusenc.c
@@ -511,7 +511,7 @@ static int libopus_encode(AVCodecContext *avctx, AVPacket 
*avpkt,
     ff_af_queue_remove(&opus->afq, opus->opts.packet_size,
                        &avpkt->pts, &avpkt->duration);
 
-    discard_padding = opus->opts.packet_size - avpkt->duration;
+    discard_padding = opus->opts.packet_size - 
ff_samples_from_time_base(avctx, avpkt->duration);
     // Check if subtraction resulted in an overflow
     if ((discard_padding < opus->opts.packet_size) != (avpkt->duration > 0))
         return AVERROR(EINVAL);
-- 
2.52.0


>From ff2b1a636f5d33848da4f2e37d33fba6bb6cec6c Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Fri, 13 Feb 2026 13:02:20 -0300
Subject: [PATCH 5/6] avcodec/libvorbisenc: rescale packet duration when
 calculating discarded samples

Signed-off-by: James Almer <[email protected]>
---
 libavcodec/libvorbisenc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/libvorbisenc.c b/libavcodec/libvorbisenc.c
index a3f02f3cb9..c54ebebae8 100644
--- a/libavcodec/libvorbisenc.c
+++ b/libavcodec/libvorbisenc.c
@@ -421,7 +421,7 @@ static int libvorbis_encode_frame(AVCodecContext *avctx, 
AVPacket *avpkt,
 
         ff_af_queue_remove(&s->afq, duration, &avpkt->pts, &avpkt->duration);
 
-        discard_padding = ff_samples_to_time_base(avctx, duration) - 
avpkt->duration;
+        discard_padding = duration - ff_samples_from_time_base(avctx, 
avpkt->duration);
         if (discard_padding > 0) {
             uint8_t *side_data = av_packet_new_side_data(avpkt,
                                                          
AV_PKT_DATA_SKIP_SAMPLES,
-- 
2.52.0


>From 9241f44121715428a71bb42383c3661663e1cf93 Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Fri, 13 Feb 2026 13:03:26 -0300
Subject: [PATCH 6/6] avcodec/opus/enc: rescale packet duration when
 calculating discarded samples

Signed-off-by: James Almer <[email protected]>
---
 libavcodec/opus/enc.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/libavcodec/opus/enc.c b/libavcodec/opus/enc.c
index 65e6a09575..587e4ed69d 100644
--- a/libavcodec/opus/enc.c
+++ b/libavcodec/opus/enc.c
@@ -548,7 +548,7 @@ static int opus_encode_frame(AVCodecContext *avctx, 
AVPacket *avpkt,
                              const AVFrame *frame, int *got_packet_ptr)
 {
     OpusEncContext *s = avctx->priv_data;
-    int ret, frame_size, alloc_size = 0;
+    int ret, frame_size, discard_padding, alloc_size = 0;
 
     if (frame) { /* Add new frame to queue */
         if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
@@ -600,11 +600,13 @@ static int opus_encode_frame(AVCodecContext *avctx, 
AVPacket *avpkt,
 
     /* Remove samples from queue and skip if needed */
     ff_af_queue_remove(&s->afq, s->packet.frames*frame_size, &avpkt->pts, 
&avpkt->duration);
-    if (s->packet.frames*frame_size > avpkt->duration) {
+
+    discard_padding = s->packet.frames*frame_size - 
ff_samples_from_time_base(avctx, avpkt->duration);
+    if (discard_padding > 0) {
         uint8_t *side = av_packet_new_side_data(avpkt, 
AV_PKT_DATA_SKIP_SAMPLES, 10);
         if (!side)
             return AVERROR(ENOMEM);
-        AV_WL32(&side[4], s->packet.frames*frame_size - avpkt->duration);
+        AV_WL32(&side[4], discard_padding);
     }
 
     *got_packet_ptr = 1;
-- 
2.52.0

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

Reply via email to