Coverage Report

Created: 2023-03-26 06:09

/src/vorbis/lib/mapping0.c
Line
Count
Source (jump to first uncovered line)
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-2010             *
9
 * by the Xiph.Org Foundation https://xiph.org/                     *
10
 *                                                                  *
11
 ********************************************************************
12
13
 function: channel mapping 0 implementation
14
15
 ********************************************************************/
16
17
#include <stdlib.h>
18
#include <stdio.h>
19
#include <string.h>
20
#include <math.h>
21
#include <ogg/ogg.h>
22
#include "vorbis/codec.h"
23
#include "codec_internal.h"
24
#include "codebook.h"
25
#include "window.h"
26
#include "registry.h"
27
#include "psy.h"
28
#include "misc.h"
29
30
/* simplistic, wasteful way of doing this (unique lookup for each
31
   mode/submapping); there should be a central repository for
32
   identical lookups.  That will require minor work, so I'm putting it
33
   off as low priority.
34
35
   Why a lookup for each backend in a given mode?  Because the
36
   blocksize is set by the mode, and low backend lookups may require
37
   parameters from other areas of the mode/mapping */
38
39
13.6k
static void mapping0_free_info(vorbis_info_mapping *i){
40
13.6k
  vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)i;
41
13.6k
  if(info){
42
13.6k
    memset(info,0,sizeof(*info));
43
13.6k
    _ogg_free(info);
44
13.6k
  }
45
13.6k
}
46
47
static void mapping0_pack(vorbis_info *vi,vorbis_info_mapping *vm,
48
0
                          oggpack_buffer *opb){
49
0
  int i;
50
0
  vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)vm;
51
52
  /* another 'we meant to do it this way' hack...  up to beta 4, we
53
     packed 4 binary zeros here to signify one submapping in use.  We
54
     now redefine that to mean four bitflags that indicate use of
55
     deeper features; bit0:submappings, bit1:coupling,
56
     bit2,3:reserved. This is backward compatable with all actual uses
57
     of the beta code. */
58
59
0
  if(info->submaps>1){
60
0
    oggpack_write(opb,1,1);
61
0
    oggpack_write(opb,info->submaps-1,4);
62
0
  }else
63
0
    oggpack_write(opb,0,1);
64
65
0
  if(info->coupling_steps>0){
66
0
    oggpack_write(opb,1,1);
67
0
    oggpack_write(opb,info->coupling_steps-1,8);
68
69
0
    for(i=0;i<info->coupling_steps;i++){
70
0
      oggpack_write(opb,info->coupling_mag[i],ov_ilog(vi->channels-1));
71
0
      oggpack_write(opb,info->coupling_ang[i],ov_ilog(vi->channels-1));
72
0
    }
73
0
  }else
74
0
    oggpack_write(opb,0,1);
75
76
0
  oggpack_write(opb,0,2); /* 2,3:reserved */
77
78
  /* we don't write the channel submappings if we only have one... */
79
0
  if(info->submaps>1){
80
0
    for(i=0;i<vi->channels;i++)
81
0
      oggpack_write(opb,info->chmuxlist[i],4);
82
0
  }
83
0
  for(i=0;i<info->submaps;i++){
84
0
    oggpack_write(opb,0,8); /* time submap unused */
85
0
    oggpack_write(opb,info->floorsubmap[i],8);
86
0
    oggpack_write(opb,info->residuesubmap[i],8);
87
0
  }
