Downmix: Test to 22.2

Test: atest downmix_benchmark
Test: atest downmix_tests
Bug: 187062102
Change-Id: Ic528171121222daf57470ce81b797683e90c4450
diff --git a/media/libeffects/downmix/benchmark/downmix_benchmark.cpp b/media/libeffects/downmix/benchmark/downmix_benchmark.cpp
index 8d3a34a..ee169c2 100644
--- a/media/libeffects/downmix/benchmark/downmix_benchmark.cpp
+++ b/media/libeffects/downmix/benchmark/downmix_benchmark.cpp
@@ -30,30 +30,30 @@
 extern audio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM;
 
 static constexpr audio_channel_mask_t kChannelPositionMasks[] = {
-//    AUDIO_CHANNEL_OUT_MONO,
-//    AUDIO_CHANNEL_OUT_FRONT_CENTER,
+    AUDIO_CHANNEL_OUT_FRONT_LEFT,
+    AUDIO_CHANNEL_OUT_FRONT_CENTER,
     AUDIO_CHANNEL_OUT_STEREO,
     AUDIO_CHANNEL_OUT_2POINT1,
-//    AUDIO_CHANNEL_OUT_2POINT0POINT2,
+    AUDIO_CHANNEL_OUT_2POINT0POINT2,
     AUDIO_CHANNEL_OUT_QUAD,
     AUDIO_CHANNEL_OUT_QUAD_BACK,
     AUDIO_CHANNEL_OUT_QUAD_SIDE,
     AUDIO_CHANNEL_OUT_SURROUND,
-//    AUDIO_CHANNEL_OUT_2POINT1POINT2,
-//    AUDIO_CHANNEL_OUT_3POINT0POINT2,
+    AUDIO_CHANNEL_OUT_2POINT1POINT2,
+    AUDIO_CHANNEL_OUT_3POINT0POINT2,
     AUDIO_CHANNEL_OUT_PENTA,
-//    AUDIO_CHANNEL_OUT_3POINT1POINT2,
+    AUDIO_CHANNEL_OUT_3POINT1POINT2,
     AUDIO_CHANNEL_OUT_5POINT1,
     AUDIO_CHANNEL_OUT_5POINT1_BACK,
     AUDIO_CHANNEL_OUT_5POINT1_SIDE,
     AUDIO_CHANNEL_OUT_6POINT1,
-//    AUDIO_CHANNEL_OUT_5POINT1POINT2,
+    AUDIO_CHANNEL_OUT_5POINT1POINT2,
     AUDIO_CHANNEL_OUT_7POINT1,
-//    AUDIO_CHANNEL_OUT_5POINT1POINT4,
-//    AUDIO_CHANNEL_OUT_7POINT1POINT2,
-//    AUDIO_CHANNEL_OUT_7POINT1POINT4,
-//    AUDIO_CHANNEL_OUT_13POINT_360RA,
-//    AUDIO_CHANNEL_OUT_22POINT2,
+    AUDIO_CHANNEL_OUT_5POINT1POINT4,
+    AUDIO_CHANNEL_OUT_7POINT1POINT2,
+    AUDIO_CHANNEL_OUT_7POINT1POINT4,
+    AUDIO_CHANNEL_OUT_13POINT_360RA,
+    AUDIO_CHANNEL_OUT_22POINT2,
 };
 
 static constexpr effect_uuid_t downmix_uuid = {
@@ -64,32 +64,56 @@
 /*
 Pixel 3XL
 downmix_benchmark:
-  #BM_Downmix/0     4719 ns    4704 ns       148890
-  #BM_Downmix/1     5050 ns    5034 ns       139104
-  #BM_Downmix/2     1506 ns    1501 ns       466795
-  #BM_Downmix/3     1554 ns    1549 ns       444498
-  #BM_Downmix/4     1514 ns    1510 ns       463697
-  #BM_Downmix/5     4442 ns    4428 ns       158016
-  #BM_Downmix/6     4404 ns    4378 ns       159858
-  #BM_Downmix/7     4851 ns    4835 ns       144681
-  #BM_Downmix/8     4848 ns    4832 ns       144560
-  #BM_Downmix/9     4859 ns    4844 ns       144496
-  #BM_Downmix/10    5806 ns    5788 ns       120751
-  #BM_Downmix/11    5051 ns    5036 ns       138920
+  #BM_Downmix/0     4723 ns    4708 ns       148694
+  #BM_Downmix/1     4717 ns    4702 ns       148873
+  #BM_Downmix/2     4803 ns    4788 ns       145893
+  #BM_Downmix/3     5056 ns    5041 ns       139110
+  #BM_Downmix/4     4710 ns    4696 ns       149625
+  #BM_Downmix/5     1514 ns    1509 ns       463694
+  #BM_Downmix/6     1513 ns    1509 ns       463451
+  #BM_Downmix/7     1516 ns    1511 ns       463899
+  #BM_Downmix/8     4445 ns    4431 ns       157831
+  #BM_Downmix/9     5081 ns    5065 ns       138412
+  #BM_Downmix/10    4354 ns    4341 ns       161247
+  #BM_Downmix/11    4411 ns    4397 ns       158893
+  #BM_Downmix/12    4434 ns    4420 ns       157992
+  #BM_Downmix/13    4845 ns    4830 ns       144873
+  #BM_Downmix/14    4851 ns    4835 ns       144954
+  #BM_Downmix/15    4884 ns    4870 ns       144233
+  #BM_Downmix/16    5832 ns    5813 ns       120565
+  #BM_Downmix/17    5241 ns    5224 ns       133927
+  #BM_Downmix/18    5044 ns    5028 ns       139131
+  #BM_Downmix/19    5244 ns    5227 ns       132315
+  #BM_Downmix/20    5943 ns    5923 ns       117759
+  #BM_Downmix/21    5990 ns    5971 ns       117263
+  #BM_Downmix/22    4468 ns    4454 ns       156689
+  #BM_Downmix/23    7306 ns    7286 ns        95911
 --
 downmix_benchmark: (generic fold)
-  #BM_Downmix/0     4723 ns    4708 ns       148605
-  #BM_Downmix/1     5081 ns    5065 ns       137920
-  #BM_Downmix/2     4472 ns    4458 ns       160047
-  #BM_Downmix/3     4359 ns    4345 ns       158744
-  #BM_Downmix/4     4722 ns    4706 ns       149648
-  #BM_Downmix/5     4426 ns    4412 ns       158618
-  #BM_Downmix/6     4377 ns    4363 ns       160217
-  #BM_Downmix/7     5262 ns    5245 ns       133155
-  #BM_Downmix/8     5265 ns    5248 ns       132817
-  #BM_Downmix/9     5246 ns    5229 ns       133932
-  #BM_Downmix/10    5819 ns    5801 ns       120295
-  #BM_Downmix/11    6030 ns    6011 ns       116619
+  #BM_Downmix/0     4722 ns    4707 ns       149847
+  #BM_Downmix/1     4714 ns    4698 ns       148748
+  #BM_Downmix/2     4794 ns    4779 ns       145661
+  #BM_Downmix/3     5053 ns    5035 ns       139172
+  #BM_Downmix/4     4695 ns    4678 ns       149762
+  #BM_Downmix/5     4381 ns    4368 ns       159675
+  #BM_Downmix/6     4387 ns    4373 ns       160267
+  #BM_Downmix/7     4732 ns    4717 ns       148514
+  #BM_Downmix/8     4430 ns    4415 ns       158133
+  #BM_Downmix/9     5101 ns    5084 ns       138353
+  #BM_Downmix/10    4356 ns    4343 ns       160821
+  #BM_Downmix/11    4397 ns    4383 ns       159995
+  #BM_Downmix/12    4438 ns    4424 ns       158117
+  #BM_Downmix/13    5243 ns    5226 ns       133863
+  #BM_Downmix/14    5259 ns    5242 ns       131855
+  #BM_Downmix/15    5245 ns    5228 ns       133686
+  #BM_Downmix/16    5829 ns    5809 ns       120543
+  #BM_Downmix/17    5245 ns    5228 ns       133533
+  #BM_Downmix/18    5935 ns    5916 ns       118282
+  #BM_Downmix/19    5263 ns    5245 ns       133657
+  #BM_Downmix/20    5998 ns    5978 ns       114693
+  #BM_Downmix/21    5989 ns    5969 ns       117450
+  #BM_Downmix/22    4442 ns    4431 ns       157913
+  #BM_Downmix/23    7309 ns    7290 ns        95797
 */
 
 static void BM_Downmix(benchmark::State& state) {
diff --git a/media/libeffects/downmix/tests/downmix_tests.cpp b/media/libeffects/downmix/tests/downmix_tests.cpp
index 3da6cc2..d4b7a3a 100644
--- a/media/libeffects/downmix/tests/downmix_tests.cpp
+++ b/media/libeffects/downmix/tests/downmix_tests.cpp
@@ -26,32 +26,37 @@
 
 extern audio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM;
 static constexpr audio_channel_mask_t kChannelPositionMasks[] = {
-//    AUDIO_CHANNEL_OUT_MONO,
-//    AUDIO_CHANNEL_OUT_FRONT_CENTER,
+    AUDIO_CHANNEL_OUT_FRONT_LEFT, // Legacy: the downmix effect treats MONO as FRONT_LEFT only.
+                                  // The AudioMixer interprets MONO as a special case requiring
+                                  // channel replication, bypassing the downmix effect.
+    AUDIO_CHANNEL_OUT_FRONT_CENTER,
     AUDIO_CHANNEL_OUT_STEREO,
     AUDIO_CHANNEL_OUT_2POINT1,
-//    AUDIO_CHANNEL_OUT_2POINT0POINT2,
+    AUDIO_CHANNEL_OUT_2POINT0POINT2,
     AUDIO_CHANNEL_OUT_QUAD,
     AUDIO_CHANNEL_OUT_QUAD_BACK,
     AUDIO_CHANNEL_OUT_QUAD_SIDE,
     AUDIO_CHANNEL_OUT_SURROUND,
-//    AUDIO_CHANNEL_OUT_2POINT1POINT2,
-//    AUDIO_CHANNEL_OUT_3POINT0POINT2,
+    AUDIO_CHANNEL_OUT_2POINT1POINT2,
+    AUDIO_CHANNEL_OUT_3POINT0POINT2,
     AUDIO_CHANNEL_OUT_PENTA,
-//    AUDIO_CHANNEL_OUT_3POINT1POINT2,
+    AUDIO_CHANNEL_OUT_3POINT1POINT2,
     AUDIO_CHANNEL_OUT_5POINT1,
     AUDIO_CHANNEL_OUT_5POINT1_BACK,
     AUDIO_CHANNEL_OUT_5POINT1_SIDE,
     AUDIO_CHANNEL_OUT_6POINT1,
-//    AUDIO_CHANNEL_OUT_5POINT1POINT2,
+    AUDIO_CHANNEL_OUT_5POINT1POINT2,
     AUDIO_CHANNEL_OUT_7POINT1,
-//    AUDIO_CHANNEL_OUT_5POINT1POINT4,
-//    AUDIO_CHANNEL_OUT_7POINT1POINT2,
-//    AUDIO_CHANNEL_OUT_7POINT1POINT4,
-//    AUDIO_CHANNEL_OUT_13POINT_360RA,
-//    AUDIO_CHANNEL_OUT_22POINT2,
+    AUDIO_CHANNEL_OUT_5POINT1POINT4,
+    AUDIO_CHANNEL_OUT_7POINT1POINT2,
+    AUDIO_CHANNEL_OUT_7POINT1POINT4,
+    AUDIO_CHANNEL_OUT_13POINT_360RA,
+    AUDIO_CHANNEL_OUT_22POINT2,
 };
 
+static constexpr audio_channel_mask_t kConsideredChannels =
+    (audio_channel_mask_t)(AUDIO_CHANNEL_OUT_7POINT1 | AUDIO_CHANNEL_OUT_BACK_CENTER);
+
 // Downmix doesn't change with sample rate
 static constexpr size_t kSampleRates[] = {
     48000,
@@ -100,7 +105,8 @@
             ASSERT_LT(index, FCC_24);
             const int pairIndex = pairIdxFromChannelIdx(index);
             const AUDIO_GEOMETRY_SIDE side = sideFromChannelIdx(index);
-            channel &= ~(1 << index);
+            const int channelBit = 1 << index;
+            channel &= ~channelBit;
 
             // Generate a +1, -1 alternating stream in one channel, which has variance 1.
             auto indata = input.data();
@@ -127,6 +133,12 @@
             // Confirm exactly the mix amount prescribed by the existing downmix effect.
             // For future changes to the downmix effect, the nearness needs to be relaxed
             // to compare behavior S or earlier.
+            if ((channelBit & kConsideredChannels) == 0) {
+                // for channels not considered, expect 0 power for legacy downmix
+                EXPECT_EQ(0.f, power[0]);
+                EXPECT_EQ(0.f, power[1]);
+                continue;
+            }
             constexpr float POWER_TOLERANCE = 0.01;  // for variance sum error.
             switch (side) {
             case AUDIO_GEOMETRY_SIDE_LEFT: