[FFmpeg-cvslog] avformat/iamf_writer: fix setting skip_samples and discard_padding for OPUS

Felicia Lim git at videolan.org
Mon Apr 14 23:26:11 EEST 2025


ffmpeg | branch: master | Felicia Lim <flim at google.com> | Wed Feb 12 16:58:26 2025 -0800| [d36883f1196bb7c5e702c7f36aa4762068150dc2] | committer: James Almer

avformat/iamf_writer: fix setting skip_samples and discard_padding for OPUS

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d36883f1196bb7c5e702c7f36aa4762068150dc2
---

 libavformat/iamf_writer.c | 25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/libavformat/iamf_writer.c b/libavformat/iamf_writer.c
index acac6b87eb..60a0990504 100644
--- a/libavformat/iamf_writer.c
+++ b/libavformat/iamf_writer.c
@@ -1115,6 +1115,8 @@ int ff_iamf_write_audio_frame(const IAMFContext *iamf, AVIOContext *pb,
 {
     uint8_t header[MAX_IAMF_OBU_HEADER_SIZE];
     PutBitContext pbc;
+    const IAMFAudioElement *audio_element;
+    IAMFCodecConfig *codec_config;
     AVIOContext *dyn_bc;
     const uint8_t *side_data;
     uint8_t *dyn_buf = NULL;
@@ -1124,9 +1126,14 @@ int ff_iamf_write_audio_frame(const IAMFContext *iamf, AVIOContext *pb,
                          audio_substream_id + IAMF_OBU_IA_AUDIO_FRAME_ID0 : IAMF_OBU_IA_AUDIO_FRAME;
     int ret;
 
+    audio_element = get_audio_element(iamf, audio_substream_id);
+    if (!audio_element)
+        return AVERROR(EINVAL);
+    codec_config = ff_iamf_get_codec_config(iamf, audio_element->codec_config_id);
+    if (!codec_config)
+        return AVERROR(EINVAL);
+
     if (!pkt->size) {
-        const IAMFAudioElement *audio_element;
-        IAMFCodecConfig *codec_config;
         size_t new_extradata_size;
         const uint8_t *new_extradata = av_packet_get_side_data(pkt,
                                                                AV_PKT_DATA_NEW_EXTRADATA,
@@ -1134,12 +1141,6 @@ int ff_iamf_write_audio_frame(const IAMFContext *iamf, AVIOContext *pb,
 
         if (!new_extradata)
             return AVERROR_INVALIDDATA;
-        audio_element = get_audio_element(iamf, audio_substream_id);
-        if (!audio_element)
-            return AVERROR(EINVAL);
-        codec_config = ff_iamf_get_codec_config(iamf, audio_element->codec_config_id);
-        if (!codec_config)
-            return AVERROR(EINVAL);
 
         av_free(codec_config->extradata);
         codec_config->extradata = av_memdup(new_extradata, new_extradata_size);
@@ -1160,6 +1161,14 @@ int ff_iamf_write_audio_frame(const IAMFContext *iamf, AVIOContext *pb,
         discard_padding = AV_RL32(side_data + 4);
     }
 
+    if (codec_config->codec_id == AV_CODEC_ID_OPUS) {
+        // IAMF's num_samples_to_trim_at_start is the same as Opus's pre-skip.
+        skip_samples = pkt->dts < 0
+            ? av_rescale(-pkt->dts, 48000, pkt->time_base.den)
+            : 0;
+        discard_padding = av_rescale(discard_padding, 48000, pkt->time_base.den);
+    }
+
     ret = avio_open_dyn_buf(&dyn_bc);
     if (ret < 0)
         return ret;



More information about the ffmpeg-cvslog mailing list