| /* ------------------------------------------------------------------ |
| * Copyright (C) 1998-2009 PacketVideo |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
| * express or implied. |
| * See the License for the specific language governing permissions |
| * and limitations under the License. |
| * ------------------------------------------------------------------- |
| */ |
| /**************************************************************************************** |
| Portions of this file are derived from the following 3GPP standard: |
| |
| 3GPP TS 26.073 |
| ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec |
| Available from http://www.3gpp.org |
| |
| (C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) |
| Permission to distribute, modify and use this file under the standard license |
| terms listed above has been obtained from the copyright holder. |
| ****************************************************************************************/ |
| /* |
| ------------------------------------------------------------------------------ |
| |
| |
| |
| Pathname: ./audio/gsm-amr/c/src/c8_31pf.c |
| Functions: |
| |
| Date: 05/26/2000 |
| |
| ------------------------------------------------------------------------------ |
| REVISION HISTORY |
| |
| Description: Modified to pass overflow flag through to basic math function. |
| The flag is passed back to the calling function by pointer reference. |
| |
| Description: Optimized file to reduce clock cycle usage. Updated copyright |
| year. Removed unnecessary include files and unused #defines. |
| |
| Description: Changed round function name to pv_round to avoid conflict with |
| round function in C standard library. |
| |
| Description: Replaced "int" and/or "char" with OSCL defined types. |
| |
| Description: |
| |
| ------------------------------------------------------------------------------ |
| MODULE DESCRIPTION |
| |
| Purpose : Searches a 31 bit algebraic codebook containing |
| : 8 pulses in a frame of 40 samples. |
| : in the same manner as GSM-EFR |
| ------------------------------------------------------------------------------ |
| */ |
| |
| /*---------------------------------------------------------------------------- |
| ; INCLUDES |
| ----------------------------------------------------------------------------*/ |
| #include "c8_31pf.h" |
| #include "typedef.h" |
| #include "cnst.h" |
| #include "inv_sqrt.h" |
| #include "cor_h.h" |
| #include "cor_h_x2.h" |
| #include "set_sign.h" |
| #include "s10_8pf.h" |
| #include "basic_op.h" |
| |
| /*---------------------------------------------------------------------------- |
| ; MACROS |
| ; Define module specific macros here |
| ----------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| ; DEFINES |
| ; Include all pre-processor statements here. Include conditional |
| ; compile variables also. |
| ----------------------------------------------------------------------------*/ |
| #define NB_PULSE 8 |
| |
| /* define values/representation for output codevector and sign */ |
| #define POS_CODE 8191 |
| #define NEG_CODE 8191 |
| #define POS_SIGN 32767 |
| #define NEG_SIGN (Word16) (-32768L) |
| |
| /*---------------------------------------------------------------------------- |
| ; LOCAL FUNCTION DEFINITIONS |
| ; Function Prototype declaration |
| ----------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| ; LOCAL VARIABLE DEFINITIONS |
| ; Variable declaration - defined here and used outside this module |
| ----------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES |
| ; Declare variables used in this module but defined elsewhere |
| ----------------------------------------------------------------------------*/ |
| |
| /* |
| ------------------------------------------------------------------------------ |
| FUNCTION NAME: |
| ------------------------------------------------------------------------------ |
| INPUT AND OUTPUT DEFINITIONS |
| |
| Inputs: |
| codvec[] Array of type Word16 -- position of pulses |
| sign[] Array of type Word16 -- sign of pulses |
| h[] Array of type Word16 -- impulse response of |
| weighted synthesis filter |
| Outputs: |
| cod[] Array of type Word16 -- innovative code vector |
| y[] Array of type Word16 -- filtered innovative code |
| sign_indx[] Array of type Word16 -- signs of 4 pulses (signs only) |
| pos_indx[] Array of type Word16 -- |
| position index of 8 pulses(position only) |
| |
| pOverflow Pointer to Flag -- set when overflow occurs |
| |
| Returns: |
| indx |
| |
| Global Variables Used: |
| None |
| |
| Local Variables Needed: |
| |
| ------------------------------------------------------------------------------ |
| FUNCTION DESCRIPTION |
| |
| |
| ------------------------------------------------------------------------------ |
| REQUIREMENTS |
| |
| None |
| |
| ------------------------------------------------------------------------------ |
| REFERENCES |
| |
| [1] c8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 |
| |
| ------------------------------------------------------------------------------ |
| PSEUDO-CODE |
| |
| ------------------------------------------------------------------------------ |
| RESOURCES USED [optional] |
| |
| When the code is written for a specific target processor the |
| the resources used should be documented below. |
| |
| HEAP MEMORY USED: x bytes |
| |
| STACK MEMORY USED: x bytes |
| |
| CLOCK CYCLES: (cycle count equation for this function) + (variable |
| used to represent cycle count for each subroutine |
| called) |
| where: (cycle count variable) = cycle count for [subroutine |
| name] |
| |
| ------------------------------------------------------------------------------ |
| CAUTION [optional] |
| [State any special notes, constraints or cautions for users of this function] |
| |
| ------------------------------------------------------------------------------ |
| */ |
| |
| /************************************************************************* |
| * |
| * FUNCTION: build_code() |
| * |
| * PURPOSE: Builds the codeword, the filtered codeword and a |
| * linear uncombined version of the index of the |
| * codevector, based on the signs and positions of 8 pulses. |
| * |
| *************************************************************************/ |
| |
| static void build_code( |
| Word16 codvec[], /* i : position of pulses */ |
| Word16 sign[], /* i : sign of d[n] */ |
| Word16 cod[], /* o : innovative code vector */ |
| Word16 h[], /* i : impulse response of weighted synthesis filter*/ |
| Word16 y[], /* o : filtered innovative code */ |
| Word16 sign_indx[], /* o : signs of 4 pulses (signs only) */ |
| Word16 pos_indx[], /* o : position index of 8 pulses(position only) */ |
| Flag * pOverflow /* o : Flag set when overflow occurs */ |
| ) |
| { |
| Word16 i; |
| Word16 j; |
| Word16 k; |
| Word16 track; |
| Word16 sign_index; |
| Word16 pos_index; |
| Word16 _sign[NB_PULSE]; |
| |
| Word16 *p0; |
| Word16 *p1; |
| Word16 *p2; |
| Word16 *p3; |
| Word16 *p4; |
| Word16 *p5; |
| Word16 *p6; |
| Word16 *p7; |
| |
| Word16 *p_cod = &cod[0]; |
| Word16 *p_codvec = &codvec[0]; |
| |
| Word32 s; |
| |
| for (i = 0; i < L_CODE; i++) |
| { |
| *(p_cod++) = 0; |
| } |
| |
| for (i = 0; i < NB_TRACK_MR102; i++) |
| { |
| pos_indx[i] = -1; |
| sign_indx[i] = -1; |
| } |
| |
| for (k = 0; k < NB_PULSE; k++) |
| { |
| /* read pulse position */ |
| i = codvec[k]; |
| /* read sign */ |
| j = sign[i]; |
| |
| pos_index = i >> 2; /* index = pos/4 */ |
| |
| track = i & 3; /* track = pos%4 */ |
| |
| if (j > 0) |
| { |
| cod[i] = (Word16)((Word32) cod[i] + POS_CODE); |
| |
| _sign[k] = POS_SIGN; |
| sign_index = 0; /* bit=0 -> positive pulse */ |
| } |
| else |
| { |
| cod[i] = (Word16)((Word32) cod[i] - NEG_CODE); |
| |
| _sign[k] = NEG_SIGN; |
| sign_index = 1; /* bit=1 => negative pulse */ |
| /* index = add (index, 8); 1 = negative old code */ |
| } |
| |
| if (pos_indx[track] < 0) |
| { /* first set first NB_TRACK pulses */ |
| pos_indx[track] = pos_index; |
| sign_indx[track] = sign_index; |
| } |
| else |
| { /* 2nd row of pulses , test if positions needs to be switched */ |
| if (((sign_index ^ sign_indx[track]) & 1) == 0) |
| { |
| /* sign of 1st pulse == sign of 2nd pulse */ |
| |
| if (pos_indx[track] <= pos_index) |
| { /* no swap */ |
| pos_indx[track + NB_TRACK_MR102] = pos_index; |
| } |
| else |
| { /* swap*/ |
| pos_indx[track + NB_TRACK_MR102] = pos_indx[track]; |
| |
| pos_indx[track] = pos_index; |
| sign_indx[track] = sign_index; |
| } |
| } |
| else |
| { |
| /* sign of 1st pulse != sign of 2nd pulse */ |
| |
| if (pos_indx[track] <= pos_index) |
| { /*swap*/ |
| pos_indx[track + NB_TRACK_MR102] = pos_indx[track]; |
| |
| pos_indx[track] = pos_index; |
| sign_indx[track] = sign_index; |
| } |
| else |
| { /*no swap */ |
| pos_indx[track + NB_TRACK_MR102] = pos_index; |
| } |
| } |
| } |
| } |
| |
| p0 = h - *(p_codvec++); |
| p1 = h - *(p_codvec++); |
| p2 = h - *(p_codvec++); |
| p3 = h - *(p_codvec++); |
| p4 = h - *(p_codvec++); |
| p5 = h - *(p_codvec++); |
| p6 = h - *(p_codvec++); |
| p7 = h - *(p_codvec); |
| |
| for (i = 0; i < L_CODE; i++) |
| { |
| s = 0; |
| |
| s = |
| L_mac( |
| s, |
| *p0++, |
| _sign[0], |
| pOverflow); |
| s = |
| L_mac( |
| s, |
| *p1++, |
| _sign[1], |
| pOverflow); |
| s = |
| L_mac( |
| s, |
| *p2++, |
| _sign[2], |
| pOverflow); |
| s = |
| L_mac( |
| s, |
| *p3++, |
| _sign[3], |
| pOverflow); |
| s = |
| L_mac( |
| s, |
| *p4++, |
| _sign[4], |
| pOverflow); |
| s = |
| L_mac( |
| s, |
| *p5++, |
| _sign[5], |
| pOverflow); |
| s = |
| L_mac( |
| s, |
| *p6++, |
| _sign[6], |
| pOverflow); |
| s = |
| L_mac( |
| s, |
| *p7++, |
| _sign[7], |
| pOverflow); |
| |
| y[i] = |
| pv_round( |
| s, |
| pOverflow); |
| |
| } /* for (i = 0; i < L_CODE; i++) */ |
| |
| } /* build_code */ |
| |
| /****************************************************************************/ |
| |
| /* |
| ------------------------------------------------------------------------------ |
| FUNCTION NAME: compress_code() |
| ------------------------------------------------------------------------------ |
| INPUT AND OUTPUT DEFINITIONS |
| |
| Inputs: |
| |
| Outputs: |
| |
| Returns: |
| None |
| |
| Global Variables Used: |
| None |
| |
| Local Variables Needed: |
| |
| ------------------------------------------------------------------------------ |
| FUNCTION DESCRIPTION |
| |
| FUNCTION: |
| |
| PURPOSE: compression of three indeces [0..9] to one 10 bit index |
| minimizing the phase shift of a bit error. |
| |
| ------------------------------------------------------------------------------ |
| REQUIREMENTS |
| |
| None |
| |
| ------------------------------------------------------------------------------ |
| REFERENCES |
| |
| [1] c8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 |
| |
| ------------------------------------------------------------------------------ |
| PSEUDO-CODE |
| |
| ------------------------------------------------------------------------------ |
| RESOURCES USED [optional] |
| |
| When the code is written for a specific target processor the |
| the resources used should be documented below. |
| |
| HEAP MEMORY USED: x bytes |
| |
| STACK MEMORY USED: x bytes |
| |
| CLOCK CYCLES: (cycle count equation for this function) + (variable |
| used to represent cycle count for each subroutine |
| called) |
| where: (cycle count variable) = cycle count for [subroutine |
| name] |
| |
| ------------------------------------------------------------------------------ |
| CAUTION [optional] |
| [State any special notes, constraints or cautions for users of this function] |
| |
| ------------------------------------------------------------------------------ |
| */ |
| |
| static Word16 compress10( |
| Word16 pos_indxA, /* i : signs of 4 pulses (signs only) */ |
| Word16 pos_indxB, /* i : position index of 8 pulses (pos only) */ |
| Word16 pos_indxC, /* i : position and sign of 8 pulses (compressed) */ |
| Flag *pOverflow) /* o : Flag set when overflow occurs */ |
| { |
| Word16 indx; |
| Word16 ia; |
| Word16 ib; |
| Word16 ic; |
| |
| Word32 tempWord32; |
| |
| OSCL_UNUSED_ARG(pOverflow); |
| |
| ia = pos_indxA >> 1; |
| |
| ib = pos_indxB >> 1; |
| |
| tempWord32 = ((Word32) ib * 5) << 1; |
| |
| tempWord32 = tempWord32 >> 1; |
| |
| ib = (Word16) tempWord32; |
| |
| ic = pos_indxC >> 1; |
| |
| tempWord32 = ((Word32) ic * 25) << 1; |
| |
| tempWord32 = tempWord32 >> 1; |
| |
| ic = (Word16) tempWord32; |
| |
| ib += ic; |
| |
| ib += ia; |
| |
| indx = ib << 3; |
| |
| ia = pos_indxA & 1; |
| |
| ib = ((Word16)(pos_indxB & 1)) << 1; |
| |
| ic = ((Word16)(pos_indxC & 1)) << 2; |
| |
| ib += ic; |
| |
| ib += ia; |
| |
| indx += ib; |
| |
| return indx; |
| |
| } |
| |
| /****************************************************************************/ |
| |
| /* |
| ------------------------------------------------------------------------------ |
| FUNCTION NAME: compress_code() |
| ------------------------------------------------------------------------------ |
| INPUT AND OUTPUT DEFINITIONS |
| |
| Inputs: |
| sign_indx Array of type Word16 -- signs of 4 pulses (signs only) |
| pos_indx Array of type Word16 -- position index of 8 pulses |
| (position only) |
| |
| Outputs: |
| indx Array of type Word16 -- position and sign of 8 pulses |
| (compressed) |
| pOverflow Pointer to Flag -- set when overflow occurs |
| |
| Returns: |
| None |
| |
| Global Variables Used: |
| None |
| |
| Local Variables Needed: |
| None |
| |
| ------------------------------------------------------------------------------ |
| FUNCTION DESCRIPTION |
| |
| PURPOSE: compression of the linear codewords to 4+three indeces |
| one bit from each pulse is made robust to errors by |
| minimizing the phase shift of a bit error. |
| 4 signs (one for each track) |
| i0,i4,i1 => one index (7+3) bits, 3 LSBs more robust |
| i2,i6,i5 => one index (7+3) bits, 3 LSBs more robust |
| i3,i7 => one index (5+2) bits, 2-3 LSbs more robust |
| |
| ------------------------------------------------------------------------------ |
| REQUIREMENTS |
| |
| None |
| |
| ------------------------------------------------------------------------------ |
| REFERENCES |
| |
| [1] c3_14pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 |
| |
| ------------------------------------------------------------------------------ |
| PSEUDO-CODE |
| |
| ------------------------------------------------------------------------------ |
| RESOURCES USED [optional] |
| |
| When the code is written for a specific target processor the |
| the resources used should be documented below. |
| |
| HEAP MEMORY USED: x bytes |
| |
| STACK MEMORY USED: x bytes |
| |
| CLOCK CYCLES: (cycle count equation for this function) + (variable |
| used to represent cycle count for each subroutine |
| called) |
| where: (cycle count variable) = cycle count for [subroutine |
| name] |
| |
| ------------------------------------------------------------------------------ |
| CAUTION [optional] |
| [State any special notes, constraints or cautions for users of this function] |
| |
| ------------------------------------------------------------------------------ |
| */ |
| |
| static void compress_code( |
| Word16 sign_indx[], /* i : signs of 4 pulses (signs only) */ |
| Word16 pos_indx[], /* i : position index of 8 pulses (position only) */ |
| Word16 indx[], /* o : position and sign of 8 pulses (compressed) */ |
| Flag *pOverflow) /* o : Flag set when overflow occurs */ |
| { |
| Word16 i; |
| Word16 ia; |
| Word16 ib; |
| Word16 ic; |
| |
| Word16 *p_indx = &indx[0]; |
| Word16 *p_sign_indx = &sign_indx[0]; |
| |
| Word32 tempWord32; |
| |
| for (i = 0; i < NB_TRACK_MR102; i++) |
| { |
| *(p_indx++) = *(p_sign_indx++); |
| } |
| |
| /* First index |
| indx[NB_TRACK] = (ia/2+(ib/2)*5 +(ic/2)*25)*8 + ia%2 + (ib%2)*2 + (ic%2)*4; */ |
| |
| indx[NB_TRACK_MR102] = |
| compress10( |
| pos_indx[0], |
| pos_indx[4], |
| pos_indx[1], |
| pOverflow); |
| |
| /* Second index |
| indx[NB_TRACK+1] = (ia/2+(ib/2)*5 +(ic/2)*25)*8 + ia%2 + (ib%2)*2 + (ic%2)*4; */ |
| |
| indx[NB_TRACK_MR102+1] = |
| compress10( |
| pos_indx[2], |
| pos_indx[6], |
| pos_indx[5], |
| pOverflow); |
| |
| /* |
| Third index |
| if ((ib/2)%2 == 1) |
| indx[NB_TRACK+2] = ((((4-ia/2) + (ib/2)*5)*32+12)/25)*4 + ia%2 + (ib%2)*2; |
| else |
| indx[NB_TRACK+2] = ((((ia/2) + (ib/2)*5)*32+12)/25)*4 + ia%2 + (ib%2)*2; |
| */ |
| |
| ib = pos_indx[7] >> 1; |
| |
| ib &= 1; |
| |
| ia = pos_indx[3] >> 1; |
| |
| if (ib == 1) |
| { |
| ia = 4 - ia; |
| } |
| |
| ib = pos_indx[7] >> 1; |
| |
| tempWord32 = ((Word32) ib * 5) << 1; |
| |
| tempWord32 = tempWord32 >> 1; |
| |
| ib = (Word16) tempWord32; |
| |
| ib += ia; |
| |
| ib <<= 5; |
| |
| ib += 12; |
| |
| ic = (Word16)(((Word32) ib * 1311) >> 15); |
| |
| ic <<= 2; |
| |
| ia = pos_indx[3] & 1; |
| |
| ib = ((Word16)(pos_indx[7] & 1)) << 1; |
| |
| ib += ic; |
| |
| ib += ia; |
| |
| indx[NB_TRACK_MR102+2] = ib; |
| |
| } /* compress_code */ |
| |
| |
| /****************************************************************************/ |
| |
| /* |
| ------------------------------------------------------------------------------ |
| FUNCTION NAME: code_8i40_31bits() |
| ------------------------------------------------------------------------------ |
| INPUT AND OUTPUT DEFINITIONS |
| |
| Inputs: |
| x Array of type Word16 -- target vector |
| cn Array of type Word16 -- residual after long term prediction |
| h Array of type Word16 -- impulse response of weighted synthesis filter |
| |
| |
| Outputs: |
| cod Array of type Word16 -- algebraic (fixed) codebook excitation |
| y Array of type Word16 -- filtered fixed codebook excitation |
| indx Array of type Word16 -- index of 8 pulses (signs+positions) |
| pOverflow Pointer to Flag -- set when overflow occurs |
| |
| Returns: |
| None |
| |
| Global Variables Used: |
| None |
| |
| Local Variables Needed: |
| None |
| |
| ------------------------------------------------------------------------------ |
| FUNCTION DESCRIPTION |
| |
| FUNCTION: |
| |
| PURPOSE: Searches a 31 bit algebraic codebook containing 8 pulses |
| in a frame of 40 samples. |
| |
| DESCRIPTION: |
| The code contains 8 nonzero pulses: i0...i7. |
| All pulses can have two possible amplitudes: +1 or -1. |
| The 40 positions in a subframe are divided into 4 tracks of |
| interleaved positions. Each track contains two pulses. |
| The pulses can have the following possible positions: |
| |
| i0, i4 : 0, 4, 8, 12, 16, 20, 24, 28, 32, 36 |
| i1, i5 : 1, 5, 9, 13, 17, 21, 25, 29, 33, 37 |
| i2, i6 : 2, 6, 10, 14, 18, 22, 26, 30, 34, 38 |
| i3, i7 : 3, 7, 11, 15, 19, 23, 27, 31, 35, 39 |
| |
| Each pair of pulses require 1 bit for their signs. The positions |
| are encoded together 3,3 and 2 resulting in |
| (7+3) + (7+3) + (5+2) bits for their |
| positions. This results in a 31 (4 sign and 27 pos) bit codebook. |
| The function determines the optimal pulse signs and positions, builds |
| the codevector, and computes the filtered codevector. |
| |
| ------------------------------------------------------------------------------ |
| REQUIREMENTS |
| |
| None |
| |
| ------------------------------------------------------------------------------ |
| REFERENCES |
| |
| [1] c8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 |
| |
| ------------------------------------------------------------------------------ |
| PSEUDO-CODE |
| |
| ------------------------------------------------------------------------------ |
| RESOURCES USED [optional] |
| |
| When the code is written for a specific target processor the |
| the resources used should be documented below. |
| |
| HEAP MEMORY USED: x bytes |
| |
| STACK MEMORY USED: x bytes |
| |
| CLOCK CYCLES: (cycle count equation for this function) + (variable |
| used to represent cycle count for each subroutine |
| called) |
| where: (cycle count variable) = cycle count for [subroutine |
| name] |
| |
| ------------------------------------------------------------------------------ |
| CAUTION [optional] |
| [State any special notes, constraints or cautions for users of this function] |
| |
| ------------------------------------------------------------------------------ |
| */ |
| void code_8i40_31bits( |
| Word16 x[], /* i : target vector */ |
| Word16 cn[], /* i : residual after long term prediction */ |
| Word16 h[], /* i : impulse response of weighted synthesis |
| filter */ |
| Word16 cod[], /* o : algebraic (fixed) codebook excitation */ |
| Word16 y[], /* o : filtered fixed codebook excitation */ |
| Word16 indx[], /* o : 7 Word16, index of 8 pulses (signs+positions) */ |
| Flag *pOverflow /* o : Flag set when overflow occurs */ |
| ) |
| { |
| Word16 ipos[NB_PULSE]; |
| Word16 pos_max[NB_TRACK_MR102]; |
| Word16 codvec[NB_PULSE]; |
| |
| Word16 dn[L_CODE]; |
| Word16 sign[L_CODE]; |
| |
| Word16 rr[L_CODE][L_CODE]; |
| Word16 linear_signs[NB_TRACK_MR102]; |
| Word16 linear_codewords[NB_PULSE]; |
| |
| cor_h_x2( |
| h, |
| x, |
| dn, |
| 2, |
| NB_TRACK_MR102, |
| STEP_MR102, |
| pOverflow); |
| |
| /* 2 = use GSMEFR scaling */ |
| |
| set_sign12k2( |
| dn, |
| cn, |
| sign, |
| pos_max, |
| NB_TRACK_MR102, |
| ipos, |
| STEP_MR102, |
| pOverflow); |
| |
| /* same setsign alg as GSM-EFR new constants though*/ |
| |
| cor_h( |
| h, |
| sign, |
| rr, |
| pOverflow); |
| |
| search_10and8i40( |
| NB_PULSE, |
| STEP_MR102, |
| NB_TRACK_MR102, |
| dn, |
| rr, |
| ipos, |
| pos_max, |
| codvec, |
| pOverflow); |
| |
| build_code( |
| codvec, |
| sign, |
| cod, |
| h, |
| y, |
| linear_signs, |
| linear_codewords, |
| pOverflow); |
| |
| compress_code( |
| linear_signs, |
| linear_codewords, |
| indx, |
| pOverflow); |
| |
| } /* code_8i40_31bits */ |
| |
| |
| |