Fix some inconsequential file descriptor leaks in the demo tools to silence cppcheck...
[opus.git] / src / repacketizer_demo.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      fclose(fin);
76      return 1;
77    }
78
79    rp = opus_repacketizer_create();
80    while (!eof)
81    {
82       int err;
83       int nb_packets=merge;
84       opus_repacketizer_init(rp);
85       for (i=0;i<nb_packets;i++)
86       {
87          unsigned char ch[4];
88          err = fread(ch, 1, 4, fin);
89          len[i] = char_to_int(ch);
90          /*fprintf(stderr, "in len = %d\n", len[i]);*/
91          if (len[i]>1500 || len[i]<0)
92          {
93              if (feof(fin))
94              {
95                 eof = 1;
96              } else {
97                 fprintf(stderr, "Invalid payload length\n");
98                 fclose(fin);
99                 fclose(fout);
100                 return 1;
101              }
102              break;
103          }
104          err = fread(ch, 1, 4, fin);
105          rng[i] = char_to_int(ch);
106          err = fread(packets[i], 1, len[i], fin);
107          if (feof(fin))
108          {
109             eof = 1;
110             break;
111          }
112          err = opus_repacketizer_cat(rp, packets[i], len[i]);
113          if (err!=OPUS_OK)
114          {
115             fprintf(stderr, "opus_repacketizer_cat() failed: %s\n", opus_strerror(err));
116             break;
117          }
118       }
119       nb_packets = i;
120
121       if (eof)
122          break;
123
124       if (!split)
125       {
126          err = opus_repacketizer_out(rp, output_packet, MAX_PACKETOUT);
127          if (err>0) {
128             unsigned char int_field[4];
129             int_to_char(err, int_field);
130             fwrite(int_field, 1, 4, fout);
131             int_to_char(rng[nb_packets-1], int_field);
132             fwrite(int_field, 1, 4, fout);
133             fwrite(output_packet, 1, err, fout);
134             /*fprintf(stderr, "out len = %d\n", err);*/
135          } else {
136             fprintf(stderr, "opus_repacketizer_out() failed: %s\n", opus_strerror(err));
137          }
138       } else {
139          int nb_frames = opus_repacketizer_get_nb_frames(rp);
140          for (i=0;i<nb_frames;i++)
141          {
142             err = opus_repacketizer_out_range(rp, i, i+1, output_packet, MAX_PACKETOUT);
143             if (err>0) {
144                unsigned char int_field[4];
145                int_to_char(err, int_field);
146                fwrite(int_field, 1, 4, fout);
147                if (i==nb_frames-1)
148                   int_to_char(rng[nb_packets-1], int_field);
149                else
150                   int_to_char(0, int_field);
151                fwrite(int_field, 1, 4, fout);
152                fwrite(output_packet, 1, err, fout);
153                /*fprintf(stderr, "out len = %d\n", err);*/
154             } else {
155                fprintf(stderr, "opus_repacketizer_out() failed: %s\n", opus_strerror(err));
156             }
157
158          }
159       }
160
161    }
162
163    fclose(fin);
164    fclose(fout);
165    return 0;
166 }