Ticket #774:
 - Initial source of G.722.1/Annex C integration.
 - Disabled some "odd" modes of L16 codec (11kHz & 22kHz mono & stereo) while releasing some payload types.



git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@2563 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/third_party/g7221/common/common.c b/third_party/g7221/common/common.c
new file mode 100644
index 0000000..66e32ad
--- /dev/null
+++ b/third_party/g7221/common/common.c
@@ -0,0 +1,461 @@
+/****************************************************************************************
+**
+**   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.
+**
+****************************************************************************************/
+
+/****************************************************************************************
+  Filename:    common.c    
+
+  Purpose:     Contains the functions used for both G.722.1 Annex C encoder and decoder
+		
+  Design Notes:
+
+****************************************************************************************/
+/****************************************************************************************
+ Include files                                                           
+****************************************************************************************/
+#include "defs.h"
+#include "huff_def.h"
+#include "huff_tab.h"
+#include "tables.h"
+#include "count.h"
+
+/****************************************************************************************
+ Function:    categorize
+
+ Syntax:      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)          
+
+                  inputs:   number_of_regions
+                            num_categorization_control_possibilities
+                            number_of_available_bits
+                            rms_index[MAX_NUMBER_OF_REGIONS]                              
+                  
+                  outputs:  power_categories[MAX_NUMBER_OF_REGIONS]                       
+                            category_balances[MAX_NUM_CATEGORIZATION_CONTROL_POSSIBILITIES-1]
+
+ Description: Computes a series of categorizations 
+
+ WMOPS:     7kHz |    24kbit    |     32kbit
+          -------|--------------|----------------
+            AVG  |    0.14      |     0.14
+          -------|--------------|----------------  
+            MAX  |    0.15      |     0.15
+          -------|--------------|---------------- 
+   			
+           14kHz |    24kbit    |     32kbit     |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.42      |     0.45       |     0.48   
+          -------|--------------|----------------|----------------
+            MAX  |    0.47      |     0.52       |     0.52   
+          -------|--------------|----------------|----------------
+
+****************************************************************************************/
+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 offset;
+    Word16 temp;
+    Word16 frame_size;
+
+    /* At higher bit rates, there is an increase for most categories in average bit
+       consumption per region. We compensate for this by pretending we have fewer
+       available bits. */
+    test();
+    if (number_of_regions == NUMBER_OF_REGIONS)
+    {
+        frame_size = DCT_LENGTH;
+    }
+    else
+    {
+        frame_size = MAX_DCT_LENGTH;
+    }
+
+    temp = sub(number_of_available_bits,frame_size);
+    
+    test();
+    if (temp > 0)
+    {
+        number_of_available_bits = sub(number_of_available_bits,frame_size);
+        number_of_available_bits = extract_l(L_mult0(number_of_available_bits,5));
+        number_of_available_bits = shr(number_of_available_bits,3);
+        number_of_available_bits = add(number_of_available_bits,frame_size);
+    }
+
+    /* calculate the offset using the original category assignments */
+    offset = calc_offset(rms_index,number_of_regions,number_of_available_bits);
+
+
+
+    /* compute the power categories based on the uniform offset */
+    compute_raw_pow_categories(power_categories,rms_index,number_of_regions,offset);
+    
+    
+    /* adjust the category assignments */
+    /* compute the new power categories and category balances */
+    comp_powercat_and_catbalance(power_categories,category_balances,rms_index,number_of_available_bits,number_of_regions,num_categorization_control_possibilities,offset);
+
+}
+    
+/***************************************************************************
+ Function:    comp_powercat_and_catbalance
+
+ Syntax:      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)                                                    
+
+                
+                inputs:   *rms_index                              
+                          number_of_available_bits                 
+                          number_of_regions
+                          num_categorization_control_possibilities
+                          offset
+                           
+                outputs:  *power_categories  
+                          *category_balances 
+                
+                
+ Description: Computes the power_categories and the category balances
+
+ WMOPS:     7kHz |    24kbit    |     32kbit
+          -------|--------------|----------------
+            AVG  |    0.10      |     0.10
+          -------|--------------|----------------  
+            MAX  |    0.11      |     0.11
+          -------|--------------|---------------- 
+				
+           14kHz |    24kbit    |     32kbit     |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.32      |     0.35       |     0.38   
+          -------|--------------|----------------|----------------
+            MAX  |    0.38      |     0.42       |     0.43   
+          -------|--------------|----------------|----------------
+
+***************************************************************************/
+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)
+{
+    
+    Word16 expected_number_of_code_bits;
+    Word16 region;
+    Word16 max_region;
+    Word16 j;
+    Word16 max_rate_categories[MAX_NUMBER_OF_REGIONS];
+    Word16 min_rate_categories[MAX_NUMBER_OF_REGIONS];
+    Word16 temp_category_balances[2*MAX_NUM_CATEGORIZATION_CONTROL_POSSIBILITIES];
+    Word16 raw_max, raw_min;
+    Word16 raw_max_index, raw_min_index;
+    Word16 max_rate_pointer, min_rate_pointer;
+    Word16 max, min;
+    Word16 itemp0;
+    Word16 itemp1;
+    Word16 min_plus_max;
+    Word16 two_x_number_of_available_bits;
+
+    Word16 temp;
+
+    expected_number_of_code_bits = 0;
+    move16();
+
+    for (region=0; region<number_of_regions; region++)
+        expected_number_of_code_bits = add(expected_number_of_code_bits,expected_bits_table[power_categories[region]]);
+
+
+    for (region=0; region<number_of_regions; region++) 
+    {
+        max_rate_categories[region] = power_categories[region];
+        move16();
+        
+        min_rate_categories[region] = power_categories[region];
+        move16();
+    }
+    
+    max = expected_number_of_code_bits;
+    move16();
+    min = expected_number_of_code_bits;
+    move16();
+    max_rate_pointer = num_categorization_control_possibilities;
+    move16();
+    min_rate_pointer = num_categorization_control_possibilities;
+    move16();
+    
+    for (j=0; j<num_categorization_control_possibilities-1; j++) 
+    {
+        min_plus_max = add(max,min);
+        two_x_number_of_available_bits = shl(number_of_available_bits,1);
+        
+        temp = sub(min_plus_max,two_x_number_of_available_bits);
+        test();
+        if (temp <= 0) 
+        {
+            raw_min = 99;
+            move16();
+            /* Search from lowest freq regions to highest for best */
+            /* region to reassign to a higher bit rate category.   */
+            for (region=0; region<number_of_regions; region++) 
+            {
+                test();
+                if (max_rate_categories[region] > 0) 
+                {
+                    itemp0 = shl(max_rate_categories[region],1);
+                    itemp1 = sub(offset,rms_index[region]);
+                    itemp0 = sub(itemp1,itemp0);
+                    
+                    temp = sub(itemp0,raw_min);
+                    test();
+                    if (temp < 0) 
+                    {
+                        raw_min = itemp0;
+                        raw_min_index = region;
+                    }
+                }
+            }
+            max_rate_pointer = sub(max_rate_pointer,1);
+            temp_category_balances[max_rate_pointer] = raw_min_index;
+            move16();
+
+        	max = sub(max,expected_bits_table[max_rate_categories[raw_min_index]]);
+        	max_rate_categories[raw_min_index] = sub(max_rate_categories[raw_min_index],1);
+        	move16();
+
+            max = add(max,expected_bits_table[max_rate_categories[raw_min_index]]);
+        }
+        else 
+        {
+            raw_max = -99;
+            move16();
+            /* Search from highest freq regions to lowest for best region to reassign to
+            a lower bit rate category. */
+            max_region = sub(number_of_regions,1);
+            for (region= max_region; region >= 0; region--) 
+            {
+                temp = sub(min_rate_categories[region],(NUM_CATEGORIES-1));
+                test();
+                if (temp < 0)
+                {
+                    itemp0 = shl(min_rate_categories[region],1);
+                    itemp1 = sub(offset,rms_index[region]);
+                    itemp0 = sub(itemp1,itemp0);
+                    
+                    temp = sub(itemp0,raw_max);
+                    test();
+                    if (temp > 0) 
+                    {
+                        raw_max = itemp0;
+                        move16();
+                        raw_max_index = region;
+                        move16();
+                    }
+                }
+            }
+            temp_category_balances[min_rate_pointer] = raw_max_index;
+            move16();
+            
+            min_rate_pointer = add(min_rate_pointer,1);
+            min = sub(min,expected_bits_table[min_rate_categories[raw_max_index]]);
+            
+            min_rate_categories[raw_max_index] = add(min_rate_categories[raw_max_index],1);
+            move16();
+            
+            min = add(min,expected_bits_table[min_rate_categories[raw_max_index]]);
+        }
+    }
+    
+    for (region=0; region<number_of_regions; region++)
+    {
+        power_categories[region] = max_rate_categories[region];
+        move16();
+    }
+    
+    for (j=0; j<num_categorization_control_possibilities-1; j++)
+    {
+        category_balances[j] = temp_category_balances[max_rate_pointer++];
+        move16();
+    }
+
+}
+/***************************************************************************
+ Function:    calc_offset
+
+ Syntax:      offset=calc_offset(Word16 *rms_index,Word16 number_of_regions,Word16 available_bits)  
+
+                input:  Word16 *rms_index
+                        Word16 number_of_regions
+                        Word16 available_bits
+                        
+                output: Word16 offset                        
+
+ Description: Calculates the the category offset.  This is the shift required
+              To get the most out of the number of available bits.  A binary 
+              type search is used to find the offset.
+
+ WMOPS:     7kHz |    24kbit    |     32kbit
+          -------|--------------|----------------
+            AVG  |    0.04      |     0.04
+          -------|--------------|----------------  
+            MAX  |    0.04      |     0.04
+          -------|--------------|---------------- 
+
+           14kHz |    24kbit    |     32kbit     |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.08      |     0.08       |     0.08   
+          -------|--------------|----------------|----------------
+            MAX  |    0.09      |     0.09       |     0.09   
+          -------|--------------|----------------|----------------
+
+***************************************************************************/
+Word16 calc_offset(Word16 *rms_index,Word16 number_of_regions,Word16 available_bits)    
+{
+
+    Word16 answer;
+    Word16 delta;
+    Word16 test_offset;
+    Word16 region,j;
+    Word16 power_cats[MAX_NUMBER_OF_REGIONS];
+    Word16 bits;
+    Word16 offset;
+    Word16 temp;
+
+    /* initialize vars */
+    answer = -32;
+    move16();
+    delta = 32;
+    move16();
+    
+    do 
+    {
+        test_offset = add(answer,delta);
+        
+        /* obtain a category for each region */
+        /* using the test offset             */
+        for (region=0; region<number_of_regions; region++) 
+        {
+            j = sub(test_offset,rms_index[region]);
+            j = shr(j,1);
+            
+            /* Ensure j is between 0 and NUM_CAT-1 */
+            test();
+            if (j < 0) 
+            {
+                j = 0;
+                move16();
+            }
+            temp = sub(j,NUM_CATEGORIES-1);
+            test();
+            if (temp > 0) 
+            {
+                j = sub(NUM_CATEGORIES,1);
+                move16();
+            }
+            power_cats[region] = j;
+            move16();
+        }
+        bits = 0;
+        move16();
+
+        /* compute the number of bits that will be used given the cat assignments */
+        for (region=0; region<number_of_regions; region++)
+            bits = add(bits,expected_bits_table[power_cats[region]]);
+
+        /* if (bits > available_bits - 32) then divide the offset region for the bin search */
+        offset = sub(available_bits,32);
+        temp = sub(bits,offset);
+        test();
+        if (temp >= 0)
+        {
+            answer = test_offset;
+            move16();
+        }
+        delta = shr(delta,1);
+        test(); /* for the while loop */
+    } while (delta > 0);
+
+    return(answer);
+}
+/***************************************************************************
+ Function:    compute_raw_pow_categories
+
+ Syntax:      void compute_raw_pow_categories(Word16 *power_categories,
+                                              Word16 *rms_index,
+                                              Word16 number_of_regions,
+                                              Word16 offset)
+              inputs:  *rms_index
+                       number_of_regions
+                       offset
+                    
+              outputs: *power_categories                    
+
+
+
+ Description: This function computes the power categories given the offset
+              This is kind of redundant since they were already computed
+              in calc_offset to determine the offset.
+
+ WMOPS:          |    24kbit    |     32kbit
+          -------|--------------|----------------
+            AVG  |    0.01      |     0.01
+          -------|--------------|----------------  
+            MAX  |    0.01      |     0.01
+          -------|--------------|---------------- 
+
+           14kHz |    24kbit    |     32kbit     |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.01      |     0.01       |     0.01   
+          -------|--------------|----------------|----------------
+            MAX  |    0.01      |     0.01       |     0.01   
+          -------|--------------|----------------|----------------
+
+***************************************************************************/
+void compute_raw_pow_categories(Word16 *power_categories,Word16 *rms_index,Word16 number_of_regions,Word16 offset)
+{
+    Word16 region;
+    Word16 j;
+    Word16 temp;
+
+    for (region=0; region<number_of_regions; region++) 
+    {
+        j = sub(offset,rms_index[region]);
+        j = shr(j,1);
+        
+        /* make sure j is between 0 and NUM_CAT-1 */
+        test();
+        if (j < 0) 
+        {
+            j = 0;
+            move16();
+        }
+        temp = sub(j,(NUM_CATEGORIES-1));
+        test();
+        if (temp > 0) 
+            j = sub(NUM_CATEGORIES,1);
+        
+        power_categories[region] = j;
+        move16();
+    }
+}
+
diff --git a/third_party/g7221/common/defs.h b/third_party/g7221/common/defs.h
new file mode 100644
index 0000000..2c4978e
--- /dev/null
+++ b/third_party/g7221/common/defs.h
@@ -0,0 +1,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);
+
+
diff --git a/third_party/g7221/common/huff_def.h b/third_party/g7221/common/huff_def.h
new file mode 100644
index 0000000..dd10d9a
--- /dev/null
+++ b/third_party/g7221/common/huff_def.h
@@ -0,0 +1,53 @@
+/***********************************************************************
+**
+**   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.
+**
+***********************************************************************/
+
+#define REGION_POWER_STEPSIZE_DB 3.010299957
+#define ABS_REGION_POWER_LEVELS  32
+#define DIFF_REGION_POWER_LEVELS 24
+
+#define DRP_DIFF_MIN -12
+#define DRP_DIFF_MAX 11
+
+#define MAX_NUM_BINS 16
+#define MAX_VECTOR_INDICES 625
+#define MAX_VECTOR_DIMENSION 5
+
+extern Word16  differential_region_power_bits[MAX_NUMBER_OF_REGIONS][DIFF_REGION_POWER_LEVELS];
+extern UWord16 differential_region_power_codes[MAX_NUMBER_OF_REGIONS][DIFF_REGION_POWER_LEVELS];
+extern Word16  differential_region_power_decoder_tree[MAX_NUMBER_OF_REGIONS][DIFF_REGION_POWER_LEVELS-1][2];
+extern Word16  mlt_quant_centroid[NUM_CATEGORIES][MAX_NUM_BINS];
+extern Word16  expected_bits_table[NUM_CATEGORIES];
+extern Word16  mlt_sqvh_bitcount_category_0[196];
+extern UWord16 mlt_sqvh_code_category_0[196];
+extern Word16  mlt_sqvh_bitcount_category_1[100];
+extern UWord16 mlt_sqvh_code_category_1[100];
+extern Word16  mlt_sqvh_bitcount_category_2[49];
+extern UWord16 mlt_sqvh_code_category_2[49];
+extern Word16  mlt_sqvh_bitcount_category_3[625];
+extern UWord16 mlt_sqvh_code_category_3[625];
+extern Word16  mlt_sqvh_bitcount_category_4[256];
+extern UWord16 mlt_sqvh_code_category_4[256];
+extern Word16  mlt_sqvh_bitcount_category_5[243];
+extern UWord16 mlt_sqvh_code_category_5[243];
+extern Word16  mlt_sqvh_bitcount_category_6[32];
+extern UWord16 mlt_sqvh_code_category_6[32];
+extern Word16  *table_of_bitcount_tables[NUM_CATEGORIES-1];
+extern UWord16 *table_of_code_tables[NUM_CATEGORIES-1];
+extern Word16  mlt_decoder_tree_category_0[180][2];
+extern Word16  mlt_decoder_tree_category_1[93][2];
+extern Word16  mlt_decoder_tree_category_2[47][2];
+extern Word16  mlt_decoder_tree_category_3[519][2];
+extern Word16  mlt_decoder_tree_category_4[208][2];
+extern Word16  mlt_decoder_tree_category_5[191][2];
+extern Word16  mlt_decoder_tree_category_6[31][2];
+extern Word16  *table_of_decoder_tables[NUM_CATEGORIES-1];
+
diff --git a/third_party/g7221/common/huff_tab.c b/third_party/g7221/common/huff_tab.c
new file mode 100644
index 0000000..12ff661
--- /dev/null
+++ b/third_party/g7221/common/huff_tab.c
@@ -0,0 +1,528 @@
+/***********************************************************************
+**
+**   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 "defs.h"
+#include "huff_def.h"
+
+Word16 differential_region_power_bits[MAX_NUMBER_OF_REGIONS][DIFF_REGION_POWER_LEVELS] = {
+{99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99},
+{ 4, 6, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 5, 7, 8, 9,11,11,12,12,12,12},
+{10, 8, 6, 5, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 7, 9,11,12,13,15,15,15,16,16},
+{12,10, 8, 6, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4, 5, 5, 7, 9,11,13,14,14},
+{13,10, 9, 9, 7, 7, 5, 5, 4, 3, 3, 3, 3, 3, 4, 4, 4, 5, 7, 9,11,13,13,13},
+{12,13,10, 8, 6, 6, 5, 5, 4, 4, 3, 3, 3, 3, 3, 4, 5, 5, 6, 7, 9,11,14,14},
+{12,11, 9, 8, 8, 7, 5, 4, 4, 3, 3, 3, 3, 3, 4, 4, 5, 5, 7, 8,10,13,14,14},
+{15,16,15,12,10, 8, 6, 5, 4, 3, 3, 3, 2, 3, 4, 5, 5, 7, 9,11,13,16,16,16},
+{14,14,11,10, 9, 7, 7, 5, 5, 4, 3, 3, 2, 3, 3, 4, 5, 7, 9, 9,12,14,15,15},
+{ 9, 9, 9, 8, 7, 6, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8,10,11,12,13,13},
+{14,12,10, 8, 6, 6, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 8, 8, 9,11,14,14,14},
+{13,10, 9, 8, 6, 6, 5, 4, 4, 4, 3, 3, 2, 3, 4, 5, 6, 8, 9, 9,11,12,14,14},
+{16,13,12,11, 9, 6, 5, 5, 4, 4, 4, 3, 2, 3, 3, 4, 5, 7, 8,10,14,16,16,16},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14},
+{13,14,14,14,10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9,11,14,14,14}};
+
+UWord16 differential_region_power_codes[MAX_NUMBER_OF_REGIONS][DIFF_REGION_POWER_LEVELS] = {
+{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+{ 8,38,18,10, 7, 6, 3, 2, 0, 1, 7, 6, 5, 4,11,78,158,318,1278,1279,2552,2553,2554,2555},
+{36, 8, 3, 5, 0, 1, 7, 6, 4, 3, 2, 5, 3, 4, 5,19,74,150,302,1213,1214,1215,2424,2425},
+{2582,644,160,41, 5,11, 7, 5, 4, 1, 0, 6, 4, 7, 3, 6, 4,21,81,323,1290,5167,10332,10333},
+{2940,366,181,180,47,46,27,10, 8, 5, 1, 0, 3, 7, 4, 9,12,26,44,182,734,2941,2942,2943},
+{3982,7967,994,249,63,26,19,18,14, 8, 6, 1, 0, 2, 5, 7,12,30,27,125,496,1990,15932,15933},
+{3254,1626,407,206,202,100,30,14, 3, 5, 3, 0, 2, 4, 2,13,24,31,102,207,812,6511,13020,13021},
+{1110,2216,1111,139,35, 9, 3,20,11, 4, 2, 1, 3, 3, 1, 0,21, 5,16,68,276,2217,2218,2219},
+{1013,1014,127,62,29, 6, 4,16, 0, 1, 3, 2, 3, 1, 5, 9,17, 5,28,30,252,1015,2024,2025},
+{381,380,372,191,94,44,16,10, 7, 3, 1, 0, 2, 6, 9,17,45,92,187,746,1494,2991,5980,5981},
+{3036,758,188,45,43,10, 4, 3, 6, 4, 2, 0, 3, 7,11,20,42,44,46,95,378,3037,3038,3039},
+{751,92,45,20,26, 4,12, 7, 4, 0, 4, 1, 3, 5, 5, 3,27,21,44,47,186,374,1500,1501},
+{45572U,5697,2849,1425,357,45,23, 6,10, 7, 2, 2, 3, 0, 4, 6, 7,88,179,713,11392,45573U,45574U,45575U},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021},
+{2511,5016,5018,5017,312,79,38,36,30,14, 6, 0, 2, 1, 3, 5, 8,31,37,157,626,5019,5020,5021}};
+
+Word16 differential_region_power_decoder_tree[MAX_NUMBER_OF_REGIONS][DIFF_REGION_POWER_LEVELS-1][2] = {
+{{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0},{  0,  0}},
+{{  1,  2},{  3,  4},{  5,  6},{  7,  8},{  9, 10},{ 11,-12},{-11,-10},{ -8, -9},{ -7, -6},{-13, 12},{ -5, -4},{  0, 13},{ -3,-14},{ -2, 14},{ -1, 15},{-15, 16},{-16, 17},{-17, 18},{ 19, 20},{ 21, 22},{-18,-19},{-20,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{  5,  6},{  7,  8},{-10, -9},{ -8,-11},{ -7, -6},{  9, -5},{ 10,-12},{ -4, 11},{-13, -3},{ 12, -2},{ 13,-14},{ -1, 14},{ 15,-15},{  0, 16},{-16, 17},{-17, 18},{-18, 19},{ 20, 21},{ 22,-19},{-20,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{  5,  6},{  7,  8},{  9, 10},{-12, 11},{-11,-13},{-10, -9},{ 12,-14},{ -8, -7},{-15, -6},{ 13, -5},{-16, -4},{ 14,-17},{ 15, -3},{ 16,-18},{ -2, 17},{ 18,-19},{ -1, 19},{-20, 20},{  0, 21},{ 22,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{  5,  6},{-11,-10},{  7,-12},{  8, -9},{  9,-13},{-14, 10},{ -8,-15},{-16, 11},{ -7, 12},{-17, -6},{ 13, 14},{-18, 15},{ -5, -4},{ 16, 17},{ -3, -2},{-19, 18},{ -1, 19},{-20, 20},{ 21, 22},{  0,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{  5,  6},{-12,-11},{-13,  7},{  8,-14},{-10,  9},{ 10,-15},{ -9, 11},{ -8, 12},{-16, 13},{ -7, -6},{-17, 14},{ -5,-18},{ 15, -4},{ 16,-19},{ 17, -3},{-20, 18},{ -2, 19},{-21, 20},{  0, 21},{ 22, -1},{-22,-23}},
+{{  1,  2},{  3,  4},{  5,  6},{-11,  7},{-12,-10},{-13, -9},{  8,  9},{-14, -8},{ 10,-15},{ -7, 11},{-16, 12},{ -6,-17},{ 13, 14},{ -5, 15},{-18, 16},{ -4, 17},{ -3,-19},{ 18, -2},{-20, 19},{ -1, 20},{  0, 21},{ 22,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{  5,-12},{  6,-11},{-10,-13},{ -9,  7},{  8,-14},{  9, -8},{-15, 10},{ -7,-16},{ 11, -6},{ 12,-17},{ 13, -5},{-18, 14},{ 15, -4},{-19, 16},{ 17, -3},{-20, 18},{ 19, 20},{ 21, 22},{  0, -2},{ -1,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{  5,-12},{  6,-13},{-11,-10},{  7,-14},{  8, -9},{  9,-15},{ -8, 10},{ -7,-16},{ 11, 12},{ -6,-17},{ -5, 13},{ 14, 15},{-18, -4},{-19, 16},{ -3, 17},{ 18, -2},{-20, 19},{ 20, 21},{ 22,  0},{ -1,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{  5,  6},{-11,-10},{-12, -9},{  7,  8},{-13, -8},{  9,-14},{ -7, 10},{ -6,-15},{ 11, 12},{ -5,-16},{ 13, 14},{-17, 15},{ -4, 16},{ 17,-18},{ 18, -3},{ -2, 19},{ -1,  0},{-19, 20},{-20, 21},{ 22,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{  5,  6},{-11,  7},{-10,-12},{ -9,  8},{ -8,-13},{  9, -7},{ 10,-14},{ -6, 11},{-15, 12},{ -5, 13},{-16, -4},{ 14, 15},{-17, -3},{-18, 16},{ 17,-19},{ -2, 18},{-20, 19},{ -1, 20},{ 21, 22},{  0,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{  5,-12},{  6,-11},{  7,  8},{-10,-13},{ -9,  9},{ -8,-14},{ 10, -7},{ 11,-15},{ -6, 12},{ -5, 13},{ -4,-16},{ 14, 15},{ -3,-17},{ 16, 17},{-18, -2},{ 18,-19},{ -1, 19},{-20, 20},{-21, 21},{ 22,  0},{-22,-23}},
+{{  1,  2},{  3,  4},{  5,-12},{-13,  6},{-11,  7},{-14,  8},{-10,  9},{-15, -9},{ -8, 10},{ -7,-16},{ 11, -6},{ 12, -5},{-17, 13},{ 14,-18},{ 15, -4},{ 16,-19},{ 17, -3},{ 18, -2},{ 19, -1},{-20, 20},{ 21, 22},{  0,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}},
+{{  1,  2},{  3,  4},{-12,  5},{-11,-13},{  6,-14},{-10,  7},{  8,-15},{ -9,  9},{-16, 10},{ -8,-17},{ 11, 12},{ -7,-18},{ -6, 13},{ 14, -5},{ 15,-19},{ -4, 16},{-20, 17},{ 18, 19},{ 20, 21},{ 22,  0},{ -1, -3},{ -2,-21},{-22,-23}}};
+
+Word16 mlt_quant_centroid[NUM_CATEGORIES][MAX_NUM_BINS] = {
+{    0, 1606, 3119, 4586, 6049, 7502, 8941,10406,11851,13292,14736,16146,17566,19351,    0,    0},
+{    0, 2229, 4341, 6401, 8471,10531,12583,14588,16673,18924,    0,    0,    0,    0,    0,    0},
+{    0, 3055, 5998, 8929,11806,14680,17680,    0,    0,    0,    0,    0,    0,    0,    0,    0},
+{    0, 4121, 8192,12259,16322,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0},
+{    0, 5413,11071,16315,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0},
+{    0, 6785,14300,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0},
+{    0, 8044,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0},
+{    0, 8019,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0}};
+
+Word16 expected_bits_table[NUM_CATEGORIES] = {52, 47, 43, 37, 29, 22, 16,   0};
+
+
+Word16 mlt_sqvh_bitcount_category_0[196] = {
+ 1, 4, 6, 6, 7, 7, 8, 8, 8, 9, 9,10,11,11, 4, 5,
+ 6, 7, 7, 8, 8, 9, 9, 9, 9,10,11,11, 5, 6, 7, 8,
+ 8, 9, 9, 9, 9,10,10,10,11,12, 6, 7, 8, 9, 9, 9,
+ 9,10,10,10,10,11,12,13, 7, 7, 8, 9, 9, 9,10,10,
+10,10,11,11,12,13, 8, 8, 9, 9, 9,10,10,10,10,11,
+11,12,13,14, 8, 8, 9, 9,10,10,11,11,11,12,12,13,
+13,15, 8, 8, 9, 9,10,10,11,11,11,12,12,13,14,15,
+ 9, 9, 9,10,10,10,11,11,12,13,12,14,15,16, 9, 9,
+10,10,10,10,11,12,12,14,14,16,16,16, 9, 9,10,10,
+11,11,12,13,13,14,14,15,15,16,10,10,10,11,11,12,
+12,13,15,15,16,14,15,15,11,11,11,12,13,13,13,15,
+16,16,16,16,14,15,11,11,12,13,13,14,15,16,16,16,
+16,16,16,14};
+UWord16 mlt_sqvh_code_category_0[196] = {
+    1,    2,    1,   24,   14,   51,    9,   68,  110,   26,  218,   54,  154,  761,    3,   10,
+   22,    8,   58,   22,   71,   16,   30,   50,  213,   75,   94,  632,   15,   18,   52,   23,
+  107,    5,   54,   63,  239,   46,  276,  271,  851,  252,   28,   10,   12,    1,   22,  133,
+  191,   55,  105,  278,  317,  554,  310,  276,   32,   50,   94,   20,  187,  219,   13,  268,
+  473,  445,  145,  849, 1277,  623,    1,   14,    0,   55,  238,  121,  120,  269,  318,  530,
+  639, 1117,  509,  556,   24,   78,   51,  153,   62,  308,   16,   25,   68, 1058,  428,  277,
+ 2233, 1114,   92,  108,  141,  223,  270,  381,   24,  212,  760,   35, 1063,  279, 1717, 3439,
+    7,   21,  152,   73,  309,  310,   95,  944, 1890, 2232, 1891, 5107,10213, 4981,   61,   62,
+    9,   79,  474,  475,  848, 1059, 1056, 1716,  139, 4978, 4983, 4983,  140,  186,   76,  444,
+  144,  633, 1057,  838, 2237, 4472, 4473,10212,10212, 4983,   74,   78,  311,  213,  850, 1062,
+ 1119,  508,  276,  277, 4982, 4473,10212,10212,  208,   70,  555,  418,   68,  510, 2552, 1115,
+ 4980, 4979, 4982, 4982, 4473,10212,  215,   71,  253,  511,  839, 1718, 2488, 6876, 6877, 4979,
+ 4979, 4982, 4982, 4473};
+Word16 mlt_sqvh_bitcount_category_1[100] = {
+ 1, 4, 5, 6, 7, 8, 8, 9,10,10, 4, 5, 6, 7, 7, 8,
+ 8, 9, 9,11, 5, 5, 6, 7, 8, 8, 9, 9,10,11, 6, 6,
+ 7, 8, 8, 9, 9,10,11,12, 7, 7, 8, 8, 9, 9,10,11,
+11,13, 8, 8, 8, 9, 9,10,10,11,12,14, 8, 8, 8, 9,
+10,11,11,12,13,15, 9, 9, 9,10,11,12,12,14,14,14,
+ 9, 9, 9,10,11,12,14,16,14,14,10,10,11,12,13,14,
+16,16,16,14};
+UWord16 mlt_sqvh_code_category_1[100] = {
+    1,    2,   11,   27,   31,    9,  120,   31,  275,  310,    1,    0,   12,    5,   33,   54,
+  102,  111,  246,  448,   10,   14,   31,   39,   59,  100,  114,  202,  485,  969,   24,   26,
+   36,   52,  103,   30,  120,  242,   69, 1244,   35,   32,   14,   61,  113,  117,  233,  486,
+  487, 2491,   13,   12,   69,  110,  149,   35,  495,  449, 1978, 7751,   76,   75,  122,  136,
+  213,   68,  623,  930, 3959, 9961,  115,   16,  107,  225,  424,  850, 1936, 7916, 4981, 4981,
+  148,  154,  243,  407,  988,  851, 7750,19920, 7916, 4981,  406,  274,  464,  931, 3874, 7917,
+19921,19920,19920, 7916};
+Word16 mlt_sqvh_bitcount_category_2[49] = {
+ 1, 4, 5, 7, 8, 9,10, 3, 4, 5, 7, 8, 9,10, 5, 5,
+ 6, 7, 8,10,10, 7, 6, 7, 8, 9,10,12, 8, 8, 8, 9,
+10,12,14, 8, 9, 9,10,11,15,16, 9,10,11,12,13,16,
+15};
+UWord16 mlt_sqvh_code_category_2[49] = {
+    1,    0,   10,   11,   28,   62,  363,    3,    2,    9,    8,   24,   53,  352,    7,    8,
+   13,   25,   89,   74,  355,   10,   23,   24,   29,   55,  354, 1449,   25,   19,   30,   52,
+  108,  438, 5793,   91,   36,   63,  353,  725,11584,23170,  180,   75,  218,  439, 2897,23171,
+11584};
+Word16 mlt_sqvh_bitcount_category_3[625] = {
+ 2, 4, 6, 8,10, 5, 5, 6, 8,10, 7, 8, 8,10,12, 9,
+ 9,10,12,15,10,11,13,16,16, 5, 6, 8,10,11, 5, 6,
+ 8,10,12, 7, 7, 8,10,13, 9, 9,10,12,15,12,11,13,
+16,16, 7, 9,10,12,15, 7, 8,10,12,13, 9, 9,11,13,
+16,11,11,12,14,16,12,12,14,16,14, 9,11,12,16,16,
+ 9,10,13,15,16,10,11,12,16,16,13,13,16,16,16,16,
+16,15,16,16,11,13,16,16,15,11,13,15,16,16,13,13,
+16,16,16,14,16,16,16,16,16,16,16,16,16, 4, 6, 8,
+10,13, 6, 6, 8,10,13, 9, 8,10,12,16,10,10,11,15,
+16,13,12,14,16,16, 5, 6, 8,11,13, 6, 6, 8,10,13,
+ 8, 8, 9,11,14,10,10,12,12,16,13,12,13,15,16, 7,
+ 8, 9,12,16, 7, 8,10,12,14, 9, 9,10,13,16,11,10,
+12,15,16,13,13,16,16,15, 9,11,13,16,16, 9,10,12,
+15,16,10,11,13,16,16,13,12,16,16,16,16,16,16,16,
+16,11,13,16,16,16,11,13,16,16,16,12,13,15,16,16,
+16,16,16,16,16,16,16,16,16,16, 6, 8,11,13,16, 8,
+ 8,10,12,16,11,10,11,13,16,12,13,13,15,16,16,16,
+14,16,15, 6, 8,10,13,16, 8, 8,10,12,16,10,10,11,
+13,16,13,12,13,16,16,14,14,14,16,16, 8, 9,11,13,
+16, 8, 9,11,16,14,10,10,12,15,16,12,12,13,16,16,
+15,16,16,16,16,10,12,15,16,16,10,12,12,14,16,12,
+12,13,16,16,14,15,16,16,16,16,16,16,16,16,12,15,
+15,16,16,13,13,16,16,14,14,16,16,16,16,16,16,16,
+16,16,14,15,16,16,16, 8,10,13,15,16,10,11,13,16,
+16,13,13,14,16,16,16,16,16,16,16,16,16,16,16,16,
+ 8,10,11,15,16, 9,10,12,16,16,12,12,15,16,16,16,
+14,16,16,16,16,16,16,16,16, 9,11,14,16,16,10,11,
+13,16,16,14,13,14,16,16,16,15,15,16,16,16,16,16,
+16,16,11,13,16,16,16,11,13,15,16,16,13,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,15,16,16,16,16,
+14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16, 9,13,16,16,16,11,13,16,16,16,14,15,
+16,16,16,15,16,16,16,16,16,16,16,16,16, 9,13,15,
+15,16,12,13,14,16,16,16,15,16,16,16,16,16,16,16,
+16,16,16,16,16,16,11,13,15,16,16,12,14,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,15,15,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,15,
+16,16,13,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16};
+UWord16 mlt_sqvh_code_category_3[625] = {
+    3,    8,   46,  145,  228,    4,    8,   47,   28,  455,   89,    2,  180,    5, 1335,  250,
+   12,  644, 1311,  139,  729,  251,  870, 2172, 2211,    5,   23,  112,  334, 1469,   21,    3,
+    5,  111, 2014,   88,   79,  152,  124, 2685,  297,   48,  110, 1310,  149,  501, 1231,  153,
+ 2267, 2569,   57,   13,  653, 2587,  143,   75,  124,  118, 2611, 5242,   61,   50,  253, 3633,
+ 2216,  476,   39,   57, 1926, 2236, 2586, 1329, 1920, 2566, 1926,  296,  233, 2590, 2240, 2217,
+  253,  613,  867,  144,  318,  614,  252, 2589, 2242, 2218,  872,  866, 2187, 2296, 2155, 2568,
+ 2227,  150, 2567, 2296,  199, 2686, 2160, 2290,19145,  232, 2680,  128, 2192, 2212, 2684,  793,
+ 2281, 2223, 2242, 1934, 2165, 2146, 2291, 2296, 2222, 2189, 2187, 2296, 2296,    6,    4,   82,
+  725, 3632,   15,   21,   56,  599,  148,    3,  162,   42,  411, 2301,  735,  654,  930,  137,
+ 2586,  869, 1334, 1931, 2300, 2213,    9,   22,  146, 1290, 5240,    5,   12,   53,  630,  875,
+   80,    9,    8,   86, 2002,  210,  117,   56, 2019, 2162,  146,  397,  868,  131, 2151,   77,
+  160,  365, 2610, 2252,   59,   54,   41, 2591, 1928,  226,   14,  121, 5792, 2295, 1197,  728,
+  408,  130, 2157, 3635,  155, 2573, 2587,  130,  314,   64,  144, 2173, 2176,  115,   30,  409,
+  153, 2590,  631,   26, 4787, 2221, 2174, 2683, 1863, 2572,  319, 2150, 2177, 2194, 2571, 2257,
+  319,   65,  145, 2251, 2156, 2161,  909,  864, 2193, 2197, 2246, 2588, 5797,  156, 2258, 2221,
+ 2158, 2199, 2214, 2152,  319, 2188, 2264, 2572,  319,  319,   30,  117,  219,  865, 2263,  147,
+  127,  239,  410, 2247,   27,  324, 1468, 2681, 2180, 1328, 5241,  147,  142, 2237, 2241, 2245,
+ 1921, 2262,  142,   41,   11,  505, 2682, 2591,    0,   26,  229, 2015, 2577,  464,   98,   87,
+ 5243, 2166,  149, 2016, 5244, 2190, 2198, 9573,11598,11599, 2235, 2190,  144,  298, 1004, 5245,
+ 2277,  156,  104,  254, 2560, 1922,  612,  325, 2017,  129, 2588, 2608, 1330,  871, 2144, 2145,
+  132, 2147, 2148, 2149, 2144,  119, 1331,  133, 2153, 2154,  211,   58, 2609, 1923, 2159,  510,
+  163, 5246, 2163, 2164, 1924,  134, 2167, 2168, 2168, 2169, 2170, 2171, 2168, 2168, 1332,  135,
+  136, 2175, 2153,  150,  873, 2178, 2179, 1923, 1925, 2181, 2182, 2183, 2163, 2184, 2185, 2186,
+ 2168, 2168, 1924,  134, 2167, 2168, 2168,   58,  326, 2687,  138, 2191,   31,   66,  874, 2195,
+ 2196,  151,  152, 1927, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2205,
+   55,  103, 1230,  140, 2215,  118,   15, 1333, 2219, 2220, 2018,  511,  141, 2224, 2225, 2226,
+ 1929, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2229,  366, 1005, 1930, 2238, 2239,   12, 1006,
+ 5247, 2243, 2244, 1932, 3634, 1933, 2248, 2249, 2250,  145,  146, 2253, 2253, 2254, 2255, 2256,
+ 2253, 2253, 1291, 5793, 2259, 2260, 2261,  477, 5794,  147, 2265, 2266, 5795, 2268, 2269, 2270,
+ 2270, 2271, 2272, 2273, 2274, 2274, 2275, 2276, 2273, 2274, 2274,  148, 2278, 2279, 2280, 2260,
+ 1935, 2282, 2283, 2284, 2265, 2285, 2286, 2287, 2270, 2270, 2288, 2289, 2273, 2274, 2274, 2271,
+ 2272, 2273, 2274, 2274,  233, 5796, 2292, 2293, 2294, 1292, 3724, 2297, 2298, 2299, 2000,  151,
+ 2302, 2303, 2200,  152, 2561, 2562, 2563, 2205, 2564, 2565, 2204, 2205, 2205,  363,  154,  154,
+  155, 2570,   59, 3725, 2001, 2574, 2575, 2576,  157, 2578, 2579, 2224, 2580, 2581, 2582, 2583,
+ 2229, 2584, 2585, 2228, 2229, 2229,  654, 5798,  158, 2589, 2238, 2392, 2003, 2592, 2593, 2243,
+ 2594, 2595, 2596, 2597, 2248, 2598, 2599, 2600, 2253, 2253, 2250,  145,  146, 2253, 2253, 2601,
+ 2602, 2603, 2604, 2260, 2605, 2606, 2607, 6336, 2265, 6337, 6338, 6339, 2270, 2270, 6340, 6341,
+ 2273, 2274, 2274, 2271, 2272, 2273, 2274, 2274, 6342, 6343, 2259, 2260, 2260,38288U,38289U,  147,
+ 2265, 2265, 5795, 2268, 2269, 2270, 2270, 2271, 2272, 2273, 2274, 2274, 2271, 2272, 2273, 2274,
+ 2274};
+Word16 mlt_sqvh_bitcount_category_4[256] = {
+ 2, 4, 7,10, 4, 5, 7,10, 7, 8,10,14,11,11,15,15,
+ 4, 5, 9,12, 5, 5, 8,12, 8, 7,10,15,11,11,15,15,
+ 7, 9,12,15, 8, 8,12,15,10,10,13,15,14,14,15,13,
+11,13,15,15,11,13,15,15,14,15,15,13,15,15,13,13,
+ 4, 5, 9,13, 5, 6, 9,13, 9, 9,11,15,14,13,15,15,
+ 4, 6, 9,12, 5, 6, 9,13, 9, 8,11,15,13,12,15,15,
+ 7, 9,12,15, 7, 8,11,15,10,10,14,15,14,15,15,14,
+10,12,15,15,11,13,15,15,15,15,15,14,15,15,14,14,
+ 6, 9,13,14, 8, 9,12,15,12,12,15,15,15,15,15,15,
+ 7, 9,13,15, 8, 9,12,15,11,12,15,15,15,15,15,15,
+ 9,11,15,15, 9,11,15,15,14,14,15,15,15,15,15,15,
+14,15,15,15,14,15,15,15,15,15,15,15,14,14,15,15,
+ 9,12,15,15,12,13,15,15,15,15,15,15,15,15,15,15,
+10,12,15,15,12,14,15,15,15,15,15,15,15,15,15,15,
+14,15,15,15,15,15,15,15,15,15,15,15,14,14,15,15,
+15,15,15,15,15,15,15,15,14,14,15,15,14,14,15,15};
+UWord16 mlt_sqvh_code_category_4[256] = {
+    1,    2,    4,  572,   10,    0,   69,  712,   91,   10,   46, 9182, 1426, 1430,30172,30194,
+    9,   28,   22, 2258,   16,   25,  142, 2179,   15,  111,  719, 1521, 1131, 1437, 1520,30196,
+   88,  283, 3803,30193,   13,  236, 2856,30166,  545,  951, 5709, 1522, 3241, 9180,30179, 5709,
+ 1088, 4356,30410,30175, 1146,  377,30162,30163, 8715,30176,30165, 5709,30197,30184, 5709, 5709,
+    1,   23,   28, 5710,   26,   14,   29, 7538,  102,  103, 1429, 1524, 3237, 7060,30401,30201,
+   15,   13,  470, 3768,   24,   15,  281, 5747,   24,  181, 1128,30206, 5711, 3531,30156,30158,
+  116,  100, 2260,30187,  119,  234, 1764,30171,  716,  883, 9183,30164, 3236, 1528,30180, 9183,
+  885, 2870, 1532,30160, 1431, 5708,30192,30205,30402,30168,30173, 9183,30157,30161, 9183, 9183,
+   54,   25, 1621,15211,  180,  287, 2261,30198,  808,  811,30411,30413,30414,22986,22987,30411,
+   24,  273,  376,30159,  137,  280, 2871, 1523, 1768, 2259, 1525,30167, 1526,30169,30170, 1525,
+  443, 1434, 1527,30174,  474, 1769,30177,30178, 3238, 3239,30181,30181,30182,30183,30181,30181,
+ 3240,30185,30186, 1527, 9181,30188,30189,30177,30190,30191,30181,30181, 3238, 3239,30181,30181,
+  440, 2857, 1529,30195, 2294, 7061, 1530,30199,30200, 1531,30202,30411,30203,30204,30411,30411,
+  203, 2872,30207,30400,  189,11492,30403,30404,30405,30406,30407, 1525,30408,30409, 1525, 1525,
+ 8714, 1533,30412, 1527, 1534, 1535,30415,30177,30416,30417,30181,30181, 3238, 3239,30181,30181,
+30418,30419, 1527, 1527,30420,30421,30177,30177, 3238, 3239,30181,30181, 3238, 3239,30181,30181};
+Word16 mlt_sqvh_bitcount_category_5[243] = {
+ 2, 4, 8, 4, 5, 9, 9,10,14, 4, 6,11, 5, 6,12,10,
+11,15, 9,11,15,10,13,15,14,15, 6, 4, 6,12, 6, 7,
+12,12,12,15, 5, 7,13, 6, 7,13,12,13,15,10,12,15,
+11,13,15,15,15, 7, 8,13,15,11,12,15,15,15, 7,10,
+13,15,12,15,15,15,15, 7,15,15, 7,15,15, 7, 6, 7,
+ 7, 4, 5,11, 5, 7,12,11,12,15, 6, 7,13, 7, 8,14,
+12,14,15,11,13,15,12,13,15,15,15, 8, 5, 6,13, 7,
+ 8,15,12,14,15, 6, 8,14, 7, 8,15,14,15,15,12,12,
+15,12,13,15,15,15, 8, 9,13,15,12,13,15,15,15, 8,
+11,13,15,13,13,15,15,15, 8,14,15, 8,15,15, 8, 7,
+ 8, 8, 8,10,15,11,12,15,15,15, 7,10,12,15,12,13,
+15,15,15, 8,14,15, 7,15,15, 8, 7, 8, 8, 8,12,15,
+12,13,15,15,15, 8,11,13,15,13,15,15,15,15, 8,15,
+15, 8,15,15, 8, 7, 8, 8,14,15, 6,15,15, 8, 7, 8,
+ 8,15,15, 8,15,15, 8, 7, 8, 8, 6, 8, 8, 7, 8, 8,
+ 7, 8, 8};
+UWord16 mlt_sqvh_code_category_5[243] = {
+    0,    5,  220,   10,   16,  443,  390,  391,14333,   11,   26, 1566,   26,   54, 3135,  508,
+ 1558,28581,  255, 1782,28599,  885, 6208,28578,14335,28579,   54,    9,   35, 3129,   27,   68,
+ 3537, 1562, 3568,28610,   25,   62, 4078,   58,  118, 7763, 3107, 7758,28563,  778, 3131,28598,
+  780, 7123,28630,28593,28586,  118,  243, 6210,28614, 1018, 3567,28601,28611,28570,   68,  388,
+ 6256,28619, 1559,28562,28606,28565,28591,  118,28594,28571,   62,28618,28590,  118,   58,  118,
+  118,    4,   28, 1781,   31,   60, 3134, 1938, 3882,28574,   25,   96, 7757,   49,  126,14244,
+ 3883,14334,28613, 1769, 4077,28602, 3106, 7756,28582,28621,28566,  126,   14,   61, 4079,   61,
+  138,28491, 3536, 8153,28573,   49,   96,12442,  119,  240,28490,12443,28560,28561, 3111, 3580,
+28564, 3130, 7759,28567,28568,28569,  240,  444, 6209,28572, 3569, 6211,28575,28576,28577,  138,
+  778, 7760,28580, 7761, 7762,28583,28584,28585,  240,14319,28587,   96,28588,28589,  240,  119,
+  240,  240,  139,  968,28592, 1554, 3581,28595,28596,28597,   60,  971, 3560,28600, 3582, 7132,
+28603,28604,28605,  126,14332,28607,   96,28608,28609,  126,   49,  126,  126,  241, 1558,28612,
+ 1563, 6257,28615,28616,28617,  138, 1559, 7133,28620, 6220,28622,28623,28624,28625,  240,28626,
+28627,   96,28628,28629,  240,  119,  240,  240, 8152,28631,   61,28632,28633,  138,   61,  138,
+  138,28634,28635,   96,28636,28637,  240,  119,  240,  240,   49,   96,   96,  119,  240,  240,
+  119,  240,  240};
+Word16 mlt_sqvh_bitcount_category_6[32] = {
+ 1, 4, 4, 6, 4, 6, 6, 8, 4, 6, 6, 8, 6, 9, 8,10,
+ 4, 6, 7, 8, 6, 9, 8,11, 6, 9, 8,10, 8,10, 9,11};
+UWord16 mlt_sqvh_code_category_6[32] = {
+    1,    2,    4,    2,    5,   29,   24,  101,    3,   31,   28,  105,    3,    5,  102,  424,
+    1,   30,    0,  107,   27,  200,  103,  806,    1,    4,  104,  402,    3,  425,  213,  807};
+
+Word16 *table_of_bitcount_tables[NUM_CATEGORIES-1] = {
+mlt_sqvh_bitcount_category_0,
+mlt_sqvh_bitcount_category_1,
+mlt_sqvh_bitcount_category_2,
+mlt_sqvh_bitcount_category_3,
+mlt_sqvh_bitcount_category_4,
+mlt_sqvh_bitcount_category_5,
+mlt_sqvh_bitcount_category_6
+};
+
+
+UWord16 *table_of_code_tables[NUM_CATEGORIES-1] = {
+(UWord16 *)mlt_sqvh_code_category_0,
+(UWord16 *)mlt_sqvh_code_category_1,
+(UWord16 *)mlt_sqvh_code_category_2,
+(UWord16 *)mlt_sqvh_code_category_3,
+(UWord16 *)mlt_sqvh_code_category_4,
+(UWord16 *)mlt_sqvh_code_category_5,
+(UWord16 *)mlt_sqvh_code_category_6
+};
+
+Word16 mlt_decoder_tree_category_0[180][2] = {
+{   1,   0},{   2,   3},{   4,   5},{   6,   7},{   8,   9},{  -1, -14},{  10,  11},{  12,  13},
+{  14,  15},{  16,  17},{  18,  19},{ -15,  20},{  21,  22},{  23, -28},{  24,  -2},{  25,  26},
+{  27,  28},{  29,  30},{  31,  32},{ -29,  33},{ -16,  34},{  -3,  35},{  36,  37},{ -42,  38},
+{  39,  40},{  41,  42},{  43,  44},{ -17,  45},{ -43,  46},{  47,  48},{  -4,  49},{ -56,  50},
+{  51,  52},{  53,  54},{  55,  56},{ -57,  -5},{ -30,  57},{  58,  59},{ -18,  60},{  61, -70},
+{  62,  63},{  64,  -6},{  65,  66},{ -44,  67},{ -71,  68},{  69,  70},{ -19, -31},{ -84,  71},
+{  72,  73},{  74,  75},{  76,  77},{  -7,  78},{  79, -20},{  80,  81},{ -85,  82},{ -98,  83},
+{ -58,  84},{  85, -32},{ -99,  86},{  -8,  87},{  88,  89},{ -72, -45},{  90, -33},{  91,-112},
+{ -21,  92},{ -59,-113},{ -46,  93},{  -9,  94},{ -22,  95},{  96,  97},{  98,  99},{ -23, -86},
+{ 100, 101},{ -34, -73},{ 102,-126},{-127, -35},{ 103, -47},{ 104, 105},{ 106, 107},{-140,-100},
+{-114, -87},{ 108, 109},{ 110, 111},{-141, -60},{ 112, -48},{ 113, -24},{ -10, -61},{ 114,-101},
+{ 115, 116},{ -74, -36},{ 117,-128},{ 118, -62},{ 119, 120},{ -37, 121},{ -11, -49},{ -88, 122},
+{ 123,-115},{-154, -25},{-142, 124},{-155,-129},{ 125, -50},{ 126, 127},{ -76, -75},{ 128, 129},
+{ -63, -77},{-102, -39},{ -38, 130},{ -51, 131},{ -89,-116},{-117,-156},{ 132, -52},{ -78, 133},
+{ 134,-103},{ 135, 136},{-143, -65},{ 137, -64},{-130,-131},{ -90, 138},{-104, -91},{ -92, 139},
+{-169,-183},{ -26,-118},{ 140, 141},{-144, -66},{ -12, 142},{-168, 143},{-105,-157},{ 144,-182},
+{ 145, 146},{ -79, 147},{ -53,-170},{ 148, 149},{ -27,-145},{ 150, -80},{-106, -13},{-132, -67},
+{-158, -40},{-119, 151},{ 152,-107},{ 153, 154},{ -41,-184},{ 155, 156},{ -54, 157},{-171, 158},
+{ -94, 159},{-134,-146},{ -93,-133},{-159,-108},{ 160, -81},{ 161,-160},{ 162, -68},{-120,-122},
+{-172, 163},{ -55, -95},{ 164,-109},{-161, -82},{-173,-185},{ 165, -69},{-147,-186},{ 166, 167},
+{-121, -96},{ 168,-148},{-174, 169},{ 170,-136},{ -83, 171},{ 172, 173},{-135,-110},{-187, 174},
+{-149,-150},{ 175,-123},{-162,-163},{ -97,-175},{-188, 176},{ 177, 178},{ 179,-111},{-151,-124},
+{-137,-177},{-176,-125},{-164,-138},{-189,-190},};
+Word16 mlt_decoder_tree_category_1[93][2] = {
+{   1,   0},{   2,   3},{   4,   5},{   6,   7},{   8, -10},{  -1,   9},{  10,  11},{  12,  13},
+{ -11,  14},{  15,  16},{  17,  18},{ -20,  -2},{  19,  20},{ -21,  21},{  22,  23},{ -12,  24},
+{  25,  26},{  27,  28},{  29,  30},{ -30,  31},{ -31,  -3},{  32, -22},{  33, -13},{  34,  35},
+{  36,  37},{  38,  39},{  40,  -4},{ -41, -14},{  41, -40},{ -32,  42},{  43, -23},{  44,  45},
+{  46,  47},{  48,  -5},{ -51, -50},{ -42,  49},{ -33,  50},{ -15,  51},{  52,  53},{  54, -24},
+{  55, -43},{  56, -52},{  57, -61},{ -60,  58},{ -25,  59},{ -16, -34},{  -6,  60},{ -62,  61},
+{ -71,  62},{ -35,  -7},{  63, -72},{ -53, -17},{  64, -44},{ -26, -70},{  65, -45},{ -36,  66},
+{ -63,  67},{ -80, -54},{ -81,  68},{ -27,  69},{  70, -82},{ -18,  71},{  72, -55},{  73, -64},
+{  74, -73},{  75, -46},{ -37,  76},{ -91,  -8},{  -9,  77},{ -90, -83},{  78, -28},{  79, -56},
+{ -65, -38},{ -74,  80},{ -19, -57},{ -92,  81},{ -47, -48},{  82, -66},{  83, -29},{ -84,  84},
+{ -75, -85},{ -67, -93},{ -39,  85},{ -76,  86},{ -58,  87},{  88, -49},{ -94,  89},{  90, -68},
+{  91, -78},{ -86, -59},{ -77, -95},{  92, -69},{ -87, -96},};
+Word16 mlt_decoder_tree_category_2[47][2] = {
+{   1,   0},{   2,   3},{   4,   5},{   6,  -7},{  -1,   7},{  -8,   8},{   9,  10},{  11,  12},
+{  13, -14},{ -15,  -9},{  -2,  14},{  15,  16},{  17,  18},{  19, -16},{  20, -22},{ -10,  21},
+{ -21,  -3},{  22,  23},{  24,  25},{ -23, -17},{  26,  27},{  28, -29},{ -11, -28},{  29,  30},
+{  -4, -24},{ -30,  31},{  32, -18},{  33, -35},{ -36,  34},{ -31, -12},{  35, -25},{  -5, -37},
+{  36,  37},{ -42,  38},{ -19, -43},{ -32,  39},{ -13, -38},{ -26, -20},{  40,  -6},{ -44,  41},
+{  42, -39},{ -33, -45},{  43, -27},{  44, -46},{  45, -34},{ -40,  46},{ -41, -47},};
+Word16 mlt_decoder_tree_category_3[519][2] = {
+{   1,   2},{   3,   4},{   5,   0},{   6,   7},{   8,   9},{  10,  11},{  12,  13},{  14,  15},
+{  16,  17},{-125,  18},{  -1,  19},{  20,  21},{  22,  23},{  24,  25},{  -5, -25},{  26,  27},
+{  -6,-150},{  28,  29},{  30,  31},{  32,  33},{  34, -30},{  35,  36},{  37,  38},{  39, -31},
+{-126,-155},{  40,  41},{-156,  42},{  43,-130},{  44,-131},{-151, -26},{  45,  46},{-250,  47},
+{  48,  49},{  50,  51},{  52,-275},{  53,  54},{  -2,  -7},{  55,  56},{  57,  58},{  59,  60},
+{  61,  62},{  63,  64},{  65,  66},{  67,  68},{  69,  70},{  71, -50},{  72,-180},{  73,  74},
+{  75,  76},{  77, -55},{  78,-175},{  79, -36},{  80,  81},{ -35, -10},{  82,  83},{-280,  84},
+{ -11,  85},{  86, -32},{  87,  88},{  89,-161},{  90,-276},{  91,  92},{-281,  93},{  -8,  94},
+{  95,  96},{  97,-157},{-181,-400},{-132,  98},{-375,  99},{-160, 100},{-127, 101},{ -27, 102},
+{ 103,-251},{ -56, 104},{ 105,-256},{-300,  -3},{-152,-255},{ 106, 107},{ -37, 108},{-305, 109},
+{-176, 110},{-136, 111},{ -12, 112},{ 113, 114},{ 115,-135},{ 116, 117},{-162, 118},{ -16, -51},
+{-186, 119},{ 120, 121},{ 122, 123},{ -41, 124},{ -61, 125},{ 126, 127},{ 128, 129},{ 130, -60},
+{ 131, 132},{-306, 133},{ 134,-205},{-405, 135},{ 136, 137},{ 138, 139},{-185, 140},{ 141,-500},
+{ -15, 142},{ 143, -80},{ -75, -40},{-301, 144},{ 145, 146},{-200, 147},{ 148, 149},{ 150, 151},
+{ 152,-525},{ 153,-177},{-425, 154},{ 155, -13},{-430, 156},{ 157,-406},{ 158, 159},{-206,-380},
+{ 160, 161},{ 162, 163},{ 164,-182},{-137, 165},{-286, 166},{ 167,-401},{ 168, 169},{ -42, -33},
+{ 170,-166},{ -57,-325},{ 171,-187},{ -38, 172},{ 173, 174},{-165,-330},{  -4,-282},{ 175,-257},
+{-261,-311},{-376, 176},{ 177, 178},{ -28, 179},{ 180,  -9},{-285, 181},{ 182, 183},{ 184,-277},
+{ 185,-133},{-310, -81},{ -85, 186},{-158,-210},{ -17, 187},{ 188, 189},{ 190, -52},{-141, 191},
+{ 192,-128},{-191, -20},{ 193,-140},{ 194, 195},{-211,-260},{ 196, 197},{ 198, 199},{ 200, -66},
+{-201,-225},{-381, 201},{ 202, 203},{ 204, 205},{ 206, 207},{-163,-287},{ 208,-100},{ 209, 210},
+{ 211, 212},{ 213,-252},{-105, -76},{ 214, 215},{ 216, -21},{ -86, -62},{-307, 217},{ -65,-455},
+{-550, 218},{ 219, 220},{ 221, 222},{ 223, 224},{ 225,-230},{-142, 226},{-302,-426},{-431, 227},
+{ 228, 229},{ 230,-190},{-402, -46},{-153,-450},{-505, 231},{ 232, 233},{ 234, 235},{ 236, 237},
+{ 238, 239},{-262, -29},{ 240, 241},{ 242, 243},{-167, -67},{-331,-530},{ 244, 245},{ 246, 247},
+{ 248, 249},{ 250, 251},{ 252, 253},{ 254, 255},{ 256, 257},{ 258, 259},{ 260, 261},{ 262,-336},
+{ 263,-171},{-192,-207},{-258,-138},{ 264, 265},{ 266, 267},{ 268, 269},{ 270, 271},{ 272, 273},
+{ 274, -45},{-335,-411},{ -43, -18},{-265, -71},{-316,-326},{-350,-407},{-146, -14},{ 275, 276},
+{ 277, 278},{ 279, 280},{ 281,-216},{ -34,-283},{-291,-312},{-410,-168},{-555, 282},{ -70, -53},
+{-235, -87},{ -77,-183},{-315,-332},{-178, -58},{ 283, 284},{ 285, 286},{ 287, 288},{ 289, 290},
+{ 291, 292},{ 293, 294},{ 295, 296},{ 297, 298},{-202,-226},{-170,-267},{-134,-290},{-355,-385},
+{-386, -47},{-526,-196},{ 299, 300},{ 301, 302},{ 303, 304},{ 305, 306},{ 307, 308},{ 309, 310},
+{ 311, 312},{ 313, 314},{ 315, 316},{ 317, 318},{ 319, 320},{ 321, 322},{ 323, 324},{ 325,-111},
+{-231,-253},{ -91, -82},{-172,-145},{ -22,-317},{ -90,-356},{-382,-159},{ 326, 327},{ 328, 329},
+{ 330, 331},{ 332, 333},{ 334, 335},{-106,-263},{-278,-215},{-110, -39},{-101,-377},{-129, -63},
+{-436,-195},{-506,-531},{ 336,-212},{-154,-266},{ -59,-288},{-292,-303},{-337,-432},{-188,-451},
+{-456,-460},{-501,-236},{-551, 337},{ 338, 339},{ 340, 341},{ 342, 343},{ 344, 345},{ 346, 347},
+{ 348, 349},{ 350, 351},{ 352, 353},{ 354, 355},{ 356, 357},{ 358, 359},{ 360, 361},{ 362, 363},
+{ 364, 365},{ 366, 367},{ 368, 369},{ 370, 371},{ 372, 373},{ 374, 375},{ 376, 377},{ 378, 379},
+{ 380, 381},{ 382, 383},{ 384, 385},{ 386, 387},{ 388, 389},{ 390, 391},{ 392, 393},{ 394, 395},
+{ 396, 397},{ 398, 399},{ 400, 401},{ 402, 403},{ 404, 405},{ 406, 407},{ -72,-272},{-309,-333},
+{-340,-360},{ -68,-387},{-184,-416},{-427,-147},{-435,-437},{-115,-480},{-510,-532},{-164,-556},
+{ 408,-295},{-296,-297},{-107,-313},{-193,-173},{-320,-327},{-341,-351},{-352,-143},{-378, -19},
+{-403,-412},{-268, -54},{ -83,-441},{-442,-457},{-475, -44},{ -97,-511},{-515,-208},{-527,-528},
+{-237,-536},{-552, 409},{ 410, 411},{ 412, 413},{ 414, 415},{ 416, 417},{ 418, 419},{ 420, 421},
+{ 422, 423},{ 424, 425},{ 426, 427},{ 428, 429},{ 430, 431},{ 432, 433},{ 434, 435},{ 436, 437},
+{ 438, 439},{ 440, 441},{ 442, 443},{ 444, 445},{ 446, 447},{ 448, 449},{ 450, 451},{ 452, 453},
+{ 454, 455},{ 456, 457},{ 458, 459},{ 460, 461},{ 462, 463},{ 464, 465},{ 466, 467},{ 468, 469},
+{ 470, 471},{ 472, 473},{ 474, 475},{ 476, 477},{ 478, 479},{ 480, 481},{ 482, 483},{ 484, 485},
+{ 486, 487},{ 488, 489},{ 490, 491},{ 492, 493},{ 494, 495},{ 496, 497},{ 498, 499},{ 500, 501},
+{ 502, 503},{ 504, 505},{ 506, 507},{ 508, 509},{ 510, 511},{ 512, 513},{ 514, 515},{ 516, 517},
+{ 518,-104},{ -84,-218},{-318,-319},{-117,-321},{-322,-323},{-219,-174},{-243,-328},{-329, -94},
+{-228,-194},{-240,-334},{-102,-229},{-169,-338},{-339,-116},{-289,-342},{-343,-345},{-346,-347},
+{ -23,-203},{-214,-353},{-204,-220},{-357,-358},{-264,-361},{-362,-363},{-365,-366},{-367, -92},
+{-245,-121},{-293,-379},{-108,-232},{-221,-383},{-384,-233},{-294,-241},{-388,-389},{-390,-391},
+{-392,-393},{-394,-395},{-396,-397},{-398, -24},{-109,-149},{-242,-404},{ -64, -79},{ -89,-408},
+{-409,-213},{-120,-113},{-413,-414},{-415, -96},{-417,-418},{-419,-420},{-421,-422},{-423,-298},
+{ -69,-269},{-428,-429},{ -78,-270},{ -88,-433},{-434,-271},{-234,-259},{-438,-439},{-440,-227},
+{-179,-443},{-445,-446},{-447,-223},{-238,-452},{-453,-454},{-273,-254},{-246,-458},{-459, -48},
+{-461,-462},{-463,-465},{-466,-467},{-468,-470},{-471,-304},{-476,-477},{-478,-112},{-481,-482},
+{-483,-485},{-486,-487},{-490,-491},{-103,-118},{-502,-503},{-504,-189},{ -93,-507},{-508,-509},
+{-148,-139},{-512,-513},{-308,-516},{-517,-518},{-520,-521},{ -73, -98},{ -95, -49},{-529,-222},
+{-217,-197},{-533,-534},{-535,-284},{-537,-538},{-540,-541},{-542,-543},{-545,-546},{-144,-198},
+{-314,-553},{-209,-279},{-557,-558},{-560,-561},{-562,-563},{-565,-566},{-567,-575},{-576,-577},
+{-578,-580},{-581,-582},{-583,-585},{-586,-587},{-590,-591},{-600,-601},{-605,-606},};
+Word16 mlt_decoder_tree_category_4[208][2] = {
+{   1,   2},{   3,   0},{   4,   5},{   6,   7},{   8,   9},{  10,  11},{  12, -64},{  -1,  13},
+{  14, -16},{  -4,  15},{  16,  17},{  18, -80},{  -5,  19},{  20,  21},{ -20,  22},{  23, -65},
+{ -84, -21},{ -68,  24},{ -17,  25},{  26,  27},{  28, -81},{ -69, -85},{  29,  30},{  31,  32},
+{-128,  33},{  34,  35},{  -2,  36},{  37,  38},{-144,  39},{  40,  -6},{  41,  42},{ -32,  43},
+{  44,  -8},{  45, -25},{ -96,  46},{  47,-100},{  -9,  48},{  49, -36},{  50, -24},{  51,  52},
+{  53,-148},{  54,  55},{ -22,  56},{  57,  58},{-132, -89},{  59,  60},{-101,  61},{ -37,  62},
+{ -18,  63},{ -88,-129},{ -66, -70},{ -97,  64},{ -72, -73},{  65,-145},{-149, -86},{  66, -33},
+{  67,-133},{  68,  69},{  70,  71},{-192,  72},{  73,-160},{ -82,  74},{-164,  75},{ -10,  76},
+{  77,-208},{  78, -40},{  79,  80},{  -3,  81},{  -7,  82},{  83,  84},{-104,  85},{  86, -26},
+{  87,-105},{  88,-112},{  89,  90},{  91, -41},{  92,  93},{  94,  95},{ -48,  96},{ -90,  97},
+{  98, -28},{ -52,  99},{ -12, 100},{ 101, -74},{ -13,-116},{-161, 102},{ 103, -29},{-102, 104},
+{-152,-165},{ 105, 106},{ 107, 108},{ 109, 110},{ 111,-212},{ 112, 113},{-136, 114},{ 115,-137},
+{ 116, -23},{ -19,-153},{ -98,-134},{-196, 117},{ 118, 119},{ -38,-193},{-113,-150},{-209, 120},
+{ 121, -93},{ -83, 122},{ 123, 124},{ 125, 126},{ 127, 128},{ 129, 130},{ 131, -34},{-146, -53},
+{ 132, 133},{ 134, 135},{ 136, 137},{ 138,-130},{ -49, 139},{ 140, 141},{-117, -42},{ -67, -92},
+{ 142, -87},{ -77,-197},{ -71, 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},
+{-108, -76},{-168,-169},{-176, -44},{-224, -56},{ -45,-180},{ -11,-106},{-213, 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, 206},{ 207,-131},{ -30, -27},{ -43,-151},{ -75,-154},{-156,-162},{-109,-194},{-198,-201},
+{-114,-225},{-228,-229},{-141,-142},{ -94,-124},{ -95,-147},{-115,-125},{ -54, -55},{-107, -58},
+{ -39,-155},{-121,-157},{-158,-103},{ -14,-122},{-163, -51},{ -57,-166},{-167, -46},{-110,-170},
+{-172,-173},{ -61,-177},{-178, -99},{-181,-182},{-184,-185},{-118, -35},{ -15,-195},{ -31, -60},
+{-135,-199},{-200, -79},{-202,-204},{-205,-119},{ -91,-210},{-211, -78},{-120,-214},{-215,-216},
+{-217,-218},{-220,-221},{ -50,-138},{-226,-139},{-140,-230},{-232,-233},{-240,-241},{-244,-245},
+};
+Word16 mlt_decoder_tree_category_5[191][2] = {
+{   1,   2},{   0,   3},{   4,   5},{   6,   7},{   8,   9},{  10,  11},{ -81,  -1},{  12,  13},
+{  14, -27},{  -3,  -9},{  15,  16},{  17,  18},{  19,  20},{-108,  21},{  -4,  22},{  23, -36},
+{ -12,  24},{ -82,  25},{  26, -84},{  27, -90},{ -10, -30},{  28,  29},{  30, -28},{  31,-117},
+{ -13,  32},{ -39,  33},{  34,-109},{  35, -93},{ -85,-111},{ -37,  36},{ -31,  37},{ -91,  38},
+{  39,  40},{ -40,-120},{  41,  42},{-118,  43},{ -94,  44},{-112,-162},{  45,  46},{  -2,  47},
+{  48,  49},{-121,-189},{  50, -54},{  51,  52},{  53, -18},{  54,  55},{  -6,  56},{  57,  -5},
+{-135,  58},{  59,  60},{  61,  62},{ -63,  63},{  64,  -7},{ -15,  65},{  66,  67},{ -45,  68},
+{  69,  70},{  71, -21},{  72,  73},{  74,  75},{  76,  77},{-163,  78},{  79,-171},{-144,  80},
+{ -48,  81},{ -57,  82},{  83,  84},{-165,  85},{ -16,-198},{  86,  87},{ -11,  88},{  89, -99},
+{  90, -83},{ -19,  91},{  92,  93},{  94,  95},{  96,  97},{  98,  99},{ -87, 100},{ 101, 102},
+{-190, -66},{ -33,-192},{ 103, 104},{ 105, 106},{-102, -42},{ 107,-126},{ 108, -29},{-129, -46},
+{ -86, -14},{-114, -32},{-172, 109},{ 110, -58},{ -34,-138},{ 111, 112},{ 113, 114},{ 115, 116},
+{ 117, 118},{ 119, 120},{-127,-166},{-174, 121},{ 122, 123},{ 124, 125},{ -88, -96},{ 126,-100},
+{ -38,-110},{ -22,-136},{ -55,-139},{-201, 127},{ -64,-193},{ 128, -49},{-175,-199},{ 129, 130},
+{ 131, 132},{ 133, 134},{ 135, 136},{ 137, 138},{ 139, 140},{ 141, 142},{ 143, 144},{ 145, 146},
+{ 147, 148},{ 149, 150},{-103, -92},{ -43,-130},{-145,-147},{-148, -41},{-216,-115},{-119,-123},
+{ -95, 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,-153},{-180,  -8},{ -97, -24},{-122,-113},
+{-124,-125},{ -67, -44},{-128, -69},{-106,-131},{-132,-133},{ -61, -73},{-137,-116},{ -89,-140},
+{-141,-142},{ -23, -25},{-146, -17},{-104,-149},{-150,-151},{ -52,-154},{-156,-157},{ -76, -70},
+{-164, -51},{ -72,-167},{-168,-169},{ -47, -20},{-173, -59},{-101,-176},{-177,-178},{ -68,-181},
+{-183,-184},{ -35, -60},{-191, -98},{ -56,-194},{-195,-196},{ -75, -65},{-200,-105},{-202,-203},
+{-204,-205},{-207,-208},{-210,-211},{ -50,-217},{-219,-220},{-225,-226},{-228,-229},};
+Word16 mlt_decoder_tree_category_6[31][2] = {
+{   1,   0},{   2,   3},{   4,   5},{   6,   7},{   8, -16},{  -1,  -8},{  -2,  -4},{   9,  10},
+{  11,  12},{  13,  14},{  15,  16},{  17, -24},{  -3, -12},{  -6,  18},{  19, -20},{ -10,  -5},
+{ -17,  -9},{ -18,  20},{  21,  22},{  23,  24},{  25, -28},{  26,  -7},{ -14, -22},{ -26, -11},
+{  27, -19},{ -25, -13},{ -21,  28},{  29, -30},{ -27,  30},{ -15, -29},{ -23, -31},};
+
+Word16 *table_of_decoder_tables[NUM_CATEGORIES-1] = {
+(Word16 *)mlt_decoder_tree_category_0,
+(Word16 *)mlt_decoder_tree_category_1,
+(Word16 *)mlt_decoder_tree_category_2,
+(Word16 *)mlt_decoder_tree_category_3,
+(Word16 *)mlt_decoder_tree_category_4,
+(Word16 *)mlt_decoder_tree_category_5,
+(Word16 *)mlt_decoder_tree_category_6,
+};
+
diff --git a/third_party/g7221/common/huff_tab.h b/third_party/g7221/common/huff_tab.h
new file mode 100644
index 0000000..5ccd650
--- /dev/null
+++ b/third_party/g7221/common/huff_tab.h
@@ -0,0 +1,42 @@
+/***********************************************************************
+**
+**   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.
+**
+***********************************************************************/
+
+extern Word16  differential_region_power_bits[MAX_NUMBER_OF_REGIONS][DIFF_REGION_POWER_LEVELS];
+extern UWord16 differential_region_power_codes[MAX_NUMBER_OF_REGIONS][DIFF_REGION_POWER_LEVELS];
+extern Word16  differential_region_power_decoder_tree[MAX_NUMBER_OF_REGIONS][DIFF_REGION_POWER_LEVELS-1][2];
+extern Word16  mlt_quant_centroid[NUM_CATEGORIES][MAX_NUM_BINS];
+extern Word16  expected_bits_table[NUM_CATEGORIES];
+extern Word16  mlt_sqvh_bitcount_category_0[196];
+extern UWord16 mlt_sqvh_code_category_0[196];
+extern Word16  mlt_sqvh_bitcount_category_1[100];
+extern UWord16 mlt_sqvh_code_category_1[100];
+extern Word16  mlt_sqvh_bitcount_category_2[49];
+extern UWord16 mlt_sqvh_code_category_2[49];
+extern Word16  mlt_sqvh_bitcount_category_3[625];
+extern UWord16 mlt_sqvh_code_category_3[625];
+extern Word16  mlt_sqvh_bitcount_category_4[256];
+extern UWord16 mlt_sqvh_code_category_4[256];
+extern Word16  mlt_sqvh_bitcount_category_5[243];
+extern UWord16 mlt_sqvh_code_category_5[243];
+extern Word16  mlt_sqvh_bitcount_category_6[32];
+extern UWord16 mlt_sqvh_code_category_6[32];
+extern Word16  *table_of_bitcount_tables[NUM_CATEGORIES-1];
+extern UWord16 *table_of_code_tables[NUM_CATEGORIES-1];
+extern Word16  mlt_decoder_tree_category_0[180][2];
+extern Word16  mlt_decoder_tree_category_1[93][2];
+extern Word16  mlt_decoder_tree_category_2[47][2];
+extern Word16  mlt_decoder_tree_category_3[519][2];
+extern Word16  mlt_decoder_tree_category_4[208][2];
+extern Word16  mlt_decoder_tree_category_5[191][2];
+extern Word16  mlt_decoder_tree_category_6[31][2];
+extern Word16  *table_of_decoder_tables[NUM_CATEGORIES-1];
+
diff --git a/third_party/g7221/common/stl-files/basop32.c b/third_party/g7221/common/stl-files/basop32.c
new file mode 100644
index 0000000..86d97dd
--- /dev/null
+++ b/third_party/g7221/common/stl-files/basop32.c
@@ -0,0 +1,2724 @@
+/*                                                      v.1.0 - 26.Jan.2000
+  =============================================================================
+
+                          U    U   GGG    SSSS  TTTTT
+                          U    U  G       S       T
+                          U    U  G  GG   SSSS    T
+                          U    U  G   G       S   T
+                           UUU     GG     SSS     T
+
+                   ========================================
+                    ITU-T - USER'S GROUP ON SOFTWARE TOOLS
+                   ========================================
+
+       =============================================================
+       COPYRIGHT NOTE: This source code, and all of its derivations,
+       is subject to the "ITU-T General Public License". Please have
+       it  read  in    the  distribution  disk,   or  in  the  ITU-T
+       Recommendation G.191 on "SOFTWARE TOOLS FOR SPEECH AND  AUDIO
+       CODING STANDARDS".
+       =============================================================
+
+MODULE:         BASOP, BASIC OPERATORS
+
+ORIGINAL BY:
+                Incorporated from anonymous contributions for 
+                ETSI Standards as well as G.723.1, G.729, and G.722.1
+
+DESCRIPTION:
+        This file contains the definition of 16- and 32-bit basic
+        operators to be used in the implementation of signal
+        processing algorithms. The basic operators try to resemble
+        assembly language instructions that are commonly found in
+        digital signal processor (DSP) CPUs, thus allowing algorithm
+        C-code implementations more directly mapeable to DSP assembly
+        code.
+
+        *********************************************************
+         NOTE: so far, this module does not have a demo program!
+        *********************************************************
+
+FUNCTIONS:
+  Defined in basop.h. Self-documentation within each function.
+
+HISTORY:
+  26.Jan.00	v1.0	Incorporated to the STL from updated G.723.1/G.729 
+                        basic operator library (based on basicop2.c) and 
+                        G.723.1's basop.c [L_mls(), div_l(), i_mult()]
+  05.Jul.00     v1.1    Added 32-bit shiftless accumulation basic 
+                        operators (L_msu0, L_mac0, L_mult0). Improved
+                        documentation for i_mult().
+  =============================================================================
+*/
+
+/*___________________________________________________________________________
+ |                                                                           |
+ | Basic arithmetic operators.                                               |
+ |                                                                           |
+ | $Id $
+ |___________________________________________________________________________|
+*/
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Include-Files                                                           |
+ |___________________________________________________________________________|
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "typedef.h"
+#include "basop32.h"
+
+#if (WMOPS)
+#include "count.h"
+extern BASIC_OP multiCounter[MAXCOUNTERS];
+extern int currCounter;
+
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Local Functions                                                         |
+ |___________________________________________________________________________|
+*/
+Word16 saturate (Word32 L_var1);
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Constants and Globals                                                   |
+ |___________________________________________________________________________|
+*/
+Flag Overflow = 0;
+Flag Carry = 0;
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Functions                                                               |
+ |___________________________________________________________________________|
+*/
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : saturate                                                |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    Limit the 32 bit input to the range of a 16 bit word.                  |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 saturate (Word32 L_var1)
+{
+    Word16 var_out;
+
+    if (L_var1 > 0X00007fffL)
+    {
+        Overflow = 1;
+        var_out = MAX_16;
+    }
+    else if (L_var1 < (Word32) 0xffff8000L)
+    {
+        Overflow = 1;
+        var_out = MIN_16;
+    }
+    else
+    {
+        var_out = extract_l (L_var1);
+#if (WMOPS)
+        multiCounter[currCounter].extract_l--;
+#endif
+    }
+
+    return (var_out);
+}
+/* ------------------------- End of saturate() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : add                                                     |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    Performs the addition (var1+var2) with overflow control and saturation;|
+ |    the 16 bit result is set at +32767 when overflow occurs or at -32768   |
+ |    when underflow occurs.                                                 |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 add (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 L_sum;
+
+    L_sum = (Word32) var1 + var2;
+    var_out = saturate (L_sum);
+#if (WMOPS)
+    multiCounter[currCounter].add++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of add() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : sub                                                     |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    Performs the subtraction (var1+var2) with overflow control and satu-   |
+ |    ration; the 16 bit result is set at +32767 when overflow occurs or at  |
+ |    -32768 when underflow occurs.                                          |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 sub (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 L_diff;
+
+    L_diff = (Word32) var1 - var2;
+    var_out = saturate (L_diff);
+#if (WMOPS)
+    multiCounter[currCounter].sub++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of sub() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : abs_s                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    Absolute value of var1; abs_s(-32768) = 32767.                         |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 0000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 abs_s (Word16 var1)
+{
+    Word16 var_out;
+
+    if (var1 == (Word16) 0X8000)
+    {
+        var_out = MAX_16;
+    }
+    else
+    {
+        if (var1 < 0)
+        {
+            var_out = -var1;
+        }
+        else
+        {
+            var_out = var1;
+        }
+    }
+#if (WMOPS)
+    multiCounter[currCounter].abs_s++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of abs_s() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : shl                                                     |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill|
+ |   the var2 LSB of the result. If var2 is negative, arithmetically shift   |
+ |   var1 right by -var2 with sign extension. Saturate the result in case of |
+ |   underflows or overflows.                                                |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 shl (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 result;
+
+    if (var2 < 0)
+    {
+        if (var2 < -16)
+            var2 = -16;
+        var_out = shr (var1, (Word16) -var2);
+#if (WMOPS)
+        multiCounter[currCounter].shr--;
+#endif
+    }
+    else
+    {
+        result = (Word32) var1 *((Word32) 1 << var2);
+
+        if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
+        {
+            Overflow = 1;
+            var_out = (var1 > 0) ? MAX_16 : MIN_16;
+        }
+        else
+        {
+            var_out = extract_l (result);
+#if (WMOPS)
+            multiCounter[currCounter].extract_l--;
+#endif
+        }
+    }
+#if (WMOPS)
+    multiCounter[currCounter].shl++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of shl() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : shr                                                     |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Arithmetically shift the 16 bit input var1 right var2 positions with    |
+ |   sign extension. If var2 is negative, arithmetically shift var1 left by  |
+ |   -var2 with sign extension. Saturate the result in case of underflows or |
+ |   overflows.                                                              |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 shr (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    if (var2 < 0)
+    {
+        if (var2 < -16)
+            var2 = -16;
+        var_out = shl (var1, (Word16) -var2);
+#if (WMOPS)
+        multiCounter[currCounter].shl--;
+#endif
+    }
+    else
+    {
+        if (var2 >= 15)
+        {
+            var_out = (var1 < 0) ? -1 : 0;
+        }
+        else
+        {
+            if (var1 < 0)
+            {
+                var_out = ~((~var1) >> var2);
+            }
+            else
+            {
+                var_out = var1 >> var2;
+            }
+        }
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].shr++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of shr() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : mult                                                    |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    Performs the multiplication of var1 by var2 and gives a 16 bit result  |
+ |    which is scaled i.e.:                                                  |
+ |             mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and  |
+ |             mult(-32768,-32768) = 32767.                                  |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 mult (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 L_product;
+
+    L_product = (Word32) var1 *(Word32) var2;
+
+    L_product = (L_product & (Word32) 0xffff8000L) >> 15;
+
+    if (L_product & (Word32) 0x00010000L)
+        L_product = L_product | (Word32) 0xffff0000L;
+
+    var_out = saturate (L_product);
+#if (WMOPS)
+    multiCounter[currCounter].mult++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of mult() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_mult                                                  |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   L_mult is the 32 bit result of the multiplication of var1 times var2    |
+ |   with one shift left i.e.:                                               |
+ |        L_mult(var1,var2) = L_shl((var1 times var2),1) and                 |
+ |        L_mult(-32768,-32768) = 2147483647.                                |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+Word32 L_mult (Word16 var1, Word16 var2)
+{
+    Word32 L_var_out;
+
+    L_var_out = (Word32) var1 *(Word32) var2;
+
+    if (L_var_out != (Word32) 0x40000000L)
+    {
+        L_var_out *= 2;
+    }
+    else
+    {
+        Overflow = 1;
+        L_var_out = MAX_32;
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].L_mult++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_mult() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : negate                                                  |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Negate var1 with saturation, saturate in the case where input is -32768:|
+ |                negate(var1) = sub(0,var1).                                |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 negate (Word16 var1)
+{
+    Word16 var_out;
+
+    var_out = (var1 == MIN_16) ? MAX_16 : -var1;
+#if (WMOPS)
+    multiCounter[currCounter].negate++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of negate() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : extract_h                                               |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Return the 16 MSB of L_var1.                                            |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32 ) whose value falls in the |
+ |             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 extract_h (Word32 L_var1)
+{
+    Word16 var_out;
+
+    var_out = (Word16) (L_var1 >> 16);
+#if (WMOPS)
+    multiCounter[currCounter].extract_h++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of extract_h() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : extract_l                                               |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Return the 16 LSB of L_var1.                                            |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32 ) whose value falls in the |
+ |             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 extract_l (Word32 L_var1)
+{
+    Word16 var_out;
+
+    var_out = (Word16) L_var1;
+#if (WMOPS)
+    multiCounter[currCounter].extract_l++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of extract_l() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : round                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Round the lower 16 bits of the 32 bit input number into the MS 16 bits  |
+ |   with saturation. Shift the resulting bits right by 16 and return the 16 |
+ |   bit number:                                                             |
+ |               round(L_var1) = extract_h(L_add(L_var1,32768))              |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32 ) whose value falls in the |
+ |             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 round (Word32 L_var1)
+{
+    Word16 var_out;
+    Word32 L_rounded;
+
+    L_rounded = L_add (L_var1, (Word32) 0x00008000L);
+#if (WMOPS)
+    multiCounter[currCounter].L_add--;
+#endif
+    var_out = extract_h (L_rounded);
+#if (WMOPS)
+    multiCounter[currCounter].extract_h--;
+    multiCounter[currCounter].round++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of round() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_mac                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Multiply var1 by var2 and shift the result left by 1. Add the 32 bit    |
+ |   result to L_var3 with saturation, return a 32 bit result:               |
+ |        L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)).         |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
+{
+    Word32 L_var_out;
+    Word32 L_product;
+
+    L_product = L_mult (var1, var2);
+#if (WMOPS)
+    multiCounter[currCounter].L_mult--;
+#endif
+    L_var_out = L_add (L_var3, L_product);
+#if (WMOPS)
+    multiCounter[currCounter].L_add--;
+    multiCounter[currCounter].L_mac++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_mac() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_msu                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Multiply var1 by var2 and shift the result left by 1. Subtract the 32   |
+ |   bit result to L_var3 with saturation, return a 32 bit result:           |
+ |        L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)).         |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
+{
+    Word32 L_var_out;
+    Word32 L_product;
+
+    L_product = L_mult (var1, var2);
+#if (WMOPS)
+    multiCounter[currCounter].L_mult--;
+#endif
+    L_var_out = L_sub (L_var3, L_product);
+#if (WMOPS)
+    multiCounter[currCounter].L_sub--;
+    multiCounter[currCounter].L_msu++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_msu() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_macNs                                                 |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Multiply var1 by var2 and shift the result left by 1. Add the 32 bit    |
+ |   result to L_var3 without saturation, return a 32 bit result. Generate   |
+ |   carry and overflow values :                                             |
+ |        L_macNs(L_var3,var1,var2) = L_add_c(L_var3,L_mult(var1,var2)).     |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |                                                                           |
+ |   Caution :                                                               |
+ |                                                                           |
+ |    In some cases the Carry flag has to be cleared or set before using     |
+ |    operators which take into account its value.                           |
+ |___________________________________________________________________________|
+*/
+Word32 L_macNs (Word32 L_var3, Word16 var1, Word16 var2)
+{
+    Word32 L_var_out;
+
+    L_var_out = L_mult (var1, var2);
+#if (WMOPS)
+    multiCounter[currCounter].L_mult--;
+#endif
+    L_var_out = L_add_c (L_var3, L_var_out);
+#if (WMOPS)
+    multiCounter[currCounter].L_add_c--;
+    multiCounter[currCounter].L_macNs++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_macNs() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_msuNs                                                 |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Multiply var1 by var2 and shift the result left by 1. Subtract the 32   |
+ |   bit result from L_var3 without saturation, return a 32 bit result. Ge-  |
+ |   nerate carry and overflow values :                                      |
+ |        L_msuNs(L_var3,var1,var2) = L_sub_c(L_var3,L_mult(var1,var2)).     |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |                                                                           |
+ |   Caution :                                                               |
+ |                                                                           |
+ |    In some cases the Carry flag has to be cleared or set before using     |
+ |    operators which take into account its value.                           |
+ |___________________________________________________________________________|
+*/
+Word32 L_msuNs (Word32 L_var3, Word16 var1, Word16 var2)
+{
+    Word32 L_var_out;
+
+    L_var_out = L_mult (var1, var2);
+#if (WMOPS)
+    multiCounter[currCounter].L_mult--;
+#endif
+    L_var_out = L_sub_c (L_var3, L_var_out);
+#if (WMOPS)
+    multiCounter[currCounter].L_sub_c--;
+    multiCounter[currCounter].L_msuNs++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_msuNs() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_add                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   32 bits addition of the two 32 bits variables (L_var1+L_var2) with      |
+ |   overflow control and saturation; the result is set at +2147483647 when  |
+ |   overflow occurs or at -2147483648 when underflow occurs.                |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    L_var2   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+Word32 L_add (Word32 L_var1, Word32 L_var2)
+{
+    Word32 L_var_out;
+
+    L_var_out = L_var1 + L_var2;
+
+    if (((L_var1 ^ L_var2) & MIN_32) == 0)
+    {
+        if ((L_var_out ^ L_var1) & MIN_32)
+        {
+            L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
+            Overflow = 1;
+        }
+    }
+#if (WMOPS)
+    multiCounter[currCounter].L_add++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_add() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_sub                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with   |
+ |   overflow control and saturation; the result is set at +2147483647 when  |
+ |   overflow occurs or at -2147483648 when underflow occurs.                |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    L_var2   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+Word32 L_sub (Word32 L_var1, Word32 L_var2)
+{
+    Word32 L_var_out;
+
+    L_var_out = L_var1 - L_var2;
+
+    if (((L_var1 ^ L_var2) & MIN_32) != 0)
+    {
+        if ((L_var_out ^ L_var1) & MIN_32)
+        {
+            L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
+            Overflow = 1;
+        }
+    }
+#if (WMOPS)
+    multiCounter[currCounter].L_sub++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_sub() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_add_c                                                 |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Performs 32 bits addition of the two 32 bits variables (L_var1+L_var2+C)|
+ |   with carry. No saturation. Generate carry and Overflow values. The car- |
+ |   ry and overflow values are binary variables which can be tested and as- |
+ |   signed values.                                                          |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    L_var2   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |                                                                           |
+ |   Caution :                                                               |
+ |                                                                           |
+ |    In some cases the Carry flag has to be cleared or set before using     |
+ |    operators which take into account its value.                           |
+ |___________________________________________________________________________|
+*/
+Word32 L_add_c (Word32 L_var1, Word32 L_var2)
+{
+    Word32 L_var_out;
+    Word32 L_test;
+    Flag carry_int = 0;
+
+    L_var_out = L_var1 + L_var2 + Carry;
+
+    L_test = L_var1 + L_var2;
+
+    if ((L_var1 > 0) && (L_var2 > 0) && (L_test < 0))
+    {
+        Overflow = 1;
+        carry_int = 0;
+    }
+    else
+    {
+        if ((L_var1 < 0) && (L_var2 < 0))
+        {
+            if (L_test >= 0)
+	    {
+                Overflow = 1;
+                carry_int = 1;
+	    }
+            else
+	    {
+                Overflow = 0;
+                carry_int = 1;
+	    }
+        }
+        else
+        {
+            if (((L_var1 ^ L_var2) < 0) && (L_test >= 0))
+            {
+                Overflow = 0;
+                carry_int = 1;
+            }
+            else
+            {
+                Overflow = 0;
+                carry_int = 0;
+            }
+        }
+    }
+
+    if (Carry)
+    {
+        if (L_test == MAX_32)
+        {
+            Overflow = 1;
+            Carry = carry_int;
+        }
+        else
+        {
+            if (L_test == (Word32) 0xFFFFFFFFL)
+            {
+                Carry = 1;
+            }
+            else
+            {
+                Carry = carry_int;
+            }
+        }
+    }
+    else
+    {
+        Carry = carry_int;
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].L_add_c++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_add_c() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_sub_c                                                 |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Performs 32 bits subtraction of the two 32 bits variables with carry    |
+ |   (borrow) : L_var1-L_var2-C. No saturation. Generate carry and Overflow  |
+ |   values. The carry and overflow values are binary variables which can    |
+ |   be tested and assigned values.                                          |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    L_var2   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |                                                                           |
+ |   Caution :                                                               |
+ |                                                                           |
+ |    In some cases the Carry flag has to be cleared or set before using     |
+ |    operators which take into account its value.                           |
+ |___________________________________________________________________________|
+*/
+Word32 L_sub_c (Word32 L_var1, Word32 L_var2)
+{
+    Word32 L_var_out;
+    Word32 L_test;
+    Flag carry_int = 0;
+
+    if (Carry)
+    {
+        Carry = 0;
+        if (L_var2 != MIN_32)
+        {
+            L_var_out = L_add_c (L_var1, -L_var2);
+#if (WMOPS)
+            multiCounter[currCounter].L_add_c--;
+#endif
+        }
+        else
+        {
+            L_var_out = L_var1 - L_var2;
+            if (L_var1 > 0L)
+            {
+                Overflow = 1;
+                Carry = 0;
+            }
+        }
+    }
+    else
+    {
+        L_var_out = L_var1 - L_var2 - (Word32) 0X00000001L;
+        L_test = L_var1 - L_var2;
+
+        if ((L_test < 0) && (L_var1 > 0) && (L_var2 < 0))
+        {
+            Overflow = 1;
+            carry_int = 0;
+        }
+        else if ((L_test > 0) && (L_var1 < 0) && (L_var2 > 0))
+        {
+            Overflow = 1;
+            carry_int = 1;
+        }
+        else if ((L_test > 0) && ((L_var1 ^ L_var2) > 0))
+        {
+            Overflow = 0;
+            carry_int = 1;
+        }
+        if (L_test == MIN_32)
+        {
+            Overflow = 1;
+            Carry = carry_int;
+        }
+        else
+        {
+            Carry = carry_int;
+        }
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].L_sub_c++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_sub_c() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_negate                                                |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Negate the 32 bit variable L_var1 with saturation; saturate in the case |
+ |   where input is -2147483648 (0x8000 0000).                               |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+Word32 L_negate (Word32 L_var1)
+{
+    Word32 L_var_out;
+
+    L_var_out = (L_var1 == MIN_32) ? MAX_32 : -L_var1;
+#if (WMOPS)
+    multiCounter[currCounter].L_negate++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_negate() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : mult_r                                                  |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Same as mult with rounding, i.e.:                                       |
+ |     mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and  |
+ |     mult_r(-32768,-32768) = 32767.                                        |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 mult_r (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 L_product_arr;
+
+    L_product_arr = (Word32) var1 *(Word32) var2;       /* product */
+    L_product_arr += (Word32) 0x00004000L;      /* round */
+    L_product_arr &= (Word32) 0xffff8000L;
+    L_product_arr >>= 15;       /* shift */
+
+    if (L_product_arr & (Word32) 0x00010000L)   /* sign extend when necessary */
+    {
+        L_product_arr |= (Word32) 0xffff0000L;
+    }
+    var_out = saturate (L_product_arr);
+#if (WMOPS)
+    multiCounter[currCounter].mult_r++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of mult_r() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_shl                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero  |
+ |   fill the var2 LSB of the result. If var2 is negative, arithmetically    |
+ |   shift L_var1 right by -var2 with sign extension. Saturate the result in |
+ |   case of underflows or overflows.                                        |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+Word32 L_shl (Word32 L_var1, Word16 var2)
+{
+    Word32 L_var_out;
+
+    if (var2 <= 0)
+    {
+        if (var2 < -32)
+            var2 = -32;
+        L_var_out = L_shr (L_var1, (Word16) -var2);
+#if (WMOPS)
+        multiCounter[currCounter].L_shr--;
+#endif
+    }
+    else
+    {
+        for (; var2 > 0; var2--)
+        {
+            if (L_var1 > (Word32) 0X3fffffffL)
+            {
+                Overflow = 1;
+                L_var_out = MAX_32;
+                break;
+            }
+            else
+            {
+                if (L_var1 < (Word32) 0xc0000000L)
+                {
+                    Overflow = 1;
+                    L_var_out = MIN_32;
+                    break;
+                }
+            }
+            L_var1 *= 2;
+            L_var_out = L_var1;
+        }
+    }
+#if (WMOPS)
+    multiCounter[currCounter].L_shl++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_shl() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_shr                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Arithmetically shift the 32 bit input L_var1 right var2 positions with  |
+ |   sign extension. If var2 is negative, arithmetically shift L_var1 left   |
+ |   by -var2 and zero fill the -var2 LSB of the result. Saturate the result |
+ |   in case of underflows or overflows.                                     |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+Word32 L_shr (Word32 L_var1, Word16 var2)
+{
+    Word32 L_var_out;
+
+    if (var2 < 0)
+    {
+        if (var2 < -32)
+            var2 = -32;
+        L_var_out = L_shl (L_var1, (Word16) -var2);
+#if (WMOPS)
+        multiCounter[currCounter].L_shl--;
+#endif
+    }
+    else
+    {
+        if (var2 >= 31)
+        {
+            L_var_out = (L_var1 < 0L) ? -1 : 0;
+        }
+        else
+        {
+            if (L_var1 < 0)
+            {
+                L_var_out = ~((~L_var1) >> var2);
+            }
+            else
+            {
+                L_var_out = L_var1 >> var2;
+            }
+        }
+    }
+#if (WMOPS)
+    multiCounter[currCounter].L_shr++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_shr() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : shr_r                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Same as shr(var1,var2) but with rounding. Saturate the result in case of|
+ |   underflows or overflows :                                               |
+ |    - If var2 is greater than zero :                                       |
+ |          if (sub(shl(shr(var1,var2),1),shr(var1,sub(var2,1))))            |
+ |          is equal to zero                                                 |
+ |                     then                                                  |
+ |                     shr_r(var1,var2) = shr(var1,var2)                     |
+ |                     else                                                  |
+ |                     shr_r(var1,var2) = add(shr(var1,var2),1)              |
+ |    - If var2 is less than or equal to zero :                              |
+ |                     shr_r(var1,var2) = shr(var1,var2).                    |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word16 shr_r (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    if (var2 > 15)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        var_out = shr (var1, var2);
+#if (WMOPS)
+        multiCounter[currCounter].shr--;
+#endif
+
+        if (var2 > 0)
+        {
+            if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
+            {
+                var_out++;
+            }
+        }
+    }
+#if (WMOPS)
+    multiCounter[currCounter].shr_r++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of shr_r() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : mac_r                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Multiply var1 by var2 and shift the result left by 1. Add the 32 bit    |
+ |   result to L_var3 with saturation. Round the LS 16 bits of the result    |
+ |   into the MS 16 bits with saturation and shift the result right by 16.   |
+ |   Return a 16 bit result.                                                 |
+ |            mac_r(L_var3,var1,var2) = round(L_mac(L_var3,var1,var2))       |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 8000 <= L_var_out <= 0x0000 7fff.              |
+ |___________________________________________________________________________|
+*/
+Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    L_var3 = L_mac (L_var3, var1, var2);
+#if (WMOPS)
+    multiCounter[currCounter].L_mac--;
+#endif
+    L_var3 = L_add (L_var3, (Word32) 0x00008000L);
+#if (WMOPS)
+    multiCounter[currCounter].L_add--;
+#endif
+    var_out = extract_h (L_var3);
+#if (WMOPS)
+    multiCounter[currCounter].extract_h--;
+    multiCounter[currCounter].mac_r++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of mac_r() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : msu_r                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Multiply var1 by var2 and shift the result left by 1. Subtract the 32   |
+ |   bit result to L_var3 with saturation. Round the LS 16 bits of the res-  |
+ |   ult into the MS 16 bits with saturation and shift the result right by   |
+ |   16. Return a 16 bit result.                                             |
+ |            msu_r(L_var3,var1,var2) = round(L_msu(L_var3,var1,var2))       |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 8000 <= L_var_out <= 0x0000 7fff.              |
+ |___________________________________________________________________________|
+*/
+Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    L_var3 = L_msu (L_var3, var1, var2);
+#if (WMOPS)
+    multiCounter[currCounter].L_msu--;
+#endif
+    L_var3 = L_add (L_var3, (Word32) 0x00008000L);
+#if (WMOPS)
+    multiCounter[currCounter].L_add--;
+#endif
+    var_out = extract_h (L_var3);
+#if (WMOPS)
+    multiCounter[currCounter].extract_h--;
+    multiCounter[currCounter].msu_r++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of msu_r() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_deposit_h                                             |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Deposit the 16 bit var1 into the 16 MS bits of the 32 bit output. The   |
+ |   16 LS bits of the output are zeroed.                                    |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var_out <= 0x7fff 0000.                |
+ |___________________________________________________________________________|
+*/
+Word32 L_deposit_h (Word16 var1)
+{
+    Word32 L_var_out;
+
+    L_var_out = (Word32) var1 << 16;
+#if (WMOPS)
+    multiCounter[currCounter].L_deposit_h++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_deposit_h() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_deposit_l                                             |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Deposit the 16 bit var1 into the 16 LS bits of the 32 bit output. The   |
+ |   16 MS bits of the output are sign extended.                             |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0xFFFF 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+Word32 L_deposit_l (Word16 var1)
+{
+    Word32 L_var_out;
+
+    L_var_out = (Word32) var1;
+#if (WMOPS)
+    multiCounter[currCounter].L_deposit_l++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_deposit_l() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_shr_r                                                 |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Same as L_shr(L_var1,var2) but with rounding. Saturate the result in    |
+ |   case of underflows or overflows :                                       |
+ |    - If var2 is greater than zero :                                       |
+ |          if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))|
+ |          is equal to zero                                                 |
+ |                     then                                                  |
+ |                     L_shr_r(L_var1,var2) = L_shr(L_var1,var2)             |
+ |                     else                                                  |
+ |                     L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1)    |
+ |    - If var2 is less than or equal to zero :                              |
+ |                     L_shr_r(L_var1,var2) = L_shr(L_var1,var2).            |
+ |                                                                           |
+ |   Complexity weight : 3                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var_out <= 0x7fff ffff.                |
+ |___________________________________________________________________________|
+*/
+Word32 L_shr_r (Word32 L_var1, Word16 var2)
+{
+    Word32 L_var_out;
+
+    if (var2 > 31)
+    {
+        L_var_out = 0;
+    }
+    else
+    {
+        L_var_out = L_shr (L_var1, var2);
+#if (WMOPS)
+        multiCounter[currCounter].L_shr--;
+#endif
+        if (var2 > 0)
+        {
+            if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
+            {
+                L_var_out++;
+            }
+        }
+    }
+#if (WMOPS)
+    multiCounter[currCounter].L_shr_r++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_shr_r() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_abs                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    Absolute value of L_var1; Saturate in case where the input is          |
+ |                                                               -214783648  |
+ |                                                                           |
+ |   Complexity weight : 3                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x0000 0000 <= var_out <= 0x7fff ffff.                |
+ |___________________________________________________________________________|
+*/
+Word32 L_abs (Word32 L_var1)
+{
+    Word32 L_var_out;
+
+    if (L_var1 == MIN_32)
+    {
+        L_var_out = MAX_32;
+    }
+    else
+    {
+        if (L_var1 < 0)
+        {
+            L_var_out = -L_var1;
+        }
+        else
+        {
+            L_var_out = L_var1;
+        }
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].L_abs++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_abs() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_sat                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    32 bit L_var1 is set to 2147483647 if an overflow occured or to        |
+ |    -2147483648 if an underflow occured on the most recent L_add_c,        |
+ |    L_sub_c, L_macNs or L_msuNs operations. The carry and overflow values  |
+ |    are binary values which can be tested and assigned values.             |
+ |                                                                           |
+ |   Complexity weight : 4                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var_out <= 0x7fff ffff.                |
+ |___________________________________________________________________________|
+*/
+Word32 L_sat (Word32 L_var1)
+{
+    Word32 L_var_out;
+
+    L_var_out = L_var1;
+
+    if (Overflow)
+    {
+
+        if (Carry)
+        {
+            L_var_out = MIN_32;
+        }
+        else
+        {
+            L_var_out = MAX_32;
+        }
+
+        Carry = 0;
+        Overflow = 0;
+    }
+#if (WMOPS)
+    multiCounter[currCounter].L_sat++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of L_sat() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : norm_s                                                  |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Produces the number of left shift needed to normalize the 16 bit varia- |
+ |   ble var1 for positive values on the interval with minimum of 16384 and  |
+ |   maximum of 32767, and for negative values on the interval with minimum  |
+ |   of -32768 and maximum of -16384; in order to normalize the result, the  |
+ |   following operation must be done :                                      |
+ |                    norm_var1 = shl(var1,norm_s(var1)).                    |
+ |                                                                           |
+ |   Complexity weight : 15                                                  |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 0000 <= var_out <= 0x0000 000f.                |
+ |___________________________________________________________________________|
+*/
+Word16 norm_s (Word16 var1)
+{
+    Word16 var_out;
+
+    if (var1 == 0)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        if (var1 == (Word16) 0xffff)
+        {
+            var_out = 15;
+        }
+        else
+        {
+            if (var1 < 0)
+            {
+                var1 = ~var1;
+            }
+            for (var_out = 0; var1 < 0x4000; var_out++)
+            {
+                var1 <<= 1;
+            }
+        }
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].norm_s++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of norm_s() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : div_s                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Produces a result which is the fractional integer division of var1  by  |
+ |   var2; var1 and var2 must be positive and var2 must be greater or equal  |
+ |   to var1; the result is positive (leading bit equal to 0) and truncated  |
+ |   to 16 bits.                                                             |
+ |   If var1 = var2 then div(var1,var2) = 32767.                             |
+ |                                                                           |
+ |   Complexity weight : 18                                                  |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 0000 <= var1 <= var2 and var2 != 0.            |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : var1 <= var2 <= 0x0000 7fff and var2 != 0.            |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 0000 <= var_out <= 0x0000 7fff.                |
+ |             It's a Q15 value (point between b15 and b14).                 |
+ |___________________________________________________________________________|
+*/
+Word16 div_s (Word16 var1, Word16 var2)
+{
+    Word16 var_out = 0;
+    Word16 iteration;
+    Word32 L_num;
+    Word32 L_denom;
+
+    if ((var1 > var2) || (var1 < 0) || (var2 < 0))
+    {
+        printf ("Division Error var1=%d  var2=%d\n", var1, var2);
+        abort(); /* exit (0); */
+    }
+    if (var2 == 0)
+    {
+        printf ("Division by 0, Fatal error \n");
+        abort(); /* exit (0); */
+    }
+    if (var1 == 0)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        if (var1 == var2)
+        {
+            var_out = MAX_16;
+        }
+        else
+        {
+            L_num = L_deposit_l (var1);
+#if (WMOPS)
+            multiCounter[currCounter].L_deposit_l--;
+#endif
+            L_denom = L_deposit_l (var2);
+#if (WMOPS)
+            multiCounter[currCounter].L_deposit_l--;
+#endif
+
+            for (iteration = 0; iteration < 15; iteration++)
+            {
+                var_out <<= 1;
+                L_num <<= 1;
+
+                if (L_num >= L_denom)
+                {
+                    L_num = L_sub (L_num, L_denom);
+#if (WMOPS)
+                    multiCounter[currCounter].L_sub--;
+#endif
+                    var_out = add (var_out, 1);
+#if (WMOPS)
+                    multiCounter[currCounter].add--;
+#endif
+                }
+            }
+        }
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].div_s++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of div_s() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : norm_l                                                  |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Produces the number of left shifts needed to normalize the 32 bit varia-|
+ |   ble L_var1 for positive values on the interval with minimum of          |
+ |   1073741824 and maximum of 2147483647, and for negative values on the in-|
+ |   terval with minimum of -2147483648 and maximum of -1073741824; in order |
+ |   to normalize the result, the following operation must be done :         |
+ |                   norm_L_var1 = L_shl(L_var1,norm_l(L_var1)).             |
+ |                                                                           |
+ |   Complexity weight : 30                                                  |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 0000 <= var_out <= 0x0000 001f.                |
+ |___________________________________________________________________________|
+*/
+Word16 norm_l (Word32 L_var1)
+{
+    Word16 var_out;
+
+    if (L_var1 == 0)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        if (L_var1 == (Word32) 0xffffffffL)
+        {
+            var_out = 31;
+        }
+        else
+        {
+            if (L_var1 < 0)
+            {
+                L_var1 = ~L_var1;
+            }
+            for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
+            {
+                L_var1 <<= 1;
+            }
+        }
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].norm_l++;
+#endif
+    return (var_out);
+}
+/* ------------------------- End of norm_l() ------------------------- */
+
+
+/*
+  *****************************************************************
+   Additional operators extracted from the G.723.1 Library
+   Adapted for WMOPS calculations
+  *****************************************************************
+*/
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_mls                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Multiplies a 16 bit word v by a 32 bit word Lv and returns a 32 bit     |
+ |   word (multiplying 16 by 32 bit words gives 48 bit word; the function    |
+ |   extracts the 32 MSB and shift the result to the left by 1).             |
+ |                                                                           |
+ |   A 32 bit word can be written as                                         |
+ |    Lv = a  +  b * 2^16                                                    |
+ |   where a= unsigned 16 LSBs and b= signed 16 MSBs.                        |
+ |   The function returns v * Lv  /  2^15  which is equivalent to            |
+ |        a*v / 2^15 + b*v*2                                                 |
+ |                                                                           |
+ |   Complexity weight : 6 [to be confirmed]                                 |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |   Lv                                                                      |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
+ |   v                                                                       |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x8000 <= var1 <= 0x7fff.                             |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var_out <= 0x7fff ffff.                |
+ |                                                                           |
+ |___________________________________________________________________________|
+*/
+Word32 L_mls (Word32 Lv, Word16 v)
+{
+   Word32   Temp  ;
+
+   Temp = Lv & (Word32) 0x0000ffff ;
+   Temp = Temp * (Word32) v ;
+   Temp = L_shr( Temp, (Word16) 15 ) ;
+   Temp = L_mac( Temp, v, extract_h(Lv) ) ;
+
+#if (WMOPS)
+   multiCounter[currCounter].L_shr--;
+   multiCounter[currCounter].L_mac--;
+   multiCounter[currCounter].extract_h--;
+   multiCounter[currCounter].L_mls++;
+#endif
+
+   return Temp ;
+}
+/* ------------------------- End of L_mls() ------------------------- */
+
+
+/*__________________________________________________________________________
+|                                                                           |
+|   Function Name : div_l                                                   |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Produces a result which is the fractional integer division of L_var1 by|
+|   var2; L_var1 and var2 must be positive and var2 << 16 must be greater or|
+|   equal to L_var1; the result is positive (leading bit equal to 0) and    |
+|   truncated to 16 bits.                                                   |
+|   If L_var1 == var2 << 16 then div_l(L_var1,var2) = 32767.                |
+|                                                                           |
+|   Complexity weight : 20                                                  |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    L_var1                                                                 |
+|             32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x0000 0000 <= var1 <= (var2 << 16)  and var2 != 0.   |
+|             L_var1 must be considered as a Q.31 value                     |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : var1 <= (var2<< 16) <= 0x7fff0000 and var2 != 0.      |
+|             var2 must be considered as a Q.15 value                       |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    var_out                                                                |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0x0000 0000 <= var_out <= 0x0000 7fff.                |
+|             It's a Q15 value (point between b15 and b14).                 |
+|___________________________________________________________________________|
+*/
+Word16 div_l (Word32  L_num, Word16 den)
+{
+    Word16   var_out = (Word16)0;
+    Word32   L_den;
+    Word16   iteration;
+
+#if (WMOPS)
+    multiCounter[currCounter].div_l++;
+#endif
+
+    if ( den == (Word16) 0 ) {
+        printf("Division by 0 in div_l, Fatal error \n");
+        exit(0);
+    }
+
+    if ( (L_num < (Word32) 0) || (den < (Word16) 0) ) {
+        printf("Division Error in div_l, Fatal error \n");
+        exit(0);
+    }
+
+    L_den = L_deposit_h( den ) ;
+#if (WMOPS)
+    multiCounter[currCounter].L_deposit_h--;
+#endif
+
+    if ( L_num >= L_den ){
+        return MAX_16 ;
+    }
+    else {
+        L_num = L_shr(L_num, (Word16)1) ;
+        L_den = L_shr(L_den, (Word16)1);
+#if (WMOPS)
+        multiCounter[currCounter].L_shr-=2;
+#endif
+        for(iteration=(Word16)0; iteration< (Word16)15;iteration++) {
+            var_out = shl( var_out, (Word16)1);
+            L_num   = L_shl( L_num, (Word16)1);
+#if (WMOPS)
+            multiCounter[currCounter].shl--;
+            multiCounter[currCounter].L_shl--;
+#endif
+            if (L_num >= L_den) {
+                L_num = L_sub(L_num,L_den);
+                var_out = add(var_out, (Word16)1);
+#if (WMOPS)
+            multiCounter[currCounter].L_sub--;
+            multiCounter[currCounter].add--;
+#endif
+            }
+        }
+
+        return var_out;
+    }
+}
+/* ------------------------- End of div_l() ------------------------- */
+
+
+/*__________________________________________________________________________
+|                                                                           |
+|   Function Name : i_mult                                                  |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Integer 16-bit multiplication. No overflow protection is performed if   |
+|   ORIGINAL_G7231 is defined.                                              |
+|                                                                           |
+|   Complexity weight : TBD                                                 |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    a                                                                      |
+|             16 bit short signed integer (Word16).                         |
+|                                                                           |
+|    b                                                                      |
+|             16 bit short signed integer (Word16).                         |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|             16 bit short signed integer (Word16). No overflow checks      |
+|             are performed if ORIGINAL_G7231 is defined.                   |
+|___________________________________________________________________________|
+*/
+Word16 i_mult (Word16 a, Word16 b)
+{
+#ifdef ORIGINAL_G7231
+   return a*b ;
+#else
+   Word32 register c=a*b;
+#if (WMOPS)
+    multiCounter[currCounter].i_mult++;
+#endif
+   return saturate(c) ;
+#endif
+}
+/* ------------------------- End of i_mult() ------------------------- */
+
+
+/*
+   ********************************************************************** 
+   The following three operators are not part of the original 
+   G.729/G.723.1 set of basic operators and implement shiftless
+   accumulation operation.
+   ********************************************************************** 
+*/
+
+/*___________________________________________________________________________
+ |
+ |   Function Name : L_mult0
+ |
+ |   Purpose :
+ |
+ |   L_mult0 is the 32 bit result of the multiplication of var1 times var2
+ |   without one left shift.
+ |
+ |   Complexity weight : 1
+ |
+ |   Inputs :
+ |
+ |    var1     16 bit short signed integer (Word16) whose value falls in the
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+ |
+ |    var2     16 bit short signed integer (Word16) whose value falls in the
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+ |
+ |   Return Value :
+ |
+ |    L_var_out
+ |             32 bit long signed integer (Word32) whose value falls in the
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
+ |___________________________________________________________________________
+*/
+Word32 L_mult0 (Word16 var1,Word16 var2)
+{
+  Word32 L_var_out;
+
+  L_var_out = (Word32)var1 * (Word32)var2;
+
+#if (WMOPS)
+    multiCounter[currCounter].L_mult0++;
+#endif
+  return(L_var_out);
+}
+/* ------------------------- End of L_mult0() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |
+ |   Function Name : L_mac0
+ |
+ |   Purpose :
+ |
+ |   Multiply var1 by var2 (without left shift) and add the 32 bit result to
+ |   L_var3 with saturation, return a 32 bit result:
+ |        L_mac0(L_var3,var1,var2) = L_add(L_var3,(L_mult0(var1,var2)).
+ |
+ |   Complexity weight : 1
+ |
+ |   Inputs :
+ |
+ |    L_var3   32 bit long signed integer (Word32) whose value falls in the
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
+ |
+ |    var1     16 bit short signed integer (Word16) whose value falls in the
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+ |
+ |    var2     16 bit short signed integer (Word16) whose value falls in the
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+ |
+ |   Return Value :
+ |
+ |    L_var_out
+ |             32 bit long signed integer (Word32) whose value falls in the
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
+ |___________________________________________________________________________
+*/
+Word32 L_mac0 (Word32 L_var3, Word16 var1, Word16 var2)
+{
+  Word32 L_var_out;
+  Word32 L_product;
+
+  L_product = L_mult0(var1,var2);
+  L_var_out = L_add(L_var3,L_product);
+
+#if (WMOPS)
+    multiCounter[currCounter].L_mac0++;
+    multiCounter[currCounter].L_mult0--;
+    multiCounter[currCounter].L_add--;
+#endif
+  return(L_var_out);
+}
+/* ------------------------- End of L_mac0() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |
+ |   Function Name : L_msu0
+ |
+ |   Purpose :
+ |
+ |   Multiply var1 by var2 (without left shift) and subtract the 32 bit
+ |   result to L_var3 with saturation, return a 32 bit result:
+ |        L_msu0(L_var3,var1,var2) = L_sub(L_var3,(L_mult0(var1,var2)).
+ |
+ |   Complexity weight : 1
+ |
+ |   Inputs :
+ |
+ |    L_var3   32 bit long signed integer (Word32) whose value falls in the
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
+ |
+ |    var1     16 bit short signed integer (Word16) whose value falls in the
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+ |
+ |    var2     16 bit short signed integer (Word16) whose value falls in the
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+ |
+ |   Return Value :
+ |
+ |    L_var_out
+ |             32 bit long signed integer (Word32) whose value falls in the
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
+ |___________________________________________________________________________
+*/
+Word32 L_msu0 (Word32 L_var3, Word16 var1, Word16 var2)
+{
+  Word32 L_var_out;
+  Word32 L_product;
+
+  L_product = L_mult0(var1,var2);
+  L_var_out = L_sub(L_var3,L_product);
+
+#if (WMOPS)
+    multiCounter[currCounter].L_msu0++;
+    multiCounter[currCounter].L_mult0--;
+    multiCounter[currCounter].L_sub--;
+#endif
+  return(L_var_out);
+}
+/* ------------------------- End of L_msu0() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : LU_shl                                                  |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero  |
+ |   fill the var2 LSB of the result. If var2 is negative, arithmetically    |
+ |   shift L_var1 right by -var2 with sign extension. Saturate the result in |
+ |   case of underflows or overflows.                                        |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+UWord32 LU_shl (UWord32 L_var1, Word16 var2)
+{
+    Word16 neg_var2;
+    UWord32 L_var_out;
+
+    if (var2 <= 0)
+    {
+        if (var2 < -32)
+            var2 = -32;
+        neg_var2 = negate(var2);
+        L_var_out = LU_shr (L_var1, neg_var2);
+#if (WMOPS)
+        multiCounter[currCounter].negate--;
+        multiCounter[currCounter].LU_shr--;
+#endif
+    }
+    else
+    {
+        for (; var2 > 0; var2--)
+        {
+            if (L_var1 > (UWord32) 0X7fffffffL)
+            {
+                Overflow = 1;
+                L_var_out = UMAX_32;
+                break;
+            }
+            else
+            {
+                if (L_var1 < (UWord32) 0x00000001L)
+                {
+                    Overflow = 1;
+                    L_var_out = MIN_32;
+                    break;
+                }
+            }
+            L_var1 *= 2;
+            L_var_out = L_var1;
+        }
+    }
+#if (WMOPS)
+    multiCounter[currCounter].LU_shl++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of LU_shl() ------------------------- */
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : LU_shr                                                  |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Arithmetically shift the 32 bit input L_var1 right var2 positions with  |
+ |   sign extension. If var2 is negative, arithmetically shift L_var1 left   |
+ |   by -var2 and zero fill the -var2 LSB of the result. Saturate the result |
+ |   in case of underflows or overflows.                                     |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+UWord32 LU_shr (UWord32 L_var1, Word16 var2)
+{
+    Word16  neg_var2;
+    UWord32 L_var_out;
+
+    if (var2 < 0)
+    {
+        if (var2 < -32)
+            var2 = -32;
+        neg_var2 = negate(var2);
+        L_var_out = LU_shl (L_var1, neg_var2);
+#if (WMOPS)
+        multiCounter[currCounter].negate--;
+        multiCounter[currCounter].LU_shl--;
+#endif
+    }
+    else
+    {
+        if (var2 >= 32)
+        {
+            L_var_out = 0L;
+        }
+        else
+        {
+            L_var_out = L_var1 >> var2;
+        }
+    }
+#if (WMOPS)
+    multiCounter[currCounter].LU_shr++;
+#endif
+    return (L_var_out);
+}
+/* ------------------------- End of LU_shr() ------------------------- */
+
+
+/* ************************** END OF BASOP32.C ************************** */
diff --git a/third_party/g7221/common/stl-files/basop32.h b/third_party/g7221/common/stl-files/basop32.h
new file mode 100644
index 0000000..7b09645
--- /dev/null
+++ b/third_party/g7221/common/stl-files/basop32.h
@@ -0,0 +1,111 @@
+/*
+  ===========================================================================
+   File: BASOP.H                                         v.1.1 - 05.Jul.2000
+  ===========================================================================
+
+		      ITU-T STL  BASIC OPERATORS
+
+ 		      GLOBAL FUNCTION PROTOTYPES
+
+   History:
+   26.Jan.00	v1.0	Incorporated to the STL from updated G.723.1/G.729 
+                        basic operator library (based on basic_op.h) and 
+                        G.723.1's basop.h.
+   05.Jul.00    v1.1    Added 32-bit shiftless mult/mac/msub operators
+  ============================================================================
+*/
+
+#ifndef BASOP_H_DEFINED
+#define BASOP_H_DEFINED 110
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Constants and Globals                                                   |
+ |                                                                           |
+ | $Id $
+ |___________________________________________________________________________|
+*/
+
+extern Flag Overflow;
+extern Flag Carry;
+
+#define MAX_32 (Word32)0x7fffffffL
+#define MIN_32 (Word32)0x80000000L
+
+#define MAX_16 (Word16)0x7fff
+#define MIN_16 (Word16)0x8000
+
+#define UMAX_32 (Word32)0xffffffffL
+#define UMIN_32 (Word32)0x00000000L
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Prototypes for basic arithmetic operators                               |
+ |___________________________________________________________________________|
+*/
+
+Word16 add (Word16 var1, Word16 var2);    /* Short add,           1   */
+Word16 sub (Word16 var1, Word16 var2);    /* Short sub,           1   */
+Word16 abs_s (Word16 var1);               /* Short abs,           1   */
+Word16 shl (Word16 var1, Word16 var2);    /* Short shift left,    1   */
+Word16 shr (Word16 var1, Word16 var2);    /* Short shift right,   1   */
+Word16 mult (Word16 var1, Word16 var2);   /* Short mult,          1   */
+Word32 L_mult (Word16 var1, Word16 var2); /* Long mult,           1   */
+Word16 negate (Word16 var1);              /* Short negate,        1   */
+Word16 extract_h (Word32 L_var1);         /* Extract high,        1   */
+Word16 extract_l (Word32 L_var1);         /* Extract low,         1   */
+Word16 round (Word32 L_var1);             /* Round,               1   */
+Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);   /* Mac,  1  */
+Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);   /* Msu,  1  */
+Word32 L_macNs (Word32 L_var3, Word16 var1, Word16 var2); /* Mac without
+                                                             sat, 1   */
+Word32 L_msuNs (Word32 L_var3, Word16 var1, Word16 var2); /* Msu without
+                                                             sat, 1   */
+Word32 L_add (Word32 L_var1, Word32 L_var2);    /* Long add,        2 */
+Word32 L_sub (Word32 L_var1, Word32 L_var2);    /* Long sub,        2 */
+Word32 L_add_c (Word32 L_var1, Word32 L_var2);  /* Long add with c, 2 */
+Word32 L_sub_c (Word32 L_var1, Word32 L_var2);  /* Long sub with c, 2 */
+Word32 L_negate (Word32 L_var1);                /* Long negate,     2 */
+Word16 mult_r (Word16 var1, Word16 var2);       /* Mult with round, 2 */
+Word32 L_shl (Word32 L_var1, Word16 var2);      /* Long shift left, 2 */
+Word32 L_shr (Word32 L_var1, Word16 var2);      /* Long shift right, 2*/
+Word16 shr_r (Word16 var1, Word16 var2);        /* Shift right with
+                                                   round, 2           */
+Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2); /* Mac with
+                                                           rounding,2 */
+Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2); /* Msu with
+                                                           rounding,2 */
+Word32 L_deposit_h (Word16 var1);        /* 16 bit var1 -> MSB,     2 */
+Word32 L_deposit_l (Word16 var1);        /* 16 bit var1 -> LSB,     2 */
+
+Word32 L_shr_r (Word32 L_var1, Word16 var2); /* Long shift right with
+                                                round,  3             */
+Word32 L_abs (Word32 L_var1);            /* Long abs,              3  */
+Word32 L_sat (Word32 L_var1);            /* Long saturation,       4  */
+Word16 norm_s (Word16 var1);             /* Short norm,           15  */
+Word16 div_s (Word16 var1, Word16 var2); /* Short division,       18  */
+Word16 norm_l (Word32 L_var1);           /* Long norm,            30  */   
+
+/*
+   Additional G.723.1 operators
+*/
+Word32 L_mls( Word32, Word16 ) ;    /* Weight FFS; currently assigned 1 */
+Word16 div_l( Word32, Word16 ) ;    /* Weight FFS; currently assigned 1 */
+Word16 i_mult(Word16 a, Word16 b);  /* Weight FFS; currently assigned 1 */
+
+/* 
+    New shiftless operators, not used in G.729/G.723.1
+*/
+Word32 L_mult0(Word16 v1, Word16 v2); /* 32-bit Multiply w/o shift         1 */
+Word32 L_mac0(Word32 L_v3, Word16 v1, Word16 v2); /* 32-bit Mac w/o shift  1 */
+Word32 L_msu0(Word32 L_v3, Word16 v1, Word16 v2); /* 32-bit Msu w/o shift  1 */
+
+/* 
+    Additional G.722.1 operators
+*/
+UWord32 LU_shl (UWord32 L_var1, Word16 var2);
+UWord32 LU_shr (UWord32 L_var1, Word16 var2);
+#endif /* BASOP_H_DEFINED */
+
+
+/* ************************* END OF BASIC_OP.H ************************* */
diff --git a/third_party/g7221/common/stl-files/count.c b/third_party/g7221/common/stl-files/count.c
new file mode 100644
index 0000000..17ce4b3
--- /dev/null
+++ b/third_party/g7221/common/stl-files/count.c
@@ -0,0 +1,303 @@
+/*
+ ***************************************************************************
+ *
+ *   This file contains functions for the automatic complexity calculation
+ * $Id $
+ ***************************************************************************
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "typedef.h"
+#include "count.h"
+
+/* Global counter variable for calculation of complexity weight */
+
+BASIC_OP multiCounter[MAXCOUNTERS];
+int currCounter=0; /* Zero equals global counter */
+
+/*BASIC_OP counter;*/
+const BASIC_OP op_weight =
+{
+  /* G.729 & G.723.1 common operators */
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+  3, 3, 3, 4, 15, 18, 30, 1, 2, 1, 2, 2, 
+  /* G.723.1 exclusives */ 
+  6, 1, 1, 
+  /* shiftless 32-bit operators */ 
+  1, 1, 1,
+  /* G.722.1 exclusives */ 
+  1, 1
+};
+
+/* function prototypes */
+Word32 TotalWeightedOperation (void);
+Word32 DeltaWeightedOperation (void);
+
+/* local variable */
+#if WMOPS
+
+/* Counters for separating counting for different objects */
+static int maxCounter=0;
+static char* objectName[MAXCOUNTERS+1];
+static Word16 fwc_corr[MAXCOUNTERS+1];
+
+#define NbFuncMax  1024
+
+static Word16 funcid[MAXCOUNTERS], nbframe[MAXCOUNTERS];
+static Word32 glob_wc[MAXCOUNTERS], wc[MAXCOUNTERS][NbFuncMax];
+static float total_wmops[MAXCOUNTERS];
+
+static Word32 LastWOper[MAXCOUNTERS];
+
+static char* my_strdup(const char *s)
+/*
+ * duplicates UNIX function strdup() which is not ANSI standard:
+ * -- malloc() memory area big enough to hold the string s
+ * -- copy string into new area
+ * -- return pointer to new area
+ *
+ * returns NULL if either s==NULL or malloc() fails
+ */
+{
+    char *dup;
+    
+    if (s == NULL)
+        return NULL;
+
+    /* allocate memory for copy of ID string (including string terminator) */
+    /* NOTE: the ID strings will never be deallocated because there is no
+             way to "destroy" a counter that is not longer needed          */
+    if ((dup = (char *) malloc(strlen(s)+1)) == NULL)
+        return NULL;
+
+    return strcpy(dup, s);
+}
+
+#endif
+
+int getCounterId(char *objectNameArg)
+{
+#if WMOPS
+  if(maxCounter>=MAXCOUNTERS-1) return 0;
+  objectName[++maxCounter]=my_strdup(objectNameArg);
+  return maxCounter;
+#else
+  return 0; /* Dummy */
+#endif
+}
+
+void setCounter(int counterId)
+{
+#if WMOPS
+  if(counterId>maxCounter || counterId<0)
+    {
+      currCounter=0;
+      return;
+    }
+  currCounter=counterId;
+#endif
+}
+
+#if WMOPS
+static Word32 WMOPS_frameStat()
+/* calculate the WMOPS seen so far and update the global
+   per-frame maximum (glob_wc)
+ */
+{
+    Word32 tot;
+
+    tot = TotalWeightedOperation ();
+    if (tot > glob_wc[currCounter])
+        glob_wc[currCounter] = tot;
+
+    /* check if fwc() was forgotten at end of last frame */
+    if (tot > LastWOper[currCounter]) {
+        if (!fwc_corr[currCounter]) {
+            fprintf(stderr,
+                    "count: operations counted after last fwc() for '%s'; "
+                    "-> fwc() called\n",
+                    objectName[currCounter]?objectName[currCounter]:"");
+        }
+        fwc();
+    }
+    
+    return tot;
+}
+
+static void WMOPS_clearMultiCounter()
+{
+    Word16 i;
+    
+    Word32 *ptr = (Word32 *) &multiCounter[currCounter];
+    for (i = 0; i < (sizeof (multiCounter[currCounter])/ sizeof (Word32)); i++)
+    {
+        *ptr++ = 0;
+    }
+}
+#endif
+
+Word32 TotalWeightedOperation ()
+{
+#if WMOPS
+    Word16 i;
+    Word32 tot, *ptr, *ptr2;
+
+    tot = 0;
+    ptr = (Word32 *) &multiCounter[currCounter];
+    ptr2 = (Word32 *) &op_weight;
+    for (i = 0; i < (sizeof (multiCounter[currCounter])/ sizeof (Word32)); i++)
+    {
+        tot += ((*ptr++) * (*ptr2++));
+    }
+
+    return ((Word32) tot);
+#else
+    return 0; /* Dummy */
+#endif
+}
+
+Word32 DeltaWeightedOperation ()
+{
+#if WMOPS
+    Word32 NewWOper, delta;
+
+    NewWOper = TotalWeightedOperation ();
+    delta = NewWOper - LastWOper[currCounter];
+    LastWOper[currCounter] = NewWOper;
+    return (delta);
+#else
+    return 0; /* Dummy */
+#endif
+}
+
+void move16 (void)
+{
+#if WMOPS
+    multiCounter[currCounter].DataMove16++;
+#endif
+}
+
+void move32 (void)
+{
+#if WMOPS
+    multiCounter[currCounter].DataMove32++;
+#endif
+}
+
+void test (void)
+{
+#if WMOPS
+    multiCounter[currCounter].Test++;
+#endif
+}
+
+void logic16 (void)
+{
+#if WMOPS
+    multiCounter[currCounter].Logic16++;
+#endif
+}
+
+void logic32 (void)
+{
+#if WMOPS
+    multiCounter[currCounter].Logic32++;
+#endif
+}
+
+void Init_WMOPS_counter (void)
+{
+#if WMOPS
+    Word16 i;
+
+    /* reset function weight operation counter variable */
+
+    for (i = 0; i < NbFuncMax; i++)
+        wc[currCounter][i] = (Word32) 0;
+    glob_wc[currCounter] = 0;
+    nbframe[currCounter] = 0;
+    total_wmops[currCounter] = 0.0;
+
+    /* initially clear all counters */
+    WMOPS_clearMultiCounter();
+    LastWOper[currCounter] = 0;
+    funcid[currCounter] = 0;
+#endif
+}
+
+
+void Reset_WMOPS_counter (void)
+{
+#if WMOPS
+    Word32 tot = WMOPS_frameStat();
+        
+    /* increase the frame counter --> a frame is counted WHEN IT BEGINS */
+    nbframe[currCounter]++;
+    /* add wmops used in last frame to count, then reset counter */
+    /* (in first frame, this is a no-op                          */
+    total_wmops[currCounter] += ((float) tot) * 0.00005;
+    
+    /* clear counter before new frame starts */
+    WMOPS_clearMultiCounter();
+    LastWOper[currCounter] = 0;
+    funcid[currCounter] = 0;           /* new frame, set function id to zero */
+#endif
+}
+
+Word32 fwc (void)                      /* function worst case */
+{
+#if WMOPS
+    Word32 tot;
+
+    tot = DeltaWeightedOperation ();
+    if (tot > wc[currCounter][funcid[currCounter]])
+        wc[currCounter][funcid[currCounter]] = tot;
+
+    funcid[currCounter]++;
+
+    return (tot);
+#else
+    return 0; /* Dummy */
+#endif
+}
+
+void WMOPS_output (Word16 dtx_mode)
+{
+#if WMOPS
+    Word16 i;
+    Word32 tot, tot_wm, tot_wc;
+
+    /* get operations since last reset (or init),
+       but do not update the counters (except the glob_wc[] maximum)
+       so output CAN be called in each frame without problems.
+       The frame counter is NOT updated!
+     */
+    tot = WMOPS_frameStat();
+    tot_wm = total_wmops[currCounter] + ((float) tot) * 0.00005;
+
+    fprintf (stdout, "%10s:WMOPS=%.3f",
+	     objectName[currCounter]?objectName[currCounter]:"",
+	     ((float) tot) * 0.00005);
+
+    if (nbframe[currCounter] != 0)
+        fprintf (stdout, "  Average=%.3f",
+                 tot_wm / (float) nbframe[currCounter]);
+    
+    fprintf (stdout, "  WorstCase=%.3f",
+             ((float) glob_wc[currCounter]) * 0.00005);
+
+    /* Worst worst case printed only when not in DTX mode */
+    if (dtx_mode == 0)
+    {
+        tot_wc = 0L;
+        for (i = 0; i < funcid[currCounter]; i++)
+            tot_wc += wc[currCounter][i];
+        fprintf (stdout, "  WorstWC=%.3f", ((float) tot_wc) * 0.00005);
+    }
+    fprintf (stdout, " (%d frames)\n", nbframe[currCounter]);
+    
+#endif
+}
diff --git a/third_party/g7221/common/stl-files/count.h b/third_party/g7221/common/stl-files/count.h
new file mode 100644
index 0000000..5f2227e
--- /dev/null
+++ b/third_party/g7221/common/stl-files/count.h
@@ -0,0 +1,207 @@
+/*
+ ===========================================================================
+ COUNT.H
+ ~~~~~~~
+
+ Prototypes and definitions for counting operations
+
+ These functions, and the ones in basop32.h, makes it possible to
+ measure the wMOPS of a codec.
+
+ All functions in this file, and in basop32.h, updates a structure
+ so that it will be possible the see how many calls to add, mul mulAdd
+ ... that the code made, and estimate the wMOPS (and MIPS) for a
+ sertain part of code
+
+ It is also possible to measure the wMOPS separatly for different
+ parts of the codec.
+
+ This is done by creating a counter group (getCounterId) for each part
+ of the code that one wants a separte measure for. Before a part of
+ the code is executed a call to the "setCounter" function is needed to
+ identify which counter group to use.
+
+ Currently there is a limit of 255 different counter groups.
+
+ In the end of this file there is a pice of code illustration how the
+ functions can be used.
+
+ History
+ ~~~~~~~
+ 09.Aug.1999 V1.0.0 Input to UGST from ETSI AMR (count.h); 
+ 26.Jan.2000 V1.1.0 Added counter entries for G.723.1's 
+                    L_mls(), div_l(), i_mult() [from basop32.c]
+ 05.Jul.2000 V1.2.0 Added counter entries for 32bit shiftless 
+                    operators L_mult0(), L_mac0(), L_msu0()
+ ===========================================================================
+*/
+#ifndef COUNT_H
+#define COUNT_H "$Id $"
+
+#define MAXCOUNTERS 256
+
+int getCounterId(char *objectName);
+/*
+ * Create a counter group, the "objectname" will be used when printing
+ * statistics for this counter group.
+ *
+ * Returns 0 if no more counter groups are available.
+ */
+
+void setCounter(int counterId);
+/*
+ * Defines which counter group to use, default is zero.
+ */
+
+void Init_WMOPS_counter (void);
+/*
+ * Initiates the current counter group.
+ */
+
+void Reset_WMOPS_counter (void);
+/*
+ * Resets the current counter group.
+ */
+
+void WMOPS_output (Word16 notPrintWorstWorstCase);
+/*
+ * Prints the statistics to the screen, if the argument if non zero
+ * the statistics for worst worst case will not be printed. This is typically
+ * done for dtx frames.
+ *
+ */
+
+Word32 fwc (void);
+/*
+ * worst worst case counter.
+ *
+ * This function calculates the worst possible case that can be reached.
+ *
+ * This is done by calling this function for each subpart of the calculations
+ * for a frame. This function then stores the maximum wMOPS for each part.
+ *
+ * The WMOPS_output function add together all parts and presents the sum.
+ */
+
+void move16 (void);
+void move32 (void);
+void logic16 (void);
+void logic32 (void);
+void test (void);
+/*
+ * The functions above increases the corresponding operation counter for
+ * the current counter group.
+ */
+
+typedef struct
+{
+    Word32 add;        /* Complexity Weight of 1 */
+    Word32 sub;
+    Word32 abs_s;
+    Word32 shl;
+    Word32 shr;
+    Word32 extract_h;
+    Word32 extract_l;
+    Word32 mult;
+    Word32 L_mult;
+    Word32 negate;
+    Word32 round;
+    Word32 L_mac;
+    Word32 L_msu;
+    Word32 L_macNs;
+    Word32 L_msuNs;
+    Word32 L_add;      /* Complexity Weight of 2 */
+    Word32 L_sub;
+    Word32 L_add_c;
+    Word32 L_sub_c;
+    Word32 L_negate;
+    Word32 L_shl;
+    Word32 L_shr;
+    Word32 mult_r;
+    Word32 shr_r;
+    Word32 shift_r;
+    Word32 mac_r;
+    Word32 msu_r;
+    Word32 L_deposit_h;
+    Word32 L_deposit_l;
+    Word32 L_shr_r;    /* Complexity Weight of 3 */
+    Word32 L_shift_r;
+    Word32 L_abs;
+    Word32 L_sat;      /* Complexity Weight of 4 */
+    Word32 norm_s;     /* Complexity Weight of 15 */
+    Word32 div_s;      /* Complexity Weight of 18 */
+    Word32 norm_l;     /* Complexity Weight of 30 */
+    Word32 DataMove16; /* Complexity Weight of 1 */
+    Word32 DataMove32; /* Complexity Weight of 2 */
+    Word32 Logic16;    /* Complexity Weight of 1 */
+    Word32 Logic32;    /* Complexity Weight of 2 */
+    Word32 Test;       /* Complexity Weight of 2 */
+                       /* Counters for G.723.1 basic operators*/
+    Word32 L_mls;      /* Complexity Weight of 1 */
+    Word32 div_l;      /* Complexity Weight of 1 */
+    Word32 i_mult;     /* Complexity Weight of 1 */
+    Word32 L_mult0;    /* Complexity Weight of 1 */
+    Word32 L_mac0;     /* Complexity Weight of 1 */
+    Word32 L_msu0;     /* Complexity Weight of 1 */
+                       /* Counters for G.722.1 basic operators*/
+    Word32 LU_shl;     /* Complexity Weight of 1 */
+    Word32 LU_shr;     /* Complexity Weight of 1 */
+}
+BASIC_OP;
+
+#ifdef THISISANEXAMPLE_0123456789
+/*
+  -----------------------------------------------------------------------
+  Example of how count.h could be used.
+ 
+  In the example below it is assumed that the init_OBJECT functions
+  does not use any calls to counter.h or basic_op.h. If this is the
+  case a call to the function Reset_WMOPS_counter() must be done after
+  each call to init_OBJECT if these operations is not to be included
+  in the statistics.
+  -----------------------------------------------------------------------
+*/
+
+int main()
+{ 
+  int spe1Id,spe2Id,cheId;
+ 
+  /* initiate counters and objects */
+  spe1Id=getCounterId("Spe 5k8"); 
+  setCounter(spe1Id); 
+  Init_WMOPS_counter (); 
+  init_spe1(...);
+ 
+  spe2Id=getCounterId("Spe 12k2"); 
+  setCounter(spe2Id); 
+  Init_WMOPS_counter (); 
+  init_spe2(...);
+ 
+  cheId=getCounterId("Channel encoder"); 
+  setCounter(cheId); 
+  Init_WMOPS_counter (); 
+  init_che(...); 
+  ...
+ 
+  while(data)
+  { 
+    test();             /* Note this call to test(); */
+    if(useSpe1)
+      setCounter(spe1Id); 
+    else 
+      setCounter(spe2Id); 
+    Reset_WMOPS_counter();
+    speEncode(...);
+    WMOPS_output(0);    /* Normal routine for displaying WMOPS info */
+    
+    setCounter(cheId); 
+    Reset_WMOPS_counter();
+    preChannelInter(...); fwc(); /* Note the call to fwc() for each part */
+    convolve(...); fwc();        /* of the channel encoder. */
+    interleave(...); fwc();
+    WMOPS_output(0);    /* Normal routine for displaying WMOPS info */
+  }
+}
+#endif /* Example */
+
+#endif /* COUNT_H */
diff --git a/third_party/g7221/common/stl-files/typedef.h b/third_party/g7221/common/stl-files/typedef.h
new file mode 100644
index 0000000..6c06541
--- /dev/null
+++ b/third_party/g7221/common/stl-files/typedef.h
@@ -0,0 +1,55 @@
+/*
+  ===========================================================================
+   File: TYPEDEF.H                                       v.1.0 - 26.Jan.2000
+  ===========================================================================
+
+		      ITU-T STL  BASIC OPERATORS
+
+ 		      TYPE DEFINITION PROTOTYPES
+
+   History:
+   26.Jan.00	v1.0	Incorporated to the STL from updated G.723.1/G.729 
+                        basic operator library (based on basic_op.h)
+  ============================================================================
+*/
+
+#ifndef TYPEDEF_H
+#define TYPEDEF_H "$Id $"
+
+#include <limits.h>
+
+#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__) || defined(__CYGWIN__)
+typedef signed char Word8;
+typedef short Word16;
+typedef long Word32;
+typedef int Flag;
+
+#elif defined(__sun)
+typedef signed char Word8;
+typedef short Word16;
+typedef long Word32;
+typedef int Flag;
+
+#elif defined(__unix__) || defined(__unix)
+typedef signed char Word8;
+typedef short Word16;
+typedef int Word32;
+typedef int Flag;
+
+#endif
+
+/* define 16 bit unsigned types for G.722.1 */
+#if INT_MAX == 32767
+typedef unsigned int UWord16;
+#elif SHRT_MAX == 32767
+typedef unsigned short UWord16;
+#endif
+
+/* define 32 bit unsigned types for G.722.1 */
+#if INT_MAX == 2147483647L
+typedef unsigned int UWord32;
+#elif LONG_MAX == 2147483647L
+typedef unsigned long UWord32;
+#endif
+
+#endif /* TYPEDEF_H */
diff --git a/third_party/g7221/common/tables.c b/third_party/g7221/common/tables.c
new file mode 100644
index 0000000..1018e64
--- /dev/null
+++ b/third_party/g7221/common/tables.c
@@ -0,0 +1,298 @@
+/****************************************************************************
+**
+**   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.
+**
+****************************************************************************/
+
+/****************************************************************************
+  Filename:    tables.c    
+
+  Purpose:     Contains tables used by G.722.1 Annex C
+		
+  Design Notes:
+
+****************************************************************************/
+
+/***************************************************************************
+ Include files                                                           
+***************************************************************************/
+#include "defs.h"
+
+Word16 int_region_standard_deviation_table[REGION_POWER_TABLE_SIZE] = {
+    0,     0,   0, 0, 0, 0, 0, 0, 0, 0,
+    0,     0,   0, 0, 0, 0, 0, 0, 0, 0,
+    0,     0,   1, 1, 1, 1, 2, 3, 4, 6,
+    8,    11,   16, 23, 32, 45, 64, 91, 128, 181,
+  256,   362,  512, 724, 1024, 1448, 2048, 2896, 4096, 5793,
+ 8192, 11585, 16384, 23170, 0,0,0,0,0,0,
+ 0,0,0,0};
+
+Word16 standard_deviation_inverse_table[REGION_POWER_TABLE_SIZE] = {
+  32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+  32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+  32767, 32767, 32767, 32767, 32767, 23170, 16384, 11585, 8192, 5793,
+  4096, 2896, 2048, 1448, 1024, 724, 512, 362, 256, 181,
+  128, 91, 64, 45, 32, 23, 16, 11, 8, 6,
+  4, 3, 2, 1, 1, 1, 1, 0, 0, 0,
+  0, 0, 0, 0};
+
+
+Word16 step_size_inverse_table[NUM_CATEGORIES]={
+	23167,16384,11585,8192,5793,4096,2896,2896
+};
+ 
+
+Word16 vector_dimension[NUM_CATEGORIES] =  { 2, 2, 2, 4, 4, 5, 5, 1};
+Word16 number_of_vectors[NUM_CATEGORIES] = {10,10,10, 5, 5, 4, 4,20};
+/* The last category isn't really coded with scalar quantization. */
+
+Word16 max_bin[NUM_CATEGORIES] = {13, 9, 6, 4, 3, 2, 1, 1};
+
+Word16 max_bin_plus_one_inverse[NUM_CATEGORIES] = 
+{
+	2341,3277,4682,6554,8193,10923,16385,16385
+};
+
+/*
+ * Release 1.2.
+ * Add new version of int_dead_zone[] to go with
+ * changes to vector_huffman() in encoder.c.
+ * 
+ */
+
+/************** See new version of table below
+Word16 int_dead_zone[NUM_CATEGORIES]=
+{
+	9830,10813,11796,12780,13763,14746,16384,16384
+};
+***************/
+
+/******** New version of table added in Release 1.2 ********/
+Word16 int_dead_zone[NUM_CATEGORIES]=         
+{
+2457, 2703, 2949, 3195, 3440, 3686, 4096, 4096
+};
+
+ 
+/*
+ * Release 1.2.
+ * Added this new table to go with
+ * changes to vector_huffman() in encoder.c,
+ * accompanies the new table for int_dead_zone[].
+ */
+
+Word16 int_dead_zone_low_bits[NUM_CATEGORIES]=
+{
+2, 1, 0, 0, 3, 2, 0, 0
+};
+
+
+Word16 samples_to_rmlt_window[DCT_LENGTH]=
+{   44,   134,   224,   314,   404,   494,   584,   674,   764,   853,
+   943,  1033,  1123,  1213,  1302,  1392,  1482,  1571,  1661,  1750,
+  1840,  1929,  2019,  2108,  2197,  2286,  2376,  2465,  2554,  2643,
+  2732,  2821,  2909,  2998,  3087,  3175,  3264,  3352,  3441,  3529,
+  3617,  3705,  3793,  3881,  3969,  4057,  4144,  4232,  4319,  4407,
+  4494,  4581,  4668,  4755,  4842,  4928,  5015,  5101,  5188,  5274,
+  5360,  5446,  5532,  5617,  5703,  5788,  5873,  5959,  6043,  6128,
+  6213,  6297,  6382,  6466,  6550,  6634,  6718,  6801,  6885,  6968,
+  7051,  7134,  7217,  7299,  7382,  7464,  7546,  7628,  7709,  7791,
+  7872,  7953,  8034,  8115,  8195,  8276,  8356,  8436,  8515,  8595,
+  8674,  8753,  8832,  8911,  8989,  9068,  9146,  9223,  9301,  9378,
+  9455,  9532,  9609,  9685,  9762,  9838,  9913,  9989, 10064, 10139,
+ 10214, 10288, 10363, 10437, 10510, 10584, 10657, 10730, 10803, 10875,
+ 10948, 11020, 11091, 11163, 11234, 11305, 11375, 11446, 11516, 11586,
+ 11655, 11724, 11793, 11862, 11930, 11998, 12066, 12134, 12201, 12268,
+ 12334, 12401, 12467, 12532, 12598, 12663, 12728, 12792, 12857, 12920,
+ 12984, 13047, 13110, 13173, 13235, 13297, 13359, 13420, 13481, 13542,
+ 13602, 13662, 13722, 13782, 13841, 13899, 13958, 14016, 14074, 14131,
+ 14188, 14245, 14301, 14357, 14413, 14468, 14523, 14578, 14632, 14686,
+ 14739, 14793, 14845, 14898, 14950, 15002, 15053, 15104, 15155, 15205,
+ 15255, 15305, 15354, 15403, 15451, 15500, 15547, 15595, 15642, 15688,
+ 15734, 15780, 15826, 15871, 15916, 15960, 16004, 16047, 16091, 16133,
+ 16176, 16218, 16259, 16300, 16341, 16382, 16422, 16461, 16501, 16540,
+ 16578, 16616, 16654, 16691, 16728, 16764, 16800, 16836, 16871, 16906,
+ 16940, 16974, 17008, 17041, 17074, 17106, 17138, 17170, 17201, 17232,
+ 17262, 17292, 17321, 17350, 17379, 17407, 17435, 17462, 17489, 17516,
+ 17542, 17567, 17593, 17617, 17642, 17666, 17689, 17713, 17735, 17758,
+ 17779, 17801, 17822, 17842, 17863, 17882, 17901, 17920, 17939, 17957,
+ 17974, 17991, 18008, 18024, 18040, 18055, 18070, 18085, 18099, 18113,
+ 18126, 18139, 18151, 18163, 18174, 18185, 18196, 18206, 18216, 18225,
+ 18234, 18242, 18250, 18257, 18265, 18271, 18277, 18283, 18288, 18293,
+ 18298, 18302, 18305, 18308, 18311, 18313, 18315, 18316, 18317, 18317,
+};
+
+Word16 rmlt_to_samples_window[DCT_LENGTH]=
+{  44,    133,   222,   310,   399,   488,   577,   666,   754,   843,
+   932,   1020,  1109,  1198,  1286,  1375,  1464,  1552,  1641,  1729,
+   1817,  1906,  1994,  2082,  2171,  2259,  2347,  2435,  2523,  2611,
+   2699,  2786,  2874,  2962,  3049,  3137,  3224,  3312,  3399,  3486,
+   3573,  3660,  3747,  3834,  3921,  4008,  4094,  4181,  4267,  4353,
+   4439,  4526,  4611,  4697,  4783,  4869,  4954,  5040,  5125,  5210,
+   5295,  5380,  5465,  5549,  5634,  5718,  5802,  5886,  5970,  6054,
+   6138,  6221,  6304,  6388,  6471,  6553,  6636,  6719,  6801,  6883,
+   6965,  7047,  7129,  7211,  7292,  7373,  7454,  7535,  7616,  7696,
+   7777,  7857,  7937,  8016,  8096,  8175,  8254,  8333,  8412,  8491,
+   8569,  8647,  8725,  8803,  8880,  8957,  9035,  9111,  9188,  9264,
+   9341,  9417,  9492,  9568,  9643,  9718,  9793,  9868,  9942, 10016,
+  10090, 10163, 10237, 10310, 10383, 10455, 10528, 10600, 10672, 10743,
+  10815, 10886, 10957, 11027, 11098, 11168, 11237, 11307, 11376, 11445,
+  11514, 11582, 11650, 11718, 11785, 11853, 11920, 11986, 12053, 12119,
+  12185, 12250, 12315, 12380, 12445, 12509, 12573, 12637, 12701, 12764,
+  12826, 12889, 12951, 13013, 13075, 13136, 13197, 13257, 13318, 13378,
+  13437, 13497, 13556, 13614, 13673, 13731, 13788, 13846, 13903, 13959,
+  14016, 14072, 14128, 14183, 14238, 14292, 14347, 14401, 14454, 14508,
+  14561, 14613, 14665, 14717, 14769, 14820, 14871, 14921, 14971, 15021,
+  15070, 15119, 15168, 15216, 15264, 15311, 15359, 15405, 15452, 15498,
+  15544, 15589, 15634, 15678, 15722, 15766, 15810, 15853, 15895, 15938,
+  15979, 16021, 16062, 16103, 16143, 16183, 16223, 16262, 16300, 16339,
+  16377, 16414, 16452, 16488, 16525, 16561, 16596, 16632, 16666, 16701,
+  16735, 16768, 16801, 16834, 16867, 16899, 16930, 16961, 16992, 17022,
+  17052, 17082, 17111, 17140, 17168, 17196, 17223, 17250, 17277, 17303,
+  17329, 17354, 17379, 17404, 17428, 17452, 17475, 17498, 17520, 17542,
+  17564, 17585, 17606, 17626, 17646, 17665, 17684, 17703, 17721, 17739,
+  17756, 17773, 17790, 17806, 17821, 17836, 17851, 17865, 17879, 17893,
+  17906, 17918, 17931, 17942, 17954, 17965, 17975, 17985, 17995, 18004,
+  18012, 18021, 18028, 18036, 18043, 18049, 18055, 18061, 18066, 18071,
+  18076, 18079, 18083, 18086, 18089, 18091, 18093, 18094, 18095, 18095,
+};
+
+Word16 max_samples_to_rmlt_window[MAX_DCT_LENGTH]={
+0,		43,		89,		133,	178,	222,	268,	314,	357,	403,
+447,	493,	538,	582,	628,	671,	717,	763,	807,	853,
+896,	942,	987,	1031,	1077,	1121,	1166,	1212,	1256,	1301,
+1345,	1390,	1436,	1480,	1526,	1569,	1615,	1660,	1704,	1749,
+1793,	1838,	1884,	1928,	1973,	2016,	2062,	2107,	2151,	2196,
+2239,	2285,	2331,	2374,	2419,	2463,	2508,	2553,	2597,	2642,
+2685,	2730,	2776,	2819,	2864,	2908,	2952,	2998,	3041,	3086,
+3129,	3174,	3219,	3263,	3307,	3350,	3396,	3440,	3483,	3528,
+3571,	3616,	3661,	3704,	3748,	3791,	3836,	3881,	3923,	3968,
+4011,	4055,	4100,	4143,	4187,	4230,	4274,	4318,	4362,	4406,
+4448,	4493,	4537,	4580,	4624,	4666,	4710,	4755,	4797,	4841,
+4883,	4927,	4971,	5013,	5057,	5099,	5144,	5187,	5229,	5273,
+5315,	5359,	5402,	5444,	5488,	5530,	5573,	5617,	5658,	5702,
+5743,	5787,	5830,	5871,	5915,	5956,	6000,	6043,	6084,	6127,
+6169,	6211,	6254,	6296,	6339,	6380,	6423,	6465,	6507,	6549,
+6590,	6633,	6675,	6716,	6759,	6799,	6842,	6884,	6925,	6967,
+7007,	7050,	7092,	7132,	7175,	7215,	7257,	7299,	7339,	7381,
+7421,	7462,	7504,	7544,	7586,	7626,	7667,	7709,	7749,	7790,
+7830,	7871,	7912,	7952,	7993,	8032,	8073,	8114,	8153,	8194,
+8234,	8275,	8315,	8355,	8395,	8434,	8474,	8515,	8554,	8594,
+8632,	8673,	8713,	8752,	8792,	8830,	8871,	8910,	8949,	8989,
+9027,	9066,	9106,	9144,	9184,	9221,	9261,	9300,	9338,	9378,
+9415,	9454,	9493,	9531,	9570,	9607,	9646,	9685,	9722,	9761,
+9798,	9836,	9875,	9912,	9950,	9987,	10025,	10064,	10100,	10138,
+10175,	10213,	10250,	10287,	10325,	10361,	10398,	10436,	10472,	10510,
+10545,	10583,	10620,	10656,	10692,	10728,	10766,	10803,	10838,	10874,
+10910,	10947,	10983,	11018,	11055,	11089,	11126,	11162,	11197,	11233,
+11268,	11303,	11340,	11374,	11410,	11444,	11480,	11515,	11549,	11585,
+11619,	11654,	11689,	11723,	11758,	11791,	11826,	11861,	11895,	11930,
+11963,	11997,	12032,	12065,	12099,	12132,	12166,	12201,	12233,	12267,
+12300,	12333,	12367,	12400,	12433,	12465,	12499,	12532,	12563,	12597,
+12629,	12662,	12695,	12727,	12759,	12790,	12823,	12856,	12887,	12920,
+12951,	12983,	13016,	13046,	13078,	13109,	13141,	13173,	13203,	13235,
+13266,	13296,	13328,	13358,	13389,	13419,	13450,	13481,	13510,	13541,
+13571,	13602,	13632,	13661,	13692,	13721,	13751,	13781,	13810,	13840,
+13869,	13898,	13929,	13957,	13986,	14015,	14044,	14073,	14101,	14130,
+14158,	14187,	14216,	14244,	14272,	14300,	14328,	14357,	14384,	14412,
+14439,	14468,	14495,	14522,	14550,	14577,	14604,	14632,	14658,	14686,
+14711,	14739,	14765,	14792,	14819,	14844,	14871,	14897,	14923,	14949,
+14975,	15001,	15027,	15053,	15079,	15103,	15129,	15155,	15180,	15205,
+15229,	15255,	15280,	15304,	15329,	15353,	15378,	15403,	15426,	15451,
+15475,	15499,	15523,	15546,	15570,	15594,	15618,	15641,	15664,	15688,
+15711,	15734,	15757,	15780,	15802,	15825,	15848,	15871,	15892,	15915,
+15937,	15960,	15982,	16003,	16026,	16047,	16069,	16090,	16112,	16133,
+16154,	16175,	16197,	16217,	16239,	16259,	16279,	16301,	16320,	16341,
+16361,	16382,	16402,	16421,	16441,	16461,	16481,	16501,	16520,	16539,
+16558,	16578,	16597,	16615,	16635,	16653,	16672,	16691,	16709,	16728,
+16746,	16764,	16782,	16800,	16818,	16835,	16853,	16871,	16888,	16905,
+16923,	16940,	16957,	16974,	16991,	17008,	17024,	17041,	17057,	17074,
+17090,	17106,	17122,	17138,	17154,	17169,	17185,	17201,	17216,	17231,
+17246,	17262,	17277,	17291,	17306,	17321,	17336,	17350,	17364,	17379,
+17393,	17407,	17421,	17435,	17449,	17462,	17476,	17490,	17502,	17515,
+17528,	17542,	17554,	17567,	17580,	17592,	17605,	17618,	17629,	17642,
+17653,	17666,	17678,	17689,	17701,	17712,	17724,	17736,	17746,	17757,
+17768,	17779,	17790,	17800,	17811,	17822,	17832,	17842,	17852,	17862,
+17872,	17882,	17892,	17902,	17911,	17920,	17930,	17938,	17947,	17956,
+17965,	17974,	17983,	17991,	17999,	18008,	18016,	18025,	18032,	18040,
+18047,	18055,	18063,	18070,	18078,	18085,	18092,	18099,	18106,	18112,
+18119,	18126,	18132,	18138,	18144,	18151,	18157,	18163,	18168,	18174,
+18179,	18185,	18191,	18196,	18201,	18206,	18211,	18216,	18220,	18225,
+18229,	18234,	18238,	18242,	18246,	18250,	18254,	18257,	18260,	18264,
+18268,	18271,	18274,	18277,	18280,	18283,	18286,	18288,	18291,	18293,
+18295,	18297,	18300,	18301,	18303,	18305,	18306,	18308,	18309,	18311,
+18312,	18312,	18314,	18315,	18315,	18316,	18316,	18317,	18317,	18317
+};
+
+Word16 max_rmlt_to_samples_window[MAX_DCT_LENGTH]={
+0,		43,		88,		131,	176,	219,	265,	310,	353,	398,
+442,	487,	532,	575,	620,	663,	709,	754,	797,	842,
+885,	931,	975,	1019,	1064,	1107,	1152,	1197,	1240,	1286,
+1329,	1373,	1419,	1462,	1507,	1550,	1595,	1640,	1683,	1728,
+1771,	1816,	1861,	1904,	1949,	1992,	2037,	2081,	2125,	2170,
+2212,	2258,	2302,	2345,	2390,	2433,	2477,	2522,	2565,	2610,
+2652,	2697,	2742,	2784,	2829,	2872,	2916,	2961,	3004,	3048,
+3091,	3136,	3180,	3223,	3267,	3310,	3354,	3399,	3441,	3485,
+3528,	3572,	3616,	3659,	3703,	3745,	3790,	3834,	3876,	3920,
+3962,	4006,	4050,	4093,	4136,	4179,	4222,	4266,	4309,	4352,
+4394,	4438,	4482,	4524,	4568,	4610,	4653,	4697,	4739,	4782,
+4824,	4867,	4911,	4953,	4996,	5038,	5081,	5124,	5166,	5209,
+5251,	5294,	5337,	5378,	5421,	5463,	5506,	5548,	5590,	5633,
+5674,	5717,	5759,	5800,	5843,	5884,	5927,	5970,	6011,	6053,
+6094,	6136,	6178,	6219,	6262,	6302,	6345,	6387,	6428,	6470,
+6510,	6552,	6594,	6635,	6677,	6717,	6759,	6801,	6841,	6883,
+6922,	6964,	7006,	7046,	7087,	7127,	7169,	7210,	7250,	7291,
+7331,	7372,	7413,	7453,	7494,	7533,	7574,	7615,	7655,	7695,
+7735,	7776,	7816,	7855,	7896,	7935,	7975,	8016,	8054,	8095,
+8134,	8174,	8214,	8253,	8293,	8332,	8371,	8412,	8450,	8490,
+8528,	8568,	8607,	8646,	8685,	8723,	8763,	8802,	8840,	8879,
+8917,	8956,	8995,	9033,	9072,	9109,	9148,	9187,	9225,	9264,
+9301,	9340,	9378,	9415,	9454,	9491,	9529,	9567,	9604,	9642,
+9679,	9717,	9755,	9791,	9829,	9866,	9903,	9941,	9977,	10015,
+10051,	10089,	10126,	10162,	10199,	10235,	10272,	10309,	10345,	10382,
+10417,	10454,	10491,	10526,	10563,	10598,	10635,	10672,	10706,	10742,
+10778,	10814,	10850,	10885,	10921,	10955,	10991,	11027,	11061,	11097,
+11131,	11166,	11202,	11236,	11271,	11305,	11340,	11376,	11409,	11444,
+11478,	11513,	11547,	11580,	11615,	11648,	11683,	11717,	11751,	11785,
+11817,	11852,	11886,	11918,	11952,	11985,	12018,	12053,	12085,	12118,
+12150,	12184,	12217,	12249,	12282,	12314,	12347,	12380,	12411,	12444,
+12476,	12508,	12541,	12572,	12604,	12635,	12668,	12700,	12731,	12763,
+12794,	12826,	12858,	12888,	12920,	12950,	12982,	13013,	13043,	13074,
+13105,	13135,	13166,	13196,	13227,	13257,	13287,	13317,	13347,	13377,
+13407,	13437,	13467,	13496,	13525,	13555,	13585,	13614,	13643,	13672,
+13701,	13730,	13760,	13787,	13817,	13845,	13873,	13903,	13930,	13959,
+13987,	14015,	14043,	14071,	14099,	14126,	14154,	14183,	14209,	14237,
+14264,	14292,	14319,	14346,	14373,	14400,	14427,	14454,	14480,	14507,
+14533,	14560,	14586,	14612,	14639,	14664,	14691,	14717,	14742,	14768,
+14793,	14819,	14845,	14870,	14896,	14920,	14945,	14971,	14996,	15020,
+15044,	15070,	15094,	15118,	15143,	15167,	15192,	15216,	15239,	15263,
+15287,	15311,	15335,	15358,	15382,	15405,	15428,	15452,	15474,	15498,
+15520,	15543,	15566,	15588,	15611,	15633,	15656,	15678,	15700,	15722,
+15744,	15766,	15788,	15809,	15831,	15852,	15874,	15895,	15916,	15937,
+15958,	15979,	16000,	16020,	16041,	16061,	16082,	16103,	16122,	16143,
+16162,	16183,	16203,	16222,	16242,	16261,	16281,	16300,	16319,	16339,
+16357,	16377,	16396,	16414,	16433,	16451,	16470,	16488,	16506,	16525,
+16542,	16561,	16579,	16596,	16614,	16631,	16649,	16667,	16683,	16700,
+16717,	16735,	16752,	16768,	16785,	16801,	16818,	16834,	16850,	16867,
+16883,	16899,	16915,	16930,	16945,	16961,	16977,	16992,	17007,	17022,
+17037,	17052,	17067,	17081,	17096,	17111,	17126,	17140,	17154,	17168,
+17182,	17196,	17209,	17223,	17237,	17250,	17264,	17277,	17290,	17303,
+17315,	17329,	17341,	17354,	17367,	17379,	17391,	17404,	17415,	17428,
+17439,	17451,	17463,	17475,	17486,	17497,	17509,	17520,	17531,	17542,
+17552,	17563,	17574,	17584,	17595,	17605,	17616,	17626,	17636,	17646,
+17655,	17665,	17675,	17684,	17694,	17703,	17712,	17721,	17730,	17739,
+17747,	17756,	17764,	17773,	17781,	17789,	17798,	17806,	17813,	17821,
+17829,	17836,	17843,	17851,	17858,	17866,	17872,	17879,	17886,	17893,
+17899,	17906,	17912,	17918,	17924,	17931,	17937,	17942,	17948,	17953,
+17959,	17964,	17970,	17975,	17980,	17985,	17990,	17995,	17999,	18004,
+18008,	18012,	18016,	18021,	18025,	18028,	18032,	18036,	18039,	18043,
+18046,	18049,	18052,	18055,	18058,	18061,	18064,	18067,	18069,	18071,
+18073,	18075,	18078,	18079,	18081,	18083,	18084,	18086,	18087,	18089,
+18090,	18090,	18091,	18092,	18093,	18094,	18094,	18095,	18095,	18095
+};
diff --git a/third_party/g7221/common/tables.h b/third_party/g7221/common/tables.h
new file mode 100644
index 0000000..ddf29eb
--- /dev/null
+++ b/third_party/g7221/common/tables.h
@@ -0,0 +1,47 @@
+/***********************************************************************
+**
+**   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)
+**
+**   © 1999 PictureTel Coporation
+**          Andover, MA, USA  
+**
+**	    All rights reserved.
+**
+***********************************************************************/
+
+/***********************************************************************
+  Filename:    tables.h    
+
+  Purpose:     Contains table definitions used by G.722.1 Annex C
+		
+  Design Notes:
+
+***********************************************************************/
+
+/***********************************************************************
+ Include files                                                           
+***********************************************************************/
+#define REGION_POWER_TABLE_SIZE 64
+#define NUM_CATEGORIES          8
+#define DCT_LENGTH              320
+#define MAX_DCT_LENGTH          640
+
+extern Word16 int_region_standard_deviation_table[REGION_POWER_TABLE_SIZE];
+extern Word16 standard_deviation_inverse_table[REGION_POWER_TABLE_SIZE];
+extern Word16 step_size_inverse_table[NUM_CATEGORIES];
+extern Word16 vector_dimension[NUM_CATEGORIES];
+extern Word16 number_of_vectors[NUM_CATEGORIES];
+/* The last category isn't really coded with scalar quantization. */
+extern Word16 max_bin[NUM_CATEGORIES];
+extern Word16 max_bin_plus_one_inverse[NUM_CATEGORIES];
+extern Word16 int_dead_zone[NUM_CATEGORIES];
+extern Word16 samples_to_rmlt_window[DCT_LENGTH];
+extern Word16 rmlt_to_samples_window[DCT_LENGTH];
+
+/* Add next line in Release 1.2 */
+extern Word16 int_dead_zone_low_bits[NUM_CATEGORIES];
+
+extern Word16 max_samples_to_rmlt_window[MAX_DCT_LENGTH];
+extern Word16 max_rmlt_to_samples_window[MAX_DCT_LENGTH];
diff --git a/third_party/g7221/decode/coef2sam.c b/third_party/g7221/decode/coef2sam.c
new file mode 100644
index 0000000..18a88ac
--- /dev/null
+++ b/third_party/g7221/decode/coef2sam.c
@@ -0,0 +1,180 @@
+/*****************************************************************************
+**
+**   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.
+**
+*****************************************************************************/
+
+/*****************************************************************************
+* Filename: rmlt_coefs_to_samples.c
+*
+* Purpose:  Convert Reversed MLT (Modulated Lapped Transform) 
+*           Coefficients to Samples
+*
+*     The "Reversed MLT" is an overlapped block transform which uses
+*     even symmetry * on the left, odd symmetry on the right and a
+*     Type IV DCT as the block transform.  * It is thus similar to a
+*     MLT which uses odd symmetry on the left, even symmetry * on the
+*     right and a Type IV DST as the block transform.  In fact, it is
+*     equivalent * to reversing the order of the samples, performing
+*     an MLT and then negating all * the even-numbered coefficients.
+*
+*****************************************************************************/
+
+/***************************************************************************
+ Include files                                                           
+***************************************************************************/
+#include "defs.h"
+#include "tables.h"
+#include "count.h"
+
+/***************************************************************************
+ Function:     rmlt_coefs_to_samples 
+
+ Syntax:       void rmlt_coefs_to_samples(Word16 *coefs,       
+                                          Word16 *old_samples, 
+                                          Word16 *out_samples, 
+                                          Word16 dct_length,
+                                          Word16 mag_shift)    
+            
+               inputs:    Word16 *coefs
+                          Word16 *old_samples
+                          Word16 dct_length
+                          Word16 mag_shift
+                          
+                          
+               outputs:   Word16 *out_samples
+               
+ Description:  Converts the mlt_coefs to samples
+
+ Design Notes:
+ 
+ WMOPS:     7kHz |    24kbit    |    32kbit
+          -------|--------------|----------------
+            AVG  |     1.91     |    1.91
+          -------|--------------|----------------  
+            MAX  |     1.91     |    1.91
+          -------|--------------|---------------- 
+				
+           14kHz |    24kbit    |    32kbit      |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |     3.97     |    3.97        |     3.97   
+          -------|--------------|----------------|----------------
+            MAX  |     3.97     |    3.97        |     3.97   
+          -------|--------------|----------------|----------------
+
+***************************************************************************/
+
+void rmlt_coefs_to_samples(Word16 *coefs,     
+                           Word16 *old_samples,
+                           Word16 *out_samples,           
+                           Word16 dct_length,
+                           Word16 mag_shift)             
+{
+
+    
+    Word16	index, vals_left;
+    Word16	new_samples[MAX_DCT_LENGTH];
+    Word16	*new_ptr, *old_ptr;
+    Word16	*win_new, *win_old;
+    Word16	*out_ptr;
+    Word16  half_dct_size;
+    Word32  sum;
+
+    
+
+    half_dct_size = shr(dct_length,1);
+    
+    /* Perform a Type IV (inverse) DCT on the coefficients */
+    dct_type_iv_s(coefs, new_samples, dct_length);
+    
+    test();
+    if (mag_shift > 0) 
+    {
+        for(index=0;index<dct_length;index++)
+        {
+            new_samples[index] = shr(new_samples[index],mag_shift);
+            move16();
+        }
+    }
+    else 
+    {
+        test();
+        if (mag_shift < 0) 
+        {
+            mag_shift = negate(mag_shift);
+            for(index=0;index<dct_length;index++)
+            {
+                new_samples[index] = shl(new_samples[index],mag_shift);
+                move16();
+            }
+        }
+
+    }
+
+    /* Get the first half of the windowed samples */
+    
+    out_ptr = out_samples;
+    move16();
+    test();
+    if (dct_length==DCT_LENGTH)
+    {
+        win_new = rmlt_to_samples_window;
+        move16();
+        win_old = rmlt_to_samples_window + dct_length;
+        move16();
+    }
+    else
+    {
+        win_new = max_rmlt_to_samples_window;
+        move16();
+        win_old = max_rmlt_to_samples_window + dct_length;
+        move16();
+    }
+    old_ptr = old_samples;
+    move16();
+    new_ptr = new_samples + half_dct_size;
+    move16();
+    
+    for (vals_left = half_dct_size;    vals_left > 0;    vals_left--)
+    {
+        sum = 0L;
+        move32();
+        sum = L_mac(sum,*win_new++, *--new_ptr);
+        sum = L_mac(sum,*--win_old, *old_ptr++);
+        *out_ptr++ = round(L_shl(sum,2));
+        move16();
+
+    }
+    
+    /* Get the second half of the windowed samples */
+    
+    for (vals_left = half_dct_size;    vals_left > 0;    vals_left--)
+    {
+        sum = 0L;
+        move32();
+        sum = L_mac(sum,*win_new++, *new_ptr++);
+        sum = L_mac(sum,negate(*--win_old), *--old_ptr);
+        *out_ptr++ = round(L_shl(sum,2));
+        move16();
+    }
+        
+    /* Save the second half of the new samples for   */
+    /* next time, when they will be the old samples. */
+    
+    /* pointer arithmetic */
+    new_ptr = new_samples + half_dct_size;
+    move16();
+    old_ptr = old_samples;
+    move16();
+    for (vals_left = half_dct_size;    vals_left > 0;    vals_left--)
+    {
+        *old_ptr++ = *new_ptr++;
+        move16();
+    }
+}
diff --git a/third_party/g7221/decode/dct4_s.c b/third_party/g7221/decode/dct4_s.c
new file mode 100644
index 0000000..8451482
--- /dev/null
+++ b/third_party/g7221/decode/dct4_s.c
@@ -0,0 +1,480 @@
+/********************************************************************************
+**
+**   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.
+**
+********************************************************************************/
+
+/********************************************************************************
+* Filename: dct_type_iv_s.c
+*
+* Purpose:  Discrete Cosine Transform, Type IV used for inverse MLT
+*
+* The basis functions are
+*
+*	 cos(PI*(t+0.5)*(k+0.5)/block_length)
+*
+* for time t and basis function number k.  Due to the symmetry of the expression
+* in t and k, it is clear that the forward and inverse transforms are the same.
+*
+*********************************************************************************/
+
+/***************************************************************************
+ Include files                                                           
+***************************************************************************/
+#include "defs.h"
+#include "count.h"
+#include "dct4_s.h"
+
+/***************************************************************************
+ External variable declarations                                          
+***************************************************************************/
+extern Word16    syn_bias_7khz[DCT_LENGTH];
+extern Word16    dither[DCT_LENGTH];
+extern Word16    max_dither[MAX_DCT_LENGTH];
+
+extern Word16       dct_core_s[DCT_LENGTH_DIV_32][DCT_LENGTH_DIV_32];
+extern cos_msin_t	s_cos_msin_2[DCT_LENGTH_DIV_32];
+extern cos_msin_t	s_cos_msin_4[DCT_LENGTH_DIV_16];
+extern cos_msin_t	s_cos_msin_8[DCT_LENGTH_DIV_8];
+extern cos_msin_t	s_cos_msin_16[DCT_LENGTH_DIV_4];
+extern cos_msin_t	s_cos_msin_32[DCT_LENGTH_DIV_2];
+extern cos_msin_t	s_cos_msin_64[DCT_LENGTH];
+extern cos_msin_t	*s_cos_msin_table[];
+
+/********************************************************************************
+ Function:    dct_type_iv_s
+
+ Syntax:      void dct_type_iv_s (Word16 *input,Word16 *output,Word16 dct_length)
+              
+
+ Description: Discrete Cosine Transform, Type IV used for inverse MLT
+
+ Design Notes:
+ 
+ WMOPS:     7kHz |    24kbit    |    32kbit
+          -------|--------------|----------------
+            AVG  |     1.74     |     1.74
+          -------|--------------|----------------  
+            MAX  |     1.74     |     1.74
+          -------|--------------|---------------- 
+				
+           14kHz |    24kbit    |    32kbit      |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |     3.62     |     3.62       |      3.62   
+          -------|--------------|----------------|----------------
+            MAX  |     3.62     |     3.62       |      3.62   
+          -------|--------------|----------------|----------------
+
+********************************************************************************/
+
+void dct_type_iv_s (Word16 *input,Word16 *output,Word16 dct_length)
+{
+    Word16   buffer_a[MAX_DCT_LENGTH], buffer_b[MAX_DCT_LENGTH], buffer_c[MAX_DCT_LENGTH];
+    Word16   *in_ptr, *in_ptr_low, *in_ptr_high, *next_in_base;
+    Word16   *out_ptr_low, *out_ptr_high, *next_out_base;
+    Word16   *out_buffer, *in_buffer, *buffer_swap;
+    Word16   in_val_low, in_val_high;
+    Word16   out_val_low, out_val_high;
+    Word16   in_low_even, in_low_odd;
+    Word16   in_high_even, in_high_odd;
+    Word16   out_low_even, out_low_odd;
+    Word16   out_high_even, out_high_odd;
+    Word16   *pair_ptr;
+    Word16   cos_even, cos_odd, msin_even, msin_odd;
+    Word16   set_span, set_count, set_count_log, pairs_left, sets_left;
+    Word16   i,k;
+    Word16   index;
+    Word16   dummy;
+    Word32 	 sum;
+    cos_msin_t	**table_ptr_ptr, *cos_msin_ptr;
+
+    Word32 acca;
+    Word16 temp;
+
+    Word16   dct_length_log;
+    Word16   *dither_ptr;
+    
+    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+    /* Do the sum/difference butterflies, the first part of */
+    /* converting one N-point transform into 32 - 10 point transforms  */
+    /* transforms, where N = 1 << DCT_LENGTH_LOG.           */
+    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+    test();
+    if (dct_length==DCT_LENGTH)
+    {
+        dct_length_log = DCT_LENGTH_LOG;
+        move16();
+        dither_ptr = dither;
+        move16();
+    }
+    else
+    {
+        dct_length_log = MAX_DCT_LENGTH_LOG;
+        move16();
+        dither_ptr = max_dither;
+        move16();
+    }
+    
+    in_buffer  = input;
+    move16();
+    out_buffer = buffer_a;
+    move16();
+    
+    index=0;
+    move16();
+    
+    i=0;
+    move16();
+
+    for (set_count_log = 0;    set_count_log <= dct_length_log - 2;    set_count_log++) 
+    {
+
+        /*===========================================================*/
+        /* Initialization for the loop over sets at the current size */
+        /*===========================================================*/
+        
+        /*    set_span      = 1 << (DCT_LENGTH_LOG - set_count_log); */
+        set_span = shr(dct_length,set_count_log);
+           
+        set_count     = shl(1,set_count_log);
+        in_ptr        = in_buffer;
+        move16();
+        next_out_base = out_buffer;
+        move16();
+        
+        /*=====================================*/
+        /* Loop over all the sets of this size */
+        /*=====================================*/
+        temp = sub(index,1);
+        test();
+        if(temp < 0)
+        {
+            for (sets_left = set_count;sets_left > 0;sets_left--) 
+            {
+    
+                /*||||||||||||||||||||||||||||||||||||||||||||*/
+                /* Set up output pointers for the current set */
+                /*||||||||||||||||||||||||||||||||||||||||||||*/
+                /* pointer arithmetic */
+                out_ptr_low    = next_out_base;
+                move16();
+                next_out_base += set_span;
+                move16();
+                out_ptr_high   = next_out_base;
+                move16();
+
+                /*||||||||||||||||||||||||||||||||||||||||||||||||||*/
+                /* Loop over all the butterflies in the current set */
+                /*||||||||||||||||||||||||||||||||||||||||||||||||||*/
+                    
+                do 
+                {
+                    in_val_low      = *in_ptr++;
+                    move16();
+                    in_val_high     = *in_ptr++;
+                    move16();
+
+                    /* BEST METHOD OF GETTING RID OF BIAS, BUT COMPUTATIONALLY UNPLEASANT */
+                    /* ALTERNATIVE METHOD, SMEARS BIAS OVER THE ENTIRE FRAME, COMPUTATIONALLY SIMPLEST. */
+                    /* IF THIS WORKS, IT'S PREFERABLE */
+                        
+                    dummy = add(in_val_low,dither_ptr[i++]);
+                    acca = L_add(dummy,in_val_high);
+                    out_val_low = extract_l(L_shr(acca,1));
+                    
+                    dummy = add(in_val_low,dither_ptr[i++]);
+                    acca = L_add(dummy,-in_val_high);
+                    out_val_high = extract_l(L_shr(acca,1));
+                    
+                    *out_ptr_low++  = out_val_low;
+                    move16();
+                    *--out_ptr_high = out_val_high;
+                    move16();
+
+                    test();
+                    
+                    /* this involves comparison of pointers */
+                    /* pointer arithmetic */
+
+                } while (out_ptr_low < out_ptr_high);
+    
+            } /* End of loop over sets of the current size */
+        }
+        else
+        {
+            for (sets_left = set_count;    sets_left > 0;    sets_left--) 
+            {
+                /*||||||||||||||||||||||||||||||||||||||||||||*/
+                /* Set up output pointers for the current set */
+                /*||||||||||||||||||||||||||||||||||||||||||||*/
+                
+                out_ptr_low    = next_out_base;
+                move16();
+                next_out_base += set_span;
+                move16();
+                out_ptr_high   = next_out_base;
+                move16();
+
+            	/*||||||||||||||||||||||||||||||||||||||||||||||||||*/
+            	/* Loop over all the butterflies in the current set */
+            	/*||||||||||||||||||||||||||||||||||||||||||||||||||*/
+                
+                do 
+                {
+                    in_val_low      = *in_ptr++;
+                    move16();
+                    in_val_high     = *in_ptr++;
+                    move16();
+
+                    out_val_low     = add(in_val_low,in_val_high);
+                    out_val_high    = add(in_val_low,negate(in_val_high));
+                    
+                    *out_ptr_low++  = out_val_low;
+                    move16();
+                    *--out_ptr_high = out_val_high;
+                    move16();
+
+                    test();
+                } while (out_ptr_low < out_ptr_high);
+    
+            } /* End of loop over sets of the current size */
+        }
+
+        /*============================================================*/
+        /* Decide which buffers to use as input and output next time. */
+        /* Except for the first time (when the input buffer is the    */
+        /* subroutine input) we just alternate the local buffers.     */
+        /*============================================================*/
+        
+        in_buffer = out_buffer;
+        move16();
+        
+        test();
+        if (out_buffer == buffer_a)
+        {
+            out_buffer = buffer_b;
+            move16();
+        }
+        else
+        {
+            out_buffer = buffer_a;
+            move16();
+        }
+        
+        index = add(index,1);
+    } /* End of loop over set sizes */
+
+
+    /*++++++++++++++++++++++++++++++++*/
+    /* Do 32 - 10 point transforms */
+    /*++++++++++++++++++++++++++++++++*/
+    
+    pair_ptr = in_buffer;
+    move16();
+    buffer_swap = buffer_c;
+    move16();
+
+    for (pairs_left = 1 << (dct_length_log - 1);    pairs_left > 0;    pairs_left--) 
+    {
+        for ( k=0; k<CORE_SIZE; k++ )
+        {
+            sum=0L;
+            move32();
+            
+            for ( i=0; i<CORE_SIZE; i++ )
+            {
+                sum = L_mac(sum, pair_ptr[i],dct_core_s[i][k]);
+            }
+            buffer_swap[k] = round(sum);
+        }
+        
+        pair_ptr   += CORE_SIZE;
+        move16();
+        buffer_swap += CORE_SIZE;
+        move16();
+    }
+    
+    for (i=0;i<dct_length;i++)
+    {
+        in_buffer[i] = buffer_c[i];
+        move16();
+    }
+
+    table_ptr_ptr = s_cos_msin_table;
+    move16();
+
+    /*++++++++++++++++++++++++++++++*/
+    /* Perform rotation butterflies */
+    /*++++++++++++++++++++++++++++++*/
+    index=0;
+    move16();
+    
+    for (set_count_log = dct_length_log - 2 ;    set_count_log >= 0;    set_count_log--) 
+    {
+
+        /*===========================================================*/
+        /* Initialization for the loop over sets at the current size */
+        /*===========================================================*/
+        
+        /*    set_span      = 1 << (DCT_LENGTH_LOG - set_count_log); */
+        set_span = shr(dct_length,set_count_log);
+        
+        set_count     = shl(1,set_count_log);
+        next_in_base  = in_buffer;
+        move16();
+        test();
+        if (set_count_log == 0)
+        {
+            next_out_base = output;
+            move16();
+        }
+        else
+        {
+            next_out_base = out_buffer;
+            move16();
+        }
+        
+        /*=====================================*/
+        /* Loop over all the sets of this size */
+        /*=====================================*/
+
+        for (sets_left = set_count;    sets_left > 0;    sets_left--) 
+        {
+
+            /*|||||||||||||||||||||||||||||||||||||||||*/
+            /* Set up the pointers for the current set */
+            /*|||||||||||||||||||||||||||||||||||||||||*/
+            
+            in_ptr_low     = next_in_base;
+            move16();
+            
+            temp = shr(set_span,1);
+            in_ptr_high    = in_ptr_low + temp;
+            move16();
+            
+            next_in_base  += set_span;
+            move16();
+            
+            out_ptr_low    = next_out_base;
+            move16();
+            
+            next_out_base += set_span;
+            move16();
+            out_ptr_high   = next_out_base;
+            move16();
+            
+            cos_msin_ptr   = *table_ptr_ptr;
+            move16();
+
+            /*||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
+            /* Loop over all the butterfly pairs in the current set */
+            /*||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
+
+	        do 
+            {
+                in_low_even     = *in_ptr_low++;
+                move16();
+                in_low_odd      = *in_ptr_low++;
+                move16();
+                in_high_even    = *in_ptr_high++;
+                move16();
+                in_high_odd     = *in_ptr_high++;
+                move16();
+                cos_even        = cos_msin_ptr[0].cosine;
+                move16();
+                msin_even       = cos_msin_ptr[0].minus_sine;
+                move16();
+                cos_odd         = cos_msin_ptr[1].cosine;
+                move16();
+                msin_odd        = cos_msin_ptr[1].minus_sine;
+                move16();
+                cos_msin_ptr   += 2;
+                
+                sum = 0L;
+                move32();
+                
+                sum = L_mac(sum,cos_even,in_low_even);
+                sum = L_mac(sum,negate(msin_even),in_high_even);
+                out_low_even = round(L_shl(sum,1));
+                
+                sum = 0L;
+                move32();
+                sum = L_mac(sum,msin_even,in_low_even);
+                sum = L_mac(sum,cos_even,in_high_even);
+                out_high_even = round(L_shl(sum,1));
+                
+                sum = 0L;
+                move32();
+                sum = L_mac(sum,cos_odd,in_low_odd);
+                sum = L_mac(sum,msin_odd,in_high_odd);
+                out_low_odd = round(L_shl(sum,1));
+                
+                sum = 0L;
+                move32();
+                sum = L_mac(sum,msin_odd,in_low_odd);
+                sum = L_mac(sum,negate(cos_odd),in_high_odd);
+                out_high_odd = round(L_shl(sum,1));
+                
+                *out_ptr_low++  = out_low_even;
+                move16();
+                *--out_ptr_high = out_high_even;
+                move16();
+                *out_ptr_low++  = out_low_odd;
+                move16();
+                *--out_ptr_high = out_high_odd;
+                move16();
+            
+                test();
+            } while (out_ptr_low < out_ptr_high);
+
+	    } /* End of loop over sets of the current size */
+
+        /*=============================================*/
+        /* Swap input and output buffers for next time */
+        /*=============================================*/
+        
+        buffer_swap = in_buffer;
+        move16();
+        in_buffer   = out_buffer;
+        move16();
+        out_buffer  = buffer_swap;
+        move16();
+        
+        index = add(index,1);
+        table_ptr_ptr++;
+    }
+    /*------------------------------------
+    
+         ADD IN BIAS FOR OUTPUT
+         
+    -----------------------------------*/
+    if (dct_length==DCT_LENGTH)
+    {
+        for(i=0;i<320;i++) 
+        {
+           sum = L_add(output[i],syn_bias_7khz[i]);
+           acca = L_sub(sum,32767);
+           test();
+           if (acca > 0) 
+           {
+               sum = 32767L;
+               move32();
+           }
+           acca = L_add(sum,32768L);
+           test();
+           if (acca < 0) 
+           {
+               sum = -32768L;
+               move32();
+           }
+           output[i] = extract_l(sum);
+        }
+    }
+}
+
diff --git a/third_party/g7221/decode/dct4_s.h b/third_party/g7221/decode/dct4_s.h
new file mode 100644
index 0000000..010e52d
--- /dev/null
+++ b/third_party/g7221/decode/dct4_s.h
@@ -0,0 +1,856 @@
+/***********************************************************************
+**
+**   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.
+**
+***********************************************************************/
+
+/***********************************************************************
+  Filename:    dct4_s.h    
+
+  Purpose:     Contains tables used by dct4_s.c
+		
+  Design Notes:
+
+***********************************************************************/
+
+/***************************************************************************
+ Include files                                                           
+***************************************************************************/
+
+typedef struct 
+{
+    Word16 cosine;
+    Word16 minus_sine;
+} cos_msin_t;
+
+/***************************************************************************
+  The dct_core_s table was generated by the following code
+
+      for(i=0;i<10;++i)
+      {
+          for(k=0;k<10;++k)
+          {
+              dct_core_s[i][k]=(short) (FTOI(((.9*32768.)*cos(3.1415926*(k+0.5)*(i+0.5)/10.))));
+          }
+      }
+***************************************************************************/
+Word16 dct_core_s[10][10] = {
+{ 29400,   28676,   27246,   25145,   22425,   19153,   15409,   11286,    6885,  2314 },
+{ 28676,   22425,   11286,   -2314,  -15409,  -25145,  -29400,  -27246,  -19153,  -6885 },
+{ 27246,   11286,  -11286,  -27246,  -27246,  -11286,   11286,   27246,   27246,  11286 },
+{ 25145,   -2314,  -27246,  -22425,    6885,   28676,   19153,  -11286,  -29400,  -15409 },
+{ 22425,  -15409,  -27246,    6885,   29400,    2314,  -28676,  -11286,   25145,  19153 },
+{ 19153,  -25145,  -11286,   28676,    2314,  -29400,    6885,   27246,  -15409,  -22425 },
+{ 15409,  -29400,   11286,   19153,  -28676,    6885,   22425,  -27246,    2314,  25145 },
+{ 11286,  -27246,   27246,  -11286,  -11286,   27246,  -27246,   11286,   11286,  -27246 },
+{  6885,  -19153,   27246,  -29400,   25145,  -15409,    2314,   11286,  -22425,  28676 },
+{  2314,   -6885,   11286,  -15409,   19153,  -22425,   25145,  -27246,   28676,  -29400 }
+};    
+
+Word16 syn_bias_7khz[DCT_LENGTH] = {
+ -4,  4, -5, -2,  0, -4,  6,  2, -2, -4,
+ -3,  3,  0,  0, -2,  4,  0,  0,  3, -6,
+  8,  5,  4,  5, -8,  0, -2,  0,  0, -3,
+  3,  0,  0,  0,  1, -1, -2,  0,  0,  2,
+ -2, -5, -2,  3,  2, -1, -1, -6,  3,  1,
+ -7,  4,  4,  0,  1,  4,  1,  0,  1, -5,
+ -1,  1, -6,  0, -1, -1,  3,  0, -2,  1,
+  2, -4,  0,  9,  0, -3,  1,  1,  1,  0,
+ -3, -2, -1, -4, -2,  0,  5,  2, -3,  5,
+  0, -2,  4,  4,  0, -6, -4,  2,  0,  0,
+  0, -1, -1, -2,  0,  6,  1,  0,  0, -1,
+  0, -4, -1,  0, -4,  1, -1, -5,  0,  1,
+  2,  4,  0, -8, -4,  0, -2, -2,  2,  5,
+ -3, -1,  1, -4,  0,  0,  0, -1, -3,  0,
+ -5, -4,  0, -2,  0,  7,  1,  0,  5, -2,
+ -1,  2,  2, -2,  3,  7, -3,  4,  1, -4,
+  0,  0,  3, -7, -5,  0,  0,  4,  0, -2,
+ -1,  0, -5,  0,  2,  0, 11,  5, -1,  0,
+  2,  2, -2, -2,  5,  4, -3,  1,  0, -2,
+  1,  3,  2,  0,  1,  0,  0,  0,  5,  6,
+ -2, -1,  0,  2,  3,  2,  0, -3,  4,  5,
+  0, -1,  0,  3,  1, -2, -3, -2, -1,  2,
+ -1, -1, -2, -7,  4,  6, -5, -6, -3, -4,
+  0,  2, -5, -2,  3,  0,  0,  0,  2, -2,
+ -4,  3,  3,  1,  0,  0,  4, -1,  8, 13,
+  1,  2,  0,  2,  0, -1,  4, -3,  1,  0,
+ -1,  3,  0,  0, -5,  0,  6,  2,  4,  5,
+  2, -1, -1,  3,  6,  1,  1,  2, -4,  0,
+ -1, -6, -2, -2,  2,  1,  2,  6,  2,  0,
+ -2, -2,  0, -1,  2,  0,  0,  3, -2,  1,
+  3,  1,  2, -1, -2,  2,  2, -4,  0,  0,
+ -3,  0, -4, -3,  6,  7,  2,  2,  0, -3};
+
+Word16 dither[DCT_LENGTH]= {
+  1,  0,  0,  0,  1,  0,  0,  1,  1,  1,
+  1,  0,  0,  0,  1,  1,  1,  1,  1,  0,
+  0,  1,  1,  1,  0,  1,  1,  0,  0,  0,
+  1,  0,  0,  1,  0,  1,  0,  0,  1,  0,
+  1,  0,  0,  0,  1,  0,  1,  0,  0,  0,
+  1,  1,  1,  1,  1,  0,  0,  1,  0,  0,
+  0,  0,  1,  0,  0,  0,  1,  0,  0,  1,
+  1,  1,  1,  1,  1,  0,  1,  0,  0,  1,
+  1,  0,  0,  1,  0,  0,  0,  1,  0,  1,
+  0,  0,  1,  1,  0,  1,  0,  1,  1,  1,
+  1,  0,  0,  0,  0,  1,  1,  1,  1,  1,
+  0,  0,  0,  1,  0,  1,  0,  0,  0,  1,
+  1,  1,  0,  0,  1,  1,  1,  1,  1,  0,
+  0,  1,  1,  1,  1,  0,  1,  1,  1,  0,
+  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,
+  1,  0,  1,  1,  1,  1,  0,  0,  0,  0,
+  1,  1,  0,  1,  0,  0,  1,  0,  0,  1,
+  0,  0,  0,  1,  1,  0,  0,  1,  1,  1,
+  1,  0,  0,  0,  0,  0,  1,  1,  1,  1,
+  1,  0,  0,  1,  1,  0,  1,  1,  0,  0,
+  1,  1,  1,  0,  1,  1,  0,  1,  0,  1,
+  0,  0,  1,  1,  1,  1,  1,  1,  0,  1,
+  0,  1,  1,  1,  1,  0,  1,  1,  1,  0,
+  1,  1,  1,  0,  1,  1,  1,  0,  1,  0,
+  1,  1,  0,  0,  1,  0,  0,  1,  0,  1,
+  0,  1,  1,  0,  1,  0,  1,  0,  1,  1,
+  1,  0,  1,  0,  1,  0,  1,  1,  1,  1,
+  0,  1,  0,  0,  0,  1,  0,  0,  0,  1,
+  1,  0,  0,  0,  1,  0,  0,  1,  0,  1,
+  1,  0,  1,  1,  0,  0,  1,  1,  0,  1,
+  1,  0,  1,  1,  1,  1,  1,  1,  0,  1,
+  1,  1,  1,  0,  1,  0,  0,  0,  1,  0};
+
+Word16 max_dither[MAX_DCT_LENGTH]= {
+  1,  0,  1,  0,  1,  1,  0,  1,  0,  1,
+  1,  1,  0,  0,  0,  0,  0,  1,  1,  1,
+  1,  1,  1,  0,  1,  1,  0,  0,  0,  1,
+  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
+  1,  1,  1,  0,  1,  0,  1,  1,  1,  1,
+  0,  1,  0,  1,  1,  1,  1,  1,  1,  0,
+  1,  0,  1,  1,  0,  1,  0,  0,  0,  1,
+  0,  1,  1,  1,  1,  1,  0,  1,  1,  0,
+  0,  0,  1,  1,  0,  0,  0,  1,  1,  1,
+  1,  0,  1,  1,  1,  1,  1,  0,  0,  0,
+  1,  0,  1,  0,  1,  0,  0,  0,  1,  1,
+  0,  1,  1,  1,  1,  1,  1,  0,  1,  0,
+  0,  0,  1,  0,  1,  0,  0,  0,  1,  0,
+  0,  1,  0,  1,  0,  0,  0,  0,  1,  0,
+  1,  0,  0,  1,  0,  1,  0,  0,  0,  1,
+  0,  1,  0,  0,  1,  1,  1,  1,  0,  1,
+  1,  0,  0,  0,  1,  1,  0,  1,  0,  1,
+  0,  1,  0,  1,  0,  1,  1,  1,  0,  1,
+  1,  0,  0,  1,  1,  1,  1,  0,  1,  1,
+  1,  1,  1,  0,  1,  1,  0,  0,  0,  0,
+  1,  0,  1,  0,  0,  0,  0,  1,  1,  0,
+  1,  1,  0,  0,  0,  0,  1,  0,  0,  1,
+  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,
+  0,  0,  1,  1,  1,  0,  1,  1,  1,  0,
+  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,
+  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,
+  0,  0,  1,  1,  0,  1,  0,  1,  0,  1,
+  0,  0,  1,  1,  1,  1,  1,  1,  0,  1,
+  0,  1,  1,  1,  0,  1,  0,  1,  0,  0,
+  0,  1,  0,  1,  1,  0,  0,  0,  1,  0,
+  1,  1,  0,  0,  1,  1,  1,  1,  0,  0,
+  0,  0,  1,  1,  1,  1,  0,  0,  1,  1,
+  1,  1,  1,  0,  1,  0,  0,  0,  1,  0,
+  0,  1,  1,  1,  0,  1,  0,  1,  0,  0,
+  1,  1,  0,  1,  0,  1,  1,  0,  0,  0,
+  0,  1,  1,  0,  1,  1,  1,  0,  1,  1,
+  0,  0,  1,  1,  1,  1,  1,  1,  0,  1,
+  1,  1,  0,  0,  0,  1,  1,  1,  1,  0,
+  0,  1,  0,  1,  0,  1,  1,  0,  1,  0,
+  1,  1,  1,  0,  0,  1,  1,  0,  0,  1,
+  0,  1,  0,  0,  0,  1,  1,  0,  0,  1,
+  0,  0,  1,  1,  0,  1,  0,  1,  0,  1,
+  1,  1,  0,  1,  0,  0,  1,  1,  0,  0,
+  1,  0,  1,  0,  1,  0,  0,  1,  0,  0,
+  0,  1,  0,  1,  1,  1,  1,  1,  1,  0,
+  0,  1,  1,  0,  0,  0,  1,  1,  1,  0,
+  1,  1,  1,  0,  1,  1,  1,  0,  0,  0,
+  0,  0,  1,  0,  0,  1,  0,  0,  0,  1,
+  0,  0,  0,  1,  1,  0,  0,  1,  0,  1,
+  1,  1,  1,  1,  0,  0,  1,  0,  1,  0,
+  0,  1,  0,  1,  1,  1,  1,  1,  1,  0,
+  0,  0,  1,  0,  1,  0,  0,  1,  0,  1,
+  1,  0,  1,  0,  1,  1,  0,  0,  1,  1,
+  1,  1,  1,  0,  1,  0,  0,  1,  1,  1,
+  0,  1,  0,  1,  0,  1,  0,  0,  0,  1,
+  1,  0,  0,  1,  0,  0,  1,  1,  0,  1,
+  1,  0,  1,  0,  1,  1,  0,  0,  1,  1,
+  0,  0,  0,  1,  0,  1,  1,  1,  0,  0,
+  1,  0,  1,  0,  1,  1,  0,  0,  0,  1,
+  1,  0,  1,  0,  0,  1,  1,  1,  0,  1,
+  0,  0,  1,  1,  1,  1,  1,  0,  0,  0,
+  0,  1,  0,  1,  0,  0,  1,  0,  1,  0,
+  0,  1,  1,  1,  1,  0,  0,  0,  1,  0,
+  0,  1,  0,  1,  0,  1,  0,  0,  0,  0
+};
+
+
+/********************************************************************************
+  The s_cos_min tables were generated by the following code:
+      double		angle, scale;
+      int		    index;
+
+      for (index = 0;index < length;index++) 
+      {
+          angle = scale * ((double)index + 0.5);
+          table[index].cosine     = (short) (FTOI((18427)* cos(angle)));
+          table[index].minus_sine = (short) (FTOI((18427)*(-sin(angle))));
+      }
+
+
+********************************************************************************/
+
+cos_msin_t	s_cos_msin_2[DCT_LENGTH_DIV_32] = {
+    {  18413   ,   -723   } , 
+    {  18299   ,   -2166   } , 
+    {  18073   ,   -3595   } , 
+    {  17735   ,   -5002   } , 
+    {  17288   ,   -6378   } , 
+    {  16734   ,   -7715   } , 
+    {  16077   ,   -9004   } , 
+    {  15321   ,   -10237   } , 
+    {  14471   ,   -11408   } , 
+    {  13531   ,   -12508   } 
+    };
+cos_msin_t	s_cos_msin_4[DCT_LENGTH_DIV_16] = {
+    {  18423   ,   -362   } , 
+    {  18395   ,   -1085   } , 
+    {  18338   ,   -1806   } , 
+    {  18253   ,   -2525   } , 
+    {  18140   ,   -3239   } , 
+    {  17999   ,   -3949   } , 
+    {  17830   ,   -4653   } , 
+    {  17634   ,   -5349   } , 
+    {  17410   ,   -6037   } , 
+    {  17159   ,   -6716   } , 
+    {  16883   ,   -7385   } , 
+    {  16580   ,   -8042   } , 
+    {  16251   ,   -8686   } , 
+    {  15898   ,   -9318   } , 
+    {  15520   ,   -9935   } , 
+    {  15118   ,   -10536   } , 
+    {  14692   ,   -11122   } , 
+    {  14244   ,   -11690   } , 
+    {  13774   ,   -12240   } , 
+    {  13283   ,   -12772   } 
+    };
+cos_msin_t	s_cos_msin_8[DCT_LENGTH_DIV_8] = {
+    {  18426   ,   -181   } , 
+    {  18419   ,   -543   } , 
+    {  18405   ,   -904   } , 
+    {  18384   ,   -1265   } , 
+    {  18355   ,   -1626   } , 
+    {  18320   ,   -1986   } , 
+    {  18277   ,   -2345   } , 
+    {  18228   ,   -2704   } , 
+    {  18171   ,   -3061   } , 
+    {  18107   ,   -3417   } , 
+    {  18037   ,   -3772   } , 
+    {  17959   ,   -4126   } , 
+    {  17875   ,   -4477   } , 
+    {  17783   ,   -4827   } , 
+    {  17685   ,   -5176   } , 
+    {  17580   ,   -5522   } , 
+    {  17468   ,   -5866   } , 
+    {  17350   ,   -6208   } , 
+    {  17225   ,   -6547   } , 
+    {  17093   ,   -6884   } , 
+    {  16954   ,   -7219   } , 
+    {  16809   ,   -7550   } , 
+    {  16658   ,   -7879   } , 
+    {  16500   ,   -8204   } , 
+    {  16336   ,   -8526   } , 
+    {  16165   ,   -8846   } , 
+    {  15988   ,   -9161   } , 
+    {  15805   ,   -9473   } , 
+    {  15616   ,   -9782   } , 
+    {  15421   ,   -10087   } , 
+    {  15220   ,   -10387   } , 
+    {  15013   ,   -10684   } , 
+    {  14801   ,   -10977   } , 
+    {  14582   ,   -11265   } , 
+    {  14358   ,   -11550   } , 
+    {  14129   ,   -11829   } , 
+    {  13894   ,   -12104   } , 
+    {  13654   ,   -12375   } , 
+    {  13408   ,   -12641   } , 
+    {  13157   ,   -12901   } 
+    };
+cos_msin_t	s_cos_msin_16[DCT_LENGTH_DIV_4] = {
+    {  18427   ,   -90   } , 
+    {  18425   ,   -271   } , 
+    {  18421   ,   -452   } , 
+    {  18416   ,   -633   } , 
+    {  18409   ,   -814   } , 
+    {  18400   ,   -995   } , 
+    {  18389   ,   -1175   } , 
+    {  18377   ,   -1356   } , 
+    {  18363   ,   -1536   } , 
+    {  18347   ,   -1716   } , 
+    {  18329   ,   -1896   } , 
+    {  18310   ,   -2076   } , 
+    {  18288   ,   -2256   } , 
+    {  18265   ,   -2435   } , 
+    {  18241   ,   -2614   } , 
+    {  18214   ,   -2793   } , 
+    {  18186   ,   -2972   } , 
+    {  18156   ,   -3150   } , 
+    {  18124   ,   -3328   } , 
+    {  18090   ,   -3506   } , 
+    {  18055   ,   -3684   } , 
+    {  18018   ,   -3861   } , 
+    {  17979   ,   -4037   } , 
+    {  17939   ,   -4214   } , 
+    {  17897   ,   -4390   } , 
+    {  17853   ,   -4565   } , 
+    {  17807   ,   -4740   } , 
+    {  17760   ,   -4915   } , 
+    {  17710   ,   -5089   } , 
+    {  17660   ,   -5262   } , 
+    {  17607   ,   -5436   } , 
+    {  17553   ,   -5608   } , 
+    {  17497   ,   -5780   } , 
+    {  17439   ,   -5952   } , 
+    {  17380   ,   -6123   } , 
+    {  17319   ,   -6293   } , 
+    {  17257   ,   -6463   } , 
+    {  17192   ,   -6632   } , 
+    {  17126   ,   -6800   } , 
+    {  17059   ,   -6968   } , 
+    {  16990   ,   -7135   } , 
+    {  16919   ,   -7302   } , 
+    {  16846   ,   -7467   } , 
+    {  16772   ,   -7632   } , 
+    {  16696   ,   -7797   } , 
+    {  16619   ,   -7960   } , 
+    {  16540   ,   -8123   } , 
+    {  16459   ,   -8285   } , 
+    {  16377   ,   -8446   } , 
+    {  16294   ,   -8607   } , 
+    {  16208   ,   -8766   } , 
+    {  16121   ,   -8925   } , 
+    {  16033   ,   -9083   } , 
+    {  15943   ,   -9240   } , 
+    {  15852   ,   -9396   } , 
+    {  15759   ,   -9551   } , 
+    {  15664   ,   -9705   } , 
+    {  15568   ,   -9858   } , 
+    {  15471   ,   -10011   } , 
+    {  15372   ,   -10162   } , 
+    {  15271   ,   -10313   } , 
+    {  15169   ,   -10462   } , 
+    {  15066   ,   -10610   } , 
+    {  14961   ,   -10758   } , 
+    {  14854   ,   -10904   } , 
+    {  14747   ,   -11049   } , 
+    {  14637   ,   -11194   } , 
+    {  14527   ,   -11337   } , 
+    {  14415   ,   -11479   } , 
+    {  14301   ,   -11620   } , 
+    {  14187   ,   -11760   } , 
+    {  14071   ,   -11898   } , 
+    {  13953   ,   -12036   } , 
+    {  13834   ,   -12172   } , 
+    {  13714   ,   -12308   } , 
+    {  13593   ,   -12442   } , 
+    {  13470   ,   -12575   } , 
+    {  13346   ,   -12706   } , 
+    {  13220   ,   -12837   } , 
+    {  13094   ,   -12966   } 
+    };
+cos_msin_t	s_cos_msin_32[DCT_LENGTH_DIV_2] = {
+    {  18427   ,   -45   } , 
+    {  18427   ,   -136   } , 
+    {  18426   ,   -226   } , 
+    {  18424   ,   -317   } , 
+    {  18423   ,   -407   } , 
+    {  18420   ,   -497   } , 
+    {  18418   ,   -588   } , 
+    {  18415   ,   -678   } , 
+    {  18411   ,   -769   } , 
+    {  18407   ,   -859   } , 
+    {  18403   ,   -949   } , 
+    {  18398   ,   -1040   } , 
+    {  18392   ,   -1130   } , 
+    {  18387   ,   -1220   } , 
+    {  18380   ,   -1310   } , 
+    {  18374   ,   -1401   } , 
+    {  18367   ,   -1491   } , 
+    {  18359   ,   -1581   } , 
+    {  18351   ,   -1671   } , 
+    {  18343   ,   -1761   } , 
+    {  18334   ,   -1851   } , 
+    {  18324   ,   -1941   } , 
+    {  18315   ,   -2031   } , 
+    {  18305   ,   -2121   } , 
+    {  18294   ,   -2211   } , 
+    {  18283   ,   -2301   } , 
+    {  18271   ,   -2390   } , 
+    {  18259   ,   -2480   } , 
+    {  18247   ,   -2570   } , 
+    {  18234   ,   -2659   } , 
+    {  18221   ,   -2749   } , 
+    {  18207   ,   -2838   } , 
+    {  18193   ,   -2927   } , 
+    {  18178   ,   -3017   } , 
+    {  18163   ,   -3106   } , 
+    {  18148   ,   -3195   } , 
+    {  18132   ,   -3284   } , 
+    {  18116   ,   -3373   } , 
+    {  18099   ,   -3462   } , 
+    {  18082   ,   -3551   } , 
+    {  18064   ,   -3639   } , 
+    {  18046   ,   -3728   } , 
+    {  18027   ,   -3816   } , 
+    {  18009   ,   -3905   } , 
+    {  17989   ,   -3993   } , 
+    {  17969   ,   -4081   } , 
+    {  17949   ,   -4170   } , 
+    {  17928   ,   -4258   } , 
+    {  17907   ,   -4346   } , 
+    {  17886   ,   -4434   } , 
+    {  17864   ,   -4521   } , 
+    {  17841   ,   -4609   } , 
+    {  17818   ,   -4696   } , 
+    {  17795   ,   -4784   } , 
+    {  17772   ,   -4871   } , 
+    {  17747   ,   -4958   } , 
+    {  17723   ,   -5045   } , 
+    {  17698   ,   -5132   } , 
+    {  17672   ,   -5219   } , 
+    {  17647   ,   -5306   } , 
+    {  17620   ,   -5392   } , 
+    {  17594   ,   -5479   } , 
+    {  17567   ,   -5565   } , 
+    {  17539   ,   -5651   } , 
+    {  17511   ,   -5737   } , 
+    {  17483   ,   -5823   } , 
+    {  17454   ,   -5909   } , 
+    {  17425   ,   -5994   } , 
+    {  17395   ,   -6080   } , 
+    {  17365   ,   -6165   } , 
+    {  17335   ,   -6250   } , 
+    {  17304   ,   -6335   } , 
+    {  17272   ,   -6420   } , 
+    {  17241   ,   -6505   } , 
+    {  17208   ,   -6590   } , 
+    {  17176   ,   -6674   } , 
+    {  17143   ,   -6758   } , 
+    {  17110   ,   -6842   } , 
+    {  17076   ,   -6926   } , 
+    {  17042   ,   -7010   } , 
+    {  17007   ,   -7093   } , 
+    {  16972   ,   -7177   } , 
+    {  16937   ,   -7260   } , 
+    {  16901   ,   -7343   } , 
+    {  16864   ,   -7426   } , 
+    {  16828   ,   -7509   } , 
+    {  16791   ,   -7591   } , 
+    {  16753   ,   -7674   } , 
+    {  16715   ,   -7756   } , 
+    {  16677   ,   -7838   } , 
+    {  16638   ,   -7919   } , 
+    {  16599   ,   -8001   } , 
+    {  16560   ,   -8082   } , 
+    {  16520   ,   -8164   } , 
+    {  16480   ,   -8245   } , 
+    {  16439   ,   -8325   } , 
+    {  16398   ,   -8406   } , 
+    {  16357   ,   -8486   } , 
+    {  16315   ,   -8567   } , 
+    {  16272   ,   -8647   } , 
+    {  16230   ,   -8726   } , 
+    {  16187   ,   -8806   } , 
+    {  16143   ,   -8885   } , 
+    {  16100   ,   -8964   } , 
+    {  16055   ,   -9043   } , 
+    {  16011   ,   -9122   } , 
+    {  15966   ,   -9200   } , 
+    {  15920   ,   -9279   } , 
+    {  15875   ,   -9357   } , 
+    {  15829   ,   -9435   } , 
+    {  15782   ,   -9512   } , 
+    {  15735   ,   -9589   } , 
+    {  15688   ,   -9667   } , 
+    {  15640   ,   -9744   } , 
+    {  15592   ,   -9820   } , 
+    {  15544   ,   -9897   } , 
+    {  15495   ,   -9973   } , 
+    {  15446   ,   -10049   } , 
+    {  15396   ,   -10124   } , 
+    {  15347   ,   -10200   } , 
+    {  15296   ,   -10275   } , 
+    {  15246   ,   -10350   } , 
+    {  15195   ,   -10425   } , 
+    {  15143   ,   -10499   } , 
+    {  15092   ,   -10573   } , 
+    {  15040   ,   -10647   } , 
+    {  14987   ,   -10721   } , 
+    {  14934   ,   -10794   } , 
+    {  14881   ,   -10868   } , 
+    {  14828   ,   -10941   } , 
+    {  14774   ,   -11013   } , 
+    {  14719   ,   -11086   } , 
+    {  14665   ,   -11158   } , 
+    {  14610   ,   -11230   } , 
+    {  14555   ,   -11301   } , 
+    {  14499   ,   -11372   } , 
+    {  14443   ,   -11444   } , 
+    {  14387   ,   -11514   } , 
+    {  14330   ,   -11585   } , 
+    {  14273   ,   -11655   } , 
+    {  14216   ,   -11725   } , 
+    {  14158   ,   -11795   } , 
+    {  14100   ,   -11864   } , 
+    {  14041   ,   -11933   } , 
+    {  13983   ,   -12002   } , 
+    {  13924   ,   -12070   } , 
+    {  13864   ,   -12138   } , 
+    {  13804   ,   -12206   } , 
+    {  13744   ,   -12274   } , 
+    {  13684   ,   -12341   } , 
+    {  13623   ,   -12408   } , 
+    {  13562   ,   -12475   } , 
+    {  13501   ,   -12541   } , 
+    {  13439   ,   -12608   } , 
+    {  13377   ,   -12673   } , 
+    {  13314   ,   -12739   } , 
+    {  13252   ,   -12804   } , 
+    {  13189   ,   -12869   } , 
+    {  13125   ,   -12934   } , 
+    {  13062   ,   -12998   } 
+    };
+cos_msin_t	s_cos_msin_64[DCT_LENGTH] = {
+{18426,	-21},
+{18426,	-66},
+{18426,	-110},
+{18426,	-154},
+{18425,	-198},
+{18425,	-242},
+{18424,	-286},
+{18424,	-331},
+{18423,	-374},
+{18421,	-419},
+{18421,	-463},
+{18419,	-507},
+{18418,	-552},
+{18417,	-595},
+{18415,	-639},
+{18414,	-684},
+{18412,	-728},
+{18410,	-772},
+{18408,	-816},
+{18406,	-860},
+{18404,	-904},
+{18402,	-949},
+{18400,	-992},
+{18397,	-1037},
+{18394,	-1081},
+{18392,	-1125},
+{18389,	-1169},
+{18387,	-1213},
+{18384,	-1257},
+{18380,	-1301},
+{18378,	-1345},
+{18374,	-1389},
+{18371,	-1433},
+{18367,	-1477},
+{18364,	-1521},
+{18360,	-1566},
+{18356,	-1609},
+{18352,	-1653},
+{18348,	-1697},
+{18344,	-1742},
+{18339,	-1785},
+{18335,	-1829},
+{18331,	-1873},
+{18326,	-1917},
+{18322,	-1961},
+{18317,	-2005},
+{18312,	-2049},
+{18307,	-2092},
+{18302,	-2137},
+{18297,	-2180},
+{18292,	-2224},
+{18286,	-2268},
+{18281,	-2312},
+{18275,	-2356},
+{18270,	-2399},
+{18264,	-2443},
+{18258,	-2487},
+{18252,	-2531},
+{18246,	-2574},
+{18240,	-2618},
+{18233,	-2662},
+{18227,	-2706},
+{18220,	-2749},
+{18214,	-2793},
+{18207,	-2836},
+{18200,	-2880},
+{18193,	-2924},
+{18186,	-2967},
+{18179,	-3011},
+{18172,	-3055},
+{18164,	-3098},
+{18157,	-3142},
+{18149,	-3185},
+{18141,	-3229},
+{18134,	-3272},
+{18126,	-3316},
+{18118,	-3359},
+{18109,	-3403},
+{18101,	-3446},
+{18094,	-3489},
+{18085,	-3533},
+{18076,	-3576},
+{18068,	-3619},
+{18059,	-3663},
+{18050,	-3706},
+{18041,	-3749},
+{18032,	-3792},
+{18023,	-3836},
+{18014,	-3879},
+{18005,	-3922},
+{17995,	-3965},
+{17986,	-4008},
+{17975,	-4051},
+{17966,	-4094},
+{17956,	-4138},
+{17946,	-4180},
+{17936,	-4224},
+{17926,	-4266},
+{17916,	-4309},
+{17905,	-4353},
+{17895,	-4395},
+{17884,	-4438},
+{17874,	-4481},
+{17863,	-4524},
+{17852,	-4567},
+{17841,	-4609},
+{17830,	-4652},
+{17819,	-4695},
+{17807,	-4738},
+{17796,	-4780},
+{17784,	-4823},
+{17772,	-4865},
+{17761,	-4908},
+{17749,	-4951},
+{17738,	-4993},
+{17725,	-5036},
+{17713,	-5078},
+{17701,	-5121},
+{17689,	-5163},
+{17676,	-5205},
+{17664,	-5248},
+{17651,	-5290},
+{17638,	-5333},
+{17626,	-5375},
+{17613,	-5417},
+{17599,	-5459},
+{17586,	-5501},
+{17573,	-5544},
+{17560,	-5586},
+{17546,	-5627},
+{17533,	-5670},
+{17519,	-5712},
+{17505,	-5753},
+{17492,	-5795},
+{17478,	-5837},
+{17464,	-5879},
+{17450,	-5921},
+{17435,	-5963},
+{17421,	-6005},
+{17406,	-6046},
+{17392,	-6088},
+{17377,	-6130},
+{17363,	-6172},
+{17348,	-6213},
+{17333,	-6254},
+{17318,	-6296},
+{17303,	-6338},
+{17288,	-6379},
+{17272,	-6420},
+{17257,	-6462},
+{17241,	-6503},
+{17225,	-6545},
+{17210,	-6586},
+{17194,	-6627},
+{17178,	-6668},
+{17162,	-6709},
+{17145,	-6750},
+{17130,	-6791},
+{17113,	-6832},
+{17097,	-6874},
+{17080,	-6915},
+{17064,	-6956},
+{17047,	-6996},
+{17030,	-7037},
+{17013,	-7078},
+{16996,	-7119},
+{16979,	-7159},
+{16962,	-7200},
+{16945,	-7241},
+{16927,	-7281},
+{16910,	-7322},
+{16892,	-7362},
+{16874,	-7403},
+{16856,	-7444},
+{16838,	-7484},
+{16821,	-7524},
+{16802,	-7564},
+{16784,	-7605},
+{16766,	-7645},
+{16748,	-7685},
+{16729,	-7725},
+{16711,	-7765},
+{16692,	-7805},
+{16674,	-7845},
+{16654,	-7885},
+{16635,	-7925},
+{16616,	-7964},
+{16597,	-8004},
+{16578,	-8044},
+{16559,	-8084},
+{16539,	-8124},
+{16520,	-8164},
+{16500,	-8203},
+{16480,	-8242},
+{16461,	-8282},
+{16441,	-8322},
+{16421,	-8361},
+{16401,	-8400},
+{16380,	-8440},
+{16360,	-8479},
+{16340,	-8518},
+{16319,	-8557},
+{16299,	-8597},
+{16278,	-8635},
+{16257,	-8674},
+{16237,	-8713},
+{16215,	-8752},
+{16195,	-8791},
+{16173,	-8829},
+{16152,	-8868},
+{16131,	-8907},
+{16110,	-8946},
+{16088,	-8985},
+{16067,	-9023},
+{16045,	-9061},
+{16023,	-9100},
+{16001,	-9138},
+{15979,	-9176},
+{15957,	-9215},
+{15935,	-9253},
+{15913,	-9291},
+{15891,	-9329},
+{15868,	-9367},
+{15846,	-9405},
+{15823,	-9443},
+{15800,	-9481},
+{15778,	-9519},
+{15755,	-9557},
+{15732,	-9595},
+{15709,	-9632},
+{15686,	-9670},
+{15662,	-9708},
+{15639,	-9745},
+{15615,	-9782},
+{15592,	-9820},
+{15569,	-9857},
+{15544,	-9894},
+{15521,	-9932},
+{15497,	-9969},
+{15473,	-10006},
+{15449,	-10043},
+{15425,	-10080},
+{15401,	-10117},
+{15377,	-10154},
+{15352,	-10191},
+{15327,	-10227},
+{15303,	-10264},
+{15278,	-10301},
+{15254,	-10337},
+{15229,	-10374},
+{15204,	-10411},
+{15180,	-10447},
+{15154,	-10483},
+{15129,	-10519},
+{15104,	-10556},
+{15078,	-10592},
+{15053,	-10628},
+{15027,	-10664},
+{15002,	-10700},
+{14976,	-10736},
+{14950,	-10772},
+{14924,	-10808},
+{14898,	-10844},
+{14872,	-10879},
+{14846,	-10915},
+{14820,	-10950},
+{14794,	-10985},
+{14767,	-11021},
+{14741,	-11056},
+{14714,	-11092},
+{14687,	-11127},
+{14661,	-11162},
+{14635,	-11197},
+{14607,	-11232},
+{14581,	-11267},
+{14554,	-11302},
+{14526,	-11337},
+{14499,	-11372},
+{14472,	-11407},
+{14444,	-11441},
+{14417,	-11476},
+{14389,	-11511},
+{14362,	-11545},
+{14334,	-11579},
+{14306,	-11614},
+{14278,	-11648},
+{14251,	-11682},
+{14222,	-11716},
+{14194,	-11750},
+{14166,	-11784},
+{14137,	-11818},
+{14109,	-11852},
+{14081,	-11886},
+{14053,	-11919},
+{14023,	-11953},
+{13995,	-11987},
+{13966,	-12020},
+{13937,	-12054},
+{13909,	-12087},
+{13879,	-12120},
+{13851,	-12153},
+{13821,	-12187},
+{13792,	-12220},
+{13763,	-12253},
+{13733,	-12286},
+{13704,	-12319},
+{13674,	-12351},
+{13645,	-12385},
+{13615,	-12417},
+{13585,	-12450},
+{13555,	-12482},
+{13525,	-12514},
+{13495,	-12546},
+{13465,	-12579},
+{13435,	-12611},
+{13405,	-12644},
+{13374,	-12676},
+{13345,	-12708},
+{13314,	-12739},
+{13283,	-12772}
+};
+
+
+
+cos_msin_t	*s_cos_msin_table[] = {s_cos_msin_2,  s_cos_msin_4,
+                                   s_cos_msin_8,  s_cos_msin_16,
+                                   s_cos_msin_32, s_cos_msin_64
+                                  };
+
diff --git a/third_party/g7221/decode/decoder.c b/third_party/g7221/decode/decoder.c
new file mode 100644
index 0000000..c6b8c06
--- /dev/null
+++ b/third_party/g7221/decode/decoder.c
@@ -0,0 +1,1112 @@
+/***************************************************************************
+**
+**   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.
+**
+***************************************************************************/
+
+/***************************************************************************
+  Filename:    decoder.c    
+
+  Purpose:     Contains files used to implement the G.722.1 Annex C decoder
+		
+  Design Notes:
+
+***************************************************************************/
+
+/***************************************************************************
+ Include files                                                           
+***************************************************************************/
+#include "defs.h"
+#include "tables.h"
+#include "huff_def.h"
+#include "count.h"
+
+
+/***************************************************************************
+ Function:    decoder
+
+ Syntax:      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)      
+              
+              inputs:    Bit_Obj *bitobj
+                         Rand_Obj *randobj
+                         Word16 number_of_regions
+                         Word16 *p_old_mag_shift
+                         Word16 *old_decoder_mlt_coefs
+                         Word16 frame_error_flag
+              
+              outputs:   Word16 *decoder_mlt_coefs,    
+                         Word16 *p_mag_shift,          
+                  
+                  
+
+ Description: Decodes the out_words into mlt coefs using G.722.1 Annex C
+
+ Design Notes:
+ 
+ WMOPS:     7kHz |   24kbit    |    32kbit
+          -------|-------------|----------------
+            AVG  |    0.84     |    0.94
+          -------|-------------|----------------  
+            MAX  |    0.90     |    1.00
+          -------|-------------|---------------- 
+				
+           14kHz |   24kbit    |    32kbit      |     48kbit
+          -------|-------------|----------------|----------------
+            AVG  |    1.31     |    1.56        |     1.88   
+          -------|-------------|----------------|----------------
+            MAX  |    1.59     |    1.80        |     1.98   
+          -------|-------------|----------------|----------------
+				
+***************************************************************************/
+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  absolute_region_power_index[MAX_NUMBER_OF_REGIONS];
+    Word16  decoder_power_categories[MAX_NUMBER_OF_REGIONS];
+    Word16  decoder_category_balances[MAX_NUM_CATEGORIZATION_CONTROL_POSSIBILITIES-1];
+    UWord16 categorization_control;
+    Word16  decoder_region_standard_deviation[MAX_NUMBER_OF_REGIONS];
+    Word16  i;
+
+    Word16  num_categorization_control_bits;
+    Word16  num_categorization_control_possibilities;
+    Word16  number_of_coefs;
+    Word16  number_of_valid_coefs;
+    
+    
+    test();
+    if (number_of_regions==NUMBER_OF_REGIONS)
+    {
+        num_categorization_control_bits = NUM_CATEGORIZATION_CONTROL_BITS;
+        move16();
+        num_categorization_control_possibilities = NUM_CATEGORIZATION_CONTROL_POSSIBILITIES;
+        move16();
+        number_of_coefs = DCT_LENGTH;
+        move16();
+        number_of_valid_coefs = NUMBER_OF_VALID_COEFS;
+        move16();
+    }
+    else
+    {
+        num_categorization_control_bits = MAX_NUM_CATEGORIZATION_CONTROL_BITS;
+        move16();
+        num_categorization_control_possibilities = MAX_NUM_CATEGORIZATION_CONTROL_POSSIBILITIES;
+        move16();
+        number_of_coefs = MAX_DCT_LENGTH;
+        move16();
+        number_of_valid_coefs = MAX_NUMBER_OF_VALID_COEFS;
+        move16();
+    }
+
+    test();
+    if (frame_error_flag == 0) 
+    {
+
+        /* convert the bits to absolute region power index and decoder_region_standard_deviation */
+        
+        decode_envelope(bitobj,
+                        number_of_regions,
+                        decoder_region_standard_deviation,
+		                absolute_region_power_index,
+		                p_mag_shift);
+
+        /* fill the categorization_control with NUM_CATEGORIZATION_CONTROL_BITS */
+        categorization_control = 0;
+        for (i=0; i<num_categorization_control_bits; i++) 
+        {
+        	get_next_bit(bitobj);
+        	categorization_control = shl(categorization_control,1);
+        	categorization_control = add(categorization_control,bitobj->next_bit);
+        }
+        
+        bitobj->number_of_bits_left = sub(bitobj->number_of_bits_left,num_categorization_control_bits);
+
+        /* obtain decoder power categories and category balances */
+        /* based on the absolute region power index              */
+        categorize(bitobj->number_of_bits_left,
+	               number_of_regions,
+	               num_categorization_control_possibilities,
+	               absolute_region_power_index,
+	               decoder_power_categories,
+	               decoder_category_balances);
+
+        /* perform adjustmaents to the power categories and category balances based on the cat control */
+        rate_adjust_categories(categorization_control,
+			                   decoder_power_categories,
+			                   decoder_category_balances);
+
+        /* decode the quantized bits into mlt coefs */
+        decode_vector_quantized_mlt_indices(bitobj,
+                                            randobj,
+                                            number_of_regions,
+                                            decoder_region_standard_deviation,
+					                        decoder_power_categories,
+					                        decoder_mlt_coefs);
+
+        /* test for frame errors */
+        test_4_frame_errors(bitobj,
+                            number_of_regions,
+                            num_categorization_control_possibilities,
+                            &frame_error_flag,
+                            categorization_control,
+                            absolute_region_power_index);
+    }
+
+    /* perform error handling operations */
+    error_handling(number_of_coefs,
+                   number_of_valid_coefs,
+                   &frame_error_flag,
+                   decoder_mlt_coefs,
+                   old_decoder_mlt_coefs,
+                   p_mag_shift,
+                   p_old_mag_shift);
+
+}
+
+/***************************************************************************
+ Function:    decode_envelope
+
+ Syntax:      void decode_envelope(Bit_Obj *bitobj,                              
+                                   Word16  number_of_regions,
+                                   Word16  *decoder_region_standard_deviation,   
+                                   Word16  *absolute_region_power_index,         
+                                   Word16  *p_mag_shift)                         
+              
+              inputs:   Bit_Obj *bitobj
+                        Word16  number_of_regions
+                        
+                        
+              outputs:  Word16  *decoder_region_standard_deviation
+                        Word16  *absolute_region_power_index
+                        Word16  *p_mag_shift
+              
+ 
+ Description: Recover differential_region_power_index from code bits
+
+ Design Notes:
+ 
+ WMOPS:     7kHz |    24kbit    |    32kbit
+          -------|--------------|----------------
+            AVG  |     0.04     |    0.04
+          -------|--------------|----------------  
+            MAX  |     0.05     |    0.05
+          -------|--------------|---------------- 
+				
+           14kHz |    24kbit    |    32kbit      |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |     0.08     |    0.08        |     0.08   
+          -------|--------------|----------------|----------------
+            MAX  |     0.10     |    0.10        |     0.10   
+          -------|--------------|----------------|----------------
+				
+***************************************************************************/
+void decode_envelope(Bit_Obj *bitobj,
+                     Word16  number_of_regions,
+                     Word16  *decoder_region_standard_deviation,
+		             Word16  *absolute_region_power_index,
+		             Word16  *p_mag_shift)
+     
+{
+    Word16 region;
+    Word16 i;
+    Word16 index;
+    Word16 differential_region_power_index[MAX_NUMBER_OF_REGIONS];
+    Word16 max_index;
+    
+    Word16 temp;
+    Word16 temp1;
+    Word16 temp2;
+    Word32 acca;
+
+    index = 0;
+    move16();
+
+    /* get 5 bits from the current code word */
+    for (i=0; i<5; i++) 
+    {
+        get_next_bit(bitobj);
+        index = shl(index,1);
+        index = add(index,bitobj->next_bit);
+    }
+    bitobj->number_of_bits_left = sub(bitobj->number_of_bits_left,5);
+
+    /* ESF_ADJUSTMENT_TO_RMS_INDEX compensates for the current (9/30/96)
+        IMLT being scaled to high by the ninth power of sqrt(2). */
+    differential_region_power_index[0] = sub(index,ESF_ADJUSTMENT_TO_RMS_INDEX);
+    move16();
+
+    /* obtain differential_region_power_index */
+    for (region=1; region<number_of_regions; region++) 
+    {
+        index = 0;
+        move16();
+        do 
+        {
+            get_next_bit(bitobj);
+            test();
+            if (bitobj->next_bit == 0)
+            {
+	            index = differential_region_power_decoder_tree[region][index][0];
+                move16();
+            }
+            else
+            {
+	            index = differential_region_power_decoder_tree[region][index][1];
+                move16();
+            }
+            bitobj->number_of_bits_left = sub(bitobj->number_of_bits_left,1);
+            test();
+        } while (index > 0);
+        
+        differential_region_power_index[region] = negate(index);
+        move16();
+    }
+
+    /* Reconstruct absolute_region_power_index[] from differential_region_power_index[]. */
+    absolute_region_power_index[0] = differential_region_power_index[0];
+    move16();
+    for (region=1; region<number_of_regions; region++) 
+    {
+        acca = L_add(absolute_region_power_index[region-1],differential_region_power_index[region]);
+        acca = L_add(acca,DRP_DIFF_MIN);
+        absolute_region_power_index[region] = extract_l(acca);        
+    }
+
+    /* Reconstruct decoder_region_standard_deviation[] from absolute_region_power_index[]. */
+    /* DEBUG!!!! - This integer method jointly computes the mag_shift
+       and the standard deviations already mag_shift compensated. It
+       relies on REGION_POWER_STEPSIZE_DB being exactly 3.010299957 db
+       or a square root of 2 chnage in standard deviation. If
+       REGION_POWER_STEPSIZE_DB changes, this software must be
+       reworked. */
+
+    temp = 0;
+    move16();
+    max_index = 0;
+    move16();
+    for (region=0; region<number_of_regions; region++) 
+    {
+        acca = L_add(absolute_region_power_index[region],REGION_POWER_TABLE_NUM_NEGATIVES);
+        i = extract_l(acca);
+        
+        temp1 = sub(i,max_index);
+        test();
+        if (temp1 > 0) 
+        {
+            max_index = i;
+            move16();
+        }
+        temp = add(temp,int_region_standard_deviation_table[i]);
+    }
+    i = 9;
+    move16();
+
+    temp1 = sub(temp,8);
+    temp2 = sub(max_index,28);
+    test();
+    test();
+    logic16();
+    test();
+    logic16();
+    while ((i >= 0) && ((temp1 >= 0) || (temp2 > 0))) 
+    {
+        i = sub(i,1);
+        temp = shr(temp,1);
+        max_index = sub(max_index,2);
+        temp1 = sub(temp,8);
+        temp2 = sub(max_index,28);
+        test();
+        test();
+        logic16();
+        test();
+        logic16();
+    }
+    
+    *p_mag_shift = i;
+    move16();
+    
+    /* pointer arithmetic */
+    temp = (Word16 )(REGION_POWER_TABLE_NUM_NEGATIVES + (*p_mag_shift * 2));
+    
+    for (region=0; region<number_of_regions; region++) 
+    {
+        acca = L_add(absolute_region_power_index[region],temp);
+        i = extract_l(acca);
+        decoder_region_standard_deviation[region] = int_region_standard_deviation_table[i];
+        move16();
+    }
+
+}
+
+/***************************************************************************
+ Function:     rate_adjust_categories
+
+ Syntax:       void rate_adjust_categories(Word16 categorization_control,            
+                                           Word16 *decoder_power_categories,         
+                                           Word16 *decoder_category_balances)        
+               
+               inputs:    Word16 categorization_control,   
+                          Word16 *decoder_power_categories,
+                          Word16 *decoder_category_balances
+                          
+               outputs:   Word16 categorization_control,   
+                          Word16 *decoder_power_categories,
+ 
+ Description:  Adjust the power categories based on the categorization control
+
+ Design Notes:
+ 
+ WMOPS:     7kHz |    24kbit    |    32kbit
+          -------|--------------|----------------
+            AVG  |    0.00      |    0.00
+          -------|--------------|----------------  
+            MAX  |    0.00      |    0.00
+          -------|--------------|---------------- 
+				
+           14kHz |    24kbit    |    32kbit      |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.00      |    0.00        |     0.00   
+          -------|--------------|----------------|----------------
+            MAX  |    0.01      |    0.01        |     0.01   
+          -------|--------------|----------------|----------------
+				
+***************************************************************************/
+void rate_adjust_categories(Word16 categorization_control,
+			                Word16 *decoder_power_categories,
+			                Word16 *decoder_category_balances)
+{
+    Word16 i;
+    Word16 region;
+    
+    i = 0;
+    move16();
+
+    test();
+    while (categorization_control > 0) 
+    {
+        region = decoder_category_balances[i++];
+        move16();
+        decoder_power_categories[region] = add(decoder_power_categories[region],1);
+        move16();
+        categorization_control = sub(categorization_control,1);
+    }
+
+}
+
+/***************************************************************************
+ Function:    decode_vector_quantized_mlt_indices
+
+ Syntax:      void decode_vector_quantized_mlt_indices(Bit_Obj  *bitobj,                                      
+                                                       Rand_Obj *randobj,                           
+                                                       Word16   number_of_regions,
+                                                       Word16   *decoder_region_standard_deviation, 
+                                                       Word16   *decoder_power_categories,          
+                                                       Word16   *decoder_mlt_coefs)                 
+              inputs:    Bit_Obj  *bitobj                           
+                         Rand_Obj *randobj
+                         Word16   number_of_regions
+                         Word16   *decoder_region_standard_deviation
+                         Word16   *decoder_power_categories
+            
+            
+              outputs:   Word16   *decoder_mlt_coefs
+             
+
+ Description: Decode MLT coefficients
+
+ Design Notes:
+ 
+ WMOPS:     7kHz |    24kbit    |    32kbit
+          -------|--------------|----------------
+            AVG  |    0.60      |    0.72
+          -------|--------------|----------------  
+            MAX  |    0.67      |    0.76
+          -------|--------------|---------------- 
+				
+           14kHz |    24kbit    |    32kbit      |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.77      |    0.98        |     1.28   
+          -------|--------------|----------------|----------------
+            MAX  |    1.05      |    1.18        |     1.36   
+          -------|--------------|----------------|----------------
+				
+***************************************************************************/
+void decode_vector_quantized_mlt_indices(Bit_Obj  *bitobj,
+                                         Rand_Obj *randobj,
+                                         Word16   number_of_regions,
+                                         Word16   *decoder_region_standard_deviation,
+					                     Word16   *decoder_power_categories,
+					                     Word16   *decoder_mlt_coefs)
+{
+    Word16 standard_deviation;
+    Word16 *decoder_mlt_ptr;
+    Word16 decoder_mlt_value;
+    Word16 noifillpos;
+    Word16 noifillneg;
+    Word16 noise_fill_factor[3] = {5793,8192,23170};
+    Word16 region;
+    Word16 category;
+    Word16 j,n;
+    Word16 k[MAX_VECTOR_DIMENSION];
+    Word16 vec_dim;
+    Word16 num_vecs;
+    Word16 index;
+    Word16 signs_index;
+    Word16 bit;
+    Word16 num_sign_bits;
+    Word16 ran_out_of_bits_flag;
+    Word16 *decoder_table_ptr;
+    Word16 random_word;
+    
+    Word16 temp1;
+    Word16 temp;
+    Word32 acca;
+
+    ran_out_of_bits_flag = 0;
+    move16();
+
+    for (region=0; region<number_of_regions; region++) 
+    {
+        category = (Word16)decoder_power_categories[region];
+        move16();
+        acca = L_mult0(region,REGION_SIZE);
+        index = extract_l(acca);
+        decoder_mlt_ptr = &decoder_mlt_coefs[index];
+        move16();
+        standard_deviation = decoder_region_standard_deviation[region];
+        move16();
+        
+        temp = sub(category,7);
+        test();
+        if (temp < 0)
+        {
+            /* Get the proper table of decoder tables, vec_dim, and num_vecs for the cat */
+            decoder_table_ptr = (Word16 *) table_of_decoder_tables[category];
+            move16();
+            vec_dim = vector_dimension[category];
+            move16();
+            num_vecs = number_of_vectors[category];
+            move16();
+            
+            for (n=0; n<num_vecs; n++) 
+            {
+                index = 0;
+                move16();
+                
+                /* get index */
+                do 
+                {
+                    test();
+                    if (bitobj->number_of_bits_left <= 0) 
+                    {
+                        ran_out_of_bits_flag = 1;
+                        move16();
+    	                break;
+    	            }
+    
+    	            get_next_bit(bitobj);
+	                
+                    test();
+                    if (bitobj->next_bit == 0)
+	                {
+                        temp = shl(index,1);
+                        index = (Word16)*(decoder_table_ptr + temp);
+                        move16();
+                    }
+	                else
+	                {
+                        temp = shl(index,1);
+                        index = (Word16)*(decoder_table_ptr + temp + 1);
+                        move16();
+                    }
+	                bitobj->number_of_bits_left = sub(bitobj->number_of_bits_left,1);
+                    test();
+	            
+                } while (index > 0);
+	  
+                test();
+                if (ran_out_of_bits_flag != 0)
+	                break;
+	  
+                index = negate(index);
+	            
+                /* convert index into array used to access the centroid table */
+                /* get the number of sign bits in the index */
+                num_sign_bits = index_to_array(index,k,category);
+
+	            temp = sub(bitobj->number_of_bits_left,num_sign_bits);
+                test();
+                if (temp >= 0) 
+                {
+	                test();
+                    if (num_sign_bits != 0) 
+                    {
+	                    signs_index = 0;
+	                    move16();
+                        for (j=0; j<num_sign_bits; j++) 
+                        {
+		                    get_next_bit(bitobj);
+       		                signs_index = shl(signs_index,1);
+		                    signs_index = add(signs_index,bitobj->next_bit);
+		                    bitobj->number_of_bits_left = sub(bitobj->number_of_bits_left,1);
+	                    }
+	                    temp = sub(num_sign_bits,1);
+                        bit = shl(1,(temp));
+	                }
+	                
+                    for (j=0; j<vec_dim; j++) 
+                    {
+	                    acca = L_mult0(standard_deviation,mlt_quant_centroid[category][k[j]]);
+                        acca = L_shr(acca,12);
+                        decoder_mlt_value = extract_l(acca);
+	                    
+                        test();
+                        if (decoder_mlt_value != 0) 
+                        {
+		                    test();
+                            if ((signs_index & bit) == 0)
+		                        decoder_mlt_value = negate(decoder_mlt_value);
+		                    bit = shr(bit,1);
+	                    }
+                        *decoder_mlt_ptr++ = decoder_mlt_value;
+                        move16();
+	                }
+	            }
+	            else 
+                {
+	                ran_out_of_bits_flag = 1;
+                    move16();
+	                break;
+	            }
+	        }
+            /* If ran out of bits during decoding do noise fill for remaining regions. */
+            /* DEBUG!! - For now also redo all of last region with all noise fill. */
+        	test();
+            if (ran_out_of_bits_flag != 0) 
+            {
+        	    temp = add(region,1);
+                for (j=temp; j<number_of_regions; j++)
+                {
+                    decoder_power_categories[j] = 7;
+                    move16();
+                }
+        	    category = 7;
+                move16();
+        	    decoder_mlt_ptr = &decoder_mlt_coefs[region*REGION_SIZE];
+                move16();
+        	}
+        }
+
+        temp = sub(category,5);
+        temp1 = sub(category,6);
+        test();
+        test();
+        logic16();
+        if ((temp == 0) || (temp1 == 0))
+        {
+ 
+	        decoder_mlt_ptr = &decoder_mlt_coefs[region*REGION_SIZE];
+	        move16();
+            noifillpos = mult(standard_deviation,noise_fill_factor[category - 5]);
+            noifillneg = negate(noifillpos);
+
+	        random_word = get_rand(randobj);
+
+	        for (j=0; j<10; j++) 
+            {
+	            test();
+                if (*decoder_mlt_ptr == 0) 
+                {
+	                logic16();
+                    test();
+                    if ((random_word & 1) == 0) 
+                    {
+                        temp1 = noifillneg;
+                        move16();
+                    }
+	                else
+                    {
+                        temp1 = noifillpos;
+                        move16();
+                    }
+	                *decoder_mlt_ptr = temp1;
+                    move16();
+	                random_word = shr(random_word,1);
+	            }
+	            /* pointer arithmetic */
+                decoder_mlt_ptr++;
+	        }
+	        random_word = get_rand(randobj);
+	        for (j=0; j<10; j++) 
+            {
+	            test();
+                if (*decoder_mlt_ptr == 0) 
+                {
+	                logic16();
+                    test();
+                    if ((random_word & 1) == 0) 
+                    {
+                        temp1 = noifillneg;
+                        move16();
+                    }
+	                else
+                    {
+                        temp1 = noifillpos;
+                        move16();
+                    }
+	                *decoder_mlt_ptr = temp1;
+                    move16();
+	                random_word  = shr(random_word,1);
+	            }
+	            /* pointer arithmetic */
+                decoder_mlt_ptr++;
+	        }
+        }
+
+        /* if (category == 7) */
+        temp1 = sub(category,7);
+        test();
+        if (temp1 == 0)
+        {
+	        index = sub(category,5);
+            noifillpos = mult(standard_deviation,noise_fill_factor[index]);
+	        noifillneg = negate(noifillpos);
+
+            random_word = get_rand(randobj);
+            for (j=0; j<10; j++) 
+            {
+                logic16();
+                test();
+                if ((random_word & 1) == 0) 
+                {
+                    temp1 = noifillneg;
+                    move16();
+                }
+                else
+                {
+                    temp1 = noifillpos;
+                    move16();
+                }
+                *decoder_mlt_ptr++ = temp1;
+                move16();
+                random_word = shr(random_word,1);
+            }
+            random_word = get_rand(randobj);
+            for (j=0; j<10; j++) 
+            {
+                logic16();
+                test();
+                if ((random_word & 1) == 0) 
+                {
+                    temp1 = noifillneg;
+                    move16();
+                }
+                else
+                {
+                    temp1 = noifillpos;
+                    move16();
+                }
+                
+                *decoder_mlt_ptr++ = temp1;
+                move16();
+                random_word = shr(random_word,1);
+            }
+        }
+    }
+
+    test();
+    if (ran_out_of_bits_flag)
+        bitobj->number_of_bits_left = sub(bitobj->number_of_bits_left,1);
+}
+/****************************************************************************************
+ Function:    index_to_array 
+
+ Syntax:      number_of_non_zero = index_to_array(Word16 index, 
+                                                  Word16 array[MAX_VECTOR_DIMENSION],
+                                                  Word16 category)
+
+                inputs:  Word16 index
+                         Word16 category                     
+                       
+                outputs: Word16 array[MAX_VECTOR_DIMENSION] - used in decoder to access
+                                                             mlt_quant_centroid table
+                        
+                         Word16 number_of_non_zero          - number of non zero elements
+                                                             in the array
+ 
+ Description: Computes an array of sign bits with the length of the category vector
+              Returns the number of sign bits and the array
+
+ WMOPS:     7kHz |    24kbit    |    32kbit
+          -------|--------------|----------------
+            AVG  |     0.00     |     0.00
+          -------|--------------|----------------  
+            MAX  |     0.00     |     0.00
+          -------|--------------|---------------- 
+
+           14kHz |    24kbit    |    32kbit      |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |     0.00     |     0.00       |      0.00   
+          -------|--------------|----------------|----------------
+            MAX  |     0.00     |     0.00       |      0.00   
+          -------|--------------|----------------|----------------
+
+****************************************************************************************/
+Word16 index_to_array(Word16 index,Word16 *array,Word16 category)
+{
+    Word16 j,q,p;
+    Word16 number_of_non_zero;
+    Word16 max_bin_plus_one;
+    Word16 inverse_of_max_bin_plus_one;
+    Word16 temp;
+
+    number_of_non_zero = 0;
+    move16();
+
+    p = index;
+    move16();
+
+    max_bin_plus_one = add(max_bin[category],1);
+    inverse_of_max_bin_plus_one = max_bin_plus_one_inverse[category];
+    move16();
+
+    temp = sub(vector_dimension[category],1);
+    for (j=temp; j>=0; j--) 
+    {
+        q = mult(p,inverse_of_max_bin_plus_one);
+		temp = extract_l(L_mult0(q,max_bin_plus_one));
+        array[j] = sub(p,temp);
+        move16();
+
+        p = q;
+        move16();
+
+        temp = array[j];
+        move16();
+        test();
+        if (temp != 0) 
+            number_of_non_zero = add(number_of_non_zero,1);
+    }
+    return(number_of_non_zero);
+}
+/***************************************************************************
+ Function:     test_4_frame_errors
+
+ Syntax:       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)    
+        
+               inputs:   bit_obj
+                         number_of_regions
+                         num_categorization_control_possibilities
+                         frame_error_flag
+                         categorization_control
+                         absolute_region_power_index
+               
+               
+               outputs:  frame_error_flag
+               
+               
+               
+        
+ Description:  Tests for error conditions and sets the frame_error_flag accordingly 
+
+ Design Notes:
+ 
+ WMOPS:     7kHz |    24kbit    |    32kbit
+          -------|--------------|----------------
+            AVG  |    0.01      |     0.01
+          -------|--------------|----------------  
+            MAX  |    0.04      |     0.08
+          -------|--------------|---------------- 
+				
+           14kHz |    24kbit    |    32kbit      |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.01      |     0.01       |      0.01   
+          -------|--------------|----------------|----------------
+            MAX  |    0.02      |     0.06       |      0.08   
+          -------|--------------|----------------|----------------
+				
+***************************************************************************/
+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)
+{
+    Word16 region;
+    Word16 i;
+    Word16 temp;
+    Word32 acca;
+    Word32 accb;
+    
+    /* Test for bit stream errors. */
+
+    test();
+    if (bitobj->number_of_bits_left > 0) 
+    {
+        for (i=0; i<bitobj->number_of_bits_left; i++) 
+        {
+            get_next_bit(bitobj);
+            test();
+            if (bitobj->next_bit == 0) 
+            {
+                *frame_error_flag = 1;
+                move16();
+            }
+        }	
+    }
+    else 
+    {
+        temp = sub(categorization_control,sub(num_categorization_control_possibilities,1));
+        test();
+        if (temp < 0) 
+        {
+            test();
+            if (bitobj->number_of_bits_left < 0)
+            {
+                *frame_error_flag |= 2;
+                logic16();
+            }
+        }
+    }
+
+    /* checks to ensure that abs_region_power_index is within range */
+    /* the error flag is set if it is out of range */
+    for (region=0; region<number_of_regions; region++) 
+    {
+        /*  the next two lines of comments were modified in release 1.2
+	   *  to correct the description of the range of 
+	   *  absolute_region_power_index[] to be tested in the next
+	   *  9 lines of code.
+	   */
+	  /*  if ((absolute_region_power_index[region] > 31) ||
+            (absolute_region_power_index[region] < -8) */
+
+        acca = L_add(absolute_region_power_index[region],ESF_ADJUSTMENT_TO_RMS_INDEX);
+        accb = L_sub(acca,31);
+        acca = L_add(acca,8);
+        test();
+
+        /* the next line was modifed in release 1.2 to
+	   * correct miss typed code and error checking.
+	   */
+        if ((accb > 0) || (acca < 0))
+        {
+            *frame_error_flag |= 4;
+            logic16();
+        }
+    }
+
+}
+/***************************************************************************
+ Function:    error_handling
+
+ Syntax:      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)      
+              
+              inputs:  number_of_coefs
+                       number_of_valid_coefs
+                       frame_error_flag
+                       old_decoder_mlt_coefs
+                       p_old_mag_shift
+              
+              
+              outputs: decoder_mlt_coefs
+                       old_decoder_mlt_coefs
+                       p_mag_shift
+                       p_old_mag_shift
+ 
+       
+
+ Description: If both the current and previous frames are errored,             
+              set the mlt coefficients to 0. If only the current frame         
+              is errored, then repeat the previous frame's mlt coefficients.   
+    
+ Design Notes:
+ 
+ WMOPS:     7kHz |    24kbit    |    32kbit
+          -------|--------------|----------------
+            AVG  |    0.02      |     0.02
+          -------|--------------|----------------  
+            MAX  |    0.03      |     0.03
+          -------|--------------|---------------- 
+				
+           14kHz |    24kbit    |    32kbit      |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.03      |     0.03       |     0.03   
+          -------|--------------|----------------|----------------
+            MAX  |    0.03      |     0.03       |     0.06   
+          -------|--------------|----------------|----------------
+				
+***************************************************************************/
+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)
+{
+    Word16 i;
+
+    test();
+    if (*frame_error_flag != 0) 
+    {
+
+        for (i = 0; i < number_of_valid_coefs; i++)
+        {
+            decoder_mlt_coefs[i] = old_decoder_mlt_coefs[i];
+            move16();
+        }
+
+        for (i = 0; i < number_of_valid_coefs; i++)
+        {
+            old_decoder_mlt_coefs[i] = 0;
+            move16();
+        }
+        
+        *p_mag_shift = *p_old_mag_shift;
+        move16();
+
+        *p_old_mag_shift = 0;
+        move16();
+    }
+    else 
+    {
+        /* Store in case next frame is errored. */
+        for (i = 0; i < number_of_valid_coefs; i++)
+        {
+            old_decoder_mlt_coefs[i] = decoder_mlt_coefs[i];
+            move16();
+        }
+  
+        *p_old_mag_shift = *p_mag_shift;
+        move16();
+    }
+
+
+    /* Zero out the upper 1/8 of the spectrum. */
+    for (i = number_of_valid_coefs; i < number_of_coefs; i++)
+    {
+        decoder_mlt_coefs[i] = 0;
+        move16();
+    }
+
+}
+/****************************************************************************************
+ Function:    get_next_bit
+
+ Syntax:      void get_next_bit(Bit_Obj *bitobj)
+ 
+ Description: Returns the next bit in the current word inside the bit object
+ 
+ WMOPS:     7kHz |    24kbit    |    32kbit
+          -------|--------------|----------------
+            AVG  |    0.00      |    0.00
+          -------|--------------|----------------  
+            MAX  |    0.00      |    0.00
+          -------|--------------|---------------- 
+
+           14kHz |    24kbit    |    32kbit      |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.00      |    0.00        |     0.00   
+          -------|--------------|----------------|----------------
+            MAX  |    0.00      |    0.00        |     0.00   
+          -------|--------------|----------------|----------------
+
+****************************************************************************************/
+void get_next_bit(Bit_Obj *bitobj)
+{
+    Word16 temp;
+
+    test();
+    if (bitobj->code_bit_count == 0)
+    {                        
+        bitobj->current_word = *bitobj->code_word_ptr++; 
+        move16();
+        bitobj->code_bit_count = 16;           
+        move16();
+    }
+    bitobj->code_bit_count = sub(bitobj->code_bit_count,1);
+    temp = shr(bitobj->current_word,bitobj->code_bit_count);
+    logic16();
+    bitobj->next_bit = (Word16 )(temp & 1);
+
+}
+/****************************************************************************************
+ Function:    get_rand
+
+ Syntax:      Word16 get_rand(Rand_Obj *randobj)
+ 
+ Description: Returns a random Word16 based on the seeds inside the rand object  
+ 
+ WMOPS:     7kHz |    24kbit    |    32kbit
+          -------|--------------|----------------
+            AVG  |    0.00      |    0.00
+          -------|--------------|----------------  
+            MAX  |    0.00      |    0.00
+          -------|--------------|---------------- 
+
+           14kHz |    24kbit    |    32kbit      |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.00      |    0.00        |     0.00   
+          -------|--------------|----------------|----------------
+            MAX  |    0.00      |    0.00        |     0.00   
+          -------|--------------|----------------|----------------
+
+****************************************************************************************/
+Word16 get_rand(Rand_Obj *randobj)
+{
+    Word16 random_word;
+    Word32 acca;
+
+    acca = L_add(randobj->seed0,randobj->seed3); 
+    random_word = extract_l(acca);
+    
+    logic16();
+    test();
+	if ((random_word & 32768L) != 0)
+        random_word = add(random_word,1);
+    
+    randobj->seed3 = randobj->seed2;
+    move16();
+    randobj->seed2 = randobj->seed1;
+    move16();
+    randobj->seed1 = randobj->seed0;
+    move16();
+    randobj->seed0 = random_word;
+    move16();
+
+    return(random_word);
+}
diff --git a/third_party/g7221/encode/dct4_a.c b/third_party/g7221/encode/dct4_a.c
new file mode 100644
index 0000000..24f4f5e
--- /dev/null
+++ b/third_party/g7221/encode/dct4_a.c
@@ -0,0 +1,352 @@
+/*********************************************************************************
+**   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.
+**
+*********************************************************************************/
+
+/*********************************************************************************
+* Filename: dct_type_iv_a.c
+*
+* Purpose:  Discrete Cosine Transform, Type IV used for MLT
+*
+* The basis functions are
+*
+*	 cos(PI*(t+0.5)*(k+0.5)/block_length)
+*
+* for time t and basis function number k.  Due to the symmetry of the expression
+* in t and k, it is clear that the forward and inverse transforms are the same.
+*
+*********************************************************************************/
+
+/*********************************************************************************
+ Include files                                                           
+*********************************************************************************/
+#include "defs.h"
+#include "count.h"
+#include "dct4_a.h"
+
+/*********************************************************************************
+ External variable declarations                                          
+*********************************************************************************/
+extern Word16       anal_bias[DCT_LENGTH];
+extern Word16       dct_core_a[DCT_LENGTH_DIV_32][DCT_LENGTH_DIV_32];
+extern cos_msin_t   a_cos_msin_2 [DCT_LENGTH_DIV_32];
+extern cos_msin_t   a_cos_msin_4 [DCT_LENGTH_DIV_16];
+extern cos_msin_t   a_cos_msin_8 [DCT_LENGTH_DIV_8];
+extern cos_msin_t   a_cos_msin_16[DCT_LENGTH_DIV_4];
+extern cos_msin_t   a_cos_msin_32[DCT_LENGTH_DIV_2];
+extern cos_msin_t   a_cos_msin_64[DCT_LENGTH];
+extern cos_msin_t   *a_cos_msin_table[];
+
+/*********************************************************************************
+ Function:    dct_type_iv_a
+
+ Syntax:      void dct_type_iv_a (input, output, dct_length) 
+                        Word16   input[], output[], dct_length;              
+
+ Description: Discrete Cosine Transform, Type IV used for MLT
+
+ Design Notes:
+                
+ WMOPS:          |    24kbit    |     32kbit
+          -------|--------------|----------------
+            AVG  |    1.14      |     1.14
+          -------|--------------|----------------  
+            MAX  |    1.14      |     1.14
+          -------|--------------|---------------- 
+                
+           14kHz |    24kbit    |     32kbit     |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    2.57      |     2.57       |     2.57
+          -------|--------------|----------------|----------------
+            MAX  |    2.57      |     2.57       |     2.57
+          -------|--------------|----------------|----------------
+
+*********************************************************************************/
+
+void dct_type_iv_a (Word16 *input,Word16 *output,Word16 dct_length)
+{
+    Word16   buffer_a[MAX_DCT_LENGTH], buffer_b[MAX_DCT_LENGTH], buffer_c[MAX_DCT_LENGTH];
+    Word16   *in_ptr, *in_ptr_low, *in_ptr_high, *next_in_base;
+    Word16   *out_ptr_low, *out_ptr_high, *next_out_base;
+    Word16   *out_buffer, *in_buffer, *buffer_swap;
+    Word16   in_val_low, in_val_high;
+    Word16   out_val_low, out_val_high;
+    Word16   in_low_even, in_low_odd;
+    Word16   in_high_even, in_high_odd;
+    Word16   out_low_even, out_low_odd;
+    Word16   out_high_even, out_high_odd;
+    Word16   *pair_ptr;
+    Word16   cos_even, cos_odd, msin_even, msin_odd;
+    Word16   neg_cos_odd;
+    Word16   neg_msin_even;
+    Word32   sum;
+    Word16   set_span, set_count, set_count_log, pairs_left, sets_left;
+    Word16   i,k;
+    Word16   index;
+    cos_msin_t  **table_ptr_ptr, *cos_msin_ptr;
+    
+    Word16   temp;
+    Word32   acca;
+
+    Word16   dct_length_log;
+
+
+    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+    /* Do the sum/difference butterflies, the first part of */
+    /* converting one N-point transform into N/2 two-point  */
+    /* transforms, where N = 1 << DCT_LENGTH_LOG. = 64/128  */
+    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+    test();
+    if (dct_length==DCT_LENGTH)
+    {
+        dct_length_log = DCT_LENGTH_LOG;
+
+        /* Add bias offsets */
+        for (i=0;i<dct_length;i++)
+        {
+            input[i] = add(input[i],anal_bias[i]);
+            move16();
+        }
+    }
+    else
+        dct_length_log = MAX_DCT_LENGTH_LOG;
+
+    index = 0L;
+    move16();
+
+    in_buffer  = input;
+    move16();
+
+    out_buffer = buffer_a;
+    move16();
+
+    temp = sub(dct_length_log,2);
+    for (set_count_log=0;set_count_log<=temp;set_count_log++)
+    {
+
+        /*===========================================================*/
+        /* Initialization for the loop over sets at the current size */
+        /*===========================================================*/
+
+        /*    set_span      = 1 << (DCT_LENGTH_LOG - set_count_log); */
+        set_span = shr(dct_length,set_count_log);
+
+        set_count     = shl(1,set_count_log);
+
+        in_ptr        = in_buffer;
+        move16();
+
+        next_out_base = out_buffer;
+        move16();
+
+        /*=====================================*/
+        /* Loop over all the sets of this size */
+        /*=====================================*/
+
+        for (sets_left=set_count;sets_left>0;sets_left--)
+        {
+
+            /*||||||||||||||||||||||||||||||||||||||||||||*/
+            /* Set up output pointers for the current set */
+            /*||||||||||||||||||||||||||||||||||||||||||||*/
+
+            out_ptr_low    = next_out_base;
+            next_out_base  = next_out_base + set_span;
+            out_ptr_high   = next_out_base;
+
+            /*||||||||||||||||||||||||||||||||||||||||||||||||||*/
+            /* Loop over all the butterflies in the current set */
+            /*||||||||||||||||||||||||||||||||||||||||||||||||||*/
+
+            do 
+            {
+                in_val_low      = *in_ptr++;
+                in_val_high     = *in_ptr++;
+                acca            = L_add(in_val_low,in_val_high);
+                acca            = L_shr(acca,1);
+                out_val_low     = extract_l(acca);
+
+                acca            = L_sub(in_val_low,in_val_high);
+                acca            = L_shr(acca,1);
+                out_val_high    = extract_l(acca);
+
+                *out_ptr_low++  = out_val_low;
+                *--out_ptr_high = out_val_high;
+
+                test();
+            } while (out_ptr_low < out_ptr_high);
+
+        } /* End of loop over sets of the current size */
+
+        /*============================================================*/
+        /* Decide which buffers to use as input and output next time. */
+        /* Except for the first time (when the input buffer is the    */
+        /* subroutine input) we just alternate the local buffers.     */
+        /*============================================================*/
+
+        in_buffer = out_buffer;
+        move16();
+        if (out_buffer == buffer_a)
+            out_buffer = buffer_b;
+        else
+            out_buffer = buffer_a;
+        index = add(index,1);
+
+    } /* End of loop over set sizes */
+
+
+    /*++++++++++++++++++++++++++++++++*/
+    /* Do N/2 two-point transforms,   */
+    /* where N =  1 << DCT_LENGTH_LOG */
+    /*++++++++++++++++++++++++++++++++*/
+
+    pair_ptr = in_buffer;
+    move16();
+
+    buffer_swap = buffer_c;
+    move16();
+
+    temp = sub(dct_length_log,1);
+    temp = shl(1,temp);
+
+    for (pairs_left=temp; pairs_left > 0; pairs_left--)
+    {
+        for ( k=0; k<CORE_SIZE; k++ )
+        {
+            sum=0L;
+            move32();
+            for ( i=0; i<CORE_SIZE; i++ )
+            {
+                sum = L_mac(sum, pair_ptr[i],dct_core_a[i][k]);
+            }
+            buffer_swap[k] = round(sum);
+        }
+        /* address arithmetic */
+        pair_ptr   += CORE_SIZE;
+        buffer_swap += CORE_SIZE;
+    }
+
+    for (i=0;i<dct_length;i++)
+    {
+        in_buffer[i] = buffer_c[i];
+        move16();
+    }
+    
+    table_ptr_ptr = a_cos_msin_table;
+
+    /*++++++++++++++++++++++++++++++*/
+    /* Perform rotation butterflies */
+    /*++++++++++++++++++++++++++++++*/
+    temp = sub(dct_length_log,2);
+    for (set_count_log = temp; set_count_log >= 0;    set_count_log--)
+    {
+        /*===========================================================*/
+        /* Initialization for the loop over sets at the current size */
+        /*===========================================================*/
+        /*    set_span      = 1 << (DCT_LENGTH_LOG - set_count_log); */
+        set_span = shr(dct_length,set_count_log);
+
+        set_count     = shl(1,set_count_log);
+        next_in_base  = in_buffer;
+        move16();
+
+        test();
+        if (set_count_log == 0)
+        {
+            next_out_base = output;
+        }
+        else
+        {
+            next_out_base = out_buffer;
+        }
+
+
+        /*=====================================*/
+        /* Loop over all the sets of this size */
+        /*=====================================*/
+        for (sets_left = set_count; sets_left > 0;sets_left--)
+        {
+            /*|||||||||||||||||||||||||||||||||||||||||*/
+            /* Set up the pointers for the current set */
+            /*|||||||||||||||||||||||||||||||||||||||||*/
+            in_ptr_low     = next_in_base;
+            move16();
+            temp           = shr(set_span,1);
+
+            /* address arithmetic */
+            in_ptr_high    = in_ptr_low + temp;
+            next_in_base  += set_span;
+            out_ptr_low    = next_out_base;
+            next_out_base += set_span;
+            out_ptr_high   = next_out_base;
+            cos_msin_ptr   = *table_ptr_ptr;
+
+            /*||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
+            /* Loop over all the butterfly pairs in the current set */
+            /*||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
+
+            do 
+            {
+                /* address arithmetic */
+                in_low_even     = *in_ptr_low++;
+                in_low_odd      = *in_ptr_low++;
+                in_high_even    = *in_ptr_high++;
+                in_high_odd     = *in_ptr_high++;
+                cos_even        = cos_msin_ptr[0].cosine;
+                move16();
+                msin_even       = cos_msin_ptr[0].minus_sine;
+                move16();
+                cos_odd         = cos_msin_ptr[1].cosine;
+                move16();
+                msin_odd        = cos_msin_ptr[1].minus_sine;
+                move16();
+                cos_msin_ptr   += 2;
+
+                sum = 0L;
+                sum=L_mac(sum,cos_even,in_low_even);
+                neg_msin_even = negate(msin_even);
+                sum=L_mac(sum,neg_msin_even,in_high_even);
+                out_low_even = round(sum);
+
+                sum = 0L;
+                sum=L_mac(sum,msin_even,in_low_even);
+                sum=L_mac(sum,cos_even,in_high_even);
+                out_high_even= round(sum);
+
+                sum = 0L;
+                sum=L_mac(sum,cos_odd,in_low_odd);
+                sum=L_mac(sum,msin_odd,in_high_odd);
+                out_low_odd= round(sum);
+
+                sum = 0L;
+                sum=L_mac(sum,msin_odd,in_low_odd);
+                neg_cos_odd = negate(cos_odd);
+                sum=L_mac(sum,neg_cos_odd,in_high_odd);
+                out_high_odd= round(sum);
+
+                *out_ptr_low++  = out_low_even;
+                *--out_ptr_high = out_high_even;
+                *out_ptr_low++  = out_low_odd;
+                *--out_ptr_high = out_high_odd;
+                test();
+            } while (out_ptr_low < out_ptr_high);
+
+        } /* End of loop over sets of the current size */
+
+        /*=============================================*/
+        /* Swap input and output buffers for next time */
+        /*=============================================*/
+
+        buffer_swap = in_buffer;
+        in_buffer   = out_buffer;
+        out_buffer  = buffer_swap;
+        table_ptr_ptr++;
+    }
+}
+
diff --git a/third_party/g7221/encode/dct4_a.h b/third_party/g7221/encode/dct4_a.h
new file mode 100644
index 0000000..74f3d93
--- /dev/null
+++ b/third_party/g7221/encode/dct4_a.h
@@ -0,0 +1,728 @@
+/****************************************************************************
+**
+**   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.
+**
+****************************************************************************/
+
+/****************************************************************************
+  Filename:    dct4_a.h    
+
+  Purpose:     Contains tables used by dct4_a.c
+		
+  Design Notes:
+
+****************************************************************************/
+
+/***************************************************************************
+ Include files                                                           
+***************************************************************************/
+#include <stdio.h>
+#include <math.h>
+
+typedef struct 
+{
+    Word16	cosine;
+    Word16	minus_sine;
+} cos_msin_t;
+
+cos_msin_t	a_cos_msin_2[10] = {
+    {  29805   ,   -1171   } , 
+    {  29621   ,   -3506   } , 
+    {  29255   ,   -5819   } , 
+    {  28708   ,   -8097   } , 
+    {  27984   ,   -10324   } , 
+    {  27088   ,   -12488   } , 
+    {  26025   ,   -14575   } , 
+    {  24801   ,   -16572   } , 
+    {  23425   ,   -18466   } , 
+    {  21903   ,   -20247   }  
+    }; 
+cos_msin_t	a_cos_msin_4[20] = {
+    {  29822   ,   -586   } , 
+    {  29776   ,   -1756   } , 
+    {  29684   ,   -2924   } , 
+    {  29547   ,   -4087   } , 
+    {  29364   ,   -5244   } , 
+    {  29135   ,   -6392   } , 
+    {  28862   ,   -7531   } , 
+    {  28544   ,   -8659   } , 
+    {  28182   ,   -9773   } , 
+    {  27776   ,   -10871   } , 
+    {  27328   ,   -11954   } , 
+    {  26838   ,   -13017   } , 
+    {  26306   ,   -14061   } , 
+    {  25734   ,   -15083   } , 
+    {  25122   ,   -16081   } , 
+    {  24471   ,   -17055   } , 
+    {  23783   ,   -18003   } , 
+    {  23057   ,   -18923   } , 
+    {  22297   ,   -19813   } , 
+    {  21502   ,   -20673   } 
+    };
+cos_msin_t	a_cos_msin_8[40] = {
+    {  29827   ,   -293   } , 
+    {  29815   ,   -878   } , 
+    {  29792   ,   -1464   } , 
+    {  29758   ,   -2048   } , 
+    {  29712   ,   -2632   } , 
+    {  29654   ,   -3215   } , 
+    {  29586   ,   -3797   } , 
+    {  29505   ,   -4377   } , 
+    {  29414   ,   -4955   } , 
+    {  29311   ,   -5532   } , 
+    {  29196   ,   -6106   } , 
+    {  29071   ,   -6678   } , 
+    {  28934   ,   -7248   } , 
+    {  28786   ,   -7814   } , 
+    {  28627   ,   -8378   } , 
+    {  28457   ,   -8938   } , 
+    {  28276   ,   -9495   } , 
+    {  28084   ,   -10049   } , 
+    {  27882   ,   -10598   } , 
+    {  27668   ,   -11144   } , 
+    {  27444   ,   -11685   } , 
+    {  27209   ,   -12221   } , 
+    {  26964   ,   -12753   } , 
+    {  26709   ,   -13280   } , 
+    {  26443   ,   -13802   } , 
+    {  26167   ,   -14318   } , 
+    {  25881   ,   -14829   } , 
+    {  25584   ,   -15335   } , 
+    {  25278   ,   -15834   } , 
+    {  24963   ,   -16327   } , 
+    {  24637   ,   -16814   } , 
+    {  24302   ,   -17295   } , 
+    {  23958   ,   -17769   } , 
+    {  23605   ,   -18236   } , 
+    {  23242   ,   -18695   } , 
+    {  22871   ,   -19148   } , 
+    {  22490   ,   -19594   } , 
+    {  22101   ,   -20031   } , 
+    {  21704   ,   -20461   } , 
+    {  21298   ,   -20884   } 
+    };
+cos_msin_t	a_cos_msin_16[80] = {
+    {  29828   ,   -146   } , 
+    {  29825   ,   -439   } , 
+    {  29819   ,   -732   } , 
+    {  29811   ,   -1025   } , 
+    {  29799   ,   -1317   } , 
+    {  29785   ,   -1610   } , 
+    {  29767   ,   -1902   } , 
+    {  29747   ,   -2194   } , 
+    {  29724   ,   -2486   } , 
+    {  29698   ,   -2778   } , 
+    {  29670   ,   -3069   } , 
+    {  29638   ,   -3360   } , 
+    {  29604   ,   -3651   } , 
+    {  29567   ,   -3942   } , 
+    {  29526   ,   -4232   } , 
+    {  29483   ,   -4521   } , 
+    {  29438   ,   -4811   } , 
+    {  29389   ,   -5099   } , 
+    {  29338   ,   -5388   } , 
+    {  29283   ,   -5676   } , 
+    {  29226   ,   -5963   } , 
+    {  29166   ,   -6249   } , 
+    {  29103   ,   -6535   } , 
+    {  29038   ,   -6821   } , 
+    {  28969   ,   -7106   } , 
+    {  28898   ,   -7390   } , 
+    {  28824   ,   -7673   } , 
+    {  28748   ,   -7956   } , 
+    {  28668   ,   -8237   } , 
+    {  28586   ,   -8518   } , 
+    {  28501   ,   -8799   } , 
+    {  28413   ,   -9078   } , 
+    {  28323   ,   -9357   } , 
+    {  28229   ,   -9634   } , 
+    {  28133   ,   -9911   } , 
+    {  28035   ,   -10187   } , 
+    {  27933   ,   -10461   } , 
+    {  27829   ,   -10735   } , 
+    {  27723   ,   -11008   } , 
+    {  27613   ,   -11279   } , 
+    {  27501   ,   -11550   } , 
+    {  27387   ,   -11819   } , 
+    {  27269   ,   -12088   } , 
+    {  27149   ,   -12355   } , 
+    {  27027   ,   -12621   } , 
+    {  26901   ,   -12885   } , 
+    {  26774   ,   -13149   } , 
+    {  26643   ,   -13411   } , 
+    {  26510   ,   -13672   } , 
+    {  26375   ,   -13932   } , 
+    {  26237   ,   -14190   } , 
+    {  26096   ,   -14447   } , 
+    {  25953   ,   -14702   } , 
+    {  25807   ,   -14956   } , 
+    {  25659   ,   -15209   } , 
+    {  25509   ,   -15460   } , 
+    {  25356   ,   -15710   } , 
+    {  25200   ,   -15958   } , 
+    {  25043   ,   -16205   } , 
+    {  24882   ,   -16450   } , 
+    {  24720   ,   -16693   } , 
+    {  24554   ,   -16935   } , 
+    {  24387   ,   -17175   } , 
+    {  24217   ,   -17414   } , 
+    {  24045   ,   -17651   } , 
+    {  23871   ,   -17886   } , 
+    {  23694   ,   -18119   } , 
+    {  23515   ,   -18351   } , 
+    {  23334   ,   -18581   } , 
+    {  23150   ,   -18809   } , 
+    {  22964   ,   -19036   } , 
+    {  22776   ,   -19260   } , 
+    {  22586   ,   -19483   } , 
+    {  22394   ,   -19704   } , 
+    {  22199   ,   -19923   } , 
+    {  22003   ,   -20140   } , 
+    {  21804   ,   -20355   } , 
+    {  21603   ,   -20568   } , 
+    {  21400   ,   -20779   } , 
+    {  21195   ,   -20988   } 
+    };
+cos_msin_t	a_cos_msin_32[160]= {
+    {  29828   ,   -73   } , 
+    {  29827   ,   -220   } , 
+    {  29826   ,   -366   } , 
+    {  29824   ,   -512   } , 
+    {  29821   ,   -659   } , 
+    {  29817   ,   -805   } , 
+    {  29813   ,   -952   } , 
+    {  29808   ,   -1098   } , 
+    {  29802   ,   -1244   } , 
+    {  29796   ,   -1390   } , 
+    {  29789   ,   -1537   } , 
+    {  29781   ,   -1683   } , 
+    {  29772   ,   -1829   } , 
+    {  29763   ,   -1975   } , 
+    {  29753   ,   -2121   } , 
+    {  29742   ,   -2267   } , 
+    {  29730   ,   -2413   } , 
+    {  29718   ,   -2559   } , 
+    {  29705   ,   -2705   } , 
+    {  29692   ,   -2851   } , 
+    {  29677   ,   -2997   } , 
+    {  29662   ,   -3142   } , 
+    {  29646   ,   -3288   } , 
+    {  29630   ,   -3433   } , 
+    {  29613   ,   -3579   } , 
+    {  29595   ,   -3724   } , 
+    {  29576   ,   -3869   } , 
+    {  29557   ,   -4014   } , 
+    {  29537   ,   -4159   } , 
+    {  29516   ,   -4304   } , 
+    {  29494   ,   -4449   } , 
+    {  29472   ,   -4594   } , 
+    {  29449   ,   -4738   } , 
+    {  29426   ,   -4883   } , 
+    {  29401   ,   -5027   } , 
+    {  29376   ,   -5172   } , 
+    {  29351   ,   -5316   } , 
+    {  29324   ,   -5460   } , 
+    {  29297   ,   -5604   } , 
+    {  29269   ,   -5747   } , 
+    {  29241   ,   -5891   } , 
+    {  29211   ,   -6034   } , 
+    {  29181   ,   -6178   } , 
+    {  29151   ,   -6321   } , 
+    {  29119   ,   -6464   } , 
+    {  29087   ,   -6607   } , 
+    {  29054   ,   -6749   } , 
+    {  29021   ,   -6892   } , 
+    {  28987   ,   -7034   } , 
+    {  28952   ,   -7177   } , 
+    {  28916   ,   -7319   } , 
+    {  28880   ,   -7460   } , 
+    {  28843   ,   -7602   } , 
+    {  28805   ,   -7744   } , 
+    {  28767   ,   -7885   } , 
+    {  28728   ,   -8026   } , 
+    {  28688   ,   -8167   } , 
+    {  28648   ,   -8308   } , 
+    {  28607   ,   -8448   } , 
+    {  28565   ,   -8589   } , 
+    {  28522   ,   -8729   } , 
+    {  28479   ,   -8869   } , 
+    {  28435   ,   -9008   } , 
+    {  28391   ,   -9148   } , 
+    {  28346   ,   -9287   } , 
+    {  28300   ,   -9426   } , 
+    {  28253   ,   -9565   } , 
+    {  28206   ,   -9703   } , 
+    {  28158   ,   -9842   } , 
+    {  28109   ,   -9980   } , 
+    {  28060   ,   -10118   } , 
+    {  28010   ,   -10255   } , 
+    {  27959   ,   -10393   } , 
+    {  27908   ,   -10530   } , 
+    {  27856   ,   -10667   } , 
+    {  27803   ,   -10803   } , 
+    {  27750   ,   -10940   } , 
+    {  27696   ,   -11076   } , 
+    {  27641   ,   -11212   } , 
+    {  27586   ,   -11347   } , 
+    {  27529   ,   -11482   } , 
+    {  27473   ,   -11617   } , 
+    {  27415   ,   -11752   } , 
+    {  27357   ,   -11886   } , 
+    {  27299   ,   -12021   } , 
+    {  27239   ,   -12154   } , 
+    {  27179   ,   -12288   } , 
+    {  27119   ,   -12421   } , 
+    {  27057   ,   -12554   } , 
+    {  26996   ,   -12687   } , 
+    {  26933   ,   -12819   } , 
+    {  26870   ,   -12951   } , 
+    {  26806   ,   -13083   } , 
+    {  26741   ,   -13215   } , 
+    {  26676   ,   -13346   } , 
+    {  26610   ,   -13476   } , 
+    {  26544   ,   -13607   } , 
+    {  26477   ,   -13737   } , 
+    {  26409   ,   -13867   } , 
+    {  26340   ,   -13996   } , 
+    {  26271   ,   -14125   } , 
+    {  26202   ,   -14254   } , 
+    {  26132   ,   -14383   } , 
+    {  26061   ,   -14511   } , 
+    {  25989   ,   -14638   } , 
+    {  25917   ,   -14766   } , 
+    {  25844   ,   -14893   } , 
+    {  25771   ,   -15020   } , 
+    {  25697   ,   -15146   } , 
+    {  25622   ,   -15272   } , 
+    {  25547   ,   -15397   } , 
+    {  25471   ,   -15523   } , 
+    {  25394   ,   -15648   } , 
+    {  25317   ,   -15772   } , 
+    {  25239   ,   -15896   } , 
+    {  25161   ,   -16020   } , 
+    {  25082   ,   -16143   } , 
+    {  25003   ,   -16266   } , 
+    {  24923   ,   -16389   } , 
+    {  24842   ,   -16511   } , 
+    {  24760   ,   -16632   } , 
+    {  24678   ,   -16754   } , 
+    {  24596   ,   -16875   } , 
+    {  24513   ,   -16995   } , 
+    {  24429   ,   -17115   } , 
+    {  24345   ,   -17235   } , 
+    {  24260   ,   -17354   } , 
+    {  24174   ,   -17473   } , 
+    {  24088   ,   -17592   } , 
+    {  24002   ,   -17710   } , 
+    {  23914   ,   -17827   } , 
+    {  23827   ,   -17945   } , 
+    {  23738   ,   -18061   } , 
+    {  23649   ,   -18178   } , 
+    {  23560   ,   -18293   } , 
+    {  23470   ,   -18409   } , 
+    {  23379   ,   -18524   } , 
+    {  23288   ,   -18638   } , 
+    {  23196   ,   -18752   } , 
+    {  23104   ,   -18866   } , 
+    {  23011   ,   -18979   } , 
+    {  22917   ,   -19092   } , 
+    {  22824   ,   -19204   } , 
+    {  22729   ,   -19316   } , 
+    {  22634   ,   -19427   } , 
+    {  22538   ,   -19538   } , 
+    {  22442   ,   -19649   } , 
+    {  22345   ,   -19759   } , 
+    {  22248   ,   -19868   } , 
+    {  22150   ,   -19977   } , 
+    {  22052   ,   -20086   } , 
+    {  21953   ,   -20194   } , 
+    {  21854   ,   -20301   } , 
+    {  21754   ,   -20408   } , 
+    {  21653   ,   -20515   } , 
+    {  21552   ,   -20621   } , 
+    {  21451   ,   -20726   } , 
+    {  21349   ,   -20831   } , 
+    {  21246   ,   -20936   } , 
+    {  21143   ,   -21040   } 
+    };
+cos_msin_t	a_cos_msin_64[320] = {
+{29827,	-34},
+{29827,	-106},
+{29827,	-177},
+{29827,	-249},
+{29826,	-320},
+{29825,	-392},
+{29824,	-463},
+{29823,	-535},
+{29821,	-606},
+{29819,	-678},
+{29818,	-750},
+{29816,	-821},
+{29814,	-893},
+{29812,	-964},
+{29809,	-1035},
+{29807,	-1106},
+{29804,	-1177},
+{29801,	-1249},
+{29797,	-1320},
+{29795,	-1392},
+{29791,	-1463},
+{29787,	-1535},
+{29784,	-1606},
+{29780,	-1678},
+{29776,	-1749},
+{29771,	-1820},
+{29767,	-1892},
+{29763,	-1963},
+{29758,	-2035},
+{29753,	-2106},
+{29748,	-2177},
+{29742,	-2249},
+{29737,	-2320},
+{29731,	-2391},
+{29726,	-2462},
+{29719,	-2534},
+{29713,	-2605},
+{29707,	-2676},
+{29701,	-2747},
+{29694,	-2819},
+{29686,	-2890},
+{29680,	-2961},
+{29673,	-3032},
+{29665,	-3103},
+{29658,	-3174},
+{29650,	-3245},
+{29643,	-3316},
+{29635,	-3387},
+{29626,	-3459},
+{29618,	-3529},
+{29610,	-3600},
+{29601,	-3671},
+{29592,	-3742},
+{29583,	-3813},
+{29574,	-3884},
+{29564,	-3955},
+{29554,	-4026},
+{29544,	-4097},
+{29535,	-4167},
+{29525,	-4238},
+{29514,	-4309},
+{29504,	-4380},
+{29493,	-4450},
+{29483,	-4521},
+{29472,	-4591},
+{29461,	-4662},
+{29450,	-4733},
+{29439,	-4803},
+{29427,	-4874},
+{29415,	-4944},
+{29403,	-5015},
+{29391,	-5085},
+{29379,	-5155},
+{29366,	-5226},
+{29353,	-5296},
+{29341,	-5367},
+{29328,	-5438},
+{29314,	-5508},
+{29301,	-5578},
+{29289,	-5648},
+{29274,	-5718},
+{29260,	-5788},
+{29247,	-5858},
+{29232,	-5928},
+{29218,	-5998},
+{29204,	-6068},
+{29188,	-6139},
+{29175,	-6209},
+{29159,	-6279},
+{29145,	-6348},
+{29128,	-6418},
+{29114,	-6488},
+{29097,	-6557},
+{29082,	-6627},
+{29066,	-6697},
+{29050,	-6767},
+{29034,	-6837},
+{29017,	-6906},
+{29001,	-6975},
+{28984,	-7045},
+{28966,	-7114},
+{28950,	-7184},
+{28933,	-7254},
+{28915,	-7323},
+{28897,	-7392},
+{28880,	-7461},
+{28862,	-7530},
+{28843,	-7600},
+{28825,	-7669},
+{28807,	-7738},
+{28788,	-7806},
+{28769,	-7875},
+{28751,	-7944},
+{28732,	-8014},
+{28712,	-8082},
+{28692,	-8151},
+{28672,	-8219},
+{28653,	-8289},
+{28633,	-8357},
+{28613,	-8425},
+{28593,	-8494},
+{28572,	-8563},
+{28551,	-8632},
+{28531,	-8700},
+{28510,	-8768},
+{28488,	-8837},
+{28468,	-8905},
+{28447,	-8973},
+{28425,	-9041},
+{28403,	-9109},
+{28381,	-9177},
+{28359,	-9245},
+{28336,	-9313},
+{28315,	-9381},
+{28292,	-9448},
+{28269,	-9517},
+{28246,	-9584},
+{28223,	-9652},
+{28200,	-9720},
+{28176,	-9787},
+{28153,	-9854},
+{28129,	-9922},
+{28105,	-9990},
+{28082,	-10056},
+{28057,	-10124},
+{28032,	-10191},
+{28009,	-10258},
+{27984,	-10326},
+{27959,	-10392},
+{27934,	-10460},
+{27909,	-10526},
+{27883,	-10593},
+{27858,	-10661},
+{27832,	-10727},
+{27807,	-10794},
+{27780,	-10860},
+{27754,	-10927},
+{27728,	-10993},
+{27701,	-11059},
+{27676,	-11126},
+{27648,	-11192},
+{27622,	-11259},
+{27595,	-11324},
+{27567,	-11391},
+{27540,	-11456},
+{27512,	-11523},
+{27484,	-11588},
+{27456,	-11655},
+{27429,	-11720},
+{27401,	-11786},
+{27372,	-11852},
+{27344,	-11917},
+{27315,	-11982},
+{27286,	-12049},
+{27257,	-12114},
+{27229,	-12179},
+{27199,	-12244},
+{27169,	-12309},
+{27140,	-12375},
+{27110,	-12439},
+{27080,	-12505},
+{27050,	-12570},
+{27019,	-12634},
+{26990,	-12699},
+{26958,	-12764},
+{26928,	-12828},
+{26897,	-12892},
+{26866,	-12956},
+{26835,	-13021},
+{26804,	-13086},
+{26773,	-13149},
+{26741,	-13214},
+{26709,	-13278},
+{26677,	-13342},
+{26645,	-13406},
+{26613,	-13470},
+{26581,	-13534},
+{26549,	-13597},
+{26515,	-13661},
+{26483,	-13725},
+{26450,	-13788},
+{26417,	-13851},
+{26384,	-13915},
+{26350,	-13978},
+{26316,	-14041},
+{26283,	-14103},
+{26248,	-14166},
+{26215,	-14229},
+{26180,	-14292},
+{26146,	-14355},
+{26112,	-14417},
+{26077,	-14480},
+{26042,	-14543},
+{26008,	-14605},
+{25972,	-14667},
+{25937,	-14730},
+{25901,	-14792},
+{25866,	-14854},
+{25830,	-14916},
+{25794,	-14977},
+{25759,	-15039},
+{25723,	-15101},
+{25687,	-15162},
+{25650,	-15224},
+{25613,	-15286},
+{25577,	-15347},
+{25540,	-15408},
+{25503,	-15470},
+{25465,	-15531},
+{25428,	-15592},
+{25391,	-15653},
+{25353,	-15714},
+{25315,	-15774},
+{25277,	-15834},
+{25240,	-15895},
+{25201,	-15956},
+{25162,	-16016},
+{25124,	-16076},
+{25086,	-16136},
+{25047,	-16196},
+{25008,	-16256},
+{24969,	-16316},
+{24930,	-16375},
+{24891,	-16436},
+{24851,	-16496},
+{24811,	-16555},
+{24772,	-16615},
+{24732,	-16674},
+{24692,	-16732},
+{24652,	-16791},
+{24612,	-16852},
+{24572,	-16911},
+{24531,	-16969},
+{24490,	-17027},
+{24449,	-17086},
+{24408,	-17145},
+{24367,	-17203},
+{24325,	-17261},
+{24284,	-17320},
+{24242,	-17379},
+{24200,	-17436},
+{24158,	-17494},
+{24116,	-17552},
+{24075,	-17610},
+{24032,	-17668},
+{23990,	-17725},
+{23947,	-17782},
+{23904,	-17840},
+{23862,	-17897},
+{23819,	-17954},
+{23775,	-18011},
+{23732,	-18068},
+{23689,	-18125},
+{23645,	-18181},
+{23602,	-18238},
+{23558,	-18294},
+{23514,	-18351},
+{23470,	-18407},
+{23426,	-18464},
+{23381,	-18520},
+{23337,	-18576},
+{23293,	-18632},
+{23248,	-18688},
+{23202,	-18743},
+{23158,	-18799},
+{23112,	-18854},
+{23068,	-18910},
+{23022,	-18964},
+{22977,	-19020},
+{22931,	-19074},
+{22885,	-19129},
+{22839,	-19185},
+{22793,	-19239},
+{22747,	-19294},
+{22700,	-19348},
+{22655,	-19403},
+{22607,	-19457},
+{22561,	-19511},
+{22514,	-19565},
+{22467,	-19619},
+{22421,	-19673},
+{22373,	-19726},
+{22326,	-19780},
+{22279,	-19834},
+{22230,	-19887},
+{22183,	-19940},
+{22135,	-19993},
+{22087,	-20047},
+{22039,	-20099},
+{21991,	-20152},
+{21942,	-20205},
+{21894,	-20257},
+{21845,	-20309},
+{21797,	-20362},
+{21748,	-20413},
+{21699,	-20466},
+{21650,	-20518},
+{21601,	-20570},
+{21551,	-20621},
+{21502,	-20674}
+};
+
+cos_msin_t	*a_cos_msin_table[] = {a_cos_msin_2, a_cos_msin_4,
+                                   a_cos_msin_8, a_cos_msin_16,
+                                   a_cos_msin_32,a_cos_msin_64
+			                      };
+
+Word16 dct_core_a[10][10] = {
+
+{ 10453,  10196,   9688,   8941,   7973,   6810,   5479,   4013,   2448,    823 },
+{ 10196,   7973,   4013,   -823,  -5479,  -8941, -10453,  -9688,  -6810,  -2448 },
+{ 9688 ,   4013,  -4013,  -9688,  -9688,  -4013,   4013,   9688,   9688,   4013 },
+{ 8941 ,   -823,  -9688,  -7973,   2448,  10196,   6810,  -4013, -10453,  -5479 },
+{ 7973 ,  -5479,  -9688,   2448,  10453,    823, -10196,  -4013,   8941,   6810 },
+{ 6810 ,  -8941,  -4013,  10196,    823, -10453,   2448,   9688,  -5479,  -7973 },
+{ 5479 , -10453,   4013,   6810, -10196,   2448,   7973,  -9688,    823,   8941 },
+{ 4013 ,  -9688,   9688,  -4013,  -4013,   9688,  -9688,   4013,   4013,  -9688 },
+{ 2448 ,  -6810,   9688, -10453,   8941,  -5479,    823,   4013,  -7973,  10196 },
+{ 823  ,  -2448,   4013,  -5479,   6810,  -7973,   8941,  -9688,  10196, -10453 }};
+
+Word16 anal_bias[320] = {
+  1,  1,  3,  1,  4,  1,  3, -2,  4,  3,
+  4,  1,  3,  0,  2, -3,  0,  0,  2,  2,
+  4,  1,  1, -5,  4,  1,  2, -1,  0, -1,
+  1, -2,  0,  2,  2,  2,  4,  1,  3,  0,
+  5,  3,  2,  0,  3,  0,  1, -4,  1,  1,
+  2,  0,  4,  0,  1, -4,  6,  1,  3, -1,
+  1,  0,  0, -4,  1,  1,  3,  1,  3,  2,
+  4, -2,  4,  3,  5,  1,  3,  0,  1, -3,
+  1,  1,  2,  0,  4,  1,  2, -4,  4,  2,
+  2, -1,  1, -1,  1, -4,  0,  0,  3,  0,
+  5,  2,  3, -1,  6,  2,  5,  0,  4,  0,
+  1, -3,  1,  0,  3,  0,  4,  0,  1, -3,
+  4,  1,  3, -1,  1, -2,  1, -4,  0,  1,
+  2,  1,  3,  2,  2, -2,  4,  3,  3,  0,
+  3,  0,  0, -2,  1,  0,  2,  0,  5, -1,
+  1, -3,  4,  2,  2,  0,  2, -3,  1, -4,
+ -1,  1,  2,  2,  4,  1,  3, -1,  5,  2,
+  2,  0,  3, -1,  2, -3,  0,  1,  2,  2,
+  4,  0,  1, -5,  5,  1,  3,  0,  2, -1,
+  0, -2,  1,  2,  2,  2,  4,  1,  0,  0,
+  4,  2,  4,  1,  4, -1,  1, -4,  0,  1,
+  3,  1,  5,  1,  1, -2,  4,  0,  2,  0,
+  2, -1,  0, -2,  0,  1,  1,  1,  4,  2,
+  3, -2,  5,  4,  4,  0,  3,  0,  3, -4,
+  1,  2,  2,  0,  4,  1,  0, -3,  4,  2,
+  3, -1,  1, -1,  1, -4,  0,  2,  3,  1,
+  4,  1,  3,  0,  3,  3,  4,  1,  2,  0,
+  1, -3,  2,  2,  2,  1,  5,  0,  1, -4,
+  4,  1,  3, -2,  3, -1,  0, -2,  0,  2,
+  2,  0,  5,  1,  4, -1,  4,  3,  4,  1,
+  3,  0,  1, -4,  2,  0,  3,  1,  5,  0,
+  1, -5,  5,  2,  2,  0,  0,  0,  0, -4};
+
diff --git a/third_party/g7221/encode/encoder.c b/third_party/g7221/encode/encoder.c
new file mode 100644
index 0000000..0ec8cf8
--- /dev/null
+++ b/third_party/g7221/encode/encoder.c
@@ -0,0 +1,1125 @@
+/***************************************************************************
+**
+**   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.
+**
+***************************************************************************/
+
+/***************************************************************************
+  Filename:    encoder.c    
+
+  Purpose:     Contains files used to implement the G.722.1 Annex C encoder
+
+  Design Notes:
+
+***************************************************************************/
+
+/***************************************************************************
+ Include files                                                           
+***************************************************************************/
+
+#include <stdio.h>
+#include <math.h>
+#include "defs.h"
+#include "huff_def.h"
+#include "tables.h"
+#include "count.h"
+
+/***************************************************************************
+ Function:    encoder                                                     
+                                                                         
+ Syntax:      void encoder(Word16 number_of_available_bits,                     
+                           Word16 number_of_regions,
+                           Word16 mlt_coefs,                                        
+                           Word16 mag_shift,                                        
+                           Word16 out_words)                                        
+              
+              inputs:   number_of_available_bits
+                        number_of_regions
+                        mag_shift
+                        mlt_coefs[DCT_LENGTH]
+                        
+              outputs:  out_words[MAX_BITS_PER_FRAME/16]
+                                                                         
+                                                                         
+ Description: Encodes the mlt coefs into out_words using G.722.1 Annex C
+                                                           
+                                                                         
+ WMOPS:     7kHz |    24kbit    |     32kbit
+          -------|--------------|----------------
+            AVG  |    0.93      |     1.04
+          -------|--------------|----------------  
+            MAX  |    1.20      |     1.28
+          -------|--------------|---------------- 
+                                                                        
+           14kHz |    24kbit    |     32kbit     |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    1.39      |     1.71       |     2.01
+          -------|--------------|----------------|----------------
+            MAX  |    2.00      |     2.30       |     2.52
+          -------|--------------|----------------|----------------
+                                                                         
+***************************************************************************/
+
+void encoder(Word16  number_of_available_bits,
+             Word16  number_of_regions,
+             Word16  *mlt_coefs,
+             Word16  mag_shift,
+             Word16  *out_words)
+{
+
+    Word16  num_categorization_control_bits;
+    Word16  num_categorization_control_possibilities;
+    Word16  number_of_bits_per_frame;
+    Word16  number_of_envelope_bits;
+    Word16  categorization_control;
+    Word16  region;
+    Word16  absolute_region_power_index[MAX_NUMBER_OF_REGIONS];
+    Word16  power_categories[MAX_NUMBER_OF_REGIONS];
+    Word16  category_balances[MAX_NUM_CATEGORIZATION_CONTROL_POSSIBILITIES-1];
+    Word16  drp_num_bits[MAX_NUMBER_OF_REGIONS+1];
+    UWord16 drp_code_bits[MAX_NUMBER_OF_REGIONS+1];
+    Word16  region_mlt_bit_counts[MAX_NUMBER_OF_REGIONS];
+    UWord32 region_mlt_bits[4*MAX_NUMBER_OF_REGIONS];
+    Word16  mag_shift_offset;
+
+    Word16 temp;
+
+    /* initialize variables */
+    test();
+    if (number_of_regions == NUMBER_OF_REGIONS)
+    {
+        num_categorization_control_bits = NUM_CATEGORIZATION_CONTROL_BITS;
+        move16();
+        num_categorization_control_possibilities = NUM_CATEGORIZATION_CONTROL_POSSIBILITIES;
+        move16();
+    } 
+    else
+    {
+        num_categorization_control_bits = MAX_NUM_CATEGORIZATION_CONTROL_BITS;
+        move16();
+        num_categorization_control_possibilities = MAX_NUM_CATEGORIZATION_CONTROL_POSSIBILITIES;
+        move16();
+    }
+
+    number_of_bits_per_frame = number_of_available_bits;
+    move16();
+
+    for (region=0; region<number_of_regions; region++)
+    {
+        region_mlt_bit_counts[region] = 0;
+        move16();
+    }
+    
+    /* Estimate power envelope. */
+    number_of_envelope_bits = compute_region_powers(mlt_coefs,
+                                                    mag_shift,
+                                                    drp_num_bits,
+                                                    drp_code_bits,
+                                                    absolute_region_power_index,
+                                                    number_of_regions);
+
+    /* Adjust number of available bits based on power envelope estimate */
+    temp = sub(number_of_available_bits,number_of_envelope_bits);
+    number_of_available_bits = sub(temp,num_categorization_control_bits);
+
+    /* get categorizations */
+    categorize(number_of_available_bits,
+               number_of_regions,
+               num_categorization_control_possibilities,
+               absolute_region_power_index,
+               power_categories,
+               category_balances);
+
+    /* Adjust absolute_region_category_index[] for mag_shift.
+       This assumes that REGION_POWER_STEPSIZE_DB is defined
+       to be exactly 3.010299957 or 20.0 times log base 10
+       of square root of 2. */
+    temp = shl(mag_shift,1);
+    mag_shift_offset = add(temp,REGION_POWER_TABLE_NUM_NEGATIVES);
+    
+    for (region=0; region<number_of_regions; region++)
+    {
+        absolute_region_power_index[region] = add(absolute_region_power_index[region],mag_shift_offset);
+        move16();
+    }
+
+    /* adjust the absolute power region index based on the mlt coefs */
+    adjust_abs_region_power_index(absolute_region_power_index,mlt_coefs,number_of_regions);
+
+
+    /* quantize and code the mlt coefficients based on categorizations */
+    vector_quantize_mlts(number_of_available_bits,
+                         number_of_regions,
+                         num_categorization_control_possibilities,
+                         mlt_coefs,
+                         absolute_region_power_index,
+                         power_categories,
+                         category_balances,
+                         &categorization_control,
+                         region_mlt_bit_counts,
+                         region_mlt_bits);
+
+    /* stuff bits into words */
+    bits_to_words(region_mlt_bits,
+                  region_mlt_bit_counts,
+                  drp_num_bits,
+                  drp_code_bits,
+                  out_words,
+                  categorization_control,
+                  number_of_regions,
+                  num_categorization_control_bits,
+                  number_of_bits_per_frame);
+
+}
+
+/***************************************************************************
+ Function:    bits_to_words
+
+ Syntax:      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)                                                           
+                                                                   
+                                                                   
+ Description: Stuffs the bits into words for output
+
+ WMOPS:     7kHz |    24kbit    |      32kbit
+          -------|--------------|----------------
+            AVG  |    0.09      |     0.12
+          -------|--------------|----------------  
+            MAX  |    0.10      |     0.13
+          -------|--------------|---------------- 
+          
+           14kHz |    24kbit    |     32kbit     |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.12      |     0.15       |     0.19
+          -------|--------------|----------------|----------------
+            MAX  |    0.14      |     0.17       |     0.21
+          -------|--------------|----------------|----------------
+
+***************************************************************************/
+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)
+{
+    Word16  out_word_index = 0;
+    Word16  j;
+    Word16  region;
+    Word16  out_word;
+    Word16  region_bit_count;
+    Word16  current_word_bits_left;
+    UWord16 slice;
+    Word16  out_word_bits_free = 16;
+    UWord32 *in_word_ptr;
+    UWord32 current_word;
+    
+    Word32  acca;
+    Word32  accb;
+    Word16  temp;
+
+    /* First set up the categorization control bits to look like one more set of region power bits. */
+    out_word = 0;
+    move16();
+
+    drp_num_bits[number_of_regions] = num_categorization_control_bits;
+    move16();
+    
+    drp_code_bits[number_of_regions] = (UWord16)categorization_control;
+    move16();
+
+    /* These code bits are right justified. */
+    for (region=0; region <= number_of_regions; region++)
+    {
+        current_word_bits_left = drp_num_bits[region];
+        move16();
+        
+        current_word = (UWord32)drp_code_bits[region];
+        move16();
+        
+        j = sub(current_word_bits_left,out_word_bits_free);
+
+        test();
+        if (j >= 0)
+        {
+            temp = extract_l(L_shr(current_word,j));
+            out_word = add(out_word,temp);
+
+            out_words[out_word_index++] = out_word;
+            move16();
+            
+            out_word_bits_free = 16;
+            move16();
+            
+            out_word_bits_free = sub(out_word_bits_free,j);
+            
+            acca = (current_word << out_word_bits_free);
+            out_word = extract_l(acca);
+        }
+        else
+        {
+            j = negate(j);
+
+            acca = (current_word << j);
+            accb = L_deposit_l(out_word);
+            acca = L_add(accb,acca);
+            out_word = extract_l(acca);
+            
+            out_word_bits_free = sub(out_word_bits_free,current_word_bits_left);
+        }
+    }
+
+    /* These code bits are left justified. */
+    
+    for (region=0;region<number_of_regions; region++)
+    {
+        accb = L_deposit_l(out_word_index);
+        accb = L_shl(accb,4);
+        accb = L_sub(accb,number_of_bits_per_frame);
+        test();
+        if(accb < 0)        
+        {
+            temp = shl(region,2);
+            in_word_ptr = &region_mlt_bits[temp];
+            region_bit_count = region_mlt_bit_counts[region];
+            move16();
+
+            temp = sub(32,region_bit_count);
+            test();
+            if(temp > 0)
+                current_word_bits_left = region_bit_count;
+            else
+                current_word_bits_left = 32;
+
+            current_word = *in_word_ptr++;
+    
+            acca = L_deposit_l(out_word_index);
+            acca = L_shl(acca,4);
+            acca = L_sub(acca,number_of_bits_per_frame);
+            
+            /* from while loop */
+            test();
+            test();
+            logic16(); 
+            while ((region_bit_count > 0) && (acca < 0))
+            {
+                /* from while loop */
+                test();
+                test();
+                logic16(); 
+                
+                temp = sub(current_word_bits_left,out_word_bits_free);
+                test();
+                if (temp >= 0)
+                {
+                    temp = sub(32,out_word_bits_free);
+                    accb = LU_shr(current_word,temp);
+                    slice = (UWord16)extract_l(accb);
+                    
+                    out_word = add(out_word,slice);
+    
+                    test();
+                    current_word <<= out_word_bits_free;
+
+                    current_word_bits_left = sub(current_word_bits_left,out_word_bits_free);
+                    out_words[out_word_index++] = extract_l(out_word);
+                    move16();
+
+                    out_word = 0;
+                    move16();
+
+                    out_word_bits_free = 16;
+                    move16();
+                }
+                else
+                {
+                    temp = sub(32,current_word_bits_left);
+                    accb = LU_shr(current_word,temp);
+                    slice = (UWord16)extract_l(accb);
+                    
+                    temp = sub(out_word_bits_free,current_word_bits_left);
+                    test();
+                    accb = slice << temp;
+                    acca = L_deposit_l(out_word);
+                    acca = L_add(acca,accb);
+                    out_word = extract_l(acca);
+                    out_word_bits_free = sub(out_word_bits_free,current_word_bits_left);
+                    
+                    current_word_bits_left = 0;
+                    move16();
+                }
+    
+                test();
+                if (current_word_bits_left == 0)
+                {
+                    current_word = *in_word_ptr++;
+                    region_bit_count = sub(region_bit_count,32);
+                    
+                    /* current_word_bits_left = MIN(32,region_bit_count); */
+                    temp = sub(32,region_bit_count);
+                    test();
+                    if(temp > 0)
+                        current_word_bits_left = region_bit_count;
+                    else
+                        current_word_bits_left = 32;
+                    
+                }
+                acca = L_deposit_l(out_word_index);
+                acca = L_shl(acca,4);
+                acca = L_sub(acca,number_of_bits_per_frame);
+            }
+            accb = L_deposit_l(out_word_index);
+            accb = L_shl(accb,4);
+            accb = L_sub(accb,number_of_bits_per_frame);
+        }
+    }
+
+    /* Fill out with 1's. */
+
+    test();
+    while (acca < 0)
+    {
+        test();
+        current_word = 0x0000ffff;
+        move32();
+
+        temp = sub(16,out_word_bits_free);
+        acca = LU_shr(current_word,temp);
+        slice = (UWord16)extract_l(acca);
+
+        out_word = add(out_word,slice);
+        out_words[out_word_index++] = out_word;
+        move16();
+
+        out_word = 0;
+        move16();
+        
+        out_word_bits_free = 16;
+        move16();
+        
+        acca = L_deposit_l(out_word_index);
+        acca = L_shl(acca,4);
+        acca = L_sub(acca,number_of_bits_per_frame);
+    }
+}
+/***************************************************************************
+ Function:    adjust_abs_region_power_index
+
+ Syntax:      adjust_abs_region_power_index(Word16 *absolute_region_power_index,
+                                            Word16 *mlt_coefs,
+                                            Word16 number_of_regions)
+
+              inputs:   *mlt_coefs
+                        *absolute_region_power_index
+                        number_of_regions
+            
+              outputs:  *absolute_region_power_index
+ 
+ Description: Adjusts the absolute power index
+ 
+ 
+ WMOPS:     7kHz |    24kbit    |      32kbit
+          -------|--------------|----------------
+            AVG  |    0.03      |      0.03
+          -------|--------------|----------------  
+            MAX  |    0.12      |      0.12
+          -------|--------------|---------------- 
+
+           14kHz |    24kbit    |     32kbit     |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.03      |     0.03       |     0.03
+          -------|--------------|----------------|----------------
+            MAX  |    0.14      |     0.14       |     0.14
+          -------|--------------|----------------|----------------
+
+***************************************************************************/
+void adjust_abs_region_power_index(Word16 *absolute_region_power_index,Word16 *mlt_coefs,Word16 number_of_regions)
+{
+    Word16 n,i;
+    Word16 region;
+    Word16 *raw_mlt_ptr;
+    
+    Word32 acca;
+    Word16 temp;
+
+    for (region=0; region<number_of_regions; region++)
+    {
+        n = sub(absolute_region_power_index[region],39);
+        n = shr(n,1);
+        
+        test();
+        if (n > 0)
+        {
+            temp = extract_l(L_mult0(region,REGION_SIZE));
+
+            raw_mlt_ptr = &mlt_coefs[temp];
+
+            for (i=0; i<REGION_SIZE; i++)
+            {
+                acca = L_shl(*raw_mlt_ptr,16);
+                acca = L_add(acca,32768L);
+                acca = L_shr(acca,n);
+                acca = L_shr(acca,16);
+                *raw_mlt_ptr++ = extract_l(acca);
+            }
+
+            temp = shl(n,1);
+            temp = sub(absolute_region_power_index[region],temp);
+            absolute_region_power_index[region] = temp;
+            move16();
+        }
+    }
+}
+
+/***************************************************************************
+ Function:    compute_region_powers
+
+ Syntax:      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)
+                mlt_coefs[DCT_LENGTH];                      
+                mag_shift;                                          
+                drp_num_bits[MAX_NUMBER_OF_REGIONS];                      
+                drp_code_bits[MAX_NUMBER_OF_REGIONS];                     
+                absolute_region_power_index[MAX_NUMBER_OF_REGIONS];       
+                number_of_regions;
+                                                                   
+ Description: Computes the power for each of the regions
+
+ 
+ WMOPS:     7kHz |    24kbit    |    32kbit
+          -------|--------------|----------------
+            AVG  |    0.09      |    0.09
+          -------|--------------|----------------  
+            MAX  |    0.13      |    0.13
+          -------|--------------|---------------- 
+
+           14kHz |    24kbit    |     32kbit     |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.20      |     0.20       |     0.20
+          -------|--------------|----------------|----------------
+            MAX  |    0.29      |     0.29       |     0.29
+          -------|--------------|----------------|----------------
+
+***************************************************************************/
+
+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)
+{
+
+    Word16 *input_ptr;
+    Word32 long_accumulator;
+    Word16 itemp1;
+    Word16 power_shift;
+    Word16 region;
+    Word16 j;
+    Word16 differential_region_power_index[MAX_NUMBER_OF_REGIONS];
+    Word16 number_of_bits;
+    
+    Word32 acca;
+    Word16 temp;
+    Word16 temp1;
+    Word16 temp2;
+
+
+    input_ptr = mlt_coefs;
+    for (region=0; region<number_of_regions; region++)
+    {
+        long_accumulator = L_deposit_l(0);
+
+        for (j=0; j<REGION_SIZE; j++)
+        {
+            itemp1 = *input_ptr++;
+            move16();
+            long_accumulator = L_mac0(long_accumulator,itemp1,itemp1);
+        }
+
+        power_shift = 0;
+        move16();
+
+        acca = (long_accumulator & 0x7fff0000L);
+        logic32();
+
+        test();
+        while (acca > 0)
+        {
+            test();
+            long_accumulator = L_shr(long_accumulator,1);
+            
+            acca = (long_accumulator & 0x7fff0000L);
+            logic32();
+
+            power_shift = add(power_shift,1);
+        }
+        
+        acca = L_sub(long_accumulator,32767);
+        
+        temp = add(power_shift,15);
+        test();
+        test();
+        logic16();
+        while ((acca <= 0) && (temp >= 0))
+        {
+            test();
+            test();
+            logic16();
+            
+            long_accumulator = L_shl(long_accumulator,1);
+            acca = L_sub(long_accumulator,32767);
+            power_shift--;
+            temp = add(power_shift,15);
+        }
+        long_accumulator = L_shr(long_accumulator,1);
+        /* 28963 corresponds to square root of 2 times REGION_SIZE(20). */
+        acca = L_sub(long_accumulator,28963);
+        
+        test();
+        if (acca >= 0)
+            power_shift = add(power_shift,1);
+        
+        acca = L_deposit_l(mag_shift);
+        acca = L_shl(acca,1);
+        acca = L_sub(power_shift,acca);
+        acca = L_add(35,acca);
+        acca = L_sub(acca,REGION_POWER_TABLE_NUM_NEGATIVES);
+        absolute_region_power_index[region] = extract_l(acca);
+    }
+
+
+    /* Before we differentially encode the quantized region powers, adjust upward the
+    valleys to make sure all the peaks can be accurately represented. */
+    temp = sub(number_of_regions,2);
+
+    for (region = temp; region >= 0; region--)
+    {
+        temp1 = sub(absolute_region_power_index[region+1],DRP_DIFF_MAX);
+        temp2 = sub(absolute_region_power_index[region],temp1);
+        test();
+        if (temp2 < 0)
+        {
+            absolute_region_power_index[region] = temp1;
+            move16();
+        }
+    }
+
+    /* The MLT is currently scaled too low by the factor
+       ENCODER_SCALE_FACTOR(=18318)/32768 * (1./sqrt(160).
+       This is the ninth power of 1 over the square root of 2.
+       So later we will add ESF_ADJUSTMENT_TO_RMS_INDEX (now 9)
+       to drp_code_bits[0]. */
+
+    /* drp_code_bits[0] can range from 1 to 31. 0 will be used only as an escape sequence. */
+    temp1 = sub(1,ESF_ADJUSTMENT_TO_RMS_INDEX);
+    temp2 = sub(absolute_region_power_index[0],temp1);
+    test();
+    if (temp2 < 0)
+    {
+        absolute_region_power_index[0] = temp1;
+        move16();
+    }
+    
+    temp1 = sub(31,ESF_ADJUSTMENT_TO_RMS_INDEX);
+
+	/*
+	 * The next line was corrected in Release 1.2 
+	 */
+
+    temp2 = sub(absolute_region_power_index[0], temp1);  
+    test();
+    if (temp2 > 0)
+    {
+        absolute_region_power_index[0] = temp1;
+        move16();
+    }
+
+    differential_region_power_index[0] = absolute_region_power_index[0];
+    move16();
+    
+    number_of_bits = 5;
+    move16();
+    
+    drp_num_bits[0] = 5;
+    move16();
+    
+    drp_code_bits[0] = (UWord16)add(absolute_region_power_index[0],ESF_ADJUSTMENT_TO_RMS_INDEX);
+    move16();
+
+    /* Lower limit the absolute region power indices to -8 and upper limit them to 31. Such extremes
+     may be mathematically impossible anyway.*/
+    for (region=1; region<number_of_regions; region++)
+    {
+        temp1 = sub(-8,ESF_ADJUSTMENT_TO_RMS_INDEX);
+        temp2 = sub(absolute_region_power_index[region],temp1);
+        test();
+        if (temp2 < 0)
+        {
+            absolute_region_power_index[region] = temp1;
+            move16();
+        }
+
+        temp1 = sub(31,ESF_ADJUSTMENT_TO_RMS_INDEX);
+        temp2 = sub(absolute_region_power_index[region],temp1);
+        test();
+        if (temp2 > 0)
+        {
+            absolute_region_power_index[region] = temp1;
+            move16();
+        }
+    }
+
+    for (region=1; region<number_of_regions; region++)
+    {
+        j = sub(absolute_region_power_index[region],absolute_region_power_index[region-1]);
+        temp = sub(j,DRP_DIFF_MIN);
+        test();
+        if (temp < 0)
+        {
+            j = DRP_DIFF_MIN;
+        }
+        j = sub(j,DRP_DIFF_MIN);
+        move16();
+        differential_region_power_index[region] = j;
+        move16();
+        
+        temp = add(absolute_region_power_index[region-1],differential_region_power_index[region]);
+        temp = add(temp,DRP_DIFF_MIN);
+        absolute_region_power_index[region] = temp;
+        move16();
+
+        number_of_bits = add(number_of_bits,differential_region_power_bits[region][j]);
+        drp_num_bits[region] = differential_region_power_bits[region][j];
+        move16();
+        drp_code_bits[region] = differential_region_power_codes[region][j];
+        move16();
+    }
+
+    return (number_of_bits);
+}
+
+/***************************************************************************
+ Function:    vector_quantize_mlts
+
+ Syntax:      void vector_quantize_mlts(number_of_available_bits,
+                                        number_of_regions,                     
+                                        num_categorization_control_possibilities,
+                                        mlt_coefs,                                    
+                                        absolute_region_power_index,                  
+                                        power_categories,                             
+                                        category_balances,                            
+                                        p_categorization_control,                               
+                                        region_mlt_bit_counts,                        
+                                        region_mlt_bits)                              
+                                                                                    
+              Word16 number_of_available_bits;                                        
+              Word16 number_of_regions;
+              Word16 num_categorization_control_possibilities;
+              Word16 mlt_coefs[DCT_LENGTH];                                         
+              Word16 absolute_region_power_index[MAX_NUMBER_OF_REGIONS];                  
+              Word16 power_categories[MAX_NUMBER_OF_REGIONS];                             
+              Word16 category_balances[MAX_NUM_CATEGORIZATION_CONTROL_POSSIBILITIES-1];         
+              Word16 *p_categorization_control;                                                 
+              Word16 region_mlt_bit_counts[MAX_NUMBER_OF_REGIONS];                        
+              Word32 region_mlt_bits[4*MAX_NUMBER_OF_REGIONS];                            
+
+ Description: Scalar quantized vector Huffman coding (SQVH)
+
+ 
+ WMOPS:     7kHz |    24kbit    |     32kbit
+          -------|--------------|----------------
+            AVG  |    0.57      |     0.65
+          -------|--------------|----------------  
+            MAX  |    0.78      |     0.83
+          -------|--------------|---------------- 
+
+           14kHz |    24kbit    |     32kbit     |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.62      |     0.90       |     1.11
+          -------|--------------|----------------|----------------
+            MAX  |    1.16      |     1.39       |     1.54
+          -------|--------------|----------------|----------------
+
+***************************************************************************/
+
+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 *raw_mlt_ptr;
+    Word16 region;
+    Word16 category;
+    Word16 total_mlt_bits = 0;
+
+    Word16 temp;
+    Word16 temp1;
+    Word16 temp2;
+
+    /* Start in the middle of the categorization control range. */
+    temp = shr(num_categorization_control_possibilities,1);
+    temp = sub(temp,1);
+    for (*p_categorization_control = 0; *p_categorization_control < temp; (*p_categorization_control)++)
+    {
+        region = category_balances[*p_categorization_control];
+        move16();
+        power_categories[region] = add(power_categories[region],1);
+        move16();
+    }
+
+    for (region=0; region<number_of_regions; region++)
+    {
+        category = power_categories[region];
+        move16();
+        temp = extract_l(L_mult0(region,REGION_SIZE));
+        raw_mlt_ptr = &mlt_coefs[temp];
+        move16();
+        temp = sub(category,(NUM_CATEGORIES-1));
+        test();
+        if (temp < 0)
+        {
+            region_mlt_bit_counts[region] =
+            vector_huffman(category, absolute_region_power_index[region],raw_mlt_ptr,
+                           &region_mlt_bits[shl(region,2)]);
+        }
+        else
+        {
+            region_mlt_bit_counts[region] = 0;
+            move16();
+        }
+        total_mlt_bits = add(total_mlt_bits,region_mlt_bit_counts[region]);
+    }
+
+
+    /* If too few bits... */
+    temp = sub(total_mlt_bits,number_of_available_bits);
+    test();
+    test();
+    logic16();
+    while ((temp < 0) && (*p_categorization_control > 0))
+    {
+        test();
+        test();
+        logic16();
+        (*p_categorization_control)--;
+        region = category_balances[*p_categorization_control];
+        move16();
+        
+        power_categories[region] = sub(power_categories[region],1);
+        move16();
+
+        total_mlt_bits = sub(total_mlt_bits,region_mlt_bit_counts[region]);
+        category = power_categories[region];
+        move16();
+        
+        raw_mlt_ptr = &mlt_coefs[region*REGION_SIZE];
+        move16();
+        
+        temp = sub(category,(NUM_CATEGORIES-1));
+        test();
+        if (temp < 0)
+        {
+            region_mlt_bit_counts[region] =
+                vector_huffman(category, absolute_region_power_index[region],raw_mlt_ptr,
+                           &region_mlt_bits[shl(region,2)]);
+        }
+        else
+        {
+            region_mlt_bit_counts[region] = 0;
+            move16();
+        }
+        total_mlt_bits = add(total_mlt_bits,region_mlt_bit_counts[region]);
+        temp = sub(total_mlt_bits,number_of_available_bits);
+    }
+
+    /* If too many bits... */
+    /* Set up for while loop test */
+    temp1 = sub(total_mlt_bits,number_of_available_bits);
+    temp2 = sub(*p_categorization_control,sub(num_categorization_control_possibilities,1));
+    test();
+    test();
+    logic16();
+    
+    while ((temp1 > 0) && (temp2 < 0))
+    {
+        /* operations for while contitions */
+        test();
+        test();
+        logic16();
+        
+        region = category_balances[*p_categorization_control];
+        move16();
+        
+        power_categories[region] = add(power_categories[region],1);
+        move16();
+
+        total_mlt_bits = sub(total_mlt_bits,region_mlt_bit_counts[region]);
+        category = power_categories[region];
+        move16();
+        
+        temp = extract_l(L_mult0(region,REGION_SIZE));
+        raw_mlt_ptr = &mlt_coefs[temp];
+        move16();
+        
+        temp = sub(category,(NUM_CATEGORIES-1));
+        test();
+        if (temp < 0)
+        {
+            region_mlt_bit_counts[region] =
+                vector_huffman(category, absolute_region_power_index[region],raw_mlt_ptr,
+                           &region_mlt_bits[shl(region,2)]);
+        }
+        else
+        {
+            region_mlt_bit_counts[region] = 0;
+            move16();
+        }
+        total_mlt_bits = add(total_mlt_bits,region_mlt_bit_counts[region]);
+        (*p_categorization_control)++;
+        
+        temp1 = sub(total_mlt_bits,number_of_available_bits);
+        temp2 = sub(*p_categorization_control,sub(num_categorization_control_possibilities,1));
+    }
+}
+
+/***************************************************************************
+ Function:    vector_huffman
+
+ Syntax:      Word16 vector_huffman(Word16  category,     
+                                    Word16  power_index,  
+                                    Word16  *raw_mlt_ptr,  
+                                    UWord32 *word_ptr)     
+                                              
+              inputs:     Word16  category
+                          Word16  power_index
+                          Word16  *raw_mlt_ptr
+             
+              outputs:    number_of_region_bits
+                          *word_ptr
+                                      
+
+ Description: Huffman encoding for each region based on category and power_index  
+
+ WMOPS:     7kHz |    24kbit    |     32kbit
+          -------|--------------|----------------
+            AVG  |    0.03      |     0.03
+          -------|--------------|----------------  
+            MAX  |    0.04      |     0.04
+          -------|--------------|---------------- 
+
+           14kHz |    24kbit    |     32kbit     |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    0.03      |     0.03       |     0.03
+          -------|--------------|----------------|----------------
+            MAX  |    0.04      |     0.04       |     0.04
+          -------|--------------|----------------|----------------
+
+***************************************************************************/
+Word16 vector_huffman(Word16 category,
+                      Word16 power_index,
+                      Word16 *raw_mlt_ptr,
+                      UWord32 *word_ptr)
+{
+ 
+
+    Word16  inv_of_step_size_times_std_dev;
+    Word16  j,n;
+    Word16  k;
+    Word16  number_of_region_bits;
+    Word16  number_of_non_zero;
+    Word16  vec_dim;
+    Word16  num_vecs;
+    Word16  kmax, kmax_plus_one;
+    Word16  index,signs_index;
+    Word16  *bitcount_table_ptr;
+    UWord16 *code_table_ptr;
+    Word32  code_bits;
+    Word16  number_of_code_bits;
+    UWord32 current_word;
+    Word16  current_word_bits_free;
+    
+    Word32 acca;
+    Word32 accb;
+    Word16 temp;
+
+    Word16 mytemp;			 /* new variable in Release 1.2 */
+    Word16 myacca;			 /* new variable in Release 1.2 */
+
+
+    /* initialize variables */
+    vec_dim = vector_dimension[category];
+    move16();
+
+    num_vecs = number_of_vectors[category];
+    move16();
+
+    kmax = max_bin[category];
+    move16();
+
+    kmax_plus_one = add(kmax,1);
+    move16();
+
+    current_word = 0L;
+    move16();
+
+    current_word_bits_free = 32;
+    move16();
+
+    number_of_region_bits = 0;
+    move16();
+
+    /* set up table pointers */
+    bitcount_table_ptr = (Word16 *)table_of_bitcount_tables[category];
+    code_table_ptr = (UWord16 *) table_of_code_tables[category];
+
+    /* compute inverse of step size * standard deviation */
+    acca = L_mult(step_size_inverse_table[category],standard_deviation_inverse_table[power_index]);
+    acca = L_shr(acca,1);
+    acca = L_add(acca,4096);
+    acca = L_shr(acca,13);
+
+	/*
+	 *  The next two lines are new to Release 1.2 
+	 */
+     
+	mytemp = acca & 0x3;
+    acca = L_shr(acca,2);
+
+    inv_of_step_size_times_std_dev = extract_l(acca);
+
+
+    for (n=0; n<num_vecs; n++)
+    {
+        index = 0;
+        move16();
+        
+        signs_index = 0;
+        move16();
+        
+        number_of_non_zero = 0;
+        move16();
+        
+        for (j=0; j<vec_dim; j++)
+        {
+            k = abs_s(*raw_mlt_ptr);
+            
+            acca = L_mult(k,inv_of_step_size_times_std_dev);
+            acca = L_shr(acca,1);
+		    
+			/*
+			 *  The next four lines are new to Release 1.2
+			 */
+
+			myacca = (Word16)L_mult(k,mytemp);
+			myacca = (Word16)L_shr(myacca,1);
+			myacca = (Word16)L_add(myacca,int_dead_zone_low_bits[category]);
+			myacca = (Word16)L_shr(myacca,2);
+
+            acca = L_add(acca,int_dead_zone[category]);
+
+			/*
+			 *  The next two lines are new to Release 1.2
+			 */
+
+			acca = L_add(acca,myacca);
+			acca = L_shr(acca,13);
+
+            k = extract_l(acca);
+
+            test();
+            if (k != 0)
+            {
+                number_of_non_zero = add(number_of_non_zero,1);
+                signs_index = shl(signs_index,1);
+                
+                test();
+                if (*raw_mlt_ptr > 0)
+                {
+                    signs_index = add(signs_index,1);
+                }
+                
+                temp = sub(k,kmax);
+                test();
+                if (temp > 0)
+                {
+                    k = kmax;
+                    move16();
+                }
+            }
+            acca = L_shr(L_mult(index,(kmax_plus_one)),1);
+            index = extract_l(acca);
+            index = add(index,k);
+            raw_mlt_ptr++;
+        }
+
+        code_bits = *(code_table_ptr+index);
+        number_of_code_bits = add((*(bitcount_table_ptr+index)),number_of_non_zero);
+        number_of_region_bits = add(number_of_region_bits,number_of_code_bits);
+
+        acca = code_bits << number_of_non_zero;
+        accb = L_deposit_l(signs_index);
+        acca = L_add(acca,accb);
+        code_bits = acca;
+        move32();
+
+        /* msb of codebits is transmitted first. */
+        j = sub(current_word_bits_free,number_of_code_bits);
+        test();
+        if (j >= 0)
+        {
+            test();
+            acca = code_bits << j;
+            current_word = L_add(current_word,acca);
+            current_word_bits_free = j;
+            move16();
+        }
+        else
+        {
+            j = negate(j);
+            acca = L_shr(code_bits,j);
+            current_word = L_add(current_word,acca);
+            
+            *word_ptr++ = current_word;
+            move16();
+
+            current_word_bits_free = sub(32,j);
+            test();
+            current_word = code_bits << current_word_bits_free;
+        }
+    }
+
+    *word_ptr++ = current_word;
+    move16();
+
+    return (number_of_region_bits);
+}
+
+
diff --git a/third_party/g7221/encode/sam2coef.c b/third_party/g7221/encode/sam2coef.c
new file mode 100644
index 0000000..08ee0e1
--- /dev/null
+++ b/third_party/g7221/encode/sam2coef.c
@@ -0,0 +1,270 @@
+/******************************************************************************
+**
+**   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.
+**
+******************************************************************************/
+
+/******************************************************************************
+* Filename: samples_to_rmlt_coefs.c
+*
+* Purpose:  Convert Samples to Reversed MLT (Modulated Lapped Transform) 
+*           Coefficients
+*
+*     The "Reversed MLT" is an overlapped block transform which uses
+*     even symmetry * on the left, odd symmetry on the right and a
+*     Type IV DCT as the block transform.  * It is thus similar to a
+*     MLT which uses odd symmetry on the left, even symmetry * on the
+*     right and a Type IV DST as the block transform.  In fact, it is
+*     equivalent * to reversing the order of the samples, performing
+*     an MLT and then negating all * the even-numbered coefficients.
+*
+******************************************************************************/
+
+/***************************************************************************
+ Include files                                                           
+***************************************************************************/
+#include "defs.h"
+#include "tables.h"
+#include "count.h"
+
+/***************************************************************************
+ Function:    samples_to_rmlt_coefs 
+
+ Syntax:      Word16 samples_to_rmlt_coefs(new_samples, 
+                                           old_samples,
+                                           coefs,
+                                           dct_length)
+                    Word16 *new_samples;           
+                    Word16 *old_samples;           
+                    Word16 *coefs;                 
+                    Word16 dct_length;
+
+ Description: Convert samples to MLT coefficients
+
+ Design Notes:
+
+ WMOPS:     7kHz |    24kbit    |     32kbit
+          -------|--------------|----------------
+            AVG  |    1.40      |     1.40
+          -------|--------------|----------------  
+            MAX  |    1.40      |     1.40
+          -------|--------------|---------------- 
+				
+           14kHz |    24kbit    |     32kbit     |     48kbit
+          -------|--------------|----------------|----------------
+            AVG  |    3.07      |     3.07       |     3.07
+          -------|--------------|----------------|----------------
+            MAX  |    3.10      |     3.10       |     3.10
+          -------|--------------|----------------|----------------
+				
+***************************************************************************/
+
+Word16 samples_to_rmlt_coefs(Word16 *new_samples,Word16 *old_samples,Word16 *coefs,Word16 dct_length)
+{
+
+    Word16	index, vals_left,mag_shift,n;
+    Word16	windowed_data[MAX_DCT_LENGTH];
+    Word16	*new_ptr, *old_ptr, *sam_low, *sam_high;
+    Word16	*win_low, *win_high;
+    Word16	*dst_ptr;
+    Word16  neg_win_low;
+    Word16  samp_high;
+    Word16  half_dct_size;
+    
+    Word32	acca;
+    Word32	accb;
+    Word16	temp;
+    Word16	temp1;
+    Word16	temp2;
+    Word16	temp5;
+   
+    half_dct_size = shr(dct_length,1);
+   
+    /*++++++++++++++++++++++++++++++++++++++++++++*/
+    /* Get the first half of the windowed samples */
+    /*++++++++++++++++++++++++++++++++++++++++++++*/
+    
+    dst_ptr  = windowed_data;
+    move16();
+    
+    /* address arithmetic */
+    test();
+    if (dct_length==DCT_LENGTH)
+    {
+        win_high = samples_to_rmlt_window + half_dct_size;
+    }
+    else
+    {
+        win_high = max_samples_to_rmlt_window + half_dct_size;
+    }
+    
+    win_low  = win_high;
+    move16();
+    
+    /* address arithmetic */
+    sam_high = old_samples + half_dct_size;
+    
+    sam_low  = sam_high;
+    move16();
+    
+    for (vals_left = half_dct_size;vals_left > 0;vals_left--)
+    {
+        acca = 0L;
+        move32();
+        
+        acca = L_mac(acca,*--win_low, *--sam_low);
+        acca = L_mac(acca,*win_high++, *sam_high++);
+        temp = round(acca); 
+        
+        *dst_ptr++ = temp;
+        move16();
+    }           
+    
+    /*+++++++++++++++++++++++++++++++++++++++++++++*/
+    /* Get the second half of the windowed samples */
+    /*+++++++++++++++++++++++++++++++++++++++++++++*/
+    
+    sam_low  = new_samples;
+    move16();
+
+    /* address arithmetic */
+    sam_high = new_samples + dct_length;
+    
+    for (vals_left = half_dct_size;    vals_left > 0;    vals_left--)
+    {
+        acca = 0L;
+        move32();
+
+        acca = L_mac(acca,*--win_high, *sam_low++);
+        neg_win_low = negate(*win_low++);
+        samp_high = *--sam_high;
+        acca = L_mac(acca, neg_win_low, samp_high);
+        temp = round(acca); 
+        
+        *dst_ptr++=temp;
+        move16();
+    }
+       
+    /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+    /* Save the new samples for next time, when they will be the old samples */
+    /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+    
+    new_ptr = new_samples;
+    move16();
+
+    old_ptr = old_samples;
+    move16();
+
+    for (vals_left = dct_length;vals_left > 0;vals_left--)
+    {
+        *old_ptr++ = *new_ptr++;
+        move16();
+    }
+    
+    /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+    /* Calculate how many bits to shift up the input to the DCT.             */
+    /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+    
+    temp1=0;
+    move16();
+
+    for(index=0;index<dct_length;index++)
+    {
+        temp2 = abs_s(windowed_data[index]);
+        temp = sub(temp2,temp1);
+        test();
+        if(temp > 0)
+        {
+            move16();
+            temp1 = temp2;
+        }
+    }
+    
+    mag_shift=0;
+    move16();
+
+    temp = sub(temp1,14000);
+    test();
+    if (temp >= 0)
+    {
+        mag_shift = 0;
+        move16();
+    }
+    else
+    {
+        temp = sub(temp1,438);
+        test();
+        if(temp < 0)
+            temp = add(temp1,1);
+        else 
+        {
+            temp = temp1;
+            move16();
+        }
+        accb = L_mult(temp,9587);
+        acca = L_shr(accb,20);
+        temp5 = extract_l(acca);
+        temp = norm_s(temp5);
+        test();
+        if (temp == 0)
+        {
+            mag_shift = 9;
+            move16();
+        }
+        else
+            mag_shift = sub(temp,6);
+        
+    }
+
+    acca = 0L;
+    move32();
+    for(index=0; index<dct_length; index++)
+    {
+        temp = abs_s( windowed_data[index]);
+        acca = L_add(acca,temp);
+    }
+    
+    acca = L_shr(acca,7);
+    
+    test();
+    if (temp1 < acca)
+    {
+        mag_shift = sub(mag_shift,1);
+    }
+
+    test();
+    if (mag_shift > 0) 
+    {
+        for(index=0;index<dct_length;index++)
+        {
+            windowed_data[index] = shl(windowed_data[index],mag_shift);
+        }
+    }
+    else 
+    {
+        test();
+        if (mag_shift < 0) 
+        {
+            n = negate(mag_shift);
+            for(index=0;index<dct_length;index++)
+            {
+                windowed_data[index] = shr(windowed_data[index],n);
+                move16();
+            }
+        }
+    }
+
+    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+    /* Perform a Type IV DCT on the windowed data to get the coefficients */
+    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+
+    dct_type_iv_a(windowed_data, coefs, dct_length);
+
+    return(mag_shift);
+}