From e66f7cca449dbd8f35a62f71ea250a0ff47e91bc Mon Sep 17 00:00:00 2001 From: rbultje Date: Mon, 16 Mar 2009 12:47:34 +0000 Subject: [PATCH] Merge code for packet reading in "old" (.ra, audio-only) Realmedia files and the newer (.rm, audio/video) files. See "[PATCH] rmdec.c: merge old/new packet reading code" thread on mailinglist. git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18005 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b --- libavformat/rmdec.c | 57 ++++++++++++++++------------------------------------- 1 file changed, 17 insertions(+), 40 deletions(-) diff --git a/libavformat/rmdec.c b/libavformat/rmdec.c index 3af429e92..a6e520a79 100644 --- a/libavformat/rmdec.c +++ b/libavformat/rmdec.c @@ -704,71 +704,48 @@ ff_rm_retrieve_cache (AVFormatContext *s, ByteIOContext *pb, static int rm_read_packet(AVFormatContext *s, AVPacket *pkt) { RMDemuxContext *rm = s->priv_data; - ByteIOContext *pb = s->pb; AVStream *st; - int i, len, res; + int i, len, res, seq = 1; int64_t timestamp, pos; int old_flags, flags; + for (;;) { if (rm->audio_pkt_cnt) { // If there are queued audio packet return them first st = s->streams[rm->audio_stream_num]; ff_rm_retrieve_cache(s, s->pb, st, st->priv_data, pkt); - } else if (rm->old_format) { + } else { + if (rm->old_format) { RMStream *ast; st = s->streams[0]; ast = st->priv_data; - if (st->codec->codec_id == CODEC_ID_RA_288) { - int x, y; - - for (y = 0; y < ast->sub_packet_h; y++) - for (x = 0; x < ast->sub_packet_h/2; x++) - if (get_buffer(pb, ast->pkt.data+x*2*ast->audio_framesize+y*ast->coded_framesize, ast->coded_framesize) <= 0) - return AVERROR(EIO); - rm->audio_stream_num = 0; - rm->audio_pkt_cnt = ast->sub_packet_h * ast->audio_framesize / st->codec->block_align - 1; - // Release first audio packet - av_new_packet(pkt, st->codec->block_align); - memcpy(pkt->data, ast->pkt.data, st->codec->block_align); //FIXME avoid this - pkt->flags |= PKT_FLAG_KEY; // Mark first packet as keyframe - pkt->stream_index = 0; - } else { - /* just read raw bytes */ - len = RAW_PACKET_SIZE; - len= av_get_packet(pb, pkt, len); - pkt->stream_index = 0; - if (len <= 0) { - return AVERROR(EIO); - } - pkt->size = len; - } - rm_ac3_swap_bytes(st, pkt); + timestamp = AV_NOPTS_VALUE; + len = !ast->audio_framesize ? RAW_PACKET_SIZE : + ast->coded_framesize * ast->sub_packet_h / 2; + flags = (seq++ == 1) ? 2 : 0; } else { - int seq=1; -resync: len=sync(s, ×tamp, &flags, &i, &pos); - if(len<0) - return AVERROR(EIO); st = s->streams[i]; + } + + if(len<0 || url_feof(s->pb)) + return AVERROR(EIO); old_flags = flags; res = ff_rm_parse_packet (s, s->pb, st, st->priv_data, len, pkt, &seq, &flags, ×tamp); if((old_flags&2) && (seq&0x7F) == 1) av_add_index_entry(st, pos, timestamp, 0, 0, AVINDEX_KEYFRAME); - if (res < 0) - goto resync; + if (res) + continue; + } if( (st->discard >= AVDISCARD_NONKEY && !(flags&2)) || st->discard >= AVDISCARD_ALL){ av_free_packet(pkt); - while (rm->audio_pkt_cnt > 0) { - ff_rm_retrieve_cache(s, s->pb, st, st->priv_data, pkt); - av_free_packet(pkt); - } - goto resync; - } + } else + break; } return 0; -- 2.11.4.GIT