Mercurial > libavcodec.hg
comparison wmaprodec.c @ 10127:b17566dcfcc9 libavcodec
reduce output buffer needs
(fixes playback of some multichannel files)
author | faust3 |
---|---|
date | Sat, 05 Sep 2009 10:07:55 +0000 |
parents | 6ff9347c8042 |
children | da4c9cfcba71 |
comparison
equal
deleted
inserted
replaced
10126:6ff9347c8042 | 10127:b17566dcfcc9 |
---|---|
192 uint8_t packet_sequence_number; ///< current packet number | 192 uint8_t packet_sequence_number; ///< current packet number |
193 int num_saved_bits; ///< saved number of bits | 193 int num_saved_bits; ///< saved number of bits |
194 int frame_offset; ///< frame offset in the bit reservoir | 194 int frame_offset; ///< frame offset in the bit reservoir |
195 int subframe_offset; ///< subframe offset in the bit reservoir | 195 int subframe_offset; ///< subframe offset in the bit reservoir |
196 uint8_t packet_loss; ///< set in case of bitstream error | 196 uint8_t packet_loss; ///< set in case of bitstream error |
197 uint8_t output_buffer_full; ///< flag indicating that the output buffer is full | |
197 | 198 |
198 /* frame decode state */ | 199 /* frame decode state */ |
199 uint32_t frame_num; ///< current frame number (not used for decoding) | 200 uint32_t frame_num; ///< current frame number (not used for decoding) |
200 GetBitContext gb; ///< bitstream reader context | 201 GetBitContext gb; ///< bitstream reader context |
201 int buf_bit_size; ///< buffer size in bits | 202 int buf_bit_size; ///< buffer size in bits |
203 float* samples_start; ///< start samplebuffer pointer | |
202 float* samples; ///< current samplebuffer pointer | 204 float* samples; ///< current samplebuffer pointer |
203 float* samples_end; ///< maximum samplebuffer pointer | 205 float* samples_end; ///< maximum samplebuffer pointer |
204 uint8_t drc_gain; ///< gain for the DRC tool | 206 uint8_t drc_gain; ///< gain for the DRC tool |
205 int8_t skip_frame; ///< skip output step | 207 int8_t skip_frame; ///< skip output step |
206 int8_t parsed_all_subframes; ///< all subframes decoded? | 208 int8_t parsed_all_subframes; ///< all subframes decoded? |
1254 int len = 0; | 1256 int len = 0; |
1255 int i; | 1257 int i; |
1256 | 1258 |
1257 /** check for potential output buffer overflow */ | 1259 /** check for potential output buffer overflow */ |
1258 if (s->num_channels * s->samples_per_frame > s->samples_end - s->samples) { | 1260 if (s->num_channels * s->samples_per_frame > s->samples_end - s->samples) { |
1259 av_log(s->avctx, AV_LOG_ERROR, | 1261 /** return an error if no frame could be decoded at all */ |
1260 "not enough space for the output samples\n"); | 1262 if (s->samples_start == s->samples) { |
1261 s->packet_loss = 1; | 1263 av_log(s->avctx, AV_LOG_ERROR, |
1264 "not enough space for the output samples\n"); | |
1265 s->packet_loss = 1; | |
1266 } else | |
1267 s->output_buffer_full = 1; | |
1262 return 0; | 1268 return 0; |
1263 } | 1269 } |
1264 | 1270 |
1265 /** get frame length */ | 1271 /** get frame length */ |
1266 if (s->len_prefix) | 1272 if (s->len_prefix) |
1449 int more_frames = 1; | 1455 int more_frames = 1; |
1450 int num_bits_prev_frame; | 1456 int num_bits_prev_frame; |
1451 int packet_sequence_number; | 1457 int packet_sequence_number; |
1452 | 1458 |
1453 s->samples = data; | 1459 s->samples = data; |
1460 s->samples_start = data; | |
1454 s->samples_end = (float*)((int8_t*)data + *data_size); | 1461 s->samples_end = (float*)((int8_t*)data + *data_size); |
1462 *data_size = 0; | |
1463 | |
1464 if (!s->output_buffer_full) { | |
1455 s->buf_bit_size = buf_size << 3; | 1465 s->buf_bit_size = buf_size << 3; |
1456 | |
1457 | |
1458 *data_size = 0; | |
1459 | 1466 |
1460 /** sanity check for the buffer length */ | 1467 /** sanity check for the buffer length */ |
1461 if (buf_size < avctx->block_align) | 1468 if (buf_size < avctx->block_align) |
1462 return 0; | 1469 return 0; |
1463 | 1470 |
1496 dprintf(avctx, "ignoring %x previously saved bits\n", | 1503 dprintf(avctx, "ignoring %x previously saved bits\n", |
1497 s->num_saved_bits - s->frame_offset); | 1504 s->num_saved_bits - s->frame_offset); |
1498 } | 1505 } |
1499 | 1506 |
1500 s->packet_loss = 0; | 1507 s->packet_loss = 0; |
1508 | |
1509 } else { | |
1510 /** continue decoding */ | |
1511 s->output_buffer_full = 0; | |
1512 more_frames = decode_frame(s); | |
1513 } | |
1514 | |
1501 /** decode the rest of the packet */ | 1515 /** decode the rest of the packet */ |
1502 while (!s->packet_loss && more_frames && | 1516 while (!s->packet_loss && !s->output_buffer_full && more_frames && |
1503 remaining_bits(s, gb) > s->log2_frame_size) { | 1517 remaining_bits(s, gb) > s->log2_frame_size) { |
1504 int frame_size = show_bits(gb, s->log2_frame_size); | 1518 int frame_size = show_bits(gb, s->log2_frame_size); |
1505 | 1519 |
1506 /** there is enough data for a full frame */ | 1520 /** there is enough data for a full frame */ |
1507 if (remaining_bits(s, gb) >= frame_size && frame_size > 0) { | 1521 if (remaining_bits(s, gb) >= frame_size && frame_size > 0) { |
1515 } | 1529 } |
1516 } else | 1530 } else |
1517 more_frames = 0; | 1531 more_frames = 0; |
1518 } | 1532 } |
1519 | 1533 |
1520 if (!s->packet_loss && remaining_bits(s, gb) > 0) { | 1534 if (!s->output_buffer_full && !s->packet_loss && |
1535 remaining_bits(s, gb) > 0) { | |
1521 /** save the rest of the data so that it can be decoded | 1536 /** save the rest of the data so that it can be decoded |
1522 with the next packet */ | 1537 with the next packet */ |
1523 save_bits(s, gb, remaining_bits(s, gb), 0); | 1538 save_bits(s, gb, remaining_bits(s, gb), 0); |
1524 } | 1539 } |
1525 | 1540 |
1526 *data_size = (int8_t *)s->samples - (int8_t *)data; | 1541 *data_size = (int8_t *)s->samples - (int8_t *)data; |
1527 | 1542 |
1528 return avctx->block_align; | 1543 return (s->output_buffer_full)?0: avctx->block_align; |
1529 } | 1544 } |
1530 | 1545 |
1531 /** | 1546 /** |
1532 *@brief Clear decoder buffers (for seeking). | 1547 *@brief Clear decoder buffers (for seeking). |
1533 *@param avctx codec context | 1548 *@param avctx codec context |