# HG changeset patch # User rbultje # Date 1229188691 0 # Node ID 27f4b31bc790db7b210f36ed229d4b75102ee978 # Parent d1ad76625df30f190577dbb6ce523f2d4bb6aa5c 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. diff -r d1ad76625df3 -r 27f4b31bc790 asf.c --- a/asf.c Sat Dec 13 17:04:22 2008 +0000 +++ b/asf.c Sat Dec 13 17:18:11 2008 +0000 @@ -705,7 +705,13 @@ 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 @@ 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 @@ 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