mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
libs/gst/base/gstbasesrc.c: Match _start/_stop calls in the activate functions. Remove redundant _stop call from the ...
Original commit message from CVS: Based on patch by: Antoine Tremblay <hexa00 at gmail dot com> * libs/gst/base/gstbasesrc.c: (gst_base_src_default_check_get_range), (gst_base_src_start), (gst_base_src_activate_push), (gst_base_src_activate_pull), (gst_base_src_change_state): Match _start/_stop calls in the activate functions. Remove redundant _stop call from the state change function. Fixes #356910. Turn failure DEBUG into ERROR.
This commit is contained in:
parent
3f2eb6bdff
commit
3a0f9058ba
2 changed files with 66 additions and 33 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2006-09-23 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
Based on patch by: Antoine Tremblay <hexa00 at gmail dot com>
|
||||||
|
|
||||||
|
* libs/gst/base/gstbasesrc.c:
|
||||||
|
(gst_base_src_default_check_get_range), (gst_base_src_start),
|
||||||
|
(gst_base_src_activate_push), (gst_base_src_activate_pull),
|
||||||
|
(gst_base_src_change_state):
|
||||||
|
Match _start/_stop calls in the activate functions. Remove redundant
|
||||||
|
_stop call from the state change function. Fixes #356910.
|
||||||
|
Turn failure DEBUG into ERROR.
|
||||||
|
|
||||||
2006-09-22 Wim Taymans <wim@fluendo.com>
|
2006-09-22 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
* docs/design/part-buffering.txt:
|
* docs/design/part-buffering.txt:
|
||||||
|
|
|
@ -1391,8 +1391,8 @@ gst_base_src_default_check_get_range (GstBaseSrc * src)
|
||||||
|
|
||||||
if (!GST_OBJECT_FLAG_IS_SET (src, GST_BASE_SRC_STARTED)) {
|
if (!GST_OBJECT_FLAG_IS_SET (src, GST_BASE_SRC_STARTED)) {
|
||||||
GST_LOG_OBJECT (src, "doing start/stop to check get_range support");
|
GST_LOG_OBJECT (src, "doing start/stop to check get_range support");
|
||||||
gst_base_src_start (src);
|
if (G_LIKELY (gst_base_src_start (src)))
|
||||||
gst_base_src_stop (src);
|
gst_base_src_stop (src);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we can operate in getrange mode if the native format is bytes
|
/* we can operate in getrange mode if the native format is bytes
|
||||||
|
@ -1780,7 +1780,7 @@ gst_base_src_start (GstBaseSrc * basesrc)
|
||||||
could_not_start:
|
could_not_start:
|
||||||
{
|
{
|
||||||
GST_DEBUG_OBJECT (basesrc, "could not start");
|
GST_DEBUG_OBJECT (basesrc, "could not start");
|
||||||
/* subclass is supposed to post a message */
|
/* subclass is supposed to post a message. We don't have to call _stop. */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
could_not_negotiate:
|
could_not_negotiate:
|
||||||
|
@ -1788,6 +1788,7 @@ could_not_negotiate:
|
||||||
GST_DEBUG_OBJECT (basesrc, "could not negotiate, stopping");
|
GST_DEBUG_OBJECT (basesrc, "could not negotiate, stopping");
|
||||||
GST_ELEMENT_ERROR (basesrc, STREAM, FORMAT,
|
GST_ELEMENT_ERROR (basesrc, STREAM, FORMAT,
|
||||||
("Could not negotiate format"), ("Check your filtered caps, if any"));
|
("Could not negotiate format"), ("Check your filtered caps, if any"));
|
||||||
|
/* we must call stop */
|
||||||
gst_base_src_stop (basesrc);
|
gst_base_src_stop (basesrc);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -1837,20 +1838,18 @@ static gboolean
|
||||||
gst_base_src_activate_push (GstPad * pad, gboolean active)
|
gst_base_src_activate_push (GstPad * pad, gboolean active)
|
||||||
{
|
{
|
||||||
GstBaseSrc *basesrc;
|
GstBaseSrc *basesrc;
|
||||||
gboolean res;
|
GstEvent *event;
|
||||||
|
|
||||||
basesrc = GST_BASE_SRC (GST_OBJECT_PARENT (pad));
|
basesrc = GST_BASE_SRC (GST_OBJECT_PARENT (pad));
|
||||||
|
|
||||||
/* prepare subclass first */
|
/* prepare subclass first */
|
||||||
if (active) {
|
if (active) {
|
||||||
GstEvent *event;
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (basesrc, "Activating in push mode");
|
GST_DEBUG_OBJECT (basesrc, "Activating in push mode");
|
||||||
|
|
||||||
if (!basesrc->can_activate_push)
|
if (G_UNLIKELY (!basesrc->can_activate_push))
|
||||||
goto no_push_activation;
|
goto no_push_activation;
|
||||||
|
|
||||||
if (!gst_base_src_start (basesrc))
|
if (G_UNLIKELY (!gst_base_src_start (basesrc)))
|
||||||
goto error_start;
|
goto error_start;
|
||||||
|
|
||||||
basesrc->priv->last_sent_eos = FALSE;
|
basesrc->priv->last_sent_eos = FALSE;
|
||||||
|
@ -1862,27 +1861,52 @@ gst_base_src_activate_push (GstPad * pad, gboolean active)
|
||||||
GST_OBJECT_UNLOCK (basesrc);
|
GST_OBJECT_UNLOCK (basesrc);
|
||||||
|
|
||||||
/* no need to unlock anything, the task is certainly
|
/* no need to unlock anything, the task is certainly
|
||||||
* not running here. */
|
* not running here. The perform seek code will start the task when
|
||||||
res = gst_base_src_perform_seek (basesrc, event, FALSE);
|
* finished. */
|
||||||
|
if (G_UNLIKELY (!gst_base_src_perform_seek (basesrc, event, FALSE)))
|
||||||
|
goto seek_failed;
|
||||||
|
|
||||||
if (event)
|
if (event)
|
||||||
gst_event_unref (event);
|
gst_event_unref (event);
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG_OBJECT (basesrc, "Deactivating in push mode");
|
GST_DEBUG_OBJECT (basesrc, "Deactivating in push mode");
|
||||||
res = gst_base_src_deactivate (basesrc, pad);
|
/* call the unlock function and stop the task */
|
||||||
|
if (G_UNLIKELY (!gst_base_src_deactivate (basesrc, pad)))
|
||||||
|
goto deactivate_failed;
|
||||||
|
|
||||||
|
/* now we can stop the source */
|
||||||
|
if (G_UNLIKELY (!gst_base_src_stop (basesrc)))
|
||||||
|
goto error_stop;
|
||||||
}
|
}
|
||||||
return res;
|
return TRUE;
|
||||||
|
|
||||||
/* ERRORS */
|
/* ERRORS */
|
||||||
no_push_activation:
|
no_push_activation:
|
||||||
{
|
{
|
||||||
GST_DEBUG_OBJECT (basesrc, "Subclass disabled push-mode activation");
|
GST_ERROR_OBJECT (basesrc, "Subclass disabled push-mode activation");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
error_start:
|
error_start:
|
||||||
{
|
{
|
||||||
|
GST_ERROR_OBJECT (basesrc, "Failed to start in push mode");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
seek_failed:
|
||||||
|
{
|
||||||
|
GST_ERROR_OBJECT (basesrc, "Failed to perform initial seek");
|
||||||
gst_base_src_stop (basesrc);
|
gst_base_src_stop (basesrc);
|
||||||
GST_DEBUG_OBJECT (basesrc, "Failed to start in push mode");
|
if (event)
|
||||||
|
gst_event_unref (event);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
deactivate_failed:
|
||||||
|
{
|
||||||
|
GST_ERROR_OBJECT (basesrc, "Failed to deactivate in push mode");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
error_stop:
|
||||||
|
{
|
||||||
|
GST_DEBUG_OBJECT (basesrc, "Failed to stop in push mode");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1897,41 +1921,46 @@ gst_base_src_activate_pull (GstPad * pad, gboolean active)
|
||||||
/* prepare subclass first */
|
/* prepare subclass first */
|
||||||
if (active) {
|
if (active) {
|
||||||
GST_DEBUG_OBJECT (basesrc, "Activating in pull mode");
|
GST_DEBUG_OBJECT (basesrc, "Activating in pull mode");
|
||||||
if (!gst_base_src_start (basesrc))
|
if (G_UNLIKELY (!gst_base_src_start (basesrc)))
|
||||||
goto error_start;
|
goto error_start;
|
||||||
|
|
||||||
/* if not random_access, we cannot operate in pull mode for now */
|
/* if not random_access, we cannot operate in pull mode for now */
|
||||||
if (!gst_base_src_check_get_range (basesrc))
|
if (G_UNLIKELY (!gst_base_src_check_get_range (basesrc)))
|
||||||
goto no_get_range;
|
goto no_get_range;
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG_OBJECT (basesrc, "Deactivating in pull mode");
|
GST_DEBUG_OBJECT (basesrc, "Deactivating in pull mode");
|
||||||
|
/* call the unlock function. We have no task to stop. */
|
||||||
|
if (G_UNLIKELY (!gst_base_src_deactivate (basesrc, pad)))
|
||||||
|
goto deactivate_failed;
|
||||||
|
|
||||||
/* don't send EOS when going from PAUSED => READY when in pull mode */
|
/* don't send EOS when going from PAUSED => READY when in pull mode */
|
||||||
basesrc->priv->last_sent_eos = TRUE;
|
basesrc->priv->last_sent_eos = TRUE;
|
||||||
|
|
||||||
if (!gst_base_src_stop (basesrc))
|
if (G_UNLIKELY (!gst_base_src_stop (basesrc)))
|
||||||
goto error_stop;
|
goto error_stop;
|
||||||
|
|
||||||
return gst_base_src_deactivate (basesrc, pad);
|
|
||||||
}
|
}
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* ERRORS */
|
||||||
error_start:
|
error_start:
|
||||||
{
|
{
|
||||||
gst_base_src_stop (basesrc);
|
GST_ERROR_OBJECT (basesrc, "Failed to start in pull mode");
|
||||||
GST_DEBUG_OBJECT (basesrc, "Failed to start in pull mode");
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
no_get_range:
|
no_get_range:
|
||||||
{
|
{
|
||||||
GST_DEBUG_OBJECT (basesrc, "Cannot operate in pull mode, stopping");
|
GST_ERROR_OBJECT (basesrc, "Cannot operate in pull mode, stopping");
|
||||||
gst_base_src_stop (basesrc);
|
gst_base_src_stop (basesrc);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
deactivate_failed:
|
||||||
|
{
|
||||||
|
GST_ERROR_OBJECT (basesrc, "Failed to deactivate in pull mode");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
error_stop:
|
error_stop:
|
||||||
{
|
{
|
||||||
GST_DEBUG_OBJECT (basesrc, "Failed to stop in pull mode");
|
GST_ERROR_OBJECT (basesrc, "Failed to stop in pull mode");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1988,9 +2017,6 @@ gst_base_src_change_state (GstElement * element, GstStateChange transition)
|
||||||
{
|
{
|
||||||
GstEvent **event_p;
|
GstEvent **event_p;
|
||||||
|
|
||||||
if (!gst_base_src_stop (basesrc))
|
|
||||||
goto error_stop;
|
|
||||||
|
|
||||||
/* FIXME, deprecate this behaviour, it is very dangerous.
|
/* FIXME, deprecate this behaviour, it is very dangerous.
|
||||||
* the prefered way of sending EOS downstream is by sending
|
* the prefered way of sending EOS downstream is by sending
|
||||||
* the EOS event to the element */
|
* the EOS event to the element */
|
||||||
|
@ -2024,9 +2050,4 @@ failure:
|
||||||
GST_DEBUG_OBJECT (basesrc, "parent failed state change");
|
GST_DEBUG_OBJECT (basesrc, "parent failed state change");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
error_stop:
|
|
||||||
{
|
|
||||||
GST_DEBUG_OBJECT (basesrc, "Failed to stop");
|
|
||||||
return GST_STATE_CHANGE_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue