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