88
0
}
89
90
/* also responsible for range checking */
91
13.6k
static vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb){
92
13.6k
  int i,b;
93
13.6k
  vorbis_info_mapping0 *info=_ogg_calloc(1,sizeof(*info));
94
13.6k
  codec_setup_info     *ci=vi->codec_setup;
95
13.6k
  if(vi->channels<=0)goto err_out;
96
97
13.6k
  b=oggpack_read(opb,1);
98
13.6k
  if(b<0)goto err_out;
99
13.6k
  if(b){
100
952
    info->submaps=oggpack_read(opb,4)+1;
101
952
    if(info->submaps<=0)goto err_out;
102
952
  }else
103
12.7k
    info->submaps=1;
104
105
13.6k
  b=oggpack_read(opb,1);
106
13.6k
  if(b<0)goto err_out;
107
13.6k
  if(b){
108
948
    info->coupling_steps=oggpack_read(opb,8)+1;
109
948
    if(info->coupling_steps<=0)goto err_out;
110
2.29k
    for(i=0;i<info->coupling_steps;i++){
111
      /* vi->channels > 0 is enforced in the caller */
112
1.39k
      int testM=info->coupling_mag[i]=
113
1.39k
        oggpack_read(opb,ov_ilog(vi->channels-1));
114
1.39k
      int testA=info->coupling_ang[i]=
115
1.39k
        oggpack_read(opb,ov_ilog(vi->channels-1));
116
117
1.39k
      if(testM<0 ||
118
1.39k
         testA<0 ||
119
1.39k
         testM==testA ||
120
1.39k
         testM>=vi->channels ||
121
1.39k
         testA>=vi->channels) goto err_out;
122
1.39k
    }
123
124
945
  }
125
126
13.6k
  if(oggpack_read(opb,2)!=0)goto err_out; /* 2,3:reserved */
127
128
13.6k
  if(info->submaps>1){
129
6.01k
    for(i=0;i<vi->channels;i++){
130
5.10k
      info->chmuxlist[i]=oggpack_read(opb,4);
131
5.10k
      if(info->chmuxlist[i]>=info->submaps || info->chmuxlist[i]<0)goto err_out;
132
5.10k
    }
133
923
  }
134
30.2k
  for(i=0;i<info->submaps;i++){
135
16.6k
    oggpack_read(opb,8); /* time submap unused */
136
16.6k
    info->floorsubmap[i]=oggpack_read(opb,8);
137
16.6k
    if(info->floorsubmap[i]>=ci->floors || info->floorsubmap[i]<0)goto err_out;
138
16.6k
    info->residuesubmap[i]=oggpack_read(opb,8);
139
16.6k
    if(info->residuesubmap[i]>=ci->residues || info->residuesubmap[i]<0)goto err_out;
140
16.6k
  }
141
142
13.5k
  return info;
143
144
127
 err_out:
145
127
  mapping0_free_info(info);
146
127
  return(NULL);
147
13.5k
}
148
149
#include "os.h"
150
#include "lpc.h"
151
#include "lsp.h"
152
#include "envelope.h"
153
#include "mdct.h"
154
#include "psy.h"
155
#include "scales.h"
156
157
#if 0
158
static long seq=0;
159
static ogg_int64_t total=0;
160
static float FLOOR1_fromdB_LOOKUP[256]={
161
  1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F,
162
  1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F,
163
  1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F,
164
  2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F,
165
  2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F,
166
  3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F,
167
  4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F,
168
  6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F,
169
  7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F,
170
  1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F,
171
  1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F,
172
  1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F,
173
  2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F,
174
  2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F,
175
  3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F,
176
  4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F,
177
  5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F,
178
  7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F,
179
  9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F,
180
  1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F,
181
  1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F,
182
  2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F,
183
  2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F,
184
  3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F,
185
  4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F,
186
  5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F,
187
  7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F,
188
  9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F,
189
  0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F,
190
  0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F,
191
  0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F,
192
  0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F,
193
  0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F,
194
  0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F,
195
  0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F,
196
  0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F,
197
  0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F,
198
  0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F,
199
  0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F,
200
  0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F,
201
  0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F,
202
  0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F,
203
  0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F,
204
  0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F,
205
  0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F,
206
  0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F,
207
  0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F,
208
  0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F,
209
  0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F,
210
  0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F,
211
  0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F,
212
  0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F,
213
  0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F,
214
  0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F,
215
  0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F,
216
  0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F,
217
  0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F,
218
  0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F,
219
  0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F,
220
  0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F,
221
  0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F,
222
  0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F,
223
  0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F,
224
  0.82788260F, 0.88168307F, 0.9389798F, 1.F,
225
};
226
227
#endif
228
229
230
0
static int mapping0_forward(vorbis_block *vb){
231
0
  vorbis_dsp_state      *vd=vb->vd;
232
0
  vorbis_info           *vi=vd->vi;
233
0
  codec_setup_info      *ci=vi->codec_setup;
234
0
  private_state         *b=vb->vd->backend_state;
235
0
  vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal;
236
0
  int                    n=vb->pcmend;
237
0
  int i,j,k;
238
239
0
  int    *nonzero    = alloca(sizeof(*nonzero)*vi->channels);
240
0
  float  **gmdct     = _vorbis_block_alloc(vb,vi->channels*sizeof(*gmdct));
241
0
  int    **iwork      = _vorbis_block_alloc(vb,vi->channels*sizeof(*iwork));
242
0
  int ***floor_posts = _vorbis_block_alloc(vb,vi->channels*sizeof(*floor_posts));
243
244
0
  float global_ampmax=vbi->ampmax;
245
0
  float *local_ampmax=alloca(sizeof(*local_ampmax)*vi->channels);
246
0
  int blocktype=vbi->blocktype;
247
248
0
  int modenumber=vb->W;
249
0
  vorbis_info_mapping0 *info=ci->map_param[modenumber];
250
0
  vorbis_look_psy *psy_look=b->psy+blocktype+(vb->W?2:0);
251
252
0
  vb->mode=modenumber;
253
254
0
  for(i=0;i<vi->channels;i++){
255
0
    float scale=4.f/n;
256
0
    float scale_dB;
257
258
0
    float *pcm     =vb->pcm[i];
259
0
    float *logfft  =pcm;
260
261
0
    iwork[i]=_vorbis_block_alloc(vb,n/2*sizeof(**iwork));
262
0
    gmdct[i]=_vorbis_block_alloc(vb,n/2*sizeof(**gmdct));
263
264
0
    scale_dB=todB(&scale) + .345; /* + .345 is a hack; the original
265
                                     todB estimation used on IEEE 754
266
                                     compliant machines had a bug that
267
                                     returned dB values about a third
268
                                     of a decibel too high.  The bug
269
                                     was harmless because tunings
270
                                     implicitly took that into
271
                                     account.  However, fixing the bug
272
                                     in the estimator requires
273
                                     changing all the tunings as well.
274
                                     For now, it's easier to sync
275
                                     things back up here, and
276
                                     recalibrate the tunings in the
277
                                     next major model upgrade. */
278
279
#if 0
280
    if(vi->channels==2){
281
      if(i==0)
282
        _analysis_output("pcmL",seq,pcm,n,0,0,total-n/2);
283
      else
284
        _analysis_output("pcmR",seq,pcm,n,0,0,total-n/2);
285
    }else{
286
      _analysis_output("pcm",seq,pcm,n,0,0,total-n/2);
287
    }
288
#endif
289
290
    /* window the PCM data */
291
0
    _vorbis_apply_window(pcm,b->window,ci->blocksizes,vb->lW,vb->W,vb->nW);
292
293
#if 0
294
    if(vi->channels==2){
295
      if(i==0)
296
        _analysis_output("windowedL",seq,pcm,n,0,0,total-n/2);
297
      else
298
        _analysis_output("windowedR",seq,pcm,n,0,0,total-n/2);
299
    }else{
300
      _analysis_output("windowed",seq,pcm,n,0,0,total-n/2);
301
    }
302
#endif
303
304
    /* transform the PCM data */
305
    /* only MDCT right now.... */
306
0
    mdct_forward(b->transform[vb->W][0],pcm,gmdct[i]);
307
308
    /* FFT yields more accurate tonal estimation (not phase sensitive) */
309
0
    drft_forward(&b->fft_look[vb->W],pcm);
310
0
    logfft[0]=scale_dB+todB(pcm)  + .345; /* + .345 is a hack; the
311
                                     original todB estimation used on
312
                                     IEEE 754 compliant machines had a
313
                                     bug that returned dB values about
314
                                     a third of a decibel too high.
315
                                     The bug was harmless because
316
                                     tunings implicitly took that into
317
                                     account.  However, fixing the bug
318
                                     in the estimator requires
319
                                     changing all the tunings as well.
320
                                     For now, it's easier to sync
321
                                     things back up here, and
322
                                     recalibrate the tunings in the
323
                                     next major model upgrade. */
324
0
    local_ampmax[i]=logfft[0];
325
0
    for(j=1;j<n-1;j+=2){
326
0
      float temp=pcm[j]*pcm[j]+pcm[j+1]*pcm[j+1];
327
0
      temp=logfft[(j+1)>>1]=scale_dB+.5f*todB(&temp)  + .345; /* +
328
                                     .345 is a hack; the original todB
329
                                     estimation used on IEEE 754
330
                                     compliant machines had a bug that
331
                                     returned dB values about a third
332
                                     of a decibel too high.  The bug
333
                                     was harmless because tunings
334
                                     implicitly took that into
335
                                     account.  However, fixing the bug
336
                                     in the estimator requires
337
                                     changing all the tunings as well.
338
                                     For now, it's easier to sync
339
                                     things back up here, and
340
                                     recalibrate the tunings in the
341
                                     next major model upgrade. */
342
0
      if(temp>local_ampmax[i])local_ampmax[i]=temp;
343
0
    }
344
345
0
    if(local_ampmax[i]>0.f)local_ampmax[i]=0.f;
346
0
    if(local_ampmax[i]>global_ampmax)global_ampmax=local_ampmax[i];
347
348
#if 0
349
    if(vi->channels==2){
350
      if(i==0){
351
        _analysis_output("fftL",seq,logfft,n/2,1,0,0);
352
      }else{
353
        _analysis_output("fftR",seq,logfft,n/2,1,0,0);
354
      }
355
    }else{
356
      _analysis_output("fft",seq,logfft,n/2,1,0,0);
357
    }
358
#endif
359
360
0
  }
361
362
0
  {
363
0
    float   *noise        = _vorbis_block_alloc(vb,n/2*sizeof(*noise));
364
0
    float   *tone         = _vorbis_block_alloc(vb,n/2*sizeof(*tone));
365
366
0
    for(i=0;i<vi->channels;i++){
367
      /* the encoder setup assumes that all the modes used by any
368
         specific bitrate tweaking use the same floor */
369
370
0
      int submap=info->chmuxlist[i];
371
372
      /* the following makes things clearer to *me* anyway */
373
0
      float *mdct    =gmdct[i];
374
0
      float *logfft  =vb->pcm[i];
375
376
0
      float *logmdct =logfft+n/2;
377
0
      float *logmask =logfft;
378
379
0
      vb->mode=modenumber;
380
381
0
      floor_posts[i]=_vorbis_block_alloc(vb,PACKETBLOBS*sizeof(**floor_posts));
382
0
      memset(floor_posts[i],0,sizeof(**floor_posts)*PACKETBLOBS);
383
384
0
      for(j=0;j<n/2;j++)
385
0
        logmdct[j]=todB(mdct+j)  + .345; /* + .345 is a hack; the original
386
                                     todB estimation used on IEEE 754
387
                                     compliant machines had a bug that
388
                                     returned dB values about a third
389
                                     of a decibel too high.  The bug
390
                                     was harmless because tunings
391
                                     implicitly took that into
392
                                     account.  However, fixing the bug
393
                                     in the estimator requires
394
                                     changing all the tunings as well.
395
                                     For now, it's easier to sync
396
                                     things back up here, and
397
                                     recalibrate the tunings in the
398
                                     next major model upgrade. */
399
400
#if 0
401
      if(vi->channels==2){
402
        if(i==0)
403
          _analysis_output("mdctL",seq,logmdct,n/2,1,0,0);
404
        else
405
          _analysis_output("mdctR",seq,logmdct,n/2,1,0,0);
406
      }else{
407
        _analysis_output("mdct",seq,logmdct,n/2,1,0,0);
408
      }
409
#endif
410
411
      /* first step; noise masking.  Not only does 'noise masking'
412
         give us curves from which we can decide how much resolution
413
         to give noise parts of the spectrum, it also implicitly hands
414
         us a tonality estimate (the larger the value in the
415
         'noise_depth' vector, the more tonal that area is) */
416
417
0
      _vp_noisemask(psy_look,
418
0
                    logmdct,
419
0
                    noise); /* noise does not have by-frequency offset
420
                               bias applied yet */
421
#if 0
422
      if(vi->channels==2){
423
        if(i==0)
424
          _analysis_output("noiseL",seq,noise,n/2,1,0,0);
425
        else
426
          _analysis_output("noiseR",seq,noise,n/2,1,0,0);
427
      }else{
428
        _analysis_output("noise",seq,noise,n/2,1,0,0);
429
      }
430
#endif
431
432
      /* second step: 'all the other crap'; all the stuff that isn't
433
         computed/fit for bitrate management goes in the second psy
434
         vector.  This includes tone masking, peak limiting and ATH */
435
436
0
      _vp_tonemask(psy_look,
437
0
                   logfft,
438
0
                   tone,
439
0
                   global_ampmax,
440
0
                   local_ampmax[i]);
441
442
#if 0
443
      if(vi->channels==2){
444
        if(i==0)
445
          _analysis_output("toneL",seq,tone,n/2,1,0,0);
446
        else
447
          _analysis_output("toneR",seq,tone,n/2,1,0,0);
448
      }else{
449
        _analysis_output("tone",seq,tone,n/2,1,0,0);
450
      }
451
#endif
452
453
      /* third step; we offset the noise vectors, overlay tone
454
         masking.  We then do a floor1-specific line fit.  If we're
455
         performing bitrate management, the line fit is performed
456
         multiple times for up/down tweakage on demand. */
457
458
#if 0
459
      {
460
      float aotuv[psy_look->n];
461
#endif
462
463
0
        _vp_offset_and_mix(psy_look,
464
0
                           noise,
465
0
                           tone,
466
0
                           1,
467
0
                           logmask,
468
0
                           mdct,
469
0
                           logmdct);
470
471
#if 0
472
        if(vi->channels==2){
473
          if(i==0)
474
            _analysis_output("aotuvM1_L",seq,aotuv,psy_look->n,1,1,0);
475
          else
476
            _analysis_output("aotuvM1_R",seq,aotuv,psy_look->n,1,1,0);
477
        }else{
478
          _analysis_output("aotuvM1",seq,aotuv,psy_look->n,1,1,0);
479
        }
480
      }
481
#endif
482
483
484
#if 0
485
      if(vi->channels==2){
486
        if(i==0)
487
          _analysis_output("mask1L",seq,logmask,n/2,1,0,0);
488
        else
489
          _analysis_output("mask1R",seq,logmask,n/2,1,0,0);
490
      }else{
491
        _analysis_output("mask1",seq,logmask,n/2,1,0,0);
492
      }
493
#endif
494
495
      /* this algorithm is hardwired to floor 1 for now; abort out if
496
         we're *not* floor1.  This won't happen unless someone has
497
         broken the encode setup lib.  Guard it anyway. */
498
0
      if(ci->floor_type[info->floorsubmap[submap]]!=1)return(-1);
499
500
0
      floor_posts[i][PACKETBLOBS/2]=
501
0
        floor1_fit(vb,b->flr[info->floorsubmap[submap]],
502
0
                   logmdct,
503
0
                   logmask);
504
505
      /* are we managing bitrate?  If so, perform two more fits for
506
         later rate tweaking (fits represent hi/lo) */
507
0
      if(vorbis_bitrate_managed(vb) && floor_posts[i][PACKETBLOBS/2]){
508
        /* higher rate by way of lower noise curve */
509
510
0
        _vp_offset_and_mix(psy_look,
511
0
                           noise,
512
0
                           tone,
513
0
                           2,
514
0
                           logmask,
515
0
                           mdct,
516
0
                           logmdct);
517
518
#if 0
519
        if(vi->channels==2){
520
          if(i==0)
521
            _analysis_output("mask2L",seq,logmask,n/2,1,0,0);
522
          else
523
            _analysis_output("mask2R",seq,logmask,n/2,1,0,0);
524
        }else{
525
          _analysis_output("mask2",seq,logmask,n/2,1,0,0);
526
        }
527
#endif
528
529
0
        floor_posts[i][PACKETBLOBS-1]=
530
0
          floor1_fit(vb,b->flr[info->floorsubmap[submap]],
531
0
                     logmdct,
532
0
                     logmask);
533
534
        /* lower rate by way of higher noise curve */
535
0
        _vp_offset_and_mix(psy_look,
536
0
                           noise,
537
0
                           tone,
538
0
                           0,
539
0
                           logmask,
540
0
                           mdct,
541
0
                           logmdct);
542
543
#if 0
544
        if(vi->channels==2){
545
          if(i==0)
546
            _analysis_output("mask0L",seq,logmask,n/2,1,0,0);
547
          else
548
            _analysis_output("mask0R",seq,logmask,n/2,1,0,0);
549
        }else{
550
          _analysis_output("mask0",seq,logmask,n/2,1,0,0);
551
        }
552
#endif
553
554
0
        floor_posts[i][0]=
555
0
          floor1_fit(vb,b->flr[info->floorsubmap[submap]],
556
0
                     logmdct,
557
0
                     logmask);
558
559
        /* we also interpolate a range of intermediate curves for
560
           intermediate rates */
561
0
        for(k=1;k<PACKETBLOBS/2;k++)
562
0
          floor_posts[i][k]=
563
0
            floor1_interpolate_fit(vb,b->flr[info->floorsubmap[submap]],
564
0
                                   floor_posts[i][0],
565
0
                                   floor_posts[i][PACKETBLOBS/2],
566
0
                                   k*65536/(PACKETBLOBS/2));
567
0
        for(k=PACKETBLOBS/2+1;k<PACKETBLOBS-1;k++)
568
0
          floor_posts[i][k]=
569
0
            floor1_interpolate_fit(vb,b->flr[info->floorsubmap[submap]],
570
0
                                   floor_posts[i][PACKETBLOBS/2],
571
0
                                   floor_posts[i][PACKETBLOBS-1],
572
0
                                   (k-PACKETBLOBS/2)*65536/(PACKETBLOBS/2));
573
0
      }
574
0
    }
575
0
  }
576
0
  vbi->ampmax=global_ampmax;
577
578
  /*
579
    the next phases are performed once for vbr-only and PACKETBLOB
580
    times for bitrate managed modes.
581
582
    1) encode actual mode being used
583
    2) encode the floor for each channel, compute coded mask curve/res
584
    3) normalize and couple.
585
    4) encode residue
586
    5) save packet bytes to the packetblob vector
587
588
  */
589
590
  /* iterate over the many masking curve fits we've created */
591
592
0
  {
593
0
    int **couple_bundle=alloca(sizeof(*couple_bundle)*vi->channels);
594
0
    int *zerobundle=alloca(sizeof(*zerobundle)*vi->channels);
595
596
0
    for(k=(vorbis_bitrate_managed(vb)?0:PACKETBLOBS/2);
597
0
        k<=(vorbis_bitrate_managed(vb)?PACKETBLOBS-1:PACKETBLOBS/2);
598
0
        k++){
599
0
      oggpack_buffer *opb=vbi->packetblob[k];
600
601
      /* start out our new packet blob with packet type and mode */
602
      /* Encode the packet type */
603
0
      oggpack_write(opb,0,1);
604
      /* Encode the modenumber */
605
      /* Encode frame mode, pre,post windowsize, then dispatch */
606
0
      oggpack_write(opb,modenumber,b->modebits);
607
0
      if(vb->W){
608
0
        oggpack_write(opb,vb->lW,1);
609
0
        oggpack_write(opb,vb->nW,1);
610
0
      }
611
612
      /* encode floor, compute masking curve, sep out residue */
613
0
      for(i=0;i<vi->channels;i++){
614
0
        int submap=info->chmuxlist[i];
615
0
        int *ilogmask=iwork[i];
616
617
0
        nonzero[i]=floor1_encode(opb,vb,b->flr[info->floorsubmap[submap]],
618
0
                                 floor_posts[i][k],
619
0
                                 ilogmask);
620
#if 0
621
        {
622
          char buf[80];
623
          sprintf(buf,"maskI%c%d",i?'R':'L',k);
624
          float work[n/2];
625
          for(j=0;j<n/2;j++)
626
            work[j]=FLOOR1_fromdB_LOOKUP[iwork[i][j]];
627
          _analysis_output(buf,seq,work,n/2,1,1,0);
628
        }
629
#endif
630
0
      }
631
632
      /* our iteration is now based on masking curve, not prequant and
633
         coupling.  Only one prequant/coupling step */
634
635
      /* quantize/couple */
636
      /* incomplete implementation that assumes the tree is all depth
637
         one, or no tree at all */
638
0
      _vp_couple_quantize_normalize(k,
639
0
                                    &ci->psy_g_param,
640
0
                                    psy_look,
641
0
                                    info,
642
0
                                    gmdct,
643
0
                                    iwork,
644
0
                                    nonzero,
645
0
                                    ci->psy_g_param.sliding_lowpass[vb->W][k],
646
0
                                    vi->channels);
647
648
#if 0
649
      for(i=0;i<vi->channels;i++){
650
        char buf[80];
651
        sprintf(buf,"res%c%d",i?'R':'L',k);
652
        float work[n/2];
653
        for(j=0;j<n/2;j++)
654
          work[j]=iwork[i][j];
655
        _analysis_output(buf,seq,work,n/2,1,0,0);
656
      }
657
#endif
658
659
      /* classify and encode by submap */
660
0
      for(i=0;i<info->submaps;i++){
661
0
        int ch_in_bundle=0;
662
0
        long **classifications;
663
0
        int resnum=info->residuesubmap[i];
664
665
0
        for(j=0;j<vi->channels;j++){
666
0
          if(info->chmuxlist[j]==i){
667
0
            zerobundle[ch_in_bundle]=0;
668
0
            if(nonzero[j])zerobundle[ch_in_bundle]=1;
669
0
            couple_bundle[ch_in_bundle++]=iwork[j];
670
0
          }
671
0
        }
672
673
0
        classifications=_residue_P[ci->residue_type[resnum]]->
674
0
          class(vb,b->residue[resnum],couple_bundle,zerobundle,ch_in_bundle);
675
676
0
        ch_in_bundle=0;
677
0
        for(j=0;j<vi->channels;j++)
678
0
          if(info->chmuxlist[j]==i)
679
0
            couple_bundle[ch_in_bundle++]=iwork[j];
680
681
0
        _residue_P[ci->residue_type[resnum]]->
682
0
          forward(opb,vb,b->residue[resnum],
683
0
                  couple_bundle,zerobundle,ch_in_bundle,classifications,i);
684
0
      }
685
686
      /* ok, done encoding.  Next protopacket. */
687
0
    }
688
689
0
  }
690
691
#if 0
692
  seq++;
693
  total+=ci->blocksizes[vb->W]/4+ci->blocksizes[vb->nW]/4;
694
#endif
695
0
  return(0);
696
0
}
697
698
71.0k
static int mapping0_inverse(vorbis_block *vb,vorbis_info_mapping *l){
699
71.0k
  vorbis_dsp_state     *vd=vb->vd;
700
71.0k
  vorbis_info          *vi=vd->vi;
701
71.0k
  codec_setup_info     *ci=vi->codec_setup;
702
71.0k
  private_state        *b=vd->backend_state;
703
71.0k
  vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)l;
