gps/GPSResources/tcpmp 0.73/amr/26104/encoder.c

242 lines
6.3 KiB
C
Executable File

/*
* ===================================================================
* TS 26.104
* REL-5 V5.4.0 2004-03
* REL-6 V6.1.0 2004-03
* 3GPP AMR Floating-point Speech Codec
* ===================================================================
*
*/
/*
* encoder.c
*
*
* Project:
* AMR Floating-Point Codec
*
* Contains:
* Speech encoder main program
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <string.h>
#include "typedef.h"
#include "interf_enc.h"
#ifndef ETSI
#ifndef IF2
#define AMR_MAGIC_NUMBER "#!AMR\n"
#endif
#endif
static const short modeConv[]={
475, 515, 59, 67, 74, 795, 102, 122};
static void Usage(char* argv[])
{
fprintf (stderr,
"Usage of %s:\n\n"
"[-dtx] mode speech_file bitstream_file \n\n"
"or \n\n"
"[-dtx] -modefile=mode_file speech_file bitstream_file \n\n\n"
"mode = MR475, MR515, MR59, MR67, MR74, MR795, MR102, MR122 \n\n\n",
argv[0]);
}
void Copyright(void){
fprintf (stderr,
"===================================================================\n"
" TS 26.104 \n"
" REL-5 V5.4.0 2004-03 \n"
" REL-6 V6.1.0 2004-03 \n"
" 3GPP AMR Floating-point Speech Encoder \n"
"===================================================================\n"
);
}
/*
* main
*
*
* Function:
* Speech encoder main program
*
* Usage: encoder speech_file bitstream_file mode dtx mode_file
*
* Format for speech_file:
* Speech is read from a binary file of 16 bits data.
*
* Format for ETSI bitstream file:
* 1 word (2-byte) for the TX frame type
* 244 words (2-byte) containing 244 bits.
* Bit 0 = 0x0000 and Bit 1 = 0x0001
* 1 word (2-byte) for the mode indication
* 4 words for future use, currently written as zero
*
* Format for 3GPP bitstream file:
* Holds mode information and bits packed to octets.
* Size is from 1 byte to 31 bytes.
*
* ETSI bitstream file format is defined using ETSI as preprocessor
* definition
*
* mode : MR475, MR515, MR59, MR67, MR74, MR795, MR102, MR122
* mode_file : reads mode information from a file
* Returns:
* 0
*/
int main (int argc, char * argv[]){
/* file strucrures */
FILE * file_speech = NULL;
FILE * file_encoded = NULL;
FILE * file_mode = NULL;
/* input speech vector */
short speech[160];
/* counters */
int byte_counter, frames = 0, bytes = 0;
/* pointer to encoder state structure */
int *enstate;
/* requested mode */
enum Mode req_mode = MR122;
int dtx = 0;
/* temporary variables */
char mode_string[9];
long mode_tmp;
/* bitstream filetype */
#ifndef ETSI
unsigned char serial_data[32];
#else
short serial_data[250] = {0};
#endif
/* Process command line options */
if ((argc == 5) || (argc == 4)){
file_encoded = fopen(argv[argc - 1], "wb");
if (file_encoded == NULL){
Usage(argv);
return 1;
}
file_speech = fopen(argv[argc - 2], "rb");
if (file_speech == NULL){
fclose(file_encoded);
Usage(argv);
return 1;
}
if (strncmp(argv[argc - 3], "-modefile=", 10) == 0){
file_mode = fopen(&argv[argc - 3][10], "rt");
if (file_mode == NULL){
Usage(argv);
fclose(file_speech);
fclose(file_encoded);
return 1;
}
}
else {
mode_tmp = strtol(&argv[argc - 3][2], NULL, 0);
for (req_mode = 0; req_mode < 8; req_mode++){
if (mode_tmp == modeConv[req_mode])
break;
}
if (req_mode == 8){
Usage(argv);
fclose(file_speech);
fclose(file_encoded);
if (file_mode != NULL)
fclose(file_mode);
return 1;
}
}
if (argc == 5){
if ((strcmp(argv[1], "-dtx") != 0)){
Usage(argv);
fclose(file_speech);
fclose(file_encoded);
if (file_mode != NULL){
fclose(file_mode);
}
return 1;
}
else {
dtx = 1;
}
}
}
else {
Usage(argv);
return 1;
}
enstate = Encoder_Interface_init(dtx);
Copyright();
#ifndef VAD2
fprintf( stderr, "%s\n", "Code compiled with VAD option: VAD1");
#else
fprintf( stderr, "%s\n", "Code compiled with VAD option: VAD2");
#endif
#ifndef ETSI
#ifndef IF2
/* write magic number to indicate single channel AMR file storage format */
bytes = fwrite(AMR_MAGIC_NUMBER, sizeof(char), strlen(AMR_MAGIC_NUMBER), file_encoded);
#endif
#endif
/* read file */
while (fread( speech, sizeof (Word16), 160, file_speech ) > 0)
{
/* read mode */
if (file_mode != NULL){
req_mode = 8;
if (fscanf(file_mode, "%9s\n", mode_string) != EOF) {
mode_tmp = strtol(&mode_string[2], NULL, 0);
for (req_mode = 0; req_mode < 8; req_mode++){
if (mode_tmp == modeConv[req_mode]){
break;
}
}
}
if (req_mode == 8){
break;
}
}
frames ++;
/* call encoder */
byte_counter = Encoder_Interface_Encode(enstate, req_mode, speech, serial_data, 0);
bytes += byte_counter;
fwrite(serial_data, sizeof (UWord8), byte_counter, file_encoded );
fflush(file_encoded);
}
Encoder_Interface_exit(enstate);
#ifndef ETSI
#ifdef IF2
fprintf ( stderr, "\n%s%i%s%i%s\n", "Frame structure AMR IF2: ", frames, " frames, ", bytes, " bytes.");
#else
fprintf ( stderr, "\n%s%i%s%i%s\n", "Frame structure AMR MIME file storage format: ", frames, " frames, ", bytes, " bytes.");
#endif
#else
fprintf ( stderr, "\n%s%i%s\n", "Frame structure AMR ETSI: ", frames, " frames. ");
#endif
fclose(file_speech);
fclose(file_encoded);
if (file_mode != NULL)
fclose(file_mode);
return 0;
}