mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-04-14 00:58:38 +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:
parent
9970c61b4b
commit
891bd2e5aa
@ -425,6 +425,28 @@ int ff_wma_end(AVCodecContext *avctx)
|
|||||||
return 0;
|
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.
|
* Decode run level compressed coefficients.
|
||||||
* @param avctx codec context
|
* @param avctx codec context
|
||||||
@ -450,6 +472,7 @@ int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb,
|
|||||||
{
|
{
|
||||||
int code, run, level, sign;
|
int code, run, level, sign;
|
||||||
WMACoef* eptr = ptr + num_coefs;
|
WMACoef* eptr = ptr + num_coefs;
|
||||||
|
ptr += offset;
|
||||||
for(;;) {
|
for(;;) {
|
||||||
code = get_vlc2(gb, vlc->table, VLCBITS, VLCMAX);
|
code = get_vlc2(gb, vlc->table, VLCBITS, VLCMAX);
|
||||||
if (code < 0)
|
if (code < 0)
|
||||||
@ -459,10 +482,27 @@ int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb,
|
|||||||
break;
|
break;
|
||||||
} else if (code == 0) {
|
} else if (code == 0) {
|
||||||
/* escape */
|
/* escape */
|
||||||
|
if (!version) {
|
||||||
level = get_bits(gb, coef_nb_bits);
|
level = get_bits(gb, coef_nb_bits);
|
||||||
/* NOTE: this is rather suboptimal. reading
|
/* NOTE: this is rather suboptimal. reading
|
||||||
block_len_bits would be better */
|
block_len_bits would be better */
|
||||||
run = get_bits(gb, frame_len_bits);
|
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 {
|
} else {
|
||||||
/* normal code */
|
/* normal code */
|
||||||
run = run_table[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_init(AVCodecContext * avctx, int flags2);
|
||||||
int ff_wma_total_gain_to_bits(int total_gain);
|
int ff_wma_total_gain_to_bits(int total_gain);
|
||||||
int ff_wma_end(AVCodecContext *avctx);
|
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,
|
int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb,
|
||||||
VLC *vlc,
|
VLC *vlc,
|
||||||
const uint16_t *level_table, const uint16_t *run_table,
|
const uint16_t *level_table, const uint16_t *run_table,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user