asfdemux: Refactor multiple packet pull.
authorEdward Hervey <bilboed@bilboed.com>
Mon, 29 Jun 2009 09:10:42 +0000 (11:10 +0200)
committerEdward Hervey <bilboed@bilboed.com>
Mon, 29 Jun 2009 09:13:02 +0000 (11:13 +0200)
This also fixes a bug by which the first buffer (in a multi-packet mode)
passed to asf_demux_parse_packet() would have a GST_BUFFER_SIZE of the
full incoming buffer and not just of the single asf packet.

Fixes corrupted frames introduced by latest commit.

gst/asfdemux/gstasfdemux.c

index 6dac784d8360ffc68d150150824cf60389fb2c12..78d5db86d96c8086e1915a2d36ee05ff9147dddb 100644 (file)
@@ -1357,7 +1357,6 @@ gst_asf_demux_loop (GstASFDemux * demux)
   GstFlowReturn flow = GST_FLOW_OK;
   GstBuffer *buf = NULL;
   guint64 off;
-  guint n;
 
   if (G_UNLIKELY (demux->state == GST_ASF_DEMUX_STATE_HEADER)) {
     if (!gst_asf_demux_pull_headers (demux)) {
@@ -1391,29 +1390,40 @@ gst_asf_demux_loop (GstASFDemux * demux)
       goto read_failed;
   }
 
-  for (n = 0; n < demux->speed_packets; n++) {
-    GstBuffer *tmp = NULL, *sub = buf;
-
-    if (G_UNLIKELY (n != 0))
-      tmp = sub =
-          gst_buffer_create_sub (buf, n * demux->packet_size,
-          demux->packet_size);
+  if (G_LIKELY (demux->speed_packets == 1)) {
     /* FIXME: maybe we should just skip broken packets and error out only
      * after a few broken packets in a row? */
-    if (G_UNLIKELY (!gst_asf_demux_parse_packet (demux, sub)))
+    if (G_UNLIKELY (!gst_asf_demux_parse_packet (demux, buf)))
       goto parse_error;
-    if (G_UNLIKELY (n != 0))
-      gst_buffer_unref (tmp);
 
     flow = gst_asf_demux_push_complete_payloads (demux, FALSE);
 
     ++demux->packet;
 
-  }
+  } else {
+    guint n;
+    for (n = 0; n < demux->speed_packets; n++) {
+      GstBuffer *sub;
 
-  /* reset speed pull */
-  if (G_UNLIKELY (demux->speed_packets != 1))
+      sub =
+          gst_buffer_create_sub (buf, n * demux->packet_size,
+          demux->packet_size);
+      /* FIXME: maybe we should just skip broken packets and error out only
+       * after a few broken packets in a row? */
+      if (G_UNLIKELY (!gst_asf_demux_parse_packet (demux, sub)))
+        goto parse_error;
+
+      gst_buffer_unref (sub);
+
+      flow = gst_asf_demux_push_complete_payloads (demux, FALSE);
+
+      ++demux->packet;
+
+    }
+
+    /* reset speed pull */
     demux->speed_packets = 1;
+  }
 
   gst_buffer_unref (buf);