18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/********************************************************************
28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010             *
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/                  *
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: channel mapping 0 implementation
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: mapping0.c 17022 2010-03-25 03:45:42Z xiphmont $
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdlib.h>
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdio.h>
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <string.h>
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <math.h>
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <ogg/ogg.h>
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "vorbis/codec.h"
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "codec_internal.h"
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "codebook.h"
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "window.h"
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "registry.h"
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "psy.h"
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "misc.h"
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* simplistic, wasteful way of doing this (unique lookup for each
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   mode/submapping); there should be a central repository for
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   identical lookups.  That will require minor work, so I'm putting it
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   off as low priority.
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   Why a lookup for each backend in a given mode?  Because the
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   blocksize is set by the mode, and low backend lookups may require
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   parameters from other areas of the mode/mapping */
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void mapping0_free_info(vorbis_info_mapping *i){
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)i;
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(info){
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    memset(info,0,sizeof(*info));
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    _ogg_free(info);
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic int ilog(unsigned int v){
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int ret=0;
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(v)--v;
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  while(v){
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    ret++;
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    v>>=1;
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return(ret);
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void mapping0_pack(vorbis_info *vi,vorbis_info_mapping *vm,
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                          oggpack_buffer *opb){
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int i;
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)vm;
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* another 'we meant to do it this way' hack...  up to beta 4, we
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     packed 4 binary zeros here to signify one submapping in use.  We
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     now redefine that to mean four bitflags that indicate use of
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     deeper features; bit0:submappings, bit1:coupling,
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     bit2,3:reserved. This is backward compatable with all actual uses
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     of the beta code. */
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(info->submaps>1){
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    oggpack_write(opb,1,1);
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    oggpack_write(opb,info->submaps-1,4);
738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }else
748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    oggpack_write(opb,0,1);
758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(info->coupling_steps>0){
778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    oggpack_write(opb,1,1);
788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    oggpack_write(opb,info->coupling_steps-1,8);
798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    for(i=0;i<info->coupling_steps;i++){
818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      oggpack_write(opb,info->coupling_mag[i],ilog(vi->channels));
828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      oggpack_write(opb,info->coupling_ang[i],ilog(vi->channels));
838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }else
858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    oggpack_write(opb,0,1);
868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  oggpack_write(opb,0,2); /* 2,3:reserved */
888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* we don't write the channel submappings if we only have one... */
908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(info->submaps>1){
918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    for(i=0;i<vi->channels;i++)
928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      oggpack_write(opb,info->chmuxlist[i],4);
938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  for(i=0;i<info->submaps;i++){
958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    oggpack_write(opb,0,8); /* time submap unused */
968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    oggpack_write(opb,info->floorsubmap[i],8);
978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    oggpack_write(opb,info->residuesubmap[i],8);
988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* also responsible for range checking */
1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb){
1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int i,b;
1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info_mapping0 *info=_ogg_calloc(1,sizeof(*info));
1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  codec_setup_info     *ci=vi->codec_setup;
1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  memset(info,0,sizeof(*info));
1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  b=oggpack_read(opb,1);
1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(b<0)goto err_out;
1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(b){
1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    info->submaps=oggpack_read(opb,4)+1;
1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(info->submaps<=0)goto err_out;
1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }else
1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    info->submaps=1;
1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  b=oggpack_read(opb,1);
1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(b<0)goto err_out;
1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(b){
1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    info->coupling_steps=oggpack_read(opb,8)+1;
1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(info->coupling_steps<=0)goto err_out;
1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    for(i=0;i<info->coupling_steps;i++){
1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      int testM=info->coupling_mag[i]=oggpack_read(opb,ilog(vi->channels));
1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      int testA=info->coupling_ang[i]=oggpack_read(opb,ilog(vi->channels));
1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(testM<0 ||
1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         testA<0 ||
1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         testM==testA ||
1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         testM>=vi->channels ||
1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         testA>=vi->channels) goto err_out;
1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(oggpack_read(opb,2)!=0)goto err_out; /* 2,3:reserved */
1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(info->submaps>1){
1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    for(i=0;i<vi->channels;i++){
1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      info->chmuxlist[i]=oggpack_read(opb,4);
1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(info->chmuxlist[i]>=info->submaps || info->chmuxlist[i]<0)goto err_out;
1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  for(i=0;i<info->submaps;i++){
1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    oggpack_read(opb,8); /* time submap unused */
1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    info->floorsubmap[i]=oggpack_read(opb,8);
1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(info->floorsubmap[i]>=ci->floors || info->floorsubmap[i]<0)goto err_out;
1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    info->residuesubmap[i]=oggpack_read(opb,8);
1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(info->residuesubmap[i]>=ci->residues || info->residuesubmap[i]<0)goto err_out;
1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return info;
1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels err_out:
1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  mapping0_free_info(info);
1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return(NULL);
1558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
1568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "os.h"
1588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "lpc.h"
1598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "lsp.h"
1608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "envelope.h"
1618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "mdct.h"
1628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "psy.h"
1638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "scales.h"
1648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
1668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic long seq=0;
1678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic ogg_int64_t total=0;
1688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic float FLOOR1_fromdB_LOOKUP[256]={
1698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F,
1708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F,
1718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F,
1728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F,
1738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F,
1748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F,
1758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F,
1768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F,
1778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F,
1788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F,
1798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F,
1808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F,
1818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F,
1828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F,
1838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F,
1848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F,
1858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F,
1868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F,
1878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F,
1888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F,
1898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F,
1908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F,
1918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F,
1928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F,
1938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F,
1948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F,
1958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F,
1968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F,
1978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F,
1988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F,
1998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F,
2008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F,
2018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F,
2028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F,
2038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F,
2048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F,
2058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F,
2068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F,
2078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F,
2088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F,
2098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F,
2108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F,
2118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F,
2128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F,
2138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F,
2148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F,
2158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F,
2168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F,
2178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F,
2188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F,
2198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F,
2208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F,
2218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F,
2228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F,
2238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F,
2248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F,
2258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F,
2268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F,
2278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F,
2288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F,
2298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F,
2308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F,
2318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F,
2328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  0.82788260F, 0.88168307F, 0.9389798F, 1.F,
2338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels};
2348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
2368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic int mapping0_forward(vorbis_block *vb){
2398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_dsp_state      *vd=vb->vd;
2408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info           *vi=vd->vi;
2418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  codec_setup_info      *ci=vi->codec_setup;
2428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  private_state         *b=vb->vd->backend_state;
2438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal;
2448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int                    n=vb->pcmend;
2458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int i,j,k;
2468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int    *nonzero    = alloca(sizeof(*nonzero)*vi->channels);
2488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float  **gmdct     = _vorbis_block_alloc(vb,vi->channels*sizeof(*gmdct));
2498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int    **iwork      = _vorbis_block_alloc(vb,vi->channels*sizeof(*iwork));
2508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int ***floor_posts = _vorbis_block_alloc(vb,vi->channels*sizeof(*floor_posts));
2518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float global_ampmax=vbi->ampmax;
2538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float *local_ampmax=alloca(sizeof(*local_ampmax)*vi->channels);
2548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int blocktype=vbi->blocktype;
2558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int modenumber=vb->W;
2578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info_mapping0 *info=ci->map_param[modenumber];
2588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_look_psy *psy_look=b->psy+blocktype+(vb->W?2:0);
2598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vb->mode=modenumber;
2618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  for(i=0;i<vi->channels;i++){
2638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    float scale=4.f/n;
2648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    float scale_dB;
2658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    float *pcm     =vb->pcm[i];
2678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    float *logfft  =pcm;
2688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    iwork[i]=_vorbis_block_alloc(vb,n/2*sizeof(**iwork));
2708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    gmdct[i]=_vorbis_block_alloc(vb,n/2*sizeof(**gmdct));
2718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    scale_dB=todB(&scale) + .345; /* + .345 is a hack; the original
2738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     todB estimation used on IEEE 754
2748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     compliant machines had a bug that
2758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     returned dB values about a third
2768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     of a decibel too high.  The bug
2778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     was harmless because tunings
2788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     implicitly took that into
2798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     account.  However, fixing the bug
2808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     in the estimator requires
2818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     changing all the tunings as well.
2828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     For now, it's easier to sync
2838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     things back up here, and
2848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     recalibrate the tunings in the
2858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     next major model upgrade. */
2868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
2888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(vi->channels==2){
2898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(i==0)
2908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _analysis_output("pcmL",seq,pcm,n,0,0,total-n/2);
2918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      else
2928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _analysis_output("pcmR",seq,pcm,n,0,0,total-n/2);
2938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }else{
2948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      _analysis_output("pcm",seq,pcm,n,0,0,total-n/2);
2958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
2968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
2978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    /* window the PCM data */
2998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    _vorbis_apply_window(pcm,b->window,ci->blocksizes,vb->lW,vb->W,vb->nW);
3008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
3028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(vi->channels==2){
3038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(i==0)
3048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _analysis_output("windowedL",seq,pcm,n,0,0,total-n/2);
3058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      else
3068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _analysis_output("windowedR",seq,pcm,n,0,0,total-n/2);
3078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }else{
3088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      _analysis_output("windowed",seq,pcm,n,0,0,total-n/2);
3098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
3108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
3118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    /* transform the PCM data */
3138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    /* only MDCT right now.... */
3148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    mdct_forward(b->transform[vb->W][0],pcm,gmdct[i]);
3158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    /* FFT yields more accurate tonal estimation (not phase sensitive) */
3178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    drft_forward(&b->fft_look[vb->W],pcm);
3188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    logfft[0]=scale_dB+todB(pcm)  + .345; /* + .345 is a hack; the
3198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     original todB estimation used on
3208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     IEEE 754 compliant machines had a
3218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     bug that returned dB values about
3228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     a third of a decibel too high.
3238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     The bug was harmless because
3248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     tunings implicitly took that into
3258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     account.  However, fixing the bug
3268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     in the estimator requires
3278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     changing all the tunings as well.
3288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     For now, it's easier to sync
3298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     things back up here, and
3308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     recalibrate the tunings in the
3318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     next major model upgrade. */
3328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    local_ampmax[i]=logfft[0];
3338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    for(j=1;j<n-1;j+=2){
3348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      float temp=pcm[j]*pcm[j]+pcm[j+1]*pcm[j+1];
3358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      temp=logfft[(j+1)>>1]=scale_dB+.5f*todB(&temp)  + .345; /* +
3368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     .345 is a hack; the original todB
3378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     estimation used on IEEE 754
3388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     compliant machines had a bug that
3398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     returned dB values about a third
3408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     of a decibel too high.  The bug
3418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     was harmless because tunings
3428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     implicitly took that into
3438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     account.  However, fixing the bug
3448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     in the estimator requires
3458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     changing all the tunings as well.
3468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     For now, it's easier to sync
3478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     things back up here, and
3488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     recalibrate the tunings in the
3498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     next major model upgrade. */
3508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(temp>local_ampmax[i])local_ampmax[i]=temp;
3518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
3528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(local_ampmax[i]>0.f)local_ampmax[i]=0.f;
3548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(local_ampmax[i]>global_ampmax)global_ampmax=local_ampmax[i];
3558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
3578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(vi->channels==2){
3588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(i==0){
3598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _analysis_output("fftL",seq,logfft,n/2,1,0,0);
3608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }else{
3618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _analysis_output("fftR",seq,logfft,n/2,1,0,0);
3628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
3638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }else{
3648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      _analysis_output("fft",seq,logfft,n/2,1,0,0);
3658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
3668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
3678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
3698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  {
3718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    float   *noise        = _vorbis_block_alloc(vb,n/2*sizeof(*noise));
3728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    float   *tone         = _vorbis_block_alloc(vb,n/2*sizeof(*tone));
3738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    for(i=0;i<vi->channels;i++){
3758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* the encoder setup assumes that all the modes used by any
3768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         specific bitrate tweaking use the same floor */
3778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      int submap=info->chmuxlist[i];
3798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* the following makes things clearer to *me* anyway */
3818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      float *mdct    =gmdct[i];
3828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      float *logfft  =vb->pcm[i];
3838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      float *logmdct =logfft+n/2;
3858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      float *logmask =logfft;
3868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      vb->mode=modenumber;
3888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      floor_posts[i]=_vorbis_block_alloc(vb,PACKETBLOBS*sizeof(**floor_posts));
3908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      memset(floor_posts[i],0,sizeof(**floor_posts)*PACKETBLOBS);
3918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      for(j=0;j<n/2;j++)
3938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        logmdct[j]=todB(mdct+j)  + .345; /* + .345 is a hack; the original
3948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     todB estimation used on IEEE 754
3958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     compliant machines had a bug that
3968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     returned dB values about a third
3978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     of a decibel too high.  The bug
3988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     was harmless because tunings
3998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     implicitly took that into
4008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     account.  However, fixing the bug
4018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     in the estimator requires
4028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     changing all the tunings as well.
4038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     For now, it's easier to sync
4048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     things back up here, and
4058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     recalibrate the tunings in the
4068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     next major model upgrade. */
4078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
4098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(vi->channels==2){
4108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(i==0)
4118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          _analysis_output("mdctL",seq,logmdct,n/2,1,0,0);
4128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        else
4138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          _analysis_output("mdctR",seq,logmdct,n/2,1,0,0);
4148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }else{
4158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _analysis_output("mdct",seq,logmdct,n/2,1,0,0);
4168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
4178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
4188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* first step; noise masking.  Not only does 'noise masking'
4208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         give us curves from which we can decide how much resolution
4218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         to give noise parts of the spectrum, it also implicitly hands
4228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         us a tonality estimate (the larger the value in the
4238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         'noise_depth' vector, the more tonal that area is) */
4248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      _vp_noisemask(psy_look,
4268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                    logmdct,
4278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                    noise); /* noise does not have by-frequency offset
4288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                               bias applied yet */
4298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
4308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(vi->channels==2){
4318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(i==0)
4328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          _analysis_output("noiseL",seq,noise,n/2,1,0,0);
4338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        else
4348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          _analysis_output("noiseR",seq,noise,n/2,1,0,0);
4358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }else{
4368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _analysis_output("noise",seq,noise,n/2,1,0,0);
4378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
4388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
4398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* second step: 'all the other crap'; all the stuff that isn't
4418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         computed/fit for bitrate management goes in the second psy
4428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         vector.  This includes tone masking, peak limiting and ATH */
4438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      _vp_tonemask(psy_look,
4458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                   logfft,
4468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                   tone,
4478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                   global_ampmax,
4488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                   local_ampmax[i]);
4498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
4518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(vi->channels==2){
4528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(i==0)
4538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          _analysis_output("toneL",seq,tone,n/2,1,0,0);
4548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        else
4558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          _analysis_output("toneR",seq,tone,n/2,1,0,0);
4568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }else{
4578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _analysis_output("tone",seq,tone,n/2,1,0,0);
4588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
4598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
4608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* third step; we offset the noise vectors, overlay tone
4628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         masking.  We then do a floor1-specific line fit.  If we're
4638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         performing bitrate management, the line fit is performed
4648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         multiple times for up/down tweakage on demand. */
4658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
4678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      {
4688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      float aotuv[psy_look->n];
4698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
4708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _vp_offset_and_mix(psy_look,
4728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           noise,
4738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           tone,
4748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           1,
4758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           logmask,
4768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           mdct,
4778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           logmdct);
4788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
4808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(vi->channels==2){
4818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          if(i==0)
4828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            _analysis_output("aotuvM1_L",seq,aotuv,psy_look->n,1,1,0);
4838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          else
4848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            _analysis_output("aotuvM1_R",seq,aotuv,psy_look->n,1,1,0);
4858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }else{
4868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          _analysis_output("aotuvM1",seq,aotuv,psy_look->n,1,1,0);
4878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
4888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
4898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
4908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
4938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(vi->channels==2){
4948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(i==0)
4958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          _analysis_output("mask1L",seq,logmask,n/2,1,0,0);
4968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        else
4978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          _analysis_output("mask1R",seq,logmask,n/2,1,0,0);
4988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }else{
4998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _analysis_output("mask1",seq,logmask,n/2,1,0,0);
5008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
5018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
5028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* this algorithm is hardwired to floor 1 for now; abort out if
5048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         we're *not* floor1.  This won't happen unless someone has
5058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         broken the encode setup lib.  Guard it anyway. */
5068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(ci->floor_type[info->floorsubmap[submap]]!=1)return(-1);
5078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      floor_posts[i][PACKETBLOBS/2]=
5098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        floor1_fit(vb,b->flr[info->floorsubmap[submap]],
5108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                   logmdct,
5118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                   logmask);
5128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* are we managing bitrate?  If so, perform two more fits for
5148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         later rate tweaking (fits represent hi/lo) */
5158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(vorbis_bitrate_managed(vb) && floor_posts[i][PACKETBLOBS/2]){
5168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        /* higher rate by way of lower noise curve */
5178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _vp_offset_and_mix(psy_look,
5198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           noise,
5208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           tone,
5218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           2,
5228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           logmask,
5238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           mdct,
5248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           logmdct);
5258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
5278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(vi->channels==2){
5288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          if(i==0)
5298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            _analysis_output("mask2L",seq,logmask,n/2,1,0,0);
5308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          else
5318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            _analysis_output("mask2R",seq,logmask,n/2,1,0,0);
5328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }else{
5338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          _analysis_output("mask2",seq,logmask,n/2,1,0,0);
5348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
5358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
5368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        floor_posts[i][PACKETBLOBS-1]=
5388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          floor1_fit(vb,b->flr[info->floorsubmap[submap]],
5398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                     logmdct,
5408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                     logmask);
5418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        /* lower rate by way of higher noise curve */
5438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _vp_offset_and_mix(psy_look,
5448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           noise,
5458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           tone,
5468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           0,
5478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           logmask,
5488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           mdct,
5498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           logmdct);
5508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
5528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(vi->channels==2){
5538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          if(i==0)
5548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            _analysis_output("mask0L",seq,logmask,n/2,1,0,0);
5558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          else
5568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            _analysis_output("mask0R",seq,logmask,n/2,1,0,0);
5578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }else{
5588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          _analysis_output("mask0",seq,logmask,n/2,1,0,0);
5598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
5608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
5618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        floor_posts[i][0]=
5638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          floor1_fit(vb,b->flr[info->floorsubmap[submap]],
5648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                     logmdct,
5658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                     logmask);
5668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        /* we also interpolate a range of intermediate curves for
5688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           intermediate rates */
5698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        for(k=1;k<PACKETBLOBS/2;k++)
5708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          floor_posts[i][k]=
5718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            floor1_interpolate_fit(vb,b->flr[info->floorsubmap[submap]],
5728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                   floor_posts[i][0],
5738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                   floor_posts[i][PACKETBLOBS/2],
5748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                   k*65536/(PACKETBLOBS/2));
5758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        for(k=PACKETBLOBS/2+1;k<PACKETBLOBS-1;k++)
5768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          floor_posts[i][k]=
5778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            floor1_interpolate_fit(vb,b->flr[info->floorsubmap[submap]],
5788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                   floor_posts[i][PACKETBLOBS/2],
5798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                   floor_posts[i][PACKETBLOBS-1],
5808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                   (k-PACKETBLOBS/2)*65536/(PACKETBLOBS/2));
5818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
5828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
5838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
5848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vbi->ampmax=global_ampmax;
5858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /*
5878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    the next phases are performed once for vbr-only and PACKETBLOB
5888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    times for bitrate managed modes.
5898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    1) encode actual mode being used
5918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    2) encode the floor for each channel, compute coded mask curve/res
5928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    3) normalize and couple.
5938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    4) encode residue
5948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    5) save packet bytes to the packetblob vector
5958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  */
5978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
5988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* iterate over the many masking curve fits we've created */
5998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  {
6018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    int **couple_bundle=alloca(sizeof(*couple_bundle)*vi->channels);
6028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    int *zerobundle=alloca(sizeof(*zerobundle)*vi->channels);
6038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    for(k=(vorbis_bitrate_managed(vb)?0:PACKETBLOBS/2);
6058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        k<=(vorbis_bitrate_managed(vb)?PACKETBLOBS-1:PACKETBLOBS/2);
6068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        k++){
6078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      oggpack_buffer *opb=vbi->packetblob[k];
6088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* start out our new packet blob with packet type and mode */
6108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* Encode the packet type */
6118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      oggpack_write(opb,0,1);
6128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* Encode the modenumber */
6138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* Encode frame mode, pre,post windowsize, then dispatch */
6148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      oggpack_write(opb,modenumber,b->modebits);
6158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(vb->W){
6168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        oggpack_write(opb,vb->lW,1);
6178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        oggpack_write(opb,vb->nW,1);
6188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
6198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* encode floor, compute masking curve, sep out residue */
6218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      for(i=0;i<vi->channels;i++){
6228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        int submap=info->chmuxlist[i];
6238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        int *ilogmask=iwork[i];
6248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        nonzero[i]=floor1_encode(opb,vb,b->flr[info->floorsubmap[submap]],
6268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                 floor_posts[i][k],
6278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                 ilogmask);
6288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
6298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        {
6308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          char buf[80];
6318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          sprintf(buf,"maskI%c%d",i?'R':'L',k);
6328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          float work[n/2];
6338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          for(j=0;j<n/2;j++)
6348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            work[j]=FLOOR1_fromdB_LOOKUP[iwork[i][j]];
6358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          _analysis_output(buf,seq,work,n/2,1,1,0);
6368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
6378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
6388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
6398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* our iteration is now based on masking curve, not prequant and
6418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         coupling.  Only one prequant/coupling step */
6428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* quantize/couple */
6448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* incomplete implementation that assumes the tree is all depth
6458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         one, or no tree at all */
6468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      _vp_couple_quantize_normalize(k,
6478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    &ci->psy_g_param,
6488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    psy_look,
6498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    info,
6508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    gmdct,
6518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    iwork,
6528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    nonzero,
6538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    ci->psy_g_param.sliding_lowpass[vb->W][k],
6548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    vi->channels);
6558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
6578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      for(i=0;i<vi->channels;i++){
6588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        char buf[80];
6598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        sprintf(buf,"res%c%d",i?'R':'L',k);
6608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        float work[n/2];
6618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        for(j=0;j<n/2;j++)
6628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          work[j]=iwork[i][j];
6638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _analysis_output(buf,seq,work,n/2,1,0,0);
6648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
6658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
6668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* classify and encode by submap */
6688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      for(i=0;i<info->submaps;i++){
6698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        int ch_in_bundle=0;
6708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        long **classifications;
6718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        int resnum=info->residuesubmap[i];
6728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        for(j=0;j<vi->channels;j++){
6748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          if(info->chmuxlist[j]==i){
6758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            zerobundle[ch_in_bundle]=0;
6768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            if(nonzero[j])zerobundle[ch_in_bundle]=1;
6778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            couple_bundle[ch_in_bundle++]=iwork[j];
6788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          }
6798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
6808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        classifications=_residue_P[ci->residue_type[resnum]]->
6828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          class(vb,b->residue[resnum],couple_bundle,zerobundle,ch_in_bundle);
6838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        ch_in_bundle=0;
6858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        for(j=0;j<vi->channels;j++)
6868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          if(info->chmuxlist[j]==i)
6878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            couple_bundle[ch_in_bundle++]=iwork[j];
6888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        _residue_P[ci->residue_type[resnum]]->
6908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          forward(opb,vb,b->residue[resnum],
6918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                  couple_bundle,zerobundle,ch_in_bundle,classifications,i);
6928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
6938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      /* ok, done encoding.  Next protopacket. */
6958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
6968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
6988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
6998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#if 0
7008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  seq++;
7018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  total+=ci->blocksizes[vb->W]/4+ci->blocksizes[vb->nW]/4;
7028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
7038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return(0);
7048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
7058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic int mapping0_inverse(vorbis_block *vb,vorbis_info_mapping *l){
7078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_dsp_state     *vd=vb->vd;
7088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info          *vi=vd->vi;
7098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  codec_setup_info     *ci=vi->codec_setup;
7108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  private_state        *b=vd->backend_state;
7118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)l;
7128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int                   i,j;
7148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long                  n=vb->pcmend=ci->blocksizes[vb->W];
7158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float **pcmbundle=alloca(sizeof(*pcmbundle)*vi->channels);
7178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int    *zerobundle=alloca(sizeof(*zerobundle)*vi->channels);
7188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int   *nonzero  =alloca(sizeof(*nonzero)*vi->channels);
7208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  void **floormemo=alloca(sizeof(*floormemo)*vi->channels);
7218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* recover the spectral envelope; store it in the PCM vector for now */
7238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  for(i=0;i<vi->channels;i++){
7248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    int submap=info->chmuxlist[i];
7258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    floormemo[i]=_floor_P[ci->floor_type[info->floorsubmap[submap]]]->
7268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      inverse1(vb,b->flr[info->floorsubmap[submap]]);
7278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(floormemo[i])
7288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      nonzero[i]=1;
7298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    else
7308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      nonzero[i]=0;
7318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    memset(vb->pcm[i],0,sizeof(*vb->pcm[i])*n/2);
7328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
7338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* channel coupling can 'dirty' the nonzero listing */
7358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  for(i=0;i<info->coupling_steps;i++){
7368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    if(nonzero[info->coupling_mag[i]] ||
7378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       nonzero[info->coupling_ang[i]]){
7388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      nonzero[info->coupling_mag[i]]=1;
7398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      nonzero[info->coupling_ang[i]]=1;
7408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
7418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
7428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* recover the residue into our working vectors */
7448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  for(i=0;i<info->submaps;i++){
7458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    int ch_in_bundle=0;
7468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    for(j=0;j<vi->channels;j++){
7478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(info->chmuxlist[j]==i){
7488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(nonzero[j])
7498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          zerobundle[ch_in_bundle]=1;
7508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        else
7518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          zerobundle[ch_in_bundle]=0;
7528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        pcmbundle[ch_in_bundle++]=vb->pcm[j];
7538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
7548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
7558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    _residue_P[ci->residue_type[info->residuesubmap[i]]]->
7578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      inverse(vb,b->residue[info->residuesubmap[i]],
7588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels              pcmbundle,zerobundle,ch_in_bundle);
7598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
7608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* channel coupling */
7628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  for(i=info->coupling_steps-1;i>=0;i--){
7638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    float *pcmM=vb->pcm[info->coupling_mag[i]];
7648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    float *pcmA=vb->pcm[info->coupling_ang[i]];
7658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    for(j=0;j<n/2;j++){
7678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      float mag=pcmM[j];
7688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      float ang=pcmA[j];
7698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      if(mag>0)
7718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(ang>0){
7728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          pcmM[j]=mag;
7738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          pcmA[j]=mag-ang;
7748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }else{
7758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          pcmA[j]=mag;
7768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          pcmM[j]=mag+ang;
7778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
7788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      else
7798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        if(ang>0){
7808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          pcmM[j]=mag;
7818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          pcmA[j]=mag+ang;
7828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }else{
7838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          pcmA[j]=mag;
7848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          pcmM[j]=mag-ang;
7858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        }
7868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
7878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
7888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* compute and apply spectral envelope */
7908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  for(i=0;i<vi->channels;i++){
7918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    float *pcm=vb->pcm[i];
7928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    int submap=info->chmuxlist[i];
7938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    _floor_P[ci->floor_type[info->floorsubmap[submap]]]->
7948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      inverse2(vb,b->flr[info->floorsubmap[submap]],
7958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels               floormemo[i],pcm);
7968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
7978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
7988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* transform the PCM data; takes PCM vector, vb; modifies PCM vector */
7998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* only MDCT right now.... */
8008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  for(i=0;i<vi->channels;i++){
8018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    float *pcm=vb->pcm[i];
8028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    mdct_backward(b->transform[vb->W][0],pcm,pcm);
8038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
8048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
8058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* all done! */
8068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return(0);
8078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
8088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
8098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* export hooks */
8108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsconst vorbis_func_mapping mapping0_exportbundle={
8118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  &mapping0_pack,
8128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  &mapping0_unpack,
8138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  &mapping0_free_info,
8148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  &mapping0_forward,
8158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  &mapping0_inverse
8168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels};
817