1#ifndef APE_NNFILTER_H
2#define APE_NNFILTER_H
3
4#include "RollBuffer.h"
5#define NN_WINDOW_ELEMENTS    512
6//#define NN_TEST_MMX
7
8class CNNFilter
9{
10public:
11
12    CNNFilter(int nOrder, int nShift, int nVersion);
13    ~CNNFilter();
14
15    int Compress(int nInput);
16    int Decompress(int nInput);
17    void Flush();
18
19private:
20
21    int m_nOrder;
22    int m_nShift;
23    int m_nVersion;
24    BOOL m_bMMXAvailable;
25    int m_nRunningAverage;
26
27    CRollBuffer<short> m_rbInput;
28    CRollBuffer<short> m_rbDeltaM;
29
30    short * m_paryM;
31
32    inline short GetSaturatedShortFromInt(int nValue) const
33    {
34        return short((nValue == short(nValue)) ? nValue : (nValue >> 31) ^ 0x7FFF);
35    }
36
37    inline int CalculateDotProductNoMMX(short * pA, short * pB, int nOrder);
38    inline void AdaptNoMMX(short * pM, short * pAdapt, int nDirection, int nOrder);
39};
40
41#endif // #ifndef APE_NNFILTER_H
42