shithub: opus

Download patch

ref: 60b527aedd2469ef1810f41087fd791196ac9c5e
parent: 10ceaedb30197b9fe366b0a52838f3ec73ed493e
author: Timothy B. Terriberry <tterribe@xiph.org>
date: Sun Jul 28 13:02:49 EDT 2024

Check regenerating then parsing random extensions.

This gives more confidence that the generation code always produces
 output that the parsing code can parse.

Signed-off-by: Jean-Marc Valin <jeanmarcv@google.com>

--- a/tests/test_opus_extensions.c
+++ b/tests/test_opus_extensions.c
@@ -550,6 +550,7 @@
    for (i=0;i<NB_RANDOM_EXTENSIONS;i++)
    {
       opus_extension_data ext_out[MAX_NB_EXTENSIONS];
+      int nb_frames;
       int nb_ext;
       unsigned char payload[MAX_EXTENSION_SIZE];
       int len;
@@ -559,14 +560,44 @@
       for (j=0;j<len;j++)
          payload[j] = fast_rand()&0xFF;
       nb_ext = fast_rand()%(MAX_NB_EXTENSIONS+1);
-      result = opus_packet_extensions_parse(payload, len, ext_out, &nb_ext, 48);
+      /* The success rate is near 60.4% almost independent of the number of
+          frames we choose, so pick it randomly.
+         nb_frames == 1 is slightly (~0.2%) less likely to succeed, while
+          nb_frames == 2 is slightly (~0.1%) more likely to succeed, followed
+          by nb_frames == 3 being very slightly (~0.02%) more likely. */
+      nb_frames = (fast_rand()%48) + 1;
+      result =
+       opus_packet_extensions_parse(payload, len, ext_out, &nb_ext, nb_frames);
       expect_true(result == OPUS_OK || result == OPUS_BUFFER_TOO_SMALL || result == OPUS_INVALID_PACKET, "expected OPUS_OK, OPUS_BUFFER_TOO_SMALL or OPUS_INVALID_PACKET");
       /* Even if parsing fails, check that the extensions that got extracted make sense. */
       for (j=0;j<nb_ext;j++)
       {
-         expect_true(ext_out[j].frame >= 0 && ext_out[j].frame < 48, "expected frame between 0 and 47");
+         expect_true(ext_out[j].frame >= 0 && ext_out[j].frame < nb_frames,
+          "expected frame between 0 and nb_frames-1");
          expect_true(ext_out[j].id >= 2 && ext_out[j].id <= 127, "expected id between 2 and 127");
          expect_true(ext_out[j].data >= payload && ext_out[j].data+ext_out[j].len <= payload+len, "expected data to be within packet");
+      }
+      /* If parsing succeeds, check to see if we can round-trip these
+          extensions. */
+      if (result == OPUS_OK) {
+         opus_extension_data ext_out2[MAX_NB_EXTENSIONS];
+         unsigned char payload2[MAX_EXTENSION_SIZE+1];
+         opus_int32 nb_frame_exts[48];
+         opus_int32 nb_ext_out;
+         len = opus_packet_extensions_generate(payload2, sizeof(payload2),
+          ext_out, nb_ext, nb_frames, 0);
+         expect_true(len >= 0, "expected extension generation to succeed");
+         result = opus_packet_extensions_count_ext(payload2, len,
+          nb_frame_exts, nb_frames);
+         expect_true(result == nb_ext, "expected extension count to match");
+         nb_ext_out = MAX_NB_EXTENSIONS;
+         result = opus_packet_extensions_parse_ext(payload2, len, ext_out2,
+          &nb_ext_out, nb_frame_exts, nb_frames);
+         expect_true(result == OPUS_OK,
+          "expected extension parsing to succeed");
+         expect_true(nb_ext == nb_ext_out,
+          "expected extension count to match");
+         check_ext_data(ext_out, ext_out2, nb_ext);
       }
    }
 }
--