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.
Unified · Split
| @@ -1500,7 +1500,6 @@ static int ac3_decode_frame(AVCodecContext *avctx, AVFrame *frame, · 1499 unmodified lines | |||
| 1500 | uint8_t extended_channel_map[EAC3_MAX_CHANNELS]; | 1500 | uint8_t extended_channel_map[EAC3_MAX_CHANNELS]; |
| 1501 | const SHORTFLOAT *output[AC3_MAX_CHANNELS]; | 1501 | const SHORTFLOAT *output[AC3_MAX_CHANNELS]; |
| 1502 | enum AVMatrixEncoding matrix_encoding; | 1502 | enum AVMatrixEncoding matrix_encoding; |
| 1503 | AVDownmixInfo *downmix_info; | ||
| 1504 | uint64_t mask; | 1503 | uint64_t mask; |
| 1505 | 1504 | ||
| 1506 | s->superframe_size = 0; | 1505 | s->superframe_size = 0; |
| @@ -1827,11 +1826,16 @@ skip: · 320 unmodified lines | |||
| 1827 | break; | 1826 | break; |
| 1828 | } | 1827 | } |
| 1829 | } | 1828 | } |
| 1830 | if ((ret = ff_side_data_update_matrix_encoding(frame, matrix_encoding)) < 0) | 1829 | if (matrix_encoding != AV_MATRIX_ENCODING_NONE && |
| 1830 | (ret = ff_side_data_update_matrix_encoding(frame, matrix_encoding)) < 0) | ||
| 1831 | return ret; | 1831 | return ret; |
| 1832 | 1832 | ||
| 1833 | /* AVDownmixInfo */ | 1833 | /* AVDownmixInfo */ |
| 1834 | if ((downmix_info = av_downmix_info_update_side_data(frame))) { | 1834 | if ( (s->channel_mode > AC3_CHMODE_STEREO) && |
| 1835 | ((s->output_mode & ~AC3_OUTPUT_LFEON) > AC3_CHMODE_STEREO)) { | ||
| 1836 | AVDownmixInfo *downmix_info = av_downmix_info_update_side_data(frame); | ||
| 1837 | if (!downmix_info) | ||
| 1838 | return AVERROR(ENOMEM); | ||
| 1835 | switch (s->preferred_downmix) { | 1839 | switch (s->preferred_downmix) { |
| 1836 | case AC3_DMIXMOD_LTRT: | 1840 | case AC3_DMIXMOD_LTRT: |
| 1837 | downmix_info->preferred_downmix_type = AV_DOWNMIX_TYPE_LTRT; | 1841 | downmix_info->preferred_downmix_type = AV_DOWNMIX_TYPE_LTRT; |
| @@ -1854,8 +1858,7 @@ skip: · 16 unmodified lines | |||
| 1854 | downmix_info->lfe_mix_level = gain_levels_lfe[s->lfe_mix_level]; | 1858 | downmix_info->lfe_mix_level = gain_levels_lfe[s->lfe_mix_level]; |
| 1855 | else | 1859 | else |
| 1856 | downmix_info->lfe_mix_level = 0.0; // -inf dB | 1860 | downmix_info->lfe_mix_level = 0.0; // -inf dB |
| 1857 | } else | 1861 | } |
| 1858 | return AVERROR(ENOMEM); | ||
| 1859 | 1862 | ||
| 1860 | *got_frame_ptr = 1; | 1863 | *got_frame_ptr = 1; |
| 1861 | 1864 | ||