annotate tremor/floor1.c @ 24515:c5c0cb0e90d2

getch2: Fix incorrect test Keycode length wasn't checked in one case because of missing parentheses. This was accidentally broken in my previous commit to the file. Most likely the error had no practical effect; the length checks are unreliable in any case as they can be satisfied by unrelated data corresponding to other keypresses.
author uau
date Sat, 15 Sep 2007 18:13:56 +0000
parents 8631a3803289
children 8dfda4d651ec
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14280
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
1 /********************************************************************
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
2 * *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
3 * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
4 * *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
5 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
6 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
7 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
8 * *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
9 * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
10 * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
11 * *
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
12 ********************************************************************
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
13
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
14 function: floor backend 1 implementation
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
15
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
16 ********************************************************************/
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
17
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
18 #include <stdlib.h>
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
19 #include <string.h>
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
20 #include <math.h>
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
21 #include "ogg.h"
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
22 #include "ivorbiscodec.h"
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
23 #include "codec_internal.h"
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
24 #include "registry.h"
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
25 #include "codebook.h"
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
26 #include "misc.h"
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
27
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
28 #define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
29
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
30 typedef struct {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
31 int forward_index[VIF_POSIT+2];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
32
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
33 int hineighbor[VIF_POSIT];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
34 int loneighbor[VIF_POSIT];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
35 int posts;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
36
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
37 int n;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
38 int quant_q;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
39 vorbis_info_floor1 *vi;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
40
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
41 } vorbis_look_floor1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
42
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
43 /***********************************************/
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
44
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
45 static void floor1_free_info(vorbis_info_floor *i){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
46 vorbis_info_floor1 *info=(vorbis_info_floor1 *)i;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
47 if(info){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
48 memset(info,0,sizeof(*info));
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
49 _ogg_free(info);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
50 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
51 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
52
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
53 static void floor1_free_look(vorbis_look_floor *i){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
54 vorbis_look_floor1 *look=(vorbis_look_floor1 *)i;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
55 if(look){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
56 memset(look,0,sizeof(*look));
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
57 _ogg_free(look);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
58 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
59 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
60
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
61 static int ilog(unsigned int v){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
62 int ret=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
63 while(v){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
64 ret++;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
65 v>>=1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
66 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
67 return(ret);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
68 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
69
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
70 static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
71 codec_setup_info *ci=(codec_setup_info *)vi->codec_setup;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
72 int j,k,count=0,maxclass=-1,rangebits;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
73
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
74 vorbis_info_floor1 *info=(vorbis_info_floor1 *)_ogg_calloc(1,sizeof(*info));
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
75 /* read partitions */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
76 info->partitions=oggpack_read(opb,5); /* only 0 to 31 legal */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
77 for(j=0;j<info->partitions;j++){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
78 info->partitionclass[j]=oggpack_read(opb,4); /* only 0 to 15 legal */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
79 if(maxclass<info->partitionclass[j])maxclass=info->partitionclass[j];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
80 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
81
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
82 /* read partition classes */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
83 for(j=0;j<maxclass+1;j++){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
84 info->class_dim[j]=oggpack_read(opb,3)+1; /* 1 to 8 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
85 info->class_subs[j]=oggpack_read(opb,2); /* 0,1,2,3 bits */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
86 if(info->class_subs[j]<0)
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
87 goto err_out;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
88 if(info->class_subs[j])info->class_book[j]=oggpack_read(opb,8);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
89 if(info->class_book[j]<0 || info->class_book[j]>=ci->books)
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
90 goto err_out;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
91 for(k=0;k<(1<<info->class_subs[j]);k++){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
92 info->class_subbook[j][k]=oggpack_read(opb,8)-1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
93 if(info->class_subbook[j][k]<-1 || info->class_subbook[j][k]>=ci->books)
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
94 goto err_out;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
95 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
96 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
97
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
98 /* read the post list */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
99 info->mult=oggpack_read(opb,2)+1; /* only 1,2,3,4 legal now */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
100 rangebits=oggpack_read(opb,4);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
101
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
102 for(j=0,k=0;j<info->partitions;j++){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
103 count+=info->class_dim[info->partitionclass[j]];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
104 for(;k<count;k++){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
105 int t=info->postlist[k+2]=oggpack_read(opb,rangebits);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
106 if(t<0 || t>=(1<<rangebits))
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
107 goto err_out;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
108 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
109 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
110 info->postlist[0]=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
111 info->postlist[1]=1<<rangebits;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
112
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
113 return(info);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
114
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
115 err_out:
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
116 floor1_free_info(info);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
117 return(NULL);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
118 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
119
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
120 static int icomp(const void *a,const void *b){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
121 return(**(int **)a-**(int **)b);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
122 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
123
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
124 static vorbis_look_floor *floor1_look(vorbis_dsp_state *vd,vorbis_info_mode *mi,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
125 vorbis_info_floor *in){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
126
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
127 int *sortpointer[VIF_POSIT+2];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
128 vorbis_info_floor1 *info=(vorbis_info_floor1 *)in;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
129 vorbis_look_floor1 *look=(vorbis_look_floor1 *)_ogg_calloc(1,sizeof(*look));
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
130 int i,j,n=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
131
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
132 look->vi=info;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
133 look->n=info->postlist[1];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
134
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
135 /* we drop each position value in-between already decoded values,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
136 and use linear interpolation to predict each new value past the
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
137 edges. The positions are read in the order of the position
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
138 list... we precompute the bounding positions in the lookup. Of
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
139 course, the neighbors can change (if a position is declined), but
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
140 this is an initial mapping */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
141
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
142 for(i=0;i<info->partitions;i++)n+=info->class_dim[info->partitionclass[i]];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
143 n+=2;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
144 look->posts=n;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
145
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
146 /* also store a sorted position index */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
147 for(i=0;i<n;i++)sortpointer[i]=info->postlist+i;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
148 qsort(sortpointer,n,sizeof(*sortpointer),icomp);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
149
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
150 /* points from sort order back to range number */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
151 for(i=0;i<n;i++)look->forward_index[i]=sortpointer[i]-info->postlist;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
152
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
153 /* quantize values to multiplier spec */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
154 switch(info->mult){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
155 case 1: /* 1024 -> 256 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
156 look->quant_q=256;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
157 break;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
158 case 2: /* 1024 -> 128 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
159 look->quant_q=128;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
160 break;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
161 case 3: /* 1024 -> 86 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
162 look->quant_q=86;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
163 break;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
164 case 4: /* 1024 -> 64 */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
165 look->quant_q=64;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
166 break;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
167 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
168
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
169 /* discover our neighbors for decode where we don't use fit flags
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
170 (that would push the neighbors outward) */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
171 for(i=0;i<n-2;i++){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
172 int lo=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
173 int hi=1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
174 int lx=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
175 int hx=look->n;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
176 int currentx=info->postlist[i+2];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
177 for(j=0;j<i+2;j++){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
178 int x=info->postlist[j];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
179 if(x>lx && x<currentx){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
180 lo=j;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
181 lx=x;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
182 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
183 if(x<hx && x>currentx){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
184 hi=j;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
185 hx=x;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
186 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
187 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
188 look->loneighbor[i]=lo;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
189 look->hineighbor[i]=hi;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
190 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
191
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
192 return(look);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
193 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
194
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
195 static int render_point(int x0,int x1,int y0,int y1,int x){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
196 y0&=0x7fff; /* mask off flag */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
197 y1&=0x7fff;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
198
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
199 {
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
200 int dy=y1-y0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
201 int adx=x1-x0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
202 int ady=abs(dy);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
203 int err=ady*(x-x0);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
204
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
205 int off=err/adx;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
206 if(dy<0)return(y0-off);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
207 return(y0+off);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
208 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
209 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
210
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
211 #ifdef _LOW_ACCURACY_
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
212 # define XdB(n) ((((n)>>8)+1)>>1)
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
213 #else
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
214 # define XdB(n) (n)
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
215 #endif
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
216
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
217 static const ogg_int32_t FLOOR_fromdB_LOOKUP[256]={
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
218 XdB(0x000000e5), XdB(0x000000f4), XdB(0x00000103), XdB(0x00000114),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
219 XdB(0x00000126), XdB(0x00000139), XdB(0x0000014e), XdB(0x00000163),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
220 XdB(0x0000017a), XdB(0x00000193), XdB(0x000001ad), XdB(0x000001c9),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
221 XdB(0x000001e7), XdB(0x00000206), XdB(0x00000228), XdB(0x0000024c),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
222 XdB(0x00000272), XdB(0x0000029b), XdB(0x000002c6), XdB(0x000002f4),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
223 XdB(0x00000326), XdB(0x0000035a), XdB(0x00000392), XdB(0x000003cd),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
224 XdB(0x0000040c), XdB(0x00000450), XdB(0x00000497), XdB(0x000004e4),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
225 XdB(0x00000535), XdB(0x0000058c), XdB(0x000005e8), XdB(0x0000064a),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
226 XdB(0x000006b3), XdB(0x00000722), XdB(0x00000799), XdB(0x00000818),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
227 XdB(0x0000089e), XdB(0x0000092e), XdB(0x000009c6), XdB(0x00000a69),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
228 XdB(0x00000b16), XdB(0x00000bcf), XdB(0x00000c93), XdB(0x00000d64),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
229 XdB(0x00000e43), XdB(0x00000f30), XdB(0x0000102d), XdB(0x0000113a),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
230 XdB(0x00001258), XdB(0x0000138a), XdB(0x000014cf), XdB(0x00001629),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
231 XdB(0x0000179a), XdB(0x00001922), XdB(0x00001ac4), XdB(0x00001c82),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
232 XdB(0x00001e5c), XdB(0x00002055), XdB(0x0000226f), XdB(0x000024ac),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
233 XdB(0x0000270e), XdB(0x00002997), XdB(0x00002c4b), XdB(0x00002f2c),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
234 XdB(0x0000323d), XdB(0x00003581), XdB(0x000038fb), XdB(0x00003caf),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
235 XdB(0x000040a0), XdB(0x000044d3), XdB(0x0000494c), XdB(0x00004e10),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
236 XdB(0x00005323), XdB(0x0000588a), XdB(0x00005e4b), XdB(0x0000646b),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
237 XdB(0x00006af2), XdB(0x000071e5), XdB(0x0000794c), XdB(0x0000812e),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
238 XdB(0x00008993), XdB(0x00009283), XdB(0x00009c09), XdB(0x0000a62d),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
239 XdB(0x0000b0f9), XdB(0x0000bc79), XdB(0x0000c8b9), XdB(0x0000d5c4),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
240 XdB(0x0000e3a9), XdB(0x0000f274), XdB(0x00010235), XdB(0x000112fd),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
241 XdB(0x000124dc), XdB(0x000137e4), XdB(0x00014c29), XdB(0x000161bf),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
242 XdB(0x000178bc), XdB(0x00019137), XdB(0x0001ab4a), XdB(0x0001c70e),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
243 XdB(0x0001e4a1), XdB(0x0002041f), XdB(0x000225aa), XdB(0x00024962),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
244 XdB(0x00026f6d), XdB(0x000297f0), XdB(0x0002c316), XdB(0x0002f109),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
245 XdB(0x000321f9), XdB(0x00035616), XdB(0x00038d97), XdB(0x0003c8b4),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
246 XdB(0x000407a7), XdB(0x00044ab2), XdB(0x00049218), XdB(0x0004de23),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
247 XdB(0x00052f1e), XdB(0x0005855c), XdB(0x0005e135), XdB(0x00064306),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
248 XdB(0x0006ab33), XdB(0x00071a24), XdB(0x0007904b), XdB(0x00080e20),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
249 XdB(0x00089422), XdB(0x000922da), XdB(0x0009bad8), XdB(0x000a5cb6),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
250 XdB(0x000b091a), XdB(0x000bc0b1), XdB(0x000c8436), XdB(0x000d5471),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
251 XdB(0x000e3233), XdB(0x000f1e5f), XdB(0x001019e4), XdB(0x001125c1),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
252 XdB(0x00124306), XdB(0x001372d5), XdB(0x0014b663), XdB(0x00160ef7),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
253 XdB(0x00177df0), XdB(0x001904c1), XdB(0x001aa4f9), XdB(0x001c603d),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
254 XdB(0x001e384f), XdB(0x00202f0f), XdB(0x0022467a), XdB(0x002480b1),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
255 XdB(0x0026dff7), XdB(0x002966b3), XdB(0x002c1776), XdB(0x002ef4fc),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
256 XdB(0x0032022d), XdB(0x00354222), XdB(0x0038b828), XdB(0x003c67c2),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
257 XdB(0x004054ae), XdB(0x004482e8), XdB(0x0048f6af), XdB(0x004db488),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
258 XdB(0x0052c142), XdB(0x005821ff), XdB(0x005ddc33), XdB(0x0063f5b0),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
259 XdB(0x006a74a7), XdB(0x00715faf), XdB(0x0078bdce), XdB(0x0080967f),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
260 XdB(0x0088f1ba), XdB(0x0091d7f9), XdB(0x009b5247), XdB(0x00a56a41),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
261 XdB(0x00b02a27), XdB(0x00bb9ce2), XdB(0x00c7ce12), XdB(0x00d4ca17),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
262 XdB(0x00e29e20), XdB(0x00f15835), XdB(0x0101074b), XdB(0x0111bb4e),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
263 XdB(0x01238531), XdB(0x01367704), XdB(0x014aa402), XdB(0x016020a7),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
264 XdB(0x017702c3), XdB(0x018f6190), XdB(0x01a955cb), XdB(0x01c4f9cf),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
265 XdB(0x01e269a8), XdB(0x0201c33b), XdB(0x0223265a), XdB(0x0246b4ea),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
266 XdB(0x026c9302), XdB(0x0294e716), XdB(0x02bfda13), XdB(0x02ed9793),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
267 XdB(0x031e4e09), XdB(0x03522ee4), XdB(0x03896ed0), XdB(0x03c445e2),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
268 XdB(0x0402efd6), XdB(0x0445ac4b), XdB(0x048cbefc), XdB(0x04d87013),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
269 XdB(0x05290c67), XdB(0x057ee5ca), XdB(0x05da5364), XdB(0x063bb204),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
270 XdB(0x06a36485), XdB(0x0711d42b), XdB(0x0787710e), XdB(0x0804b299),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
271 XdB(0x088a17ef), XdB(0x0918287e), XdB(0x09af747c), XdB(0x0a50957e),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
272 XdB(0x0afc2f19), XdB(0x0bb2ef7f), XdB(0x0c759034), XdB(0x0d44d6ca),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
273 XdB(0x0e2195bc), XdB(0x0f0cad0d), XdB(0x10070b62), XdB(0x1111aeea),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
274 XdB(0x122da66c), XdB(0x135c120f), XdB(0x149e24d9), XdB(0x15f525b1),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
275 XdB(0x176270e3), XdB(0x18e7794b), XdB(0x1a85c9ae), XdB(0x1c3f06d1),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
276 XdB(0x1e14f07d), XdB(0x200963d7), XdB(0x221e5ccd), XdB(0x2455f870),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
277 XdB(0x26b2770b), XdB(0x29363e2b), XdB(0x2be3db5c), XdB(0x2ebe06b6),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
278 XdB(0x31c7a55b), XdB(0x3503ccd4), XdB(0x3875c5aa), XdB(0x3c210f44),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
279 XdB(0x4009632b), XdB(0x4432b8cf), XdB(0x48a149bc), XdB(0x4d59959e),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
280 XdB(0x52606733), XdB(0x57bad899), XdB(0x5d6e593a), XdB(0x6380b298),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
281 XdB(0x69f80e9a), XdB(0x70dafda8), XdB(0x78307d76), XdB(0x7fffffff),
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
282 };
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
283
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
284 static void render_line(int x0,int x1,int y0,int y1,ogg_int32_t *d){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
285 int dy=y1-y0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
286 int adx=x1-x0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
287 int ady=abs(dy);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
288 int base=dy/adx;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
289 int sy=(dy<0?base-1:base+1);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
290 int x=x0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
291 int y=y0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
292 int err=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
293
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
294 ady-=abs(base*adx);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
295
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
296 d[x]= MULT31_SHIFT15(d[x],FLOOR_fromdB_LOOKUP[y]);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
297
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
298 while(++x<x1){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
299 err=err+ady;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
300 if(err>=adx){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
301 err-=adx;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
302 y+=sy;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
303 }else{
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
304 y+=base;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
305 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
306 d[x]= MULT31_SHIFT15(d[x],FLOOR_fromdB_LOOKUP[y]);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
307 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
308 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
309
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
310 static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
311 vorbis_look_floor1 *look=(vorbis_look_floor1 *)in;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
312 vorbis_info_floor1 *info=look->vi;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
313 codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
314
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
315 int i,j,k;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
316 codebook *books=ci->fullbooks;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
317
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
318 /* unpack wrapped/predicted values from stream */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
319 if(oggpack_read(&vb->opb,1)==1){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
320 int *fit_value=(int *)_vorbis_block_alloc(vb,(look->posts)*sizeof(*fit_value));
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
321
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
322 fit_value[0]=oggpack_read(&vb->opb,ilog(look->quant_q-1));
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
323 fit_value[1]=oggpack_read(&vb->opb,ilog(look->quant_q-1));
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
324
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
325 /* partition by partition */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
326 /* partition by partition */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
327 for(i=0,j=2;i<info->partitions;i++){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
328 int classv=info->partitionclass[i];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
329 int cdim=info->class_dim[classv];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
330 int csubbits=info->class_subs[classv];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
331 int csub=1<<csubbits;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
332 int cval=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
333
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
334 /* decode the partition's first stage cascade value */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
335 if(csubbits){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
336 cval=vorbis_book_decode(books+info->class_book[classv],&vb->opb);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
337
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
338 if(cval==-1)goto eop;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
339 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
340
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
341 for(k=0;k<cdim;k++){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
342 int book=info->class_subbook[classv][cval&(csub-1)];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
343 cval>>=csubbits;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
344 if(book>=0){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
345 if((fit_value[j+k]=vorbis_book_decode(books+book,&vb->opb))==-1)
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
346 goto eop;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
347 }else{
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
348 fit_value[j+k]=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
349 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
350 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
351 j+=cdim;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
352 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
353
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
354 /* unwrap positive values and reconsitute via linear interpolation */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
355 for(i=2;i<look->posts;i++){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
356 int predicted=render_point(info->postlist[look->loneighbor[i-2]],
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
357 info->postlist[look->hineighbor[i-2]],
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
358 fit_value[look->loneighbor[i-2]],
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
359 fit_value[look->hineighbor[i-2]],
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
360 info->postlist[i]);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
361 int hiroom=look->quant_q-predicted;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
362 int loroom=predicted;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
363 int room=(hiroom<loroom?hiroom:loroom)<<1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
364 int val=fit_value[i];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
365
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
366 if(val){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
367 if(val>=room){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
368 if(hiroom>loroom){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
369 val = val-loroom;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
370 }else{
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
371 val = -1-(val-hiroom);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
372 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
373 }else{
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
374 if(val&1){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
375 val= -((val+1)>>1);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
376 }else{
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
377 val>>=1;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
378 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
379 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
380
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
381 fit_value[i]=val+predicted;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
382 fit_value[look->loneighbor[i-2]]&=0x7fff;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
383 fit_value[look->hineighbor[i-2]]&=0x7fff;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
384
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
385 }else{
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
386 fit_value[i]=predicted|0x8000;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
387 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
388
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
389 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
390
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
391 return(fit_value);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
392 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
393 eop:
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
394 return(NULL);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
395 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
396
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
397 static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
398 ogg_int32_t *out){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
399 vorbis_look_floor1 *look=(vorbis_look_floor1 *)in;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
400 vorbis_info_floor1 *info=look->vi;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
401
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
402 codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
403 int n=ci->blocksizes[vb->W]/2;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
404 int j;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
405
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
406 if(memo){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
407 /* render the lines */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
408 int *fit_value=(int *)memo;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
409 int hx=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
410 int lx=0;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
411 int ly=fit_value[0]*info->mult;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
412 for(j=1;j<look->posts;j++){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
413 int current=look->forward_index[j];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
414 int hy=fit_value[current]&0x7fff;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
415 if(hy==fit_value[current]){
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
416
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
417 hy*=info->mult;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
418 hx=info->postlist[current];
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
419
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
420 render_line(lx,hx,ly,hy,out);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
421
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
422 lx=hx;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
423 ly=hy;
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
424 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
425 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
426 for(j=hx;j<n;j++)out[j]*=ly; /* be certain */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
427 return(1);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
428 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
429 memset(out,0,sizeof(*out)*n);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
430 return(0);
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
431 }
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
432
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
433 /* export hooks */
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
434 vorbis_func_floor floor1_exportbundle={
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
435 &floor1_unpack,&floor1_look,&floor1_free_info,
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
436 &floor1_free_look,&floor1_inverse1,&floor1_inverse2
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
437 };
8631a3803289 internal Tremor decoder for Ogg/Vorbis
henry
parents:
diff changeset
438