OSDN Git Service

reinit get_bits for every decode_packet call
authorSascha Sommer <saschasommer@freenet.de>
Fri, 11 Sep 2009 15:59:27 +0000 (15:59 +0000)
committerSascha Sommer <saschasommer@freenet.de>
Fri, 11 Sep 2009 15:59:27 +0000 (15:59 +0000)
Originally committed as revision 19822 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/wmaprodec.c

index 8f24862..425cc0b 100644 (file)
@@ -190,6 +190,7 @@ typedef struct WMAProDecodeCtx {
 
     /* packet decode state */
     GetBitContext    pgb;                           ///< bitstream reader context for the packet
+    uint8_t          packet_offset;                 ///< frame offset in the packet
     uint8_t          packet_sequence_number;        ///< current packet number
     int              num_saved_bits;                ///< saved number of bits
     int              frame_offset;                  ///< frame offset in the bit reservoir
@@ -1502,6 +1503,9 @@ static int decode_packet(AVCodecContext *avctx,
 
     } else {
         int frame_size;
+        s->buf_bit_size = avpkt->size << 3;
+        init_get_bits(gb, avpkt->data, s->buf_bit_size);
+        skip_bits(gb, s->packet_offset);
         if (remaining_bits(s, gb) > s->log2_frame_size &&
             (frame_size = show_bits(gb, s->log2_frame_size)) &&
             frame_size <= remaining_bits(s, gb)) {
@@ -1519,8 +1523,9 @@ static int decode_packet(AVCodecContext *avctx,
     }
 
     *data_size = (int8_t *)s->samples - (int8_t *)data;
+    s->packet_offset = get_bits_count(gb) & 7;
 
-    return (!s->packet_done && !s->packet_loss)?0: avctx->block_align;
+    return get_bits_count(gb) >> 3;
 }
 
 /**