1/********************************************************************
2 *                                                                  *
3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
7 *                                                                  *
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009             *
9 * by the Xiph.Org Foundation http://www.xiph.org/                  *
10 *                                                                  *
11 ********************************************************************
12
13 function: simple programmatic interface for encoder mode setup
14 last mod: $Id: vorbisenc.c 17028 2010-03-25 05:22:15Z xiphmont $
15
16 ********************************************************************/
17
18#include <stdlib.h>
19#include <string.h>
20#include <math.h>
21
22#include "vorbis/codec.h"
23#include "vorbis/vorbisenc.h"
24
25#include "codec_internal.h"
26
27#include "os.h"
28#include "misc.h"
29
30/* careful with this; it's using static array sizing to make managing
31   all the modes a little less annoying.  If we use a residue backend
32   with > 12 partition types, or a different division of iteration,
33   this needs to be updated. */
34typedef struct {
35  const static_codebook *books[12][4];
36} static_bookblock;
37
38typedef struct {
39  int res_type;
40  int limit_type; /* 0 lowpass limited, 1 point stereo limited */
41  int grouping;
42  const vorbis_info_residue0 *res;
43  const static_codebook  *book_aux;
44  const static_codebook  *book_aux_managed;
45  const static_bookblock *books_base;
46  const static_bookblock *books_base_managed;
47} vorbis_residue_template;
48
49typedef struct {
50  const vorbis_info_mapping0    *map;
51  const vorbis_residue_template *res;
52} vorbis_mapping_template;
53
54typedef struct vp_adjblock{
55  int block[P_BANDS];
56} vp_adjblock;
57
58typedef struct {
59  int data[NOISE_COMPAND_LEVELS];
60} compandblock;
61
62/* high level configuration information for setting things up
63   step-by-step with the detailed vorbis_encode_ctl interface.
64   There's a fair amount of redundancy such that interactive setup
65   does not directly deal with any vorbis_info or codec_setup_info
66   initialization; it's all stored (until full init) in this highlevel
67   setup, then flushed out to the real codec setup structs later. */
68
69typedef struct {
70  int att[P_NOISECURVES];
71  float boost;
72  float decay;
73} att3;
74typedef struct { int data[P_NOISECURVES]; } adj3;
75
76typedef struct {
77  int   pre[PACKETBLOBS];
78  int   post[PACKETBLOBS];
79  float kHz[PACKETBLOBS];
80  float lowpasskHz[PACKETBLOBS];
81} adj_stereo;
82
83typedef struct {
84  int lo;
85  int hi;
86  int fixed;
87} noiseguard;
88typedef struct {
89  int data[P_NOISECURVES][17];
90} noise3;
91
92typedef struct {
93  int      mappings;
94  const double  *rate_mapping;
95  const double  *quality_mapping;
96  int      coupling_restriction;
97  long     samplerate_min_restriction;
98  long     samplerate_max_restriction;
99
100
101  const int     *blocksize_short;
102  const int     *blocksize_long;
103
104  const att3    *psy_tone_masteratt;
105  const int     *psy_tone_0dB;
106  const int     *psy_tone_dBsuppress;
107
108  const vp_adjblock *psy_tone_adj_impulse;
109  const vp_adjblock *psy_tone_adj_long;
110  const vp_adjblock *psy_tone_adj_other;
111
112  const noiseguard  *psy_noiseguards;
113  const noise3      *psy_noise_bias_impulse;
114  const noise3      *psy_noise_bias_padding;
115  const noise3      *psy_noise_bias_trans;
116  const noise3      *psy_noise_bias_long;
117  const int         *psy_noise_dBsuppress;
118
119  const compandblock  *psy_noise_compand;
120  const double        *psy_noise_compand_short_mapping;
121  const double        *psy_noise_compand_long_mapping;
122
123  const int      *psy_noise_normal_start[2];
124  const int      *psy_noise_normal_partition[2];
125  const double   *psy_noise_normal_thresh;
126
127  const int      *psy_ath_float;
128  const int      *psy_ath_abs;
129
130  const double   *psy_lowpass;
131
132  const vorbis_info_psy_global *global_params;
133  const double     *global_mapping;
134  const adj_stereo *stereo_modes;
135
136  const static_codebook *const *const *const floor_books;
137  const vorbis_info_floor1 *floor_params;
138  const int floor_mappings;
139  const int **floor_mapping_list;
140
141  const vorbis_mapping_template *maps;
142} ve_setup_data_template;
143
144/* a few static coder conventions */
145static const vorbis_info_mode _mode_template[2]={
146  {0,0,0,0},
147  {1,0,0,1}
148};
149
150static const vorbis_info_mapping0 _map_nominal[2]={
151  {1, {0,0}, {0}, {0}, 1,{0},{1}},
152  {1, {0,0}, {1}, {1}, 1,{0},{1}}
153};
154
155#include "modes/setup_44.h"
156#include "modes/setup_44u.h"
157#include "modes/setup_44p51.h"
158#include "modes/setup_32.h"
159#include "modes/setup_8.h"
160#include "modes/setup_11.h"
161#include "modes/setup_16.h"
162#include "modes/setup_22.h"
163#include "modes/setup_X.h"
164
165static const ve_setup_data_template *const setup_list[]={
166  &ve_setup_44_stereo,
167  &ve_setup_44_51,
168  &ve_setup_44_uncoupled,
169
170  &ve_setup_32_stereo,
171  &ve_setup_32_uncoupled,
172
173  &ve_setup_22_stereo,
174  &ve_setup_22_uncoupled,
175  &ve_setup_16_stereo,
176  &ve_setup_16_uncoupled,
177
178  &ve_setup_11_stereo,
179  &ve_setup_11_uncoupled,
180  &ve_setup_8_stereo,
181  &ve_setup_8_uncoupled,
182
183  &ve_setup_X_stereo,
184  &ve_setup_X_uncoupled,
185  &ve_setup_XX_stereo,
186  &ve_setup_XX_uncoupled,
187  0
188};
189
190static void vorbis_encode_floor_setup(vorbis_info *vi,int s,
191                                     const static_codebook *const *const *const books,
192                                     const vorbis_info_floor1 *in,
193                                     const int *x){
194  int i,k,is=s;
195  vorbis_info_floor1 *f=_ogg_calloc(1,sizeof(*f));
196  codec_setup_info *ci=vi->codec_setup;
197
198  memcpy(f,in+x[is],sizeof(*f));
199
200  /* books */
201  {
202    int partitions=f->partitions;
203    int maxclass=-1;
204    int maxbook=-1;
205    for(i=0;i<partitions;i++)
206      if(f->partitionclass[i]>maxclass)maxclass=f->partitionclass[i];
207    for(i=0;i<=maxclass;i++){
208      if(f->class_book[i]>maxbook)maxbook=f->class_book[i];
209      f->class_book[i]+=ci->books;
210      for(k=0;k<(1<<f->class_subs[i]);k++){
211        if(f->class_subbook[i][k]>maxbook)maxbook=f->class_subbook[i][k];
212        if(f->class_subbook[i][k]>=0)f->class_subbook[i][k]+=ci->books;
213      }
214    }
215
216    for(i=0;i<=maxbook;i++)
217      ci->book_param[ci->books++]=(static_codebook *)books[x[is]][i];
218  }
219
220  /* for now, we're only using floor 1 */
221  ci->floor_type[ci->floors]=1;
222  ci->floor_param[ci->floors]=f;
223  ci->floors++;
224
225  return;
226}
227
228static void vorbis_encode_global_psych_setup(vorbis_info *vi,double s,
229                                            const vorbis_info_psy_global *in,
230                                            const double *x){
231  int i,is=s;
232  double ds=s-is;
233  codec_setup_info *ci=vi->codec_setup;
234  vorbis_info_psy_global *g=&ci->psy_g_param;
235
236  memcpy(g,in+(int)x[is],sizeof(*g));
237
238  ds=x[is]*(1.-ds)+x[is+1]*ds;
239  is=(int)ds;
240  ds-=is;
241  if(ds==0 && is>0){
242    is--;
243    ds=1.;
244  }
245
246  /* interpolate the trigger threshholds */
247  for(i=0;i<4;i++){
248    g->preecho_thresh[i]=in[is].preecho_thresh[i]*(1.-ds)+in[is+1].preecho_thresh[i]*ds;
249    g->postecho_thresh[i]=in[is].postecho_thresh[i]*(1.-ds)+in[is+1].postecho_thresh[i]*ds;
250  }
251  g->ampmax_att_per_sec=ci->hi.amplitude_track_dBpersec;
252  return;
253}
254
255static void vorbis_encode_global_stereo(vorbis_info *vi,
256                                        const highlevel_encode_setup *const hi,
257                                        const adj_stereo *p){
258  float s=hi->stereo_point_setting;
259  int i,is=s;
260  double ds=s-is;
261  codec_setup_info *ci=vi->codec_setup;
262  vorbis_info_psy_global *g=&ci->psy_g_param;
263
264  if(p){
265    memcpy(g->coupling_prepointamp,p[is].pre,sizeof(*p[is].pre)*PACKETBLOBS);
266    memcpy(g->coupling_postpointamp,p[is].post,sizeof(*p[is].post)*PACKETBLOBS);
267
268    if(hi->managed){
269      /* interpolate the kHz threshholds */
270      for(i=0;i<PACKETBLOBS;i++){
271        float kHz=p[is].kHz[i]*(1.-ds)+p[is+1].kHz[i]*ds;
272        g->coupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
273        g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
274        g->coupling_pkHz[i]=kHz;
275
276        kHz=p[is].lowpasskHz[i]*(1.-ds)+p[is+1].lowpasskHz[i]*ds;
277        g->sliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
278        g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
279
280      }
281    }else{
282      float kHz=p[is].kHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].kHz[PACKETBLOBS/2]*ds;
283      for(i=0;i<PACKETBLOBS;i++){
284        g->coupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
285        g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
286        g->coupling_pkHz[i]=kHz;
287      }
288
289      kHz=p[is].lowpasskHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].lowpasskHz[PACKETBLOBS/2]*ds;
290      for(i=0;i<PACKETBLOBS;i++){
291        g->sliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0];
292        g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1];
293      }
294    }
295  }else{
296    for(i=0;i<PACKETBLOBS;i++){
297      g->sliding_lowpass[0][i]=ci->blocksizes[0];
298      g->sliding_lowpass[1][i]=ci->blocksizes[1];
299    }
300  }
301  return;
302}
303
304static void vorbis_encode_psyset_setup(vorbis_info *vi,double s,
305                                       const int *nn_start,
306                                       const int *nn_partition,
307                                       const double *nn_thresh,
308                                       int block){
309  codec_setup_info *ci=vi->codec_setup;
310  vorbis_info_psy *p=ci->psy_param[block];
311  highlevel_encode_setup *hi=&ci->hi;
312  int is=s;
313
314  if(block>=ci->psys)
315    ci->psys=block+1;
316  if(!p){
317    p=_ogg_calloc(1,sizeof(*p));
318    ci->psy_param[block]=p;
319  }
320
321  memcpy(p,&_psy_info_template,sizeof(*p));
322  p->blockflag=block>>1;
323
324  if(hi->noise_normalize_p){
325    p->normal_p=1;
326    p->normal_start=nn_start[is];
327    p->normal_partition=nn_partition[is];
328    p->normal_thresh=nn_thresh[is];
329  }
330
331  return;
332}
333
334static void vorbis_encode_tonemask_setup(vorbis_info *vi,double s,int block,
335                                         const att3 *att,
336                                         const int  *max,
337                                         const vp_adjblock *in){
338  int i,is=s;
339  double ds=s-is;
340  codec_setup_info *ci=vi->codec_setup;
341  vorbis_info_psy *p=ci->psy_param[block];
342
343  /* 0 and 2 are only used by bitmanagement, but there's no harm to always
344     filling the values in here */
345  p->tone_masteratt[0]=att[is].att[0]*(1.-ds)+att[is+1].att[0]*ds;
346  p->tone_masteratt[1]=att[is].att[1]*(1.-ds)+att[is+1].att[1]*ds;
347  p->tone_masteratt[2]=att[is].att[2]*(1.-ds)+att[is+1].att[2]*ds;
348  p->tone_centerboost=att[is].boost*(1.-ds)+att[is+1].boost*ds;
349  p->tone_decay=att[is].decay*(1.-ds)+att[is+1].decay*ds;
350
351  p->max_curve_dB=max[is]*(1.-ds)+max[is+1]*ds;
352
353  for(i=0;i<P_BANDS;i++)
354    p->toneatt[i]=in[is].block[i]*(1.-ds)+in[is+1].block[i]*ds;
355  return;
356}
357
358
359static void vorbis_encode_compand_setup(vorbis_info *vi,double s,int block,
360                                        const compandblock *in,
361                                        const double *x){
362  int i,is=s;
363  double ds=s-is;
364  codec_setup_info *ci=vi->codec_setup;
365  vorbis_info_psy *p=ci->psy_param[block];
366
367  ds=x[is]*(1.-ds)+x[is+1]*ds;
368  is=(int)ds;
369  ds-=is;
370  if(ds==0 && is>0){
371    is--;
372    ds=1.;
373  }
374
375  /* interpolate the compander settings */
376  for(i=0;i<NOISE_COMPAND_LEVELS;i++)
377    p->noisecompand[i]=in[is].data[i]*(1.-ds)+in[is+1].data[i]*ds;
378  return;
379}
380
381static void vorbis_encode_peak_setup(vorbis_info *vi,double s,int block,
382                                    const int *suppress){
383  int is=s;
384  double ds=s-is;
385  codec_setup_info *ci=vi->codec_setup;
386  vorbis_info_psy *p=ci->psy_param[block];
387
388  p->tone_abs_limit=suppress[is]*(1.-ds)+suppress[is+1]*ds;
389
390  return;
391}
392
393static void vorbis_encode_noisebias_setup(vorbis_info *vi,double s,int block,
394                                         const int *suppress,
395                                         const noise3 *in,
396                                         const noiseguard *guard,
397                                         double userbias){
398  int i,is=s,j;
399  double ds=s-is;
400  codec_setup_info *ci=vi->codec_setup;
401  vorbis_info_psy *p=ci->psy_param[block];
402
403  p->noisemaxsupp=suppress[is]*(1.-ds)+suppress[is+1]*ds;
404  p->noisewindowlomin=guard[block].lo;
405  p->noisewindowhimin=guard[block].hi;
406  p->noisewindowfixed=guard[block].fixed;
407
408  for(j=0;j<P_NOISECURVES;j++)
409    for(i=0;i<P_BANDS;i++)
410      p->noiseoff[j][i]=in[is].data[j][i]*(1.-ds)+in[is+1].data[j][i]*ds;
411
412  /* impulse blocks may take a user specified bias to boost the
413     nominal/high noise encoding depth */
414  for(j=0;j<P_NOISECURVES;j++){
415    float min=p->noiseoff[j][0]+6; /* the lowest it can go */
416    for(i=0;i<P_BANDS;i++){
417      p->noiseoff[j][i]+=userbias;
418      if(p->noiseoff[j][i]<min)p->noiseoff[j][i]=min;
419    }
420  }
421
422  return;
423}
424
425static void vorbis_encode_ath_setup(vorbis_info *vi,int block){
426  codec_setup_info *ci=vi->codec_setup;
427  vorbis_info_psy *p=ci->psy_param[block];
428
429  p->ath_adjatt=ci->hi.ath_floating_dB;
430  p->ath_maxatt=ci->hi.ath_absolute_dB;
431  return;
432}
433
434
435static int book_dup_or_new(codec_setup_info *ci,const static_codebook *book){
436  int i;
437  for(i=0;i<ci->books;i++)
438    if(ci->book_param[i]==book)return(i);
439
440  return(ci->books++);
441}
442
443static void vorbis_encode_blocksize_setup(vorbis_info *vi,double s,
444                                         const int *shortb,const int *longb){
445
446  codec_setup_info *ci=vi->codec_setup;
447  int is=s;
448
449  int blockshort=shortb[is];
450  int blocklong=longb[is];
451  ci->blocksizes[0]=blockshort;
452  ci->blocksizes[1]=blocklong;
453
454}
455
456static void vorbis_encode_residue_setup(vorbis_info *vi,
457                                        int number, int block,
458                                        const vorbis_residue_template *res){
459
460  codec_setup_info *ci=vi->codec_setup;
461  int i;
462
463  vorbis_info_residue0 *r=ci->residue_param[number]=
464    _ogg_malloc(sizeof(*r));
465
466  memcpy(r,res->res,sizeof(*r));
467  if(ci->residues<=number)ci->residues=number+1;
468
469  r->grouping=res->grouping;
470  ci->residue_type[number]=res->res_type;
471
472  /* fill in all the books */
473  {
474    int booklist=0,k;
475
476    if(ci->hi.managed){
477      for(i=0;i<r->partitions;i++)
478        for(k=0;k<4;k++)
479          if(res->books_base_managed->books[i][k])
480            r->secondstages[i]|=(1<<k);
481
482      r->groupbook=book_dup_or_new(ci,res->book_aux_managed);
483      ci->book_param[r->groupbook]=(static_codebook *)res->book_aux_managed;
484
485      for(i=0;i<r->partitions;i++){
486        for(k=0;k<4;k++){
487          if(res->books_base_managed->books[i][k]){
488            int bookid=book_dup_or_new(ci,res->books_base_managed->books[i][k]);
489            r->booklist[booklist++]=bookid;
490            ci->book_param[bookid]=(static_codebook *)res->books_base_managed->books[i][k];
491          }
492        }
493      }
494
495    }else{
496
497      for(i=0;i<r->partitions;i++)
498        for(k=0;k<4;k++)
499          if(res->books_base->books[i][k])
500            r->secondstages[i]|=(1<<k);
501
502      r->groupbook=book_dup_or_new(ci,res->book_aux);
503      ci->book_param[r->groupbook]=(static_codebook *)res->book_aux;
504
505      for(i=0;i<r->partitions;i++){
506        for(k=0;k<4;k++){
507          if(res->books_base->books[i][k]){
508            int bookid=book_dup_or_new(ci,res->books_base->books[i][k]);
509            r->booklist[booklist++]=bookid;
510            ci->book_param[bookid]=(static_codebook *)res->books_base->books[i][k];
511          }
512        }
513      }
514    }
515  }
516
517  /* lowpass setup/pointlimit */
518  {
519    double freq=ci->hi.lowpass_kHz*1000.;
520    vorbis_info_floor1 *f=ci->floor_param[block]; /* by convention */
521    double nyq=vi->rate/2.;
522    long blocksize=ci->blocksizes[block]>>1;
523
524    /* lowpass needs to be set in the floor and the residue. */
525    if(freq>nyq)freq=nyq;
526    /* in the floor, the granularity can be very fine; it doesn't alter
527       the encoding structure, only the samples used to fit the floor
528       approximation */
529    f->n=freq/nyq*blocksize;
530
531    /* this res may by limited by the maximum pointlimit of the mode,
532       not the lowpass. the floor is always lowpass limited. */
533    switch(res->limit_type){
534    case 1: /* point stereo limited */
535      if(ci->hi.managed)
536        freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS-1]*1000.;
537      else
538        freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS/2]*1000.;
539      if(freq>nyq)freq=nyq;
540      break;
541    case 2: /* LFE channel; lowpass at ~ 250Hz */
542      freq=250;
543      break;
544    default:
545      /* already set */
546      break;
547    }
548
549    /* in the residue, we're constrained, physically, by partition
550       boundaries.  We still lowpass 'wherever', but we have to round up
551       here to next boundary, or the vorbis spec will round it *down* to
552       previous boundary in encode/decode */
553    if(ci->residue_type[number]==2){
554      /* residue 2 bundles together multiple channels; used by stereo
555         and surround.  Count the channels in use */
556      /* Multiple maps/submaps can point to the same residue.  In the case
557         of residue 2, they all better have the same number of
558         channels/samples. */
559      int j,k,ch=0;
560      for(i=0;i<ci->maps&&ch==0;i++){
561        vorbis_info_mapping0 *mi=(vorbis_info_mapping0 *)ci->map_param[i];
562        for(j=0;j<mi->submaps && ch==0;j++)
563          if(mi->residuesubmap[j]==number) /* we found a submap referencing theis residue backend */
564            for(k=0;k<vi->channels;k++)
565              if(mi->chmuxlist[k]==j) /* this channel belongs to the submap */
566                ch++;
567      }
568
569      r->end=(int)((freq/nyq*blocksize*ch)/r->grouping+.9)* /* round up only if we're well past */
570        r->grouping;
571      /* the blocksize and grouping may disagree at the end */
572      if(r->end>blocksize*ch)r->end=blocksize*ch/r->grouping*r->grouping;
573
574    }else{
575
576      r->end=(int)((freq/nyq*blocksize)/r->grouping+.9)* /* round up only if we're well past */
577        r->grouping;
578      /* the blocksize and grouping may disagree at the end */
579      if(r->end>blocksize)r->end=blocksize/r->grouping*r->grouping;
580
581    }
582
583    if(r->end==0)r->end=r->grouping; /* LFE channel */
584
585  }
586}
587
588/* we assume two maps in this encoder */
589static void vorbis_encode_map_n_res_setup(vorbis_info *vi,double s,
590                                          const vorbis_mapping_template *maps){
591
592  codec_setup_info *ci=vi->codec_setup;
593  int i,j,is=s,modes=2;
594  const vorbis_info_mapping0 *map=maps[is].map;
595  const vorbis_info_mode *mode=_mode_template;
596  const vorbis_residue_template *res=maps[is].res;
597
598  if(ci->blocksizes[0]==ci->blocksizes[1])modes=1;
599
600  for(i=0;i<modes;i++){
601
602    ci->map_param[i]=_ogg_calloc(1,sizeof(*map));
603    ci->mode_param[i]=_ogg_calloc(1,sizeof(*mode));
604
605    memcpy(ci->mode_param[i],mode+i,sizeof(*_mode_template));
606    if(i>=ci->modes)ci->modes=i+1;
607
608    ci->map_type[i]=0;
609    memcpy(ci->map_param[i],map+i,sizeof(*map));
610    if(i>=ci->maps)ci->maps=i+1;
611
612    for(j=0;j<map[i].submaps;j++)
613      vorbis_encode_residue_setup(vi,map[i].residuesubmap[j],i
614                                  ,res+map[i].residuesubmap[j]);
615  }
616}
617
618static double setting_to_approx_bitrate(vorbis_info *vi){
619  codec_setup_info *ci=vi->codec_setup;
620  highlevel_encode_setup *hi=&ci->hi;
621  ve_setup_data_template *setup=(ve_setup_data_template *)hi->setup;
622  int is=hi->base_setting;
623  double ds=hi->base_setting-is;
624  int ch=vi->channels;
625  const double *r=setup->rate_mapping;
626
627  if(r==NULL)
628    return(-1);
629
630  return((r[is]*(1.-ds)+r[is+1]*ds)*ch);
631}
632
633static const void *get_setup_template(long ch,long srate,
634                                      double req,int q_or_bitrate,
635                                      double *base_setting){
636  int i=0,j;
637  if(q_or_bitrate)req/=ch;
638
639  while(setup_list[i]){
640    if(setup_list[i]->coupling_restriction==-1 ||
641       setup_list[i]->coupling_restriction==ch){
642      if(srate>=setup_list[i]->samplerate_min_restriction &&
643         srate<=setup_list[i]->samplerate_max_restriction){
644        int mappings=setup_list[i]->mappings;
645        const double *map=(q_or_bitrate?
646                     setup_list[i]->rate_mapping:
647                     setup_list[i]->quality_mapping);
648
649        /* the template matches.  Does the requested quality mode
650           fall within this template's modes? */
651        if(req<map[0]){++i;continue;}
652        if(req>map[setup_list[i]->mappings]){++i;continue;}
653        for(j=0;j<mappings;j++)
654          if(req>=map[j] && req<map[j+1])break;
655        /* an all-points match */
656        if(j==mappings)
657          *base_setting=j-.001;
658        else{
659          float low=map[j];
660          float high=map[j+1];
661          float del=(req-low)/(high-low);
662          *base_setting=j+del;
663        }
664
665        return(setup_list[i]);
666      }
667    }
668    i++;
669  }
670
671  return NULL;
672}
673
674/* encoders will need to use vorbis_info_init beforehand and call
675   vorbis_info clear when all done */
676
677/* two interfaces; this, more detailed one, and later a convenience
678   layer on top */
679
680/* the final setup call */
681int vorbis_encode_setup_init(vorbis_info *vi){
682  int i,i0=0,singleblock=0;
683  codec_setup_info *ci=vi->codec_setup;
684  ve_setup_data_template *setup=NULL;
685  highlevel_encode_setup *hi=&ci->hi;
686
687  if(ci==NULL)return(OV_EINVAL);
688  if(!hi->impulse_block_p)i0=1;
689
690  /* too low/high an ATH floater is nonsensical, but doesn't break anything */
691  if(hi->ath_floating_dB>-80)hi->ath_floating_dB=-80;
692  if(hi->ath_floating_dB<-200)hi->ath_floating_dB=-200;
693
694  /* again, bound this to avoid the app shooting itself int he foot
695     too badly */
696  if(hi->amplitude_track_dBpersec>0.)hi->amplitude_track_dBpersec=0.;
697  if(hi->amplitude_track_dBpersec<-99999.)hi->amplitude_track_dBpersec=-99999.;
698
699  /* get the appropriate setup template; matches the fetch in previous
700     stages */
701  setup=(ve_setup_data_template *)hi->setup;
702  if(setup==NULL)return(OV_EINVAL);
703
704  hi->set_in_stone=1;
705  /* choose block sizes from configured sizes as well as paying
706     attention to long_block_p and short_block_p.  If the configured
707     short and long blocks are the same length, we set long_block_p
708     and unset short_block_p */
709  vorbis_encode_blocksize_setup(vi,hi->base_setting,
710                                setup->blocksize_short,
711                                setup->blocksize_long);
712  if(ci->blocksizes[0]==ci->blocksizes[1])singleblock=1;
713
714  /* floor setup; choose proper floor params.  Allocated on the floor
715     stack in order; if we alloc only a single long floor, it's 0 */
716  for(i=0;i<setup->floor_mappings;i++)
717    vorbis_encode_floor_setup(vi,hi->base_setting,
718                              setup->floor_books,
719                              setup->floor_params,
720                              setup->floor_mapping_list[i]);
721
722  /* setup of [mostly] short block detection and stereo*/
723  vorbis_encode_global_psych_setup(vi,hi->trigger_setting,
724                                   setup->global_params,
725                                   setup->global_mapping);
726  vorbis_encode_global_stereo(vi,hi,setup->stereo_modes);
727
728  /* basic psych setup and noise normalization */
729  vorbis_encode_psyset_setup(vi,hi->base_setting,
730                             setup->psy_noise_normal_start[0],
731                             setup->psy_noise_normal_partition[0],
732                             setup->psy_noise_normal_thresh,
733                             0);
734  vorbis_encode_psyset_setup(vi,hi->base_setting,
735                             setup->psy_noise_normal_start[0],
736                             setup->psy_noise_normal_partition[0],
737                             setup->psy_noise_normal_thresh,
738                             1);
739  if(!singleblock){
740    vorbis_encode_psyset_setup(vi,hi->base_setting,
741                               setup->psy_noise_normal_start[1],
742                               setup->psy_noise_normal_partition[1],
743                                    setup->psy_noise_normal_thresh,
744                               2);
745    vorbis_encode_psyset_setup(vi,hi->base_setting,
746                               setup->psy_noise_normal_start[1],
747                               setup->psy_noise_normal_partition[1],
748                               setup->psy_noise_normal_thresh,
749                               3);
750  }
751
752  /* tone masking setup */
753  vorbis_encode_tonemask_setup(vi,hi->block[i0].tone_mask_setting,0,
754                               setup->psy_tone_masteratt,
755                               setup->psy_tone_0dB,
756                               setup->psy_tone_adj_impulse);
757  vorbis_encode_tonemask_setup(vi,hi->block[1].tone_mask_setting,1,
758                               setup->psy_tone_masteratt,
759                               setup->psy_tone_0dB,
760                               setup->psy_tone_adj_other);
761  if(!singleblock){
762    vorbis_encode_tonemask_setup(vi,hi->block[2].tone_mask_setting,2,
763                                 setup->psy_tone_masteratt,
764                                 setup->psy_tone_0dB,
765                                 setup->psy_tone_adj_other);
766    vorbis_encode_tonemask_setup(vi,hi->block[3].tone_mask_setting,3,
767                                 setup->psy_tone_masteratt,
768                                 setup->psy_tone_0dB,
769                                 setup->psy_tone_adj_long);
770  }
771
772  /* noise companding setup */
773  vorbis_encode_compand_setup(vi,hi->block[i0].noise_compand_setting,0,
774                              setup->psy_noise_compand,
775                              setup->psy_noise_compand_short_mapping);
776  vorbis_encode_compand_setup(vi,hi->block[1].noise_compand_setting,1,
777                              setup->psy_noise_compand,
778                              setup->psy_noise_compand_short_mapping);
779  if(!singleblock){
780    vorbis_encode_compand_setup(vi,hi->block[2].noise_compand_setting,2,
781                                setup->psy_noise_compand,
782                                setup->psy_noise_compand_long_mapping);
783    vorbis_encode_compand_setup(vi,hi->block[3].noise_compand_setting,3,
784                                setup->psy_noise_compand,
785                                setup->psy_noise_compand_long_mapping);
786  }
787
788  /* peak guarding setup  */
789  vorbis_encode_peak_setup(vi,hi->block[i0].tone_peaklimit_setting,0,
790                           setup->psy_tone_dBsuppress);
791  vorbis_encode_peak_setup(vi,hi->block[1].tone_peaklimit_setting,1,
792                           setup->psy_tone_dBsuppress);
793  if(!singleblock){
794    vorbis_encode_peak_setup(vi,hi->block[2].tone_peaklimit_setting,2,
795                             setup->psy_tone_dBsuppress);
796    vorbis_encode_peak_setup(vi,hi->block[3].tone_peaklimit_setting,3,
797                             setup->psy_tone_dBsuppress);
798  }
799
800  /* noise bias setup */
801  vorbis_encode_noisebias_setup(vi,hi->block[i0].noise_bias_setting,0,
802                                setup->psy_noise_dBsuppress,
803                                setup->psy_noise_bias_impulse,
804                                setup->psy_noiseguards,
805                                (i0==0?hi->impulse_noisetune:0.));
806  vorbis_encode_noisebias_setup(vi,hi->block[1].noise_bias_setting,1,
807                                setup->psy_noise_dBsuppress,
808                                setup->psy_noise_bias_padding,
809                                setup->psy_noiseguards,0.);
810  if(!singleblock){
811    vorbis_encode_noisebias_setup(vi,hi->block[2].noise_bias_setting,2,
812                                  setup->psy_noise_dBsuppress,
813                                  setup->psy_noise_bias_trans,
814                                  setup->psy_noiseguards,0.);
815    vorbis_encode_noisebias_setup(vi,hi->block[3].noise_bias_setting,3,
816                                  setup->psy_noise_dBsuppress,
817                                  setup->psy_noise_bias_long,
818                                  setup->psy_noiseguards,0.);
819  }
820
821  vorbis_encode_ath_setup(vi,0);
822  vorbis_encode_ath_setup(vi,1);
823  if(!singleblock){
824    vorbis_encode_ath_setup(vi,2);
825    vorbis_encode_ath_setup(vi,3);
826  }
827
828  vorbis_encode_map_n_res_setup(vi,hi->base_setting,setup->maps);
829
830  /* set bitrate readonlies and management */
831  if(hi->bitrate_av>0)
832    vi->bitrate_nominal=hi->bitrate_av;
833  else{
834    vi->bitrate_nominal=setting_to_approx_bitrate(vi);
835  }
836
837  vi->bitrate_lower=hi->bitrate_min;
838  vi->bitrate_upper=hi->bitrate_max;
839  if(hi->bitrate_av)
840    vi->bitrate_window=(double)hi->bitrate_reservoir/hi->bitrate_av;
841  else
842    vi->bitrate_window=0.;
843
844  if(hi->managed){
845    ci->bi.avg_rate=hi->bitrate_av;
846    ci->bi.min_rate=hi->bitrate_min;
847    ci->bi.max_rate=hi->bitrate_max;
848
849    ci->bi.reservoir_bits=hi->bitrate_reservoir;
850    ci->bi.reservoir_bias=
851      hi->bitrate_reservoir_bias;
852
853    ci->bi.slew_damp=hi->bitrate_av_damp;
854
855  }
856
857  return(0);
858
859}
860
861static void vorbis_encode_setup_setting(vorbis_info *vi,
862                                       long  channels,
863                                       long  rate){
864  int i,is;
865  codec_setup_info *ci=vi->codec_setup;
866  highlevel_encode_setup *hi=&ci->hi;
867  const ve_setup_data_template *setup=hi->setup;
868  double ds;
869
870  vi->version=0;
871  vi->channels=channels;
872  vi->rate=rate;
873
874  hi->impulse_block_p=1;
875  hi->noise_normalize_p=1;
876
877  is=hi->base_setting;
878  ds=hi->base_setting-is;
879
880  hi->stereo_point_setting=hi->base_setting;
881
882  if(!hi->lowpass_altered)
883    hi->lowpass_kHz=
884      setup->psy_lowpass[is]*(1.-ds)+setup->psy_lowpass[is+1]*ds;
885
886  hi->ath_floating_dB=setup->psy_ath_float[is]*(1.-ds)+
887    setup->psy_ath_float[is+1]*ds;
888  hi->ath_absolute_dB=setup->psy_ath_abs[is]*(1.-ds)+
889    setup->psy_ath_abs[is+1]*ds;
890
891  hi->amplitude_track_dBpersec=-6.;
892  hi->trigger_setting=hi->base_setting;
893
894  for(i=0;i<4;i++){
895    hi->block[i].tone_mask_setting=hi->base_setting;
896    hi->block[i].tone_peaklimit_setting=hi->base_setting;
897    hi->block[i].noise_bias_setting=hi->base_setting;
898    hi->block[i].noise_compand_setting=hi->base_setting;
899  }
900}
901
902int vorbis_encode_setup_vbr(vorbis_info *vi,
903                            long  channels,
904                            long  rate,
905                            float quality){
906  codec_setup_info *ci=vi->codec_setup;
907  highlevel_encode_setup *hi=&ci->hi;
908
909  quality+=.0000001;
910  if(quality>=1.)quality=.9999;
911
912  hi->req=quality;
913  hi->setup=get_setup_template(channels,rate,quality,0,&hi->base_setting);
914  if(!hi->setup)return OV_EIMPL;
915
916  vorbis_encode_setup_setting(vi,channels,rate);
917  hi->managed=0;
918  hi->coupling_p=1;
919
920  return 0;
921}
922
923int vorbis_encode_init_vbr(vorbis_info *vi,
924                           long channels,
925                           long rate,
926
927                           float base_quality /* 0. to 1. */
928                           ){
929  int ret=0;
930
931  ret=vorbis_encode_setup_vbr(vi,channels,rate,base_quality);
932
933  if(ret){
934    vorbis_info_clear(vi);
935    return ret;
936  }
937  ret=vorbis_encode_setup_init(vi);
938  if(ret)
939    vorbis_info_clear(vi);
940  return(ret);
941}
942
943int vorbis_encode_setup_managed(vorbis_info *vi,
944                                long channels,
945                                long rate,
946
947                                long max_bitrate,
948                                long nominal_bitrate,
949                                long min_bitrate){
950
951  codec_setup_info *ci=vi->codec_setup;
952  highlevel_encode_setup *hi=&ci->hi;
953  double tnominal=nominal_bitrate;
954
955  if(nominal_bitrate<=0.){
956    if(max_bitrate>0.){
957      if(min_bitrate>0.)
958        nominal_bitrate=(max_bitrate+min_bitrate)*.5;
959      else
960        nominal_bitrate=max_bitrate*.875;
961    }else{
962      if(min_bitrate>0.){
963        nominal_bitrate=min_bitrate;
964      }else{
965        return(OV_EINVAL);
966      }
967    }
968  }
969
970  hi->req=nominal_bitrate;
971  hi->setup=get_setup_template(channels,rate,nominal_bitrate,1,&hi->base_setting);
972  if(!hi->setup)return OV_EIMPL;
973
974  vorbis_encode_setup_setting(vi,channels,rate);
975
976  /* initialize management with sane defaults */
977  hi->coupling_p=1;
978  hi->managed=1;
979  hi->bitrate_min=min_bitrate;
980  hi->bitrate_max=max_bitrate;
981  hi->bitrate_av=tnominal;
982  hi->bitrate_av_damp=1.5f; /* full range in no less than 1.5 second */
983  hi->bitrate_reservoir=nominal_bitrate*2;
984  hi->bitrate_reservoir_bias=.1; /* bias toward hoarding bits */
985
986  return(0);
987
988}
989
990int vorbis_encode_init(vorbis_info *vi,
991                       long channels,
992                       long rate,
993
994                       long max_bitrate,
995                       long nominal_bitrate,
996                       long min_bitrate){
997
998  int ret=vorbis_encode_setup_managed(vi,channels,rate,
999                                      max_bitrate,
1000                                      nominal_bitrate,
1001                                      min_bitrate);
1002  if(ret){
1003    vorbis_info_clear(vi);
1004    return(ret);
1005  }
1006
1007  ret=vorbis_encode_setup_init(vi);
1008  if(ret)
1009    vorbis_info_clear(vi);
1010  return(ret);
1011}
1012
1013int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg){
1014  if(vi){
1015    codec_setup_info *ci=vi->codec_setup;
1016    highlevel_encode_setup *hi=&ci->hi;
1017    int setp=(number&0xf); /* a read request has a low nibble of 0 */
1018
1019    if(setp && hi->set_in_stone)return(OV_EINVAL);
1020
1021    switch(number){
1022
1023    /* now deprecated *****************/
1024    case OV_ECTL_RATEMANAGE_GET:
1025      {
1026
1027        struct ovectl_ratemanage_arg *ai=
1028          (struct ovectl_ratemanage_arg *)arg;
1029
1030        ai->management_active=hi->managed;
1031        ai->bitrate_hard_window=ai->bitrate_av_window=
1032          (double)hi->bitrate_reservoir/vi->rate;
1033        ai->bitrate_av_window_center=1.;
1034        ai->bitrate_hard_min=hi->bitrate_min;
1035        ai->bitrate_hard_max=hi->bitrate_max;
1036        ai->bitrate_av_lo=hi->bitrate_av;
1037        ai->bitrate_av_hi=hi->bitrate_av;
1038
1039      }
1040      return(0);
1041
1042    /* now deprecated *****************/
1043    case OV_ECTL_RATEMANAGE_SET:
1044      {
1045        struct ovectl_ratemanage_arg *ai=
1046          (struct ovectl_ratemanage_arg *)arg;
1047        if(ai==NULL){
1048          hi->managed=0;
1049        }else{
1050          hi->managed=ai->management_active;
1051          vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_AVG,arg);
1052          vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_HARD,arg);
1053        }
1054      }
1055      return 0;
1056
1057    /* now deprecated *****************/
1058    case OV_ECTL_RATEMANAGE_AVG:
1059      {
1060        struct ovectl_ratemanage_arg *ai=
1061          (struct ovectl_ratemanage_arg *)arg;
1062        if(ai==NULL){
1063          hi->bitrate_av=0;
1064        }else{
1065          hi->bitrate_av=(ai->bitrate_av_lo+ai->bitrate_av_hi)*.5;
1066        }
1067      }
1068      return(0);
1069    /* now deprecated *****************/
1070    case OV_ECTL_RATEMANAGE_HARD:
1071      {
1072        struct ovectl_ratemanage_arg *ai=
1073          (struct ovectl_ratemanage_arg *)arg;
1074        if(ai==NULL){
1075          hi->bitrate_min=0;
1076          hi->bitrate_max=0;
1077        }else{
1078          hi->bitrate_min=ai->bitrate_hard_min;
1079          hi->bitrate_max=ai->bitrate_hard_max;
1080          hi->bitrate_reservoir=ai->bitrate_hard_window*
1081            (hi->bitrate_max+hi->bitrate_min)*.5;
1082        }
1083        if(hi->bitrate_reservoir<128.)
1084          hi->bitrate_reservoir=128.;
1085      }
1086      return(0);
1087
1088      /* replacement ratemanage interface */
1089    case OV_ECTL_RATEMANAGE2_GET:
1090      {
1091        struct ovectl_ratemanage2_arg *ai=
1092          (struct ovectl_ratemanage2_arg *)arg;
1093        if(ai==NULL)return OV_EINVAL;
1094
1095        ai->management_active=hi->managed;
1096        ai->bitrate_limit_min_kbps=hi->bitrate_min/1000;
1097        ai->bitrate_limit_max_kbps=hi->bitrate_max/1000;
1098        ai->bitrate_average_kbps=hi->bitrate_av/1000;
1099        ai->bitrate_average_damping=hi->bitrate_av_damp;
1100        ai->bitrate_limit_reservoir_bits=hi->bitrate_reservoir;
1101        ai->bitrate_limit_reservoir_bias=hi->bitrate_reservoir_bias;
1102      }
1103      return (0);
1104    case OV_ECTL_RATEMANAGE2_SET:
1105      {
1106        struct ovectl_ratemanage2_arg *ai=
1107          (struct ovectl_ratemanage2_arg *)arg;
1108        if(ai==NULL){
1109          hi->managed=0;
1110        }else{
1111          /* sanity check; only catch invariant violations */
1112          if(ai->bitrate_limit_min_kbps>0 &&
1113             ai->bitrate_average_kbps>0 &&
1114             ai->bitrate_limit_min_kbps>ai->bitrate_average_kbps)
1115            return OV_EINVAL;
1116
1117          if(ai->bitrate_limit_max_kbps>0 &&
1118             ai->bitrate_average_kbps>0 &&
1119             ai->bitrate_limit_max_kbps<ai->bitrate_average_kbps)
1120            return OV_EINVAL;
1121
1122          if(ai->bitrate_limit_min_kbps>0 &&
1123             ai->bitrate_limit_max_kbps>0 &&
1124             ai->bitrate_limit_min_kbps>ai->bitrate_limit_max_kbps)
1125            return OV_EINVAL;
1126
1127          if(ai->bitrate_average_damping <= 0.)
1128            return OV_EINVAL;
1129
1130          if(ai->bitrate_limit_reservoir_bits < 0)
1131            return OV_EINVAL;
1132
1133          if(ai->bitrate_limit_reservoir_bias < 0.)
1134            return OV_EINVAL;
1135
1136          if(ai->bitrate_limit_reservoir_bias > 1.)
1137            return OV_EINVAL;
1138
1139          hi->managed=ai->management_active;
1140          hi->bitrate_min=ai->bitrate_limit_min_kbps * 1000;
1141          hi->bitrate_max=ai->bitrate_limit_max_kbps * 1000;
1142          hi->bitrate_av=ai->bitrate_average_kbps * 1000;
1143          hi->bitrate_av_damp=ai->bitrate_average_damping;
1144          hi->bitrate_reservoir=ai->bitrate_limit_reservoir_bits;
1145          hi->bitrate_reservoir_bias=ai->bitrate_limit_reservoir_bias;
1146        }
1147      }
1148      return 0;
1149
1150    case OV_ECTL_LOWPASS_GET:
1151      {
1152        double *farg=(double *)arg;
1153        *farg=hi->lowpass_kHz;
1154      }
1155      return(0);
1156    case OV_ECTL_LOWPASS_SET:
1157      {
1158        double *farg=(double *)arg;
1159        hi->lowpass_kHz=*farg;
1160
1161        if(hi->lowpass_kHz<2.)hi->lowpass_kHz=2.;
1162        if(hi->lowpass_kHz>99.)hi->lowpass_kHz=99.;
1163        hi->lowpass_altered=1;
1164      }
1165      return(0);
1166    case OV_ECTL_IBLOCK_GET:
1167      {
1168        double *farg=(double *)arg;
1169        *farg=hi->impulse_noisetune;
1170      }
1171      return(0);
1172    case OV_ECTL_IBLOCK_SET:
1173      {
1174        double *farg=(double *)arg;
1175        hi->impulse_noisetune=*farg;
1176
1177        if(hi->impulse_noisetune>0.)hi->impulse_noisetune=0.;
1178        if(hi->impulse_noisetune<-15.)hi->impulse_noisetune=-15.;
1179      }
1180      return(0);
1181    case OV_ECTL_COUPLING_GET:
1182      {
1183        int *iarg=(int *)arg;
1184        *iarg=hi->coupling_p;
1185      }
1186      return(0);
1187    case OV_ECTL_COUPLING_SET:
1188      {
1189        const void *new_template;
1190        double new_base=0.;
1191        int *iarg=(int *)arg;
1192        hi->coupling_p=((*iarg)!=0);
1193
1194        /* Fetching a new template can alter the base_setting, which
1195           many other parameters are based on.  Right now, the only
1196           parameter drawn from the base_setting that can be altered
1197           by an encctl is the lowpass, so that is explictly flagged
1198           to not be overwritten when we fetch a new template and
1199           recompute the dependant settings */
1200        new_template = get_setup_template(hi->coupling_p?vi->channels:-1,
1201                                          vi->rate,
1202                                          hi->req,
1203                                          hi->managed,
1204                                          &new_base);
1205        if(!hi->setup)return OV_EIMPL;
1206        hi->setup=new_template;
1207        hi->base_setting=new_base;
1208        vorbis_encode_setup_setting(vi,vi->channels,vi->rate);
1209      }
1210      return(0);
1211    }
1212    return(OV_EIMPL);
1213  }
1214  return(OV_EINVAL);
1215}
1216