704
705
71.0k
  int                   i,j;
706
71.0k
  long                  n=vb->pcmend=ci->blocksizes[vb->W];
707
708
71.0k
  float **pcmbundle=alloca(sizeof(*pcmbundle)*vi->channels);
709
71.0k
  int    *zerobundle=alloca(sizeof(*zerobundle)*vi->channels);
710
711
71.0k
  int   *nonzero  =alloca(sizeof(*nonzero)*vi->channels);
712
71.0k
  void **floormemo=alloca(sizeof(*floormemo)*vi->channels);
713
714
  /* recover the spectral envelope; store it in the PCM vector for now */
715
2.99M
  for(i=0;i<vi->channels;i++){
716
2.92M
    int submap=info->chmuxlist[i];
717
2.92M
    floormemo[i]=_floor_P[ci->floor_type[info->floorsubmap[submap]]]->
718
2.92M
      inverse1(vb,b->flr[info->floorsubmap[submap]]);
719
2.92M
    if(floormemo[i])
720
119k
      nonzero[i]=1;
721
2.80M
    else
722
2.80M
      nonzero[i]=0;
723
2.92M
    memset(vb->pcm[i],0,sizeof(*vb->pcm[i])*n/2);
724
2.92M
  }
725
726
  /* channel coupling can 'dirty' the nonzero listing */
