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

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.  * encoder.c
  12.  *
  13.  *
  14.  * Project:
  15.  *    AMR Floating-Point Codec
  16.  *
  17.  * Contains:
  18.  *    Speech encoder main program
  19.  *
  20.  */
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include "hlxclib/memory.h"
  24. #include <string.h>
  25. #include "typedef.h"
  26. #include "interf_enc.h"
  27. static const short modeConv[]={
  28.    475, 515, 59, 67, 74, 795, 102, 122};
  29. static void Usage(char* argv[])
  30. {
  31.    fprintf (stderr,
  32.       "Usage of %s:nn"
  33.       "[-dtx] mode speech_file bitstream_file nn"
  34.       "or nn"
  35.       "[-dtx] -modefile=mode_file speech_file bitstream_file nnn"
  36.       "mode = MR475, MR515, MR59, MR67, MR74, MR795, MR102, MR122 nnn",
  37.       argv[0]);
  38. }
  39. void Copyright(void){
  40. fprintf (stderr,
  41. "===================================================================n"
  42. " TS 26.104                                                         n"
  43. " R99   V3.4.0 2002-02                                              n"
  44. " REL-4 V4.3.0 2002-02                                              n"
  45. " 3GPP AMR Floating-point Speech Encoder                            n"
  46. "===================================================================n"
  47. );
  48. }
  49. /*
  50.  * main
  51.  *
  52.  *
  53.  * Function:
  54.  *    Speech encoder main program
  55.  *
  56.  *    Usage: encoder speech_file bitstream_file mode dtx mode_file
  57.  *
  58.  *    Format for speech_file:
  59.  *       Speech is read from a binary file of 16 bits data.
  60.  *
  61.  *    Format for ETSI bitstream file:
  62.  *       1 word (2-byte) for the TX frame type
  63.  *       244 words (2-byte) containing 244 bits.
  64.  *          Bit 0 = 0x0000 and Bit 1 = 0x0001
  65.  *       1 word (2-byte) for the mode indication
  66.  *       4 words for future use, currently written as zero
  67.  *
  68.  *    Format for 3GPP bitstream file:
  69.  *       Holds mode information and bits packed to octets.
  70.  *       Size is from 1 byte to 31 bytes.
  71.  *
  72.  *    ETSI bitstream file format is defined using ETSI as preprocessor
  73.  *    definition
  74.  *
  75.  *    mode        : MR475, MR515, MR59, MR67, MR74, MR795, MR102, MR122
  76.  *    mode_file   : reads mode information from a file
  77.  * Returns:
  78.  *    0
  79.  */
  80. int main (int argc, char * argv[]){
  81.    /* file strucrures */
  82.    FILE * file_speech = NULL;
  83.    FILE * file_encoded = NULL;
  84.    FILE * file_mode = NULL;
  85.    /* input speech vector */
  86.    short speech[160];
  87.    /* counters */
  88.    int byte_counter, frames = 0, bytes = 0;
  89.    /* pointer to encoder state structure */
  90.    int *enstate;
  91.    /* requested mode */
  92.    enum Mode req_mode = MR122;
  93.    int dtx = 0;
  94.    /* temporary variables */
  95.    char mode_string[9];
  96.    long mode_tmp;
  97.    /* bitstream filetype */
  98. #ifndef ETSI
  99.    unsigned char serial_data[31];
  100. #else
  101.    short serial_data[250] = {0};
  102. #endif
  103.    /* Process command line options */
  104.    if ((argc == 5) || (argc == 4)){
  105.       file_encoded = fopen(argv[argc - 1], "wb");
  106.       if (file_encoded == NULL){
  107.          Usage(argv);
  108.          return 1;
  109.       }
  110.       file_speech = fopen(argv[argc - 2], "rb");
  111.       if (file_speech == NULL){
  112.          fclose(file_encoded);
  113.          Usage(argv);
  114.          return 1;
  115.       }
  116.       if (strncmp(argv[argc - 3], "-modefile=", 10) == 0){
  117.          file_mode = fopen(&argv[argc - 3][10], "rt");
  118.          if (file_mode == NULL){
  119.             Usage(argv);
  120.             fclose(file_speech);
  121.             fclose(file_encoded);
  122.             return 1;
  123.          }
  124.       }
  125.       else {
  126.          mode_tmp = strtol(&argv[argc - 3][2], NULL, 0);
  127.          for (req_mode = 0; req_mode < 8; req_mode++){
  128.             if (mode_tmp == modeConv[req_mode])
  129.                break;
  130.          }
  131.          if (req_mode == 8){
  132.             Usage(argv);
  133.             fclose(file_speech);
  134.             fclose(file_encoded);
  135.             if (file_mode != NULL)
  136.                fclose(file_mode);
  137.             return 1;
  138.          }
  139.       }
  140.       if (argc == 5){
  141.          if ((strcmp(argv[1], "-dtx") != 0)){
  142.             Usage(argv);
  143.             fclose(file_speech);
  144.             fclose(file_encoded);
  145.             if (file_mode != NULL){
  146.                fclose(file_mode);
  147.             }
  148.             return 1;
  149.          }
  150.          else {
  151.             dtx = 1;
  152.          }
  153.       }
  154.    }
  155.    else {
  156.       Usage(argv);
  157.       return 1;
  158.    }
  159.    enstate = Encoder_Interface_init(dtx);
  160.    Copyright();
  161. #ifndef VAD2
  162.    fprintf( stderr, "%sn", "Code compiled with VAD option: VAD1");
  163. #else
  164.    fprintf( stderr, "%sn", "Code compiled with VAD option: VAD2");
  165. #endif
  166.    /* read file */
  167.    while (fread( speech, sizeof (Word16), 160, file_speech ) > 0)
  168.    {
  169.       /* read mode */
  170.       if (file_mode != NULL){
  171.          req_mode = 8;
  172.          if (fscanf(file_mode, "%9sn", mode_string) != EOF) {
  173.             mode_tmp = strtol(&mode_string[2], NULL, 0);
  174.             for (req_mode = 0; req_mode < 8; req_mode++){
  175.                if (mode_tmp == modeConv[req_mode]){
  176.                   break;
  177.                }
  178.             }
  179.          }
  180.          if (req_mode == 8){
  181.             break;
  182.          }
  183.       }
  184.       frames ++;
  185.       /* call encoder */
  186.       byte_counter = Encoder_Interface_Encode(enstate, req_mode, speech, serial_data, 0);
  187.       bytes += byte_counter;
  188.       fwrite(serial_data, sizeof (UWord8), byte_counter, file_encoded );
  189.       fflush(file_encoded);
  190.    }
  191.    Encoder_Interface_exit(enstate);
  192. #ifndef ETSI
  193.    fprintf ( stderr, "n%s%i%s%i%sn", "Frame structure AMR IF2: ", frames, " frames, ", bytes, " bytes.");
  194. #else
  195.    fprintf ( stderr, "n%s%i%sn", "Frame structure AMR ETSI: ", frames, " frames. ");
  196. #endif
  197.    fclose(file_speech);
  198.    fclose(file_encoded);
  199.    if (file_mode != NULL)
  200.       fclose(file_mode);
  201.    return 0;
  202. }