1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 /* 12 * testG722.cpp : Defines the entry point for the console application. 13 */ 14 15 #include <stdio.h> 16 #include <stdlib.h> 17 #include <string.h> 18 #include "typedefs.h" 19 20 /* include API */ 21 #include "g722_interface.h" 22 23 /* Runtime statistics */ 24 #include <time.h> 25 #define CLOCKS_PER_SEC_G722 100000 26 27 // Forward declaration 28 typedef struct WebRtcG722EncInst G722EncInst; 29 typedef struct WebRtcG722DecInst G722DecInst; 30 31 /* function for reading audio data from PCM file */ 32 int readframe(int16_t *data, FILE *inp, int length) 33 { 34 short k, rlen, status = 0; 35 36 rlen = (short)fread(data, sizeof(int16_t), length, inp); 37 if (rlen < length) { 38 for (k = rlen; k < length; k++) 39 data[k] = 0; 40 status = 1; 41 } 42 43 return status; 44 } 45 46 int main(int argc, char* argv[]) 47 { 48 char inname[60], outbit[40], outname[40]; 49 FILE *inp, *outbitp, *outp; 50 51 int framecnt, endfile; 52 int16_t framelength = 160; 53 G722EncInst *G722enc_inst; 54 G722DecInst *G722dec_inst; 55 int err; 56 57 /* Runtime statistics */ 58 double starttime; 59 double runtime = 0; 60 double length_file; 61 62 int16_t stream_len = 0; 63 int16_t shortdata[960]; 64 int16_t decoded[960]; 65 int16_t streamdata[80*3]; 66 int16_t speechType[1]; 67 68 /* handling wrong input arguments in the command line */ 69 if (argc!=5) { 70 printf("\n\nWrong number of arguments or flag values.\n\n"); 71 72 printf("\n"); 73 printf("Usage:\n\n"); 74 printf("./testG722.exe framelength infile outbitfile outspeechfile \n\n"); 75 printf("with:\n"); 76 printf("framelength : Framelength in samples.\n\n"); 77 printf("infile : Normal speech input file\n\n"); 78 printf("outbitfile : Bitstream output file\n\n"); 79 printf("outspeechfile: Speech output file\n\n"); 80 exit(0); 81 82 } 83 84 /* Get frame length */ 85 framelength = atoi(argv[1]); 86 87 /* Get Input and Output files */ 88 sscanf(argv[2], "%s", inname); 89 sscanf(argv[3], "%s", outbit); 90 sscanf(argv[4], "%s", outname); 91 92 if ((inp = fopen(inname,"rb")) == NULL) { 93 printf(" G.722: Cannot read file %s.\n", inname); 94 exit(1); 95 } 96 if ((outbitp = fopen(outbit,"wb")) == NULL) { 97 printf(" G.722: Cannot write file %s.\n", outbit); 98 exit(1); 99 } 100 if ((outp = fopen(outname,"wb")) == NULL) { 101 printf(" G.722: Cannot write file %s.\n", outname); 102 exit(1); 103 } 104 printf("\nInput:%s\nOutput bitstream:%s\nOutput:%s\n", inname, outbit, outname); 105 106 /* Create and init */ 107 WebRtcG722_CreateEncoder((G722EncInst **)&G722enc_inst); 108 WebRtcG722_CreateDecoder((G722DecInst **)&G722dec_inst); 109 WebRtcG722_EncoderInit((G722EncInst *)G722enc_inst); 110 WebRtcG722_DecoderInit((G722DecInst *)G722dec_inst); 111 112 113 /* Initialize encoder and decoder */ 114 framecnt = 0; 115 endfile = 0; 116 while (endfile == 0) { 117 framecnt++; 118 119 /* Read speech block */ 120 endfile = readframe(shortdata, inp, framelength); 121 122 /* Start clock before call to encoder and decoder */ 123 starttime = clock()/(double)CLOCKS_PER_SEC_G722; 124 125 /* G.722 encoding + decoding */ 126 stream_len = WebRtcG722_Encode((G722EncInst *)G722enc_inst, shortdata, framelength, streamdata); 127 err = WebRtcG722_Decode((G722DecInst *)G722dec_inst, streamdata, stream_len, decoded, speechType); 128 129 /* Stop clock after call to encoder and decoder */ 130 runtime += (double)((clock()/(double)CLOCKS_PER_SEC_G722)-starttime); 131 132 if (stream_len < 0 || err < 0) { 133 /* exit if returned with error */ 134 printf("Error in encoder/decoder\n"); 135 } else { 136 /* Write coded bits to file */ 137 if (fwrite(streamdata, sizeof(short), stream_len/2, 138 outbitp) != static_cast<size_t>(stream_len/2)) { 139 return -1; 140 } 141 /* Write coded speech to file */ 142 if (fwrite(decoded, sizeof(short), framelength, 143 outp) != static_cast<size_t>(framelength)) { 144 return -1; 145 } 146 } 147 } 148 149 WebRtcG722_FreeEncoder((G722EncInst *)G722enc_inst); 150 WebRtcG722_FreeDecoder((G722DecInst *)G722dec_inst); 151 152 length_file = ((double)framecnt*(double)framelength/16000); 153 printf("\n\nLength of speech file: %.1f s\n", length_file); 154 printf("Time to run G.722: %.2f s (%.2f %% of realtime)\n\n", runtime, (100*runtime/length_file)); 155 printf("---------------------END----------------------\n"); 156 157 fclose(inp); 158 fclose(outbitp); 159 fclose(outp); 160 161 return 0; 162 } 163