16b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation, 26b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org Gregory Maxwell 36b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */ 46b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/* 56b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org Redistribution and use in source and binary forms, with or without 66b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org modification, are permitted provided that the following conditions 76b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org are met: 86b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org 96b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org - Redistributions of source code must retain the above copyright 106b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org notice, this list of conditions and the following disclaimer. 116b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org 126b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org - Redistributions in binary form must reproduce the above copyright 136b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org notice, this list of conditions and the following disclaimer in the 146b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org documentation and/or other materials provided with the distribution. 156b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org 166b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 206b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 216b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 226b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 236b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 246b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 256b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 266b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org*/ 286b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org 29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef HAVE_CONFIG_H 30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "config.h" 31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif 32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <stdio.h> 34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <string.h> 35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef CUSTOM_MODES 37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define CUSTOM_MODES 38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#else 39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define TEST_CUSTOM_MODES 40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif 41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define CELT_C 43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "stack_alloc.h" 44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entenc.c" 45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entdec.c" 46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entcode.c" 47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "cwrs.c" 48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "mathops.c" 49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "rate.h" 50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define NMAX (240) 52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define KMAX (128) 53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef TEST_CUSTOM_MODES 55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 56e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define NDIMS (44) 57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstatic const int pn[NDIMS]={ 58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 2, 3, 4, 5, 6, 7, 8, 9, 10, 59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 11, 12, 13, 14, 15, 16, 18, 20, 22, 60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 24, 26, 28, 30, 32, 36, 40, 44, 48, 61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 52, 56, 60, 64, 72, 80, 88, 96, 104, 62e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 112, 120, 128, 144, 160, 176, 192, 208 63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}; 64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstatic const int pkmax[NDIMS]={ 65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 128, 128, 128, 128, 88, 52, 36, 26, 22, 66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 18, 16, 15, 13, 12, 12, 11, 10, 9, 67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 9, 8, 8, 7, 7, 7, 7, 6, 6, 68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 6, 6, 6, 5, 5, 5, 5, 5, 5, 69e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 4, 4, 4, 4, 4, 4, 4, 4 70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}; 71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#else /* TEST_CUSTOM_MODES */ 73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define NDIMS (22) 75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstatic const int pn[NDIMS]={ 76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 2, 3, 4, 6, 8, 9, 11, 12, 16, 77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 18, 22, 24, 32, 36, 44, 48, 64, 72, 78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 88, 96, 144, 176 79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}; 80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstatic const int pkmax[NDIMS]={ 81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 128, 128, 128, 88, 36, 26, 18, 16, 12, 82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 11, 9, 9, 7, 7, 6, 6, 5, 5, 83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 5, 5, 4, 4 84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}; 85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif 87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgint main(void){ 89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org int t; 90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org int n; 91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ALLOC_STACK; 92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for(t=0;t<NDIMS;t++){ 93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org int pseudo; 94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org n=pn[t]; 95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for(pseudo=1;pseudo<41;pseudo++) 96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org { 97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org int k; 98e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(SMALL_FOOTPRINT) 99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_uint32 uu[KMAX+2U]; 100e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_uint32 inc; 102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_uint32 nc; 103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_uint32 i; 104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org k=get_pulses(pseudo); 105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if (k>pkmax[t])break; 106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org printf("Testing CWRS with N=%i, K=%i...\n",n,k); 107e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(SMALL_FOOTPRINT) 108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org nc=ncwrs_urow(n,k,uu); 109e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else 110e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org nc=CELT_PVQ_V(n,k); 111e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org inc=nc/20000; 113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if(inc<1)inc=1; 114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for(i=0;i<nc;i+=inc){ 115e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(SMALL_FOOTPRINT) 116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_uint32 u[KMAX+2U]; 117e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 118e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int y[NMAX]; 119e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int sy; 120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_uint32 v; 121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_uint32 ii; 122e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int j; 123e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(SMALL_FOOTPRINT) 124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org memcpy(u,uu,(k+2U)*sizeof(*u)); 125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org cwrsi(n,k,i,y,u); 126e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else 127e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org cwrsi(n,k,i,y); 128e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org sy=0; 130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for(j=0;j<n;j++)sy+=ABS(y[j]); 131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if(sy!=k){ 132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org fprintf(stderr,"N=%d Pulse count mismatch in cwrsi (%d!=%d).\n", 133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org n,sy,k); 134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 99; 135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /*printf("%6u of %u:",i,nc); 137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for(j=0;j<n;j++)printf(" %+3i",y[j]); 138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org printf(" ->");*/ 139e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(SMALL_FOOTPRINT) 140885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ii=icwrs(n,k,&v,y,u); 141e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else 142e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org ii=icwrs(n,y); 143e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org v=CELT_PVQ_V(n,k); 144e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif 145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if(ii!=i){ 146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org fprintf(stderr,"Combination-index mismatch (%lu!=%lu).\n", 147885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (long)ii,(long)i); 148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 1; 149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if(v!=nc){ 151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org fprintf(stderr,"Combination count mismatch (%lu!=%lu).\n", 152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (long)v,(long)nc); 153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 2; 154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /*printf(" %6u\n",i);*/ 156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /*printf("\n");*/ 158885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 0; 161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 162