|
|
|
@@ -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; |
|
|
|
|