📄 coder.c
字号:
#include "string.h"#include "errno.h"#include "typedef.h"
#include "amrcode_public.h"
#include "time.h"
#include "prm2bits.h"
/* * read_mode read next mode from mode file * * return 0 on success, EOF on end of file, 1 on other error */int read_mode(FILE *file_modes, Mode *mode)
{ char buf[10]; if (fscanf(file_modes, "%9s\n", buf) != 1) { if (feof(file_modes)) return EOF; fprintf(stderr, "\nerror reading mode control file: %s\n", strerror(errno)); return 1; } if (str2mode(buf, mode) != 0 || *mode == MRDTX) { fprintf(stderr, "\ninvalid amr_mode found in mode control file: '%s'\n", buf); return 1; } return 0;}/******************************************************************************* MAIN PROGRAM ******************************************************************************/int main (int argc, char *argv[]){ char *progname = argv[0]; char *modeStr = NULL; char *usedModeStr = NULL; char *fileName = NULL; char *modefileName = NULL; char *serialFileName = NULL; FILE *file_speech = NULL; /* File of speech data */
FILE *file_serial = NULL; /* File of coded bits */
FILE *file_modes = NULL; /* File with mode information */
FILE *datafile = NULL;
Word16 new_speech[160]; /* Pointer to new speech data */
Word16 serial[250]; /* Output bitstream buffer */
#ifdef MMS_IO UWord8 packed_bits[MAX_PACKED_SIZE]; Word16 packed_size;#endif Word32 frame; Word16 dtx = 0; /* enable encoder DTX */
clock_t time1 = 0 ,time2= 0 ; Word32 a=0,b=0;
/* changed eedodr */
int i=0,j=0;
Mode mode;
Mode used_mode;
TXFrameType tx_type;
int useModeFile = 0; //Speech_Encode_FrameState *speech_encoder_state = NULL;
//sid_syncState *sid_state = NULL;
void *speech_encoder_state = NULL;
void *sid_state = NULL;
void * amrcoder = NULL;
unsigned char bitstr[MAX_BYTES];
/*----------------------------------------------------------------------* * Process command line options * *----------------------------------------------------------------------*/ while (argc > 1)
{
if (strcmp(argv[1], "-dtx") == 0) { dtx = 1; } else if (strncmp(argv[1], "-modefile=", 10) == 0) { useModeFile = 1; modefileName = argv[1]+10; } else break; argc--; argv++; } /*----------------------------------------------------------------------* * Check number of arguments * *----------------------------------------------------------------------*/ if ( (argc != 4 && !useModeFile)
|| (argc != 3 && useModeFile)) { fprintf (stderr, " Usage:\n\n" " %s [-dtx] amr_mode speech_file bitstream_file\n\n" " or \n\n" " %s [-dtx] -modefile=mode_file speech_file bitstream_file\n\n" " -dtx enables DTX mode\n" " -modefile=mode_file reads AMR modes from text file (one line per frame)\n\n", progname, progname); exit (1); } /*----------------------------------------------------------------------* * Open mode file or convert mode string * *----------------------------------------------------------------------*/ if (useModeFile) { fileName = argv[1]; serialFileName = argv[2]; /* Open mode control file */ if (strcmp(modefileName, "-") == 0) { file_modes = stdin; } else if ((file_modes = fopen (modefileName, "rt")) == NULL) { fprintf (stderr, "Error opening mode control file %s !!\n", modefileName); exit (1); } fprintf (stderr, " Mode control file: %s\n", modefileName); } else { modeStr = argv[1]; fileName = argv[2]; serialFileName = argv[3]; /* check and convert mode string */ if (str2mode(modeStr, &mode) != 0 && mode != MRDTX)
{
fprintf(stderr, "Invalid amr_mode specified: '%s'\n", modeStr); exit(1); } } /*----------------------------------------------------------------------* * Open speech file and result file (output serial bit stream) * *----------------------------------------------------------------------*/ if (strcmp(fileName, "-") == 0) { file_speech = stdin; } else if ((file_speech = fopen (fileName, "rb")) == NULL) { fprintf (stderr, "Error opening input file %s !!\n", fileName); exit (1); } fprintf (stderr, " Input speech file: %s\n", fileName); if (strcmp(serialFileName, "-") == 0) { file_serial = stdout; } else if ((file_serial = fopen (serialFileName, "wb")) == NULL) { fprintf (stderr,"Error opening output bitstream file %s !!\n",serialFileName); exit (1); } fprintf (stderr, " Output bitstream file: %s\n", serialFileName);
datafile = fopen("E:\\AMR\\decindata\\speechdata.txt", "wb");
if(NULL == datafile )
printf("open decindata file faily! \n");
else
printf("open decindata file successfully! \n");
/*-----------------------------------------------------------------------* * Initialisation of the coder. * *-----------------------------------------------------------------------*/
// if ( Speech_Encode_Frame_init(&speech_encoder_state, dtx, &sid_state))
if ( Speech_Encode_Frame_init(&amrcoder, dtx))
exit(-1);
#ifdef MMS_IO /* write magic number to indicate single channel AMR file storage format */ fwrite(AMR_MAGIC_NUMBER, sizeof(UWord8), strlen(AMR_MAGIC_NUMBER), file_serial);#endif /*-----------------------------------------------------------------------* * Process speech frame by frame * *-----------------------------------------------------------------------*/
//memset(new_speech, 0 ,320);
frame = 0;
while (fread (new_speech, sizeof (Word16), L_FRAME, file_speech) == L_FRAME) {
frame++;
if(frame > 400 ) break;
#if 1
/* read new mode string from file if required */ if (useModeFile) { int res; if ((res = read_mode(file_modes, &mode)) == EOF) { fprintf(stderr, "\nend of mode control file reached"); break; } else if (res == 1) exit(-1); }
/* zero flags and parameter bits */ // for (i = 0; i < 250; i++)
// serial[i] = 0;
/* encode speech */ time1 = clock();
// a = GetTickCount();
Speech_Encode_Frame(amrcoder, mode, new_speech, &bitstr[0], &used_mode,&tx_type);
time2 += clock() - time1;
#ifndef MMS_IO
#if 1
for(i = 0; i<32; i++)
{
if(i%64 == 0) fprintf(datafile, "\n\r"); fflush(datafile);
fprintf(datafile, "%d,", bitstr[i]); fflush(datafile);
}
#else
if (fwrite (bitstr, sizeof (unsigned char), 32, file_serial)!= 32)
{
fprintf(stderr, "\nerror writing output file: %s\n", strerror(errno)); exit(-1); }
#endif
#else packed_size = PackBits(used_mode, mode, tx_type, &serial[1], packed_bits);
/* write file storage format bitstream to output file */ if (fwrite (packed_bits, sizeof (UWord8), packed_size, file_serial) != packed_size) { fprintf(stderr, "\nerror writing output file: %s\n", strerror(errno)); exit(-1); }#endif fflush(file_serial); /* perform homing if homing frame was detected at encoder input */
#if 0
if (reset_flag != 0) { Speech_Encode_Frame_reset(speech_encoder_state);
sid_sync_reset(sid_state);
}#endif
#endif
} fprintf (stderr, "\n%d frame(s) processed\n", frame); printf("Fist: time for %d frame is : %d , for eache frame is % f \n", frame, time2, (double) time2/(frame *CLOCKS_PER_SEC));
/*-----------------------------------------------------------------------* * Close down speech coder * *-----------------------------------------------------------------------*/ // Speech_Encode_Frame_exit(&speech_encoder_state,&sid_state);
Speech_Encode_Frame_exit(&amrcoder);
return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -