📄 lbccodec.c
字号:
/*
**
** File: "lbccodec.c"
**
** Description: Top-level source code for G.723 dual-rate codec
**
** Functions: main
** Process_files()
**
**
*/
/*
ITU-T G.723 Speech Coder ANSI-C Source Code Version 5.00
copyright (c) 1995, AudioCodes, DSP Group, France Telecom,
Universite de Sherbrooke. All rights reserved.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "typedef.h"
#include "basop.h"
#include "cst_lbc.h"
#include "tab_lbc.h"
#include "lbccodec.h"
#include "coder.h"
#include "decod.h"
#include "exc_lbc.h"
#include "util_lbc.h"
#include "cod_cng.h"
#include "dec_cng.h"
#include "vad.h"
/* Global variables */
enum Wmode WrkMode = Both ;
enum Crate WrkRate = Rate63 ;
int PackedFrameSize[2] = {
24 ,
20
} ;
Flag UseHp = True ;
Flag UsePf = True ;
Flag UseVx = False ;
Flag UsePr = True ;
char SignOn[] = "ACL/USH/FT/DSPG ANSI C CODEC ITU LBC Ver 5.00\n" ;
int main( int argc, char *argv[] )
{
FILE *Ifp, *Ofp ; /* I/O File pointers */
FILE *Fep = NULL; /* Frame erasures file pointer */
FILE *Ratp = NULL; /* Rate file pointer */
long FrCnt = 0 ;
long FlLen ;
Word16 DataBuff[Frame] ;
Word16 Crc ;
char Rate_Rd;
char Line[24] ;
printf("%s", SignOn ) ;
/* Process arguments and open I/O files */
FlLen = Process_Files( &Ifp, &Ofp, &Fep, &Ratp, argc, argv ) ;
/*
Init coder and the decoder
*/
Init_Coder( ) ;
Init_Decod( ) ;
/* Init Comfort Noise Functions */
if( UseVx ) {
Init_Vad();
Init_Cod_Cng( );
}
Init_Dec_Cng( );
/* Process all the input file */
do {
switch ( WrkMode ) {
case Both:
if(Ratp != NULL) {
fread((char *)&Rate_Rd, sizeof(char), 1, Ratp);
WrkRate = (enum Crate)Rate_Rd;
}
if ( WrkRate == Rate53) reset_max_time();
Read_lbc( DataBuff, Frame, Ifp ) ;
Coder( DataBuff, Line ) ;
Decod( DataBuff, Line, (Word16) 0 ) ;
Write_lbc( DataBuff, Frame, Ofp ) ;
break ;
case Cod :
if(Ratp != NULL) {
fread((char *)&Rate_Rd, sizeof(char), 1, Ratp);
WrkRate = (enum Crate)Rate_Rd;
}
if ( WrkRate == Rate53) reset_max_time();
Read_lbc( DataBuff, Frame, Ifp ) ;
Coder( DataBuff, Line ) ;
Line_Wr( Line, Ofp ) ;
break ;
case Dec :
if(Line_Rd( Line, Ifp ) == (-1)) {
FlLen = FrCnt;
break;
}
if ( Fep == NULL )
Crc = (Word16) 0 ;
else
fread( (char *)&Crc, sizeof(Word16), 1, Fep ) ;
Decod( DataBuff, Line, Crc ) ;
Write_lbc( DataBuff, Frame, Ofp ) ;
break ;
}
FrCnt ++ ;
if( UsePr) {
if( WrkMode == Dec) {
if(FrCnt < FlLen) {
fprintf( stdout, "Done : %6ld\r", FrCnt) ;
}
}
else {
fprintf( stdout, "Done : %6ld %3ld\r", FrCnt, FrCnt*100/FlLen ) ;
}
fflush(stdout);
}
} while ( FrCnt < FlLen ) ;
if(Ifp) { (void)fclose(Ifp); }
if(Ofp) { (void)fclose(Ofp); }
if(Fep) { (void)fclose(Fep); }
if(Ratp) { (void)fclose(Ratp); }
return 0 ;
}
/*
This function processes the argument parameters. The function
opens the IO files, and sets the global arguments accordingly
to the command line parameters.
*/
long Process_Files( FILE **Ifp, FILE **Ofp, FILE **Fep, FILE **Ratp,
int Argc, char *Argv[] )
{
int i ;
long Flen ;
char *FerFileName = NULL ;
char *RateFileName = NULL ;
/*
Process the argument list, if any
*/
if (Argc < 3 ) {
printf("Usage: %s [options] inputfile outputfile \n", Argv[0]);
exit(1);
}
for ( i = 1 ; i < Argc-2 ; i ++ ) {
/* Check the coder rate */
if ( ! strncmp( "-r", Argv[i], 2) ) {
if ( ! strcmp("63", Argv[i]+2) ) {
WrkRate = Rate63 ;
continue ;
}
else if ( ! strcmp("53", Argv[i]+2) ) {
WrkRate = Rate53 ;
continue ;
}
else {
RateFileName = &Argv[i][2] ;
continue ;
}
}
/* Check Working mode */
if ( ! strcmp("-b", Argv[i]) ) {
WrkMode = Both ;
continue ;
}
if ( ! strcmp("-c", Argv[i]) ) {
WrkMode = Cod ;
continue ;
}
if ( ! strcmp("-d", Argv[i]) ) {
WrkMode = Dec ;
continue ;
}
if ( ! strcmp("-v", Argv[i]) ) {
UseVx = True ;
continue ;
}
if ( ! strcmp("-Noh", Argv[i]) ) {
UseHp = False;
continue ;
}
if ( ! strcmp("-Nop", Argv[i]) ) {
UsePf = False;
continue ;
}
if ( ! strncmp( "-f", Argv[i], 2) ) {
FerFileName = &Argv[i][2] ;
continue ;
}
if ( ! strcmp("-n", Argv[i]) ) {
UsePr = False;
continue ;
}
fprintf(stderr, "Illegal argument, %s\n", Argv[i] ) ;
exit(1) ;
}
*Ifp = fopen( Argv[Argc-2], "rb") ;
if ( *Ifp == NULL ) {
fprintf(stderr, "Invalid input file name: %s\n", Argv[Argc-2] ) ;
exit(1) ;
}
if ( UsePr )
printf("Input file: %s\n", Argv[Argc-2] ) ;
*Ofp = fopen( Argv[Argc-1], "wb") ;
if ( *Ofp == NULL ) {
fprintf(stderr, "Can't open output file: %s\n", Argv[Argc-1] ) ;
exit(1) ;
}
if ( UsePr )
printf("Output file: %s\n", Argv[Argc-1] ) ;
/* Open Fer file if required */
if ( WrkMode == Dec ) {
if ( FerFileName != NULL ) {
*Fep = fopen( FerFileName, "rb" ) ;
if ( *Fep == NULL ) {
fprintf(stderr, "Can't open FER file: %s\n", FerFileName ) ;
exit(1) ;
}
if ( UsePr )
printf("FER file: %s\n", FerFileName ) ;
}
}
else {
if ( RateFileName != NULL ) {
*Ratp = fopen( RateFileName, "rb" ) ;
if ( *Ratp == NULL ) {
fprintf(stderr, "Can't open Rate file: %s\n", RateFileName ) ;
exit(1) ;
}
if ( UsePr )
printf("Rate file: %s\n", RateFileName ) ;
}
}
/* Options report */
if ( UsePr ) {
printf("Options:\n");
if (WrkMode == Both )
printf("Encoder/Decoder\n");
else if (WrkMode == Cod )
printf("Encoder\n");
else
printf("Decoder\n");
if( WrkMode != Cod ) {
if (UsePf == 0 )
printf("Postfilter disabled\n");
else
printf("Postfilter enabled\n");
}
if( WrkMode <= Cod ) {
if(*Ratp == NULL) {
if (WrkRate == Rate63 )
printf("Rate 6.3 kb/s\n");
else
printf("Rate 5.3 kb/s\n");
}
if (UseHp == 0 )
printf("Highpassfilter disabled\n");
else
printf("Highpassfilter enabled\n");
if (UseVx == 0 )
printf("VAD/CNG disabled\n");
else
printf("VAD/CNG enabled\n");
}
}
/*
Compute the file length
*/
fseek( *Ifp, 0L, SEEK_END ) ;
Flen = ftell( *Ifp ) ;
rewind( *Ifp ) ;
if ( WrkMode == Dec )
Flen = 0x7fffffffL ;
else
Flen /= sizeof(Word16)*Frame ;
return Flen ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -