Makes surround bandwidth decision based on the number of channels (duh!)
[opus.git] / src / opus_multistream_encoder.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    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28 #ifdef HAVE_CONFIG_H
29 #include "config.h"
30 #endif
31
32 #include "opus_multistream.h"
33 #include "opus.h"
34 #include "opus_private.h"
35 #include "stack_alloc.h"
36 #include <stdarg.h>
37 #include "float_cast.h"
38 #include "os_support.h"
39 #include "mathops.h"
40 #include "mdct.h"
41 #include "modes.h"
42 #include "bands.h"
43 #include "quant_bands.h"
44
45 typedef struct {
46    int nb_streams;
47    int nb_coupled_streams;
48    unsigned char mapping[8];
49 } VorbisLayout;
50
51 /* Index is nb_channel-1*/
52 static const VorbisLayout vorbis_mappings[8] = {
53       {1, 0, {0}},                      /* 1: mono */
54       {1, 1, {0, 1}},                   /* 2: stereo */
55       {2, 1, {0, 2, 1}},                /* 3: 1-d surround */
56       {2, 2, {0, 1, 2, 3}},             /* 4: quadraphonic surround */
57       {3, 2, {0, 4, 1, 2, 3}},          /* 5: 5-channel surround */
58       {4, 2, {0, 4, 1, 2, 3, 5}},       /* 6: 5.1 surround */
59       {4, 3, {0, 4, 1, 2, 3, 5, 6}},    /* 7: 6.1 surround */
60       {5, 3, {0, 6, 1, 2, 3, 4, 5, 7}}, /* 8: 7.1 surround */
61 };
62
63 typedef void (*opus_copy_channel_in_func)(
64   opus_val16 *dst,
65   int dst_stride,
66   const void *src,
67   int src_stride,
68   int src_channel,
69   int frame_size
70 );
71
72 struct OpusMSEncoder {
73    ChannelLayout layout;
74    int lfe_stream;
75    int application;
76    int variable_duration;
77    int surround;
78    opus_int32 bitrate_bps;
79    opus_val32 subframe_mem[3];
80    /* Encoder states go here */
81    /* then opus_val32 window_mem[channels*120]; */
82    /* then opus_val32 preemph_mem[channels]; */
83 };
84
85 static opus_val32 *ms_get_preemph_mem(OpusMSEncoder *st)
86 {
87    int s;
88    char *ptr;
89    int coupled_size, mono_size;
90
91    coupled_size = opus_encoder_get_size(2);
92    mono_size = opus_encoder_get_size(1);
93    ptr = (char*)st + align(sizeof(OpusMSEncoder));
94    for (s=0;s<st->layout.nb_streams;s++)
95    {
96       if (s < st->layout.nb_coupled_streams)
97          ptr += align(coupled_size);
98       else
99          ptr += align(mono_size);
100    }
101    return (opus_val32*)(ptr+st->layout.nb_channels*120*sizeof(opus_val32));
102 }
103
104 static opus_val32 *ms_get_window_mem(OpusMSEncoder *st)
105 {
106    int s;
107    char *ptr;
108    int coupled_size, mono_size;
109
110    coupled_size = opus_encoder_get_size(2);
111    mono_size = opus_encoder_get_size(1);
112    ptr = (char*)st + align(sizeof(OpusMSEncoder));
113    for (s=0;s<st->layout.nb_streams;s++)
114    {
115       if (s < st->layout.nb_coupled_streams)
116          ptr += align(coupled_size);
117       else
118          ptr += align(mono_size);
119    }
120    return (opus_val32*)ptr;
121 }
122
123 static int validate_encoder_layout(const ChannelLayout *layout)
124 {
125    int s;
126    for (s=0;s<layout->nb_streams;s++)
127    {
128       if (s < layout->nb_coupled_streams)
129       {
130          if (get_left_channel(layout, s, -1)==-1)
131             return 0;
132          if (get_right_channel(layout, s, -1)==-1)
133             return 0;
134       } else {
135          if (get_mono_channel(layout, s, -1)==-1)
136             return 0;
137       }
138    }
139    return 1;
140 }
141
142 static void channel_pos(int channels, int pos[8])
143 {
144    /* Position in the mix: 0 don't mix, 1: left, 2: center, 3:right */
145    if (channels==4)
146    {
147       pos[0]=1;
148       pos[1]=3;
149       pos[2]=1;
150       pos[3]=3;
151    } else if (channels==3||channels==5||channels==6)
152    {
153       pos[0]=1;
154       pos[1]=2;
155       pos[2]=3;
156       pos[3]=1;
157       pos[4]=3;
158       pos[5]=0;
159    } else if (channels==7)
160    {
161       pos[0]=1;
162       pos[1]=2;
163       pos[2]=3;
164       pos[3]=1;
165       pos[4]=3;
166       pos[5]=2;
167       pos[6]=0;
168    } else if (channels==8)
169    {
170       pos[0]=1;
171       pos[1]=2;
172       pos[2]=3;
173       pos[3]=1;
174       pos[4]=3;
175       pos[5]=1;
176       pos[6]=3;
177       pos[7]=0;
178    }
179 }
180
181 #if 1
182 /* Computes a rough approximation of log2(2^a + 2^b) */
183 static opus_val16 logSum(opus_val16 a, opus_val16 b)
184 {
185    opus_val16 max;
186    opus_val32 diff;
187    opus_val16 frac;
188    static const opus_val16 diff_table[17] = {
189          QCONST16(0.5000000f, DB_SHIFT), QCONST16(0.2924813f, DB_SHIFT), QCONST16(0.1609640f, DB_SHIFT), QCONST16(0.0849625f, DB_SHIFT),
190          QCONST16(0.0437314f, DB_SHIFT), QCONST16(0.0221971f, DB_SHIFT), QCONST16(0.0111839f, DB_SHIFT), QCONST16(0.0056136f, DB_SHIFT),
191          QCONST16(0.0028123f, DB_SHIFT)
192    };
193    int low;
194    if (a>b)
195    {
196       max = a;
197       diff = SUB32(EXTEND32(a),EXTEND32(b));
198    } else {
199       max = b;
200       diff = SUB32(EXTEND32(b),EXTEND32(a));
201    }
202    if (diff >= QCONST16(8.f, DB_SHIFT))
203       return max;
204 #ifdef FIXED_POINT
205    low = SHR32(diff, DB_SHIFT-1);
206    frac = SHL16(diff - SHL16(low, DB_SHIFT-1), 16-DB_SHIFT);
207 #else
208    low = floor(2*diff);
209    frac = 2*diff - low;
210 #endif
211    return max + diff_table[low] + MULT16_16_Q15(frac, SUB16(diff_table[low+1], diff_table[low]));
212 }
213 #else
214 opus_val16 logSum(opus_val16 a, opus_val16 b)
215 {
216    return log2(pow(4, a)+ pow(4, b))/2;
217 }
218 #endif
219
220 void surround_analysis(const CELTMode *celt_mode, const void *pcm, opus_val16 *bandLogE, opus_val32 *mem, opus_val32 *preemph_mem,
221       int len, int overlap, int channels, int rate, opus_copy_channel_in_func copy_channel_in
222 )
223 {
224    int c;
225    int i;
226    int LM;
227    int pos[8] = {0};
228    int upsample;
229    int frame_size;
230    opus_val16 channel_offset;
231    opus_val32 bandE[21];
232    opus_val16 maskLogE[3][21];
233    VARDECL(opus_val32, in);
234    VARDECL(opus_val16, x);
235    VARDECL(opus_val32, freq);
236    SAVE_STACK;
237
238    upsample = resampling_factor(rate);
239    frame_size = len*upsample;
240
241    for (LM=0;LM<celt_mode->maxLM;LM++)
242       if (celt_mode->shortMdctSize<<LM==frame_size)
243          break;
244
245    ALLOC(in, frame_size+overlap, opus_val32);
246    ALLOC(x, len, opus_val16);
247    ALLOC(freq, frame_size, opus_val32);
248
249    channel_pos(channels, pos);
250
251    for (c=0;c<3;c++)
252       for (i=0;i<21;i++)
253          maskLogE[c][i] = -QCONST16(28.f, DB_SHIFT);
254
255    for (c=0;c<channels;c++)
256    {
257       OPUS_COPY(in, mem+c*overlap, overlap);
258       (*copy_channel_in)(x, 1, pcm, channels, c, len);
259       preemphasis(x, in+overlap, frame_size, 1, upsample, celt_mode->preemph, preemph_mem+c, 0);
260       clt_mdct_forward(&celt_mode->mdct, in, freq, celt_mode->window, overlap, celt_mode->maxLM-LM, 1);
261       if (upsample != 1)
262       {
263          int bound = len;
264          for (i=0;i<bound;i++)
265             freq[i] *= upsample;
266          for (;i<frame_size;i++)
267             freq[i] = 0;
268       }
269
270       compute_band_energies(celt_mode, freq, bandE, 21, 1, 1<<LM);
271       amp2Log2(celt_mode, 21, 21, bandE, bandLogE+21*c, 1);
272       /* Apply spreading function with -6 dB/band going up and -12 dB/band going down. */
273       for (i=1;i<21;i++)
274          bandLogE[21*c+i] = MAX16(bandLogE[21*c+i], bandLogE[21*c+i-1]-QCONST16(1.f, DB_SHIFT));
275       for (i=19;i>=0;i--)
276          bandLogE[21*c+i] = MAX16(bandLogE[21*c+i], bandLogE[21*c+i+1]-QCONST16(2.f, DB_SHIFT));
277       if (pos[c]==1)
278       {
279          for (i=0;i<21;i++)
280             maskLogE[0][i] = logSum(maskLogE[0][i], bandLogE[21*c+i]);
281       } else if (pos[c]==3)
282       {
283          for (i=0;i<21;i++)
284             maskLogE[2][i] = logSum(maskLogE[2][i], bandLogE[21*c+i]);
285       } else if (pos[c]==2)
286       {
287          for (i=0;i<21;i++)
288          {
289             maskLogE[0][i] = logSum(maskLogE[0][i], bandLogE[21*c+i]-QCONST16(.5f, DB_SHIFT));
290             maskLogE[2][i] = logSum(maskLogE[2][i], bandLogE[21*c+i]-QCONST16(.5f, DB_SHIFT));
291          }
292       }
293 #if 0
294       for (i=0;i<21;i++)
295          printf("%f ", bandLogE[21*c+i]);
296       float sum=0;
297       for (i=0;i<21;i++)
298          sum += bandLogE[21*c+i];
299       printf("%f ", sum/21);
300 #endif
301       OPUS_COPY(mem+c*overlap, in+frame_size, overlap);
302    }
303    for (i=0;i<21;i++)
304       maskLogE[1][i] = MIN32(maskLogE[0][i],maskLogE[2][i]);
305    channel_offset = HALF16(celt_log2(QCONST32(2.f,14)/(channels-1)));
306    for (c=0;c<3;c++)
307       for (i=0;i<21;i++)
308          maskLogE[c][i] += channel_offset;
309 #if 0
310    for (c=0;c<3;c++)
311    {
312       for (i=0;i<21;i++)
313          printf("%f ", maskLogE[c][i]);
314    }
315 #endif
316    for (c=0;c<channels;c++)
317    {
318       opus_val16 *mask;
319       if (pos[c]!=0)
320       {
321          mask = &maskLogE[pos[c]-1][0];
322          for (i=0;i<21;i++)
323             bandLogE[21*c+i] = bandLogE[21*c+i] - mask[i];
324       } else {
325          for (i=0;i<21;i++)
326             bandLogE[21*c+i] = 0;
327       }
328 #if 0
329       for (i=0;i<21;i++)
330          printf("%f ", bandLogE[21*c+i]);
331       printf("\n");
332 #endif
333 #if 0
334       float sum=0;
335       for (i=0;i<21;i++)
336          sum += bandLogE[21*c+i];
337       printf("%f ", sum/(float)QCONST32(21.f, DB_SHIFT));
338       printf("\n");
339 #endif
340    }
341    RESTORE_STACK;
342 }
343
344 opus_int32 opus_multistream_encoder_get_size(int nb_streams, int nb_coupled_streams)
345 {
346    int coupled_size;
347    int mono_size;
348
349    if(nb_streams<1||nb_coupled_streams>nb_streams||nb_coupled_streams<0)return 0;
350    coupled_size = opus_encoder_get_size(2);
351    mono_size = opus_encoder_get_size(1);
352    return align(sizeof(OpusMSEncoder))
353         + nb_coupled_streams * align(coupled_size)
354         + (nb_streams-nb_coupled_streams) * align(mono_size);
355 }
356
357 opus_int32 opus_multistream_surround_encoder_get_size(int channels, int mapping_family)
358 {
359    int nb_streams;
360    int nb_coupled_streams;
361    opus_int32 size;
362
363    if (mapping_family==0)
364    {
365       if (channels==1)
366       {
367          nb_streams=1;
368          nb_coupled_streams=0;
369       } else if (channels==2)
370       {
371          nb_streams=1;
372          nb_coupled_streams=1;
373       } else
374          return 0;
375    } else if (mapping_family==1 && channels<=8 && channels>=1)
376    {
377       nb_streams=vorbis_mappings[channels-1].nb_streams;
378       nb_coupled_streams=vorbis_mappings[channels-1].nb_coupled_streams;
379    } else if (mapping_family==255)
380    {
381       nb_streams=channels;
382       nb_coupled_streams=0;
383    } else
384       return 0;
385    size = opus_multistream_encoder_get_size(nb_streams, nb_coupled_streams);
386    if (channels>2)
387    {
388       size += channels*(120*sizeof(opus_val32) + sizeof(opus_val32));
389    }
390    return size;
391 }
392
393
394 static int opus_multistream_encoder_init_impl(
395       OpusMSEncoder *st,
396       opus_int32 Fs,
397       int channels,
398       int streams,
399       int coupled_streams,
400       const unsigned char *mapping,
401       int application,
402       int surround
403 )
404 {
405    int coupled_size;
406    int mono_size;
407    int i, ret;
408    char *ptr;
409
410    if ((channels>255) || (channels<1) || (coupled_streams>streams) ||
411        (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0))
412       return OPUS_BAD_ARG;
413
414    st->layout.nb_channels = channels;
415    st->layout.nb_streams = streams;
416    st->layout.nb_coupled_streams = coupled_streams;
417    st->subframe_mem[0]=st->subframe_mem[1]=st->subframe_mem[2]=0;
418    if (!surround)
419       st->lfe_stream = -1;
420    st->bitrate_bps = OPUS_AUTO;
421    st->application = application;
422    st->variable_duration = OPUS_FRAMESIZE_ARG;
423    for (i=0;i<st->layout.nb_channels;i++)
424       st->layout.mapping[i] = mapping[i];
425    if (!validate_layout(&st->layout) || !validate_encoder_layout(&st->layout))
426       return OPUS_BAD_ARG;
427    ptr = (char*)st + align(sizeof(OpusMSEncoder));
428    coupled_size = opus_encoder_get_size(2);
429    mono_size = opus_encoder_get_size(1);
430
431    for (i=0;i<st->layout.nb_coupled_streams;i++)
432    {
433       ret = opus_encoder_init((OpusEncoder*)ptr, Fs, 2, application);
434       if(ret!=OPUS_OK)return ret;
435       if (i==st->lfe_stream)
436          opus_encoder_ctl((OpusEncoder*)ptr, OPUS_SET_LFE(1));
437       ptr += align(coupled_size);
438    }
439    for (;i<st->layout.nb_streams;i++)
440    {
441       ret = opus_encoder_init((OpusEncoder*)ptr, Fs, 1, application);
442       if (i==st->lfe_stream)
443          opus_encoder_ctl((OpusEncoder*)ptr, OPUS_SET_LFE(1));
444       if(ret!=OPUS_OK)return ret;
445       ptr += align(mono_size);
446    }
447    if (surround)
448    {
449       OPUS_CLEAR(ms_get_preemph_mem(st), channels);
450       OPUS_CLEAR(ms_get_window_mem(st), channels*120);
451    }
452    st->surround = surround;
453    return OPUS_OK;
454 }
455
456 int opus_multistream_encoder_init(
457       OpusMSEncoder *st,
458       opus_int32 Fs,
459       int channels,
460       int streams,
461       int coupled_streams,
462       const unsigned char *mapping,
463       int application
464 )
465 {
466    return opus_multistream_encoder_init_impl(st, Fs, channels, streams, coupled_streams, mapping, application, 0);
467 }
468
469 int opus_multistream_surround_encoder_init(
470       OpusMSEncoder *st,
471       opus_int32 Fs,
472       int channels,
473       int mapping_family,
474       int *streams,
475       int *coupled_streams,
476       unsigned char *mapping,
477       int application
478 )
479 {
480    if ((channels>255) || (channels<1))
481       return OPUS_BAD_ARG;
482    st->lfe_stream = -1;
483    if (mapping_family==0)
484    {
485       if (channels==1)
486       {
487          *streams=1;
488          *coupled_streams=0;
489          mapping[0]=0;
490       } else if (channels==2)
491       {
492          *streams=1;
493          *coupled_streams=1;
494          mapping[0]=0;
495          mapping[1]=1;
496       } else
497          return OPUS_UNIMPLEMENTED;
498    } else if (mapping_family==1 && channels<=8 && channels>=1)
499    {
500       int i;
501       *streams=vorbis_mappings[channels-1].nb_streams;
502       *coupled_streams=vorbis_mappings[channels-1].nb_coupled_streams;
503       for (i=0;i<channels;i++)
504          mapping[i] = vorbis_mappings[channels-1].mapping[i];
505       if (channels>=6)
506          st->lfe_stream = *streams-1;
507    } else if (mapping_family==255)
508    {
509       int i;
510       *streams=channels;
511       *coupled_streams=0;
512       for(i=0;i<channels;i++)
513          mapping[i] = i;
514    } else
515       return OPUS_UNIMPLEMENTED;
516    return opus_multistream_encoder_init_impl(st, Fs, channels, *streams, *coupled_streams,
517          mapping, application, channels>2&&mapping_family==1);
518 }
519
520 OpusMSEncoder *opus_multistream_encoder_create(
521       opus_int32 Fs,
522       int channels,
523       int streams,
524       int coupled_streams,
525       const unsigned char *mapping,
526       int application,
527       int *error
528 )
529 {
530    int ret;
531    OpusMSEncoder *st;
532    if ((channels>255) || (channels<1) || (coupled_streams>streams) ||
533        (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0))
534    {
535       if (error)
536          *error = OPUS_BAD_ARG;
537       return NULL;
538    }
539    st = (OpusMSEncoder *)opus_alloc(opus_multistream_encoder_get_size(streams, coupled_streams));
540    if (st==NULL)
541    {
542       if (error)
543          *error = OPUS_ALLOC_FAIL;
544       return NULL;
545    }
546    ret = opus_multistream_encoder_init(st, Fs, channels, streams, coupled_streams, mapping, application);
547    if (ret != OPUS_OK)
548    {
549       opus_free(st);
550       st = NULL;
551    }
552    if (error)
553       *error = ret;
554    return st;
555 }
556
557 OpusMSEncoder *opus_multistream_surround_encoder_create(
558       opus_int32 Fs,
559       int channels,
560       int mapping_family,
561       int *streams,
562       int *coupled_streams,
563       unsigned char *mapping,
564       int application,
565       int *error
566 )
567 {
568    int ret;
569    OpusMSEncoder *st;
570    if ((channels>255) || (channels<1))
571    {
572       if (error)
573          *error = OPUS_BAD_ARG;
574       return NULL;
575    }
576    st = (OpusMSEncoder *)opus_alloc(opus_multistream_surround_encoder_get_size(channels, mapping_family));
577    if (st==NULL)
578    {
579       if (error)
580          *error = OPUS_ALLOC_FAIL;
581       return NULL;
582    }
583    ret = opus_multistream_surround_encoder_init(st, Fs, channels, mapping_family, streams, coupled_streams, mapping, application);
584    if (ret != OPUS_OK)
585    {
586       opus_free(st);
587       st = NULL;
588    }
589    if (error)
590       *error = ret;
591    return st;
592 }
593
594 static void surround_rate_allocation(
595       OpusMSEncoder *st,
596       opus_int32 *rate,
597       int frame_size
598       )
599 {
600    int i;
601    opus_int32 channel_rate;
602    opus_int32 Fs;
603    char *ptr;
604    int stream_offset;
605    int lfe_offset;
606    int coupled_ratio; /* Q8 */
607    int lfe_ratio;     /* Q8 */
608
609    ptr = (char*)st + align(sizeof(OpusMSEncoder));
610    opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_SAMPLE_RATE(&Fs));
611
612    if (st->bitrate_bps > st->layout.nb_channels*40000)
613       stream_offset = 20000;
614    else
615       stream_offset = st->bitrate_bps/st->layout.nb_channels/2;
616    /* We start by giving each stream (coupled or uncoupled) the same bitrate.
617       This models the main saving of coupled channels over uncoupled. */
618    /* The LFE stream is an exception to the above and gets fewer bits. */
619    lfe_offset = 3500;
620    /* Coupled streams get twice the mono rate after the first 20 kb/s. */
621    coupled_ratio = 512;
622    /* Should depend on the bitrate, for now we assume LFE gets 1/8 the bits of mono */
623    lfe_ratio = 32;
624
625    /* Compute bitrate allocation between streams */
626    if (st->bitrate_bps==OPUS_AUTO)
627    {
628       channel_rate = Fs+60*Fs/frame_size;
629    } else if (st->bitrate_bps==OPUS_BITRATE_MAX)
630    {
631       channel_rate = 300000;
632    } else {
633       int nb_lfe;
634       int nb_uncoupled;
635       int nb_coupled;
636       int total;
637       nb_lfe = (st->lfe_stream!=-1);
638       nb_coupled = st->layout.nb_coupled_streams;
639       nb_uncoupled = st->layout.nb_streams-nb_coupled-nb_lfe;
640       total = (nb_uncoupled<<8)         /* mono */
641             + coupled_ratio*nb_coupled /* stereo */
642             + nb_lfe*lfe_ratio;
643       channel_rate = 256*(st->bitrate_bps-lfe_offset*nb_lfe-stream_offset*(nb_coupled+nb_uncoupled))/total;
644    }
645 #ifndef FIXED_POINT
646    if (st->variable_duration==OPUS_FRAMESIZE_VARIABLE && frame_size != Fs/50)
647    {
648       opus_int32 bonus;
649       bonus = 60*(Fs/frame_size-50);
650       channel_rate += bonus;
651    }
652 #endif
653
654    for (i=0;i<st->layout.nb_streams;i++)
655    {
656       if (i<st->layout.nb_coupled_streams)
657          rate[i] = stream_offset+(channel_rate*coupled_ratio>>8);
658       else if (i!=st->lfe_stream)
659          rate[i] = stream_offset+channel_rate;
660       else
661          rate[i] = lfe_offset+(channel_rate*lfe_ratio>>8);
662    }
663 }
664
665 /* Max size in case the encoder decides to return three frames */
666 #define MS_FRAME_TMP (3*1275+7)
667 static int opus_multistream_encode_native
668 (
669     OpusMSEncoder *st,
670     opus_copy_channel_in_func copy_channel_in,
671     const void *pcm,
672     int analysis_frame_size,
673     unsigned char *data,
674     opus_int32 max_data_bytes,
675     int lsb_depth,
676     downmix_func downmix
677 )
678 {
679    opus_int32 Fs;
680    int coupled_size;
681    int mono_size;
682    int s;
683    char *ptr;
684    int tot_size;
685    VARDECL(opus_val16, buf);
686    VARDECL(opus_val16, bandSMR);
687    unsigned char tmp_data[MS_FRAME_TMP];
688    OpusRepacketizer rp;
689    opus_int32 vbr;
690    const CELTMode *celt_mode;
691    opus_int32 bitrates[256];
692    opus_val16 bandLogE[42];
693    opus_val32 *mem = NULL;
694    opus_val32 *preemph_mem=NULL;
695    int frame_size;
696    ALLOC_STACK;
697
698    if (st->surround)
699    {
700       preemph_mem = ms_get_preemph_mem(st);
701       mem = ms_get_window_mem(st);
702    }
703
704    ptr = (char*)st + align(sizeof(OpusMSEncoder));
705    opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_SAMPLE_RATE(&Fs));
706    opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_VBR(&vbr));
707    opus_encoder_ctl((OpusEncoder*)ptr, CELT_GET_MODE(&celt_mode));
708
709    {
710       opus_int32 delay_compensation;
711       int channels;
712
713       channels = st->layout.nb_streams + st->layout.nb_coupled_streams;
714       opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_LOOKAHEAD(&delay_compensation));
715       delay_compensation -= Fs/400;
716       frame_size = compute_frame_size(pcm, analysis_frame_size,
717             st->variable_duration, channels, Fs, st->bitrate_bps,
718             delay_compensation, downmix
719 #ifndef DISABLE_FLOAT_API
720             , st->subframe_mem
721 #endif
722             );
723    }
724
725    if (400*frame_size < Fs)
726    {
727       RESTORE_STACK;
728       return OPUS_BAD_ARG;
729    }
730    /* Validate frame_size before using it to allocate stack space.
731       This mirrors the checks in opus_encode[_float](). */
732    if (400*frame_size != Fs && 200*frame_size != Fs &&
733        100*frame_size != Fs &&  50*frame_size != Fs &&
734         25*frame_size != Fs &&  50*frame_size != 3*Fs)
735    {
736       RESTORE_STACK;
737       return OPUS_BAD_ARG;
738    }
739    ALLOC(buf, 2*frame_size, opus_val16);
740    coupled_size = opus_encoder_get_size(2);
741    mono_size = opus_encoder_get_size(1);
742
743    ALLOC(bandSMR, 21*st->layout.nb_channels, opus_val16);
744    if (st->surround)
745    {
746       surround_analysis(celt_mode, pcm, bandSMR, mem, preemph_mem, frame_size, 120, st->layout.nb_channels, Fs, copy_channel_in);
747    }
748
749    if (max_data_bytes < 4*st->layout.nb_streams-1)
750    {
751       RESTORE_STACK;
752       return OPUS_BUFFER_TOO_SMALL;
753    }
754
755    /* Compute bitrate allocation between streams (this could be a lot better) */
756    surround_rate_allocation(st, bitrates, frame_size);
757
758    if (!vbr)
759       max_data_bytes = IMIN(max_data_bytes, st->bitrate_bps/(8*Fs/frame_size));
760
761    ptr = (char*)st + align(sizeof(OpusMSEncoder));
762    for (s=0;s<st->layout.nb_streams;s++)
763    {
764       OpusEncoder *enc;
765       enc = (OpusEncoder*)ptr;
766       if (s < st->layout.nb_coupled_streams)
767          ptr += align(coupled_size);
768       else
769          ptr += align(mono_size);
770       opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrates[s]));
771       if (st->surround)
772       {
773          opus_int32 equiv_rate;
774          equiv_rate = st->bitrate_bps;
775          if (frame_size*50 < Fs)
776             equiv_rate -= 60*(Fs/frame_size - 50)*st->layout.nb_channels;
777          if (equiv_rate > 16000*st->layout.nb_channels)
778             opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND));
779          else if (equiv_rate > 12000*st->layout.nb_channels)
780             opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_SUPERWIDEBAND));
781          else if (equiv_rate > 8000*st->layout.nb_channels)
782             opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_WIDEBAND));
783          else
784             opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND));
785          if (s < st->layout.nb_coupled_streams)
786          {
787             /* To preserve the spatial image, force stereo CELT on coupled streams */
788             opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(MODE_CELT_ONLY));
789             opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(2));
790          }
791       }
792    }
793
794    ptr = (char*)st + align(sizeof(OpusMSEncoder));
795    /* Counting ToC */
796    tot_size = 0;
797    for (s=0;s<st->layout.nb_streams;s++)
798    {
799       OpusEncoder *enc;
800       int len;
801       int curr_max;
802       int c1, c2;
803
804       opus_repacketizer_init(&rp);
805       enc = (OpusEncoder*)ptr;
806       if (s < st->layout.nb_coupled_streams)
807       {
808          int i;
809          int left, right;
810          left = get_left_channel(&st->layout, s, -1);
811          right = get_right_channel(&st->layout, s, -1);
812          (*copy_channel_in)(buf, 2,
813             pcm, st->layout.nb_channels, left, frame_size);
814          (*copy_channel_in)(buf+1, 2,
815             pcm, st->layout.nb_channels, right, frame_size);
816          ptr += align(coupled_size);
817          if (st->surround)
818          {
819             for (i=0;i<21;i++)
820             {
821                bandLogE[i] = bandSMR[21*left+i];
822                bandLogE[21+i] = bandSMR[21*right+i];
823             }
824          }
825          c1 = left;
826          c2 = right;
827       } else {
828          int i;
829          int chan = get_mono_channel(&st->layout, s, -1);
830          (*copy_channel_in)(buf, 1,
831             pcm, st->layout.nb_channels, chan, frame_size);
832          ptr += align(mono_size);
833          if (st->surround)
834          {
835             for (i=0;i<21;i++)
836                bandLogE[i] = bandSMR[21*chan+i];
837          }
838          c1 = chan;
839          c2 = -1;
840       }
841       if (st->surround)
842          opus_encoder_ctl(enc, OPUS_SET_ENERGY_MASK(bandLogE));
843       /* number of bytes left (+Toc) */
844       curr_max = max_data_bytes - tot_size;
845       /* Reserve three bytes for the last stream and four for the others */
846       curr_max -= IMAX(0,4*(st->layout.nb_streams-s-1)-1);
847       curr_max = IMIN(curr_max,MS_FRAME_TMP);
848       if (!vbr && s == st->layout.nb_streams-1)
849          opus_encoder_ctl(enc, OPUS_SET_BITRATE(curr_max*(8*Fs/frame_size)));
850       len = opus_encode_native(enc, buf, frame_size, tmp_data, curr_max, lsb_depth,
851             pcm, analysis_frame_size, c1, c2, st->layout.nb_channels, downmix);
852       if (len<0)
853       {
854          RESTORE_STACK;
855          return len;
856       }
857       /* We need to use the repacketizer to add the self-delimiting lengths
858          while taking into account the fact that the encoder can now return
859          more than one frame at a time (e.g. 60 ms CELT-only) */
860       opus_repacketizer_cat(&rp, tmp_data, len);
861       len = opus_repacketizer_out_range_impl(&rp, 0, opus_repacketizer_get_nb_frames(&rp), data, max_data_bytes-tot_size, s != st->layout.nb_streams-1);
862       if (!vbr && s == st->layout.nb_streams-1 && curr_max > len)
863       {
864          /* Can pad_frame() still fail here? */
865          if (!pad_frame(data, len, curr_max))
866             len = curr_max;
867       }
868       data += len;
869       tot_size += len;
870    }
871    /*printf("\n");*/
872    RESTORE_STACK;
873    return tot_size;
874 }
875
876 #if !defined(DISABLE_FLOAT_API)
877 static void opus_copy_channel_in_float(
878   opus_val16 *dst,
879   int dst_stride,
880   const void *src,
881   int src_stride,
882   int src_channel,
883   int frame_size
884 )
885 {
886    const float *float_src;
887    opus_int32 i;
888    float_src = (const float *)src;
889    for (i=0;i<frame_size;i++)
890 #if defined(FIXED_POINT)
891       dst[i*dst_stride] = FLOAT2INT16(float_src[i*src_stride+src_channel]);
892 #else
893       dst[i*dst_stride] = float_src[i*src_stride+src_channel];
894 #endif
895 }
896 #endif
897
898 static void opus_copy_channel_in_short(
899   opus_val16 *dst,
900   int dst_stride,
901   const void *src,
902   int src_stride,
903   int src_channel,
904   int frame_size
905 )
906 {
907    const opus_int16 *short_src;
908    opus_int32 i;
909    short_src = (const opus_int16 *)src;
910    for (i=0;i<frame_size;i++)
911 #if defined(FIXED_POINT)
912       dst[i*dst_stride] = short_src[i*src_stride+src_channel];
913 #else
914       dst[i*dst_stride] = (1/32768.f)*short_src[i*src_stride+src_channel];
915 #endif
916 }
917
918
919 #ifdef FIXED_POINT
920 int opus_multistream_encode(
921     OpusMSEncoder *st,
922     const opus_val16 *pcm,
923     int frame_size,
924     unsigned char *data,
925     opus_int32 max_data_bytes
926 )
927 {
928    return opus_multistream_encode_native(st, opus_copy_channel_in_short,
929       pcm, frame_size, data, max_data_bytes, 16, downmix_int);
930 }
931
932 #ifndef DISABLE_FLOAT_API
933 int opus_multistream_encode_float(
934     OpusMSEncoder *st,
935     const float *pcm,
936     int frame_size,
937     unsigned char *data,
938     opus_int32 max_data_bytes
939 )
940 {
941    return opus_multistream_encode_native(st, opus_copy_channel_in_float,
942       pcm, frame_size, data, max_data_bytes, 16, downmix_float);
943 }
944 #endif
945
946 #else
947
948 int opus_multistream_encode_float
949 (
950     OpusMSEncoder *st,
951     const opus_val16 *pcm,
952     int frame_size,
953     unsigned char *data,
954     opus_int32 max_data_bytes
955 )
956 {
957    return opus_multistream_encode_native(st, opus_copy_channel_in_float,
958       pcm, frame_size, data, max_data_bytes, 24, downmix_float);
959 }
960
961 int opus_multistream_encode(
962     OpusMSEncoder *st,
963     const opus_int16 *pcm,
964     int frame_size,
965     unsigned char *data,
966     opus_int32 max_data_bytes
967 )
968 {
969    return opus_multistream_encode_native(st, opus_copy_channel_in_short,
970       pcm, frame_size, data, max_data_bytes, 16, downmix_int);
971 }
972 #endif
973
974 int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...)
975 {
976    va_list ap;
977    int coupled_size, mono_size;
978    char *ptr;
979    int ret = OPUS_OK;
980
981    va_start(ap, request);
982
983    coupled_size = opus_encoder_get_size(2);
984    mono_size = opus_encoder_get_size(1);
985    ptr = (char*)st + align(sizeof(OpusMSEncoder));
986    switch (request)
987    {
988    case OPUS_SET_BITRATE_REQUEST:
989    {
990       opus_int32 value = va_arg(ap, opus_int32);
991       if (value<0 && value!=OPUS_AUTO && value!=OPUS_BITRATE_MAX)
992       {
993          goto bad_arg;
994       }
995       st->bitrate_bps = value;
996    }
997    break;
998    case OPUS_GET_BITRATE_REQUEST:
999    {
1000       int s;
1001       opus_int32 *value = va_arg(ap, opus_int32*);
1002       if (!value)
1003       {
1004          goto bad_arg;
1005       }
1006       *value = 0;
1007       for (s=0;s<st->layout.nb_streams;s++)
1008       {
1009          opus_int32 rate;
1010          OpusEncoder *enc;
1011          enc = (OpusEncoder*)ptr;
1012          if (s < st->layout.nb_coupled_streams)
1013             ptr += align(coupled_size);
1014          else
1015             ptr += align(mono_size);
1016          opus_encoder_ctl(enc, request, &rate);
1017          *value += rate;
1018       }
1019    }
1020    break;
1021    case OPUS_GET_LSB_DEPTH_REQUEST:
1022    case OPUS_GET_VBR_REQUEST:
1023    case OPUS_GET_APPLICATION_REQUEST:
1024    case OPUS_GET_BANDWIDTH_REQUEST:
1025    case OPUS_GET_COMPLEXITY_REQUEST:
1026    case OPUS_GET_PACKET_LOSS_PERC_REQUEST:
1027    case OPUS_GET_DTX_REQUEST:
1028    case OPUS_GET_VOICE_RATIO_REQUEST:
1029    case OPUS_GET_VBR_CONSTRAINT_REQUEST:
1030    case OPUS_GET_SIGNAL_REQUEST:
1031    case OPUS_GET_LOOKAHEAD_REQUEST:
1032    case OPUS_GET_SAMPLE_RATE_REQUEST:
1033    case OPUS_GET_INBAND_FEC_REQUEST:
1034    case OPUS_GET_FORCE_CHANNELS_REQUEST:
1035    {
1036       OpusEncoder *enc;
1037       /* For int32* GET params, just query the first stream */
1038       opus_int32 *value = va_arg(ap, opus_int32*);
1039       enc = (OpusEncoder*)ptr;
1040       ret = opus_encoder_ctl(enc, request, value);
1041    }
1042    break;
1043    case OPUS_GET_FINAL_RANGE_REQUEST:
1044    {
1045       int s;
1046       opus_uint32 *value = va_arg(ap, opus_uint32*);
1047       opus_uint32 tmp;
1048       if (!value)
1049       {
1050          goto bad_arg;
1051       }
1052       *value=0;
1053       for (s=0;s<st->layout.nb_streams;s++)
1054       {
1055          OpusEncoder *enc;
1056          enc = (OpusEncoder*)ptr;
1057          if (s < st->layout.nb_coupled_streams)
1058             ptr += align(coupled_size);
1059          else
1060             ptr += align(mono_size);
1061          ret = opus_encoder_ctl(enc, request, &tmp);
1062          if (ret != OPUS_OK) break;
1063          *value ^= tmp;
1064       }
1065    }
1066    break;
1067    case OPUS_SET_LSB_DEPTH_REQUEST:
1068    case OPUS_SET_COMPLEXITY_REQUEST:
1069    case OPUS_SET_VBR_REQUEST:
1070    case OPUS_SET_VBR_CONSTRAINT_REQUEST:
1071    case OPUS_SET_MAX_BANDWIDTH_REQUEST:
1072    case OPUS_SET_BANDWIDTH_REQUEST:
1073    case OPUS_SET_SIGNAL_REQUEST:
1074    case OPUS_SET_APPLICATION_REQUEST:
1075    case OPUS_SET_INBAND_FEC_REQUEST:
1076    case OPUS_SET_PACKET_LOSS_PERC_REQUEST:
1077    case OPUS_SET_DTX_REQUEST:
1078    case OPUS_SET_FORCE_MODE_REQUEST:
1079    case OPUS_SET_FORCE_CHANNELS_REQUEST:
1080    {
1081       int s;
1082       /* This works for int32 params */
1083       opus_int32 value = va_arg(ap, opus_int32);
1084       for (s=0;s<st->layout.nb_streams;s++)
1085       {
1086          OpusEncoder *enc;
1087
1088          enc = (OpusEncoder*)ptr;
1089          if (s < st->layout.nb_coupled_streams)
1090             ptr += align(coupled_size);
1091          else
1092             ptr += align(mono_size);
1093          ret = opus_encoder_ctl(enc, request, value);
1094          if (ret != OPUS_OK)
1095             break;
1096       }
1097    }
1098    break;
1099    case OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST:
1100    {
1101       int s;
1102       opus_int32 stream_id;
1103       OpusEncoder **value;
1104       stream_id = va_arg(ap, opus_int32);
1105       if (stream_id<0 || stream_id >= st->layout.nb_streams)
1106          ret = OPUS_BAD_ARG;
1107       value = va_arg(ap, OpusEncoder**);
1108       if (!value)
1109       {
1110          goto bad_arg;
1111       }
1112       for (s=0;s<stream_id;s++)
1113       {
1114          if (s < st->layout.nb_coupled_streams)
1115             ptr += align(coupled_size);
1116          else
1117             ptr += align(mono_size);
1118       }
1119       *value = (OpusEncoder*)ptr;
1120    }
1121    break;
1122    case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST:
1123    {
1124        opus_int32 value = va_arg(ap, opus_int32);
1125        st->variable_duration = value;
1126    }
1127    break;
1128    case OPUS_GET_EXPERT_FRAME_DURATION_REQUEST:
1129    {
1130        opus_int32 *value = va_arg(ap, opus_int32*);
1131        if (!value)
1132        {
1133           goto bad_arg;
1134        }
1135        *value = st->variable_duration;
1136    }
1137    break;
1138    case OPUS_RESET_STATE:
1139    {
1140       int s;
1141       st->subframe_mem[0] = st->subframe_mem[1] = st->subframe_mem[2] = 0;
1142       if (st->surround)
1143       {
1144          OPUS_CLEAR(ms_get_preemph_mem(st), st->layout.nb_channels);
1145          OPUS_CLEAR(ms_get_window_mem(st), st->layout.nb_channels*120);
1146       }
1147       for (s=0;s<st->layout.nb_streams;s++)
1148       {
1149          OpusEncoder *enc;
1150          enc = (OpusEncoder*)ptr;
1151          if (s < st->layout.nb_coupled_streams)
1152             ptr += align(coupled_size);
1153          else
1154             ptr += align(mono_size);
1155          ret = opus_encoder_ctl(enc, OPUS_RESET_STATE);
1156          if (ret != OPUS_OK)
1157             break;
1158       }
1159    }
1160    break;
1161    default:
1162       ret = OPUS_UNIMPLEMENTED;
1163       break;
1164    }
1165
1166    va_end(ap);
1167    return ret;
1168 bad_arg:
1169    va_end(ap);
1170    return OPUS_BAD_ARG;
1171 }
1172
1173 void opus_multistream_encoder_destroy(OpusMSEncoder *st)
1174 {
1175     opus_free(st);
1176 }