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