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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
|
/***********************************************************************
**
** ITU-T G.722.1 (2005-05) - Fixed point implementation for main body and Annex C
** > Software Release 2.1 (2008-06)
** (Simple repackaging; no change from 2005-05 Release 2.0 code)
**
** © 2004 Polycom, Inc.
**
** All rights reserved.
**
***********************************************************************/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include "g7221/common/stl-files/typedef.h"
#include "g7221/common/stl-files/basop32.h"
#define PI 3.141592653589793238462
#define MAX_DCT_LENGTH 640
#define DCT_LENGTH 320
#define DCT_LENGTH_DIV_2 160
#define DCT_LENGTH_DIV_4 80
#define DCT_LENGTH_DIV_8 40
#define DCT_LENGTH_DIV_16 20
#define DCT_LENGTH_DIV_32 10
#define DCT_LENGTH_DIV_64 5
#define MAX(a,b) (a > b ? a : b)
#define MIN(a,b) (a < b ? a : b)
#define NUM_CATEGORIES 8
#define NUM_CATEGORIZATION_CONTROL_BITS 4
#define NUM_CATEGORIZATION_CONTROL_POSSIBILITIES 16
#define CORE_SIZE 10
#define DCT_LENGTH_LOG 6
#define MAX_DCT_LENGTH_LOG 7
/* region_size = (BLOCK_SIZE * 0.875)/NUM_REGIONS; */
#define NUMBER_OF_REGIONS 14
#define MAX_NUMBER_OF_REGIONS 28
#define REGION_SIZE 20
#define NUMBER_OF_VALID_COEFS (NUMBER_OF_REGIONS * REGION_SIZE)
#define MAX_NUMBER_OF_VALID_COEFS (MAX_NUMBER_OF_REGIONS * REGION_SIZE)
#define REGION_POWER_TABLE_SIZE 64
#define REGION_POWER_TABLE_NUM_NEGATIVES 24
#define MAX_NUM_CATEGORIZATION_CONTROL_BITS 5
#define MAX_NUM_CATEGORIZATION_CONTROL_POSSIBILITIES 32
#define ENCODER_SCALE_FACTOR 18318.0
/* The MLT output is incorrectly scaled by the factor
product of ENCODER_SCALE_FACTOR and sqrt(160.)
This is now (9/30/96) 1.0/2^(4.5) or 1/22.627.
In the current implementation this
must be an integer power of sqrt(2). The
integer power is ESF_ADJUSTMENT_TO_RMS_INDEX.
The -2 is to conform with the range defined in the spec. */
#define ESF_ADJUSTMENT_TO_RMS_INDEX (9-2)
#define INTERMEDIATE_FILES_FLAG 0
/* Max bit rate is 48000 bits/sec. */
#define MAX_BITS_PER_FRAME 960
/***************************************************************************/
/* Type definitions */
/***************************************************************************/
typedef struct
{
Word16 code_bit_count; /* bit count of the current word */
Word16 current_word; /* current word in the bitstream being processed */
Word16 *code_word_ptr; /* pointer to the bitstream */
Word16 number_of_bits_left; /* number of bits left in the current word */
Word16 next_bit; /* next bit in the current word */
}Bit_Obj;
typedef struct
{
Word16 seed0;
Word16 seed1;
Word16 seed2;
Word16 seed3;
}Rand_Obj;
/***************************************************************************/
/* Function definitions */
/***************************************************************************/
extern Word16 compute_region_powers(Word16 *mlt_coefs,
Word16 mag_shift,
Word16 *drp_num_bits,
UWord16 *drp_code_bits,
Word16 *absolute_region_power_index,
Word16 number_of_regions);
void vector_quantize_mlts(Word16 number_of_available_bits,
Word16 number_of_regions,
Word16 num_categorization_control_possibilities,
Word16 *mlt_coefs,
Word16 *absolute_region_power_index,
Word16 *power_categories,
Word16 *category_balances,
Word16 *p_categorization_control,
Word16 *region_mlt_bit_counts,
UWord32 *region_mlt_bits);
Word16 vector_huffman(Word16 category,
Word16 power_index,
Word16 *raw_mlt_ptr,
UWord32 *word_ptr);
void adjust_abs_region_power_index(Word16 *absolute_region_power_index,Word16 *mlt_coefs,Word16 number_of_regions);
void bits_to_words(UWord32 *region_mlt_bits,Word16 *region_mlt_bit_counts,
Word16 *drp_num_bits,UWord16 *drp_code_bits,Word16 *out_words,
Word16 categorization_control, Word16 number_of_regions,
Word16 num_categorization_control_bits, Word16 number_of_bits_per_frame);
void encoder(Word16 number_of_available_bits,
Word16 number_of_regions,
Word16 *mlt_coefs,
Word16 mag_shift,
Word16 *out_words);
void decoder(Bit_Obj *bitobj,
Rand_Obj *randobj,
Word16 number_of_regions,
Word16 *decoder_mlt_coefs,
Word16 *p_mag_shift,
Word16 *p_old_mag_shift,
Word16 *old_decoder_mlt_coefs,
Word16 frame_error_flag);
Word16 samples_to_rmlt_coefs(Word16 *new_samples,Word16 *history,Word16 *coefs,Word16 dct_length);
void rmlt_coefs_to_samples(Word16 *coefs,
Word16 *old_samples,
Word16 *out_samples,
Word16 dct_length,
Word16 mag_shift);
Word16 index_to_array(Word16 index,Word16 *array,Word16 category);
void categorize(Word16 number_of_available_bits,
Word16 number_of_regions,
Word16 num_categorization_control_possibilities,
Word16 *rms_index,
Word16 *power_categories,
Word16 *category_balances);
Word16 calc_offset(Word16 *rms_index,Word16 number_of_regions,Word16 available_bits);
void compute_raw_pow_categories(Word16 *power_categories,Word16 *rms_index,Word16 number_of_regions,Word16 offset);
void comp_powercat_and_catbalance(Word16 *power_categories,
Word16 *category_balances,
Word16 *rms_index,
Word16 number_of_available_bits,
Word16 number_of_regions,
Word16 num_categorization_control_possibilities,
Word16 offset);
void dct_type_iv_a (Word16 *input,Word16 *output,Word16 dct_length);
void dct_type_iv_s(Word16 *input,Word16 *output,Word16 dct_length);
void decode_envelope(Bit_Obj *bitobj,
Word16 number_of_regions,
Word16 *decoder_region_standard_deviation,
Word16 *absolute_region_power_index,
Word16 *p_mag_shift);
void decode_vector_quantized_mlt_indices(Bit_Obj *bitobj,
Rand_Obj *randobj,
Word16 number_of_regions,
Word16 *decoder_region_standard_deviation,
Word16 *dedecoder_power_categories,
Word16 *dedecoder_mlt_coefs);
void rate_adjust_categories(Word16 categorization_control,
Word16 *decoder_power_categories,
Word16 *decoder_category_balances);
void get_next_bit(Bit_Obj *bitobj);
Word16 get_rand(Rand_Obj *randobj);
void test_4_frame_errors(Bit_Obj *bitobj,
Word16 number_of_regions,
Word16 num_categorization_control_possibilities,
Word16 *frame_error_flag,
Word16 categorization_control,
Word16 *absolute_region_power_index);
void error_handling(Word16 number_of_coefs,
Word16 number_of_valid_coefs,
Word16 *frame_error_flag,
Word16 *decoder_mlt_coefs,
Word16 *old_decoder_mlt_coefs,
Word16 *p_mag_shift,
Word16 *p_old_mag_shift);
|