gst/wavparse/gstwavparse.c: Add EOS logic for the push-based mode too. Fixes #476514.

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.
This commit is contained in:
Sebastian Dröge 2007-09-13 12:37:56 +00:00
parent 8a6f9aa51a
commit d78b9e274b
2 changed files with 48 additions and 32 deletions

View file

@ -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> 2007-09-12 Wim Taymans <wim.taymans@gmail.com>
* gst/law/alaw-encode.c: (gst_alawenc_init), (gst_alawenc_chain): * gst/law/alaw-encode.c: (gst_alawenc_init), (gst_alawenc_chain):

View file

@ -1702,6 +1702,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 static void
gst_wavparse_loop (GstPad * pad) gst_wavparse_loop (GstPad * pad)
{ {
@ -1746,37 +1783,7 @@ pause:
wav->segment_running = FALSE; wav->segment_running = FALSE;
gst_pad_pause_task (pad); gst_pad_pause_task (pad);
if (GST_FLOW_IS_FATAL (ret) || ret == GST_FLOW_NOT_LINKED) { gst_wavparse_perform_eos (wav, ret);
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 ());
}
}
return; return;
} }
} }
@ -1815,11 +1822,14 @@ gst_wavparse_chain (GstPad * pad, GstBuffer * buf)
/* fall-through */ /* fall-through */
case GST_WAVPARSE_DATA: case GST_WAVPARSE_DATA:
if ((ret = gst_wavparse_stream_data (wav)) != GST_FLOW_OK) if ((ret = gst_wavparse_stream_data (wav)) != GST_FLOW_OK)
goto done; goto eos;
break; break;
default: default:
g_assert_not_reached (); g_assert_not_reached ();
} }
eos:
gst_wavparse_perform_eos (wav, ret);
/* fallthrough */
done: done:
return ret; return ret;
} }