MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / decode_packet

Function decode_packet

libavcodec/wmaprodec.c:1616–1807  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1614}
1615
1616static 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)

Callers 2

wmapro_decode_packetFunction · 0.70
xma_decode_packetFunction · 0.70

Calls 9

av_logFunction · 0.85
init_get_bits8Function · 0.85
skip_bitsFunction · 0.85
get_bits_countFunction · 0.85
show_bitsFunction · 0.85
get_bitsFunction · 0.70
save_bitsFunction · 0.70
decode_frameFunction · 0.70
remaining_bitsFunction · 0.70

Tested by

no test coverage detected