interf_dec.c
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:15k
源码类别:

Symbian

开发平台:

Visual C++

  1. /*
  2.  * ===================================================================
  3.  *  TS 26.104
  4.  *  R99   V3.4.0 2002-02
  5.  *  REL-4 V4.3.0 2002-02
  6.  *  3GPP AMR Floating-point Speech Codec
  7.  * ===================================================================
  8.  *
  9.  */
  10. /*
  11.  * interf_dec.c
  12.  *
  13.  *
  14.  * Project:
  15.  *     AMR Floating-Point Codec
  16.  *
  17.  * Contains:
  18.  *    This module provides means to conversion from 3GPP or ETSI
  19.  *    bitstream to AMR parameters
  20.  */
  21. /*
  22.  * include files
  23.  */
  24. #include "hlxclib/stdlib.h"
  25. #include "hlxclib/stdio.h"
  26. #include "hlxclib/memory.h"
  27. #include "typedef.h"
  28. #include "sp_dec.h"
  29. #include "interf_rom.h"
  30. #include "rom_dec.h"
  31. #include "interf_dec.h"
  32. /*
  33.  * definition of constants
  34.  */
  35. #define EHF_MASK 0x0008 /* encoder homing frame pattern */
  36. typedef
  37. struct
  38. {
  39.    int reset_flag_old;   /* previous was homing frame */
  40.    enum RXFrameType prev_ft;   /* previous frame type */
  41.    enum Mode prev_mode;   /* previous mode */
  42.    void *decoder_State;   /* Points decoder state */
  43. }dec_interface_State;
  44. #ifdef ETSI
  45. /*
  46.  * Bin2Int
  47.  *
  48.  *
  49.  * Parameters:
  50.  *    no_of_bits        I: number of bits associated with value
  51.  *    bits              O: address where bits are written
  52.  *
  53.  * Function:
  54.  *    Read nuber of bits from the array and convert to integer.
  55.  *
  56.  * Returns:
  57.  *    value
  58.  */
  59. static Word16 Bin2Int( Word16 no_of_bits, Word16 *bitstream )
  60. {
  61.    Word32 value, i, bit;
  62.    value = 0;
  63.    for ( i = 0; i < no_of_bits; i++ ) {
  64.       value = value << 1;
  65.       bit = *bitstream++;
  66.       if ( bit == 0x1 )
  67.          value = value + 1;
  68.    }
  69.    return( Word16 )( value );
  70. }
  71. /*
  72.  * Bits2Prm
  73.  *
  74.  *
  75.  * Parameters:
  76.  *    mode              I: AMR mode
  77.  *    bits              I: serial bits
  78.  *    param             O: AMR parameters
  79.  *
  80.  * Function:
  81.  *    Retrieves the vector of encoder parameters from
  82.  *    the received serial bits in a frame.
  83.  *
  84.  * Returns:
  85.  *    void
  86.  */
  87. static void Bits2Prm( enum Mode mode, Word16 bits[], Word16 prm[] )
  88. {
  89.    Word32 i;
  90.    switch ( mode ) {
  91.       case MR122:
  92.          for ( i = 0; i < PRMNO_MR122; i++ ) {
  93.             prm[i] = Bin2Int( bitno_MR122[i], bits );
  94.             bits += bitno_MR122[i];
  95.          }
  96.          break;
  97.       case MR102:
  98.          for ( i = 0; i < PRMNO_MR102; i++ ) {
  99.             prm[i] = Bin2Int( bitno_MR102[i], bits );
  100.             bits += bitno_MR102[i];
  101.          }
  102.          break;
  103.       case MR795:
  104.          for ( i = 0; i < PRMNO_MR795; i++ ) {
  105.             prm[i] = Bin2Int( bitno_MR795[i], bits );
  106.             bits += bitno_MR795[i];
  107.          }
  108.          break;
  109.       case MR74:
  110.          for ( i = 0; i < PRMNO_MR74; i++ ) {
  111.             prm[i] = Bin2Int( bitno_MR74[i], bits );
  112.             bits += bitno_MR74[i];
  113.          }
  114.          break;
  115.       case MR67:
  116.          for ( i = 0; i < PRMNO_MR67; i++ ) {
  117.             prm[i] = Bin2Int( bitno_MR67[i], bits );
  118.             bits += bitno_MR67[i];
  119.          }
  120.          break;
  121.       case MR59:
  122.          for ( i = 0; i < PRMNO_MR59; i++ ) {
  123.             prm[i] = Bin2Int( bitno_MR59[i], bits );
  124.             bits += bitno_MR59[i];
  125.          }
  126.          break;
  127.       case MR515:
  128.          for ( i = 0; i < PRMNO_MR515; i++ ) {
  129.             prm[i] = Bin2Int( bitno_MR515[i], bits );
  130.             bits += bitno_MR515[i];
  131.          }
  132.          break;
  133.       case MR475:
  134.          for ( i = 0; i < PRMNO_MR475; i++ ) {
  135.             prm[i] = Bin2Int( bitno_MR475[i], bits );
  136.             bits += bitno_MR475[i];
  137.          }
  138.          break;
  139.       case MRDTX:
  140.          for ( i = 0; i < PRMNO_MRDTX; i++ ) {
  141.             prm[i] = Bin2Int( bitno_MRDTX[i], bits );
  142.             bits += bitno_MRDTX[i];
  143.          }
  144.          break;
  145.    }
  146.    return;
  147. }
  148. #else
  149. /*
  150.  * Decoder3GPP
  151.  *
  152.  *
  153.  * Parameters:
  154.  *    param             O: AMR parameters
  155.  *    stream            I: input bitstream
  156.  *    frame_type        O: frame type
  157.  *    speech_mode       O: speech mode in DTX
  158.  *
  159.  * Function:
  160.  *    Resets state memory
  161.  *
  162.  * Returns:
  163.  *    mode              used mode
  164.  */
  165. enum Mode Decoder3GPP( Word16 *param, UWord8 *stream, enum RXFrameType
  166.                       *frame_type, enum Mode *speech_mode )
  167. {
  168.    enum Mode mode;
  169.    Word32 j;
  170.    Word16 *mask;
  171.    memset( param, 0, PRMNO_MR122 <<1 );
  172.    mode = (enum Mode) (0xF & *stream);
  173.    *stream >>= 4;
  174.    if ( mode == MRDTX ) {
  175.       mask = (Word16*) order_MRDTX;
  176.       for ( j = 5; j < 40; j++ ) {
  177.          if ( *stream & 0x1 )
  178.             param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
  179.          mask += 2;
  180.          if ( j % 8 )
  181.             *stream >>= 1;
  182.          else
  183.             stream++;
  184.       }
  185.       /* get SID type bit */
  186.       *frame_type = RX_SID_FIRST;
  187.       if (*stream)
  188.          *frame_type = RX_SID_UPDATE;
  189.       /* since there is update, use it */
  190.       /* *frame_type = RX_SID_UPDATE; */
  191.       stream++;
  192.       /* speech mode indicator */
  193.       *speech_mode = (enum Mode) *stream;
  194.    }
  195.    else if ( mode == 15 ) {
  196.       *frame_type = RX_NO_DATA;
  197.    }
  198.    else if ( mode == MR475 ) {
  199.       mask = (Word16*) order_MR475;
  200.       for ( j = 5; j < 100; j++ ) {
  201.          if ( *stream & 0x1 )
  202.             param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
  203.          mask += 2;
  204.          if ( j % 8 )
  205.             *stream >>= 1;
  206.          else
  207.             stream++;
  208.       }
  209.       *frame_type = RX_SPEECH_GOOD;
  210.    }
  211.    else if ( mode == MR515 ) {
  212.       mask = (Word16*) order_MR515;
  213.       for ( j = 5; j < 108; j++ ) {
  214.          if ( *stream & 0x1 )
  215.             param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
  216.          mask += 2;
  217.          if ( j % 8 )
  218.             *stream >>= 1;
  219.          else
  220.             stream++;
  221.       }
  222.       *frame_type = RX_SPEECH_GOOD;
  223.    }
  224.    else if ( mode == MR59 ) {
  225.       mask = (Word16*) order_MR59;
  226.       for ( j = 5; j < 123; j++ ) {
  227.          if ( *stream & 0x1 )
  228.             param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
  229.          mask += 2;
  230.          if ( j % 8 )
  231.             *stream >>= 1;
  232.          else
  233.             stream++;
  234.       }
  235.       *frame_type = RX_SPEECH_GOOD;
  236.    }
  237.    else if ( mode == MR67 ) {
  238.       mask = (Word16*) order_MR67;
  239.       for ( j = 5; j < 139; j++ ) {
  240.          if ( *stream & 0x1 )
  241.             param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
  242.          mask += 2;
  243.          if ( j % 8 )
  244.             *stream >>= 1;
  245.          else
  246.             stream++;
  247.       }
  248.       *frame_type = RX_SPEECH_GOOD;
  249.    }
  250.    else if ( mode == MR74 ) {
  251.       mask = (Word16*) order_MR74;
  252.       for ( j = 5; j < 153; j++ ) {
  253.          if ( *stream & 0x1 )
  254.             param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
  255.          mask += 2;
  256.          if ( j % 8 )
  257.             *stream >>= 1;
  258.          else
  259.             stream++;
  260.       }
  261.       *frame_type = RX_SPEECH_GOOD;
  262.    }
  263.    else if ( mode == MR795 ) {
  264.       mask = (Word16*) order_MR795;
  265.       for ( j = 5; j < 164; j++ ) {
  266.          if ( *stream & 0x1 )
  267.             param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
  268.          mask += 2;
  269.          if ( j % 8 )
  270.             *stream >>= 1;
  271.          else
  272.             stream++;
  273.       }
  274.       *frame_type = RX_SPEECH_GOOD;
  275.    }
  276.    else if ( mode == MR102 ) {
  277.       mask = (Word16*) order_MR102;
  278.       for ( j = 5; j < 209; j++ ) {
  279.          if ( *stream & 0x1 )
  280.             param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
  281.          mask += 2;
  282.          if ( j % 8 )
  283.             *stream >>= 1;
  284.          else
  285.             stream++;
  286.       }
  287.       *frame_type = RX_SPEECH_GOOD;
  288.    }
  289.    else if ( mode == MR122 ) {
  290.       mask = (Word16*) order_MR122;
  291.       for ( j = 5; j < 249; j++ ) {
  292.          if ( *stream & 0x1 )
  293.             param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
  294.          mask += 2;
  295.          if ( j % 8 )
  296.             *stream >>= 1;
  297.          else
  298.             stream++;
  299.       }
  300.       *frame_type = RX_SPEECH_GOOD;
  301.    }
  302.    else
  303.       *frame_type = RX_SPEECH_BAD;
  304.    return mode;
  305. }
  306. #endif
  307. /*
  308.  * Decoder_Interface_reset
  309.  *
  310.  *
  311.  * Parameters:
  312.  *    st                O: state struct
  313.  *
  314.  * Function:
  315.  *    Reset homing frame counter
  316.  *
  317.  * Returns:
  318.  *    void
  319.  */
  320. void Decoder_Interface_reset( dec_interface_State *st )
  321. {
  322.    st->reset_flag_old = 1;
  323.    st->prev_ft = RX_SPEECH_GOOD;
  324.    st->prev_mode = MR475;   /* minimum bitrate */
  325. }
  326. /*
  327.  * Decoder_Interface_init
  328.  *
  329.  *
  330.  * Parameters:
  331.  *    void
  332.  *
  333.  * Function:
  334.  *    Allocates state memory and initializes state memory
  335.  *
  336.  * Returns:
  337.  *    success           : pointer to structure
  338.  *    failure           : NULL
  339.  */
  340. void * Decoder_Interface_init( void )
  341. {
  342.    dec_interface_State * s;
  343.    /* allocate memory */
  344.    if ( ( s = ( dec_interface_State * ) malloc( sizeof( dec_interface_State ) ) ) ==
  345.          NULL ) {
  346.       fprintf( stderr, "Decoder_Interface_init: "
  347.             "can not malloc state structuren" );
  348.       return NULL;
  349.    }
  350.    s->decoder_State = Speech_Decode_Frame_init( );
  351.    if ( s->decoder_State == NULL ) {
  352.       free( s );
  353.       return NULL;
  354.    }
  355.    Decoder_Interface_reset( s );
  356.    return s;
  357. }
  358. /*
  359.  * Decoder_Interface_exit
  360.  *
  361.  *
  362.  * Parameters:
  363.  *    state                I: state structure
  364.  *
  365.  * Function:
  366.  *    The memory used for state memory is freed
  367.  *
  368.  * Returns:
  369.  *    Void
  370.  */
  371. void Decoder_Interface_exit( void *state )
  372. {
  373.    dec_interface_State * s;
  374.    s = ( dec_interface_State * )state;
  375.    /* free memory */
  376.    Speech_Decode_Frame_exit( (void**) s->decoder_State );
  377.    free( s );
  378.    s = NULL;
  379.    state = NULL;
  380. }
  381. /*
  382.  * Decoder_Interface_Decode
  383.  *
  384.  *
  385.  * Parameters:
  386.  *    st                B: state structure
  387.  *    bits              I: bit stream
  388.  *    synth             O: synthesized speech
  389.  *    bfi               I: bad frame indicator
  390.  *
  391.  * Function:
  392.  *    Decode bit stream to synthesized speech
  393.  *
  394.  * Returns:
  395.  *    Void
  396.  */
  397. void Decoder_Interface_Decode( void *st,
  398. #ifndef ETSI
  399.       UWord8 *bits,
  400. #else
  401.       Word16 *bits,
  402. #endif
  403.       Word16 *synth, int bfi)
  404. {
  405.    enum Mode mode;   /* AMR mode */
  406. #ifndef ETSI
  407.    enum Mode speech_mode = MR475;   /* speech mode */
  408. #endif
  409.    Word16 prm[PRMNO_MR122];   /* AMR parameters */
  410.    enum RXFrameType frame_type;   /* frame type */
  411.    dec_interface_State * s;   /* pointer to structure */
  412.    const Word16 *homing;   /* pointer to homing frame */
  413.    Word16 homingSize;   /* frame size for homing frame */
  414.    Word32 i;   /* counter */
  415.    Word32 resetFlag = 1;   /* homing frame */
  416.    s = ( dec_interface_State * )st;
  417. #ifndef ETSI
  418.    /*
  419.     * extract mode information and frametype,
  420.     * octets to parameters
  421.     */
  422.    mode = Decoder3GPP( prm, bits, &frame_type, &speech_mode );
  423.    /*
  424.     * if no mode information
  425.     * guess one from the previous frame
  426.     */
  427.    if ( frame_type == RX_SPEECH_BAD ) {
  428.       if ( s->prev_ft > 3 ) {
  429.          frame_type = RX_SID_BAD;
  430.          mode = MRDTX;
  431.       }
  432.       else {
  433.          mode = s->prev_mode;
  434.       }
  435.    }
  436.    else if ( frame_type == RX_NO_DATA ) {
  437.       mode = s->prev_mode;
  438.    }
  439.    if ( bfi == 1 ) {
  440.       if ( mode < 8 ) {
  441.          frame_type = RX_SPEECH_BAD;
  442.       }
  443.       else if ( mode != 15 ) {
  444.          frame_type = RX_SID_BAD;
  445.       }
  446.    }
  447. #else
  448.    bfi = 0;
  449.    frame_type = bits[0];
  450.    switch ( frame_type ) {
  451.       case 0:
  452.          frame_type = RX_SPEECH_GOOD;
  453.          mode = bits[245];
  454.          Bits2Prm( mode, &bits[1], prm );
  455.          break;
  456.       case 1:
  457.          frame_type = RX_SID_FIRST;
  458.          mode = s->prev_mode;
  459.          break;
  460.       case 2:
  461.          frame_type = RX_SID_UPDATE;
  462.          mode = s->prev_mode;
  463.          Bits2Prm( MRDTX, &bits[1], prm );
  464.          break;
  465.       case 3:
  466.          frame_type = RX_NO_DATA;
  467.          mode = s->prev_mode;
  468.          break;
  469.    }
  470. #endif
  471.    /* test for homing frame */
  472.    if ( s->reset_flag_old == 1 ) {
  473.       switch ( mode ) {
  474.          case MR122:
  475.             homing = dhf_MR122;
  476.             homingSize = 18;
  477.             break;
  478.          case MR102:
  479.             homing = dhf_MR102;
  480.             homingSize = 12;
  481.             break;
  482.          case MR795:
  483.             homing = dhf_MR795;
  484.             homingSize = 8;
  485.             break;
  486.          case MR74:
  487.             homing = dhf_MR74;
  488.             homingSize = 7;
  489.             break;
  490.          case MR67:
  491.             homing = dhf_MR67;
  492.             homingSize = 7;
  493.             break;
  494.          case MR59:
  495.             homing = dhf_MR59;
  496.             homingSize = 7;
  497.             break;
  498.          case MR515:
  499.             homing = dhf_MR515;
  500.             homingSize = 7;
  501.             break;
  502.          case MR475:
  503.             homing = dhf_MR475;
  504.             homingSize = 7;
  505.             break;
  506.          default:
  507.             homing = NULL;
  508.             homingSize = 0;
  509.             break;
  510.       }
  511.       for ( i = 0; i < homingSize; i++ ) {
  512.          resetFlag = prm[i] ^ homing[i];
  513.          if ( resetFlag )
  514.             break;
  515.       }
  516.    }
  517.    if ( ( resetFlag == 0 ) && ( s->reset_flag_old != 0 ) ) {
  518.       for ( i = 0; i < 160; i++ ) {
  519.          synth[i] = EHF_MASK;
  520.       }
  521.    }
  522.    else
  523.       Speech_Decode_Frame( s->decoder_State, mode, prm, frame_type, synth );
  524.    if ( s->reset_flag_old == 0 ) {
  525.       /* check whole frame */
  526.       switch ( mode ) {
  527.          case MR122:
  528.             homing = dhf_MR122;
  529.             homingSize = PRMNO_MR122;
  530.             break;
  531.          case MR102:
  532.             homing = dhf_MR102;
  533.             homingSize = PRMNO_MR102;
  534.             break;
  535.          case MR795:
  536.             homing = dhf_MR795;
  537.             homingSize = PRMNO_MR795;
  538.             break;
  539.          case MR74:
  540.             homing = dhf_MR74;
  541.             homingSize = PRMNO_MR74;
  542.             break;
  543.          case MR67:
  544.             homing = dhf_MR67;
  545.             homingSize = PRMNO_MR67;
  546.             break;
  547.          case MR59:
  548.             homing = dhf_MR59;
  549.             homingSize = PRMNO_MR59;
  550.             break;
  551.          case MR515:
  552.             homing = dhf_MR515;
  553.             homingSize = PRMNO_MR515;
  554.             break;
  555.          case MR475:
  556.             homing = dhf_MR475;
  557.             homingSize = PRMNO_MR475;
  558.             break;
  559.          default:
  560.             homing = NULL;
  561.             homingSize = 0;
  562.       }
  563.       for ( i = 0; i < homingSize; i++ ) {
  564.          resetFlag = prm[i] ^ homing[i];
  565.          if ( resetFlag )
  566.             break;
  567.       }
  568.    }
  569.    /* reset decoder if current frame is a homing frame */
  570.    if ( resetFlag == 0 ) {
  571.       Speech_Decode_Frame_reset( (void**) s->decoder_State );
  572.    }
  573.    s->reset_flag_old = !resetFlag;
  574.    s->prev_ft = frame_type;
  575.    s->prev_mode = mode;
  576. }