1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

Add support for escape coded wmapro run level coefficients

Originally committed as revision 19232 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Sascha Sommer 2009-06-20 10:28:55 +00:00
parent 9970c61b4b
commit 891bd2e5aa
2 changed files with 41 additions and 0 deletions

View File

@ -425,6 +425,28 @@ int ff_wma_end(AVCodecContext *avctx)
return 0;
}
/**
* Decode an uncompressed coefficient.
* @param s codec context
* @return the decoded coefficient
*/
unsigned int ff_wma_get_large_val(GetBitContext* gb)
{
/** consumes up to 34 bits */
int n_bits = 8;
/** decode length */
if (get_bits1(gb)) {
n_bits += 8;
if (get_bits1(gb)) {
n_bits += 8;
if (get_bits1(gb)) {
n_bits += 7;
}
}
}
return get_bits_long(gb, n_bits);
}
/**
* Decode run level compressed coefficients.
* @param avctx codec context
@ -450,6 +472,7 @@ int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb,
{
int code, run, level, sign;
WMACoef* eptr = ptr + num_coefs;
ptr += offset;
for(;;) {
code = get_vlc2(gb, vlc->table, VLCBITS, VLCMAX);
if (code < 0)
@ -459,10 +482,27 @@ int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb,
break;
} else if (code == 0) {
/* escape */
if (!version) {
level = get_bits(gb, coef_nb_bits);
/* NOTE: this is rather suboptimal. reading
block_len_bits would be better */
run = get_bits(gb, frame_len_bits);
} else {
level = ff_wma_get_large_val(gb);
/** escape decode */
if (get_bits1(gb)) {
if (get_bits1(gb)) {
if (get_bits1(gb)) {
av_log(avctx,AV_LOG_ERROR,
"broken escape sequence\n");
return -1;
} else
run = get_bits(gb, frame_len_bits) + 4;
} else
run = get_bits(gb, 2) + 1;
} else
run = 0;
}
} else {
/* normal code */
run = run_table[code];

View File

@ -150,6 +150,7 @@ int av_cold ff_wma_get_frame_len_bits(int sample_rate, int version,
int ff_wma_init(AVCodecContext * avctx, int flags2);
int ff_wma_total_gain_to_bits(int total_gain);
int ff_wma_end(AVCodecContext *avctx);
unsigned int ff_wma_get_large_val(GetBitContext* gb);
int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb,
VLC *vlc,
const uint16_t *level_table, const uint16_t *run_table,