| 1614 | } |
| 1615 | |
| 1616 | static int decode_packet(AVCodecContext *avctx, WMAProDecodeCtx *s, |
| 1617 | AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt) |
| 1618 | { |
| 1619 | GetBitContext* gb = &s->pgb; |
| 1620 | const uint8_t* buf = avpkt->data; |
| 1621 | int buf_size = avpkt->size; |
| 1622 | int num_bits_prev_frame; |
| 1623 | int packet_sequence_number; |
| 1624 | int ret; |
| 1625 | |
| 1626 | *got_frame_ptr = 0; |
| 1627 | |
| 1628 | if (!buf_size) { |
| 1629 | int i; |
| 1630 | |
| 1631 | /** Must output remaining samples after stream end. WMAPRO 5.1 created |
| 1632 | * by XWMA encoder don't though (maybe only 1/2ch streams need it). */ |
| 1633 | s->packet_done = 0; |
| 1634 | if (s->eof_done) |
| 1635 | return 0; |
| 1636 | |
| 1637 | /** clean output buffer and copy last IMDCT samples */ |
| 1638 | for (i = 0; i < s->nb_channels; i++) { |
| 1639 | memset(frame->extended_data[i], 0, |
| 1640 | s->samples_per_frame * sizeof(*s->channel[i].out)); |
| 1641 | |
| 1642 | memcpy(frame->extended_data[i], s->channel[i].out, |
| 1643 | s->samples_per_frame * sizeof(*s->channel[i].out) >> 1); |
| 1644 | } |
| 1645 | |
| 1646 | s->eof_done = 1; |
| 1647 | s->packet_done = 1; |
| 1648 | *got_frame_ptr = 1; |
| 1649 | return 0; |
| 1650 | } |
| 1651 | else if (s->packet_done || s->packet_loss) { |
| 1652 | s->packet_done = 0; |
| 1653 | |
| 1654 | /** sanity check for the buffer length */ |
| 1655 | if (avctx->codec_id == AV_CODEC_ID_WMAPRO && buf_size < avctx->block_align) { |
| 1656 | av_log(avctx, AV_LOG_ERROR, "Input packet too small (%d < %d)\n", |
| 1657 | buf_size, avctx->block_align); |
| 1658 | s->packet_loss = 1; |
| 1659 | return AVERROR_INVALIDDATA; |
| 1660 | } |
| 1661 | |
| 1662 | if (avctx->codec_id == AV_CODEC_ID_WMAPRO) { |
| 1663 | s->next_packet_start = buf_size - avctx->block_align; |
| 1664 | buf_size = avctx->block_align; |
| 1665 | } else { |
| 1666 | s->next_packet_start = buf_size - FFMIN(buf_size, avctx->block_align); |
| 1667 | buf_size = FFMIN(buf_size, avctx->block_align); |
| 1668 | } |
| 1669 | s->buf_bit_size = buf_size << 3; |
| 1670 | |
| 1671 | /** parse packet header */ |
| 1672 | ret = init_get_bits8(gb, buf, buf_size); |
| 1673 | if (ret < 0) |
no test coverage detected