tests: audioconvert: add tests for planar audio
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>
Fri, 9 Feb 2018 15:07:48 +0000 (17:07 +0200)
committerGeorge Kiagiadakis <george.kiagiadakis@collabora.com>
Wed, 11 Jul 2018 13:26:13 +0000 (16:26 +0300)
https://bugzilla.gnome.org/show_bug.cgi?id=705986

tests/check/elements/audioconvert.c

index a377421..2420fa3 100644 (file)
@@ -524,33 +524,48 @@ GST_START_TEST (test_int16)
 {
   /* stereo to mono */
   {
-    gint16 in[] = { 16384, -256, 1024, 1024 };
+    gint16 in_i[] = { 16384, -256, 1024, 1024 };
+    gint16 in_p[] = { 16384, 1024, -256, 1024 };
     gint16 out[] = { 8064, 1024 };
 
-    RUN_CONVERSION ("int16 stereo to mono",
-        in, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED),
+    RUN_CONVERSION ("int16 stereo to mono interleaved",
+        in_i, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED),
         out, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED));
+    RUN_CONVERSION ("int16 stereo to mono planar",
+        in_p, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, PLANAR),
+        out, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE, PLANAR));
   }
   /* mono to stereo */
   {
     gint16 in[] = { 512, 1024 };
-    gint16 out[] = { 512, 512, 1024, 1024 };
+    gint16 out_i[] = { 512, 512, 1024, 1024 };
+    gint16 out_p[] = { 512, 1024, 512, 1024 };
 
-    RUN_CONVERSION ("int16 mono to stereo",
+    RUN_CONVERSION ("int16 mono to stereo interleaved",
         in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED),
-        out, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED));
+        out_i, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED));
+    RUN_CONVERSION ("int16 mono to stereo planar",
+        in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE, PLANAR),
+        out_p, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, PLANAR));
   }
   /* signed -> unsigned */
   {
     gint16 in[] = { 0, -32767, 32767, -32768 };
     guint16 out[] = { 32768, 1, 65535, 0 };
 
-    RUN_CONVERSION ("int16 signed to unsigned",
+    RUN_CONVERSION ("int16 signed to unsigned interleaved",
         in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED),
         out, get_int_caps (1, G_BYTE_ORDER, 16, 16, FALSE, INTERLEAVED));
-    RUN_CONVERSION ("int16 unsigned to signed",
+    RUN_CONVERSION ("int16 unsigned to signed interleaved",
         out, get_int_caps (1, G_BYTE_ORDER, 16, 16, FALSE, INTERLEAVED),
         in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED));
+
+    RUN_CONVERSION ("int16 signed to unsigned planar",
+        in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE, PLANAR),
+        out, get_int_caps (1, G_BYTE_ORDER, 16, 16, FALSE, PLANAR));
+    RUN_CONVERSION ("int16 unsigned to signed planar",
+        out, get_int_caps (1, G_BYTE_ORDER, 16, 16, FALSE, PLANAR),
+        in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE, PLANAR));
   }
 }
 
