Mercurial > libavcodec.hg
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 |