|
29 | 29 | #include "iamf/common/write_bit_buffer.h" |
30 | 30 | #include "iamf/obu/obu_header.h" |
31 | 31 | #include "iamf/obu/param_definitions.h" |
| 32 | +#include "iamf/obu/param_definitions/cart16_param_definition.h" |
32 | 33 | #include "iamf/obu/param_definitions/cart8_param_definition.h" |
33 | 34 | #include "iamf/obu/param_definitions/dual_polar_param_definition.h" |
34 | 35 | #include "iamf/obu/param_definitions/polar_param_definition.h" |
@@ -827,6 +828,67 @@ TEST_F(MixPresentationObuTest, WritesRenderingConfigCart8ParamDefinition) { |
827 | 828 | InitAndTestWrite(); |
828 | 829 | } |
829 | 830 |
|
| 831 | +TEST_F(MixPresentationObuTest, WritesRenderingConfigCart16ParamDefinition) { |
| 832 | + Cart16ParamDefinition cart16_param_definition; |
| 833 | + cart16_param_definition.parameter_id_ = 1; |
| 834 | + cart16_param_definition.parameter_rate_ = 1; |
| 835 | + cart16_param_definition.param_definition_mode_ = false; |
| 836 | + cart16_param_definition.duration_ = 10; |
| 837 | + cart16_param_definition.constant_subblock_duration_ = 10; |
| 838 | + cart16_param_definition.default_x_ = 1; |
| 839 | + cart16_param_definition.default_y_ = 2; |
| 840 | + cart16_param_definition.default_z_ = 3; |
| 841 | + |
| 842 | + sub_mixes_[0].audio_elements[0].rendering_config = { |
| 843 | + .headphones_rendering_mode = |
| 844 | + RenderingConfig::kHeadphonesRenderingModeStereo, |
| 845 | + .reserved = 0, |
| 846 | + .rendering_config_param_definitions = |
| 847 | + {RenderingConfigParamDefinition::Create( |
| 848 | + ParamDefinition::ParameterDefinitionType:: |
| 849 | + kParameterDefinitionCart16, |
| 850 | + cart16_param_definition, {}) |
| 851 | + .value()}, |
| 852 | + .rendering_config_extension_bytes = {}}; |
| 853 | + |
| 854 | + expected_header_ = {kObuIaMixPresentation << 3, 60}; |
| 855 | + expected_payload_ = { |
| 856 | + // Start Mix OBU. |
| 857 | + 10, 1, 'e', 'n', '-', 'u', 's', '\0', 'M', 'i', 'x', ' ', '1', '\0', 1, |
| 858 | + // Start Submix 1 |
| 859 | + 1, 11, 'S', 'u', 'b', 'm', 'i', 'x', ' ', '1', '\0', |
| 860 | + // Start RenderingConfig. |
| 861 | + RenderingConfig::kHeadphonesRenderingModeStereo << 6, |
| 862 | + // `rendering_config_extension_bytes size`. |
| 863 | + 13, |
| 864 | + // Start RenderingConfigParamDefinitions. |
| 865 | + // `num_parameters`. |
| 866 | + 1, |
| 867 | + // `param_definition_type`. |
| 868 | + ParamDefinition::ParameterDefinitionType::kParameterDefinitionCart16, |
| 869 | + // `param_definition`. |
| 870 | + 1, // parameter_id |
| 871 | + 1, // parameter_rate |
| 872 | + 0, // mode |
| 873 | + 10, // duration |
| 874 | + 10, // constant_subblock_duration |
| 875 | + // default_x = 1 (16 bits) |
| 876 | + // default_y = 2 (16 bits) |
| 877 | + // default_z = 3 (16 bits) |
| 878 | + 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, |
| 879 | + // End RenderingConfigParamDefinitions. |
| 880 | + // End RenderingConfig. |
| 881 | + 12, 13, 0x80, 0, 14, 15, 16, 0x80, 0, 17, 1, |
| 882 | + // Start Layout 1 (of Submix 1). |
| 883 | + (Layout::kLayoutTypeLoudspeakersSsConvention << 6) | |
| 884 | + LoudspeakersSsConventionLayout::kSoundSystemA_0_2_0, |
| 885 | + LoudnessInfo::kTruePeak, 0, 18, 0, 19, 0, 20 |
| 886 | + // End Mix OBU. |
| 887 | + }; |
| 888 | + |
| 889 | + InitAndTestWrite(); |
| 890 | +} |
| 891 | + |
830 | 892 | TEST_F(MixPresentationObuTest, WritesRenderingConfigDualPolarParamDefinition) { |
831 | 893 | DualPolarParamDefinition dual_polar_param_definition; |
832 | 894 | dual_polar_param_definition.parameter_id_ = 1; |
@@ -1588,6 +1650,84 @@ TEST(ReadSubMixAudioElementTest, Cart8ParamDefinitionRenderingConfig) { |
1588 | 1650 | EXPECT_EQ(audio_element, expected_submix_audio_element); |
1589 | 1651 | } |
1590 | 1652 |
|
| 1653 | +TEST(ReadSubMixAudioElementTest, Cart16ParamDefinitionRenderingConfig) { |
| 1654 | + std::vector<uint8_t> source = { |
| 1655 | + // Start SubMixAudioElement. |
| 1656 | + // audio_element_id |
| 1657 | + 11, |
| 1658 | + // localized_element_annotations[0] |
| 1659 | + 'S', 'u', 'b', 'm', 'i', 'x', ' ', '1', '\0', |
| 1660 | + // Start RenderingConfig. |
| 1661 | + RenderingConfig::kHeadphonesRenderingModeBinaural << 6, |
| 1662 | + /*rendering_config_extension_size=*/13, |
| 1663 | + // num_params |
| 1664 | + 1, |
| 1665 | + // Start RenderingConfigParamDefinition. |
| 1666 | + // `param_definition_type`. |
| 1667 | + ParamDefinition::ParameterDefinitionType::kParameterDefinitionCart16, |
| 1668 | + // `param_definition`. |
| 1669 | + 1, // parameter_id |
| 1670 | + 1, // parameter_rate |
| 1671 | + 0, // mode |
| 1672 | + 10, // duration |
| 1673 | + 10, // constant_subblock_duration |
| 1674 | + // default_x = 1 |
| 1675 | + // default_y = 2 |
| 1676 | + // default_z = 3 |
| 1677 | + 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, |
| 1678 | + // End RenderingConfig. |
| 1679 | + // Start ElementMixGain |
| 1680 | + // Parameter ID. |
| 1681 | + 0x00, |
| 1682 | + // Parameter Rate. |
| 1683 | + 1, |
| 1684 | + // Param Definition Mode (upper bit), next 7 bits reserved. |
| 1685 | + 0x80, |
| 1686 | + // Default Mix Gain. |
| 1687 | + 0, 4 |
| 1688 | + // End ElementMixGain |
| 1689 | + }; |
| 1690 | + auto buffer = |
| 1691 | + MemoryBasedReadBitBuffer::CreateFromSpan(absl::MakeConstSpan(source)); |
| 1692 | + SubMixAudioElement audio_element; |
| 1693 | + EXPECT_THAT(audio_element.ReadAndValidate(/*count_label=*/1, *buffer), |
| 1694 | + IsOk()); |
| 1695 | + |
| 1696 | + Cart16ParamDefinition cart16_param_definition; |
| 1697 | + cart16_param_definition.parameter_id_ = 1; |
| 1698 | + cart16_param_definition.parameter_rate_ = 1; |
| 1699 | + cart16_param_definition.param_definition_mode_ = false; |
| 1700 | + cart16_param_definition.duration_ = 10; |
| 1701 | + cart16_param_definition.constant_subblock_duration_ = 10; |
| 1702 | + cart16_param_definition.default_x_ = 1; |
| 1703 | + cart16_param_definition.default_y_ = 2; |
| 1704 | + cart16_param_definition.default_z_ = 3; |
| 1705 | + |
| 1706 | + // Set up expected values. |
| 1707 | + SubMixAudioElement expected_submix_audio_element = SubMixAudioElement{ |
| 1708 | + .audio_element_id = 11, |
| 1709 | + .localized_element_annotations = {"Submix 1"}, |
| 1710 | + .rendering_config = |
| 1711 | + { |
| 1712 | + .headphones_rendering_mode = |
| 1713 | + RenderingConfig::kHeadphonesRenderingModeBinaural, |
| 1714 | + .reserved = 0, |
| 1715 | + .rendering_config_param_definitions = |
| 1716 | + {RenderingConfigParamDefinition::Create( |
| 1717 | + ParamDefinition::kParameterDefinitionCart16, |
| 1718 | + cart16_param_definition, {}) |
| 1719 | + .value()}, |
| 1720 | + .rendering_config_extension_bytes = {}, |
| 1721 | + }, |
| 1722 | + .element_mix_gain = MixGainParamDefinition()}; |
| 1723 | + expected_submix_audio_element.element_mix_gain.parameter_id_ = 0; |
| 1724 | + expected_submix_audio_element.element_mix_gain.parameter_rate_ = 1; |
| 1725 | + expected_submix_audio_element.element_mix_gain.param_definition_mode_ = true; |
| 1726 | + expected_submix_audio_element.element_mix_gain.reserved_ = 0; |
| 1727 | + expected_submix_audio_element.element_mix_gain.default_mix_gain_ = 4; |
| 1728 | + EXPECT_EQ(audio_element, expected_submix_audio_element); |
| 1729 | +} |
| 1730 | + |
1591 | 1731 | TEST(ReadSubMixAudioElementTest, DualPolarParamDefinitionRenderingConfig) { |
1592 | 1732 | std::vector<uint8_t> source = { |
1593 | 1733 | // Start SubMixAudioElement. |
@@ -1767,6 +1907,22 @@ TEST(RenderingConfigParamDefinitionCreate, SucceedsWithCart8ParamDefinition) { |
1767 | 1907 | testing::ElementsAreArray(kParamDefinitionBytes)); |
1768 | 1908 | } |
1769 | 1909 |
|
| 1910 | +TEST(RenderingConfigParamDefinitionCreate, SucceedsWithCart16ParamDefinition) { |
| 1911 | + const auto kParamDefinitionBytes = std::vector<uint8_t>({1, 2, 3, 4, 5, 123}); |
| 1912 | + auto rendering_config_param_definition = |
| 1913 | + RenderingConfigParamDefinition::Create( |
| 1914 | + ParamDefinition::kParameterDefinitionCart16, Cart16ParamDefinition(), |
| 1915 | + kParamDefinitionBytes); |
| 1916 | + EXPECT_THAT(rendering_config_param_definition, IsOk()); |
| 1917 | + |
| 1918 | + EXPECT_EQ(rendering_config_param_definition->param_definition_type, |
| 1919 | + ParamDefinition::kParameterDefinitionCart16); |
| 1920 | + EXPECT_TRUE(std::holds_alternative<Cart16ParamDefinition>( |
| 1921 | + rendering_config_param_definition->param_definition)); |
| 1922 | + EXPECT_THAT(rendering_config_param_definition->param_definition_bytes, |
| 1923 | + testing::ElementsAreArray(kParamDefinitionBytes)); |
| 1924 | +} |
| 1925 | + |
1770 | 1926 | TEST(RenderingConfigParamDefinitionCreate, |
1771 | 1927 | SucceedsWithDualPolarParamDefinition) { |
1772 | 1928 | const auto kParamDefinitionBytes = std::vector<uint8_t>({1, 2, 3, 4, 5, 123}); |
@@ -1867,6 +2023,40 @@ TEST(RenderingConfigParamDefinitionCreateFromBufferTest, |
1867 | 2023 | EXPECT_EQ(param_definition.default_z_, 3); |
1868 | 2024 | } |
1869 | 2025 |
|
| 2026 | +TEST(RenderingConfigParamDefinitionCreateFromBufferTest, |
| 2027 | + SucceedsWithCart16ParamDefinition) { |
| 2028 | + std::vector<uint8_t> source = {// `param_definition_type`. |
| 2029 | + ParamDefinition::kParameterDefinitionCart16, |
| 2030 | + 1, // parameter_id |
| 2031 | + 1, // parameter_rate |
| 2032 | + 0, // mode |
| 2033 | + 10, // duration |
| 2034 | + 10, // constant_subblock_duration |
| 2035 | + // default_x = 1 (16 bits) |
| 2036 | + // default_y = 2 (16 bits) |
| 2037 | + // default_z = 3 (16 bits) |
| 2038 | + 0x00, 0x01, 0x00, 0x02, 0x00, 0x03}; |
| 2039 | + auto buffer = |
| 2040 | + MemoryBasedReadBitBuffer::CreateFromSpan(absl::MakeConstSpan(source)); |
| 2041 | + |
| 2042 | + auto rendering_config_param_definition = |
| 2043 | + RenderingConfigParamDefinition::CreateFromBuffer(*buffer); |
| 2044 | + EXPECT_THAT(rendering_config_param_definition, IsOk()); |
| 2045 | + |
| 2046 | + EXPECT_EQ(rendering_config_param_definition->param_definition_type, |
| 2047 | + ParamDefinition::kParameterDefinitionCart16); |
| 2048 | + EXPECT_TRUE(std::holds_alternative<Cart16ParamDefinition>( |
| 2049 | + rendering_config_param_definition->param_definition)); |
| 2050 | + const auto& param_definition = std::get<Cart16ParamDefinition>( |
| 2051 | + rendering_config_param_definition->param_definition); |
| 2052 | + EXPECT_EQ(param_definition.parameter_id_, 1); |
| 2053 | + EXPECT_EQ(param_definition.parameter_rate_, 1); |
| 2054 | + EXPECT_FALSE(param_definition.param_definition_mode_); |
| 2055 | + EXPECT_EQ(param_definition.default_x_, 1); |
| 2056 | + EXPECT_EQ(param_definition.default_y_, 2); |
| 2057 | + EXPECT_EQ(param_definition.default_z_, 3); |
| 2058 | +} |
| 2059 | + |
1870 | 2060 | TEST(RenderingConfigParamDefinitionCreateFromBufferTest, |
1871 | 2061 | SucceedsWithDualPolarParamDefinition) { |
1872 | 2062 | std::vector<uint8_t> source = {// `param_definition_type`. |
|
0 commit comments