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:
Antoine Tremblay 2006-09-23 09:30:40 +00:00 committed by Wim Taymans
parent 3f2eb6bdff
commit 3a0f9058ba
2 changed files with 66 additions and 33 deletions

View file

@ -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:

View file

@ -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;
}
} }