mapping0.c 23 KB

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