727
85.3k
  for(i=0;i<info->coupling_steps;i++){
728
14.2k
    if(nonzero[info->coupling_mag[i]] ||
729
14.2k
       nonzero[info->coupling_ang[i]]){
730
6.38k
      nonzero[info->coupling_mag[i]]=1;
731
6.38k
      nonzero[info->coupling_ang[i]]=1;
732
6.38k
    }
733
14.2k
  }
734
735
  /* recover the residue into our working vectors */
736
151k
  for(i=0;i<info->submaps;i++){
737
80.0k
    int ch_in_bundle=0;
738
3.05M
    for(j=0;j<vi->channels;j++){
739
2.97M
      if(info->chmuxlist[j]==i){
740
2.92M
        if(nonzero[j])
741
123k
          zerobundle[ch_in_bundle]=1;
742
2.80M
        else
743
2.80M
          zerobundle[ch_in_bundle]=0;
744
2.92M
        pcmbundle[ch_in_bundle++]=vb->pcm[j];
745
2.92M
      }
746
2.97M
    }
747
748
80.0k
    _residue_P[ci->residue_type[info->residuesubmap[i]]]->
749
80.0k
      inverse(vb,b->residue[info->residuesubmap[i]],
750
80.0k
              pcmbundle,zerobundle,ch_in_bundle);
751
80.0k
  }
