comparison wmaprodec.c @ 10139:de9335d4b6b1 libavcodec

do not decode more than one audio frame in a decode packet call
author faust3
date Sun, 06 Sep 2009 08:16:26 +0000
parents a3e378408d5c
children b30c708ce76a
comparison
equal deleted inserted replaced
10138:a3e378408d5c 10139:de9335d4b6b1
193 uint8_t packet_sequence_number; ///< current packet number 193 uint8_t packet_sequence_number; ///< current packet number
194 int num_saved_bits; ///< saved number of bits 194 int num_saved_bits; ///< saved number of bits
195 int frame_offset; ///< frame offset in the bit reservoir 195 int frame_offset; ///< frame offset in the bit reservoir
196 int subframe_offset; ///< subframe offset in the bit reservoir 196 int subframe_offset; ///< subframe offset in the bit reservoir
197 uint8_t packet_loss; ///< set in case of bitstream error 197 uint8_t packet_loss; ///< set in case of bitstream error
198 uint8_t output_buffer_full; ///< flag indicating that the output buffer is full 198 uint8_t packet_done; ///< set when a packet is fully decoded
199 199
200 /* frame decode state */ 200 /* frame decode state */
201 uint32_t frame_num; ///< current frame number (not used for decoding) 201 uint32_t frame_num; ///< current frame number (not used for decoding)
202 GetBitContext gb; ///< bitstream reader context 202 GetBitContext gb; ///< bitstream reader context
203 int buf_bit_size; ///< buffer size in bits 203 int buf_bit_size; ///< buffer size in bits
204 float* samples_start; ///< start samplebuffer pointer
205 float* samples; ///< current samplebuffer pointer 204 float* samples; ///< current samplebuffer pointer
206 float* samples_end; ///< maximum samplebuffer pointer 205 float* samples_end; ///< maximum samplebuffer pointer
207 uint8_t drc_gain; ///< gain for the DRC tool 206 uint8_t drc_gain; ///< gain for the DRC tool
208 int8_t skip_frame; ///< skip output step 207 int8_t skip_frame; ///< skip output step
209 int8_t parsed_all_subframes; ///< all subframes decoded? 208 int8_t parsed_all_subframes; ///< all subframes decoded?
1256 int i; 1255 int i;
1257 1256
1258 /** check for potential output buffer overflow */ 1257 /** check for potential output buffer overflow */
1259 if (s->num_channels * s->samples_per_frame > s->samples_end - s->samples) { 1258 if (s->num_channels * s->samples_per_frame > s->samples_end - s->samples) {
1260 /** return an error if no frame could be decoded at all */ 1259 /** return an error if no frame could be decoded at all */
1261 if (s->samples_start == s->samples) { 1260 av_log(s->avctx, AV_LOG_ERROR,
1262 av_log(s->avctx, AV_LOG_ERROR, 1261 "not enough space for the output samples\n");
1263 "not enough space for the output samples\n"); 1262 s->packet_loss = 1;
1264 s->packet_loss = 1;
1265 } else
1266 s->output_buffer_full = 1;
1267 return 0; 1263 return 0;
1268 } 1264 }
1269 1265
1270 /** get frame length */ 1266 /** get frame length */
1271 if (s->len_prefix) 1267 if (s->len_prefix)
1449 { 1445 {
1450 WMAProDecodeCtx *s = avctx->priv_data; 1446 WMAProDecodeCtx *s = avctx->priv_data;
1451 GetBitContext* gb = &s->pgb; 1447 GetBitContext* gb = &s->pgb;
1452 const uint8_t* buf = avpkt->data; 1448 const uint8_t* buf = avpkt->data;
1453 int buf_size = avpkt->size; 1449 int buf_size = avpkt->size;
1454 int more_frames = 1;
1455 int num_bits_prev_frame; 1450 int num_bits_prev_frame;
1456 int packet_sequence_number; 1451 int packet_sequence_number;
1457 1452
1458 s->samples = data; 1453 s->samples = data;
1459 s->samples_start = data;
1460 s->samples_end = (float*)((int8_t*)data + *data_size); 1454 s->samples_end = (float*)((int8_t*)data + *data_size);
1461 *data_size = 0; 1455 *data_size = 0;
1462 1456
1463 if (!s->output_buffer_full || s->packet_loss) { 1457 if (s->packet_done || s->packet_loss) {
1464 s->output_buffer_full = 0; 1458 s->packet_done = 0;
1465 s->buf_bit_size = buf_size << 3; 1459 s->buf_bit_size = buf_size << 3;
1466 1460
1467 /** sanity check for the buffer length */ 1461 /** sanity check for the buffer length */
1468 if (buf_size < avctx->block_align) 1462 if (buf_size < avctx->block_align)
1469 return 0; 1463 return 0;
1505 } 1499 }
1506 1500
1507 s->packet_loss = 0; 1501 s->packet_loss = 0;
1508 1502
1509 } else { 1503 } else {
1510 /** continue decoding */ 1504 int frame_size;
1511 s->output_buffer_full = 0; 1505 if (remaining_bits(s, gb) > s->log2_frame_size &&
1512 more_frames = decode_frame(s); 1506 (frame_size = show_bits(gb, s->log2_frame_size)) &&
1513 } 1507 frame_size <= remaining_bits(s, gb)) {
1514
1515 /** decode the rest of the packet */
1516 while (!s->packet_loss && !s->output_buffer_full && more_frames &&
1517 remaining_bits(s, gb) > s->log2_frame_size) {
1518 int frame_size = show_bits(gb, s->log2_frame_size);
1519
1520 /** there is enough data for a full frame */
1521 if (remaining_bits(s, gb) >= frame_size && frame_size > 0) {
1522 save_bits(s, gb, frame_size, 0); 1508 save_bits(s, gb, frame_size, 0);
1523 1509 s->packet_done = !decode_frame(s);
1524 /** decode the frame */
1525 more_frames = decode_frame(s);
1526
1527 } else 1510 } else
1528 more_frames = 0; 1511 s->packet_done = 1;
1529 } 1512 }
1530 1513
1531 if (!s->output_buffer_full && !s->packet_loss && 1514 if (s->packet_done && !s->packet_loss &&
1532 remaining_bits(s, gb) > 0) { 1515 remaining_bits(s, gb) > 0) {
1533 /** save the rest of the data so that it can be decoded 1516 /** save the rest of the data so that it can be decoded
1534 with the next packet */ 1517 with the next packet */
1535 save_bits(s, gb, remaining_bits(s, gb), 0); 1518 save_bits(s, gb, remaining_bits(s, gb), 0);
1536 } 1519 }
1537 1520
1538 *data_size = (int8_t *)s->samples - (int8_t *)data; 1521 *data_size = (int8_t *)s->samples - (int8_t *)data;
1539 1522
1540 return (s->output_buffer_full && !s->packet_loss)?0: avctx->block_align; 1523 return (!s->packet_done && !s->packet_loss)?0: avctx->block_align;
1541 } 1524 }
1542 1525
1543 /** 1526 /**
1544 *@brief Clear decoder buffers (for seeking). 1527 *@brief Clear decoder buffers (for seeking).
1545 *@param avctx codec context 1528 *@param avctx codec context