From f27544fd5b3b0d7663e79422d0215f80ef952a6b Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Sat, 13 Dec 2008 17:18:11 +0000 Subject: [PATCH] Separate the packet fetching from the data reading, so that the data reading function is assured to parse at most one packet. This makes this function useful for ASF data packet parsing in a "push-mode" in addition to the current "pull-mode", and therefore allows for use of these functions in, for example, the RTSP demuxer (for MS-RTSP support). Tested to give identical output before and after for regular ASF playback, also see discussion in the ML thread "[PATCH] asf.c: move packet_time_start=0 statement". Testsuite also works after the patch, tested by Benoit Fouet. Originally committed as revision 16108 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/asf.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/libavformat/asf.c b/libavformat/asf.c index 247cc2cc2a..18eafdedbe 100644 --- a/libavformat/asf.c +++ b/libavformat/asf.c @@ -705,7 +705,13 @@ static int asf_read_frame_header(AVFormatContext *s){ return 0; } -static int asf_read_packet(AVFormatContext *s, AVPacket *pkt) +/** + * Parse data from individual ASF packets (which were previously loaded + * with asf_get_packet()). + * @returns 0 if data was stored in pkt, <0 on error or 1 if more ASF + * packets need to be loaded (through asf_get_packet()) + */ +static int asf_parse_packet(AVFormatContext *s, AVPacket *pkt) { ASFContext *asf = s->priv_data; ASFStream *asf_st = 0; @@ -726,11 +732,7 @@ static int asf_read_packet(AVFormatContext *s, AVPacket *pkt) if (asf->data_object_size != (uint64_t)-1 && (asf->packet_pos - asf->data_object_offset >= asf->data_object_size)) return AVERROR(EIO); /* Do not exceed the size of the data object */ - ret = asf_get_packet(s); - if (ret < 0) - assert(asf->packet_size_left < FRAME_HEADER_SIZE || asf->packet_segments < 1); - asf->packet_time_start = 0; - continue; + return 1; } if (asf->packet_time_start == 0) { if(asf_read_frame_header(s) < 0){ @@ -877,6 +879,24 @@ static int asf_read_packet(AVFormatContext *s, AVPacket *pkt) return 0; } +static int asf_read_packet(AVFormatContext *s, AVPacket *pkt) +{ + ASFContext *asf = s->priv_data; + + for (;;) { + int ret; + + /* parse cached packets, if any */ + if ((ret = asf_parse_packet(s, pkt)) <= 0) + return ret; + if ((ret = asf_get_packet(s)) < 0) + assert(asf->packet_size_left < FRAME_HEADER_SIZE || asf->packet_segments < 1); + asf->packet_time_start = 0; + } + + return 0; +} + // Added to support seeking after packets have been read // If information is not reset, read_packet fails due to // leftover information from previous reads