| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -1449,62 +1449,62 @@ static int decode_packet(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                         void *data, int *data_size, AVPacket* avpkt) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    WMAProDecodeCtx *s = avctx->priv_data; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    GetBitContext* gb    = &s->pgb; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const uint8_t* buf   = avpkt->data; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int buf_size         = avpkt->size; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int more_frames      = 1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    GetBitContext* gb  = &s->pgb; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    const uint8_t* buf = avpkt->data; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int buf_size       = avpkt->size; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int more_frames    = 1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int num_bits_prev_frame; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int packet_sequence_number; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->samples      = data; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->samples       = data; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->samples_start = data; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->samples_end  = (float*)((int8_t*)data + *data_size); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->samples_end   = (float*)((int8_t*)data + *data_size); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    *data_size = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (!s->output_buffer_full) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->buf_bit_size = buf_size << 3; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        s->buf_bit_size = buf_size << 3; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    /** sanity check for the buffer length */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (buf_size < avctx->block_align) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /** sanity check for the buffer length */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (buf_size < avctx->block_align) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    buf_size = avctx->block_align; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        buf_size = avctx->block_align; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    /** parse packet header */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    init_get_bits(gb, buf, s->buf_bit_size); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    packet_sequence_number = get_bits(gb, 4); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    skip_bits(gb, 2); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /** parse packet header */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        init_get_bits(gb, buf, s->buf_bit_size); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        packet_sequence_number = get_bits(gb, 4); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        skip_bits(gb, 2); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    /** get number of bits that need to be added to the previous frame */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    num_bits_prev_frame = get_bits(gb, s->log2_frame_size); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    dprintf(avctx, "packet[%d]: nbpf %x\n", avctx->frame_number, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            num_bits_prev_frame); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /** get number of bits that need to be added to the previous frame */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        num_bits_prev_frame = get_bits(gb, s->log2_frame_size); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        dprintf(avctx, "packet[%d]: nbpf %x\n", avctx->frame_number, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                num_bits_prev_frame); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    /** check for packet loss */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (!s->packet_loss && | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        ((s->packet_sequence_number + 1) & 0xF) != packet_sequence_number) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        s->packet_loss = 1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        av_log(avctx, AV_LOG_ERROR, "Packet loss detected! seq %x vs %x\n", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			               s->packet_sequence_number, packet_sequence_number); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->packet_sequence_number = packet_sequence_number; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (num_bits_prev_frame > 0) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /** append the previous frame data to the remaining data from the | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            previous packet to create a full frame */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        save_bits(s, gb, num_bits_prev_frame, 1); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        dprintf(avctx, "accumulated %x bits of frame data\n", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->num_saved_bits - s->frame_offset); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /** decode the cross packet frame if it is valid */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (!s->packet_loss) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            decode_frame(s); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } else if (s->num_saved_bits - s->frame_offset) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        dprintf(avctx, "ignoring %x previously saved bits\n", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->num_saved_bits - s->frame_offset); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /** check for packet loss */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (!s->packet_loss && | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            ((s->packet_sequence_number + 1) & 0xF) != packet_sequence_number) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            s->packet_loss = 1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            av_log(avctx, AV_LOG_ERROR, "Packet loss detected! seq %x vs %x\n", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                   s->packet_sequence_number, packet_sequence_number); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        s->packet_sequence_number = packet_sequence_number; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (num_bits_prev_frame > 0) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            /** append the previous frame data to the remaining data from the | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                previous packet to create a full frame */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            save_bits(s, gb, num_bits_prev_frame, 1); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            dprintf(avctx, "accumulated %x bits of frame data\n", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    s->num_saved_bits - s->frame_offset); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            /** decode the cross packet frame if it is valid */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if (!s->packet_loss) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                decode_frame(s); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } else if (s->num_saved_bits - s->frame_offset) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            dprintf(avctx, "ignoring %x previously saved bits\n", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    s->num_saved_bits - s->frame_offset); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->packet_loss = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        s->packet_loss = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /** continue decoding */ | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |