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

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_enc.c
  12.  *
  13.  *
  14.  * Project:
  15.  *    AMR Floating-Point Codec
  16.  *
  17.  * Contains:
  18.  *    This module contains all the functions needed encoding 160
  19.  *    16-bit speech samples to AMR encoder parameters.
  20.  *
  21.  */
  22. /*
  23.  * include files
  24.  */
  25. #include <stdlib.h>
  26. #include <stdio.h>
  27. #include "hlxclib/memory.h"
  28. #include "sp_enc.h"
  29. #include "interf_rom.h"
  30. /*
  31.  * Declare structure types
  32.  */
  33. /* Declaration transmitted frame types */
  34. enum TXFrameType { TX_SPEECH_GOOD = 0,
  35.                    TX_SID_FIRST,
  36.                    TX_SID_UPDATE,
  37.                    TX_NO_DATA,
  38.                    TX_SPEECH_DEGRADED,
  39.                    TX_SPEECH_BAD,
  40.                    TX_SID_BAD,
  41.                    TX_ONSET,
  42.                    TX_N_FRAMETYPES     /* number of frame types */
  43. };
  44. /* Declaration of interface structure */
  45. typedef struct
  46. {
  47.    Word16 sid_update_counter;   /* Number of frames since last SID */
  48.    Word16 sid_handover_debt;   /* Number of extra SID_UPD frames to schedule */
  49.    Word32 dtx;
  50.    enum TXFrameType prev_ft;   /* Type of the previous frame */
  51.    void *encoderState;   /* Points encoder state structure */
  52. } enc_interface_State;
  53. #ifdef ETSI
  54. /*
  55.  * Prm2Bits
  56.  *
  57.  *
  58.  * Parameters:
  59.  *    value             I: value to be converted to binary
  60.  *    no_of_bits        I: number of bits associated with value
  61.  *    bitstream         O: address where bits are written
  62.  *
  63.  * Function:
  64.  *    Convert integer to binary and write the bits to the array.
  65.  *    The most significant bits are written first.
  66.  * Returns:
  67.  *    void
  68.  */
  69. static void Int2Bin( Word16 value, Word16 no_of_bits, Word16 *bitstream )
  70. {
  71.    Word32 i, bit;
  72.    Word16 *pt_bitstream;
  73.    pt_bitstream = &bitstream[no_of_bits];
  74.    for ( i = 0; i < no_of_bits; i++ ) {
  75.       bit = value & 0x0001;
  76.       if ( bit == 0 ) {
  77.          * --pt_bitstream = 0;
  78.       }
  79.       else {
  80.          * --pt_bitstream = 1;
  81.       }
  82.       value = ( Word16 )( value >> 1 );
  83.    }
  84. }
  85. /*
  86.  * Prm2Bits
  87.  *
  88.  *
  89.  * Parameters:
  90.  *    mode              I: AMR mode
  91.  *    prm               I: analysis parameters
  92.  *    bits              O: serial bits
  93.  *
  94.  * Function:
  95.  *    converts the encoder parameter vector into a vector of serial bits.
  96.  * Returns:
  97.  *    void
  98.  */
  99. static void Prm2Bits( enum Mode mode, Word16 prm[], Word16 bits[] )
  100. {
  101.    Word32 i;
  102.    switch ( mode ) {
  103.       case MR122:
  104.          for ( i = 0; i < PRMNO_MR122; i++ ) {
  105.             Int2Bin( prm[i], bitno_MR122[i], bits );
  106.             bits += bitno_MR122[i];
  107.          }
  108.          break;
  109.       case MR102:
  110.          for ( i = 0; i < PRMNO_MR102; i++ ) {
  111.             Int2Bin( prm[i], bitno_MR102[i], bits );
  112.             bits += bitno_MR102[i];
  113.          }
  114.          break;
  115.       case MR795:
  116.          for ( i = 0; i < PRMNO_MR795; i++ ) {
  117.             Int2Bin( prm[i], bitno_MR795[i], bits );
  118.             bits += bitno_MR795[i];
  119.          }
  120.          break;
  121.       case MR74:
  122.          for ( i = 0; i < PRMNO_MR74; i++ ) {
  123.             Int2Bin( prm[i], bitno_MR74[i], bits );
  124.             bits += bitno_MR74[i];
  125.          }
  126.          break;
  127.       case MR67:
  128.          for ( i = 0; i < PRMNO_MR67; i++ ) {
  129.             Int2Bin( prm[i], bitno_MR67[i], bits );
  130.             bits += bitno_MR67[i];
  131.          }
  132.          break;
  133.       case MR59:
  134.          for ( i = 0; i < PRMNO_MR59; i++ ) {
  135.             Int2Bin( prm[i], bitno_MR59[i], bits );
  136.             bits += bitno_MR59[i];
  137.          }
  138.          break;
  139.       case MR515:
  140.          for ( i = 0; i < PRMNO_MR515; i++ ) {
  141.             Int2Bin( prm[i], bitno_MR515[i], bits );
  142.             bits += bitno_MR515[i];
  143.          }
  144.          break;
  145.       case MR475:
  146.          for ( i = 0; i < PRMNO_MR475; i++ ) {
  147.             Int2Bin( prm[i], bitno_MR475[i], bits );
  148.             bits += bitno_MR475[i];
  149.          }
  150.          break;
  151.       case MRDTX:
  152.          for ( i = 0; i < PRMNO_MRDTX; i++ ) {
  153.             Int2Bin( prm[i], bitno_MRDTX[i], bits );
  154.             bits += bitno_MRDTX[i];
  155.          }
  156.          break;
  157.    }
  158.    return;
  159. }
  160. #else
  161. /*
  162.  * Encoder3GPP
  163.  *
  164.  *
  165.  * Parameters:
  166.  *    mode                 I: AMR mode
  167.  *    param                I: Encoder output parameters
  168.  *    stream               O: packed speech frame
  169.  *    frame_type           I: frame type (DTX)
  170.  *    speech_mode          I: speech mode (DTX)
  171.  *
  172.  * Function:
  173.  *    Pack encoder output parameters to octet structure according
  174.  *    importance table.
  175.  * Returns:
  176.  *    number of octets
  177.  */
  178. static int Encoder3GPP( enum Mode mode, Word16 *param, UWord8 *stream, enum
  179.       TXFrameType frame_type, enum Mode speech_mode )
  180. {
  181.    Word32 j = 0;
  182.    Word16 *mask;
  183.    memset(stream, 0, block_size[mode]);
  184.    if ( mode == 15 ) {
  185.       *stream = 0xF;
  186.       return 1;
  187.    }
  188.    else if ( mode == MRDTX ) {
  189.       mask = order_MRDTX;
  190.       *stream = 0x40;
  191.       for ( j = 5; j < 40; j++ ) {
  192.          if ( param[ * mask] & *( mask + 1 ) )
  193.             *stream += 0x80;
  194.          mask += 2;
  195.          if ( j % 8 )
  196.             *stream >>= 1;
  197.          else
  198.             stream++;
  199.       }
  200.       /* add SID type information */
  201.       if ( frame_type == TX_SID_UPDATE )
  202.          *stream += 0x80;
  203.       stream++;
  204.       /* speech mode indication */
  205.       *stream = ( unsigned char )speech_mode;
  206.       /* don't shift at the end of the function */
  207.       return 6;
  208.    }
  209.    else if ( mode == MR475 ) {
  210.       mask = order_MR475;
  211.       *stream = 0;
  212.       for ( j = 5; j < 100; j++ ) {
  213.          if ( param[ * mask] & *( mask + 1 ) )
  214.             *stream += 0x80;
  215.          mask += 2;
  216.          if ( j % 8 )
  217.             *stream >>= 1;
  218.          else
  219.             stream++;
  220.       }
  221.    }
  222.    else if ( mode == MR515 ) {
  223.       mask = order_MR515;
  224.       *stream = 0x8;
  225.       for ( j = 5; j < 108; j++ ) {
  226.          if ( param[ * mask] & *( mask + 1 ) )
  227.             *stream += 0x80;
  228.          mask += 2;
  229.          if ( j % 8 )
  230.             *stream >>= 1;
  231.          else
  232.             stream++;
  233.       }
  234.    }
  235.    else if ( mode == MR59 ) {
  236.       mask = order_MR59;
  237.       *stream = 0x10;
  238.       for ( j = 5; j < 123; j++ ) {
  239.          if ( param[ * mask] & *( mask + 1 ) )
  240.             *stream += 0x80;
  241.          mask += 2;
  242.          if ( j % 8 )
  243.             *stream >>= 1;
  244.          else
  245.             stream++;
  246.       }
  247.    }
  248.    else if ( mode == MR67 ) {
  249.       mask = order_MR67;
  250.       *stream = 0x18;
  251.       for ( j = 5; j < 139; j++ ) {
  252.          if ( param[ * mask] & *( mask + 1 ) )
  253.             *stream += 0x80;
  254.          mask += 2;
  255.          if ( j % 8 )
  256.             *stream >>= 1;
  257.          else
  258.             stream++;
  259.       }
  260.    }
  261.    else if ( mode == MR74 ) {
  262.       mask = order_MR74;
  263.       *stream = 0x20;
  264.       for ( j = 5; j < 153; j++ ) {
  265.          if ( param[ * mask] & *( mask + 1 ) )
  266.             *stream += 0x80;
  267.          mask += 2;
  268.          if ( j % 8 )
  269.             *stream >>= 1;
  270.          else
  271.             stream++;
  272.       }
  273.    }
  274.    else if ( mode == MR795 ) {
  275.       mask = order_MR795;
  276.       *stream = 0x28;
  277.       for ( j = 5; j < 164; j++ ) {
  278.          if ( param[ * mask] & *( mask + 1 ) )
  279.             *stream += 0x80;
  280.          mask += 2;
  281.          if ( j % 8 )
  282.             *stream >>= 1;
  283.          else
  284.             stream++;
  285.       }
  286.    }
  287.    else if ( mode == MR102 ) {
  288.       mask = order_MR102;
  289.       *stream = 0x30;
  290.       for ( j = 5; j < 209; j++ ) {
  291.          if ( param[ * mask] & *( mask + 1 ) )
  292.             *stream += 0x80;
  293.          mask += 2;
  294.          if ( j % 8 )
  295.             *stream >>= 1;
  296.          else
  297.             stream++;
  298.       }
  299.    }
  300.    else if ( mode == MR122 ) {
  301.       mask = order_MR122;
  302.       *stream = 0x38;
  303.       for ( j = 5; j < 249; j++ ) {
  304.          if ( param[ * mask] & *( mask + 1 ) )
  305.             *stream += 0x80;
  306.          mask += 2;
  307.          if ( j % 8 )
  308.             *stream >>= 1;
  309.          else
  310.             stream++;
  311.       }
  312.    }
  313.    /* shift remaining bits */
  314.    *stream >>= ( 8 - j % 8 );
  315.    return( (int)block_size[mode] );
  316. }
  317. #endif
  318. /*
  319.  * Sid_Sync_reset
  320.  *
  321.  *
  322.  * Parameters:
  323.  *    st                O: state structure
  324.  *
  325.  * Function:
  326.  *    Initializes state memory
  327.  *
  328.  * Returns:
  329.  *    void
  330.  */
  331. static void Sid_Sync_reset( enc_interface_State *st )
  332. {
  333.    st->sid_update_counter = 3;
  334.    st->sid_handover_debt = 0;
  335.    st->prev_ft = TX_SPEECH_GOOD;
  336. }
  337. /*
  338.  * Encoder_Interface_Encode
  339.  *
  340.  *
  341.  * Parameters:
  342.  *    st                I: pointer to state structure
  343.  *    mode              I: Speech Mode
  344.  *    speech            I: Input speech
  345.  *    serial            O: Output octet structure 3GPP or
  346.  *                         ETSI serial stream
  347.  *    force_speech      I: Force speech in DTX
  348.  *
  349.  * Function:
  350.  *    Encoding and packing one frame of speech
  351.  *
  352.  * Returns:
  353.  *    number of octets
  354.  */
  355. int Encoder_Interface_Encode( void *st, enum Mode mode, Word16 *speech,
  356. #ifndef ETSI
  357.       UWord8 *serial,
  358. #else
  359.       Word16 *serial,
  360. #endif
  361.       int force_speech )
  362. {
  363.    Word16 prm[PRMNO_MR122];   /* speech parameters, max size */
  364.    const Word16 *homing;   /* pointer to homing frame */
  365.    Word16 homing_size;   /* frame size for homing frame */
  366.    enc_interface_State * s;
  367.    enum TXFrameType txFrameType;   /* frame type */
  368.    int i, noHoming = 0;
  369.    /*
  370.     * used encoder mode,
  371.     * if used_mode == -1, force VAD on
  372.     */
  373.    enum Mode used_mode = -force_speech;
  374.    s = ( enc_interface_State * )st;
  375.     /*
  376.      * Checks if all samples of the input frame matches the encoder
  377.      * homing frame pattern, which is 0x0008 for all samples.
  378.      */
  379.    for ( i = 0; i < 160; i++ ) {
  380.       noHoming = speech[i] ^ 0x0008;
  381.       if ( noHoming )
  382.          break;
  383.    }
  384.    if (noHoming){
  385.       Speech_Encode_Frame( s->encoderState, mode, speech, prm, &used_mode );
  386.    }
  387.    else {
  388.       switch ( mode ) {
  389.          case MR122:
  390.             homing = dhf_MR122;
  391.             homing_size = 18;
  392.             break;
  393.          case MR102:
  394.             homing = dhf_MR102;
  395.             homing_size = 12;
  396.             break;
  397.          case MR795:
  398.             homing = dhf_MR795;
  399.             homing_size = 8;
  400.             break;
  401.          case MR74:
  402.             homing = dhf_MR74;
  403.             homing_size = 7;
  404.             break;
  405.          case MR67:
  406.             homing = dhf_MR67;
  407.             homing_size = 7;
  408.             break;
  409.          case MR59:
  410.             homing = dhf_MR59;
  411.             homing_size = 7;
  412.             break;
  413.          case MR515:
  414.             homing = dhf_MR515;
  415.             homing_size = 7;
  416.             break;
  417.          case MR475:
  418.             homing = dhf_MR475;
  419.             homing_size = 7;
  420.             break;
  421.          default:
  422.             homing = NULL;
  423.             homing_size = 0;
  424.             break;
  425.       }
  426.       for( i = 0; i < homing_size; i++){
  427.          prm[i] = homing[i];
  428.       }
  429.       /* rest of the parameters are zero */
  430.       memset(&prm[homing_size], 0, (PRMNO_MR122 - homing_size) << 1);
  431.       used_mode = mode;
  432.    }
  433.    if ( used_mode == MRDTX ) {
  434.       s->sid_update_counter--;
  435.       if ( s->prev_ft == TX_SPEECH_GOOD ) {
  436.          txFrameType = TX_SID_FIRST;
  437.          s->sid_update_counter = 3;
  438.       }
  439.       else {
  440.          /* TX_SID_UPDATE or TX_NO_DATA */
  441.          if ( ( s->sid_handover_debt > 0 ) && ( s->sid_update_counter > 2 ) ) {
  442.               /*
  443.                * ensure extra updates are properly delayed after
  444.                * a possible SID_FIRST
  445.                */
  446.             txFrameType = TX_SID_UPDATE;
  447.             s->sid_handover_debt--;
  448.          }
  449.          else {
  450.             if ( s->sid_update_counter == 0 ) {
  451.                txFrameType = TX_SID_UPDATE;
  452.                s->sid_update_counter = 8;
  453.             }
  454.             else {
  455.                txFrameType = TX_NO_DATA;
  456.                used_mode = 15;
  457.             }
  458.          }
  459.       }
  460.    }
  461.    else {
  462.       s->sid_update_counter = 8;
  463.       txFrameType = TX_SPEECH_GOOD;
  464.    }
  465.    s->prev_ft = txFrameType;
  466.    if ( noHoming == 0 ) {
  467.       Speech_Encode_Frame_reset( s->encoderState, s->dtx );
  468.       Sid_Sync_reset( s );
  469.    }
  470. #ifndef ETSI
  471.    return Encoder3GPP( used_mode, prm, serial, txFrameType, mode );
  472. #else
  473.    Prm2Bits( used_mode, prm, &serial[1] );
  474.    serial[0] = ( Word16 )txFrameType;
  475.    serial[245] = ( Word16 )mode;
  476.    return 500;
  477. #endif
  478. }
  479. /*
  480.  * Encoder_Interface_init
  481.  *
  482.  *
  483.  * Parameters:
  484.  *    dtx               I: DTX flag
  485.  *
  486.  * Function:
  487.  *    Allocates state memory and initializes state memory
  488.  *
  489.  * Returns:
  490.  *    pointer to encoder interface structure
  491.  */
  492. void * Encoder_Interface_init( int dtx )
  493. {
  494.    enc_interface_State * s;
  495.    /* allocate memory */
  496.    if ( ( s = ( enc_interface_State * ) malloc( sizeof( enc_interface_State ) ) ) ==
  497.          NULL ) {
  498.       fprintf( stderr, "Encoder_Interface_init: "
  499.             "can not malloc state structuren" );
  500.       return NULL;
  501.    }
  502.    s->encoderState = Speech_Encode_Frame_init( dtx );
  503.    Sid_Sync_reset( s );
  504.    s->dtx = dtx;
  505.    return s;
  506. }
  507. /*
  508.  * DecoderInterfaceExit
  509.  *
  510.  *
  511.  * Parameters:
  512.  *    state             I: state structure
  513.  *
  514.  * Function:
  515.  *    The memory used for state memory is freed
  516.  *
  517.  * Returns:
  518.  *    Void
  519.  */
  520. void Encoder_Interface_exit( void *state )
  521. {
  522.    enc_interface_State * s;
  523.    s = ( enc_interface_State * )state;
  524.    /* free memory */
  525.    Speech_Encode_Frame_exit( &s->encoderState );
  526.    free( s );
  527.    state = NULL;
  528. }