Adds 3rd clause to CELT license
[opus.git] / src / repacketizer_demo.c
1 /* Copyright (c) 2011 Xiph.Org Foundation
2    Written by Jean-Marc Valin */
3 /*
4    Redistribution and use in source and binary forms, with or without
5    modification, are permitted provided that the following conditions
6    are met:
7
8    - Redistributions of source code must retain the above copyright
9    notice, this list of conditions and the following disclaimer.
10
11    - Redistributions in binary form must reproduce the above copyright
12    notice, this list of conditions and the following disclaimer in the
13    documentation and/or other materials provided with the distribution.
14
15    - Neither the name of Internet Society, IETF or IETF Trust, nor the
16    names of specific contributors, may be used to endorse or promote
17    products derived from this software without specific prior written
18    permission.
19
20    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
24    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33 #ifdef HAVE_CONFIG_H
34 #include "config.h"
35 #endif
36
37 #include "opus.h"
38 #include <stdio.h>
39 #include <stdlib.h>
40 #include <string.h>
41
42 #define MAX_PACKETOUT 32000
43
44 void usage(char *argv0)
45 {
46    fprintf(stderr, "usage: %s [options] input_file output_file\n", argv0);
47 }
48
49 static void int_to_char(opus_uint32 i, unsigned char ch[4])
50 {
51     ch[0] = i>>24;
52     ch[1] = (i>>16)&0xFF;
53     ch[2] = (i>>8)&0xFF;
54     ch[3] = i&0xFF;
55 }
56
57 static opus_uint32 char_to_int(unsigned char ch[4])
58 {
59     return ((opus_uint32)ch[0]<<24) | ((opus_uint32)ch[1]<<16)
60          | ((opus_uint32)ch[2]<< 8) |  (opus_uint32)ch[3];
61 }
62
63 int main(int argc, char *argv[])
64 {
65    int i, eof=0;
66    FILE *fin, *fout;
67    unsigned char packets[48][1500];
68    int len[48];
69    int rng[48];
70    OpusRepacketizer *rp;
71    unsigned char output_packet[MAX_PACKETOUT];
72    int merge = 1, split=0;
73
74    if (argc < 3)
75    {
76       usage(argv[0]);
77       return 1;
78    }
79    for (i=1;i<argc-2;i++)
80    {
81       if (strcmp(argv[i], "-merge")==0)
82       {
83          merge = atoi(argv[i+1]);
84          if(merge<1)
85          {
86             fprintf(stderr, "-merge parameter must be at least 1.\n");
87             return 1;
88          }
89          i++;
90       } else if (strcmp(argv[i], "-split")==0)
91          split = 1;
92       else
93       {
94          fprintf(stderr, "Unknown option: %s\n", argv[i]);
95          usage(argv[0]);
96          return 1;
97       }
98    }
99    fin = fopen(argv[argc-2], "r");
100    if(fin==NULL)
101    {
102      fprintf(stderr, "Error opening input file: %s\n", argv[argc-2]);
103      return 1;
104    }
105    fout = fopen(argv[argc-1], "w");
106    if(fout==NULL)
107    {
108      fprintf(stderr, "Error opening output file: %s\n", argv[argc-1]);
109      fclose(fin);
110      return 1;
111    }
112
113    rp = opus_repacketizer_create();
114    while (!eof)
115    {
116       int err;
117       int nb_packets=merge;
118       opus_repacketizer_init(rp);
119       for (i=0;i<nb_packets;i++)
120       {
121          unsigned char ch[4];
122          err = fread(ch, 1, 4, fin);
123          len[i] = char_to_int(ch);
124          /*fprintf(stderr, "in len = %d\n", len[i]);*/
125          if (len[i]>1500 || len[i]<0)
126          {
127              if (feof(fin))
128              {
129                 eof = 1;
130              } else {
131                 fprintf(stderr, "Invalid payload length\n");
132                 fclose(fin);
133                 fclose(fout);
134                 return 1;
135              }
136              break;
137          }
138          err = fread(ch, 1, 4, fin);
139          rng[i] = char_to_int(ch);
140          err = fread(packets[i], 1, len[i], fin);
141          if (feof(fin))
142          {
143             eof = 1;
144             break;
145          }
146          err = opus_repacketizer_cat(rp, packets[i], len[i]);
147          if (err!=OPUS_OK)
148          {
149             fprintf(stderr, "opus_repacketizer_cat() failed: %s\n", opus_strerror(err));
150             break;
151          }
152       }
153       nb_packets = i;
154
155       if (eof)
156          break;
157
158       if (!split)
159       {
160          err = opus_repacketizer_out(rp, output_packet, MAX_PACKETOUT);
161          if (err>0) {
162             unsigned char int_field[4];
163             int_to_char(err, int_field);
164             fwrite(int_field, 1, 4, fout);
165             int_to_char(rng[nb_packets-1], int_field);
166             fwrite(int_field, 1, 4, fout);
167             fwrite(output_packet, 1, err, fout);
168             /*fprintf(stderr, "out len = %d\n", err);*/
169          } else {
170             fprintf(stderr, "opus_repacketizer_out() failed: %s\n", opus_strerror(err));
171          }
172       } else {
173          int nb_frames = opus_repacketizer_get_nb_frames(rp);
174          for (i=0;i<nb_frames;i++)
175          {
176             err = opus_repacketizer_out_range(rp, i, i+1, output_packet, MAX_PACKETOUT);
177             if (err>0) {
178                unsigned char int_field[4];
179                int_to_char(err, int_field);
180                fwrite(int_field, 1, 4, fout);
181                if (i==nb_frames-1)
182                   int_to_char(rng[nb_packets-1], int_field);
183                else
184                   int_to_char(0, int_field);
185                fwrite(int_field, 1, 4, fout);
186                fwrite(output_packet, 1, err, fout);
187                /*fprintf(stderr, "out len = %d\n", err);*/
188             } else {
189                fprintf(stderr, "opus_repacketizer_out() failed: %s\n", opus_strerror(err));
190             }
191
192          }
193       }
194
195    }
196
197    fclose(fin);
198    fclose(fout);
199    return 0;
200 }