comparison vorbis.c @ 3802:094fe185d054 libavcodec

make some more functions global so they can be shared with vorbis_enc.c
author ods15
date Sun, 01 Oct 2006 11:59:33 +0000
parents 203cd258fc20
children 5ad55a4e42c2
comparison
equal deleted inserted replaced
3801:203cd258fc20 3802:094fe185d054
158 uint_fast32_t exp_bias; 158 uint_fast32_t exp_bias;
159 } vorbis_context; 159 } vorbis_context;
160 160
161 /* Helper functions */ 161 /* Helper functions */
162 162
163 #define ilog(i) av_log2(2*(i))
164
165 #define BARK(x) \ 163 #define BARK(x) \
166 (13.1f*atan(0.00074f*(x))+2.24f*atan(1.85e-8f*(x)*(x))+1e-4f*(x)) 164 (13.1f*atan(0.00074f*(x))+2.24f*atan(1.85e-8f*(x)*(x))+1e-4f*(x))
167 165
168 static unsigned int nth_root(unsigned int x, unsigned int n) { // x^(1/n) 166 unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n) { // x^(1/n)
169 unsigned int ret=0, i, j; 167 unsigned int ret=0, i, j;
170 168
171 do { 169 do {
172 ++ret; 170 ++ret;
173 for(i=0,j=ret;i<n-1;i++) j*=ret; 171 for(i=0,j=ret;i<n-1;i++) j*=ret;
184 } 182 }
185 183
186 184
187 // Generate vlc codes from vorbis huffman code lengths 185 // Generate vlc codes from vorbis huffman code lengths
188 186
189 static int vorbis_len2vlc(vorbis_context *vc, uint_fast8_t *bits, uint_fast32_t *codes, uint_fast32_t num) { 187 int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, uint_fast32_t num) {
190 uint_fast32_t exit_at_level[33]={404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 188 uint_fast32_t exit_at_level[33]={404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
191 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 189 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
192 190
193 uint_fast8_t i,j; 191 uint_fast8_t i,j;
194 uint_fast32_t code,p; 192 uint_fast32_t code,p;
207 for(i=0;i<bits[p];++i) { 205 for(i=0;i<bits[p];++i) {
208 exit_at_level[i+1]=1<<i; 206 exit_at_level[i+1]=1<<i;
209 } 207 }
210 208
211 #ifdef V_DEBUG 209 #ifdef V_DEBUG
212 av_log(vc->avccontext, AV_LOG_INFO, " %d. of %d code len %d code %d - ", p, num, bits[p], codes[p]); 210 av_log(NULL, AV_LOG_INFO, " %d. of %d code len %d code %d - ", p, num, bits[p], codes[p]);
213 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]); 211 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]);
214 for(i=0;i<bits[p];++i) { 212 for(i=0;i<bits[p];++i) {
215 av_log(vc->avccontext, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0"); 213 av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0");
216 } 214 }
217 av_log(vc->avccontext, AV_LOG_INFO, "\n"); 215 av_log(NULL, AV_LOG_INFO, "\n");
218 #endif 216 #endif
219 217
220 ++p; 218 ++p;
221 219
222 for(;p<num;++p) { 220 for(;p<num;++p) {
233 exit_at_level[j]=code+(1<<(j-1)); 231 exit_at_level[j]=code+(1<<(j-1));
234 } 232 }
235 codes[p]=code; 233 codes[p]=code;
236 234
237 #ifdef V_DEBUG 235 #ifdef V_DEBUG
238 av_log(vc->avccontext, AV_LOG_INFO, " %d. code len %d code %d - ", p, bits[p], codes[p]); 236 av_log(NULL, AV_LOG_INFO, " %d. code len %d code %d - ", p, bits[p], codes[p]);
239 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]); 237 init_get_bits(&gb, (uint_fast8_t *)&codes[p], bits[p]);
240 for(i=0;i<bits[p];++i) { 238 for(i=0;i<bits[p];++i) {
241 av_log(vc->avccontext, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0"); 239 av_log(NULL, AV_LOG_INFO, "%s", get_bits1(&gb) ? "1" : "0");
242 } 240 }
243 av_log(vc->avccontext, AV_LOG_INFO, "\n"); 241 av_log(NULL, AV_LOG_INFO, "\n");
244 #endif 242 #endif
245 243
246 } 244 }
247 245
248 //FIXME no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC) 246 //no exits should be left (underspecified tree - ie. unused valid vlcs - not allowed by SPEC)
247 for (p=1; p<33; p++)
248 if (exit_at_level[p]) return 1;
249 249
250 return 0; 250 return 0;
251 } 251 }
252 252
253 void ff_vorbis_ready_floor1_list(floor1_entry_t * list, int values) { 253 void ff_vorbis_ready_floor1_list(floor1_entry_t * list, int values) {
334 334
335 // Process codebooks part 335 // Process codebooks part
336 336
337 static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) { 337 static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) {
338 uint_fast16_t cb; 338 uint_fast16_t cb;
339 uint_fast8_t *tmp_vlc_bits; 339 uint8_t *tmp_vlc_bits;
340 uint_fast32_t *tmp_vlc_codes; 340 uint32_t *tmp_vlc_codes;
341 GetBitContext *gb=&vc->gb; 341 GetBitContext *gb=&vc->gb;
342 342
343 vc->codebook_count=get_bits(gb,8)+1; 343 vc->codebook_count=get_bits(gb,8)+1;
344 344
345 AV_DEBUG(" Codebooks: %d \n", vc->codebook_count); 345 AV_DEBUG(" Codebooks: %d \n", vc->codebook_count);
346 346
347 vc->codebooks=(vorbis_codebook *)av_mallocz(vc->codebook_count * sizeof(vorbis_codebook)); 347 vc->codebooks=(vorbis_codebook *)av_mallocz(vc->codebook_count * sizeof(vorbis_codebook));
348 tmp_vlc_bits=(uint_fast8_t *)av_mallocz(V_MAX_VLCS * sizeof(uint_fast8_t)); 348 tmp_vlc_bits=(uint8_t *)av_mallocz(V_MAX_VLCS * sizeof(uint8_t));
349 tmp_vlc_codes=(uint_fast32_t *)av_mallocz(V_MAX_VLCS * sizeof(uint_fast32_t)); 349 tmp_vlc_codes=(uint32_t *)av_mallocz(V_MAX_VLCS * sizeof(uint32_t));
350 350
351 for(cb=0;cb<vc->codebook_count;++cb) { 351 for(cb=0;cb<vc->codebook_count;++cb) {
352 vorbis_codebook *codebook_setup=&vc->codebooks[cb]; 352 vorbis_codebook *codebook_setup=&vc->codebooks[cb];
353 uint_fast8_t ordered; 353 uint_fast8_t ordered;
354 uint_fast32_t t, used_entries=0; 354 uint_fast32_t t, used_entries=0;
437 437
438 // If the codebook is used for (inverse) VQ, calculate codevectors. 438 // If the codebook is used for (inverse) VQ, calculate codevectors.
439 439
440 if (codebook_setup->lookup_type==1) { 440 if (codebook_setup->lookup_type==1) {
441 uint_fast16_t i, j, k; 441 uint_fast16_t i, j, k;
442 uint_fast16_t codebook_lookup_values=nth_root(entries, codebook_setup->dimensions); 442 uint_fast16_t codebook_lookup_values=ff_vorbis_nth_root(entries, codebook_setup->dimensions);
443 uint_fast16_t codebook_multiplicands[codebook_lookup_values]; 443 uint_fast16_t codebook_multiplicands[codebook_lookup_values];
444 444
445 float codebook_minimum_value=vorbisfloat2float(get_bits_long(gb, 32)); 445 float codebook_minimum_value=vorbisfloat2float(get_bits_long(gb, 32));
446 float codebook_delta_value=vorbisfloat2float(get_bits_long(gb, 32)); 446 float codebook_delta_value=vorbisfloat2float(get_bits_long(gb, 32));
447 uint_fast8_t codebook_value_bits=get_bits(gb, 4)+1; 447 uint_fast8_t codebook_value_bits=get_bits(gb, 4)+1;
501 av_log(vc->avccontext, AV_LOG_ERROR, "Codebook lookup type not supported. \n"); 501 av_log(vc->avccontext, AV_LOG_ERROR, "Codebook lookup type not supported. \n");
502 goto error; 502 goto error;
503 } 503 }
504 504
505 // Initialize VLC table 505 // Initialize VLC table
506 if (vorbis_len2vlc(vc, tmp_vlc_bits, tmp_vlc_codes, entries)) { 506 if (ff_vorbis_len2vlc(tmp_vlc_bits, tmp_vlc_codes, entries)) {
507 av_log(vc->avccontext, AV_LOG_ERROR, " Invalid code lengths while generating vlcs. \n"); 507 av_log(vc->avccontext, AV_LOG_ERROR, " Invalid code lengths while generating vlcs. \n");
508 goto error; 508 goto error;
509 } 509 }
510 codebook_setup->maxdepth=0; 510 codebook_setup->maxdepth=0;
511 for(t=0;t<entries;++t) 511 for(t=0;t<entries;++t)
1361 1361
1362 for(i=1;i<vf->x_list_dim;++i) { 1362 for(i=1;i<vf->x_list_dim;++i) {
1363 AV_DEBUG(" Looking at post %d \n", i); 1363 AV_DEBUG(" Looking at post %d \n", i);
1364 1364
1365 if (floor1_flag[vf->list[i].sort]) { // SPEC mispelled 1365 if (floor1_flag[vf->list[i].sort]) { // SPEC mispelled
1366 int_fast16_t x, y, dy, base, sy; // if uncommented: dy = -32 adx = 2 base = 2blablabla ?????
1367
1368 hy=floor1_Y_final[vf->list[i].sort]*vf->multiplier; 1366 hy=floor1_Y_final[vf->list[i].sort]*vf->multiplier;
1369 hx=vf->list[vf->list[i].sort].x; 1367 hx=vf->list[vf->list[i].sort].x;
1370 1368
1371 dy=hy-ly; 1369 render_line(lx, ly, hx, hy, vec, vc->blocksize[1]);
1372 adx=hx-lx;
1373 ady= (dy<0) ? -dy:dy;//ABS(dy);
1374 base=(int16_t)dy/(int16_t)adx;
1375
1376 AV_DEBUG(" dy %d adx %d base %d = %d \n", dy, adx, base, dy/adx);
1377
1378 x=lx;
1379 y=ly;
1380 err=0;
1381 if (dy<0) {
1382 sy=base-1;
1383 } else {
1384 sy=base+1;
1385 }
1386 ady=ady-(base<0 ? -base : base)*adx;
1387 vec[x]=ff_vorbis_floor1_inverse_db_table[y];
1388
1389 AV_DEBUG(" vec[ %d ] = %d \n", x, y);
1390
1391 for(x=lx+1;(x<hx) && (x<vf->list[1].x);++x) {
1392 err+=ady;
1393 if (err>=adx) {
1394 err-=adx;
1395 y+=sy;
1396 } else {
1397 y+=base;
1398 }
1399 vec[x]=ff_vorbis_floor1_inverse_db_table[y];
1400
1401 AV_DEBUG(" vec[ %d ] = %d \n", x, y);
1402 }
1403
1404 /* for(j=1;j<hx-lx+1;++j) { // iterating render_point
1405 dy=hy-ly;
1406 adx=hx-lx;
1407 ady= dy<0 ? -dy : dy;
1408 err=ady*j;
1409 off=err/adx;
1410 if (dy<0) {
1411 predicted=ly-off;
1412 } else {
1413 predicted=ly+off;
1414 }
1415 if (lx+j < vf->x_list[1]) {
1416 vec[lx+j]=ff_vorbis_floor1_inverse_db_table[predicted];
1417 }
1418 }*/
1419 1370
1420 lx=hx; 1371 lx=hx;
1421 ly=hy; 1372 ly=hy;
1422 } 1373 }
1423 } 1374 }
1424 1375
1425 if (hx<vf->list[1].x) { 1376 if (hx<vf->list[1].x) {
1426 for(i=hx;i<vf->list[1].x;++i) { 1377 render_line(hx, hy, vf->list[1].x, hy, vec, vc->blocksize[1]);
1427 vec[i]=ff_vorbis_floor1_inverse_db_table[hy];
1428 }
1429 } 1378 }
1430 1379
1431 AV_DEBUG(" Floor decoded\n"); 1380 AV_DEBUG(" Floor decoded\n");
1432 1381
1433 return 0; 1382 return 0;