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