1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Copyright (c) 2007-2008 CSIRO
2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Copyright (c) 2007-2009 Xiph.Org Foundation
3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Copyright (c) 2008 Gregory Maxwell
4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Written by Jean-Marc Valin and Gregory Maxwell */
5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*
6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Redistribution and use in source and binary forms, with or without
7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   modification, are permitted provided that the following conditions
8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   are met:
9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   - Redistributions of source code must retain the above copyright
11885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   notice, this list of conditions and the following disclaimer.
12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   - Redistributions in binary form must reproduce the above copyright
14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   notice, this list of conditions and the following disclaimer in the
15885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   documentation and/or other materials provided with the distribution.
16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org*/
29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef MODES_H
31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define MODES_H
32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "opus_types.h"
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "celt.h"
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "arch.h"
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "mdct.h"
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entenc.h"
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entdec.h"
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define MAX_PERIOD 1024
41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef OVERLAP
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define OVERLAP(mode) ((mode)->overlap)
44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef FRAMESIZE
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define FRAMESIZE(mode) ((mode)->mdctSize)
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgtypedef struct {
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int size;
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   const opus_int16 *index;
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   const unsigned char *bits;
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   const unsigned char *caps;
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} PulseCache;
56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Mode definition (opaque)
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org @brief Mode definition
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org */
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstruct OpusCustomMode {
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_int32 Fs;
62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int          overlap;
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int          nbEBands;
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int          effEBands;
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_val16    preemph[4];
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   const opus_int16   *eBands;   /**< Definition for each "pseudo-critical band" */
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int         maxLM;
70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int         nbShortMdcts;
71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int         shortMdctSize;
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int          nbAllocVectors; /**< Number of lines in the matrix below */
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   const unsigned char   *allocVectors;   /**< Number of bits in each band for several rates */
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   const opus_int16 *logN;
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   const opus_val16 *window;
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   mdct_lookup mdct;
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PulseCache cache;
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org};
81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
84