changeset 9869:1f6b569bf958 libavcodec

Add support for escape coded wmapro run level coefficients
author faust3
date Sat, 20 Jun 2009 10:28:55 +0000
parents 5cc32c474caf
children 40638c6c2d69
files wma.c wma.h
diffstat 2 files changed, 41 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/wma.c	Sat Jun 20 09:05:28 2009 +0000
+++ b/wma.c	Sat Jun 20 10:28:55 2009 +0000
@@ -426,6 +426,28 @@
 }
 
 /**
+ * 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 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 @@
             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];
--- a/wma.h	Sat Jun 20 09:05:28 2009 +0000
+++ b/wma.h	Sat Jun 20 10:28:55 2009 +0000
@@ -150,6 +150,7 @@
 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,