audiodecoder: Push pending events before sending EOS.
authorMathieu Duponchelle <mathieu.duponchelle@opencreed.com>
Fri, 28 Nov 2014 14:06:27 +0000 (15:06 +0100)
committerMathieu Duponchelle <mathieu.duponchelle@opencreed.com>
Fri, 5 Dec 2014 11:04:04 +0000 (12:04 +0100)
Segments are added to the pending events, and pushing a segment
is mandatory before sending EOS.

+ Adds a test.

https://bugzilla.gnome.org/show_bug.cgi?id=740853

gst-libs/gst/audio/gstaudiodecoder.c
tests/check/libs/audiodecoder.c

index 84b6242310ab5694d2d87acf84e41a45fa1f588e..daddcdc4d4164298cc5cb599aee9e0a3b9d2a7f2 100644 (file)
@@ -2089,6 +2089,8 @@ gst_audio_decoder_sink_eventfunc (GstAudioDecoder * dec, GstEvent * event)
 
       /* Forward EOS because no buffer or serialized event will come after
        * EOS and nothing could trigger another _finish_frame() call. */
+      if (dec->priv->pending_events)
+        send_pending_events (dec);
       ret = gst_audio_decoder_push_event (dec, event);
       break;
 
index 99d4e9e4d60638602b18024574f6b2d09cb16fb6..c2ef4d2ba8c8061445268469d0d2f19691d36212 100644 (file)
@@ -497,7 +497,8 @@ _audiodecoder_flush_events (gboolean send_buffers)
     }
   }
   {
-    GstEvent *eos_event = events_iter->data;
+    GstEvent *eos_event = g_list_last(events_iter)->data;
+
     fail_unless (GST_EVENT_TYPE (eos_event) == GST_EVENT_EOS);
     events_iter = g_list_next (events_iter);
   }
@@ -544,6 +545,9 @@ _audiodecoder_flush_events (gboolean send_buffers)
 
   }
 
+  g_list_free_full (events, (GDestroyNotify) gst_event_unref);
+  events = NULL;
+
   g_list_free_full (buffers, (GDestroyNotify) gst_buffer_unref);
   buffers = NULL;
 
@@ -551,6 +555,36 @@ _audiodecoder_flush_events (gboolean send_buffers)
   cleanup_audiodecodertest ();
 }
 
+/* An element should always push its segment before sending EOS */
+GST_START_TEST (audiodecoder_eos_events_no_buffers)
+{
+  GstSegment segment;
+  setup_audiodecodertester ();
+
+  gst_pad_set_active (mysrcpad, TRUE);
+  gst_element_set_state (dec, GST_STATE_PLAYING);
+  gst_pad_set_active (mysinkpad, TRUE);
+  send_startup_events ();
+
+  gst_segment_init (&segment, GST_FORMAT_TIME);
+  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment)));
+  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
+
+  fail_unless (GST_PAD_IS_EOS (mysinkpad));
+
+  {
+    GstEvent *segment_event =
+        gst_pad_get_sticky_event (mysinkpad, GST_EVENT_SEGMENT, 0);
+    fail_unless (segment_event != NULL);
+    gst_event_unref (segment_event);
+  }
+
+  gst_element_set_state (dec, GST_STATE_NULL);
+  cleanup_audiodecodertest ();
+}
+
+GST_END_TEST;
+
 GST_START_TEST (audiodecoder_flush_events_no_buffers)
 {
   _audiodecoder_flush_events (FALSE);
@@ -695,6 +729,7 @@ gst_audiodecoder_suite (void)
   suite_add_tcase (s, tc);
   tcase_add_test (tc, audiodecoder_playback);
   tcase_add_test (tc, audiodecoder_flush_events_no_buffers);
+  tcase_add_test (tc, audiodecoder_eos_events_no_buffers);
   tcase_add_test (tc, audiodecoder_flush_events);
   tcase_add_test (tc, audiodecoder_negotiation_with_buffer);
   tcase_add_test (tc, audiodecoder_negotiation_with_gap_event);