summaryrefslogtreecommitdiffstats
path: root/akode/plugins/mpc_decoder/mppdec/requant.cpp
blob: b2e22c95ed421aae22d61b8c739ab3644a9a47f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "stdafx.h"

/* C O N S T A N T S */
// bits per sample for chosen quantizer
const unsigned int  Res_bit [18] = {
    0,  0,  0,  0,  0,  0,  0,  0,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16
};

// coefficients for requantization
// 65536/step bzw. 65536/(2*D+1)



#define _(X) MAKE_MPC_SAMPLE_EX(X,14)

const MPC_SAMPLE_FORMAT  __Cc [1 + 18] = {
      _(111.285962475327f),                                        // 32768/2/255*sqrt(3)
    _(65536.000000000000f), _(21845.333333333332f), _(13107.200000000001f), _(9362.285714285713f),
    _(7281.777777777777f),  _(4369.066666666666f),  _(2114.064516129032f), _(1040.253968253968f),
     _(516.031496062992f),  _(257.003921568627f),   _(128.250489236790f),   _(64.062561094819f),
       _(32.015632633121f),    _(16.003907203907f),     _(8.000976681723f),    _(4.000244155527f),
        _(2.000061037018f),     _(1.000015259021f)
};

#undef _

// offset for requantization
// 2*D+1 = steps of quantizer
const int  __Dc [1 + 18] = {
      2,
      0,     1,     2,     3,     4,     7,    15,    31,    63,
    127,   255,   511,  1023,  2047,  4095,  8191, 16383, 32767
};

static unsigned find_shift(double fval)
{
	MPC_INT64 val = (MPC_INT64)fval;
	if (val<0) val = -val;
	unsigned ptr = 0;
	while(val) {val>>=1;ptr++;}

	return ptr > 31 ? 0 : 31 - ptr;
}

/* F U N C T I O N S */

#define SET_SCF(N,X) SCF[N] = MAKE_MPC_SAMPLE_EX(X,SCF_shift[N] = find_shift(X));

void
MPC_decoder::ScaleOutput ( double factor )
{
#ifndef MPC_FIXED_POINT
	factor *= 1.0 / (double)(1<<(MPC_FIXED_POINT_SHIFT-1));
#else
	factor *= 1.0 / (double)(1<<(16 - MPC_FIXED_POINT_SHIFT));
#endif
    int     n;
    double  f1 = factor;
    double  f2 = factor;

    // handles +1.58...-98.41 dB, where's scf[n] / scf[n-1] = 1.20050805774840750476
	
	SET_SCF(1,factor);

	f1 *=   0.83298066476582673961;
	f2 *= 1/0.83298066476582673961;

    for ( n = 1; n <= 128; n++ ) {
		SET_SCF((unsigned char)(1+n),f1);
		SET_SCF((unsigned char)(1-n),f2);
        f1 *=   0.83298066476582673961;
        f2 *= 1/0.83298066476582673961;
    }
}

void
MPC_decoder::Quantisierungsmodes ( void )            // conversion: index -> quantizer (bitstream reading)
{                                       // conversion: quantizer -> index (bitstream writing)
    int  Band = 0;
    int  i;

    do {
        Q_bit [Band] = 4;
        for ( i = 0; i < 16-1; i++ )
            Q_res [Band] [i] = i;
        Q_res [Band][i] = 17;
        Band++;
    } while ( Band < 11 );

    do {
        Q_bit [Band] = 3;
        for ( i = 0; i < 8-1; i++ )
            Q_res [Band] [i] = i;
        Q_res [Band] [i] = 17;
        Band++;
    } while ( Band < 23 );

    do {
        Q_bit [Band] = 2;
        for ( i = 0; i < 4-1; i++ )
            Q_res [Band] [i] = i;
        Q_res [Band] [i] = 17;
        Band++;
    } while ( Band < 32 );
}

void
MPC_decoder::initialisiere_Quantisierungstabellen ( double scale_factor )
{
    Quantisierungsmodes ();
    ScaleOutput ( scale_factor );
}