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 "webrtc/typedefs.h"
19
20/* include API */
21#include "webrtc/modules/audio_coding/codecs/g722/g722_interface.h"
22
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 */
32bool readframe(int16_t *data, FILE *inp, size_t length)
33{
34    size_t rlen = fread(data, sizeof(int16_t), length, inp);
35    if (rlen >= length)
36      return false;
37    memset(data + rlen, 0, (length - rlen) * sizeof(int16_t));
38    return true;
39}
40
41int main(int argc, char* argv[])
42{
43    char inname[60], outbit[40], outname[40];
44    FILE *inp, *outbitp, *outp;
45
46    int framecnt;
47    bool endfile;
48    size_t framelength = 160;
49    G722EncInst *G722enc_inst;
50    G722DecInst *G722dec_inst;
51
52    /* Runtime statistics */
53    double starttime;
54    double runtime = 0;
55    double length_file;
56
57    size_t stream_len = 0;
58    int16_t shortdata[960];
59    int16_t decoded[960];
60    uint8_t streamdata[80 * 6];
61    int16_t speechType[1];
62
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 */
80    int framelength_int = atoi(argv[1]);
81    if (framelength_int < 0) {
82        printf("  G.722: Invalid framelength %d.\n", framelength_int);
83        exit(1);
84    }
85    framelength = static_cast<size_t>(framelength_int);
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 = false;
116    while (!endfile) {
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        WebRtcG722_Decode(G722dec_inst, streamdata, stream_len, decoded,
128                          speechType);
129
130        /* Stop clock after call to encoder and decoder */
131        runtime += (double)((clock()/(double)CLOCKS_PER_SEC_G722)-starttime);
132
133        /* 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;
142        }
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}
159