blob: c55a2eb3572175cde1df3d6527ad505049b20746 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
leozwang@webrtc.org354b0ed2012-06-01 17:46:21 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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>
andresp@webrtc.org262e6762014-09-04 13:28:48 +000018#include "webrtc/typedefs.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000019
20/* include API */
kjellander@webrtc.org3c652b62015-11-18 23:07:57 +010021#include "webrtc/modules/audio_coding/codecs/g722/g722_interface.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000022
23/* Runtime statistics */
24#include <time.h>
25#define CLOCKS_PER_SEC_G722 100000
26
27// Forward declaration
28typedef struct WebRtcG722EncInst G722EncInst;
29typedef struct WebRtcG722DecInst G722DecInst;
30
31/* function for reading audio data from PCM file */
Peter Kastingdce40cf2015-08-24 14:52:23 -070032bool readframe(int16_t *data, FILE *inp, size_t length)
niklase@google.com470e71d2011-07-07 08:21:25 +000033{
Peter Kastingdce40cf2015-08-24 14:52:23 -070034 size_t rlen = fread(data, sizeof(int16_t), length, inp);
Peter Kasting728d9032015-06-11 14:31:38 -070035 if (rlen >= length)
36 return false;
37 memset(data + rlen, 0, (length - rlen) * sizeof(int16_t));
38 return true;
niklase@google.com470e71d2011-07-07 08:21:25 +000039}
40
41int main(int argc, char* argv[])
42{
43 char inname[60], outbit[40], outname[40];
44 FILE *inp, *outbitp, *outp;
45
Peter Kasting728d9032015-06-11 14:31:38 -070046 int framecnt;
47 bool endfile;
Peter Kastingdce40cf2015-08-24 14:52:23 -070048 size_t framelength = 160;
niklase@google.com470e71d2011-07-07 08:21:25 +000049 G722EncInst *G722enc_inst;
50 G722DecInst *G722dec_inst;
niklase@google.com470e71d2011-07-07 08:21:25 +000051
52 /* Runtime statistics */
53 double starttime;
kjellander@webrtc.org543c3ea2011-11-23 12:20:35 +000054 double runtime = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000055 double length_file;
56
Peter Kastingdce40cf2015-08-24 14:52:23 -070057 size_t stream_len = 0;
pbos@webrtc.org0946a562013-04-09 00:28:06 +000058 int16_t shortdata[960];
59 int16_t decoded[960];
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +000060 uint8_t streamdata[80 * 6];
pbos@webrtc.org0946a562013-04-09 00:28:06 +000061 int16_t speechType[1];
niklase@google.com470e71d2011-07-07 08:21:25 +000062
63 /* handling wrong input arguments in the command line */
64 if (argc!=5) {
65 printf("\n\nWrong number of arguments or flag values.\n\n");
66
67 printf("\n");
68 printf("Usage:\n\n");
69 printf("./testG722.exe framelength infile outbitfile outspeechfile \n\n");
70 printf("with:\n");
71 printf("framelength : Framelength in samples.\n\n");
72 printf("infile : Normal speech input file\n\n");
73 printf("outbitfile : Bitstream output file\n\n");
74 printf("outspeechfile: Speech output file\n\n");
75 exit(0);
76
77 }
78
79 /* Get frame length */
Peter Kastingdce40cf2015-08-24 14:52:23 -070080 int framelength_int = atoi(argv[1]);
81 if (framelength_int < 0) {
82 printf(" G.722: Invalid framelength %d.\n", framelength_int);
Peter Kastingf045e4d2015-06-10 21:15:38 -070083 exit(1);
84 }
Peter Kastingdce40cf2015-08-24 14:52:23 -070085 framelength = static_cast<size_t>(framelength_int);
niklase@google.com470e71d2011-07-07 08:21:25 +000086
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;
Peter Kasting728d9032015-06-11 14:31:38 -0700115 endfile = false;
116 while (!endfile) {
niklase@google.com470e71d2011-07-07 08:21:25 +0000117 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);
Peter Kastingdce40cf2015-08-24 14:52:23 -0700127 WebRtcG722_Decode(G722dec_inst, streamdata, stream_len, decoded,
128 speechType);
niklase@google.com470e71d2011-07-07 08:21:25 +0000129
130 /* Stop clock after call to encoder and decoder */
131 runtime += (double)((clock()/(double)CLOCKS_PER_SEC_G722)-starttime);
132
Peter Kastingdce40cf2015-08-24 14:52:23 -0700133 /* Write coded bits to file */
134 if (fwrite(streamdata, sizeof(short), stream_len / 2, outbitp) !=
135 stream_len / 2) {
136 return -1;
137 }
138 /* Write coded speech to file */
139 if (fwrite(decoded, sizeof(short), framelength, outp) !=
140 framelength) {
141 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000142 }
143 }
144
145 WebRtcG722_FreeEncoder((G722EncInst *)G722enc_inst);
146 WebRtcG722_FreeDecoder((G722DecInst *)G722dec_inst);
147
148 length_file = ((double)framecnt*(double)framelength/16000);
149 printf("\n\nLength of speech file: %.1f s\n", length_file);
150 printf("Time to run G.722: %.2f s (%.2f %% of realtime)\n\n", runtime, (100*runtime/length_file));
151 printf("---------------------END----------------------\n");
152
153 fclose(inp);
154 fclose(outbitp);
155 fclose(outp);
156
157 return 0;
158}