dont copy the whole GetBitContext around
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 24 Aug 2006 06:57:32 +0000 (06:57 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 24 Aug 2006 06:57:32 +0000 (06:57 +0000)
Originally committed as revision 6062 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/mpegaudiodec.c

index 0c57508..a47bcb9 100644 (file)
@@ -1671,7 +1671,7 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g,
 {
     int s_index;
     int linbits, code, x, y, l, v, i, j, k, pos;
 {
     int s_index;
     int linbits, code, x, y, l, v, i, j, k, pos;
-    GetBitContext last_gb;
+    int last_pos;
     VLC *vlc;
 
     /* low frequencies (called big values) */
     VLC *vlc;
 
     /* low frequencies (called big values) */
@@ -1735,19 +1735,20 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g,
 
     /* high frequencies */
     vlc = &huff_quad_vlc[g->count1table_select];
 
     /* high frequencies */
     vlc = &huff_quad_vlc[g->count1table_select];
-    last_gb.buffer = NULL;
+    last_pos=0;
     while (s_index <= 572) {
         pos = get_bits_count(&s->gb);
         if (pos >= end_pos) {
     while (s_index <= 572) {
         pos = get_bits_count(&s->gb);
         if (pos >= end_pos) {
-            if (pos > end_pos && last_gb.buffer != NULL) {
+            if (pos > end_pos && last_pos){
                 /* some encoders generate an incorrect size for this
                    part. We must go back into the data */
                 s_index -= 4;
                 /* some encoders generate an incorrect size for this
                    part. We must go back into the data */
                 s_index -= 4;
-                s->gb = last_gb;
+                init_get_bits(&s->gb, s->gb.buffer + (last_pos>>3), s->gb.size_in_bits - (last_pos&(~7)));
+                skip_bits(&s->gb, last_pos&7);
             }
             break;
         }
             }
             break;
         }
-        last_gb= s->gb;
+        last_pos= pos;
 
         code = get_vlc2(&s->gb, vlc->table, vlc->bits, 1);
         dprintf("t=%d code=%d\n", g->count1table_select, code);
 
         code = get_vlc2(&s->gb, vlc->table, vlc->bits, 1);
         dprintf("t=%d code=%d\n", g->count1table_select, code);