mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-24 12:09:55 +00: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:
parent
9970c61b4b
commit
891bd2e5aa
@ -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];
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user