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