16b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation
26b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   Written by Jean-Marc Valin and Timothy B. Terriberry */
36b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/*
46b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   Redistribution and use in source and binary forms, with or without
56b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   modification, are permitted provided that the following conditions
66b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   are met:
76b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
86b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   - Redistributions of source code must retain the above copyright
96b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   notice, this list of conditions and the following disclaimer.
106b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
116b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   - Redistributions in binary form must reproduce the above copyright
126b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   notice, this list of conditions and the following disclaimer in the
136b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   documentation and/or other materials provided with the distribution.
146b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
156b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
166b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
176b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
186b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
196b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
206b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
216b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
226b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
236b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
246b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
256b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
266b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org*/
276b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef HAVE_CONFIG_H
29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "config.h"
30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <stdio.h>
33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <stdlib.h>
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "laplace.h"
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define CELT_C
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "stack_alloc.h"
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entenc.c"
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entdec.c"
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entcode.c"
41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "laplace.c"
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define DATA_SIZE 40000
44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgint ec_laplace_get_start_freq(int decay)
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_uint32 ft = 32768 - LAPLACE_MINP*(2*LAPLACE_NMIN+1);
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int fs = (ft*(16384-decay))/(16384+decay);
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   return fs+LAPLACE_MINP;
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgint main(void)
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int i;
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int ret = 0;
56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ec_enc enc;
57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ec_dec dec;
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   unsigned char *ptr;
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int val[10000], decay[10000];
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ALLOC_STACK;
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ptr = (unsigned char *)malloc(DATA_SIZE);
62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ec_enc_init(&enc,ptr,DATA_SIZE);
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   val[0] = 3; decay[0] = 6000;
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   val[1] = 0; decay[1] = 5800;
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   val[2] = -1; decay[2] = 5600;
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (i=3;i<10000;i++)
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      val[i] = rand()%15-7;
70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      decay[i] = rand()%11000+5000;
71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (i=0;i<10000;i++)
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      ec_laplace_encode(&enc, &val[i],
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            ec_laplace_get_start_freq(decay[i]), decay[i]);
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ec_enc_done(&enc);
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ec_dec_init(&dec,ec_get_buffer(&enc),ec_range_bytes(&enc));
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (i=0;i<10000;i++)
81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      int d = ec_laplace_decode(&dec,
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            ec_laplace_get_start_freq(decay[i]), decay[i]);
84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (d != val[i])
85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         fprintf (stderr, "Got %d instead of %d\n", d, val[i]);
87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = 1;
88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   return ret;
92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
93