⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lbccodec.c

📁 本源代码包含了各种声音
💻 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 + -