1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/libtremor/lib/tremor_floor1.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,461 @@ 1.4 +/******************************************************************** 1.5 + * * 1.6 + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * 1.7 + * * 1.8 + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 1.9 + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 1.10 + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 1.11 + * * 1.12 + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * 1.13 + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * 1.14 + * * 1.15 + ******************************************************************** 1.16 + 1.17 + function: floor backend 1 implementation 1.18 + 1.19 + ********************************************************************/ 1.20 + 1.21 +#include <stdlib.h> 1.22 +#include <string.h> 1.23 +#include <math.h> 1.24 +#include <ogg/ogg.h> 1.25 +#include "ivorbiscodec.h" 1.26 +#include "codec_internal.h" 1.27 +#include "registry.h" 1.28 +#include "codebook.h" 1.29 +#include "misc.h" 1.30 +#include "block.h" 1.31 + 1.32 +#define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */ 1.33 + 1.34 +typedef struct { 1.35 + int forward_index[VIF_POSIT+2]; 1.36 + 1.37 + int hineighbor[VIF_POSIT]; 1.38 + int loneighbor[VIF_POSIT]; 1.39 + int posts; 1.40 + 1.41 + int n; 1.42 + int quant_q; 1.43 + vorbis_info_floor1 *vi; 1.44 + 1.45 +} vorbis_look_floor1; 1.46 + 1.47 +/***********************************************/ 1.48 + 1.49 +static void floor1_free_info(vorbis_info_floor *i){ 1.50 + vorbis_info_floor1 *info=(vorbis_info_floor1 *)i; 1.51 + if(info){ 1.52 + memset(info,0,sizeof(*info)); 1.53 + _ogg_free(info); 1.54 + } 1.55 +} 1.56 + 1.57 +static void floor1_free_look(vorbis_look_floor *i){ 1.58 + vorbis_look_floor1 *look=(vorbis_look_floor1 *)i; 1.59 + if(look){ 1.60 + memset(look,0,sizeof(*look)); 1.61 + _ogg_free(look); 1.62 + } 1.63 +} 1.64 + 1.65 +static int ilog(unsigned int v){ 1.66 + int ret=0; 1.67 + while(v){ 1.68 + ret++; 1.69 + v>>=1; 1.70 + } 1.71 + return(ret); 1.72 +} 1.73 + 1.74 +static int icomp(const void *a,const void *b){ 1.75 + return(**(int **)a-**(int **)b); 1.76 +} 1.77 + 1.78 +static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){ 1.79 + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; 1.80 + int j,k,count=0,maxclass=-1,rangebits; 1.81 + 1.82 + vorbis_info_floor1 *info=(vorbis_info_floor1 *)_ogg_calloc(1,sizeof(*info)); 1.83 + /* read partitions */ 1.84 + info->partitions=oggpack_read(opb,5); /* only 0 to 31 legal */ 1.85 + for(j=0;j<info->partitions;j++){ 1.86 + info->partitionclass[j]=oggpack_read(opb,4); /* only 0 to 15 legal */ 1.87 + if(info->partitionclass[j]<0)goto err_out; 1.88 + if(maxclass<info->partitionclass[j])maxclass=info->partitionclass[j]; 1.89 + } 1.90 + 1.91 + /* read partition classes */ 1.92 + for(j=0;j<maxclass+1;j++){ 1.93 + info->class_dim[j]=oggpack_read(opb,3)+1; /* 1 to 8 */ 1.94 + info->class_subs[j]=oggpack_read(opb,2); /* 0,1,2,3 bits */ 1.95 + if(info->class_subs[j]<0) 1.96 + goto err_out; 1.97 + if(info->class_subs[j])info->class_book[j]=oggpack_read(opb,8); 1.98 + if(info->class_book[j]<0 || info->class_book[j]>=ci->books) 1.99 + goto err_out; 1.100 + for(k=0;k<(1<<info->class_subs[j]);k++){ 1.101 + info->class_subbook[j][k]=oggpack_read(opb,8)-1; 1.102 + if(info->class_subbook[j][k]<-1 || info->class_subbook[j][k]>=ci->books) 1.103 + goto err_out; 1.104 + } 1.105 + } 1.106 + 1.107 + /* read the post list */ 1.108 + info->mult=oggpack_read(opb,2)+1; /* only 1,2,3,4 legal now */ 1.109 + rangebits=oggpack_read(opb,4); 1.110 + if(rangebits<0)goto err_out; 1.111 + 1.112 + for(j=0,k=0;j<info->partitions;j++){ 1.113 + count+=info->class_dim[info->partitionclass[j]]; 1.114 + if(count>VIF_POSIT)goto err_out; 1.115 + for(;k<count;k++){ 1.116 + int t=info->postlist[k+2]=oggpack_read(opb,rangebits); 1.117 + if(t<0 || t>=(1<<rangebits)) 1.118 + goto err_out; 1.119 + } 1.120 + } 1.121 + info->postlist[0]=0; 1.122 + info->postlist[1]=1<<rangebits; 1.123 + 1.124 + /* don't allow repeated values in post list as they'd result in 1.125 + zero-length segments */ 1.126 + { 1.127 + int *sortpointer[VIF_POSIT+2]; 1.128 + for(j=0;j<count+2;j++)sortpointer[j]=info->postlist+j; 1.129 + qsort(sortpointer,count+2,sizeof(*sortpointer),icomp); 1.130 + 1.131 + for(j=1;j<count+2;j++) 1.132 + if(*sortpointer[j-1]==*sortpointer[j])goto err_out; 1.133 + } 1.134 + 1.135 + return(info); 1.136 + 1.137 + err_out: 1.138 + floor1_free_info(info); 1.139 + return(NULL); 1.140 +} 1.141 + 1.142 +static vorbis_look_floor *floor1_look(vorbis_dsp_state *vd,vorbis_info_mode *mi, 1.143 + vorbis_info_floor *in){ 1.144 + 1.145 + int *sortpointer[VIF_POSIT+2]; 1.146 + vorbis_info_floor1 *info=(vorbis_info_floor1 *)in; 1.147 + vorbis_look_floor1 *look=(vorbis_look_floor1 *)_ogg_calloc(1,sizeof(*look)); 1.148 + int i,j,n=0; 1.149 + 1.150 + look->vi=info; 1.151 + look->n=info->postlist[1]; 1.152 + 1.153 + /* we drop each position value in-between already decoded values, 1.154 + and use linear interpolation to predict each new value past the 1.155 + edges. The positions are read in the order of the position 1.156 + list... we precompute the bounding positions in the lookup. Of 1.157 + course, the neighbors can change (if a position is declined), but 1.158 + this is an initial mapping */ 1.159 + 1.160 + for(i=0;i<info->partitions;i++)n+=info->class_dim[info->partitionclass[i]]; 1.161 + n+=2; 1.162 + look->posts=n; 1.163 + 1.164 + /* also store a sorted position index */ 1.165 + for(i=0;i<n;i++)sortpointer[i]=info->postlist+i; 1.166 + qsort(sortpointer,n,sizeof(*sortpointer),icomp); 1.167 + 1.168 + /* points from sort order back to range number */ 1.169 + for(i=0;i<n;i++)look->forward_index[i]=sortpointer[i]-info->postlist; 1.170 + 1.171 + /* quantize values to multiplier spec */ 1.172 + switch(info->mult){ 1.173 + case 1: /* 1024 -> 256 */ 1.174 + look->quant_q=256; 1.175 + break; 1.176 + case 2: /* 1024 -> 128 */ 1.177 + look->quant_q=128; 1.178 + break; 1.179 + case 3: /* 1024 -> 86 */ 1.180 + look->quant_q=86; 1.181 + break; 1.182 + case 4: /* 1024 -> 64 */ 1.183 + look->quant_q=64; 1.184 + break; 1.185 + } 1.186 + 1.187 + /* discover our neighbors for decode where we don't use fit flags 1.188 + (that would push the neighbors outward) */ 1.189 + for(i=0;i<n-2;i++){ 1.190 + int lo=0; 1.191 + int hi=1; 1.192 + int lx=0; 1.193 + int hx=look->n; 1.194 + int currentx=info->postlist[i+2]; 1.195 + for(j=0;j<i+2;j++){ 1.196 + int x=info->postlist[j]; 1.197 + if(x>lx && x<currentx){ 1.198 + lo=j; 1.199 + lx=x; 1.200 + } 1.201 + if(x<hx && x>currentx){ 1.202 + hi=j; 1.203 + hx=x; 1.204 + } 1.205 + } 1.206 + look->loneighbor[i]=lo; 1.207 + look->hineighbor[i]=hi; 1.208 + } 1.209 + 1.210 + return(look); 1.211 +} 1.212 + 1.213 +static int render_point(int x0,int x1,int y0,int y1,int x){ 1.214 + y0&=0x7fff; /* mask off flag */ 1.215 + y1&=0x7fff; 1.216 + 1.217 + { 1.218 + int dy=y1-y0; 1.219 + int adx=x1-x0; 1.220 + int ady=abs(dy); 1.221 + int err=ady*(x-x0); 1.222 + 1.223 + int off=err/adx; 1.224 + if(dy<0)return(y0-off); 1.225 + return(y0+off); 1.226 + } 1.227 +} 1.228 + 1.229 +#ifdef _LOW_ACCURACY_ 1.230 +# define XdB(n) ((((n)>>8)+1)>>1) 1.231 +#else 1.232 +# define XdB(n) (n) 1.233 +#endif 1.234 + 1.235 +static const ogg_int32_t FLOOR_fromdB_LOOKUP[256]={ 1.236 + XdB(0x000000e5), XdB(0x000000f4), XdB(0x00000103), XdB(0x00000114), 1.237 + XdB(0x00000126), XdB(0x00000139), XdB(0x0000014e), XdB(0x00000163), 1.238 + XdB(0x0000017a), XdB(0x00000193), XdB(0x000001ad), XdB(0x000001c9), 1.239 + XdB(0x000001e7), XdB(0x00000206), XdB(0x00000228), XdB(0x0000024c), 1.240 + XdB(0x00000272), XdB(0x0000029b), XdB(0x000002c6), XdB(0x000002f4), 1.241 + XdB(0x00000326), XdB(0x0000035a), XdB(0x00000392), XdB(0x000003cd), 1.242 + XdB(0x0000040c), XdB(0x00000450), XdB(0x00000497), XdB(0x000004e4), 1.243 + XdB(0x00000535), XdB(0x0000058c), XdB(0x000005e8), XdB(0x0000064a), 1.244 + XdB(0x000006b3), XdB(0x00000722), XdB(0x00000799), XdB(0x00000818), 1.245 + XdB(0x0000089e), XdB(0x0000092e), XdB(0x000009c6), XdB(0x00000a69), 1.246 + XdB(0x00000b16), XdB(0x00000bcf), XdB(0x00000c93), XdB(0x00000d64), 1.247 + XdB(0x00000e43), XdB(0x00000f30), XdB(0x0000102d), XdB(0x0000113a), 1.248 + XdB(0x00001258), XdB(0x0000138a), XdB(0x000014cf), XdB(0x00001629), 1.249 + XdB(0x0000179a), XdB(0x00001922), XdB(0x00001ac4), XdB(0x00001c82), 1.250 + XdB(0x00001e5c), XdB(0x00002055), XdB(0x0000226f), XdB(0x000024ac), 1.251 + XdB(0x0000270e), XdB(0x00002997), XdB(0x00002c4b), XdB(0x00002f2c), 1.252 + XdB(0x0000323d), XdB(0x00003581), XdB(0x000038fb), XdB(0x00003caf), 1.253 + XdB(0x000040a0), XdB(0x000044d3), XdB(0x0000494c), XdB(0x00004e10), 1.254 + XdB(0x00005323), XdB(0x0000588a), XdB(0x00005e4b), XdB(0x0000646b), 1.255 + XdB(0x00006af2), XdB(0x000071e5), XdB(0x0000794c), XdB(0x0000812e), 1.256 + XdB(0x00008993), XdB(0x00009283), XdB(0x00009c09), XdB(0x0000a62d), 1.257 + XdB(0x0000b0f9), XdB(0x0000bc79), XdB(0x0000c8b9), XdB(0x0000d5c4), 1.258 + XdB(0x0000e3a9), XdB(0x0000f274), XdB(0x00010235), XdB(0x000112fd), 1.259 + XdB(0x000124dc), XdB(0x000137e4), XdB(0x00014c29), XdB(0x000161bf), 1.260 + XdB(0x000178bc), XdB(0x00019137), XdB(0x0001ab4a), XdB(0x0001c70e), 1.261 + XdB(0x0001e4a1), XdB(0x0002041f), XdB(0x000225aa), XdB(0x00024962), 1.262 + XdB(0x00026f6d), XdB(0x000297f0), XdB(0x0002c316), XdB(0x0002f109), 1.263 + XdB(0x000321f9), XdB(0x00035616), XdB(0x00038d97), XdB(0x0003c8b4), 1.264 + XdB(0x000407a7), XdB(0x00044ab2), XdB(0x00049218), XdB(0x0004de23), 1.265 + XdB(0x00052f1e), XdB(0x0005855c), XdB(0x0005e135), XdB(0x00064306), 1.266 + XdB(0x0006ab33), XdB(0x00071a24), XdB(0x0007904b), XdB(0x00080e20), 1.267 + XdB(0x00089422), XdB(0x000922da), XdB(0x0009bad8), XdB(0x000a5cb6), 1.268 + XdB(0x000b091a), XdB(0x000bc0b1), XdB(0x000c8436), XdB(0x000d5471), 1.269 + XdB(0x000e3233), XdB(0x000f1e5f), XdB(0x001019e4), XdB(0x001125c1), 1.270 + XdB(0x00124306), XdB(0x001372d5), XdB(0x0014b663), XdB(0x00160ef7), 1.271 + XdB(0x00177df0), XdB(0x001904c1), XdB(0x001aa4f9), XdB(0x001c603d), 1.272 + XdB(0x001e384f), XdB(0x00202f0f), XdB(0x0022467a), XdB(0x002480b1), 1.273 + XdB(0x0026dff7), XdB(0x002966b3), XdB(0x002c1776), XdB(0x002ef4fc), 1.274 + XdB(0x0032022d), XdB(0x00354222), XdB(0x0038b828), XdB(0x003c67c2), 1.275 + XdB(0x004054ae), XdB(0x004482e8), XdB(0x0048f6af), XdB(0x004db488), 1.276 + XdB(0x0052c142), XdB(0x005821ff), XdB(0x005ddc33), XdB(0x0063f5b0), 1.277 + XdB(0x006a74a7), XdB(0x00715faf), XdB(0x0078bdce), XdB(0x0080967f), 1.278 + XdB(0x0088f1ba), XdB(0x0091d7f9), XdB(0x009b5247), XdB(0x00a56a41), 1.279 + XdB(0x00b02a27), XdB(0x00bb9ce2), XdB(0x00c7ce12), XdB(0x00d4ca17), 1.280 + XdB(0x00e29e20), XdB(0x00f15835), XdB(0x0101074b), XdB(0x0111bb4e), 1.281 + XdB(0x01238531), XdB(0x01367704), XdB(0x014aa402), XdB(0x016020a7), 1.282 + XdB(0x017702c3), XdB(0x018f6190), XdB(0x01a955cb), XdB(0x01c4f9cf), 1.283 + XdB(0x01e269a8), XdB(0x0201c33b), XdB(0x0223265a), XdB(0x0246b4ea), 1.284 + XdB(0x026c9302), XdB(0x0294e716), XdB(0x02bfda13), XdB(0x02ed9793), 1.285 + XdB(0x031e4e09), XdB(0x03522ee4), XdB(0x03896ed0), XdB(0x03c445e2), 1.286 + XdB(0x0402efd6), XdB(0x0445ac4b), XdB(0x048cbefc), XdB(0x04d87013), 1.287 + XdB(0x05290c67), XdB(0x057ee5ca), XdB(0x05da5364), XdB(0x063bb204), 1.288 + XdB(0x06a36485), XdB(0x0711d42b), XdB(0x0787710e), XdB(0x0804b299), 1.289 + XdB(0x088a17ef), XdB(0x0918287e), XdB(0x09af747c), XdB(0x0a50957e), 1.290 + XdB(0x0afc2f19), XdB(0x0bb2ef7f), XdB(0x0c759034), XdB(0x0d44d6ca), 1.291 + XdB(0x0e2195bc), XdB(0x0f0cad0d), XdB(0x10070b62), XdB(0x1111aeea), 1.292 + XdB(0x122da66c), XdB(0x135c120f), XdB(0x149e24d9), XdB(0x15f525b1), 1.293 + XdB(0x176270e3), XdB(0x18e7794b), XdB(0x1a85c9ae), XdB(0x1c3f06d1), 1.294 + XdB(0x1e14f07d), XdB(0x200963d7), XdB(0x221e5ccd), XdB(0x2455f870), 1.295 + XdB(0x26b2770b), XdB(0x29363e2b), XdB(0x2be3db5c), XdB(0x2ebe06b6), 1.296 + XdB(0x31c7a55b), XdB(0x3503ccd4), XdB(0x3875c5aa), XdB(0x3c210f44), 1.297 + XdB(0x4009632b), XdB(0x4432b8cf), XdB(0x48a149bc), XdB(0x4d59959e), 1.298 + XdB(0x52606733), XdB(0x57bad899), XdB(0x5d6e593a), XdB(0x6380b298), 1.299 + XdB(0x69f80e9a), XdB(0x70dafda8), XdB(0x78307d76), XdB(0x7fffffff), 1.300 +}; 1.301 + 1.302 +static void render_line(int n, int x0,int x1,int y0,int y1,ogg_int32_t *d){ 1.303 + int dy=y1-y0; 1.304 + int adx=x1-x0; 1.305 + int ady=abs(dy); 1.306 + int base=dy/adx; 1.307 + int sy=(dy<0?base-1:base+1); 1.308 + int x=x0; 1.309 + int y=y0; 1.310 + int err=0; 1.311 + 1.312 + if(n>x1)n=x1; 1.313 + ady-=abs(base*adx); 1.314 + 1.315 + if(x<n) 1.316 + d[x]= MULT31_SHIFT15(d[x],FLOOR_fromdB_LOOKUP[y]); 1.317 + 1.318 + while(++x<n){ 1.319 + err=err+ady; 1.320 + if(err>=adx){ 1.321 + err-=adx; 1.322 + y+=sy; 1.323 + }else{ 1.324 + y+=base; 1.325 + } 1.326 + d[x]= MULT31_SHIFT15(d[x],FLOOR_fromdB_LOOKUP[y]); 1.327 + } 1.328 +} 1.329 + 1.330 +static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ 1.331 + vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; 1.332 + vorbis_info_floor1 *info=look->vi; 1.333 + codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; 1.334 + 1.335 + int i,j,k; 1.336 + codebook *books=ci->fullbooks; 1.337 + 1.338 + /* unpack wrapped/predicted values from stream */ 1.339 + if(oggpack_read(&vb->opb,1)==1){ 1.340 + int *fit_value=(int *)_vorbis_block_alloc(vb,(look->posts)*sizeof(*fit_value)); 1.341 + 1.342 + fit_value[0]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); 1.343 + fit_value[1]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); 1.344 + 1.345 + /* partition by partition */ 1.346 + /* partition by partition */ 1.347 + for(i=0,j=2;i<info->partitions;i++){ 1.348 + int classv=info->partitionclass[i]; 1.349 + int cdim=info->class_dim[classv]; 1.350 + int csubbits=info->class_subs[classv]; 1.351 + int csub=1<<csubbits; 1.352 + int cval=0; 1.353 + 1.354 + /* decode the partition's first stage cascade value */ 1.355 + if(csubbits){ 1.356 + cval=vorbis_book_decode(books+info->class_book[classv],&vb->opb); 1.357 + 1.358 + if(cval==-1)goto eop; 1.359 + } 1.360 + 1.361 + for(k=0;k<cdim;k++){ 1.362 + int book=info->class_subbook[classv][cval&(csub-1)]; 1.363 + cval>>=csubbits; 1.364 + if(book>=0){ 1.365 + if((fit_value[j+k]=vorbis_book_decode(books+book,&vb->opb))==-1) 1.366 + goto eop; 1.367 + }else{ 1.368 + fit_value[j+k]=0; 1.369 + } 1.370 + } 1.371 + j+=cdim; 1.372 + } 1.373 + 1.374 + /* unwrap positive values and reconsitute via linear interpolation */ 1.375 + for(i=2;i<look->posts;i++){ 1.376 + int predicted=render_point(info->postlist[look->loneighbor[i-2]], 1.377 + info->postlist[look->hineighbor[i-2]], 1.378 + fit_value[look->loneighbor[i-2]], 1.379 + fit_value[look->hineighbor[i-2]], 1.380 + info->postlist[i]); 1.381 + int hiroom=look->quant_q-predicted; 1.382 + int loroom=predicted; 1.383 + int room=(hiroom<loroom?hiroom:loroom)<<1; 1.384 + int val=fit_value[i]; 1.385 + 1.386 + if(val){ 1.387 + if(val>=room){ 1.388 + if(hiroom>loroom){ 1.389 + val = val-loroom; 1.390 + }else{ 1.391 + val = -1-(val-hiroom); 1.392 + } 1.393 + }else{ 1.394 + if(val&1){ 1.395 + val= -((val+1)>>1); 1.396 + }else{ 1.397 + val>>=1; 1.398 + } 1.399 + } 1.400 + 1.401 + fit_value[i]=(val+predicted)&0x7fff;; 1.402 + fit_value[look->loneighbor[i-2]]&=0x7fff; 1.403 + fit_value[look->hineighbor[i-2]]&=0x7fff; 1.404 + 1.405 + }else{ 1.406 + fit_value[i]=predicted|0x8000; 1.407 + } 1.408 + 1.409 + } 1.410 + 1.411 + return(fit_value); 1.412 + } 1.413 + eop: 1.414 + return(NULL); 1.415 +} 1.416 + 1.417 +static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, 1.418 + ogg_int32_t *out){ 1.419 + vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; 1.420 + vorbis_info_floor1 *info=look->vi; 1.421 + 1.422 + codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; 1.423 + int n=ci->blocksizes[vb->W]/2; 1.424 + int j; 1.425 + 1.426 + if(memo){ 1.427 + /* render the lines */ 1.428 + int *fit_value=(int *)memo; 1.429 + int hx=0; 1.430 + int lx=0; 1.431 + int ly=fit_value[0]*info->mult; 1.432 + /* guard lookup against out-of-rage values */ 1.433 + ly=(ly<0?0:ly>255?255:ly); 1.434 + 1.435 + for(j=1;j<look->posts;j++){ 1.436 + int current=look->forward_index[j]; 1.437 + int hy=fit_value[current]&0x7fff; 1.438 + if(hy==fit_value[current]){ 1.439 + 1.440 + hx=info->postlist[current]; 1.441 + hy*=info->mult; 1.442 + /* guard lookup against out-of-rage values */ 1.443 + hy=(hy<0?0:hy>255?255:hy); 1.444 + 1.445 + 1.446 + render_line(n,lx,hx,ly,hy,out); 1.447 + 1.448 + lx=hx; 1.449 + ly=hy; 1.450 + } 1.451 + } 1.452 + for(j=hx;j<n;j++)out[j]*=ly; /* be certain */ 1.453 + return(1); 1.454 + } 1.455 + memset(out,0,sizeof(*out)*n); 1.456 + return(0); 1.457 +} 1.458 + 1.459 +/* export hooks */ 1.460 +vorbis_func_floor floor1_exportbundle={ 1.461 + &floor1_unpack,&floor1_look,&floor1_free_info, 1.462 + &floor1_free_look,&floor1_inverse1,&floor1_inverse2 1.463 +}; 1.464 +