text: /*
   *===================================================================
   *  3GPP AMR Wideband Floating-point Speech Codec
   *===================================================================
   */
  
  #include <stdio.h>
  #include <stdlib.h>
  #include "typedef.h"
  #include "dec_if.h"
  #include "if_rom.h"
  
  #ifndef IF2
  #include <string.h>
  #define AMRWB_MAGIC_NUMBER "#!AMR-WB\n"
  #endif
  
  /*
   * DECODER.C
   *
   * Main program of the AMR WB ACELP wideband decoder.
   *
   *    Usage : decoder bitstream_file synth_file
   *
   *    Format for bitstream_file:
   *        Described in TS26.201
   *
   *    Format for synth_file:
   *      Synthesis is written to a binary file of 16 bits data.
   *
   */
  
  int main(int argc, char *argv[])
  {
      FILE *f_serial;                        /* File of serial bits for transmission  */
      FILE *f_synth;                         /* File of speech data                   */
  
      Word16 synth[L_FRAME16k];              /* Buffer for speech @ 16kHz             */
      UWord8 serial[NB_SERIAL_MAX];
      Word16 mode;
      Word32 frame;
  
  #ifndef IF2
  	char magic[16];
  #endif
      void *st;
  
      fprintf(stderr, "\n");
  	   fprintf(stderr, "===================================================================\n");
  	   fprintf(stderr, " 3GPP AMR-WB Floating-point Speech Decoder, v7.0.0, Mar 20, 2007\n");
  	   fprintf(stderr, "===================================================================\n");
     fprintf(stderr, "\n");
  
      /*
       * Read passed arguments and open in/out files
       */
      if (argc != 3)
      {
          fprintf(stderr, "Usage : decoder  bitstream_file  synth_file\n");
          fprintf(stderr, "\n");
          fprintf(stderr, "Format for bitstream_file:\n");
  #ifdef IF2
  		fprintf(stderr, "  Described in TS26.201.\n");
  #else
  		fprintf(stderr, "  Described in RFC 3267 (Sections 5.1 and 5.3).\n");
  #endif
          fprintf(stderr, "\n");
          fprintf(stderr, "Format for synth_file:\n");
          fprintf(stderr, "  Synthesis is written to a binary file of 16 bits data.\n");
          fprintf(stderr, "\n");
          exit(0);
      }
  
      /* Open file for synthesis and packed serial stream */
      if ((f_serial = fopen(argv[1], "rb")) == NULL)
      {
          fprintf(stderr, "Input file '%s' does not exist !!\n", argv[1]);
          exit(0);
      }
      else
      {
          fprintf(stderr, "Input bitstream file:   %s\n", argv[1]);
      }
  
      if ((f_synth = fopen(argv[2], "wb")) == NULL)
      {
          fprintf(stderr, "Cannot open file '%s' !!\n", argv[2]);
          exit(0);
      }
      else
      {
          fprintf(stderr, "Synthesis speech file:   %s\n", argv[2]);
      }
  
      /*
       * Initialization of decoder
       */
      st = D_IF_init();
  
  #ifndef IF2
     /* read magic number */
     fread(magic, sizeof(char), strlen(AMRWB_MAGIC_NUMBER), f_serial);
  
     /* verify magic number */
     if (strncmp(magic, AMRWB_MAGIC_NUMBER, strlen(AMRWB_MAGIC_NUMBER)))
     {
  	   fprintf(stderr, "%s%s\n", "Invalid magic number: ", magic);
  	   fclose(f_serial);
  	   fclose(f_synth);
  	   exit(0);
     }
  #endif
  
      /*
       * Loop for each "L_FRAME" speech data
       */
      fprintf(stderr, "\n --- Running ---\n");
  
      frame = 0;
      while (fread(serial, sizeof (UWord8), 1, f_serial ) > 0)
      {
  #ifdef IF2
         mode = (Word16)(serial[0] >> 4);
  #else
  	   mode = (Word16)((serial[0] >> 3) & 0x0F);
  #endif
  	   fread(&serial[1], sizeof (UWord8), block_size[mode] - 1, f_serial );
  
  	   frame++;
  
  	   fprintf(stderr, " Decoding frame: %ld\r", frame);
  
  	   D_IF_decode( st, serial, synth, _good_frame);
  
  	   fwrite(synth, sizeof(Word16), L_FRAME16k, f_synth);
  	   fflush(f_synth);
      }
  
      D_IF_exit(st);
  
      fclose(f_serial);
      fclose(f_synth);
  
      return 0;
  }
  