Only free state once in kiss-fft failed init path
[opus.git] / src / test_repacketizer.c
1
2
3 #include "opus.h"
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7
8 #define MAX_PACKETOUT 32000
9
10 void usage(char *argv0)
11 {
12    fprintf(stderr, "usage: %s [options] input_file output_file\n", argv0);
13 }
14
15 static void int_to_char(opus_uint32 i, unsigned char ch[4])
16 {
17     ch[0] = i>>24;
18     ch[1] = (i>>16)&0xFF;
19     ch[2] = (i>>8)&0xFF;
20     ch[3] = i&0xFF;
21 }
22
23 static opus_uint32 char_to_int(unsigned char ch[4])
24 {
25     return ((opus_uint32)ch[0]<<24) | ((opus_uint32)ch[1]<<16)
26          | ((opus_uint32)ch[2]<< 8) |  (opus_uint32)ch[3];
27 }
28
29 int main(int argc, char *argv[])
30 {
31    int i, eof=0;
32    FILE *fin, *fout;
33    unsigned char packets[48][1500];
34    int len[48];
35    int rng[48];
36    OpusRepacketizer *rp;
37    unsigned char output_packet[MAX_PACKETOUT];
38    int merge = 1, split=0;
39
40    if (argc < 3)
41    {
42       usage(argv[0]);
43       return 1;
44    }
45    for (i=1;i<argc-2;i++)
46    {
47       if (strcmp(argv[i], "-merge")==0)
48       {
49          merge = atoi(argv[i+1]);
50          if(merge<1)
51          {
52             fprintf(stderr, "-merge parameter must be at least 1.\n");
53             return 1;
54          }
55          i++;
56       } else if (strcmp(argv[i], "-split")==0)
57          split = 1;
58       else
59       {
60          fprintf(stderr, "Unknown option: %s\n", argv[i]);
61          usage(argv[0]);
62          return 1;
63       }
64    }
65    fin = fopen(argv[argc-2], "r");
66    if(fin==NULL)
67    {
68      fprintf(stderr, "Error opening input file: %s\n", argv[argc-2]);
69      return 1;
70    }
71    fout = fopen(argv[argc-1], "w");
72    if(fout==NULL)
73    {
74      fprintf(stderr, "Error opening output file: %s\n", argv[argc-1]);
75      return 1;
76    }
77
78    rp = opus_repacketizer_create();
79    while (!eof)
80    {
81       int err;
82       int nb_packets=merge;
83       opus_repacketizer_init(rp);
84       for (i=0;i<nb_packets;i++)
85       {
86          unsigned char ch[4];
87          err = fread(ch, 1, 4, fin);
88          len[i] = char_to_int(ch);
89          /*fprintf(stderr, "in len = %d\n", len[i]);*/
90          if (len[i]>1500 || len[i]<0)
91          {
92              if (feof(fin))
93              {
94                 eof = 1;
95              } else {
96                 fprintf(stderr, "Invalid payload length\n");
97                 return 1;
98              }
99              break;
100          }
101          err = fread(ch, 1, 4, fin);
102          rng[i] = char_to_int(ch);
103          err = fread(packets[i], 1, len[i], fin);
104          if (feof(fin))
105          {
106             eof = 1;
107             break;
108          }
109          err = opus_repacketizer_cat(rp, packets[i], len[i]);
110          if (err!=OPUS_OK)
111          {
112             fprintf(stderr, "opus_repacketizer_cat() failed: %s\n", opus_strerror(err));
113             break;
114          }
115       }
116       nb_packets = i;
117
118       if (eof)
119          break;
120
121       if (!split)
122       {
123          err = opus_repacketizer_out(rp, output_packet, MAX_PACKETOUT);
124          if (err>0) {
125             unsigned char int_field[4];
126             int_to_char(err, int_field);
127             fwrite(int_field, 1, 4, fout);
128             int_to_char(rng[nb_packets-1], int_field);
129             fwrite(int_field, 1, 4, fout);
130             fwrite(output_packet, 1, err, fout);
131             /*fprintf(stderr, "out len = %d\n", err);*/
132          } else {
133             fprintf(stderr, "opus_repacketizer_out() failed: %s\n", opus_strerror(err));
134          }
135       } else {
136          int nb_frames = opus_repacketizer_get_nb_frames(rp);
137          for (i=0;i<nb_frames;i++)
138          {
139             err = opus_repacketizer_out_range(rp, i, i+1, output_packet, MAX_PACKETOUT);
140             if (err>0) {
141                unsigned char int_field[4];
142                int_to_char(err, int_field);
143                fwrite(int_field, 1, 4, fout);
144                if (i==nb_frames-1)
145                   int_to_char(rng[nb_packets-1], int_field);
146                else
147                   int_to_char(0, int_field);
148                fwrite(int_field, 1, 4, fout);
149                fwrite(output_packet, 1, err, fout);
150                /*fprintf(stderr, "out len = %d\n", err);*/
151             } else {
152                fprintf(stderr, "opus_repacketizer_out() failed: %s\n", opus_strerror(err));
153             }
154
155          }
156       }
157
158    }
159
160    fclose(fin);
161    fclose(fout);
162    return 0;
163 }