From 7ccefd08f67fc364eab7bf45d823617ebbb95b0c Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Mon, 9 Mar 2009 22:02:06 +0000 Subject: [PATCH] Revert to r17908. Originally committed as revision 17918 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/rmdec.c | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/libavformat/rmdec.c b/libavformat/rmdec.c index 4be7397174..3bd0f0dd9a 100644 --- a/libavformat/rmdec.c +++ b/libavformat/rmdec.c @@ -468,7 +468,7 @@ static int sync(AVFormatContext *s, int64_t *timestamp, int *flags, int *stream_ skip: /* skip packet if unknown number */ url_fskip(pb, len); - rm->remaining_len = 0; + rm->remaining_len -= len; continue; } *stream_index= i; @@ -691,8 +691,9 @@ 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, seq = 1; + int i, len; int64_t timestamp, pos; int flags; @@ -701,19 +702,37 @@ static int rm_read_packet(AVFormatContext *s, AVPacket *pkt) st = s->streams[rm->audio_stream_num]; ff_rm_retrieve_cache(s, s->pb, st, st->priv_data, pkt); } else if (rm->old_format) { - RMStream *ast = s->streams[0]->priv_data; - int res, y, h = ast->audio_framesize ? ast->sub_packet_h : 1; - - timestamp = AV_NOPTS_VALUE; - len = ast->audio_framesize ? ast->coded_framesize * h / 2 : RAW_PACKET_SIZE; - for (y = 0; y < h; y++) { - flags = !y ? 2 : 0; - res = ff_rm_parse_packet(s, s->pb, s->streams[0], ast, len, pkt, - &seq, &flags, ×tamp); + 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; } - if (res < 0) - return res; + rm_ac3_swap_bytes(st, pkt); } else { + int seq=1; resync: len=sync(s, ×tamp, &flags, &i, &pos); if(len<0)