Mercurial > libavcodec.hg
comparison wma.c @ 9844:eb5916527064 libavcodec
Move run level decode functionality to ff_wma_run_level_decode
so that it can be reused for wmapro
author | faust3 |
---|---|
date | Fri, 12 Jun 2009 16:00:26 +0000 |
parents | 893b27768692 |
children | 5cc32c474caf |
comparison
equal
deleted
inserted
replaced
9843:893b27768692 | 9844:eb5916527064 |
---|---|
422 av_free(s->int_table[i]); | 422 av_free(s->int_table[i]); |
423 } | 423 } |
424 | 424 |
425 return 0; | 425 return 0; |
426 } | 426 } |
427 | |
428 /** | |
429 * Decode run level compressed coefficients. | |
430 * @param avctx codec context | |
431 * @param gb bitstream reader context | |
432 * @param vlc vlc table for get_vlc2 | |
433 * @param level_table level codes | |
434 * @param run_table run codes | |
435 * @param version 0 for wma1,2 1 for wmapro | |
436 * @param ptr output buffer | |
437 * @param offset offset in the output buffer | |
438 * @param num_coefs number of input coefficents | |
439 * @param block_len input buffer length (2^n) | |
440 * @param frame_len_bits number of bits for escaped run codes | |
441 * @param coef_nb_bits number of bits for escaped level codes | |
442 * @return 0 on success, -1 otherwise | |
443 */ | |
444 int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb, | |
445 VLC *vlc, | |
446 const uint16_t *level_table, const uint16_t *run_table, | |
447 int version, int16_t *ptr, int offset, | |
448 int num_coefs, int block_len, int frame_len_bits, | |
449 int coef_nb_bits) | |
450 { | |
451 int code, run, level, sign; | |
452 int16_t* eptr = ptr + num_coefs; | |
453 for(;;) { | |
454 code = get_vlc2(gb, vlc->table, VLCBITS, VLCMAX); | |
455 if (code < 0) | |
456 return -1; | |
457 if (code == 1) { | |
458 /* EOB */ | |
459 break; | |
460 } else if (code == 0) { | |
461 /* escape */ | |
462 level = get_bits(gb, coef_nb_bits); | |
463 /* NOTE: this is rather suboptimal. reading | |
464 block_len_bits would be better */ | |
465 run = get_bits(gb, frame_len_bits); | |
466 } else { | |
467 /* normal code */ | |
468 run = run_table[code]; | |
469 level = level_table[code]; | |
470 } | |
471 sign = get_bits1(gb); | |
472 if (!sign) | |
473 level = -level; | |
474 ptr += run; | |
475 if (ptr >= eptr) | |
476 { | |
477 av_log(NULL, AV_LOG_ERROR, "overflow in spectral RLE, ignoring\n"); | |
478 break; | |
479 } | |
480 *ptr++ = level; | |
481 /* NOTE: EOB can be omitted */ | |
482 if (ptr >= eptr) | |
483 break; | |
484 } | |
485 return 0; | |
486 } | |
487 |