summaryrefslogtreecommitdiff
path: root/libavformat/rmdec.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2009-03-09 22:02:06 +0000
committerRonald S. Bultje <rsbultje@gmail.com>2009-03-09 22:02:06 +0000
commit7ccefd08f67fc364eab7bf45d823617ebbb95b0c (patch)
tree69198e13446efa35d4ba86207e71d4d441d4c6b8 /libavformat/rmdec.c
parentd2af5697109519c65dcdd1fb42469a4ba03a3372 (diff)
Revert to r17908.
Originally committed as revision 17918 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/rmdec.c')
-rw-r--r--libavformat/rmdec.c45
1 files 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, &timestamp);
+ 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, &timestamp, &flags, &i, &pos);
if(len<0)