[FFmpeg-cvslog] avcodec/ac3dec: only export matrix encoding and downmix info side data when necessary

James Almer git at videolan.org
Sun Jan 19 20:16:29 EET 2025


ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Wed Jan 15 22:19:54 2025 -0300| [bb033e69107b5baad5fcec63bd8cd0b6908a2041] | committer: James Almer

avcodec/ac3dec: only export matrix encoding and downmix info side data when necessary

Don't export a matrix encoding side data when there's none signaled.
And if downmixing was handled by the decoder itself, then the downmix info does
not apply to the frame.

Signed-off-by: James Almer <jamrial at gmail.com>

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

 libavcodec/ac3dec.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
index eb5cfd9818..ff8cbfb0b4 100644
--- a/libavcodec/ac3dec.c
+++ b/libavcodec/ac3dec.c
@@ -1500,7 +1500,6 @@ static int ac3_decode_frame(AVCodecContext *avctx, AVFrame *frame,
     uint8_t extended_channel_map[EAC3_MAX_CHANNELS];
     const SHORTFLOAT *output[AC3_MAX_CHANNELS];
     enum AVMatrixEncoding matrix_encoding;
-    AVDownmixInfo *downmix_info;
     uint64_t mask;
 
     s->superframe_size = 0;
@@ -1827,11 +1826,16 @@ skip:
             break;
         }
     }
-    if ((ret = ff_side_data_update_matrix_encoding(frame, matrix_encoding)) < 0)
+    if (matrix_encoding != AV_MATRIX_ENCODING_NONE &&
+        (ret = ff_side_data_update_matrix_encoding(frame, matrix_encoding)) < 0)
         return ret;
 
     /* AVDownmixInfo */
-    if ((downmix_info = av_downmix_info_update_side_data(frame))) {
+    if ( (s->channel_mode                     > AC3_CHMODE_STEREO) &&
+        ((s->output_mode & ~AC3_OUTPUT_LFEON) > AC3_CHMODE_STEREO)) {
+        AVDownmixInfo *downmix_info = av_downmix_info_update_side_data(frame);
+        if (!downmix_info)
+            return AVERROR(ENOMEM);
         switch (s->preferred_downmix) {
         case AC3_DMIXMOD_LTRT:
             downmix_info->preferred_downmix_type = AV_DOWNMIX_TYPE_LTRT;
@@ -1854,8 +1858,7 @@ skip:
             downmix_info->lfe_mix_level       = gain_levels_lfe[s->lfe_mix_level];
         else
             downmix_info->lfe_mix_level       = 0.0; // -inf dB
-    } else
-        return AVERROR(ENOMEM);
+    }
 
     *got_frame_ptr = 1;
 



More information about the ffmpeg-cvslog mailing list