annotate tremor/floor1.c @ 33456:e80ada93a3c5

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