dec_lpc.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:27k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**********************************************************************
  2. MPEG-4 Audio VM
  3. Decoder core (LPC-based)
  4. This software module was originally developed by
  5. Heiko Purnhagen (University of Hannover)
  6. Naoya Tanaka (Matsushita Communication Industrial Co., Ltd.)
  7. Rakesh Taori, Andy Gerrits (Philips Research Laboratories, Eindhoven, The Netherlands),
  8. Toshiyuki Nomura (NEC Corporation)
  9. and edited by
  10. in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard
  11. ISO/IEC 13818-7, 14496-1,2 and 3. This software module is an
  12. implementation of a part of one or more MPEG-2 NBC/MPEG-4 Audio tools
  13. as specified by the MPEG-2 NBC/MPEG-4 Audio standard. ISO/IEC gives
  14. users of the MPEG-2 NBC/MPEG-4 Audio standards free license to this
  15. software module or modifications thereof for use in hardware or
  16. software products claiming conformance to the MPEG-2 NBC/ MPEG-4 Audio
  17. standards. Those intending to use this software module in hardware or
  18. software products are advised that this use may infringe existing
  19. patents. The original developer of this software module and his/her
  20. company, the subsequent editors and their companies, and ISO/IEC have
  21. no liability for use of this software module or modifications thereof
  22. in an implementation. Copyright is not released for non MPEG-2
  23. NBC/MPEG-4 Audio conforming products. The original developer retains
  24. full right to use the code for his/her own purpose, assign or donate
  25. the code to a third party and to inhibit third party from using the
  26. code for non MPEG-2 NBC/MPEG-4 Audio conforming products. This
  27. copyright notice must be included in all copies or derivative works.
  28. Copyright (c) 1996.
  29. Source file: dec_lpc.c
  30. $Id: dec_lpc.c,v 1.4 2002/06/13 22:50:35 wmay Exp $
  31. Required modules:
  32. common.o        common module
  33. cmdline.o        command line module
  34. bitstream.o        bits stream module
  35. Authors:
  36. HP    Heiko Purnhagen, Uni Hannover <purnhage@tnt.uni-hannover.de>
  37. NT    Naoya Tanaka, Panasonic <natanaka@telecom.mci.mei.co.jp>
  38. AG    Andy Gerrits, Philips <gerritsa@natlab.research.philips.com>
  39. PD    Paul Dillen, Philips Consumer Electronics
  40. TN    Toshiyuki Nomura, NEC <t-nomura@dsp.cl.nec.co.jp>
  41. RF    Ralf Funken, Philips <ralf.funken@ehv.ce.philips.com>
  42. Changes:
  43. 24-jun-96   HP    dummy core
  44. 15-aug-96   HP    adapted to new dec.h
  45. 26-aug-96   HP    CVS
  46. 04-Sep-96   NT    LPC Core Ver. 1.11
  47. 26-Sep-96   AG    adapted for PHILIPS
  48. 25-oct-96   HP    joined Panasonic and Philips LPC frameworks
  49.                   made function names unique
  50.                     e.g.: abs_lpc_decode() -> PAN_abs_lpc_decode()
  51.                     NOTE: pan_xxx() and PAN_xxx() are different functions!
  52.   I changed the PAN (and not the PHI) function names
  53.                   just because thus less files had to be modified ...
  54. 28-oct-96   HP    added auto-select for pan/phi lpc modes
  55. 08-Nov-96   NT    Narrowband LPC Ver.2.00
  56.                     - replaced synthesis filter module with Philips module
  57.                     - I/Fs revision for common I/Fs with Philips modules
  58. 15-nov-96   HP    adapted to new bitstream module
  59. 26-nov-96   AG    changed abs_xxx() to celp_xxx()
  60. 27-Feb-97   TN    adapted to rate control functionality
  61. 27-Mar-97   AG    new functionalities for decoder added
  62. 18-Mar-98   PD    Philips private data (for multi-instance) added
  63. **********************************************************************/
  64. /* =====================================================================*/
  65. /* Standard Includes                                                    */
  66. /* =====================================================================*/
  67. #include <stdio.h>
  68. #include <stdlib.h>
  69. #include <string.h>
  70. /* =====================================================================*/
  71. /* MPEG-4 VM Includes                                                   */
  72. /* =====================================================================*/
  73. #include "block.h"               /* handler, defines, enums */
  74. #include "buffersHandle.h"       /* handler, defines, enums */
  75. #include "concealmentHandle.h"   /* handler, defines, enums */
  76. #include "interface.h"           /* handler, defines, enums */
  77. #include "mod_bufHandle.h"       /* handler, defines, enums */
  78. #include "reorderspecHandle.h"   /* handler, defines, enums */
  79. #include "resilienceHandle.h"    /* handler, defines, enums */
  80. #include "tf_mainHandle.h"       /* handler, defines, enums */
  81. #include "lpc_common.h"          /* structs */
  82. #include "nok_ltp_common.h"      /* structs */
  83. #include "obj_descr.h"           /* structs */
  84. #include "tf_mainStruct.h"       /* structs */
  85. #include "common_m4a.h"        /* common module                             */
  86. #include "cmdline.h"       /* command line module                       */
  87. #include "bitstream.h"     /* bit stream module                         */
  88. #include "lpc_common.h"
  89. #include "dec_lpc.h"           /* decoder cores                             */
  90. #include "mp4_lpc.h"       /* common lpc defs                           */
  91. /* =====================================================================*/
  92. /* PHILIPS Includes                                                     */
  93. /* =====================================================================*/
  94. #include "phi_cons.h"
  95. #include "celp_decoder.h"
  96. /* =====================================================================*/
  97. /* Panasonic Includes                                                   */
  98. /* =====================================================================*/
  99. #include "celp_proto_dec.h"
  100. #include "pan_celp_const.h"
  101. /* =====================================================================*/
  102. /* NEC Includes                                                         */
  103. /* =====================================================================*/
  104. #include "nec_abs_const.h"
  105. /* =====================================================================*/
  106. /* L O C A L     S Y M B O L     D E C L A R A T I O N S                */
  107. /* =====================================================================*/
  108. #define PROGVER "CELP-based decoder core V5.0 13-nov-97"
  109. #define SEPACHAR " ,="
  110. /* =====================================================================*/
  111. /* L O C A L     D A T A      D E C L A R A T I O N S                   */
  112. /* =====================================================================*/
  113. /* configuration inputs                                                 */
  114. /* =====================================================================*/
  115. extern int samplFreqIndex[]; /* undesired, but ... */
  116. /*
  117. Table 5.2   CELP coder (Mode II) configuration for 8 kHz sampling rate 
  118. MPE_Configuration | Frame_size (#samples) | nrof_subframes | sbfrm_size (#samples) 
  119. 0,1,2        320          4   80 
  120. 3,4,5        240          3   80 
  121. 6 ... 12     160          2   80  
  122. 13 ... 21    160          4   40 
  123. 22 ... 26    80           2   40 
  124. 27           240          4   60 
  125. 28 ... 31 Reserved
  126. */
  127. #if 0
  128. static int MPE_Table[]={
  129.   320,/*0 */
  130.   320,/*1 */
  131.   320,/*2 */
  132.   240,/*3 */
  133.   240,/*4 */
  134.   240,/*5 */
  135.   160,/*6 */
  136.   160,/*7*/
  137.   160,/*8 */
  138.   160,/*9 */
  139.   160,/*10 */
  140.   160,/*11 */
  141.   160,/*12 */
  142.   160,/*13 */
  143.   160,/*14 */
  144.   160,/*15 */
  145.   160,/*16 */
  146.   160,/*17 */
  147.   160,/*18 */
  148.   160,/*19 */
  149.   160,/*20 */
  150.   160,/*21 */
  151.   80,/*22 */
  152.   80,/*23 */
  153.   80,/*24 */
  154.   80,/*25 */
  155.   80,/*26 */
  156.   240,/*27*/
  157.   0,0,0,0,0,0,0,0,0,0,0
  158. };
  159. #endif
  160. static long bit_rate;
  161. static long sampling_frequency;
  162. static long frame_size;
  163. static long n_subframes;
  164. static long sbfrm_size;
  165. static long lpc_order;
  166. static long num_lpc_indices;
  167. static long num_shape_cbks;
  168. static long num_gain_cbks;
  169. static long *org_frame_bit_allocation;    
  170. static long SampleRateMode     = 1;  /* Default: 16 kHz */
  171. static long QuantizationMode   = 1;  /* Default: Vector Quantizer */
  172. static long FineRateControl    = 0;  /* Default: FineRateControl is OFF */
  173. static long LosslessCodingMode = 0;  /* Default: Lossless coding is OFF */
  174. static long RPE_configuration;
  175. static long Wideband_VQ = Optimized_VQ;
  176. static long MPE_Configuration;
  177. static long NumEnhLayers;
  178. static long BandwidthScalabilityMode;
  179. static long BWS_configuration;
  180. static long reduced_order = 0;
  181. static long complexity_level = 0;
  182. static long PostFilterSW;
  183. static long ExcitationMode;
  184. extern int CELPdecDebugLevel; /* HP 971120 */
  185. static long  DecEnhStage;
  186. static long  DecBwsMode;
  187. static int  dummysw;
  188. static int sysFlag;
  189. static CmdLineSwitch switchList[] = {
  190.   {"h",NULL,NULL,NULL,NULL,"print help"},
  191.   {"lpc_n",&DecEnhStage,"%d","0",NULL,NULL},
  192.   {"lpc_b",&DecBwsMode,"%d","0",NULL,NULL},
  193.   {"lpc_p",&PostFilterSW,"%d","0",NULL,NULL},
  194.   {"lpc_d",&CELPdecDebugLevel,"%d","0",NULL,"debug level"},
  195.   {"-celp_sys",&sysFlag,NULL,NULL,NULL,"use system interface(flexmux)"},
  196. /* to make celp ignor aac scalable switches in case of celp + aac decoding" */
  197.   {"-mp4ff",&dummysw,NULL,NULL,NULL,"do nothing"}, 
  198.   {"-out",&dummysw,"%d",NULL,NULL,"do nothing"},
  199.   {NULL,NULL,NULL,NULL,NULL,NULL}
  200. };
  201. /* =====================================================================*/
  202. /* instance context                                                     */
  203. /* =====================================================================*/
  204. static void *InstanceContext; /*handle to one instance context */
  205. /* =====================================================================*/
  206. /* L O C A L    F U N C T I O N      D E F I N I T I O N S              */
  207. /* =====================================================================*/
  208. /* ---------------------------------------------------------------------*/
  209. /* DecLpcInfo()                                                         */
  210. /* Get info about LPC-based decoder core.                               */
  211. /* ---------------------------------------------------------------------*/
  212. char *DecLpcInfo (
  213.   FILE *helpStream)       /* in: print decPara help text to helpStream */
  214.                           /*     if helpStream not NULL                */
  215.                           /* returns: core version string              */
  216. {
  217.   if (helpStream != NULL)
  218.   {
  219.     fprintf(helpStream, "--------------------------------------------------------n");
  220.     fprintf(helpStream, PROGVER "n");
  221.     fprintf(helpStream, "Usage: mp4dec -c "<options>" <name bitstream file>n");
  222.     fprintf(helpStream, "       where <options> are:n");
  223.     fprintf(helpStream, "             n <DecEnhStage> : Decoded number of enhancement layers (0, 1, 2, 3)n");
  224.     fprintf(helpStream, "             b <0/1>         : Decoding NarrowBand speech (0) or WideBand speech (1)n");
  225.     fprintf(helpStream, "             p <0/1>         : Post filter OFF (0) or ON (1). Default: OFFn");
  226.     fprintf(helpStream, "             -celp_sys       : use system interface(flexmux)n");
  227.     fprintf(helpStream, "             d <0/1>         : Debug Level OFF (0) or ON (1). Default: OFFn");
  228.     fprintf(helpStream, "--------------------------------------------------------n");
  229.   }
  230.   return PROGVER;
  231. }
  232. /* ------------------------------------------------------------------- */
  233. /* DecLpcInit()                                                        */
  234. /* Init LPC-based decoder core.                                        */
  235. /* ------------------------------------------------------------------- */
  236. void DecLpcInit (
  237.   int numChannel,                  /* in: num audio channels           */
  238.   float fSample,                   /* in: sampling frequency [Hz]      */
  239.   float bitRate,                   /* in: total bit rate [bit/sec]     */
  240.   char *decPara,                   /* in: decoder parameter string     */
  241.   BsBitBuffer *bitHeader,          /* in: header from bit stream       */
  242.   int *frameNumSample,             /* out: num samples per frame       */
  243.   int *delayNumSample)             /* out: decoder delay (num samples) */
  244. {
  245.   BsBitStream *hdrStream;
  246.   int parac;
  247.   char **parav;
  248.   int result;
  249.   int mp4ffFlag    =0;
  250.   SampleRateMode     = 1;  /* Default: 16 kHz */
  251.   QuantizationMode   = 1;  /* Default: Vector Quantizer */
  252.   FineRateControl    = 0;  /* Default: FineRateControl is OFF */
  253.   LosslessCodingMode = 0;  /* Default: Lossless coding is OFF */
  254.   Wideband_VQ = Optimized_VQ;
  255.   reduced_order = 0;
  256.   complexity_level = 0;
  257.   InstanceContext = NULL;
  258.   bit_rate = 0;
  259.  sampling_frequency = 0;
  260.  frame_size = 0;
  261.  n_subframes = 0;
  262.  sbfrm_size = 0;
  263.  lpc_order = 0;
  264.  num_lpc_indices = 0;
  265.  num_shape_cbks = 0;
  266.  num_gain_cbks = 0;
  267.  org_frame_bit_allocation = NULL;   
  268.  RPE_configuration = 0;
  269.  MPE_Configuration = 0;
  270.  NumEnhLayers = 0;
  271.  BandwidthScalabilityMode = 0;
  272.  BWS_configuration = 0;
  273.  PostFilterSW = 0;
  274.  ExcitationMode = 0;
  275.   DecEnhStage = 0;
  276.    DecBwsMode = 0;
  277.   dummysw = 0;
  278.  sysFlag = 0;
  279.   if (numChannel != 1 ) 
  280.   {
  281.     CommonExit(1,"EncLpcInit: Multi-channel audio input is not supported");
  282.   }
  283.   
  284.   /* evalute decoder parameter string */
  285.   parav = CmdLineParseString(decPara,SEPACHAR,&parac);
  286.   result = CmdLineEval(parac,parav,NULL,switchList,1,NULL);
  287.   if (result) 
  288.   {
  289.     if (result==1) 
  290. {
  291.   DecLpcInfo(stdout);
  292.   exit (1);
  293.     }
  294.     else {
  295.       
  296.       CommonExit(1,"Decoder parameter string error");
  297.     }
  298.   }  
  299.   if ( (ExcitationMode == MultiPulseExc) && (SampleRateMode==fs16kHz) ) {
  300.     Wideband_VQ = Optimized_VQ;
  301.   }
  302.   /* -------------------------------------------------------------------*/
  303.   /* Memory allocation                                                  */
  304.   /* -------------------------------------------------------------------*/
  305.   hdrStream = BsOpenBufferRead(bitHeader);
  306.   /* ---------------------------------------------------------------- */
  307.   /* Conversion of parameters from float to longs                     */
  308.   /* ---------------------------------------------------------------- */
  309.   bit_rate           = (long)(bitRate+.5);
  310.   sampling_frequency = (long)(fSample+.5);
  311.   /* ---------------------------------------------------------------- */
  312.   /* Decoder Initialisation                                           */
  313.   /* ---------------------------------------------------------------- */
  314.   celp_initialisation_decoder(
  315.       hdrStream, bit_rate, complexity_level, reduced_order, DecEnhStage, DecBwsMode, PostFilterSW, &frame_size, &n_subframes, &sbfrm_size,
  316.       &lpc_order,&num_lpc_indices,&num_shape_cbks,&num_gain_cbks,&org_frame_bit_allocation,
  317.       &ExcitationMode,
  318.   &SampleRateMode, &QuantizationMode, &FineRateControl, &LosslessCodingMode, &RPE_configuration, 
  319.   &Wideband_VQ, &MPE_Configuration, &NumEnhLayers, &BandwidthScalabilityMode, &BWS_configuration,
  320.   &InstanceContext,mp4ffFlag);
  321.   *frameNumSample = frame_size;
  322.   *delayNumSample = 0;
  323.   BsClose(hdrStream);
  324. }
  325. void DecLpcInitNew (
  326.   char *decPara,                   /* in: decoder parameter string     */
  327.   FRAME_DATA*  fD,
  328.   LPC_DATA*    lpcData,
  329.   int layer
  330.   )             /* out: decoder delay (num samples) */
  331. {
  332.   int parac;
  333.   char **parav;
  334.   int result;
  335.   int numChannel;
  336. #if 0
  337.   int MPE_conf;
  338. #endif
  339.   double frameLengthTime;
  340. #if 0
  341.   BsBitBuffer *bitHeader;
  342. #endif
  343.   BsBitStream *hdrStream=NULL;
  344.   AUDIO_SPECIFIC_CONFIG* audSpC ;
  345.   int mp4ffFlag    =1;
  346.   
  347.   lpcData->coreBitBuf = BsAllocBuffer( 4000 );      /* just some large number. For G729 required: 160 */
  348.   if((lpcData->sampleBuf=(float**)(malloc(1 * sizeof (float*) )))==NULL) 
  349.     CommonExit(1, "Memory allocation error in enc_lpc");
  350.   if((lpcData->sampleBuf[0] =(float*)malloc(sizeof(float)*1024))==NULL)     
  351.     CommonExit(1, "Memory allocation error in enc_lpc");
  352.   audSpC = &fD->od->ESDescriptor[layer]->DecConfigDescr.audioSpecificConfig;
  353. #if 0
  354.   bitHeader=NULL;
  355. #endif
  356.     
  357.   switch (audSpC->channelConfiguration.value) {
  358.   case 1 :numChannel=1;       
  359.     break;
  360.   default: CommonExit(1,"wrong channel config");
  361.   }
  362.   
  363.   /* evalute decoder parameter string */
  364.   parav = CmdLineParseString(decPara,SEPACHAR,&parac);
  365.   result = CmdLineEval(parac,parav,NULL,switchList,1,NULL);
  366.   if (result==1) 
  367.     {
  368.       DecLpcInfo(stdout);
  369.       exit (1);
  370.     }
  371.   if (strstr(decPara, "-celp_sys") != NULL) 
  372.     sysFlag = 1;
  373.   if ( (ExcitationMode == MultiPulseExc) && (SampleRateMode==fs16kHz) ) {
  374.     Wideband_VQ = Optimized_VQ;
  375.   }
  376. #if 0
  377.   /* -------------------------------------------------------------------*/
  378.   /* Memory allocation                                                  */
  379.   /* -------------------------------------------------------------------*/
  380.   if (bitHeader != NULL)
  381.     hdrStream = BsOpenBufferRead(bitHeader);
  382.   /* ---------------------------------------------------------------- */
  383.   /* Conversion of parameters from float to longs                     */
  384.   /* ---------------------------------------------------------------- */
  385.   bit_rate           = (long)(fD->od->ESDescriptor[layer]->DecConfigDescr.avgBitrate.value +.5);
  386.   sampling_frequency = (long)(samplFreqIndex[
  387.                                              fD->od->ESDescriptor[layer]->DecConfigDescr.audioSpecificConfig.samplingFreqencyIndex.value]+.5);
  388.   if (sampling_frequency==7350) {
  389.     sampling_frequency=8000;
  390.   }
  391.   
  392.   MPE_conf=fD->od->ESDescriptor[0]->DecConfigDescr
  393.        .audioSpecificConfig.specConf.celpSpecificConfig.MPE_Configuration.value;
  394.   lpcData->frameNumSample=MPE_Table[MPE_conf];
  395.   frameLengthTime=(double)lpcData->frameNumSample/(double)sampling_frequency;
  396.   lpcData->bitsPerFrame = (int)(bit_rate*frameLengthTime);     
  397. #endif
  398.   if (mp4ffFlag==1) {
  399.     int layer=0; 
  400.     CELP_SPECIFIC_CONFIG *celpConf=
  401.       &fD->od->ESDescriptor[layer]->DecConfigDescr.audioSpecificConfig.specConf.celpSpecificConfig;
  402.     
  403.     ExcitationMode           =   celpConf->excitationMode.value ;
  404.     SampleRateMode           =   celpConf->sampleRateMode.value ;
  405.     FineRateControl          =   celpConf->fineRateControl.value;
  406.     RPE_configuration        =   celpConf->RPE_Configuration.value;
  407.     MPE_Configuration        =   celpConf->MPE_Configuration.value ;
  408.     NumEnhLayers             =   celpConf->numEnhLayers.value;
  409.     BandwidthScalabilityMode =   celpConf->bandwidthScalabilityMode.value;
  410.     /* celp enhancement layer is not yet supported */
  411.     BWS_configuration       =   0; /*  in celpConf of celp enhancement layer */
  412.     if ( NumEnhLayers != 0 || BandwidthScalabilityMode != 0 ) {
  413.       CommonExit(1,"celp enhancement layer is not yet supported");
  414.     }
  415.   }
  416.   /* ---------------------------------------------------------------- */
  417.   /* Decoder Initialisation                                           */
  418.   /* ---------------------------------------------------------------- */
  419.   celp_initialisation_decoder(
  420.                               hdrStream, 
  421.                               bit_rate, 
  422.                               complexity_level, 
  423.                               reduced_order, 
  424.                               DecEnhStage, 
  425.                               DecBwsMode, 
  426.                               PostFilterSW, 
  427.                               &frame_size, 
  428.                               &n_subframes, 
  429.                               &sbfrm_size,
  430.                               &lpc_order,
  431.                               &num_lpc_indices,
  432.                               &num_shape_cbks,
  433.                               &num_gain_cbks,
  434.                               &org_frame_bit_allocation,
  435.                               &ExcitationMode,
  436.                               &SampleRateMode, 
  437.                               &QuantizationMode, 
  438.                               &FineRateControl, 
  439.                               &LosslessCodingMode, 
  440.                               &RPE_configuration, 
  441.                               &Wideband_VQ, 
  442.                               &MPE_Configuration, 
  443.                               &NumEnhLayers, 
  444.                               &BandwidthScalabilityMode, 
  445.                               &BWS_configuration,
  446.                               &InstanceContext,
  447.                               mp4ffFlag);
  448.   
  449.   lpcData->frameNumSample = frame_size;
  450.   lpcData->delayNumSample = 0;
  451.   bit_rate           = (long)(fD->od->ESDescriptor[layer]->DecConfigDescr.avgBitrate.value +.5);
  452.   sampling_frequency = (long)(samplFreqIndex[
  453.                                              fD->od->ESDescriptor[layer]->DecConfigDescr.audioSpecificConfig.samplingFreqencyIndex.value]+.5);
  454.   if (sampling_frequency==7350) {
  455.     sampling_frequency=8000;
  456.   }
  457.   
  458.   frameLengthTime=(double)lpcData->frameNumSample/(double)sampling_frequency;
  459.   lpcData->bitsPerFrame = (int)(bit_rate*frameLengthTime);     
  460. /*   free(lpcData->p_bitstream); we use the memory in DecLpcFrameNew*/
  461. }
  462. /* ------------------------------------------------------------------- */
  463. /* DecLpcFrame()                                                       */
  464. /* Decode one bit stream frame into one audio frame with               */
  465. /* LPC-based decoder core.                                             */
  466. /* ------------------------------------------------------------------- */
  467. void DecLpcFrame (
  468.   BsBitBuffer *bitBuf,    /* in: bit stream frame                      */
  469.   float **sampleBuf,      /* out: audio frame samples                  */
  470.                           /*     sampleBuf[numChannel][frameNumSample] */
  471.   int *usedNumBit)        /* out: num bits used for this frame         */
  472. {
  473.   /* ----------------------------------------------------------------- */
  474.   /* Memory allocation                                                 */
  475.   /* ----------------------------------------------------------------- */
  476.   BsBitStream *bitStream = BsOpenBufferRead(bitBuf);
  477. //printf("nframe sizen=%d",frame_size);
  478. //printf("nsub frame sizen=%d",sbfrm_size);
  479. //printf("n n_subframesn=%d",n_subframes);
  480.   /* ----------------------------------------------------------------- */
  481.   /*Call Decoder                                                       */
  482.   /* ----------------------------------------------------------------- */
  483.   celp_decoder( bitStream, sampleBuf,
  484.        ExcitationMode,
  485.   SampleRateMode, QuantizationMode, FineRateControl, LosslessCodingMode,
  486.   RPE_configuration, Wideband_VQ, MPE_Configuration, NumEnhLayers, BandwidthScalabilityMode,
  487.       BWS_configuration, frame_size, n_subframes, sbfrm_size, lpc_order,           
  488.       num_lpc_indices, num_shape_cbks, num_gain_cbks,           
  489.       org_frame_bit_allocation,
  490.       InstanceContext  );  
  491.   *usedNumBit = BsCurrentBit(bitStream);
  492.   BsCloseRemove(bitStream,1);
  493. #if 0
  494.   {
  495.     BsBitStream* layer_stream ;
  496.     
  497.     layer_stream= BsOpenBufferRead(bitBuf);
  498.     BsGetSkip(layer_stream,p_bitstream->valid_bits); 
  499.     BsCloseRemove(layer_stream,1);
  500.   }
  501. #endif    
  502. }
  503. void DecLpcFrameNew (
  504.   BsBitBuffer *bitBuf,    /* in: bit stream frame                      */
  505.   float **sampleBuf,      /* out: audio frame samples                  */
  506.                           /*     sampleBuf[numChannel][frameNumSample] */
  507.   LPC_DATA*    lpcData,
  508.   int *usedNumBit)        /* out: num bits used for this frame         */
  509. {
  510.   BsBitStream *bitStream = BsOpenBufferRead(bitBuf) ; 
  511.   /* ----------------------------------------------------------------- */
  512.   /*Call Decoder                                                       */
  513.   /* ----------------------------------------------------------------- */
  514.   celp_decoder( bitStream, sampleBuf,
  515.                 ExcitationMode,
  516.                 SampleRateMode, QuantizationMode, FineRateControl, LosslessCodingMode,
  517.                 RPE_configuration, Wideband_VQ, MPE_Configuration, NumEnhLayers, BandwidthScalabilityMode,
  518.                 BWS_configuration, frame_size, n_subframes, sbfrm_size, lpc_order,           
  519.                 num_lpc_indices, num_shape_cbks, num_gain_cbks,           
  520.                 org_frame_bit_allocation,
  521.                 InstanceContext  );  
  522.   *usedNumBit = BsCurrentBit(bitStream);
  523.   if (sysFlag) {
  524.     int celp_sys_align;
  525.     celp_sys_align = 8 - (*usedNumBit % 8);
  526.     if (celp_sys_align == 8) celp_sys_align = 0;
  527.     BsGetSkip(bitStream,celp_sys_align);
  528.     *usedNumBit = BsCurrentBit(bitStream);
  529.   }
  530.   BsCloseRemove(bitStream,1);
  531. /*  BsClose(bitStream); */
  532. #pragma warning "BsCloseRemove must be used instead of BsClose"
  533. }
  534. /* ------------------------------------------------------------------- */
  535. /* DeLpcrFree()                                                        */
  536. /* Free memory allocated by LPC-based decoder core.                    */
  537. /* ------------------------------------------------------------------- */
  538. void DecLpcFree ()
  539. {
  540.    celp_close_decoder(ExcitationMode, SampleRateMode, BandwidthScalabilityMode, org_frame_bit_allocation, &InstanceContext);
  541. }
  542. int lpcframelength( CELP_SPECIFIC_CONFIG *celpConf )
  543. {
  544.   int frame_size;
  545.   if ( celpConf->excitationMode.value == RegularPulseExc ) {
  546.     if (celpConf->RPE_Configuration.value == 0) {
  547.       frame_size = FIFTEEN_MS;
  548.     } else if (celpConf->RPE_Configuration.value == 1) {
  549.       frame_size  = TEN_MS;
  550.     } else if (celpConf->RPE_Configuration.value == 2) {
  551.       frame_size  = FIFTEEN_MS;
  552.     } else if (celpConf->RPE_Configuration.value == 3) {
  553.       frame_size  = FIFTEEN_MS;
  554.     } else {
  555.       fprintf(stderr, "ERROR: Illegal RPE Configurationn");
  556.       exit(1); 
  557.     }
  558.   }
  559.   if ( celpConf->excitationMode.value == MultiPulseExc ) {
  560.     if ( celpConf->sampleRateMode.value == fs8kHz) {
  561.       if ( celpConf->MPE_Configuration.value < 3 ) {
  562. frame_size = NEC_FRAME40MS;
  563.       }
  564.       if ( celpConf->MPE_Configuration.value >= 3 &&
  565.    celpConf->MPE_Configuration.value < 6 ) {
  566. frame_size = NEC_FRAME30MS;
  567.       }
  568.       if ( celpConf->MPE_Configuration.value >= 6 &&
  569.    celpConf->MPE_Configuration.value < 22 ) {
  570. frame_size = NEC_FRAME20MS;
  571.       }
  572.       if ( celpConf->MPE_Configuration.value >= 22 &&
  573.    celpConf->MPE_Configuration.value < 27 ) {
  574. frame_size = NEC_FRAME10MS;
  575.       }
  576.       if ( celpConf->MPE_Configuration.value == 27 ) {
  577. frame_size = NEC_FRAME30MS;
  578.       }
  579.       if ( celpConf->MPE_Configuration.value > 27 ) {
  580. fprintf(stderr,"Error: Illegal MPE Configuration.n");
  581. exit(1); 
  582.       }
  583.       if ( celpConf->bandwidthScalabilityMode.value == ON ) {
  584. frame_size = 2 * frame_size;
  585.       }
  586.     }
  587.     if ( celpConf->sampleRateMode.value == fs16kHz) {
  588.       if ( celpConf->MPE_Configuration.value < 16 ) {
  589. frame_size = NEC_FRAME20MS_FRQ16;
  590.       }
  591.       if ( celpConf->MPE_Configuration.value >= 16 &&
  592.    celpConf->MPE_Configuration.value < 32 ) {
  593. frame_size = NEC_FRAME10MS_FRQ16;
  594.       }
  595.       if ( celpConf->MPE_Configuration.value == 7 ||
  596.    celpConf->MPE_Configuration.value == 23 ) {
  597. fprintf(stderr,"Error: Illegal BitRate configuration.n");
  598. exit(1); 
  599.       }
  600.     }
  601.   }
  602.   return( frame_size );
  603. }
  604. /* end of dec_lpc.c */