1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***********************************************************************
2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCopyright (c) 2006-2011, Skype Limited. All rights reserved.
3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgRedistribution and use in source and binary forms, with or without
4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgmodification, are permitted provided that the following conditions
5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgare met:
6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions of source code must retain the above copyright notice,
7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgthis list of conditions and the following disclaimer.
8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions in binary form must reproduce the above copyright
9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnotice, this list of conditions and the following disclaimer in the
10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgdocumentation and/or other materials provided with the distribution.
11885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Neither the name of Internet Society, IETF or IETF Trust, nor the
12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnames of specific contributors, may be used to endorse or promote
13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgproducts derived from this software without specific prior written
14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgpermission.
15885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS”
16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgPOSSIBILITY OF SUCH DAMAGE.
26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org***********************************************************************/
27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef SILK_STRUCTS_FIX_H
29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define SILK_STRUCTS_FIX_H
30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "typedef.h"
32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "main.h"
33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "structs.h"
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef __cplusplus
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgextern "C"
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/********************************/
41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Noise shaping analysis state */
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/********************************/
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgtypedef struct {
44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   LastGainIndex;
45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  HarmBoost_smth_Q16;
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  HarmShapeGain_smth_Q16;
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  Tilt_smth_Q16;
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} silk_shape_state_FIX;
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/********************************/
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Prefilter state              */
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/********************************/
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgtypedef struct {
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  sLTP_shp[ LTP_BUF_LENGTH ];
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  sAR_shp[ MAX_SHAPE_LPC_ORDER + 1 ];
56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    sLTP_shp_buf_idx;
57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  sLF_AR_shp_Q12;
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  sLF_MA_shp_Q12;
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  sHarmHP_Q2;
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  rand_seed;
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    lagPrev;
62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} silk_prefilter_state_FIX;
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/********************************/
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Encoder state FIX            */
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/********************************/
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgtypedef struct {
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_encoder_state          sCmn;                                   /* Common struct, shared with floating-point code       */
69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_shape_state_FIX        sShape;                                 /* Shape state                                          */
70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_prefilter_state_FIX    sPrefilt;                               /* Prefilter State                                      */
71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Buffer for find pitch and noise shape analysis */
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_DWORD_ALIGN opus_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];/* Buffer for find pitch and noise shape analysis  */
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    LTPCorr_Q15;                            /* Normalized correlation from pitch lag estimator      */
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} silk_encoder_state_FIX;
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************************/
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Encoder control FIX  */
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************************/
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgtypedef struct {
81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Prediction and coding parameters */
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  Gains_Q16[ MAX_NB_SUBFR ];
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_DWORD_ALIGN opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ];
84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ];
85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    LTP_scale_Q14;
86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    pitchL[ MAX_NB_SUBFR ];
87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Noise shaping parameters */
89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Testing */
90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_DWORD_ALIGN opus_int16 AR1_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ];
91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_DWORD_ALIGN opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ];
92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  LF_shp_Q14[        MAX_NB_SUBFR ];      /* Packs two int16 coefficients per int32 value         */
93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    GainsPre_Q14[      MAX_NB_SUBFR ];
94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    HarmBoost_Q14[     MAX_NB_SUBFR ];
95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    Tilt_Q14[          MAX_NB_SUBFR ];
96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    HarmShapeGain_Q14[ MAX_NB_SUBFR ];
97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    Lambda_Q10;
98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    input_quality_Q14;
99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    coding_quality_Q14;
100885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* measures */
102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    sparseness_Q8;
103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  predGain_Q16;
104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    LTPredCodGain_Q7;
105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  ResNrg[ MAX_NB_SUBFR ];                 /* Residual energy per subframe                         */
106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    ResNrgQ[ MAX_NB_SUBFR ];                /* Q domain for the residual energy > 0                 */
107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Parameters for CBR mode */
109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  GainsUnq_Q16[ MAX_NB_SUBFR ];
110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   lastGainIndexPrev;
111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} silk_encoder_control_FIX;
112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************************/
114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Encoder Super Struct */
115885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************************/
116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgtypedef struct {
117885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_encoder_state_FIX      state_Fxx[ ENCODER_NUM_CHANNELS ];
118885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    stereo_enc_state            sStereo;
119885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  nBitsExceeded;
120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    nChannelsAPI;
121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    nChannelsInternal;
122885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    nPrevChannelsInternal;
123885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    timeSinceSwitchAllowed_ms;
124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    allowBandwidthSwitch;
125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    prev_decode_only_middle;
126885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} silk_encoder;
127885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
128885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef __cplusplus
130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
134