Home | History | Annotate | Download | only in test
      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