@@ -561,21 +576,29 @@ GST_START_TEST (test_float32)
 {
   /* stereo to mono */
   {
-    gfloat in[] = { 0.6, -0.0078125, 0.03125, 0.03125 };
+    gfloat in_i[] = { 0.6, -0.0078125, 0.03125, 0.03125 };
+    gfloat in_p[] = { 0.6, 0.03125, -0.0078125, 0.03125 };
     gfloat out[] = { 0.29609375, 0.03125 };
 
-    RUN_CONVERSION ("float32 stereo to mono",
-        in, get_float_caps (2, G_BYTE_ORDER, 32, INTERLEAVED),
+    RUN_CONVERSION ("float32 stereo to mono interleaved",
+        in_i, get_float_caps (2, G_BYTE_ORDER, 32, INTERLEAVED),
         out, get_float_caps (1, G_BYTE_ORDER, 32, INTERLEAVED));
+    RUN_CONVERSION ("float32 stereo to mono planar",
+        in_p, get_float_caps (2, G_BYTE_ORDER, 32, PLANAR),
+        out, get_float_caps (1, G_BYTE_ORDER, 32, PLANAR));
   }
   /* mono to stereo */
   {
     gfloat in[] = { 0.015625, 0.03125 };
-    gfloat out[] = { 0.015625, 0.015625, 0.03125, 0.03125 };
+    gfloat out_i[] = { 0.015625, 0.015625, 0.03125, 0.03125 };
+    gfloat out_p[] = { 0.015625, 0.03125, 0.015625, 0.03125 };
 
-    RUN_CONVERSION ("float32 mono to stereo",
+    RUN_CONVERSION ("float32 mono to stereo interleaved",
         in, get_float_caps (1, G_BYTE_ORDER, 32, INTERLEAVED),
-        out, get_float_caps (2, G_BYTE_ORDER, 32, INTERLEAVED));
+        out_i, get_float_caps (2, G_BYTE_ORDER, 32, INTERLEAVED));
+    RUN_CONVERSION ("float32 mono to stereo planar",
+        in, get_float_caps (1, G_BYTE_ORDER, 32, PLANAR),
+        out_p, get_float_caps (2, G_BYTE_ORDER, 32, PLANAR));
   }
 }
 
@@ -1648,6 +1671,109 @@ GST_START_TEST (test_gap_buffers)
 
 GST_END_TEST;
 
+GST_START_TEST (test_layout_conversion)
+{
+  /* just layout conversion */
+  {
+    gint16 in[] = { 123, 123, 1024, 1024 };
+    gint16 out[] = { 123, 1024, 123, 1024 };
+
+    RUN_CONVERSION ("int16 interleaved -> planar",
+        in, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED),
+        out, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, PLANAR));
+    RUN_CONVERSION ("int16 interleaved -> planar",
+        in, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, PLANAR),
+        out, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED));
+  }
+  /* int16 stereo to mono with layout conversion */
+  {
+    gint16 in_i[] = { 16384, -256, 1024, 1024 };
+    gint16 in_p[] = { 16384, 1024, -256, 1024 };
+    gint16 out[] = { 8064, 1024 };
+
+    RUN_CONVERSION ("int16 stereo to mono / interleaved -> planar",
+        in_i, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED),
+        out, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE, PLANAR));
+    RUN_CONVERSION ("int16 stereo to mono / planar -> interleaved",
+        in_p, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, PLANAR),
+        out, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED));
+  }
+  /* int16 mono to stereo with layout conversion */
+  {
+    gint16 in[] = { 512, 1024 };
+    gint16 out_i[] = { 512, 512, 1024, 1024 };
+    gint16 out_p[] = { 512, 1024, 512, 1024 };
+
+    RUN_CONVERSION ("int16 mono to stereo / planar -> interleaved",
+        in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE, PLANAR),
+        out_i, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED));
+    RUN_CONVERSION ("int16 mono to stereo / interleaved -> planar",
+        in, get_int_caps (1, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED),
+        out_p, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, PLANAR));
+  }
+  /* change format with layout conversion */
+  {
+    gint16 in_p[] = { 0, 32767, -32767, -32768 };
+    gint16 in_i[] = { 0, -32767, 32767, -32768 };
+    guint16 out_p[] = { 32768, 65535, 1, 0 };
+    guint16 out_i[] = { 32768, 1, 65535, 0 };
+
+    RUN_CONVERSION ("int16 signed -> unsigned / planar -> interleaved",
+        in_p, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, PLANAR),
+        out_i, get_int_caps (2, G_BYTE_ORDER, 16, 16, FALSE, INTERLEAVED));
+    RUN_CONVERSION ("int16 signed -> unsigned / interleaved -> planar",
+        in_i, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED),
+        out_p, get_int_caps (2, G_BYTE_ORDER, 16, 16, FALSE, PLANAR));
+
+    RUN_CONVERSION ("int16 unsigned -> signed / planar -> interleaved",
+        out_p, get_int_caps (2, G_BYTE_ORDER, 16, 16, FALSE, PLANAR),
+        in_i, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED));
+    RUN_CONVERSION ("int16 unsigned -> signed / interleaved -> planar",
+        out_i, get_int_caps (2, G_BYTE_ORDER, 16, 16, FALSE, INTERLEAVED),
+        in_p, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, PLANAR));
+  }
+  /* channel mixing with layout conversion */
+  {
+    gint16 in_i[] = { 4, 5, 4, 2, 2, 1, 8, 10, 8, 4, 4, 2 };
+    gint16 in_p[] = { 4, 8, 5, 10, 4, 8, 2, 4, 2, 4, 1, 2 };
+    gint16 out_i[] = { 3, 3, 6, 6 };
+    gint16 out_p[] = { 3, 6, 3, 6 };
+
+    RUN_CONVERSION ("5.1 to 2 channels / interleaved -> planar", in_i,
+        get_int_mc_caps (6, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED, NULL),
+        out_p, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, PLANAR));
+
+    RUN_CONVERSION ("5.1 to 2 channels / planar -> interleaved", in_p,
+        get_int_mc_caps (6, G_BYTE_ORDER, 16, 16, TRUE, PLANAR, NULL),
+        out_i, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED));
+  }
+  /* change format + channels + layout */
+  {
+    guint8 in_i[] = {
+      0x00, 0x04, 0x00, 0x00, 0x05, 0x00, 0x00, 0x04, 0x00,
+      0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00,
+      0x00, 0x08, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x08, 0x00,
+      0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00
+    };
+    guint8 in_p[] = {
+      0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x05, 0x00,
+      0x00, 0x0a, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
+      0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00,
+      0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00
+    };
+    gint16 out_i[] = { 3, 3, 6, 6 };
+    gint16 out_p[] = { 3, 6, 3, 6 };
+
+    RUN_CONVERSION ("5.1 to 2 channels / S24LE interleaved -> S16 planar", in_i,
+        get_int_mc_caps (6, G_LITTLE_ENDIAN, 24, 24, TRUE, INTERLEAVED, NULL),
+        out_p, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, PLANAR));
+    RUN_CONVERSION ("5.1 to 2 channels / S24LE planar -> S16 interleaved", in_p,
+        get_int_mc_caps (6, G_LITTLE_ENDIAN, 24, 24, TRUE, PLANAR, NULL),
+        out_i, get_int_caps (2, G_BYTE_ORDER, 16, 16, TRUE, INTERLEAVED));
+  }
+}
+
+GST_END_TEST;
 
 static Suite *
 audioconvert_suite (void)
@@ -1667,6 +1793,7 @@ audioconvert_suite (void)
   tcase_add_test (tc_chain, test_convert_undefined_multichannel);
   tcase_add_test (tc_chain, test_preserve_width);
   tcase_add_test (tc_chain, test_gap_buffers);
+  tcase_add_test (tc_chain, test_layout_conversion);
 
   return s;
 }