xref: /aosp_15_r20/external/speex/doc/sampleenc.c (revision 28e138c64d234588b5cd2a8a403b584bd3036e4e)
1*28e138c6SAndroid Build Coastguard Worker #include <speex/speex.h>
2*28e138c6SAndroid Build Coastguard Worker #include <stdio.h>
3*28e138c6SAndroid Build Coastguard Worker 
4*28e138c6SAndroid Build Coastguard Worker /*The frame size in hardcoded for this sample code but it doesn't have to be*/
5*28e138c6SAndroid Build Coastguard Worker #define FRAME_SIZE 160
main(int argc,char ** argv)6*28e138c6SAndroid Build Coastguard Worker int main(int argc, char **argv)
7*28e138c6SAndroid Build Coastguard Worker {
8*28e138c6SAndroid Build Coastguard Worker    char *inFile;
9*28e138c6SAndroid Build Coastguard Worker    FILE *fin;
10*28e138c6SAndroid Build Coastguard Worker    short in[FRAME_SIZE];
11*28e138c6SAndroid Build Coastguard Worker    float input[FRAME_SIZE];
12*28e138c6SAndroid Build Coastguard Worker    char cbits[200];
13*28e138c6SAndroid Build Coastguard Worker    int nbBytes;
14*28e138c6SAndroid Build Coastguard Worker    /*Holds the state of the encoder*/
15*28e138c6SAndroid Build Coastguard Worker    void *state;
16*28e138c6SAndroid Build Coastguard Worker    /*Holds bits so they can be read and written to by the Speex routines*/
17*28e138c6SAndroid Build Coastguard Worker    SpeexBits bits;
18*28e138c6SAndroid Build Coastguard Worker    int i, tmp;
19*28e138c6SAndroid Build Coastguard Worker 
20*28e138c6SAndroid Build Coastguard Worker    /*Create a new encoder state in narrowband mode*/
21*28e138c6SAndroid Build Coastguard Worker    state = speex_encoder_init(&speex_nb_mode);
22*28e138c6SAndroid Build Coastguard Worker 
23*28e138c6SAndroid Build Coastguard Worker    /*Set the quality to 8 (15 kbps)*/
24*28e138c6SAndroid Build Coastguard Worker    tmp=8;
25*28e138c6SAndroid Build Coastguard Worker    speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp);
26*28e138c6SAndroid Build Coastguard Worker 
27*28e138c6SAndroid Build Coastguard Worker    inFile = argv[1];
28*28e138c6SAndroid Build Coastguard Worker    fin = fopen(inFile, "r");
29*28e138c6SAndroid Build Coastguard Worker 
30*28e138c6SAndroid Build Coastguard Worker    /*Initialization of the structure that holds the bits*/
31*28e138c6SAndroid Build Coastguard Worker    speex_bits_init(&bits);
32*28e138c6SAndroid Build Coastguard Worker    while (1)
33*28e138c6SAndroid Build Coastguard Worker    {
34*28e138c6SAndroid Build Coastguard Worker       /*Read a 16 bits/sample audio frame*/
35*28e138c6SAndroid Build Coastguard Worker       fread(in, sizeof(short), FRAME_SIZE, fin);
36*28e138c6SAndroid Build Coastguard Worker       if (feof(fin))
37*28e138c6SAndroid Build Coastguard Worker          break;
38*28e138c6SAndroid Build Coastguard Worker       /*Copy the 16 bits values to float so Speex can work on them*/
39*28e138c6SAndroid Build Coastguard Worker       for (i=0;i<FRAME_SIZE;i++)
40*28e138c6SAndroid Build Coastguard Worker          input[i]=in[i];
41*28e138c6SAndroid Build Coastguard Worker 
42*28e138c6SAndroid Build Coastguard Worker       /*Flush all the bits in the struct so we can encode a new frame*/
43*28e138c6SAndroid Build Coastguard Worker       speex_bits_reset(&bits);
44*28e138c6SAndroid Build Coastguard Worker 
45*28e138c6SAndroid Build Coastguard Worker       /*Encode the frame*/
46*28e138c6SAndroid Build Coastguard Worker       speex_encode(state, input, &bits);
47*28e138c6SAndroid Build Coastguard Worker       /*Copy the bits to an array of char that can be written*/
48*28e138c6SAndroid Build Coastguard Worker       nbBytes = speex_bits_write(&bits, cbits, 200);
49*28e138c6SAndroid Build Coastguard Worker 
50*28e138c6SAndroid Build Coastguard Worker       /*Write the size of the frame first. This is what sampledec expects but
51*28e138c6SAndroid Build Coastguard Worker        it's likely to be different in your own application*/
52*28e138c6SAndroid Build Coastguard Worker       fwrite(&nbBytes, sizeof(int), 1, stdout);
53*28e138c6SAndroid Build Coastguard Worker       /*Write the compressed data*/
54*28e138c6SAndroid Build Coastguard Worker       fwrite(cbits, 1, nbBytes, stdout);
55*28e138c6SAndroid Build Coastguard Worker 
56*28e138c6SAndroid Build Coastguard Worker    }
57*28e138c6SAndroid Build Coastguard Worker 
58*28e138c6SAndroid Build Coastguard Worker    /*Destroy the encoder state*/
59*28e138c6SAndroid Build Coastguard Worker    speex_encoder_destroy(state);
60*28e138c6SAndroid Build Coastguard Worker    /*Destroy the bit-packing struct*/
61*28e138c6SAndroid Build Coastguard Worker    speex_bits_destroy(&bits);
62*28e138c6SAndroid Build Coastguard Worker    fclose(fin);
63*28e138c6SAndroid Build Coastguard Worker    return 0;
64*28e138c6SAndroid Build Coastguard Worker }
65