137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang/************************************************************************ 22da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * Copyright (C) 2002-2009, Xiph.org Foundation 32da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * Copyright (C) 2010, Robin Watts for Pinknoise Productions Ltd 437fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * All rights reserved. 537fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * 637fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * Redistribution and use in source and binary forms, with or without 72da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * modification, are permitted provided that the following conditions 82da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * are met: 937fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * 1037fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * * Redistributions of source code must retain the above copyright 1137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * notice, this list of conditions and the following disclaimer. 1237fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * * Redistributions in binary form must reproduce the above 1337fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * copyright notice, this list of conditions and the following disclaimer 1437fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * in the documentation and/or other materials provided with the 1537fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * distribution. 162da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * * Neither the names of the Xiph.org Foundation nor Pinknoise 172da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * Productions Ltd nor the names of its contributors may be used to 182da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * endorse or promote products derived from this software without 192da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * specific prior written permission. 2037fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * 2137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2237fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2337fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2437fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2537fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2637fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2737fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2837fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2937fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3037fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3237fe158a8611dd11ec0253ab1552399b780988dcGloria Wang ************************************************************************ 337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang function: channel mapping 0 implementation 357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3637fe158a8611dd11ec0253ab1552399b780988dcGloria Wang ************************************************************************/ 377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdlib.h> 397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdio.h> 407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <string.h> 417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <math.h> 427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "ogg.h" 437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "os.h" 447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "ivorbiscodec.h" 457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "mdct.h" 467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "codec_internal.h" 477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "codebook.h" 487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "misc.h" 497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid mapping_clear_info(vorbis_info_mapping *info){ 517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(info){ 527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(info->chmuxlist)_ogg_free(info->chmuxlist); 537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(info->submaplist)_ogg_free(info->submaplist); 547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(info->coupling)_ogg_free(info->coupling); 557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang memset(info,0,sizeof(*info)); 567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangstatic int ilog(unsigned int v){ 607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ret=0; 617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(v)--v; 627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(v){ 637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret++; 647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang v>>=1; 657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return(ret); 677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* also responsible for range checking */ 707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint mapping_info_unpack(vorbis_info_mapping *info,vorbis_info *vi, 717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_buffer *opb){ 727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int i; 737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; 747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang memset(info,0,sizeof(*info)); 757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_read(opb,1)) 777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang info->submaps=oggpack_read(opb,4)+1; 787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else 797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang info->submaps=1; 807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_read(opb,1)){ 827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang info->coupling_steps=oggpack_read(opb,8)+1; 837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang info->coupling= 847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _ogg_malloc(info->coupling_steps*sizeof(*info->coupling)); 857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<info->coupling_steps;i++){ 877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int testM=info->coupling[i].mag=(unsigned char)(oggpack_read(opb,ilog(vi->channels))); 887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int testA=info->coupling[i].ang=(unsigned char)(oggpack_read(opb,ilog(vi->channels))); 897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(testM<0 || 917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang testA<0 || 927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang testM==testA || 937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang testM>=vi->channels || 947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang testA>=vi->channels) goto err_out; 957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_read(opb,2)>0)goto err_out; /* 2,3:reserved */ 1007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(info->submaps>1){ 1027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang info->chmuxlist=_ogg_malloc(sizeof(*info->chmuxlist)*vi->channels); 1037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<vi->channels;i++){ 1047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang info->chmuxlist[i]=(unsigned char)(oggpack_read(opb,4)); 1057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(info->chmuxlist[i]>=info->submaps)goto err_out; 1067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang info->submaplist=_ogg_malloc(sizeof(*info->submaplist)*info->submaps); 1107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<info->submaps;i++){ 1117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int temp=oggpack_read(opb,8); 1127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang info->submaplist[i].floor=(char)oggpack_read(opb,8); 1137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(info->submaplist[i].floor>=ci->floors)goto err_out; 1147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang info->submaplist[i].residue=(char)oggpack_read(opb,8); 1157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(info->submaplist[i].residue>=ci->residues)goto err_out; 1167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return 0; 1197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang err_out: 1217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang mapping_clear_info(info); 1227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return -1; 1237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint mapping_inverse(vorbis_dsp_state *vd,vorbis_info_mapping *info){ 1267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang vorbis_info *vi=vd->vi; 1277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; 1287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int i,j; 1307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long n=ci->blocksizes[vd->W]; 1317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_int32_t **pcmbundle= 1337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang alloca(sizeof(*pcmbundle)*vi->channels); 1347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int *zerobundle= 1357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang alloca(sizeof(*zerobundle)*vi->channels); 1367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int *nonzero= 1377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang alloca(sizeof(*nonzero)*vi->channels); 1387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_int32_t **floormemo= 1397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang alloca(sizeof(*floormemo)*vi->channels); 1407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* recover the spectral envelope; store it in the PCM vector for now */ 1427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<vi->channels;i++){ 1437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int submap=0; 1447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int floorno; 1457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(info->submaps>1) 1477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang submap=info->chmuxlist[i]; 1487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang floorno=info->submaplist[submap].floor; 1497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(ci->floor_type[floorno]){ 1517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* floor 1 */ 1527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang floormemo[i]=alloca(sizeof(*floormemo[i])* 1537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang floor1_memosize(ci->floor_param[floorno])); 1547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang floormemo[i]=floor1_inverse1(vd,ci->floor_param[floorno],floormemo[i]); 1557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang }else{ 1567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* floor 0 */ 1577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang floormemo[i]=alloca(sizeof(*floormemo[i])* 1587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang floor0_memosize(ci->floor_param[floorno])); 1597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang floormemo[i]=floor0_inverse1(vd,ci->floor_param[floorno],floormemo[i]); 1607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(floormemo[i]) 1637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang nonzero[i]=1; 1647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else 1657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang nonzero[i]=0; 1667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang memset(vd->work[i],0,sizeof(*vd->work[i])*n/2); 1677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* channel coupling can 'dirty' the nonzero listing */ 1707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<info->coupling_steps;i++){ 1717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(nonzero[info->coupling[i].mag] || 1727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang nonzero[info->coupling[i].ang]){ 1737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang nonzero[info->coupling[i].mag]=1; 1747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang nonzero[info->coupling[i].ang]=1; 1757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* recover the residue into our working vectors */ 1797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<info->submaps;i++){ 1807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ch_in_bundle=0; 1817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(j=0;j<vi->channels;j++){ 1827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(!info->chmuxlist || info->chmuxlist[j]==i){ 1837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(nonzero[j]) 1847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang zerobundle[ch_in_bundle]=1; 1857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else 1867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang zerobundle[ch_in_bundle]=0; 1877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang pcmbundle[ch_in_bundle++]=vd->work[j]; 1887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang res_inverse(vd,ci->residue_param+info->submaplist[i].residue, 1927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang pcmbundle,zerobundle,ch_in_bundle); 1937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //for(j=0;j<vi->channels;j++) 1967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //_analysis_output("coupled",seq+j,vb->pcm[j],-8,n/2,0,0); 1977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* channel coupling */ 1997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=info->coupling_steps-1;i>=0;i--){ 2007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_int32_t *pcmM=vd->work[info->coupling[i].mag]; 2017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_int32_t *pcmA=vd->work[info->coupling[i].ang]; 2027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(j=0;j<n/2;j++){ 2047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_int32_t mag=pcmM[j]; 2057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_int32_t ang=pcmA[j]; 2067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(mag>0) 2087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(ang>0){ 2097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang pcmM[j]=mag; 2107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang pcmA[j]=mag-ang; 2117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang }else{ 2127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang pcmA[j]=mag; 2137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang pcmM[j]=mag+ang; 2147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else 2167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(ang>0){ 2177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang pcmM[j]=mag; 2187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang pcmA[j]=mag+ang; 2197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang }else{ 2207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang pcmA[j]=mag; 2217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang pcmM[j]=mag-ang; 2227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //for(j=0;j<vi->channels;j++) 2277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //_analysis_output("residue",seq+j,vb->pcm[j],-8,n/2,0,0); 2287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* compute and apply spectral envelope */ 2307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<vi->channels;i++){ 2317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_int32_t *pcm=vd->work[i]; 2327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int submap=0; 2337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int floorno; 2347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(info->submaps>1) 2367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang submap=info->chmuxlist[i]; 2377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang floorno=info->submaplist[submap].floor; 2387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(ci->floor_type[floorno]){ 2407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* floor 1 */ 2417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang floor1_inverse2(vd,ci->floor_param[floorno],floormemo[i],pcm); 2427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang }else{ 2437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* floor 0 */ 2447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang floor0_inverse2(vd,ci->floor_param[floorno],floormemo[i],pcm); 2457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //for(j=0;j<vi->channels;j++) 2497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //_analysis_output("mdct",seq+j,vb->pcm[j],-24,n/2,0,1); 2507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* transform the PCM data; takes PCM vector, vb; modifies PCM vector */ 2527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* only MDCT right now.... */ 2537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<vi->channels;i++) 2547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang mdct_backward(n,vd->work[i]); 2557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //for(j=0;j<vi->channels;j++) 2577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //_analysis_output("imdct",seq+j,vb->pcm[j],-24,n,0,0); 2587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* all done! */ 2607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return(0); 2617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang