decoder.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:4k
源码类别:

Symbian

开发平台:

C/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. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include "hlxclib/memory.h"
  13. #include "interf_dec.h"
  14. #include "typedef.h"
  15. void Copyright(void){
  16. fprintf (stderr,
  17. "===================================================================n"
  18. " TS 26.104                                                         n"
  19. " R99   V3.4.0 2002-02                                              n"
  20. " REL-4 V4.3.0 2002-02                                              n"
  21. " 3GPP AMR Floating-point Speech Decoder                            n"
  22. "===================================================================n"
  23. );
  24. }
  25. /*
  26.  * main
  27.  *
  28.  *
  29.  * Function:
  30.  *    Speech decoder main program
  31.  *
  32.  *    Usage: decoder bitstream_file synthesis_file
  33.  *
  34.  *    Format for ETSI bitstream file:
  35.  *       1 word (2-byte) for the TX frame type
  36.  *       244 words (2-byte) containing 244 bits.
  37.  *          Bit 0 = 0x0000 and Bit 1 = 0x0001
  38.  *       1 word (2-byte) for the mode indication
  39.  *       4 words for future use, currently written as zero
  40.  *
  41.  *    Format for 3GPP bitstream file:
  42.  *       Holds mode information and bits packed to octets.
  43.  *       Size is from 1 byte to 31 bytes.
  44.  *
  45.  *    Format for synthesis_file:
  46.  *       Speech is written to a 16 bit 8kHz file.
  47.  *
  48.  *    ETSI bitstream file format is defined using ETSI as preprocessor
  49.  *    definition
  50.  * Returns:
  51.  *    0
  52.  */
  53. int main (int argc, char * argv[]){
  54.    FILE * file_speech, *file_analysis;
  55.    short synth[160];
  56.    int frames = 0;
  57.    int * destate;
  58.    int read_size;
  59. #ifndef ETSI
  60.    unsigned char analysis[31];
  61.    enum Mode dec_mode;
  62. #else
  63.    short analysis[250];
  64. #endif
  65.    /* Process command line options */
  66.    if (argc == 3){
  67.       file_speech = fopen(argv[2], "wb");
  68.       if (file_speech == NULL){
  69.          fprintf ( stderr, "%s%s%sn","Use: ",argv[0], " input.file output.file " );
  70.          return 1;
  71.       }
  72.       file_analysis = fopen(argv[1], "rb");
  73.       if (file_analysis == NULL){
  74.          fprintf ( stderr, "%s%s%sn","Use: ",argv[0], " input.file output.file " );
  75.          fclose(file_speech);
  76.          return 1;
  77.       }
  78.    }
  79.    else {
  80.       fprintf ( stderr, "%s%s%sn","Use: ",argv[0], " input.file output.file " );
  81.       return 1;
  82.    }
  83.    Copyright();
  84.    /* init decoder */
  85.    destate = Decoder_Interface_init();
  86. #ifndef ETSI
  87.    /* find mode, read file */
  88.    while (fread(analysis, sizeof (unsigned char), 1, file_analysis ) > 0)
  89.    {
  90.       dec_mode = analysis[0] & 0x000F;
  91.       switch (dec_mode){
  92.       case 0:
  93.          read_size = 12;
  94.          break;
  95.       case 1:
  96.          read_size = 13;
  97.          break;
  98.       case 2:
  99.          read_size = 15;
  100.          break;
  101.       case 3:
  102.          read_size = 17;
  103.          break;
  104.       case 4:
  105.          read_size = 18;
  106.          break;
  107.       case 5:
  108.          read_size = 20;
  109.          break;
  110.       case 6:
  111.          read_size = 25;
  112.          break;
  113.       case 7:
  114.          read_size = 30;
  115.          break;
  116.       case 8:
  117.          read_size = 5;
  118.          break;
  119.       case 15:
  120.          read_size = 0;
  121.       default:
  122.          read_size = 0;
  123.          break;
  124.       };
  125.       fread(&analysis[1], sizeof (char), read_size, file_analysis );
  126. #else
  127.    read_size = 250;
  128.    /* read file */
  129.    while (fread(analysis, sizeof (short), read_size, file_analysis ) > 0)
  130.    {
  131. #endif
  132.       frames ++;
  133.       /* call decoder */
  134.       Decoder_Interface_Decode(destate, analysis, synth, 0);
  135.       fwrite( synth, sizeof (short), 160, file_speech );
  136.    }
  137.    Decoder_Interface_exit(destate);
  138.    fclose(file_speech);
  139.    fclose(file_analysis);
  140.    fprintf ( stderr, "n%s%i%sn","Decoded ", frames, " frames.");
  141.    return 0;
  142. }