+2005-07-12 Wim Taymans <wim@fluendo.com>
+
+ * gst/base/gstbasetransform.c: (gst_base_transform_setcaps):
+ Added more debug info in the negotiate process.
+
+ * gst/gstmessage.h:
+ Prepare for segment playback.
+
+ * gst/gstpad.c: (gst_pad_accept_caps), (gst_pad_set_caps):
+ Better debugging.
+
+ * gst/gstutils.c:
+ Some more docs.
+
+ * tools/gst-launch.c: (main):
+ NULL pipeline on errors.
+
2005-07-12 Andy Wingo <wingo@pobox.com>
* gst/gstbuffer.c (_gst_buffer_copy): Copy the buffer whether or
/* see how we can transform the input caps */
othercaps = gst_base_transform_transform_caps (trans, pad, caps);
- if (!othercaps) {
+ if (!othercaps || gst_caps_is_empty (othercaps)) {
+ GST_DEBUG ("transform returned useless %" GST_PTR_FORMAT, othercaps);
ret = FALSE;
goto done;
}
if (!gst_caps_is_fixed (othercaps)) {
GstCaps *temp;
+ GST_DEBUG ("transform returned non fixed %" GST_PTR_FORMAT, othercaps);
+
temp = gst_caps_intersect (othercaps, caps);
+ GST_DEBUG ("intersect returned %" GST_PTR_FORMAT, temp);
if (temp) {
- /* try passthrough. we know it's fixed, because caps is fixed */
- if (gst_pad_accept_caps (otherpeer, caps)) {
- gst_caps_unref (othercaps);
- othercaps = gst_caps_ref (caps);
- /* will fall though. calls accept_caps again, should fix that. */
+ if (!gst_caps_is_empty (temp)) {
+ GST_DEBUG ("try passthrough with %" GST_PTR_FORMAT, caps);
+ /* try passthrough. we know it's fixed, because caps is fixed */
+ if (gst_pad_accept_caps (otherpeer, caps)) {
+ GST_DEBUG ("peer accepted %" GST_PTR_FORMAT, caps);
+ gst_caps_unref (othercaps);
+ othercaps = gst_caps_ref (caps);
+ /* will fall though. calls accept_caps again, should fix that. */
+ } else {
+ GST_DEBUG ("peer did not accept %" GST_PTR_FORMAT, caps);
+ }
}
gst_caps_unref (temp);
}
if (!gst_caps_is_fixed (othercaps) && otherpeer) {
/* intersect against what the peer can do */
- if (otherpeer) {
- GstCaps *peercaps;
- GstCaps *intersect;
+ GstCaps *peercaps;
+ GstCaps *intersect;
- peercaps = gst_pad_get_caps (otherpeer);
- intersect = gst_caps_intersect (peercaps, othercaps);
- gst_caps_unref (peercaps);
- gst_caps_unref (othercaps);
- othercaps = intersect;
+ GST_DEBUG ("othercaps now %" GST_PTR_FORMAT, othercaps);
- GST_DEBUG ("filtering against peer yields %" GST_PTR_FORMAT, othercaps);
- }
+ peercaps = gst_pad_get_caps (otherpeer);
+ intersect = gst_caps_intersect (peercaps, othercaps);
+ gst_caps_unref (peercaps);
+ gst_caps_unref (othercaps);
+ othercaps = intersect;
+
+ GST_DEBUG ("filtering against peer yields %" GST_PTR_FORMAT, othercaps);
}
if (!gst_caps_is_fixed (othercaps)) {
GstCaps *temp;
+ GST_DEBUG ("othercaps now, trying to fixate %" GST_PTR_FORMAT, othercaps);
+
/* take first possibility and fixate if necessary */
temp = gst_caps_copy_nth (othercaps, 0);
gst_caps_unref (othercaps);
othercaps = temp;
gst_pad_fixate_caps (otherpad, othercaps);
+
+ GST_DEBUG ("after fixating %" GST_PTR_FORMAT, othercaps);
}
g_return_val_if_fail (gst_caps_is_fixed (othercaps), FALSE);
goto done;
}
+ GST_DEBUG ("got final caps %" GST_PTR_FORMAT, othercaps);
+
/* we know this will work, we implement the setcaps */
gst_pad_set_caps (otherpad, othercaps);
* stops, errors, etc..
* @GST_MESSAGE_APPLICATION: message posted by the application, possibly
* via an application-specific element.
+ * @GST_MESSAGE_SEGMENT_START: pipeline started playback of a segment.
+ * @GST_MESSAGE_SEGMENT_DONE: pipeline completed playback of a segment.
* @GST_MESSAGE_ANY: mask for all of the above messages.
*/
typedef enum
GST_MESSAGE_STRUCTURE_CHANGE = (1 << 9),
GST_MESSAGE_STREAM_STATUS = (1 << 10),
GST_MESSAGE_APPLICATION = (1 << 11),
+ GST_MESSAGE_SEGMENT_START = (1 << 12),
+ GST_MESSAGE_SEGMENT_DONE = (1 << 13),
GST_MESSAGE_ANY = 0xffffffff
} GstMessageType;
{
GST_LOCK (pad);
GST_FLAG_UNSET (pad, GST_PAD_IN_SETCAPS);
+ GST_CAT_DEBUG (GST_CAT_CAPS,
+ "pad %s:%s, caps %" GST_PTR_FORMAT " could not be set",
+ GST_DEBUG_PAD_NAME (pad), caps);
GST_UNLOCK (pad);
- GST_CAT_DEBUG (GST_CAT_CAPS, "caps %" GST_PTR_FORMAT " could not be set",
- caps);
+
return FALSE;
}
}
* @gst_pad_get_fixed_caps_func as the gstcaps function for the
* pad. This way the function will always return the negotiated caps
* or in case the pad is not negotiated, the padtemplate caps.
+ *
+ * Use this function on a pad that, once _set_caps() has been called
+ * on it, it cannot be renegotiated to something else.
*/
void
gst_pad_use_fixed_caps (GstPad * pad)
/* see how we can transform the input caps */
othercaps = gst_base_transform_transform_caps (trans, pad, caps);
- if (!othercaps) {
+ if (!othercaps || gst_caps_is_empty (othercaps)) {
+ GST_DEBUG ("transform returned useless %" GST_PTR_FORMAT, othercaps);
ret = FALSE;
goto done;
}
if (!gst_caps_is_fixed (othercaps)) {
GstCaps *temp;
+ GST_DEBUG ("transform returned non fixed %" GST_PTR_FORMAT, othercaps);
+
temp = gst_caps_intersect (othercaps, caps);
+ GST_DEBUG ("intersect returned %" GST_PTR_FORMAT, temp);
if (temp) {
- /* try passthrough. we know it's fixed, because caps is fixed */
- if (gst_pad_accept_caps (otherpeer, caps)) {
- gst_caps_unref (othercaps);
- othercaps = gst_caps_ref (caps);
- /* will fall though. calls accept_caps again, should fix that. */
+ if (!gst_caps_is_empty (temp)) {
+ GST_DEBUG ("try passthrough with %" GST_PTR_FORMAT, caps);
+ /* try passthrough. we know it's fixed, because caps is fixed */
+ if (gst_pad_accept_caps (otherpeer, caps)) {
+ GST_DEBUG ("peer accepted %" GST_PTR_FORMAT, caps);
+ gst_caps_unref (othercaps);
+ othercaps = gst_caps_ref (caps);
+ /* will fall though. calls accept_caps again, should fix that. */
+ } else {
+ GST_DEBUG ("peer did not accept %" GST_PTR_FORMAT, caps);
+ }
}
gst_caps_unref (temp);
}
if (!gst_caps_is_fixed (othercaps) && otherpeer) {
/* intersect against what the peer can do */
- if (otherpeer) {
- GstCaps *peercaps;
- GstCaps *intersect;
+ GstCaps *peercaps;
+ GstCaps *intersect;
- peercaps = gst_pad_get_caps (otherpeer);
- intersect = gst_caps_intersect (peercaps, othercaps);
- gst_caps_unref (peercaps);
- gst_caps_unref (othercaps);
- othercaps = intersect;
+ GST_DEBUG ("othercaps now %" GST_PTR_FORMAT, othercaps);
- GST_DEBUG ("filtering against peer yields %" GST_PTR_FORMAT, othercaps);
- }
+ peercaps = gst_pad_get_caps (otherpeer);
+ intersect = gst_caps_intersect (peercaps, othercaps);
+ gst_caps_unref (peercaps);
+ gst_caps_unref (othercaps);
+ othercaps = intersect;
+
+ GST_DEBUG ("filtering against peer yields %" GST_PTR_FORMAT, othercaps);
}
if (!gst_caps_is_fixed (othercaps)) {
GstCaps *temp;
+ GST_DEBUG ("othercaps now, trying to fixate %" GST_PTR_FORMAT, othercaps);
+
/* take first possibility and fixate if necessary */
temp = gst_caps_copy_nth (othercaps, 0);
gst_caps_unref (othercaps);
othercaps = temp;
gst_pad_fixate_caps (otherpad, othercaps);
+
+ GST_DEBUG ("after fixating %" GST_PTR_FORMAT, othercaps);
}
g_return_val_if_fail (gst_caps_is_fixed (othercaps), FALSE);
goto done;
}
+ GST_DEBUG ("got final caps %" GST_PTR_FORMAT, othercaps);
+
/* we know this will work, we implement the setcaps */
gst_pad_set_caps (otherpad, othercaps);
g_print (_("Execution ended after %" G_GUINT64_FORMAT " ns.\n"), diff);
}
+ while (g_main_context_iteration (NULL, FALSE));
+
fprintf (stderr, _("PAUSE pipeline ...\n"));
gst_element_set_state (pipeline, GST_STATE_PAUSED);
gst_element_get_state (pipeline, &state, &pending, NULL);
fprintf (stderr, _("READY pipeline ...\n"));
gst_element_set_state (pipeline, GST_STATE_READY);
gst_element_get_state (pipeline, &state, &pending, NULL);
+
+ end:
fprintf (stderr, _("NULL pipeline ...\n"));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_element_get_state (pipeline, &state, &pending, NULL);
}
-end:
-
fprintf (stderr, _("FREEING pipeline ...\n"));
gst_object_unref (pipeline);