⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interf_dec.c

📁 mpeg4 video codec mpeg4 video codec
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * =================================================================== *  TS 26.104 *  R99   V3.5.0 2003-03 *  REL-4 V4.4.0 2003-03 *  REL-5 V5.1.0 2003-03 *  3GPP AMR Floating-point Speech Codec * =================================================================== * *//* * interf_dec.c * * * Project: *     AMR Floating-Point Codec * * Contains: *    This module provides means to conversion from 3GPP or ETSI *    bitstream to AMR parameters *//* * include files */#include <stdlib.h>#include <stdio.h>#include <memory.h>#include "typedef.h"#include "sp_dec.h"#include "interf_rom.h"#include "rom_dec.h"/* * definition of constants */#define EHF_MASK 0x0008 /* encoder homing frame pattern */typedefstruct{   int reset_flag_old;   /* previous was homing frame */   enum RXFrameType prev_ft;   /* previous frame type */   enum Mode prev_mode;   /* previous mode */   void *decoder_State;   /* Points decoder state */}dec_interface_State;#ifdef ETSI/* * Bin2Int * * * Parameters: *    no_of_bits        I: number of bits associated with value *    bits              O: address where bits are written * * Function: *    Read nuber of bits from the array and convert to integer. * * Returns: *    value */static Word16 Bin2Int( Word16 no_of_bits, Word16 *bitstream ){   Word32 value, i, bit;   value = 0;   for ( i = 0; i < no_of_bits; i++ ) {      value = value << 1;      bit = *bitstream++;      if ( bit == 0x1 )         value = value + 1;   }   return( Word16 )( value );}/* * Bits2Prm * * * Parameters: *    mode              I: AMR mode *    bits              I: serial bits *    param             O: AMR parameters * * Function: *    Retrieves the vector of encoder parameters from *    the received serial bits in a frame. * * Returns: *    void */static void Bits2Prm( enum Mode mode, Word16 bits[], Word16 prm[] ){   Word32 i;   switch ( mode ) {      case MR122:         for ( i = 0; i < PRMNO_MR122; i++ ) {            prm[i] = Bin2Int( bitno_MR122[i], bits );            bits += bitno_MR122[i];         }         break;      case MR102:         for ( i = 0; i < PRMNO_MR102; i++ ) {            prm[i] = Bin2Int( bitno_MR102[i], bits );            bits += bitno_MR102[i];         }         break;      case MR795:         for ( i = 0; i < PRMNO_MR795; i++ ) {            prm[i] = Bin2Int( bitno_MR795[i], bits );            bits += bitno_MR795[i];         }         break;      case MR74:         for ( i = 0; i < PRMNO_MR74; i++ ) {            prm[i] = Bin2Int( bitno_MR74[i], bits );            bits += bitno_MR74[i];         }         break;      case MR67:         for ( i = 0; i < PRMNO_MR67; i++ ) {            prm[i] = Bin2Int( bitno_MR67[i], bits );            bits += bitno_MR67[i];         }         break;      case MR59:         for ( i = 0; i < PRMNO_MR59; i++ ) {            prm[i] = Bin2Int( bitno_MR59[i], bits );            bits += bitno_MR59[i];         }         break;      case MR515:         for ( i = 0; i < PRMNO_MR515; i++ ) {            prm[i] = Bin2Int( bitno_MR515[i], bits );            bits += bitno_MR515[i];         }         break;      case MR475:         for ( i = 0; i < PRMNO_MR475; i++ ) {            prm[i] = Bin2Int( bitno_MR475[i], bits );            bits += bitno_MR475[i];         }         break;      case MRDTX:         for ( i = 0; i < PRMNO_MRDTX; i++ ) {            prm[i] = Bin2Int( bitno_MRDTX[i], bits );            bits += bitno_MRDTX[i];         }         break;   }   return;}#else#ifndef IF2/* * DecoderMMS * * * Parameters: *    param             O: AMR parameters *    stream            I: input bitstream *    frame_type        O: frame type *    speech_mode       O: speech mode in DTX * * Function: *    AMR file storage format frame to decoder parameters * * Returns: *    mode              used mode */enum Mode DecoderMMS( Word16 *param, UWord8 *stream, enum RXFrameType                      *frame_type, enum Mode *speech_mode, Word16 *q_bit ){   enum Mode mode;   Word32 j;   Word16 *mask;   memset( param, 0, PRMNO_MR122 <<1 );   *q_bit = 0x01 & (*stream >> 2);   mode = 0x0F & (*stream >> 3);   stream++;   if ( mode == MRDTX ) {      mask = order_MRDTX;      for ( j = 1; j < 36; j++ ) {         if ( *stream & 0x80 )            param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );         mask += 2;         if ( j % 8 )            *stream <<= 1;         else            stream++;      }      /* get SID type bit */      *frame_type = RX_SID_FIRST;      if (*stream & 0x80)         *frame_type = RX_SID_UPDATE;      /* since there is update, use it */      /* *frame_type = RX_SID_UPDATE; */      /* speech mode indicator */	  *speech_mode = (*stream >> 4) && 0x07;   }   else if ( mode == 15 ) {      *frame_type = RX_NO_DATA;   }   else if ( mode == MR475 ) {      mask = order_MR475;      for ( j = 1; j < 96; j++ ) {         if ( *stream & 0x80 )            param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );         mask += 2;         if ( j % 8 )            *stream <<= 1;         else            stream++;      }      *frame_type = RX_SPEECH_GOOD;   }   else if ( mode == MR515 ) {      mask = order_MR515;      for ( j = 1; j < 104; j++ ) {         if ( *stream & 0x80 )            param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );         mask += 2;         if ( j % 8 )            *stream <<= 1;         else            stream++;      }      *frame_type = RX_SPEECH_GOOD;   }   else if ( mode == MR59 ) {      mask = order_MR59;      for ( j = 1; j < 119; j++ ) {         if ( *stream & 0x80 )            param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );         mask += 2;         if ( j % 8 )            *stream <<= 1;         else            stream++;      }      *frame_type = RX_SPEECH_GOOD;   }   else if ( mode == MR67 ) {      mask = order_MR67;      for ( j = 1; j < 135; j++ ) {         if ( *stream & 0x80 )            param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );         mask += 2;         if ( j % 8 )            *stream <<= 1;         else            stream++;      }      *frame_type = RX_SPEECH_GOOD;   }   else if ( mode == MR74 ) {      mask = order_MR74;      for ( j = 1; j < 149; j++ ) {         if ( *stream & 0x80 )            param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );         mask += 2;         if ( j % 8 )            *stream <<= 1;         else            stream++;      }      *frame_type = RX_SPEECH_GOOD;   }   else if ( mode == MR795 ) {      mask = order_MR795;      for ( j = 1; j < 160; j++ ) {         if ( *stream & 0x80 )            param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );         mask += 2;         if ( j % 8 )            *stream <<= 1;         else            stream++;      }      *frame_type = RX_SPEECH_GOOD;   }   else if ( mode == MR102 ) {      mask = order_MR102;      for ( j = 1; j < 205; j++ ) {         if ( *stream & 0x80 )            param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );         mask += 2;         if ( j % 8 )            *stream <<= 1;         else            stream++;      }      *frame_type = RX_SPEECH_GOOD;   }   else if ( mode == MR122 ) {      mask = order_MR122;      for ( j = 1; j < 245; j++ ) {         if ( *stream & 0x80 )            param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );         mask += 2;         if ( j % 8 )            *stream <<= 1;         else            stream++;      }      *frame_type = RX_SPEECH_GOOD;   }   else      *frame_type = RX_SPEECH_BAD;   return mode;}#else/* * Decoder3GPP * * * Parameters: *    param             O: AMR parameters *    stream            I: input bitstream *    frame_type        O: frame type *    speech_mode       O: speech mode in DTX * * Function: *    Resets state memory * * Returns: *    mode              used mode */enum Mode Decoder3GPP( Word16 *param, UWord8 *stream, enum RXFrameType                      *frame_type, enum Mode *speech_mode ){   enum Mode mode;   Word32 j;   Word16 *mask;   memset( param, 0, PRMNO_MR122 <<1 );   mode = 0xF & *stream;   *stream >>= 4;   if ( mode == MRDTX ) {      mask = order_MRDTX;      for ( j = 5; j < 40; j++ ) {         if ( *stream & 0x1 )            param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );         mask += 2;         if ( j % 8 )            *stream >>= 1;         else            stream++;      }      /* get SID type bit */      *frame_type = RX_SID_FIRST;      if (*stream)         *frame_type = RX_SID_UPDATE;      /* since there is update, use it */      /* *frame_type = RX_SID_UPDATE; */      stream++;      /* speech mode indicator */      *speech_mode = *stream;   }   else if ( mode == 15 ) {      *frame_type = RX_NO_DATA;   }   else if ( mode == MR475 ) {      mask = order_MR475;      for ( j = 5; j < 100; j++ ) {         if ( *stream & 0x1 )            param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );         mask += 2;         if ( j % 8 )            *stream >>= 1;         else            stream++;      }      *frame_type = RX_SPEECH_GOOD;   }   else if ( mode == MR515 ) {      mask = order_MR515;      for ( j = 5; j < 108; j++ ) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -