Mercurial > libavcodec.hg
comparison vorbis.c @ 10316:7bfcc66f807d libavcodec
whitespace cosmetics, prettyprinting, K&R coding style
author | diego |
---|---|
date | Tue, 29 Sep 2009 11:43:58 +0000 |
parents | d3644248015a |
children | 7dd2a45249a9 |
comparison
equal
deleted
inserted
replaced
10315:27cb9c2c0c6b | 10316:7bfcc66f807d |
---|---|
1 /** | 1 /** |
2 * @file libavcodec/vorbis.c | 2 * @file libavcodec/vorbis.c |
3 * Common code for Vorbis I encoder and decoder | 3 * Common code for Vorbis I encoder and decoder |
4 * @author Denes Balatoni ( dbalatoni programozo hu ) | 4 * @author Denes Balatoni ( dbalatoni programozo hu ) |
5 | 5 * |
6 * This file is part of FFmpeg. | 6 * This file is part of FFmpeg. |
7 * | 7 * |
8 * FFmpeg is free software; you can redistribute it and/or | 8 * FFmpeg is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Lesser General Public | 9 * modify it under the terms of the GNU Lesser General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
33 /* Helper functions */ | 33 /* Helper functions */ |
34 | 34 |
35 // x^(1/n) | 35 // x^(1/n) |
36 unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n) | 36 unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n) |
37 { | 37 { |
38 unsigned int ret=0, i, j; | 38 unsigned int ret = 0, i, j; |
39 | 39 |
40 do { | 40 do { |
41 ++ret; | 41 ++ret; |
42 for(i=0,j=ret;i<n-1;i++) | 42 for (i = 0, j = ret; i < n - 1; i++) |
43 j*=ret; | 43 j *= ret; |
44 } while (j<=x); | 44 } while (j <= x); |
45 | 45 |
46 return ret - 1; | 46 return ret - 1; |
47 } | 47 } |
48 | 48 |
49 // Generate vlc codes from vorbis huffman code lengths | 49 // Generate vlc codes from vorbis huffman code lengths |
51 // the two bits[p] > 32 checks should be redundant, all calling code should | 51 // the two bits[p] > 32 checks should be redundant, all calling code should |
52 // already ensure that, but since it allows overwriting the stack it seems | 52 // already ensure that, but since it allows overwriting the stack it seems |
53 // reasonable to check redundantly. | 53 // reasonable to check redundantly. |
54 int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, uint_fast32_t num) | 54 int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, uint_fast32_t num) |
55 { | 55 { |
56 uint_fast32_t exit_at_level[33]={404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | 56 uint_fast32_t exit_at_level[33] = { |
57 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; | 57 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
58 | 58 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; |
59 uint_fast8_t i,j; | 59 |
60 uint_fast32_t code,p; | 60 uint_fast8_t i, j; |
61 uint_fast32_t code, p; | |
61 | 62 |
62 #ifdef V_DEBUG | 63 #ifdef V_DEBUG |
63 GetBitContext gb; | 64 GetBitContext gb; |
64 #endif | 65 #endif |
65 | 66 |
66 for(p=0;(bits[p]==0) && (p<num);++p) | 67 for (p = 0; (bits[p] == 0) && (p < num); ++p) |
67 ; | 68 ; |
68 if (p==num) { | 69 if (p == num) { |
69 // av_log(vc->avccontext, AV_LOG_INFO, "An empty codebook. Heh?! \n"); | 70 // av_log(vc->avccontext, AV_LOG_INFO, "An empty codebook. Heh?! \n"); |
70 return 0; | 71 return 0; |
71 } | 72 } |
72 | 73 |
73 codes[p]=0; | 74 codes[p] = 0; |
74 if (bits[p] > 32) | 75 if (bits[p] > 32) |
75 return 1; | 76 return 1; |
76 for(i=0;i<bits[p];++i) | 77 for (i = 0; i < bits[p]; ++i) |
77 exit_at_level[i+1]=1<<i; | 78 exit_at_level[i+1] = 1 << i; |
78 | 79 |
79 #ifdef V_DEBUG | 80 #ifdef V_DEBUG |
80 av_log(NULL, AV_LOG_INFO, " %d. of %d code len %d code %d - ", p, num, bits[p], codes[p]); | 81 av_log(NULL, AV_LOG_INFO, " %d. of %d code len %d code %d - ", p, num, bits[p], codes[p]); |
81 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]); | 82 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]); |
82 for(i=0;i<bits[p];++i) | 83 for (i = 0; i < bits[p]; ++i) |
83 av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0"); | 84 av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0"); |
84 av_log(NULL, AV_LOG_INFO, "\n"); | 85 av_log(NULL, AV_LOG_INFO, "\n"); |
85 #endif | 86 #endif |
86 | 87 |
87 ++p; | 88 ++p; |
88 | 89 |
89 for(;p<num;++p) { | 90 for (; p < num; ++p) { |
90 if (bits[p] > 32) | 91 if (bits[p] > 32) |
91 return 1; | 92 return 1; |
92 if (bits[p]==0) | 93 if (bits[p] == 0) |
93 continue; | 94 continue; |
94 // find corresponding exit(node which the tree can grow further from) | 95 // find corresponding exit(node which the tree can grow further from) |
95 for(i=bits[p];i>0;--i) | 96 for (i = bits[p]; i > 0; --i) |
96 if (exit_at_level[i]) | 97 if (exit_at_level[i]) |
97 break; | 98 break; |
98 if (!i) // overspecified tree | 99 if (!i) // overspecified tree |
99 return 1; | 100 return 1; |
100 code=exit_at_level[i]; | 101 code = exit_at_level[i]; |
101 exit_at_level[i]=0; | 102 exit_at_level[i] = 0; |
102 // construct code (append 0s to end) and introduce new exits | 103 // construct code (append 0s to end) and introduce new exits |
103 for(j=i+1;j<=bits[p];++j) | 104 for (j = i + 1 ;j <= bits[p]; ++j) |
104 exit_at_level[j]=code+(1<<(j-1)); | 105 exit_at_level[j] = code + (1 << (j - 1)); |
105 codes[p]=code; | 106 codes[p] = code; |
106 | 107 |
107 #ifdef V_DEBUG | 108 #ifdef V_DEBUG |
108 av_log(NULL, AV_LOG_INFO, " %d. code len %d code %d - ", p, bits[p], codes[p]); | 109 av_log(NULL, AV_LOG_INFO, " %d. code len %d code %d - ", p, bits[p], codes[p]); |
109 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]); | 110 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]); |
110 for(i=0;i<bits[p];++i) | 111 for (i = 0; i < bits[p]; ++i) |
111 av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0"); | 112 av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0"); |
112 av_log(NULL, AV_LOG_INFO, "\n"); | 113 av_log(NULL, AV_LOG_INFO, "\n"); |
113 #endif | 114 #endif |
114 | 115 |
115 } | 116 } |
116 | 117 |
117 //no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC) | 118 //no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC) |
118 for (p=1; p<33; p++) | 119 for (p = 1; p < 33; p++) |
119 if (exit_at_level[p]) | 120 if (exit_at_level[p]) |
120 return 1; | 121 return 1; |
121 | 122 |
122 return 0; | 123 return 0; |
123 } | 124 } |
127 int i; | 128 int i; |
128 list[0].sort = 0; | 129 list[0].sort = 0; |
129 list[1].sort = 1; | 130 list[1].sort = 1; |
130 for (i = 2; i < values; i++) { | 131 for (i = 2; i < values; i++) { |
131 int j; | 132 int j; |
132 list[i].low = 0; | 133 list[i].low = 0; |
133 list[i].high = 1; | 134 list[i].high = 1; |
134 list[i].sort = i; | 135 list[i].sort = i; |
135 for (j = 2; j < i; j++) { | 136 for (j = 2; j < i; j++) { |
136 int tmp = list[j].x; | 137 int tmp = list[j].x; |
137 if (tmp < list[i].x) { | 138 if (tmp < list[i].x) { |
138 if (tmp > list[list[i].low].x) | 139 if (tmp > list[list[i].low].x) |
139 list[i].low = j; | 140 list[i].low = j; |
140 } else { | 141 } else { |
141 if (tmp < list[list[i].high].x) | 142 if (tmp < list[list[i].high].x) |
142 list[i].high = j; | 143 list[i].high = j; |
143 } | 144 } |
144 } | 145 } |
155 } | 156 } |
156 } | 157 } |
157 | 158 |
158 static inline void render_line_unrolled(intptr_t x, intptr_t y, int x1, | 159 static inline void render_line_unrolled(intptr_t x, intptr_t y, int x1, |
159 intptr_t sy, int ady, int adx, | 160 intptr_t sy, int ady, int adx, |
160 float * buf) | 161 float *buf) |
161 { | 162 { |
162 int err = -adx; | 163 int err = -adx; |
163 x -= x1-1; | 164 x -= x1 - 1; |
164 buf += x1-1; | 165 buf += x1 - 1; |
165 while (++x < 0) { | 166 while (++x < 0) { |
166 err += ady; | 167 err += ady; |
167 if (err >= 0) { | 168 if (err >= 0) { |
168 err += ady - adx; | 169 err += ady - adx; |
169 y += sy; | 170 y += sy; |
170 buf[x++] = ff_vorbis_floor1_inverse_db_table[y]; | 171 buf[x++] = ff_vorbis_floor1_inverse_db_table[y]; |
171 } | 172 } |
172 buf[x] = ff_vorbis_floor1_inverse_db_table[y]; | 173 buf[x] = ff_vorbis_floor1_inverse_db_table[y]; |
173 } | 174 } |
174 if (x <= 0) { | 175 if (x <= 0) { |
176 y += sy; | 177 y += sy; |
177 buf[x] = ff_vorbis_floor1_inverse_db_table[y]; | 178 buf[x] = ff_vorbis_floor1_inverse_db_table[y]; |
178 } | 179 } |
179 } | 180 } |
180 | 181 |
181 static void render_line(int x0, int y0, int x1, int y1, float * buf) | 182 static void render_line(int x0, int y0, int x1, int y1, float *buf) |
182 { | 183 { |
183 int dy = y1 - y0; | 184 int dy = y1 - y0; |
184 int adx = x1 - x0; | 185 int adx = x1 - x0; |
185 int ady = FFABS(dy); | 186 int ady = FFABS(dy); |
186 int sy = dy<0 ? -1 : 1; | 187 int sy = dy < 0 ? -1 : 1; |
187 buf[x0] = ff_vorbis_floor1_inverse_db_table[y0]; | 188 buf[x0] = ff_vorbis_floor1_inverse_db_table[y0]; |
188 if(ady*2<=adx) { // optimized common case | 189 if (ady*2 <= adx) { // optimized common case |
189 render_line_unrolled(x0, y0, x1, sy, ady, adx, buf); | 190 render_line_unrolled(x0, y0, x1, sy, ady, adx, buf); |
190 } else { | 191 } else { |
191 int base = dy / adx; | 192 int base = dy / adx; |
192 int x = x0; | 193 int x = x0; |
193 int y = y0; | 194 int y = y0; |
194 int err = -adx; | 195 int err = -adx; |
195 ady -= FFABS(base) * adx; | 196 ady -= FFABS(base) * adx; |
196 while (++x < x1) { | 197 while (++x < x1) { |
197 y += base; | 198 y += base; |
198 err += ady; | 199 err += ady; |
199 if (err >= 0) { | 200 if (err >= 0) { |
200 err -= adx; | 201 err -= adx; |
201 y += sy; | 202 y += sy; |
202 } | 203 } |
203 buf[x] = ff_vorbis_floor1_inverse_db_table[y]; | 204 buf[x] = ff_vorbis_floor1_inverse_db_table[y]; |
204 } | 205 } |
205 } | 206 } |
206 } | 207 } |
207 | 208 |
208 void ff_vorbis_floor1_render_list(vorbis_floor1_entry * list, int values, | 209 void ff_vorbis_floor1_render_list(vorbis_floor1_entry * list, int values, |
209 uint_fast16_t * y_list, int * flag, | 210 uint_fast16_t *y_list, int *flag, |
210 int multiplier, float * out, int samples) | 211 int multiplier, float *out, int samples) |
211 { | 212 { |
212 int lx, ly, i; | 213 int lx, ly, i; |
213 lx = 0; | 214 lx = 0; |
214 ly = y_list[0] * multiplier; | 215 ly = y_list[0] * multiplier; |
215 for (i = 1; i < values; i++) { | 216 for (i = 1; i < values; i++) { |