tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

testG722.cc (4687B)


      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 <cstdint>
     16 #include <cstdio>
     17 #include <cstdlib>
     18 #include <cstring>
     19 #include <ctime>
     20 
     21 #include "modules/audio_coding/codecs/g722/g722_interface.h"
     22 
     23 /* Runtime statistics */
     24 #define CLOCKS_PER_SEC_G722 100000
     25 
     26 // Forward declaration
     27 typedef struct WebRtcG722EncInst G722EncInst;
     28 typedef struct WebRtcG722DecInst G722DecInst;
     29 
     30 /* function for reading audio data from PCM file */
     31 bool readframe(int16_t* data, FILE* inp, size_t length) {
     32  size_t rlen = fread(data, sizeof(int16_t), length, inp);
     33  if (rlen >= length)
     34    return false;
     35  memset(data + rlen, 0, (length - rlen) * sizeof(int16_t));
     36  return true;
     37 }
     38 
     39 int main(int argc, char* argv[]) {
     40  char inname[60], outbit[40], outname[40];
     41  FILE *inp, *outbitp, *outp;
     42 
     43  int framecnt;
     44  bool endfile;
     45  size_t framelength = 160;
     46  G722EncInst* G722enc_inst;
     47  G722DecInst* G722dec_inst;
     48 
     49  /* Runtime statistics */
     50  double starttime;
     51  double runtime = 0;
     52  double length_file;
     53 
     54  size_t stream_len = 0;
     55  int16_t shortdata[960];
     56  int16_t decoded[960];
     57  uint8_t streamdata[80 * 6];
     58  int16_t speechType[1];
     59 
     60  /* handling wrong input arguments in the command line */
     61  if (argc != 5) {
     62    printf("\n\nWrong number of arguments or flag values.\n\n");
     63 
     64    printf("\n");
     65    printf("Usage:\n\n");
     66    printf("./testG722.exe framelength infile outbitfile outspeechfile \n\n");
     67    printf("with:\n");
     68    printf("framelength  :    Framelength in samples.\n\n");
     69    printf("infile       :    Normal speech input file\n\n");
     70    printf("outbitfile   :    Bitstream output file\n\n");
     71    printf("outspeechfile:    Speech output file\n\n");
     72    exit(0);
     73  }
     74 
     75  /* Get frame length */
     76  int framelength_int = atoi(argv[1]);
     77  if (framelength_int < 0) {
     78    printf("  G.722: Invalid framelength %d.\n", framelength_int);
     79    exit(1);
     80  }
     81  framelength = static_cast<size_t>(framelength_int);
     82 
     83  /* Get Input and Output files */
     84  sscanf(argv[2], "%s", inname);
     85  sscanf(argv[3], "%s", outbit);
     86  sscanf(argv[4], "%s", outname);
     87 
     88  if ((inp = fopen(inname, "rb")) == nullptr) {
     89    printf("  G.722: Cannot read file %s.\n", inname);
     90    exit(1);
     91  }
     92  if ((outbitp = fopen(outbit, "wb")) == nullptr) {
     93    printf("  G.722: Cannot write file %s.\n", outbit);
     94    exit(1);
     95  }
     96  if ((outp = fopen(outname, "wb")) == nullptr) {
     97    printf("  G.722: Cannot write file %s.\n", outname);
     98    exit(1);
     99  }
    100  printf("\nInput:%s\nOutput bitstream:%s\nOutput:%s\n", inname, outbit,
    101         outname);
    102 
    103  /* Create and init */
    104  WebRtcG722_CreateEncoder((G722EncInst**)&G722enc_inst);
    105  WebRtcG722_CreateDecoder((G722DecInst**)&G722dec_inst);
    106  WebRtcG722_EncoderInit((G722EncInst*)G722enc_inst);
    107  WebRtcG722_DecoderInit((G722DecInst*)G722dec_inst);
    108 
    109  /* Initialize encoder and decoder */
    110  framecnt = 0;
    111  endfile = false;
    112  while (!endfile) {
    113    framecnt++;
    114 
    115    /* Read speech block */
    116    endfile = readframe(shortdata, inp, framelength);
    117 
    118    /* Start clock before call to encoder and decoder */
    119    starttime = clock() / (double)CLOCKS_PER_SEC_G722;
    120 
    121    /* G.722 encoding + decoding */
    122    stream_len = WebRtcG722_Encode((G722EncInst*)G722enc_inst, shortdata,
    123                                   framelength, streamdata);
    124    WebRtcG722_Decode(G722dec_inst, streamdata, stream_len, decoded,
    125                      speechType);
    126 
    127    /* Stop clock after call to encoder and decoder */
    128    runtime += (double)((clock() / (double)CLOCKS_PER_SEC_G722) - starttime);
    129 
    130    /* Write coded bits to file */
    131    if (fwrite(streamdata, sizeof(short), stream_len / 2, outbitp) !=
    132        stream_len / 2) {
    133      return -1;
    134    }
    135    /* Write coded speech to file */
    136    if (fwrite(decoded, sizeof(short), framelength, outp) != framelength) {
    137      return -1;
    138    }
    139  }
    140 
    141  WebRtcG722_FreeEncoder((G722EncInst*)G722enc_inst);
    142  WebRtcG722_FreeDecoder((G722DecInst*)G722dec_inst);
    143 
    144  length_file = ((double)framecnt * (double)framelength / 16000);
    145  printf("\n\nLength of speech file: %.1f s\n", length_file);
    146  printf("Time to run G.722:      %.2f s (%.2f %% of realtime)\n\n", runtime,
    147         (100 * runtime / length_file));
    148  printf("---------------------END----------------------\n");
    149 
    150  fclose(inp);
    151  fclose(outbitp);
    152  fclose(outp);
    153 
    154  return 0;
    155 }