Mercurial > libavformat.hg
changeset 4732:0d7a569678a4 libavformat
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.
author | rbultje |
---|---|
date | Mon, 16 Mar 2009 12:47:34 +0000 |
parents | 18bcd89f5809 |
children | 7fbb4c4b3e3f |
files | rmdec.c |
diffstat | 1 files changed, 18 insertions(+), 41 deletions(-) [+] |
line wrap: on
line diff
--- a/rmdec.c Mon Mar 16 06:46:57 2009 +0000 +++ b/rmdec.c Mon Mar 16 12:47:34 2009 +0000 @@ -704,71 +704,48 @@ 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; + 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 { + len=sync(s, ×tamp, &flags, &i, &pos); + st = s->streams[i]; + } - 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) { + if(len<0 || url_feof(s->pb)) return AVERROR(EIO); - } - pkt->size = len; - } - rm_ac3_swap_bytes(st, pkt); - } else { - int seq=1; -resync: - len=sync(s, ×tamp, &flags, &i, &pos); - if(len<0) - return AVERROR(EIO); - st = s->streams[i]; 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;