Completed VBR for 0.5.0 release
[speexdsp.git] / libspeex / testenc.c
1 #include "speex.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 #define FRAME_SIZE 160
6 #include <math.h>
7 int main(int argc, char **argv)
8 {
9    char *inFile, *outFile, *bitsFile;
10    FILE *fin, *fout, *fbits=NULL;
11    short in[FRAME_SIZE];
12    float input[FRAME_SIZE], bak[FRAME_SIZE], bak2[FRAME_SIZE];
13    char cbits[200];
14    int nbBits;
15    int i;
16    void *st;
17    void *dec;
18    SpeexBits bits;
19    int tmp;
20    int bitCount=0;
21
22    for (i=0;i<FRAME_SIZE;i++)
23       bak2[i]=0;
24    st = speex_encoder_init(&speex_nb_mode);
25    dec = speex_decoder_init(&speex_nb_mode);
26
27    tmp=1;
28    speex_decoder_ctl(dec, SPEEX_SET_PF, &tmp);
29    tmp=0;
30    speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp);
31    tmp=10;
32    speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp);
33
34    if (argc != 4 && argc != 3)
35    {
36       fprintf (stderr, "Usage: encode [in file] [out file] [bits file]\nargc = %d", argc);
37       exit(1);
38    }
39    inFile = argv[1];
40    fin = fopen(inFile, "r");
41    outFile = argv[2];
42    fout = fopen(outFile, "w");
43    if (argc==4)
44    {
45       bitsFile = argv[3];
46       fbits = fopen(bitsFile, "w");
47    }
48    speex_bits_init(&bits);
49    while (!feof(fin))
50    {
51       fread(in, sizeof(short), FRAME_SIZE, fin);
52       if (feof(fin))
53          break;
54       for (i=0;i<FRAME_SIZE;i++)
55          bak[i]=input[i]=in[i];
56       speex_bits_reset(&bits);
57       speex_encode(st, input, &bits);
58       nbBits = speex_bits_write(&bits, cbits, 200);
59       bitCount+=bits.nbBits;
60       printf ("Encoding frame in %d bits\n", nbBits*8);
61       if (argc==4)
62          fwrite(cbits, 1, nbBits, fbits);
63       {
64          float enoise=0, esig=0, snr;
65          for (i=0;i<FRAME_SIZE;i++)
66          {
67             enoise+=(bak2[i]-input[i])*(bak2[i]-input[i]);
68             esig += bak2[i]*bak2[i];
69          }
70          snr = 10*log10((esig+1)/(enoise+1));
71          printf ("real SNR = %f\n", snr);
72       }
73       speex_bits_rewind(&bits);
74       
75       speex_decode(dec, &bits, input, 0);
76
77       /* Save the bits here */
78       for (i=0;i<FRAME_SIZE;i++)
79       {
80          if (input[i]>32000)
81             input[i]=32000;
82          else if (input[i]<-32000)
83             input[i]=-32000;
84       }
85       speex_bits_reset(&bits);
86       for (i=0;i<FRAME_SIZE;i++)
87          in[i]=input[i];
88       for (i=0;i<FRAME_SIZE;i++)
89          bak2[i]=bak[i];
90       fwrite(in, sizeof(short), FRAME_SIZE, fout);
91    }
92    fprintf (stderr, "Total encoded size: %d bits\n", bitCount);
93    
94    speex_encoder_destroy(st);
95    speex_decoder_destroy(dec);
96    return 1;
97 }