GStreamer aims to support every format imaginable, but that doesn't mean the
developers have managed to achieve that aim yet. If a GStreamer enabled
application doesn't play back your files, you can help us solve that problem
-by <ulink url="htpp://bugzilla.gnome.org">filing an enhancement request
+by <ulink url="http://bugzilla.gnome.org">filing an enhancement request
bug</ulink> for that format. If you have it, please provide:
<itemizedlist>
<listitem><para>links to other players, preferrably Open Source and working
* cannot produce data in %GST_STATE_PAUSED.
* This typically happens with live sources.
*
- * The possible return values from a state change function. Only
- * @GST_STATE_CHANGE_FAILURE is a real failure.
+ * The possible return values from a state change function such as
+ * gst_element_set_state(). Only @GST_STATE_CHANGE_FAILURE is a real failure.
*/
typedef enum {
GST_STATE_CHANGE_FAILURE = 0,
* Streaming threads are started.
* </para></listitem>
* <listitem><para>
- * Some elements might need to return ASYNC and complete the state change
- * when they have enough information. It is a requirement for sinks to
- * return ASYNC and complete the state change when they receive the first
- * buffer or EOS event (preroll). Sinks also block the dataflow when in
- * PAUSED.
+ * Some elements might need to return %GST_STATE_CHANGE_ASYNC and complete
+ * the state change when they have enough information. It is a requirement
+ * for sinks to return %GST_STATE_CHANGE_ASYNC and complete the state change
+ * when they receive the first buffer or %GST_EVENT_EOS (preroll).
+ * Sinks also block the dataflow when in PAUSED.
* </para></listitem>
* <listitem><para>
* A pipeline resets the running_time to 0.
* </para></listitem>
* <listitem><para>
- * Live sources return NO_PREROLL and don't generate data.
+ * Live sources return %GST_STATE_CHANGE_NO_PREROLL and don't generate data.
* </para></listitem>
* </itemizedlist>
* @GST_STATE_CHANGE_PAUSED_TO_PLAYING: state change from PAUSED to PLAYING.
* Most elements ignore this state change.
* </para></listitem>
* <listitem><para>
- * The pipeline selects a clock and distributes this to all the children
+ * The pipeline selects a #GstClock and distributes this to all the children
* before setting them to PLAYING. This means that it is only alowed to
- * synchronize on the clock in the PLAYING state.
+ * synchronize on the #GstClock in the PLAYING state.
* </para></listitem>
* <listitem><para>
- * The pipeline uses the clock and the running_time to calculate the
+ * The pipeline uses the #GstClock and the running_time to calculate the
* base_time. The base_time is distributed to all children when performing
* the state change.
* </para></listitem>
* rendering the data.
* </para></listitem>
* <listitem><para>
- * Sinks can post the EOS message in the PLAYING state. It is not allowed to
- * post EOS when not in the PLAYING state.
+ * Sinks can post %GST_MESSAGE_EOS in the PLAYING state. It is not allowed
+ * to post %GST_MESSAGE_EOS when not in the PLAYING state.
* </para></listitem>
* <listitem><para>
* While streaming in PAUSED or PLAYING elements can create and remove
* sometimes pads.
* </para></listitem>
* <listitem><para>
- * Live sources start generating data and return SUCCESS.
+ * Live sources start generating data and return %GST_STATE_CHANGE_SUCCESS.
* </para></listitem>
* </itemizedlist>
* @GST_STATE_CHANGE_PLAYING_TO_PAUSED: state change from PLAYING to PAUSED.
* Most elements ignore this state change.
* </para></listitem>
* <listitem><para>
- * The pipeline calculates the running_time based on the last selected clock
- * and the base_time. It stores this information to continue playback when
- * going back to the PLAYING state.
+ * The pipeline calculates the running_time based on the last selected
+ * #GstClock and the base_time. It stores this information to continue
+ * playback when going back to the PLAYING state.
* </para></listitem>
* <listitem><para>
- * Sinks unblock any clock wait calls.
+ * Sinks unblock any #GstClock wait calls.
* </para></listitem>
* <listitem><para>
- * When a sink does not have a pending buffer to play, it returns ASYNC from
- * this state change and completes the state change when it receives a new
- * buffer or an EOS event.
+ * When a sink does not have a pending buffer to play, it returns
+ * %GST_STATE_CHANGE_ASYNC from this state change and completes the state
+ * change when it receives a new buffer or an %GST_EVENT_EOS.
* </para></listitem>
* <listitem><para>
- * Any queued EOS messages are removed since they will be reposted when going
- * back to the PLAYING state. The EOS messages are queued in GstBins.
+ * Any queued %GST_MESSAGE_EOS items are removed since they will be reposted
+ * when going back to the PLAYING state. The EOS messages are queued in
+ * #GstBin containers.
* </para></listitem>
* <listitem><para>
- * Live sources stop generating data and return NO_PREROLL.
+ * Live sources stop generating data and return %GST_STATE_CHANGE_NO_PREROLL.
* </para></listitem>
* </itemizedlist>
* @GST_STATE_CHANGE_PAUSED_TO_READY : state change from PAUSED to READY.
* Elements unblock any waits on devices
* </para></listitem>
* <listitem><para>
- * Chain or get_range functions return WRONG_STATE.
+ * Chain or get_range functions return %GST_FLOW_WRONG_STATE.
* </para></listitem>
* <listitem><para>
* The element pads are deactivated so that streaming becomes impossible and
* @GST_MESSAGE_SEGMENT_START posted a GST_MESSAGE_SEGMENT_DONE message.
* @GST_MESSAGE_DURATION: The duration of a pipeline changed. The application
* can get the new duration with a duration query.
- * @GST_MESSAGE_ASYNC_START: Posted by elements when they start an ASYNC state
- * change. This message is not forwarded to the application but is used
+ * @GST_MESSAGE_ASYNC_START: Posted by elements when they start an ASYNC
+ * #GstStateChange. This message is not forwarded to the application but is used
* internally. Since: 0.10.13.
- * @GST_MESSAGE_ASYNC_DONE: Posted by elements when they complete an ASYNC state
- * change. The application will only receive this message from the toplevel
+ * @GST_MESSAGE_ASYNC_DONE: Posted by elements when they complete an ASYNC
+ * #GstStateChange. The application will only receive this message from the toplevel
* pipeline. Since: 0.10.13
* @GST_MESSAGE_LATENCY: Posted by elements when their latency changes. The
* application should recalculate and distribute a new latency. Since: 0.10.12
GstStructure *superset = user_data;
GValue subtraction = { 0, };
const GValue *other;
+ GType ltype;
if (!(other = gst_structure_id_get_value (superset, field_id)))
/* field is missing in the superset => is subset */
return TRUE;
+ /* Special case: lists and scalar values
+ * "{ 1 }" and "1" subsets of each other
+ * but not strictly equal */
+ ltype = gst_value_list_get_type ();
+ if (G_VALUE_HOLDS (other, ltype) && !G_VALUE_HOLDS (value, ltype)) {
+ const GValue *elt;
+ gint i, n;
+ gboolean all_equal = TRUE;
+
+ n = gst_value_list_get_size (other);
+ for (i = 0; i < n; i++) {
+ elt = gst_value_list_get_value (other, 0);
+ if (gst_value_compare (elt, value) != GST_VALUE_EQUAL) {
+ all_equal = FALSE;
+ break;
+ }
+ }
+ if (all_equal)
+ return TRUE;
+ } else if (G_VALUE_HOLDS (value, ltype) && !G_VALUE_HOLDS (other, ltype)) {
+ const GValue *elt;
+ gint i, n;
+ gboolean all_equal = TRUE;
+
+ n = gst_value_list_get_size (value);
+ for (i = 0; i < n; i++) {
+ elt = gst_value_list_get_value (value, 0);
+ if (gst_value_compare (elt, other) != GST_VALUE_EQUAL) {
+ all_equal = FALSE;
+ break;
+ }
+ }
+ if (all_equal)
+ return TRUE;
+ }
+
/* equal values are subset */
if (gst_value_compare (other, value) == GST_VALUE_EQUAL)
return TRUE;
fail_if (gst_caps_is_subset (c1, c2));
gst_caps_unref (c1);
gst_caps_unref (c2);
+
+ c1 = gst_caps_from_string ("audio/x-raw-int, channels=(int) {1}");
+ c2 = gst_caps_from_string ("audio/x-raw-int, channels=(int)1");
+ fail_unless (gst_caps_is_subset (c2, c1));
+ fail_unless (gst_caps_is_subset (c1, c2));
+ fail_unless (gst_caps_is_equal (c1, c2));
+ gst_caps_unref (c1);
+ gst_caps_unref (c2);
+
+ c1 = gst_caps_from_string
+ ("audio/x-raw-int, rate=(int)44100, channels=(int)3, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)false");
+ c2 = gst_caps_from_string
+ ("audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int)16, depth=(int)[ 1, 16 ], signed=(boolean){ true, false }");
+ fail_unless (gst_caps_is_subset (c1, c2));
+ fail_if (gst_caps_is_subset (c2, c1));
+ gst_caps_unref (c1);
+ gst_caps_unref (c2);
}
GST_END_TEST;
}
}
+/* Kids, use the functions from libgstpbutils in gst-plugins-base in your
+ * own code (we can't do that here because it would introduce a circular
+ * dependency) */
+static gboolean
+gst_is_missing_plugin_message (GstMessage * msg)
+{
+ if (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ELEMENT || msg->structure == NULL)
+ return FALSE;
+
+ return gst_structure_has_name (msg->structure, "missing-plugin");
+}
+
+static const gchar *
+gst_missing_plugin_message_get_description (GstMessage * msg)
+{
+ return gst_structure_get_string (msg->structure, "name");
+}
+
static void
print_error_message (GstMessage * msg)
{
res = ELR_INTERRUPT;
goto exit;
}
+ break;
+ }
+ case GST_MESSAGE_ELEMENT:{
+ if (gst_is_missing_plugin_message (message)) {
+ const gchar *desc;
+
+ desc = gst_missing_plugin_message_get_description (message);
+ PRINT (_("Missing element: %s\n"), desc ? desc : "(no description)");
+ }
+ break;
}
default:
/* just be quiet by default */