diff --git a/libavformat/rmdec.c b/libavformat/rmdec.c index 2f64a9427a..533a1a59b0 100644 --- a/libavformat/rmdec.c +++ b/libavformat/rmdec.c @@ -632,6 +632,27 @@ ff_rm_parse_packet (AVFormatContext *s, AVStream *st, int len, AVPacket *pkt, return 0; } +static void +ff_rm_retrieve_cache (AVFormatContext *s, AVStream *st, AVPacket *pkt) +{ + ByteIOContext *pb = &s->pb; + RMContext *rm = s->priv_data; + + assert (rm->audio_pkt_cnt > 0); + + if (st->codec->codec_id == CODEC_ID_AAC) + av_get_packet(pb, pkt, rm->sub_packet_lengths[rm->sub_packet_cnt - rm->audio_pkt_cnt]); + else { + av_new_packet(pkt, st->codec->block_align); + memcpy(pkt->data, rm->audiobuf + st->codec->block_align * + (rm->sub_packet_h * rm->audio_framesize / st->codec->block_align - rm->audio_pkt_cnt), + st->codec->block_align); + } + rm->audio_pkt_cnt--; + pkt->flags = 0; + pkt->stream_index = st->index; +} + static int rm_read_packet(AVFormatContext *s, AVPacket *pkt) { RMContext *rm = s->priv_data; @@ -645,17 +666,7 @@ static int rm_read_packet(AVFormatContext *s, AVPacket *pkt) if (rm->audio_pkt_cnt) { // If there are queued audio packet return them first st = s->streams[rm->audio_stream_num]; - if (st->codec->codec_id == CODEC_ID_AAC) - av_get_packet(pb, pkt, rm->sub_packet_lengths[rm->sub_packet_cnt - rm->audio_pkt_cnt]); - else { - av_new_packet(pkt, st->codec->block_align); - memcpy(pkt->data, rm->audiobuf + st->codec->block_align * - (rm->sub_packet_h * rm->audio_framesize / st->codec->block_align - rm->audio_pkt_cnt), - st->codec->block_align); - } - rm->audio_pkt_cnt--; - pkt->flags = 0; - pkt->stream_index = st->index; + ff_rm_retrieve_cache(s, st, pkt); } else if (rm->old_format) { st = s->streams[0]; if (st->codec->codec_id == CODEC_ID_RA_288) {