diff --git a/NEWS.md b/NEWS.md index 9394d76fc..343005b30 100644 --- a/NEWS.md +++ b/NEWS.md @@ -25,6 +25,9 @@ automatically anymore whenever the segment info section is edited and the `date` element is either deleted or not present in the first place. Fixes #2143. +* mkvmerge: AAC ADTS parser: fixed interpretation of the + `channel_configuration` header element for ADTS files that do not contain a + program configuration element: value 7 means 7.1 channels. Fixes #2151. # Version 17.0.0 "Be Ur Friend" 2017-10-14 diff --git a/src/common/aac.cpp b/src/common/aac.cpp index 7d16e0cbf..e3a1c5987 100644 --- a/src/common/aac.cpp +++ b/src/common/aac.cpp @@ -26,12 +26,18 @@ namespace mtx { namespace aac { +// See ISO/IEC 14496-3, table 1.16 — Sampling Frequency Index static unsigned int const s_sampling_freq[16] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0 // filling }; +// See ISO/IEC 14496-3, table 1.17 — Channel Configuration +static unsigned int const s_adts_channels[8] = { + 0, 1, 2, 3, 4, 5, 6, 8, +}; + static debugging_option_c s_debug_parse_data{"aac_parse_audio_specific_config|aac_full"}; unsigned int @@ -540,7 +546,7 @@ parser_c::decode_adts_header(unsigned char const *buffer, frame.m_header.config.profile = bc.get_bits(2); int sfreq_index = bc.get_bits(4); bc.skip_bits(1); // private - frame.m_header.config.channels = bc.get_bits(3); + frame.m_header.config.channels = s_adts_channels[bc.get_bits(3)]; bc.skip_bits(1 + 1); // original/copy & home bc.skip_bits(1 + 1); // copyright_id_bit & copyright_id_start diff --git a/tests/results.txt b/tests/results.txt index 89f6a996e..e5e837e1a 100644 --- a/tests/results.txt +++ b/tests/results.txt @@ -467,3 +467,4 @@ T_618e_ac_3_with_core_and_extensions_in_different_blocks:ec4879f47904cc21476dbc5 T_619ac_3_misdetected_as_mpeg_ps_and_encrypted:795e9be4c1601e9853378a1fee1bfd01:passed:20171007-172620:0.015403278 T_620ac3_incomplete_frame_with_timestamp_from_matroska:b2fa8c28c5a45d40460905464e3a3d5f:passed:20171014-153427:0.397688103 T_621propedit_remove_date:fdfebfa48bbd5fc21088827b0ad8f616-ok:passed:20171101-180348:0.062479826 +T_622aac_adts_8_channels_no_pce:76a81307fdd14e0c033ea8e9b42a2b78-ok:passed:20171117-190136:0.053130324 diff --git a/tests/test-622aac_adts_8_channels_no_pce.rb b/tests/test-622aac_adts_8_channels_no_pce.rb new file mode 100755 index 000000000..5fb53c724 --- /dev/null +++ b/tests/test-622aac_adts_8_channels_no_pce.rb @@ -0,0 +1,13 @@ +#!/usr/bin/ruby -w + +file = "data/aac/7_1_channels_no_pce.aac" + +# T_622aac_adts_8_channels_no_pce +describe "mkvmerge / ADTS AAC files with 7.1 channels without a program config element" + +test_merge file + +test "identification" do + fail unless identify_json(file)["tracks"][0]["properties"]["audio_channels"] == 8 + "ok" +end