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