Simplifying buffering to make an Opus-level highpass possible
[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          i++;
51       } else if (strcmp(argv[i], "-split")==0)
52          split = 1;
53       else
54       {
55          fprintf(stderr, "Unknown option: %s\n", argv[i]);
56          usage(argv[0]);
57          return 1;
58       }
59    }
60    fin = fopen(argv[argc-2], "r");
61    fout = fopen(argv[argc-1], "w");
62
63    rp = opus_repacketizer_create();
64    while (!eof)
65    {
66       int err;
67       int nb_packets=merge;
68       opus_repacketizer_init(rp);
69       for (i=0;i<nb_packets;i++)
70       {
71          unsigned char ch[4];
72          err = fread(ch, 1, 4, fin);
73          len[i] = char_to_int(ch);
74          /*fprintf(stderr, "in len = %d\n", len[i]);*/
75          if (len[i]>1500 || len[i]<0)
76          {
77              if (feof(fin))
78                 eof = 1;
79              else
80                 fprintf(stderr, "Invalid payload length\n");
81              break;
82          }
83          err = fread(ch, 1, 4, fin);
84          rng[i] = char_to_int(ch);
85          err = fread(packets[i], 1, len[i], fin);
86          if (feof(fin))
87          {
88             eof = 1;
89             break;
90          }
91          err = opus_repacketizer_cat(rp, packets[i], len[i]);
92          if (err!=OPUS_OK)
93          {
94             fprintf(stderr, "opus_repacketizer_cat() failed: %s\n", opus_strerror(err));
95             break;
96          }
97       }
98       nb_packets = i;
99
100       if (eof)
101          break;
102
103       if (!split)
104       {
105          err = opus_repacketizer_out(rp, output_packet, MAX_PACKETOUT);
106          if (err>0) {
107             unsigned char int_field[4];
108             int_to_char(err, int_field);
109             fwrite(int_field, 1, 4, fout);
110             int_to_char(rng[nb_packets-1], int_field);
111             fwrite(int_field, 1, 4, fout);
112             fwrite(output_packet, 1, err, fout);
113             /*fprintf(stderr, "out len = %d\n", err);*/
114          } else {
115             fprintf(stderr, "opus_repacketizer_out() failed: %s\n", opus_strerror(err));
116          }
117       } else {
118          int nb_frames = opus_repacketizer_get_nb_frames(rp);
119          for (i=0;i<nb_frames;i++)
120          {
121             err = opus_repacketizer_out_range(rp, i, i+1, output_packet, MAX_PACKETOUT);
122             if (err>0) {
123                unsigned char int_field[4];
124                int_to_char(err, int_field);
125                fwrite(int_field, 1, 4, fout);
126                if (i==nb_frames-1)
127                   int_to_char(rng[nb_packets-1], int_field);
128                else
129                   int_to_char(0, int_field);
130                fwrite(int_field, 1, 4, fout);
131                fwrite(output_packet, 1, err, fout);
132                /*fprintf(stderr, "out len = %d\n", err);*/
133             } else {
134                fprintf(stderr, "opus_repacketizer_out() failed: %s\n", opus_strerror(err));
135             }
136
137          }
138       }
139
140    }
141
142    fclose(fin);
143    fclose(fout);
144    return 0;
145 }