[FFmpeg-cvslog] r16108 - trunk/libavformat/asf.c

rbultje subversion
Sat Dec 13 18:18:11 CET 2008


Author: rbultje
Date: Sat Dec 13 18:18:11 2008
New Revision: 16108

Log:
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.



Modified:
   trunk/libavformat/asf.c

Modified: trunk/libavformat/asf.c
==============================================================================
--- trunk/libavformat/asf.c	(original)
+++ trunk/libavformat/asf.c	Sat Dec 13 18:18:11 2008
@@ -705,7 +705,13 @@ static int asf_read_frame_header(AVForma
     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(AVFormatConte
             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(AVFormatConte
     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




More information about the ffmpeg-cvslog mailing list