gst/wavparse/gstwavparse.c: Add EOS logic for the push-based mode too. Fixes #476514.
authorSebastian Dröge <slomo@circular-chaos.org>
Thu, 13 Sep 2007 12:37:56 +0000 (12:37 +0000)
committerSebastian Dröge <slomo@circular-chaos.org>
Thu, 13 Sep 2007 12:37:56 +0000 (12:37 +0000)
Original commit message from CVS:
* gst/wavparse/gstwavparse.c: (gst_wavparse_perform_eos),
(gst_wavparse_loop), (gst_wavparse_chain):
Add EOS logic for the push-based mode too. Fixes #476514.

ChangeLog
gst/wavparse/gstwavparse.c

index 029018c..4258fb7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-13  Sebastian Dröge  <slomo@circular-chaos.org>
+
+       * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_eos),
+       (gst_wavparse_loop), (gst_wavparse_chain):
+       Add EOS logic for the push-based mode too. Fixes #476514.
+
 2007-09-12  Wim Taymans  <wim.taymans@gmail.com>
 
        * gst/law/alaw-encode.c: (gst_alawenc_init), (gst_alawenc_chain):
index 43f1160..2f698c9 100644 (file)
@@ -1703,6 +1703,43 @@ push_error:
 }
 
 static void
+gst_wavparse_perform_eos (GstWavParse * wav, GstFlowReturn ret)
+{
+  if (GST_FLOW_IS_FATAL (ret) || ret == GST_FLOW_NOT_LINKED) {
+    if (ret == GST_FLOW_UNEXPECTED) {
+      /* add pad before we perform EOS */
+      if (G_UNLIKELY (wav->first)) {
+        wav->first = FALSE;
+        gst_wavparse_add_src_pad (wav, NULL);
+      }
+      /* perform EOS logic */
+      if (wav->segment.flags & GST_SEEK_FLAG_SEGMENT) {
+        GstClockTime stop;
+
+        if ((stop = wav->segment.stop) == -1)
+          stop = wav->segment.duration;
+
+        gst_element_post_message (GST_ELEMENT_CAST (wav),
+            gst_message_new_segment_done (GST_OBJECT_CAST (wav),
+                wav->segment.format, stop));
+      } else {
+        if (wav->srcpad != NULL)
+          gst_pad_push_event (wav->srcpad, gst_event_new_eos ());
+      }
+    } else {
+      /* for fatal errors we post an error message, post the error
+       * first so the app knows about the error first. */
+      GST_ELEMENT_ERROR (wav, STREAM, FAILED,
+          (_("Internal data flow error.")),
+          ("streaming task paused, reason %s (%d)", gst_flow_get_name (ret),
+              ret));
+      if (wav->srcpad != NULL)
+        gst_pad_push_event (wav->srcpad, gst_event_new_eos ());
+    }
+  }
+}
+
+static void
 gst_wavparse_loop (GstPad * pad)
 {
   GstFlowReturn ret;
@@ -1746,37 +1783,7 @@ pause:
     wav->segment_running = FALSE;
     gst_pad_pause_task (pad);
 
-    if (GST_FLOW_IS_FATAL (ret) || ret == GST_FLOW_NOT_LINKED) {
-      if (ret == GST_FLOW_UNEXPECTED) {
-        /* add pad before we perform EOS */
-        if (G_UNLIKELY (wav->first)) {
-          wav->first = FALSE;
-          gst_wavparse_add_src_pad (wav, NULL);
-        }
-        /* perform EOS logic */
-        if (wav->segment.flags & GST_SEEK_FLAG_SEGMENT) {
-          GstClockTime stop;
-
-          if ((stop = wav->segment.stop) == -1)
-            stop = wav->segment.duration;
-
-          gst_element_post_message (GST_ELEMENT_CAST (wav),
-              gst_message_new_segment_done (GST_OBJECT_CAST (wav),
-                  wav->segment.format, stop));
-        } else {
-          if (wav->srcpad != NULL)
-            gst_pad_push_event (wav->srcpad, gst_event_new_eos ());
-        }
-      } else {
-        /* for fatal errors we post an error message, post the error
-         * first so the app knows about the error first. */
-        GST_ELEMENT_ERROR (wav, STREAM, FAILED,
-            (_("Internal data flow error.")),
-            ("streaming task paused, reason %s (%d)", reason, ret));
-        if (wav->srcpad != NULL)
-          gst_pad_push_event (wav->srcpad, gst_event_new_eos ());
-      }
-    }
+    gst_wavparse_perform_eos (wav, ret);
     return;
   }
 }
@@ -1815,11 +1822,14 @@ gst_wavparse_chain (GstPad * pad, GstBuffer * buf)
       /* fall-through */
     case GST_WAVPARSE_DATA:
       if ((ret = gst_wavparse_stream_data (wav)) != GST_FLOW_OK)
-        goto done;
+        goto eos;
       break;
     default:
       g_assert_not_reached ();
   }
+eos:
+  gst_wavparse_perform_eos (wav, ret);
+  /* fallthrough */
 done:
   return ret;
 }