[FFmpeg-cvslog] r19232 - in trunk/libavcodec: wma.c wma.h
faust3
subversion
Sat Jun 20 12:28:55 CEST 2009
Author: faust3
Date: Sat Jun 20 12:28:55 2009
New Revision: 19232
Log:
Add support for escape coded wmapro run level coefficients
Modified:
trunk/libavcodec/wma.c
trunk/libavcodec/wma.h
Modified: trunk/libavcodec/wma.c
==============================================================================
--- trunk/libavcodec/wma.c Sat Jun 20 11:05:28 2009 (r19231)
+++ trunk/libavcodec/wma.c Sat Jun 20 12:28:55 2009 (r19232)
@@ -426,6 +426,28 @@ int ff_wma_end(AVCodecContext *avctx)
}
/**
+ * 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
* @param gb bitstream reader context
@@ -450,6 +472,7 @@ int ff_wma_run_level_decode(AVCodecConte
{
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(AVCodecConte
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];
Modified: trunk/libavcodec/wma.h
==============================================================================
--- trunk/libavcodec/wma.h Sat Jun 20 11:05:28 2009 (r19231)
+++ trunk/libavcodec/wma.h Sat Jun 20 12:28:55 2009 (r19232)
@@ -150,6 +150,7 @@ int av_cold ff_wma_get_frame_len_bits(in
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,
More information about the ffmpeg-cvslog
mailing list