LBCCODEC.C
上传用户:meifeng08
上传日期:2013-06-18
资源大小:5304k
文件大小:8k
源码类别:

语音压缩

开发平台:

C/C++

  1. /*
  2. **
  3. ** File:        "lbccodec.c"
  4. **
  5. ** Description:     Top-level source code for G.723 dual-rate codec
  6. **
  7. ** Functions:       main
  8. **                  Process_files()
  9. **
  10. **
  11. */
  12. /*
  13.     ITU-T G.723 Speech Coder   ANSI-C Source Code     Version 5.00
  14.     copyright (c) 1995, AudioCodes, DSP Group, France Telecom,
  15.     Universite de Sherbrooke.  All rights reserved.
  16. */
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <time.h>
  21. #include "typedef.h"
  22. #include "basop.h"
  23. #include "cst_lbc.h"
  24. #include "tab_lbc.h"
  25. #include "lbccodec.h"
  26. #include "coder.h"
  27. #include "decod.h"
  28. #include "exc_lbc.h"
  29. #include "util_lbc.h"
  30. #include "cod_cng.h"
  31. #include "dec_cng.h"
  32. #include "vad.h"
  33. /* Global variables */
  34. enum  Wmode    WrkMode = Both ;
  35. enum  Crate    WrkRate = Rate63 ;
  36. int   PackedFrameSize[2] = {
  37.    24 ,
  38.    20
  39.    } ;
  40. Flag    UseHp = True ;
  41. Flag    UsePf = True ;
  42. Flag    UseVx = False ;
  43. Flag    UsePr = True ;
  44. char  SignOn[] = "ACL/USH/FT/DSPG ANSI C CODEC ITU LBC Ver 5.00n" ;
  45. int main( int argc, char *argv[] )
  46. {
  47.     FILE    *Ifp, *Ofp ;            /* I/O File pointers */
  48.     FILE    *Fep  = NULL;           /* Frame erasures file pointer */
  49.     FILE    *Ratp = NULL;           /* Rate file pointer */
  50.     long    FrCnt = 0 ;
  51.     long    FlLen ;
  52.     Word16  DataBuff[Frame] ;
  53.     Word16  Crc ;
  54.     char Rate_Rd;
  55.     char    Line[24] ;
  56.     printf("%s", SignOn ) ;
  57.     /* Process arguments and open I/O files */
  58.     FlLen = Process_Files( &Ifp, &Ofp, &Fep, &Ratp, argc, argv ) ;
  59.     /*
  60.       Init coder and the decoder
  61.     */
  62.     Init_Coder( ) ;
  63.     Init_Decod( ) ;
  64.     /* Init Comfort Noise Functions */
  65.     if( UseVx ) {
  66.         Init_Vad();
  67.         Init_Cod_Cng( );
  68.     }
  69.     Init_Dec_Cng( );
  70.     /* Process all the input file */
  71.     do {
  72.         switch ( WrkMode ) {
  73.             case Both:
  74.                 if(Ratp != NULL) {
  75.                     fread((char *)&Rate_Rd, sizeof(char), 1, Ratp);
  76.                     WrkRate = (enum Crate)Rate_Rd;
  77.                 }
  78.                 if ( WrkRate == Rate53) reset_max_time();
  79.                 Read_lbc( DataBuff, Frame, Ifp ) ;
  80.                 Coder( DataBuff, Line ) ;
  81.                 Decod( DataBuff, Line, (Word16) 0 ) ;
  82.                 Write_lbc( DataBuff, Frame, Ofp ) ;
  83.             break ;
  84.             case Cod :
  85.                 if(Ratp != NULL) {
  86.                     fread((char *)&Rate_Rd, sizeof(char), 1, Ratp);
  87.                     WrkRate = (enum Crate)Rate_Rd;
  88.                 }
  89.                 if ( WrkRate == Rate53) reset_max_time();
  90.                 Read_lbc( DataBuff, Frame, Ifp ) ;
  91.                 Coder( DataBuff, Line ) ;
  92.                 Line_Wr( Line, Ofp ) ;
  93.             break ;
  94.             case Dec :
  95.                 if(Line_Rd( Line, Ifp ) == (-1)) {
  96.                     FlLen = FrCnt;
  97.                     break;
  98.                 }
  99.                 if ( Fep == NULL )
  100.                     Crc = (Word16) 0 ;
  101.                 else
  102.                     fread( (char *)&Crc, sizeof(Word16), 1, Fep ) ;
  103.                 Decod( DataBuff, Line, Crc ) ;
  104.                 Write_lbc( DataBuff, Frame, Ofp ) ;
  105.             break ;
  106.         }
  107.         FrCnt ++ ;
  108.         if( UsePr) {
  109.             if( WrkMode == Dec) {
  110.                 if(FrCnt < FlLen) {
  111.                     fprintf( stdout, "Done : %6ldr", FrCnt) ;
  112.                 }
  113.             }
  114.             else {
  115.                 fprintf( stdout, "Done : %6ld %3ldr", FrCnt, FrCnt*100/FlLen ) ;
  116.             }
  117.             fflush(stdout);
  118.         }
  119.     }   while ( FrCnt < FlLen ) ;
  120.     if(Ifp) { (void)fclose(Ifp); }
  121.     if(Ofp) { (void)fclose(Ofp); }
  122.     if(Fep) { (void)fclose(Fep); }
  123.     if(Ratp) { (void)fclose(Ratp); }
  124.     return 0 ;
  125. }
  126. /*
  127.    This function processes the argument parameters. The function
  128.       opens the IO files, and sets the global arguments accordingly
  129.       to the command line parameters.
  130. */
  131. long  Process_Files( FILE **Ifp, FILE **Ofp, FILE **Fep, FILE **Ratp,
  132.                                         int Argc, char *Argv[] )
  133. {
  134.     int     i ;
  135.     long    Flen ;
  136.     char    *FerFileName = NULL ;
  137.     char    *RateFileName = NULL ;
  138.     /*
  139.       Process the argument list, if any
  140.     */
  141.     if (Argc < 3 ) {
  142.         printf("Usage: %s [options] inputfile outputfile n", Argv[0]);
  143.         exit(1);
  144.     }
  145.     for ( i = 1 ; i < Argc-2 ; i ++ ) {
  146.         /* Check the coder rate */
  147.         if ( ! strncmp( "-r", Argv[i], 2) ) {
  148.             if ( ! strcmp("63", Argv[i]+2) ) {
  149.                 WrkRate = Rate63 ;
  150.                 continue ;
  151.             }
  152.             else if ( ! strcmp("53", Argv[i]+2) ) {
  153.                 WrkRate = Rate53 ;
  154.                 continue ;
  155.             }
  156.             else {
  157.                 RateFileName = &Argv[i][2] ;
  158.                 continue ;
  159.             }
  160.         }
  161.         /* Check Working mode */
  162.         if ( ! strcmp("-b", Argv[i]) ) {
  163.             WrkMode = Both ;
  164.             continue ;
  165.         }
  166.         if ( ! strcmp("-c", Argv[i]) ) {
  167.             WrkMode = Cod ;
  168.             continue ;
  169.         }
  170.         if ( ! strcmp("-d", Argv[i]) ) {
  171.             WrkMode = Dec ;
  172.             continue ;
  173.         }
  174.         if ( ! strcmp("-v", Argv[i]) ) {
  175.             UseVx = True ;
  176.             continue ;
  177.         }
  178.         if ( ! strcmp("-Noh", Argv[i]) ) {
  179.             UseHp = False;
  180.             continue ;
  181.         }
  182.         if ( ! strcmp("-Nop", Argv[i]) ) {
  183.             UsePf = False;
  184.             continue ;
  185.         }
  186.         if ( ! strncmp( "-f", Argv[i], 2) ) {
  187.             FerFileName = &Argv[i][2] ;
  188.             continue ;
  189.         }
  190.         if ( ! strcmp("-n", Argv[i]) ) {
  191.             UsePr = False;
  192.             continue ;
  193.         }
  194.         fprintf(stderr, "Illegal argument, %sn", Argv[i] ) ;
  195.         exit(1) ;
  196.     }
  197.     *Ifp = fopen( Argv[Argc-2], "rb") ;
  198.     if ( *Ifp == NULL ) {
  199.         fprintf(stderr, "Invalid input file name: %sn", Argv[Argc-2] ) ;
  200.         exit(1) ;
  201.     }
  202.     if ( UsePr )
  203.         printf("Input  file:     %sn", Argv[Argc-2] ) ;
  204.     *Ofp = fopen( Argv[Argc-1], "wb") ;
  205.     if ( *Ofp == NULL ) {
  206.         fprintf(stderr, "Can't open output file: %sn", Argv[Argc-1] ) ;
  207.         exit(1) ;
  208.     }
  209.     if ( UsePr )
  210.         printf("Output file:     %sn", Argv[Argc-1] ) ;
  211.     /* Open Fer file if required */
  212.     if ( WrkMode == Dec ) {
  213.         if ( FerFileName != NULL ) {
  214.             *Fep = fopen( FerFileName, "rb" ) ;
  215.             if ( *Fep == NULL ) {
  216.                 fprintf(stderr, "Can't open FER file: %sn", FerFileName ) ;
  217.                 exit(1) ;
  218.             }
  219.             if ( UsePr )
  220.                 printf("FER    file:     %sn", FerFileName ) ;
  221.         }
  222.     }
  223.     else {
  224.         if ( RateFileName != NULL ) {
  225.             *Ratp = fopen( RateFileName, "rb" ) ;
  226.             if ( *Ratp == NULL ) {
  227.                 fprintf(stderr, "Can't open Rate file: %sn", RateFileName ) ;
  228.                 exit(1) ;
  229.             }
  230.             if ( UsePr )
  231.                 printf("Rate   file:     %sn", RateFileName ) ;
  232.         }
  233.     }
  234.     /* Options report */
  235.     if ( UsePr ) {
  236.         printf("Options:n");
  237.         if (WrkMode == Both )
  238.             printf("Encoder/Decodern");
  239.         else if (WrkMode == Cod )
  240.             printf("Encodern");
  241.         else
  242.             printf("Decodern");
  243.         if( WrkMode != Cod ) {
  244.             if (UsePf == 0 )
  245.                 printf("Postfilter disabledn");
  246.             else
  247.                 printf("Postfilter enabledn");
  248.         }
  249.         if( WrkMode <= Cod ) {
  250.             if(*Ratp == NULL) {
  251.                 if (WrkRate == Rate63 )
  252.                     printf("Rate 6.3 kb/sn");
  253.                 else
  254.                     printf("Rate 5.3 kb/sn");
  255.             }
  256.             if (UseHp == 0 )
  257.                 printf("Highpassfilter disabledn");
  258.             else
  259.                 printf("Highpassfilter enabledn");
  260.             if (UseVx == 0 )
  261.                 printf("VAD/CNG disabledn");
  262.             else
  263.                 printf("VAD/CNG enabledn");
  264.         }
  265.     }
  266.     /*
  267.       Compute the file length
  268.     */
  269.     fseek( *Ifp, 0L, SEEK_END ) ;
  270.     Flen = ftell( *Ifp ) ;
  271.     rewind( *Ifp ) ;
  272.     if ( WrkMode == Dec )
  273.         Flen = 0x7fffffffL ;
  274.     else
  275.         Flen /= sizeof(Word16)*Frame ;
  276.     return Flen ;
  277. }