xref: /aosp_15_r20/external/libopus/tests/test_opus_dred.c (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /* Copyright (c) 2023 Amazon
2*a58d3d2aSXin Li    Written by Michael Klingbeil */
3*a58d3d2aSXin Li /*
4*a58d3d2aSXin Li    Redistribution and use in source and binary forms, with or without
5*a58d3d2aSXin Li    modification, are permitted provided that the following conditions
6*a58d3d2aSXin Li    are met:
7*a58d3d2aSXin Li 
8*a58d3d2aSXin Li    - Redistributions of source code must retain the above copyright
9*a58d3d2aSXin Li    notice, this list of conditions and the following disclaimer.
10*a58d3d2aSXin Li 
11*a58d3d2aSXin Li    - Redistributions in binary form must reproduce the above copyright
12*a58d3d2aSXin Li    notice, this list of conditions and the following disclaimer in the
13*a58d3d2aSXin Li    documentation and/or other materials provided with the distribution.
14*a58d3d2aSXin Li 
15*a58d3d2aSXin Li    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*a58d3d2aSXin Li    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*a58d3d2aSXin Li    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18*a58d3d2aSXin Li    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19*a58d3d2aSXin Li    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20*a58d3d2aSXin Li    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21*a58d3d2aSXin Li    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22*a58d3d2aSXin Li    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23*a58d3d2aSXin Li    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24*a58d3d2aSXin Li    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*a58d3d2aSXin Li    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li */
27*a58d3d2aSXin Li 
28*a58d3d2aSXin Li #ifdef HAVE_CONFIG_H
29*a58d3d2aSXin Li #include "config.h"
30*a58d3d2aSXin Li #endif
31*a58d3d2aSXin Li 
32*a58d3d2aSXin Li #include <stdio.h>
33*a58d3d2aSXin Li #include <stdlib.h>
34*a58d3d2aSXin Li #include <string.h>
35*a58d3d2aSXin Li #include <time.h>
36*a58d3d2aSXin Li #ifndef _WIN32
37*a58d3d2aSXin Li #include <unistd.h>
38*a58d3d2aSXin Li #else
39*a58d3d2aSXin Li #include <process.h>
40*a58d3d2aSXin Li #define getpid _getpid
41*a58d3d2aSXin Li #endif
42*a58d3d2aSXin Li 
43*a58d3d2aSXin Li /* including sources directly to test internal APIs */
44*a58d3d2aSXin Li #define CELT_C /* to make celt_assert work */
45*a58d3d2aSXin Li #include "opus.h"
46*a58d3d2aSXin Li #include "test_opus_common.h"
47*a58d3d2aSXin Li 
48*a58d3d2aSXin Li 
49*a58d3d2aSXin Li 
50*a58d3d2aSXin Li #define NB_RANDOM_EXTENSIONS 10000000
51*a58d3d2aSXin Li #define MAX_EXTENSION_SIZE 200
52*a58d3d2aSXin Li #define MAX_NB_EXTENSIONS 100
53*a58d3d2aSXin Li 
test_random_dred(void)54*a58d3d2aSXin Li void test_random_dred(void)
55*a58d3d2aSXin Li {
56*a58d3d2aSXin Li    int error;
57*a58d3d2aSXin Li    int i;
58*a58d3d2aSXin Li    OpusDREDDecoder *dred_dec;
59*a58d3d2aSXin Li    OpusDRED *dred;
60*a58d3d2aSXin Li    dred_dec = opus_dred_decoder_create(&error);
61*a58d3d2aSXin Li    expect_true(error == OPUS_OK, "opus_dred_decoder_create() failed");
62*a58d3d2aSXin Li    dred = opus_dred_alloc(&error);
63*a58d3d2aSXin Li    expect_true(error == OPUS_OK, "opus_dred_create() failed");
64*a58d3d2aSXin Li    for (i=0;i<NB_RANDOM_EXTENSIONS;i++)
65*a58d3d2aSXin Li    {
66*a58d3d2aSXin Li       unsigned char payload[MAX_EXTENSION_SIZE];
67*a58d3d2aSXin Li       int len;
68*a58d3d2aSXin Li       int j;
69*a58d3d2aSXin Li       int res1, res2;
70*a58d3d2aSXin Li       int dred_end;
71*a58d3d2aSXin Li       len = fast_rand()%(MAX_EXTENSION_SIZE+1);
72*a58d3d2aSXin Li       for (j=0;j<len;j++)
73*a58d3d2aSXin Li          payload[j] = fast_rand()&0xFF;
74*a58d3d2aSXin Li       res1 = opus_dred_parse(dred_dec, dred, payload, len, 48000, 48000, &dred_end, fast_rand()&0x1);
75*a58d3d2aSXin Li       if (res1 > 0)
76*a58d3d2aSXin Li       {
77*a58d3d2aSXin Li          res2 = opus_dred_process(dred_dec, dred, dred);
78*a58d3d2aSXin Li          expect_true(res2 == OPUS_OK, "process should succeed if parse succeeds");
79*a58d3d2aSXin Li          expect_true(res1 >= dred_end, "end before beginning");
80*a58d3d2aSXin Li       }
81*a58d3d2aSXin Li    }
82*a58d3d2aSXin Li    opus_dred_free(dred);
83*a58d3d2aSXin Li    opus_dred_decoder_destroy(dred_dec);
84*a58d3d2aSXin Li }
85*a58d3d2aSXin Li 
main(int argc,char ** argv)86*a58d3d2aSXin Li int main(int argc, char **argv)
87*a58d3d2aSXin Li {
88*a58d3d2aSXin Li    int env_used;
89*a58d3d2aSXin Li    char *env_seed;
90*a58d3d2aSXin Li    env_used=0;
91*a58d3d2aSXin Li    env_seed=getenv("SEED");
92*a58d3d2aSXin Li    if(argc>1)iseed=atoi(argv[1]);
93*a58d3d2aSXin Li    else if(env_seed)
94*a58d3d2aSXin Li    {
95*a58d3d2aSXin Li       iseed=atoi(env_seed);
96*a58d3d2aSXin Li       env_used=1;
97*a58d3d2aSXin Li    }
98*a58d3d2aSXin Li    else iseed=(opus_uint32)time(NULL)^(((opus_uint32)getpid()&65535)<<16);
99*a58d3d2aSXin Li    Rw=Rz=iseed;
100*a58d3d2aSXin Li 
101*a58d3d2aSXin Li    fprintf(stderr,"Testing dred. Random seed: %u (%.4X)\n", iseed, fast_rand() % 65535);
102*a58d3d2aSXin Li    if(env_used)fprintf(stderr,"  Random seed set from the environment (SEED=%s).\n", env_seed);
103*a58d3d2aSXin Li 
104*a58d3d2aSXin Li    test_random_dred();
105*a58d3d2aSXin Li    fprintf(stderr,"Tests completed successfully.\n");
106*a58d3d2aSXin Li    return 0;
107*a58d3d2aSXin Li }
108