codebook.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  1. /********************************************************************
  2. * *
  3. * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. *
  4. * *
  5. * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
  6. * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
  7. * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
  8. * *
  9. * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
  10. * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ *
  11. * *
  12. ********************************************************************
  13. function: basic codebook pack/unpack/code/decode operations
  14. ********************************************************************/
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <math.h>
  18. #include <limits.h>
  19. #include "ogg.h"
  20. #include "ivorbiscodec.h"
  21. #include "codebook.h"
  22. #include "misc.h"
  23. #include "os.h"
  24. /**** pack/unpack helpers ******************************************/
  25. int _ilog(unsigned int v){
  26. int ret=0;
  27. while(v){
  28. ret++;
  29. v>>=1;
  30. }
  31. return(ret);
  32. }
  33. static ogg_uint32_t decpack(long entry,long used_entry,long quantvals,
  34. codebook *b,oggpack_buffer *opb,int maptype){
  35. ogg_uint32_t ret=0;
  36. int j;
  37. switch(b->dec_type){
  38. case 0:
  39. return (ogg_uint32_t)entry;
  40. case 1:
  41. if(maptype==1){
  42. /* vals are already read into temporary column vector here */
  43. for(j=0;j<b->dim;j++){
  44. ogg_uint32_t off=entry%quantvals;
  45. entry/=quantvals;
  46. ret|=((ogg_uint16_t *)(b->q_val))[off]<<(b->q_bits*j);
  47. }
  48. }else{
  49. for(j=0;j<b->dim;j++)
  50. ret|=oggpack_read(opb,b->q_bits)<<(b->q_bits*j);
  51. }
  52. return ret;
  53. case 2:
  54. for(j=0;j<b->dim;j++){
  55. ogg_uint32_t off=entry%quantvals;
  56. entry/=quantvals;
  57. ret|=off<<(b->q_pack*j);
  58. }
  59. return ret;
  60. case 3:
  61. return (ogg_uint32_t)used_entry;
  62. }
  63. return 0; /* silence compiler */
  64. }
  65. /* 32 bit float (not IEEE; nonnormalized mantissa +
  66. biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm
  67. Why not IEEE? It's just not that important here. */
  68. static ogg_int32_t _float32_unpack(long val,int *point){
  69. long mant=val&0x1fffff;
  70. int sign=val&0x80000000;
  71. *point=((val&0x7fe00000L)>>21)-788;
  72. if(mant){
  73. while(!(mant&0x40000000)){
  74. mant<<=1;
  75. *point-=1;
  76. }
  77. if(sign)mant= -mant;
  78. }else{
  79. *point=-9999;
  80. }
  81. return mant;
  82. }
  83. /* choose the smallest supported node size that fits our decode table.
  84. Legal bytewidths are 1/1 1/2 2/2 2/4 4/4 */
  85. static int _determine_node_bytes(long used, int leafwidth){
  86. /* special case small books to size 4 to avoid multiple special
  87. cases in repack */
  88. if(used<2)
  89. return 4;
  90. if(leafwidth==3)leafwidth=4;
  91. if(_ilog(3*used-6)+1 <= leafwidth*4)
  92. return leafwidth/2?leafwidth/2:1;
  93. return leafwidth;
  94. }
  95. /* convenience/clarity; leaves are specified as multiple of node word
  96. size (1 or 2) */
  97. static int _determine_leaf_words(int nodeb, int leafwidth){
  98. if(leafwidth>nodeb)return 2;
  99. return 1;
  100. }
  101. /* given a list of word lengths, number of used entries, and byte
  102. width of a leaf, generate the decode table */
  103. static int _make_words(char *l,long n,ogg_uint32_t *r,long quantvals,
  104. codebook *b, oggpack_buffer *opb,int maptype){
  105. long i,j,count=0;
  106. long top=0;
  107. ogg_uint32_t marker[33];
  108. if (n<1)
  109. return 1;
  110. if(n<2){
  111. r[0]=0x80000000;
  112. }else{
  113. memset(marker,0,sizeof(marker));
  114. for(i=0;i<n;i++){
  115. long length=l[i];
  116. if(length){
  117. ogg_uint32_t entry=marker[length];
  118. long chase=0;
  119. if(count && !entry)return -1; /* overpopulated tree! */
  120. /* chase the tree as far as it's already populated, fill in past */
  121. for(j=0;j<length-1;j++){
  122. int bit=(entry>>(length-j-1))&1;
  123. if(chase>=top){
  124. if (chase < 0 || chase >= n) return 1;
  125. top++;
  126. r[chase*2]=top;
  127. r[chase*2+1]=0;
  128. }else
  129. if (chase < 0 || chase >= n || chase*2+bit > n*2+1) return 1;
  130. if(!r[chase*2+bit])
  131. r[chase*2+bit]=top;
  132. chase=r[chase*2+bit];
  133. if (chase < 0 || chase >= n) return 1;
  134. }
  135. {
  136. int bit=(entry>>(length-j-1))&1;
  137. if(chase>=top){
  138. top++;
  139. r[chase*2+1]=0;
  140. }
  141. r[chase*2+bit]= decpack(i,count++,quantvals,b,opb,maptype) |
  142. 0x80000000;
  143. }
  144. /* Look to see if the next shorter marker points to the node
  145. above. if so, update it and repeat. */
  146. for(j=length;j>0;j--){
  147. if(marker[j]&1){
  148. marker[j]=marker[j-1]<<1;
  149. break;
  150. }
  151. marker[j]++;
  152. }
  153. /* prune the tree; the implicit invariant says all the longer
  154. markers were dangling from our just-taken node. Dangle them
  155. from our *new* node. */
  156. for(j=length+1;j<33;j++)
  157. if((marker[j]>>1) == entry){
  158. entry=marker[j];
  159. marker[j]=marker[j-1]<<1;
  160. }else
  161. break;
  162. }
  163. }
  164. }
  165. return 0;
  166. }
  167. static int _make_decode_table(codebook *s,char *lengthlist,long quantvals,
  168. oggpack_buffer *opb,int maptype){
  169. int i;
  170. ogg_uint32_t *work;
  171. if (!lengthlist) return 1;
  172. if(s->dec_nodeb==4){
  173. /* Over-allocate by using s->entries instead of used_entries.
  174. * This means that we can use s->entries to enforce size in
  175. * _make_words without messing up length list looping.
  176. * This probably wastes a bit of space, but it shouldn't
  177. * impact behavior or size too much.
  178. */
  179. s->dec_table=_ogg_malloc((s->entries*2+1)*sizeof(*work));
  180. if (!s->dec_table) return 1;
  181. /* +1 (rather than -2) is to accommodate 0 and 1 sized books,
  182. which are specialcased to nodeb==4 */
  183. if(_make_words(lengthlist,s->entries,
  184. s->dec_table,quantvals,s,opb,maptype))return 1;
  185. return 0;
  186. }
  187. if (s->used_entries > INT_MAX/2 ||
  188. s->used_entries*2 > INT_MAX/((long) sizeof(*work)) - 1) return 1;
  189. /* Overallocate as above */
  190. work=alloca((s->entries*2+1)*sizeof(*work));
  191. if(_make_words(lengthlist,s->entries,work,quantvals,s,opb,maptype))return 1;
  192. if (s->used_entries > INT_MAX/(s->dec_leafw+1)) return 1;
  193. if (s->dec_nodeb && s->used_entries * (s->dec_leafw+1) > INT_MAX/s->dec_nodeb) return 1;
  194. s->dec_table=_ogg_malloc((s->used_entries*(s->dec_leafw+1)-2)*
  195. s->dec_nodeb);
  196. if (!s->dec_table) return 1;
  197. if(s->dec_leafw==1){
  198. switch(s->dec_nodeb){
  199. case 1:
  200. for(i=0;i<s->used_entries*2-2;i++)
  201. ((unsigned char *)s->dec_table)[i]=(unsigned char)
  202. (((work[i] & 0x80000000UL) >> 24) | work[i]);
  203. break;
  204. case 2:
  205. for(i=0;i<s->used_entries*2-2;i++)
  206. ((ogg_uint16_t *)s->dec_table)[i]=(ogg_uint16_t)
  207. (((work[i] & 0x80000000UL) >> 16) | work[i]);
  208. break;
  209. }
  210. }else{
  211. /* more complex; we have to do a two-pass repack that updates the
  212. node indexing. */
  213. long top=s->used_entries*3-2;
  214. if(s->dec_nodeb==1){
  215. unsigned char *out=(unsigned char *)s->dec_table;
  216. for(i=s->used_entries*2-4;i>=0;i-=2){
  217. if(work[i]&0x80000000UL){
  218. if(work[i+1]&0x80000000UL){
  219. top-=4;
  220. out[top]=(work[i]>>8 & 0x7f)|0x80;
  221. out[top+1]=(work[i+1]>>8 & 0x7f)|0x80;
  222. out[top+2]=work[i] & 0xff;
  223. out[top+3]=work[i+1] & 0xff;
  224. }else{
  225. top-=3;
  226. out[top]=(work[i]>>8 & 0x7f)|0x80;
  227. out[top+1]=work[work[i+1]*2];
  228. out[top+2]=work[i] & 0xff;
  229. }
  230. }else{
  231. if(work[i+1]&0x80000000UL){
  232. top-=3;
  233. out[top]=work[work[i]*2];
  234. out[top+1]=(work[i+1]>>8 & 0x7f)|0x80;
  235. out[top+2]=work[i+1] & 0xff;
  236. }else{
  237. top-=2;
  238. out[top]=work[work[i]*2];
  239. out[top+1]=work[work[i+1]*2];
  240. }
  241. }
  242. work[i]=top;
  243. }
  244. }else{
  245. ogg_uint16_t *out=(ogg_uint16_t *)s->dec_table;
  246. for(i=s->used_entries*2-4;i>=0;i-=2){
  247. if(work[i]&0x80000000UL){
  248. if(work[i+1]&0x80000000UL){
  249. top-=4;
  250. out[top]=(work[i]>>16 & 0x7fff)|0x8000;
  251. out[top+1]=(work[i+1]>>16 & 0x7fff)|0x8000;
  252. out[top+2]=work[i] & 0xffff;
  253. out[top+3]=work[i+1] & 0xffff;
  254. }else{
  255. top-=3;
  256. out[top]=(work[i]>>16 & 0x7fff)|0x8000;
  257. out[top+1]=work[work[i+1]*2];
  258. out[top+2]=work[i] & 0xffff;
  259. }
  260. }else{
  261. if(work[i+1]&0x80000000UL){
  262. top-=3;
  263. out[top]=work[work[i]*2];
  264. out[top+1]=(work[i+1]>>16 & 0x7fff)|0x8000;
  265. out[top+2]=work[i+1] & 0xffff;
  266. }else{
  267. top-=2;
  268. out[top]=work[work[i]*2];
  269. out[top+1]=work[work[i+1]*2];
  270. }
  271. }
  272. work[i]=top;
  273. }
  274. }
  275. }
  276. return 0;
  277. }
  278. /* most of the time, entries%dimensions == 0, but we need to be
  279. well defined. We define that the possible vales at each
  280. scalar is values == entries/dim. If entries%dim != 0, we'll
  281. have 'too few' values (values*dim<entries), which means that
  282. we'll have 'left over' entries; left over entries use zeroed
  283. values (and are wasted). So don't generate codebooks like
  284. that */
  285. /* there might be a straightforward one-line way to do the below
  286. that's portable and totally safe against roundoff, but I haven't
  287. thought of it. Therefore, we opt on the side of caution */
  288. long _book_maptype1_quantvals(codebook *b){
  289. /* get us a starting hint, we'll polish it below */
  290. int bits=_ilog(b->entries);
  291. int vals=b->entries>>((bits-1)*(b->dim-1)/b->dim);
  292. while(1){
  293. long acc=1;
  294. long acc1=1;
  295. int i;
  296. for(i=0;i<b->dim;i++){
  297. acc*=vals;
  298. acc1*=vals+1;
  299. }
  300. if(acc<=b->entries && acc1>b->entries){
  301. return(vals);
  302. }else{
  303. if(acc>b->entries){
  304. vals--;
  305. }else{
  306. vals++;
  307. }
  308. }
  309. }
  310. }
  311. void vorbis_book_clear(codebook *b){
  312. /* static book is not cleared; we're likely called on the lookup and
  313. the static codebook belongs to the info struct */
  314. if(b->q_val)_ogg_free(b->q_val);
  315. if(b->dec_table)_ogg_free(b->dec_table);
  316. if(b->dec_buf)_ogg_free(b->dec_buf);
  317. memset(b,0,sizeof(*b));
  318. }
  319. int vorbis_book_unpack(oggpack_buffer *opb,codebook *s){
  320. char *lengthlist=NULL;
  321. int quantvals=0;
  322. long i,j;
  323. int maptype;
  324. memset(s,0,sizeof(*s));
  325. /* make sure alignment is correct */
  326. if(oggpack_read(opb,24)!=0x564342)goto _eofout;
  327. /* first the basic parameters */
  328. s->dim=oggpack_read(opb,16);
  329. s->dec_buf=_ogg_malloc(sizeof(ogg_int32_t)*s->dim);
  330. if (s->dec_buf == NULL)
  331. goto _errout;
  332. s->entries=oggpack_read(opb,24);
  333. if(s->entries<=0)goto _eofout;
  334. if(s->dim<=0)goto _eofout;
  335. if(_ilog(s->dim)+_ilog(s->entries)>24)goto _eofout;
  336. if (s->dim > INT_MAX/s->entries) goto _eofout;
  337. /* codeword ordering.... length ordered or unordered? */
  338. switch((int)oggpack_read(opb,1)){
  339. case 0:
  340. /* unordered */
  341. lengthlist=(char *)alloca(sizeof(*lengthlist)*s->entries);
  342. if(!lengthlist) goto _eofout;
  343. /* allocated but unused entries? */
  344. if(oggpack_read(opb,1)){
  345. /* yes, unused entries */
  346. for(i=0;i<s->entries;i++){
  347. if(oggpack_read(opb,1)){
  348. long num=oggpack_read(opb,5);
  349. if(num==-1)goto _eofout;
  350. lengthlist[i]=(char)(num+1);
  351. s->used_entries++;
  352. if(num+1>s->dec_maxlength)s->dec_maxlength=num+1;
  353. }else
  354. lengthlist[i]=0;
  355. }
  356. }else{
  357. /* all entries used; no tagging */
  358. s->used_entries=s->entries;
  359. for(i=0;i<s->entries;i++){
  360. long num=oggpack_read(opb,5);
  361. if(num==-1)goto _eofout;
  362. lengthlist[i]=(char)(num+1);
  363. if(num+1>s->dec_maxlength)s->dec_maxlength=num+1;
  364. }
  365. }
  366. break;
  367. case 1:
  368. /* ordered */
  369. {
  370. long length=oggpack_read(opb,5)+1;
  371. s->used_entries=s->entries;
  372. lengthlist=(char *)alloca(sizeof(*lengthlist)*s->entries);
  373. if (!lengthlist) goto _eofout;
  374. for(i=0;i<s->entries;){
  375. long num=oggpack_read(opb,_ilog(s->entries-i));
  376. if(num<0)goto _eofout;
  377. for(j=0;j<num && i<s->entries;j++,i++)
  378. lengthlist[i]=(char)length;
  379. s->dec_maxlength=length;
  380. length++;
  381. }
  382. }
  383. break;
  384. default:
  385. /* EOF */
  386. goto _eofout;
  387. }
  388. /* Do we have a mapping to unpack? */
  389. if((maptype=oggpack_read(opb,4))>0){
  390. s->q_min=_float32_unpack(oggpack_read(opb,32),&s->q_minp);
  391. s->q_del=_float32_unpack(oggpack_read(opb,32),&s->q_delp);
  392. s->q_bits=oggpack_read(opb,4)+1;
  393. s->q_seq=oggpack_read(opb,1);
  394. s->q_del>>=s->q_bits;
  395. s->q_delp+=s->q_bits;
  396. }
  397. switch(maptype){
  398. case 0:
  399. /* no mapping; decode type 0 */
  400. /* how many bytes for the indexing? */
  401. /* this is the correct boundary here; we lose one bit to
  402. node/leaf mark */
  403. s->dec_nodeb=_determine_node_bytes(s->used_entries,_ilog(s->entries)/8+1);
  404. s->dec_leafw=_determine_leaf_words(s->dec_nodeb,_ilog(s->entries)/8+1);
  405. s->dec_type=0;
  406. if(_make_decode_table(s,lengthlist,quantvals,opb,maptype)) goto _errout;
  407. break;
  408. case 1:
  409. /* mapping type 1; implicit values by lattice position */
  410. quantvals=_book_maptype1_quantvals(s);
  411. /* dec_type choices here are 1,2; 3 doesn't make sense */
  412. {
  413. /* packed values */
  414. long total1=(s->q_bits*s->dim+8)/8; /* remember flag bit */
  415. if (s->dim > (INT_MAX-8)/s->q_bits) goto _eofout;
  416. /* vector of column offsets; remember flag bit */
  417. long total2=(_ilog(quantvals-1)*s->dim+8)/8+(s->q_bits+7)/8;
  418. if(total1<=4 && total1<=total2){
  419. /* use dec_type 1: vector of packed values */
  420. /* need quantized values before */
  421. s->q_val=alloca(sizeof(ogg_uint16_t)*quantvals);
  422. if (!s->q_val) goto _eofout;
  423. for(i=0;i<quantvals;i++)
  424. ((ogg_uint16_t *)s->q_val)[i]=(ogg_uint16_t)oggpack_read(opb,s->q_bits);
  425. if(oggpack_eop(opb)){
  426. s->q_val=0; /* cleanup must not free alloca memory */
  427. goto _eofout;
  428. }
  429. s->dec_type=1;
  430. s->dec_nodeb=_determine_node_bytes(s->used_entries,
  431. (s->q_bits*s->dim+8)/8);
  432. s->dec_leafw=_determine_leaf_words(s->dec_nodeb,
  433. (s->q_bits*s->dim+8)/8);
  434. if(_make_decode_table(s,lengthlist,quantvals,opb,maptype)){
  435. s->q_val=0; /* cleanup must not free alloca memory */
  436. goto _errout;
  437. }
  438. s->q_val=0; /* about to go out of scope; _make_decode_table
  439. was using it */
  440. }else{
  441. /* use dec_type 2: packed vector of column offsets */
  442. /* need quantized values before */
  443. if(s->q_bits<=8){
  444. s->q_val=_ogg_malloc(quantvals);
  445. if (!s->q_val) goto _eofout;
  446. for(i=0;i<quantvals;i++)
  447. ((unsigned char *)s->q_val)[i]=(unsigned char)oggpack_read(opb,s->q_bits);
  448. }else{
  449. s->q_val=_ogg_malloc(quantvals*2);
  450. if (!s->q_val) goto _eofout;
  451. for(i=0;i<quantvals;i++)
  452. ((ogg_uint16_t *)s->q_val)[i]=(ogg_uint16_t)oggpack_read(opb,s->q_bits);
  453. }
  454. if(oggpack_eop(opb))goto _eofout;
  455. s->q_pack=_ilog(quantvals-1);
  456. s->dec_type=2;
  457. s->dec_nodeb=_determine_node_bytes(s->used_entries,
  458. (_ilog(quantvals-1)*s->dim+8)/8);
  459. s->dec_leafw=_determine_leaf_words(s->dec_nodeb,
  460. (_ilog(quantvals-1)*s->dim+8)/8);
  461. if(_make_decode_table(s,lengthlist,quantvals,opb,maptype))goto _errout;
  462. }
  463. }
  464. break;
  465. case 2:
  466. /* mapping type 2; explicit array of values */
  467. quantvals=s->entries*s->dim;
  468. /* dec_type choices here are 1,3; 2 is not possible */
  469. if( (s->q_bits*s->dim+8)/8 <=4){ /* remember flag bit */
  470. /* use dec_type 1: vector of packed values */
  471. s->dec_type=1;
  472. s->dec_nodeb=_determine_node_bytes(s->used_entries,(s->q_bits*s->dim+8)/8);
  473. s->dec_leafw=_determine_leaf_words(s->dec_nodeb,(s->q_bits*s->dim+8)/8);
  474. if(_make_decode_table(s,lengthlist,quantvals,opb,maptype))goto _errout;
  475. }else{
  476. /* use dec_type 3: scalar offset into packed value array */
  477. s->dec_type=3;
  478. s->dec_nodeb=_determine_node_bytes(s->used_entries,_ilog(s->used_entries-1)/8+1);
  479. s->dec_leafw=_determine_leaf_words(s->dec_nodeb,_ilog(s->used_entries-1)/8+1);
  480. if(_make_decode_table(s,lengthlist,quantvals,opb,maptype))goto _errout;
  481. /* get the vals & pack them */
  482. s->q_pack=(s->q_bits+7)/8*s->dim;
  483. s->q_val=_ogg_malloc(s->q_pack*s->used_entries);
  484. if(s->q_bits<=8){
  485. for(i=0;i<s->used_entries*s->dim;i++)
  486. ((unsigned char *)(s->q_val))[i]=(unsigned char)oggpack_read(opb,s->q_bits);
  487. }else{
  488. for(i=0;i<s->used_entries*s->dim;i++)
  489. ((ogg_uint16_t *)(s->q_val))[i]=(ogg_uint16_t)oggpack_read(opb,s->q_bits);
  490. }
  491. }
  492. break;
  493. default:
  494. goto _errout;
  495. }
  496. if (s->dec_nodeb==1)
  497. if (s->dec_leafw == 1)
  498. s->dec_method = 0;
  499. else
  500. s->dec_method = 1;
  501. else if (s->dec_nodeb==2)
  502. if (s->dec_leafw == 1)
  503. s->dec_method = 2;
  504. else
  505. s->dec_method = 3;
  506. else
  507. s->dec_method = 4;
  508. if(oggpack_eop(opb))goto _eofout;
  509. return 0;
  510. _errout:
  511. _eofout:
  512. vorbis_book_clear(s);
  513. return -1;
  514. }
  515. #ifndef ONLY_C
  516. ogg_uint32_t decode_packed_entry_number(codebook *book,
  517. oggpack_buffer *b);
  518. #else
  519. static inline ogg_uint32_t decode_packed_entry_number(codebook *book,
  520. oggpack_buffer *b){
  521. ogg_uint32_t chase=0;
  522. int read=book->dec_maxlength;
  523. long lok = oggpack_look(b,read),i;
  524. while(lok<0 && read>1)
  525. lok = oggpack_look(b, --read);
  526. if(lok<0){
  527. oggpack_adv(b,1); /* force eop */
  528. return -1;
  529. }
  530. /* chase the tree with the bits we got */
  531. switch (book->dec_method)
  532. {
  533. case 0:
  534. {
  535. /* book->dec_nodeb==1, book->dec_leafw==1 */
  536. /* 8/8 - Used */
  537. unsigned char *t=(unsigned char *)book->dec_table;
  538. for(i=0;i<read;i++){
  539. chase=t[chase*2+((lok>>i)&1)];
  540. if(chase&0x80UL)break;
  541. }
  542. chase&=0x7fUL;
  543. break;
  544. }
  545. case 1:
  546. {
  547. /* book->dec_nodeb==1, book->dec_leafw!=1 */
  548. /* 8/16 - Used by infile2 */
  549. unsigned char *t=(unsigned char *)book->dec_table;
  550. for(i=0;i<read;i++){
  551. int bit=(lok>>i)&1;
  552. int next=t[chase+bit];
  553. if(next&0x80){
  554. chase= (next<<8) | t[chase+bit+1+(!bit || t[chase]&0x80)];
  555. break;
  556. }
  557. chase=next;
  558. }
  559. //chase&=0x7fffUL;
  560. chase&=~0x8000UL;
  561. break;
  562. }
  563. case 2:
  564. {
  565. /* book->dec_nodeb==2, book->dec_leafw==1 */
  566. /* 16/16 - Used */
  567. for(i=0;i<read;i++){
  568. chase=((ogg_uint16_t *)(book->dec_table))[chase*2+((lok>>i)&1)];
  569. if(chase&0x8000UL)break;
  570. }
  571. //chase&=0x7fffUL;
  572. chase&=~0x8000UL;
  573. break;
  574. }
  575. case 3:
  576. {
  577. /* book->dec_nodeb==2, book->dec_leafw!=1 */
  578. /* 16/32 - Used by infile2 */
  579. ogg_uint16_t *t=(ogg_uint16_t *)book->dec_table;
  580. for(i=0;i<read;i++){
  581. int bit=(lok>>i)&1;
  582. int next=t[chase+bit];
  583. if(next&0x8000){
  584. chase= (next<<16) | t[chase+bit+1+(!bit || t[chase]&0x8000)];
  585. break;
  586. }
  587. chase=next;
  588. }
  589. //chase&=0x7fffffffUL;
  590. chase&=~0x80000000UL;
  591. break;
  592. }
  593. case 4:
  594. {
  595. //Output("32/32");
  596. for(i=0;i<read;i++){
  597. chase=((ogg_uint32_t *)(book->dec_table))[chase*2+((lok>>i)&1)];
  598. if(chase&0x80000000UL)break;
  599. }
  600. //chase&=0x7fffffffUL;
  601. chase&=~0x80000000UL;
  602. break;
  603. }
  604. }
  605. if(i<read){
  606. oggpack_adv(b,i+1);
  607. return chase;
  608. }
  609. oggpack_adv(b,read+1);
  610. return(-1);
  611. }
  612. #endif
  613. /* returns the [original, not compacted] entry number or -1 on eof *********/
  614. long vorbis_book_decode(codebook *book, oggpack_buffer *b){
  615. if(book->dec_type)return -1;
  616. return decode_packed_entry_number(book,b);
  617. }
  618. #ifndef ONLY_C
  619. int decode_map(codebook *s, oggpack_buffer *b, ogg_int32_t *v, int point);
  620. #else
  621. static int decode_map(codebook *s, oggpack_buffer *b, ogg_int32_t *v, int point){
  622. ogg_uint32_t entry = decode_packed_entry_number(s,b);
  623. int i;
  624. if(oggpack_eop(b))return(-1);
  625. /* 1 used by test file 0 */
  626. /* according to decode type */
  627. switch(s->dec_type){
  628. case 1:{
  629. /* packed vector of values */
  630. int mask=(1<<s->q_bits)-1;
  631. for(i=0;i<s->dim;i++){
  632. v[i]=entry&mask;
  633. entry>>=s->q_bits;
  634. }
  635. break;
  636. }
  637. case 2:{
  638. /* packed vector of column offsets */
  639. int mask=(1<<s->q_pack)-1;
  640. for(i=0;i<s->dim;i++){
  641. if(s->q_bits<=8)
  642. v[i]=((unsigned char *)(s->q_val))[entry&mask];
  643. else
  644. v[i]=((ogg_uint16_t *)(s->q_val))[entry&mask];
  645. entry>>=s->q_pack;
  646. }
  647. break;
  648. }
  649. case 3:{
  650. /* offset into array */
  651. void *ptr=s->q_val+entry*s->q_pack;
  652. if(s->q_bits<=8){
  653. for(i=0;i<s->dim;i++)
  654. v[i]=((unsigned char *)ptr)[i];
  655. }else{
  656. for(i=0;i<s->dim;i++)
  657. v[i]=((ogg_uint16_t *)ptr)[i];
  658. }
  659. break;
  660. }
  661. default:
  662. return -1;
  663. }
  664. /* we have the unpacked multiplicands; compute final vals */
  665. {
  666. int shiftM = point-s->q_delp;
  667. ogg_int32_t add = point-s->q_minp;
  668. int mul = s->q_del;
  669. if(add>0)
  670. add= s->q_min >> add;
  671. else
  672. add= s->q_min << -add;
  673. if (shiftM<0)
  674. {
  675. mul <<= -shiftM;
  676. shiftM = 0;
  677. }
  678. add <<= shiftM;
  679. for(i=0;i<s->dim;i++)
  680. v[i]= ((add + v[i] * mul) >> shiftM);
  681. if(s->q_seq)
  682. for(i=1;i<s->dim;i++)
  683. v[i]+=v[i-1];
  684. }
  685. return 0;
  686. }
  687. #endif
  688. /* returns 0 on OK or -1 on eof *************************************/
  689. long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a,
  690. oggpack_buffer *b,int n,int point){
  691. if(book->used_entries>0){
  692. int step=n/book->dim;
  693. ogg_int32_t *v = book->dec_buf;//(ogg_int32_t *)alloca(sizeof(*v)*book->dim);
  694. int i,j,o;
  695. if (!v) return -1;
  696. for (j=0;j<step;j++){
  697. if(decode_map(book,b,v,point))return -1;
  698. for(i=0,o=j;i<book->dim;i++,o+=step)
  699. a[o]+=v[i];
  700. }
  701. }
  702. return 0;
  703. }
  704. long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a,
  705. oggpack_buffer *b,int n,int point){
  706. if(book->used_entries>0){
  707. ogg_int32_t *v = book->dec_buf;//(ogg_int32_t *)alloca(sizeof(*v)*book->dim);
  708. int i,j;
  709. if (!v) return -1;
  710. for(i=0;i<n;){
  711. if(decode_map(book,b,v,point))return -1;
  712. for (j=0;j<book->dim;j++)
  713. a[i++]+=v[j];
  714. }
  715. }
  716. return 0;
  717. }
  718. long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
  719. oggpack_buffer *b,int n,int point){
  720. if(book->used_entries>0){
  721. ogg_int32_t *v = book->dec_buf;//(ogg_int32_t *)alloca(sizeof(*v)*book->dim);
  722. int i,j;
  723. if (!v) return -1;
  724. for(i=0;i<n;){
  725. if(decode_map(book,b,v,point))return -1;
  726. for (j=0;j<book->dim;j++)
  727. a[i++]=v[j];
  728. }
  729. }else{
  730. int i,j;
  731. for(i=0;i<n;){
  732. for (j=0;j<book->dim;j++)
  733. a[i++]=0;
  734. }
  735. }
  736. return 0;
  737. }
  738. #ifndef ONLY_C
  739. long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,
  740. long offset,int ch,
  741. oggpack_buffer *b,int n,int point);
  742. #else
  743. long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,
  744. long offset,int ch,
  745. oggpack_buffer *b,int n,int point){
  746. if(book->used_entries>0){
  747. ogg_int32_t *v = book->dec_buf;//(ogg_int32_t *)alloca(sizeof(*v)*book->dim);
  748. long i,j;
  749. int chptr=0;
  750. if (!v) return -1;
  751. for(i=offset;i<offset+n;){
  752. if(decode_map(book,b,v,point))return -1;
  753. for (j=0;j<book->dim;j++){
  754. a[chptr++][i]+=v[j];
  755. if(chptr==ch){
  756. chptr=0;
  757. i++;
  758. }
  759. }
  760. }
  761. }
  762. return 0;
  763. }
  764. #endif