blob: d4c7aa2ec4b627f4257b1aca408b2ddcaf404da0 [file] [log] [blame]
Tristan Matthews0a329cc2013-07-17 13:20:14 -04001/***********************************************************************
2**
3** ITU-T G.722.1 (2005-05) - Fixed point implementation for main body and Annex C
4** > Software Release 2.1 (2008-06)
5** (Simple repackaging; no change from 2005-05 Release 2.0 code)
6**
7** © 2004 Polycom, Inc.
8**
9** All rights reserved.
10**
11***********************************************************************/
12
13#include <stdio.h>
14#include <math.h>
15#include <stdlib.h>
16#include "g7221/common/typedef.h"
17#include "g7221/common/basic_op.h"
18
19#define PI 3.141592653589793238462
20
21#define MAX_DCT_LENGTH 640
22#define DCT_LENGTH 320
23#define DCT_LENGTH_DIV_2 160
24#define DCT_LENGTH_DIV_4 80
25#define DCT_LENGTH_DIV_8 40
26#define DCT_LENGTH_DIV_16 20
27#define DCT_LENGTH_DIV_32 10
28#define DCT_LENGTH_DIV_64 5
29
30
31#define MAX(a,b) (a > b ? a : b)
32#define MIN(a,b) (a < b ? a : b)
33
34#define NUM_CATEGORIES 8
35#define NUM_CATEGORIZATION_CONTROL_BITS 4
36#define NUM_CATEGORIZATION_CONTROL_POSSIBILITIES 16
37#define CORE_SIZE 10
38#define DCT_LENGTH_LOG 6
39#define MAX_DCT_LENGTH_LOG 7
40
41/* region_size = (BLOCK_SIZE * 0.875)/NUM_REGIONS; */
42#define NUMBER_OF_REGIONS 14
43#define MAX_NUMBER_OF_REGIONS 28
44#define REGION_SIZE 20
45#define NUMBER_OF_VALID_COEFS (NUMBER_OF_REGIONS * REGION_SIZE)
46#define MAX_NUMBER_OF_VALID_COEFS (MAX_NUMBER_OF_REGIONS * REGION_SIZE)
47
48#define REGION_POWER_TABLE_SIZE 64
49#define REGION_POWER_TABLE_NUM_NEGATIVES 24
50
51#define MAX_NUM_CATEGORIZATION_CONTROL_BITS 5
52#define MAX_NUM_CATEGORIZATION_CONTROL_POSSIBILITIES 32
53
54#define ENCODER_SCALE_FACTOR 18318.0
55
56/* The MLT output is incorrectly scaled by the factor
57 product of ENCODER_SCALE_FACTOR and sqrt(160.)
58 This is now (9/30/96) 1.0/2^(4.5) or 1/22.627.
59 In the current implementation this
60 must be an integer power of sqrt(2). The
61 integer power is ESF_ADJUSTMENT_TO_RMS_INDEX.
62 The -2 is to conform with the range defined in the spec. */
63
64
65#define ESF_ADJUSTMENT_TO_RMS_INDEX (9-2)
66
67
68#define INTERMEDIATE_FILES_FLAG 0
69
70/* Max bit rate is 48000 bits/sec. */
71#define MAX_BITS_PER_FRAME 960
72
73
74/***************************************************************************/
75/* Type definitions */
76/***************************************************************************/
77typedef struct
78{
79 Word16 code_bit_count; /* bit count of the current word */
80 Word16 current_word; /* current word in the bitstream being processed */
81 Word16 *code_word_ptr; /* pointer to the bitstream */
82 Word16 number_of_bits_left; /* number of bits left in the current word */
83 Word16 next_bit; /* next bit in the current word */
84}Bit_Obj;
85
86typedef struct
87{
88 Word16 seed0;
89 Word16 seed1;
90 Word16 seed2;
91 Word16 seed3;
92}Rand_Obj;
93
94/***************************************************************************/
95/* Function definitions */
96/***************************************************************************/
97extern Word16 compute_region_powers(Word16 *mlt_coefs,
98 Word16 mag_shift,
99 Word16 *drp_num_bits,
100 UWord16 *drp_code_bits,
101 Word16 *absolute_region_power_index,
102 Word16 number_of_regions);
103
104void vector_quantize_mlts(Word16 number_of_available_bits,
105 Word16 number_of_regions,
106 Word16 num_categorization_control_possibilities,
107 Word16 *mlt_coefs,
108 Word16 *absolute_region_power_index,
109 Word16 *power_categories,
110 Word16 *category_balances,
111 Word16 *p_categorization_control,
112 Word16 *region_mlt_bit_counts,
113 UWord32 *region_mlt_bits);
114
115Word16 vector_huffman(Word16 category,
116 Word16 power_index,
117 Word16 *raw_mlt_ptr,
118 UWord32 *word_ptr);
119
120
121void adjust_abs_region_power_index(Word16 *absolute_region_power_index,Word16 *mlt_coefs,Word16 number_of_regions);
122
123void bits_to_words(UWord32 *region_mlt_bits,Word16 *region_mlt_bit_counts,
124 Word16 *drp_num_bits,UWord16 *drp_code_bits,Word16 *out_words,
125 Word16 categorization_control, Word16 number_of_regions,
126 Word16 num_categorization_control_bits, Word16 number_of_bits_per_frame);
127
128void encoder(Word16 number_of_available_bits,
129 Word16 number_of_regions,
130 Word16 *mlt_coefs,
131 Word16 mag_shift,
132 Word16 *out_words);
133
134void decoder(Bit_Obj *bitobj,
135 Rand_Obj *randobj,
136 Word16 number_of_regions,
137 Word16 *decoder_mlt_coefs,
138 Word16 *p_mag_shift,
139 Word16 *p_old_mag_shift,
140 Word16 *old_decoder_mlt_coefs,
141 Word16 frame_error_flag);
142
143Word16 samples_to_rmlt_coefs(const Word16 *new_samples,Word16 *history,Word16 *coefs,Word16 dct_length);
144void rmlt_coefs_to_samples(Word16 *coefs,
145 Word16 *old_samples,
146 Word16 *out_samples,
147 Word16 dct_length,
148 Word16 mag_shift);
149
150Word16 index_to_array(Word16 index,Word16 *array,Word16 category);
151void categorize(Word16 number_of_available_bits,
152 Word16 number_of_regions,
153 Word16 num_categorization_control_possibilities,
154 Word16 *rms_index,
155 Word16 *power_categories,
156 Word16 *category_balances);
157
158Word16 calc_offset(Word16 *rms_index,Word16 number_of_regions,Word16 available_bits);
159void compute_raw_pow_categories(Word16 *power_categories,Word16 *rms_index,Word16 number_of_regions,Word16 offset);
160void comp_powercat_and_catbalance(Word16 *power_categories,
161 Word16 *category_balances,
162 Word16 *rms_index,
163 Word16 number_of_available_bits,
164 Word16 number_of_regions,
165 Word16 num_categorization_control_possibilities,
166 Word16 offset);
167
168void dct_type_iv_a (Word16 *input,Word16 *output,Word16 dct_length);
169void dct_type_iv_s(Word16 *input,Word16 *output,Word16 dct_length);
170void decode_envelope(Bit_Obj *bitobj,
171 Word16 number_of_regions,
172 Word16 *decoder_region_standard_deviation,
173 Word16 *absolute_region_power_index,
174 Word16 *p_mag_shift);
175
176void decode_vector_quantized_mlt_indices(Bit_Obj *bitobj,
177 Rand_Obj *randobj,
178 Word16 number_of_regions,
179 Word16 *decoder_region_standard_deviation,
180 Word16 *dedecoder_power_categories,
181 Word16 *dedecoder_mlt_coefs);
182
183void rate_adjust_categories(Word16 categorization_control,
184 Word16 *decoder_power_categories,
185 Word16 *decoder_category_balances);
186
187void get_next_bit(Bit_Obj *bitobj);
188Word16 get_rand(Rand_Obj *randobj);
189
190void test_4_frame_errors(Bit_Obj *bitobj,
191 Word16 number_of_regions,
192 Word16 num_categorization_control_possibilities,
193 Word16 *frame_error_flag,
194 Word16 categorization_control,
195 Word16 *absolute_region_power_index);
196
197void error_handling(Word16 number_of_coefs,
198 Word16 number_of_valid_coefs,
199 Word16 *frame_error_flag,
200 Word16 *decoder_mlt_coefs,
201 Word16 *old_decoder_mlt_coefs,
202 Word16 *p_mag_shift,
203 Word16 *p_old_mag_shift);
204
205