Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/libvorbis-1.2.0/lib/vorbisenc.c @ 52

Last change on this file since 52 was 16, checked in by landauf, 17 years ago

added libvorbis

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