comparison wmaprodec.c @ 10126:6ff9347c8042 libavcodec

store packet GetBitContext in the decoder context
author faust3
date Sat, 05 Sep 2009 09:56:06 +0000
parents e1bd75a1eab2
children b17566dcfcc9
comparison
equal deleted inserted replaced
10125:67b0747c4192 10126:6ff9347c8042
186 int16_t sfb_offsets[WMAPRO_BLOCK_SIZES][MAX_BANDS]; ///< scale factor band offsets (multiples of 4) 186 int16_t sfb_offsets[WMAPRO_BLOCK_SIZES][MAX_BANDS]; ///< scale factor band offsets (multiples of 4)
187 int8_t sf_offsets[WMAPRO_BLOCK_SIZES][WMAPRO_BLOCK_SIZES][MAX_BANDS]; ///< scale factor resample matrix 187 int8_t sf_offsets[WMAPRO_BLOCK_SIZES][WMAPRO_BLOCK_SIZES][MAX_BANDS]; ///< scale factor resample matrix
188 int16_t subwoofer_cutoffs[WMAPRO_BLOCK_SIZES]; ///< subwoofer cutoff values 188 int16_t subwoofer_cutoffs[WMAPRO_BLOCK_SIZES]; ///< subwoofer cutoff values
189 189
190 /* packet decode state */ 190 /* packet decode state */
191 GetBitContext pgb; ///< bitstream reader context for the packet
191 uint8_t packet_sequence_number; ///< current packet number 192 uint8_t packet_sequence_number; ///< current packet number
192 int num_saved_bits; ///< saved number of bits 193 int num_saved_bits; ///< saved number of bits
193 int frame_offset; ///< frame offset in the bit reservoir 194 int frame_offset; ///< frame offset in the bit reservoir
194 int subframe_offset; ///< subframe offset in the bit reservoir 195 int subframe_offset; ///< subframe offset in the bit reservoir
195 uint8_t packet_loss; ///< set in case of bitstream error 196 uint8_t packet_loss; ///< set in case of bitstream error
1439 *@return number of bytes that were read from the input buffer 1440 *@return number of bytes that were read from the input buffer
1440 */ 1441 */
1441 static int decode_packet(AVCodecContext *avctx, 1442 static int decode_packet(AVCodecContext *avctx,
1442 void *data, int *data_size, AVPacket* avpkt) 1443 void *data, int *data_size, AVPacket* avpkt)
1443 { 1444 {
1444 GetBitContext gb;
1445 WMAProDecodeCtx *s = avctx->priv_data; 1445 WMAProDecodeCtx *s = avctx->priv_data;
1446 GetBitContext* gb = &s->pgb;
1446 const uint8_t* buf = avpkt->data; 1447 const uint8_t* buf = avpkt->data;
1447 int buf_size = avpkt->size; 1448 int buf_size = avpkt->size;
1448 int more_frames = 1; 1449 int more_frames = 1;
1449 int num_bits_prev_frame; 1450 int num_bits_prev_frame;
1450 int packet_sequence_number; 1451 int packet_sequence_number;
1461 return 0; 1462 return 0;
1462 1463
1463 buf_size = avctx->block_align; 1464 buf_size = avctx->block_align;
1464 1465
1465 /** parse packet header */ 1466 /** parse packet header */
1466 init_get_bits(&gb, buf, s->buf_bit_size); 1467 init_get_bits(gb, buf, s->buf_bit_size);
1467 packet_sequence_number = get_bits(&gb, 4); 1468 packet_sequence_number = get_bits(gb, 4);
1468 skip_bits(&gb, 2); 1469 skip_bits(gb, 2);
1469 1470
1470 /** get number of bits that need to be added to the previous frame */ 1471 /** get number of bits that need to be added to the previous frame */
1471 num_bits_prev_frame = get_bits(&gb, s->log2_frame_size); 1472 num_bits_prev_frame = get_bits(gb, s->log2_frame_size);
1472 dprintf(avctx, "packet[%d]: nbpf %x\n", avctx->frame_number, 1473 dprintf(avctx, "packet[%d]: nbpf %x\n", avctx->frame_number,
1473 num_bits_prev_frame); 1474 num_bits_prev_frame);
1474 1475
1475 /** check for packet loss */ 1476 /** check for packet loss */
1476 if (!s->packet_loss && 1477 if (!s->packet_loss &&
1482 s->packet_sequence_number = packet_sequence_number; 1483 s->packet_sequence_number = packet_sequence_number;
1483 1484
1484 if (num_bits_prev_frame > 0) { 1485 if (num_bits_prev_frame > 0) {
1485 /** append the previous frame data to the remaining data from the 1486 /** append the previous frame data to the remaining data from the
1486 previous packet to create a full frame */ 1487 previous packet to create a full frame */
1487 save_bits(s, &gb, num_bits_prev_frame, 1); 1488 save_bits(s, gb, num_bits_prev_frame, 1);
1488 dprintf(avctx, "accumulated %x bits of frame data\n", 1489 dprintf(avctx, "accumulated %x bits of frame data\n",
1489 s->num_saved_bits - s->frame_offset); 1490 s->num_saved_bits - s->frame_offset);
1490 1491
1491 /** decode the cross packet frame if it is valid */ 1492 /** decode the cross packet frame if it is valid */
1492 if (!s->packet_loss) 1493 if (!s->packet_loss)
1497 } 1498 }
1498 1499
1499 s->packet_loss = 0; 1500 s->packet_loss = 0;
1500 /** decode the rest of the packet */ 1501 /** decode the rest of the packet */
1501 while (!s->packet_loss && more_frames && 1502 while (!s->packet_loss && more_frames &&
1502 remaining_bits(s, &gb) > s->log2_frame_size) { 1503 remaining_bits(s, gb) > s->log2_frame_size) {
1503 int frame_size = show_bits(&gb, s->log2_frame_size); 1504 int frame_size = show_bits(gb, s->log2_frame_size);
1504 1505
1505 /** there is enough data for a full frame */ 1506 /** there is enough data for a full frame */
1506 if (remaining_bits(s, &gb) >= frame_size && frame_size > 0) { 1507 if (remaining_bits(s, gb) >= frame_size && frame_size > 0) {
1507 save_bits(s, &gb, frame_size, 0); 1508 save_bits(s, gb, frame_size, 0);
1508 1509
1509 /** decode the frame */ 1510 /** decode the frame */
1510 more_frames = decode_frame(s); 1511 more_frames = decode_frame(s);
1511 1512
1512 if (!more_frames) { 1513 if (!more_frames) {
1514 } 1515 }
1515 } else 1516 } else
1516 more_frames = 0; 1517 more_frames = 0;
1517 } 1518 }
1518 1519
1519 if (!s->packet_loss && remaining_bits(s, &gb) > 0) { 1520 if (!s->packet_loss && remaining_bits(s, gb) > 0) {
1520 /** save the rest of the data so that it can be decoded 1521 /** save the rest of the data so that it can be decoded
1521 with the next packet */ 1522 with the next packet */
1522 save_bits(s, &gb, remaining_bits(s, &gb), 0); 1523 save_bits(s, gb, remaining_bits(s, gb), 0);
1523 } 1524 }
1524 1525
1525 *data_size = (int8_t *)s->samples - (int8_t *)data; 1526 *data_size = (int8_t *)s->samples - (int8_t *)data;
1526 1527
1527 return avctx->block_align; 1528 return avctx->block_align;