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