1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Copyright (c) 2011 Xiph.Org Foundation
2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Written by Jean-Marc Valin */
3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*
4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Redistribution and use in source and binary forms, with or without
5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   modification, are permitted provided that the following conditions
6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   are met:
7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   - Redistributions of source code must retain the above copyright
9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   notice, this list of conditions and the following disclaimer.
10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
11885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   - Redistributions in binary form must reproduce the above copyright
12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   notice, this list of conditions and the following disclaimer in the
13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   documentation and/or other materials provided with the distribution.
14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
15885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org*/
27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef HAVE_CONFIG_H
29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "config.h"
30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "opus.h"
33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <stdio.h>
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <stdlib.h>
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <string.h>
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define MAX_PACKETOUT 32000
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid usage(char *argv0)
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   fprintf(stderr, "usage: %s [options] input_file output_file\n", argv0);
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstatic void int_to_char(opus_uint32 i, unsigned char ch[4])
45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ch[0] = i>>24;
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ch[1] = (i>>16)&0xFF;
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ch[2] = (i>>8)&0xFF;
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ch[3] = i&0xFF;
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstatic opus_uint32 char_to_int(unsigned char ch[4])
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    return ((opus_uint32)ch[0]<<24) | ((opus_uint32)ch[1]<<16)
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         | ((opus_uint32)ch[2]<< 8) |  (opus_uint32)ch[3];
56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgint main(int argc, char *argv[])
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int i, eof=0;
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   FILE *fin, *fout;
62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   unsigned char packets[48][1500];
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int len[48];
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int rng[48];
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   OpusRepacketizer *rp;
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   unsigned char output_packet[MAX_PACKETOUT];
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int merge = 1, split=0;
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if (argc < 3)
70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      usage(argv[0]);
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      return EXIT_FAILURE;
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (i=1;i<argc-2;i++)
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (strcmp(argv[i], "-merge")==0)
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         merge = atoi(argv[i+1]);
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         if(merge<1)
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         {
81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            fprintf(stderr, "-merge parameter must be at least 1.\n");
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            return EXIT_FAILURE;
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         }
843c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com         if(merge>48)
853c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com         {
863c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com            fprintf(stderr, "-merge parameter must be less than 48.\n");
873c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com            return EXIT_FAILURE;
883c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com         }
89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         i++;
90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      } else if (strcmp(argv[i], "-split")==0)
91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         split = 1;
92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      else
93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         fprintf(stderr, "Unknown option: %s\n", argv[i]);
95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         usage(argv[0]);
96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         return EXIT_FAILURE;
97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   fin = fopen(argv[argc-2], "r");
100885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if(fin==NULL)
101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org     fprintf(stderr, "Error opening input file: %s\n", argv[argc-2]);
103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org     return EXIT_FAILURE;
104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   fout = fopen(argv[argc-1], "w");
106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if(fout==NULL)
107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org     fprintf(stderr, "Error opening output file: %s\n", argv[argc-1]);
109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org     fclose(fin);
110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org     return EXIT_FAILURE;
111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   rp = opus_repacketizer_create();
114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   while (!eof)
115885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      int err;
117885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      int nb_packets=merge;
118885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_repacketizer_init(rp);
119885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      for (i=0;i<nb_packets;i++)
120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         unsigned char ch[4];
122885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         err = fread(ch, 1, 4, fin);
123885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         len[i] = char_to_int(ch);
124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         /*fprintf(stderr, "in len = %d\n", len[i]);*/
125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         if (len[i]>1500 || len[i]<0)
126885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         {
127885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org             if (feof(fin))
128885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org             {
129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                eof = 1;
130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org             } else {
131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                fprintf(stderr, "Invalid payload length\n");
132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                fclose(fin);
133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                fclose(fout);
134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                return EXIT_FAILURE;
135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org             }
136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org             break;
137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         }
138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         err = fread(ch, 1, 4, fin);
139885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         rng[i] = char_to_int(ch);
140885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         err = fread(packets[i], 1, len[i], fin);
141885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         if (feof(fin))
142885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         {
143885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            eof = 1;
144885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            break;
145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         }
146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         err = opus_repacketizer_cat(rp, packets[i], len[i]);
147885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         if (err!=OPUS_OK)
148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         {
149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            fprintf(stderr, "opus_repacketizer_cat() failed: %s\n", opus_strerror(err));
150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            break;
151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         }
152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      nb_packets = i;
154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (eof)
156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         break;
157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
158885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (!split)
159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         err = opus_repacketizer_out(rp, output_packet, MAX_PACKETOUT);
161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         if (err>0) {
162885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            unsigned char int_field[4];
163885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            int_to_char(err, int_field);
164885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            if(fwrite(int_field, 1, 4, fout)!=4){
165885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               fprintf(stderr, "Error writing.\n");
166885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               return EXIT_FAILURE;
167885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            }
168885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            int_to_char(rng[nb_packets-1], int_field);
169885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            if (fwrite(int_field, 1, 4, fout)!=4) {
170885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               fprintf(stderr, "Error writing.\n");
171885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               return EXIT_FAILURE;
172885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            }
173885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            if (fwrite(output_packet, 1, err, fout)!=(unsigned)err) {
174885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               fprintf(stderr, "Error writing.\n");
175885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               return EXIT_FAILURE;
176885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            }
177885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            /*fprintf(stderr, "out len = %d\n", err);*/
178885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         } else {
179885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            fprintf(stderr, "opus_repacketizer_out() failed: %s\n", opus_strerror(err));
180885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         }
181885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      } else {
182885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         int nb_frames = opus_repacketizer_get_nb_frames(rp);
183885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         for (i=0;i<nb_frames;i++)
184885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         {
185885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            err = opus_repacketizer_out_range(rp, i, i+1, output_packet, MAX_PACKETOUT);
186885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            if (err>0) {
187885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               unsigned char int_field[4];
188885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               int_to_char(err, int_field);
189885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               if (fwrite(int_field, 1, 4, fout)!=4) {
190885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                  fprintf(stderr, "Error writing.\n");
191885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                  return EXIT_FAILURE;
192885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               }
193885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               if (i==nb_frames-1)
194885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                  int_to_char(rng[nb_packets-1], int_field);
195885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               else
196885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                  int_to_char(0, int_field);
197885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               if (fwrite(int_field, 1, 4, fout)!=4) {
198885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                  fprintf(stderr, "Error writing.\n");
199885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                  return EXIT_FAILURE;
200885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               }
201885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               if (fwrite(output_packet, 1, err, fout)!=(unsigned)err) {
202885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                  fprintf(stderr, "Error writing.\n");
203885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                  return EXIT_FAILURE;
204885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               }
205885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               /*fprintf(stderr, "out len = %d\n", err);*/
206885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            } else {
207885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               fprintf(stderr, "opus_repacketizer_out() failed: %s\n", opus_strerror(err));
208885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            }
209885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
210885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         }
211885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
212885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
213885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
214885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   fclose(fin);
215885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   fclose(fout);
216885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   return EXIT_SUCCESS;
217885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
218