752
753
  /* channel coupling */
754
85.3k
  for(i=info->coupling_steps-1;i>=0;i--){
755
14.2k
    float *pcmM=vb->pcm[info->coupling_mag[i]];
756
14.2k
    float *pcmA=vb->pcm[info->coupling_ang[i]];
757
758
1.68M
    for(j=0;j<n/2;j++){
759
1.66M
      float mag=pcmM[j];
760
1.66M
      float ang=pcmA[j];
761
762
1.66M
      if(mag>0)
763
107k
        if(ang>0){
764
96.3k
          pcmM[j]=mag;
765
96.3k
          pcmA[j]=mag-ang;
766
96.3k
        }else{
767
11.0k
          pcmA[j]=mag;
768
11.0k
          pcmM[j]=mag+ang;
769
11.0k
        }
770
1.56M
      else
771
1.56M
        if(ang>0){
772
11.0k
          pcmM[j]=mag;
773
11.0k
          pcmA[j]=mag+ang;
774
1.55M
        }else{
775
1.55M
          pcmA[j]=mag;
776
1.55M
          pcmM[j]=mag-ang;
777
1.55M
        }
778
1.66M
    }
779
14.2k
  }
780
781
  /* compute and apply spectral envelope */
782
2.99M
  for(i=0;i<vi->channels;i++){
783
2.92M
    float *pcm=vb->pcm[i];
784
2.92M
    int submap=info->chmuxlist[i];
785
2.92M
    _floor_P[ci->floor_type[info->floorsubmap[submap]]]->
786
2.92M
      inverse2(vb,b->flr[info->floorsubmap[submap]],
787
2.92M
               floormemo[i],pcm);
788
2.92M
  }
789
790
  /* transform the PCM data; takes PCM vector, vb; modifies PCM vector */
791
  /* only MDCT right now.... */
792
2.99M
  for(i=0;i<vi->channels;i++){
793
2.92M
    float *pcm=vb->pcm[i];
794
2.92M
    mdct_backward(b->transform[vb->W][0],pcm,pcm);
795
2.92M
  }
796
797
  /* all done! */
798
71.0k
  return(0);
799
71.0k
}
800
801
/* export hooks */
802
const vorbis_func_mapping mapping0_exportbundle={
803
  &mapping0_pack,
804
  &mapping0_unpack,
805
  &mapping0_free_info,
806
  &mapping0_forward,
807
  &mapping0_inverse
808
};