static void _add_track_element (GESFormatter * self, GESClip * clip, GESTrackElement * trackelement, const gchar * track_id, GstStructure * children_properties, GstStructure * properties) { GESBaseXmlFormatterPrivate *priv = _GET_PRIV (self); GESTrack *track = g_hash_table_lookup (priv->tracks, track_id); if (track == NULL) { GST_WARNING_OBJECT (self, "No track with id %s, can not add trackelement", track_id); gst_object_unref (trackelement); return; } GST_DEBUG_OBJECT (self, "Adding track_element: %" GST_PTR_FORMAT " To : %" GST_PTR_FORMAT, trackelement, clip); ges_container_add (GES_CONTAINER (clip), GES_TIMELINE_ELEMENT (trackelement)); gst_structure_foreach (children_properties, (GstStructureForeachFunc) _set_child_property, trackelement); if (properties) gst_structure_foreach (properties, (GstStructureForeachFunc) set_property_foreach, trackelement); }
static gboolean insert_field (GQuark field_id, const GValue * val, gpointer user_data) { GtkTreeIter *parent_iter = user_data; GtkTreeIter iter; const gchar *f = g_quark_to_string (field_id); gtk_tree_store_append (treestore, &iter, parent_iter); if (G_VALUE_TYPE (val) == GST_TYPE_ARRAY) { guint n = gst_value_array_get_size (val); guint i; GtkTreeIter child_iter; gtk_tree_store_set (treestore, &iter, 0, f, -1); for (i = 0; i < n; i++) { const GValue *ve = gst_value_array_get_value (val, i); gtk_tree_store_append (treestore, &child_iter, &iter); if (G_VALUE_TYPE (ve) == GST_TYPE_STRUCTURE) { const GstStructure *s = gst_value_get_structure (ve); gtk_tree_store_set (treestore, &child_iter, 0, gst_structure_get_name (s), -1); gst_structure_foreach (s, insert_field, &child_iter); } else { gchar *v = g_value_to_string (ve); gtk_tree_store_set (treestore, &child_iter, 0, v, -1); g_free (v); } } } else if (G_VALUE_TYPE (val) == GST_TYPE_STRUCTURE) { const GstStructure *s = gst_value_get_structure (val); gchar *entry = g_strdup_printf ("%s: %s", f, gst_structure_get_name (s)); gtk_tree_store_set (treestore, &iter, 0, entry, -1); g_free (entry); gst_structure_foreach (s, insert_field, &iter); } else { gchar *v = g_value_to_string (val); gchar *entry = g_strdup_printf ("%s: %s", f, v); gtk_tree_store_set (treestore, &iter, 0, entry, -1); g_free (v); g_free (entry); } return TRUE; }
void ges_base_xml_formatter_set_timeline_properties (GESBaseXmlFormatter * self, GESTimeline * timeline, const gchar * properties, const gchar * metadatas) { GESBaseXmlFormatterPrivate *priv = _GET_PRIV (self); gboolean auto_transition = FALSE; if (properties) { GstStructure *props = gst_structure_from_string (properties, NULL); if (props) { if (gst_structure_get_boolean (props, "auto-transition", &auto_transition)) gst_structure_remove_field (props, "auto-transition"); gst_structure_foreach (props, (GstStructureForeachFunc) set_property_foreach, timeline); gst_structure_free (props); } } if (metadatas) { ges_meta_container_add_metas_from_string (GES_META_CONTAINER (timeline), metadatas); }; priv->timeline_auto_transition = auto_transition; }
static void print_caps (const GstCaps * caps, const gchar * pfx) { guint i; g_return_if_fail (caps != NULL); if (gst_caps_is_any (caps)) { n_print ("%sANY\n", pfx); return; } if (gst_caps_is_empty (caps)) { n_print ("%sEMPTY\n", pfx); return; } for (i = 0; i < gst_caps_get_size (caps); i++) { GstStructure *structure = gst_caps_get_structure (caps, i); GstCapsFeatures *features = gst_caps_get_features (caps, i); if (features && (gst_caps_features_is_any (features) || !gst_caps_features_is_equal (features, GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY))) { gchar *features_string = gst_caps_features_to_string (features); n_print ("%s%s(%s)\n", pfx, gst_structure_get_name (structure), features_string); g_free (features_string); } else { n_print ("%s%s\n", pfx, gst_structure_get_name (structure)); } gst_structure_foreach (structure, print_field, (gpointer) pfx); } }
static void gst_tracer_record_build_format (GstTracerRecord * self) { GstStructure *structure = self->spec; GString *s; gchar *name = (gchar *) g_quark_to_string (structure->name); gchar *p; g_return_if_fail (g_str_has_suffix (name, ".class")); /* announce the format */ GST_TRACE ("%" GST_PTR_FORMAT, structure); /* cut off '.class' suffix */ name = g_strdup (name); p = strrchr (name, '.'); g_assert (p != NULL); *p = '\0'; s = g_string_sized_new (STRUCTURE_ESTIMATED_STRING_LEN (structure)); g_string_append (s, name); gst_structure_foreach (structure, build_field_template, s); g_string_append_c (s, ';'); self->format = g_string_free (s, FALSE); GST_DEBUG ("new format string: %s", self->format); g_free (name); }
void ges_base_xml_formatter_add_source (GESBaseXmlFormatter * self, const gchar * track_id, GstStructure * children_properties) { GESBaseXmlFormatterPrivate *priv = _GET_PRIV (self); GESTrackElement *element = NULL; if (track_id[0] != '-' && priv->current_clip) element = _get_element_by_track_id (priv, track_id, priv->current_clip); else if (track_id[0] != '-' && priv->current_pending_clip) { PendingChildProperties *pchildprops; pchildprops = g_slice_new0 (PendingChildProperties); pchildprops->track_id = g_strdup (track_id); pchildprops->structure = children_properties ? gst_structure_copy (children_properties) : NULL; priv->current_pending_clip->children_props = g_list_append (priv->current_pending_clip->children_props, pchildprops); return; } else { element = priv->current_track_element; } if (element == NULL) { GST_WARNING ("No current track element to which we can append children properties"); return; } gst_structure_foreach (children_properties, (GstStructureForeachFunc) _set_child_property, element); }
static inline GESClip * _add_object_to_layer (GESBaseXmlFormatterPrivate * priv, const gchar * id, GESLayer * layer, GESAsset * asset, GstClockTime start, GstClockTime inpoint, GstClockTime duration, GESTrackType track_types, const gchar * metadatas, GstStructure * properties) { GESClip *clip = ges_layer_add_asset (layer, asset, start, inpoint, duration, track_types); if (clip == NULL) { GST_WARNING_OBJECT (clip, "Could not add object from asset: %s", ges_asset_get_id (asset)); return NULL; } if (metadatas) ges_meta_container_add_metas_from_string (GES_META_CONTAINER (clip), metadatas); if (properties) gst_structure_foreach (properties, (GstStructureForeachFunc) set_property_foreach, clip); g_hash_table_insert (priv->containers, g_strdup (id), gst_object_ref (clip)); return clip; }
static void gst_caps_setter_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstCapsSetter *filter; g_return_if_fail (GST_IS_CAPS_SETTER (object)); filter = GST_CAPS_SETTER (object); switch (prop_id) { case PROP_CAPS:{ GstCaps *new_caps; const GstCaps *new_caps_val = gst_value_get_caps (value); gint i; if (new_caps_val == NULL) { new_caps = gst_caps_new_any (); } else { new_caps = gst_caps_copy (new_caps_val); } for (i = 0; new_caps && (i < gst_caps_get_size (new_caps)); ++i) { GstStructure *s; s = gst_caps_get_structure (new_caps, i); if (!gst_structure_foreach (s, gst_caps_is_fixed_foreach, NULL)) { GST_ERROR_OBJECT (filter, "rejected unfixed caps: %" GST_PTR_FORMAT, new_caps); gst_caps_unref (new_caps); new_caps = NULL; break; } } if (new_caps) { GST_OBJECT_LOCK (filter); gst_caps_replace (&filter->caps, new_caps); /* drop extra ref */ gst_caps_unref (new_caps); GST_OBJECT_UNLOCK (filter); GST_DEBUG_OBJECT (filter, "set new caps %" GST_PTR_FORMAT, new_caps); } /* try to activate these new caps next time around */ gst_base_transform_reconfigure (GST_BASE_TRANSFORM (filter)); break; } case PROP_JOIN: filter->join = g_value_get_boolean (value); break; case PROP_REPLACE: filter->replace = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static gboolean gst_soup_http_src_add_extra_headers (GstSoupHTTPSrc * src) { if (!src->extra_headers) return TRUE; return gst_structure_foreach (src->extra_headers, _append_extra_headers, src); }
pa_proplist * gst_pulse_make_proplist (const GstStructure * properties) { pa_proplist *proplist = pa_proplist_new (); /* iterate the structure and fill the proplist */ gst_structure_foreach (properties, make_proplist_item, proplist); return proplist; }
static void insert_structure (const GstStructure * s, GtkTreeIter * iter) { const gchar *name = gst_structure_get_name (s); gtk_tree_store_set (treestore, iter, 0, name, -1); gst_structure_foreach (s, insert_field, iter); }
static void _update_uniforms (GstGLFilterShader * filtershader) { if (filtershader->new_uniforms && filtershader->uniforms) { gst_gl_shader_use (filtershader->shader); gst_structure_foreach (filtershader->uniforms, (GstStructureForeachFunc) _set_uniform, filtershader->shader); filtershader->new_uniforms = FALSE; } }
static VALUE tag_parse(VALUE self) { VALUE value = rb_hash_new(); GstTagList *tag_list; gst_message_parse_tag(SELF(self), &tag_list); gst_structure_foreach(tag_list, foreach_pair, &value); gst_tag_list_free(tag_list); return value; }
static GString * _print_caps(GstCaps *caps, gboolean full) { GString *caps_str = g_string_new("Caps: "); if (gst_caps_is_any (caps)) { g_string_append_printf(caps_str, "ANY\n"); } else if (gst_caps_is_empty (caps)) { g_string_append_printf(caps_str, "EMPTY\n"); } else { g_string_append_printf(caps_str, "\n"); int i=0; if(!full) { GList *caps_names = NULL; for (i = 0; i < gst_caps_get_size (caps); i++) { GstStructure *structure = gst_caps_get_structure (caps, i); gchar *cap_name = (gchar *)gst_structure_get_name(structure); if(NULL == g_list_find_custom(caps_names, cap_name, (GCompareFunc)g_strcmp0)) { caps_names = g_list_prepend(caps_names, cap_name); } } caps_names = g_list_reverse(caps_names); while(NULL != caps_names) { gchar *name = (gchar *)caps_names->data; caps_names = g_list_delete_link(caps_names, caps_names); g_string_append_printf(caps_str, "%s\n", name); } } else { for (i = 0; i < gst_caps_get_size (caps); i++) { GstStructure *structure = gst_caps_get_structure (caps, i); g_string_append_printf(caps_str, "%s\n", gst_structure_get_name (structure)); gst_structure_foreach (structure, _caps_print_field, (gpointer) caps_str); } } } caps_str = g_string_truncate(caps_str, caps_str->len-1); return caps_str; }
JsonNode * snra_json_from_gst_structure (const GstStructure * s) { JsonNode *root = json_node_new (JSON_NODE_OBJECT); json_node_take_object (root, json_object_new ()); gst_structure_foreach (s, (GstStructureForeachFunc) snra_add_struct_object, json_node_get_object (root)); return root; }
void ges_base_xml_formatter_add_layer (GESBaseXmlFormatter * self, GType extractable_type, guint priority, GstStructure * properties, const gchar * metadatas, GError ** error) { LayerEntry *entry; GESAsset *asset; GESLayer *layer; gboolean auto_transition = FALSE; GESBaseXmlFormatterPrivate *priv = _GET_PRIV (self); if (priv->check_only) return; if (extractable_type == G_TYPE_NONE) layer = ges_layer_new (); else { asset = ges_asset_request (extractable_type, NULL, error); if (asset == NULL) { if (error && *error == NULL) { g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "Layer type %s could not be created'", g_type_name (extractable_type)); return; } } layer = GES_LAYER (ges_asset_extract (asset, error)); } ges_layer_set_priority (layer, priority); ges_timeline_add_layer (GES_FORMATTER (self)->timeline, layer); if (properties) { if (gst_structure_get_boolean (properties, "auto-transition", &auto_transition)) gst_structure_remove_field (properties, "auto-transition"); gst_structure_foreach (properties, (GstStructureForeachFunc) set_property_foreach, layer); } if (metadatas) ges_meta_container_add_metas_from_string (GES_META_CONTAINER (layer), metadatas); entry = g_slice_new0 (LayerEntry); entry->layer = gst_object_ref (layer); entry->auto_trans = auto_transition; g_hash_table_insert (priv->layers, GINT_TO_POINTER (priority), entry); }
static gchar * debug_dump_describe_caps (GstCaps * caps, GstDebugGraphDetails details) { gchar *media = NULL; if (details & GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS) { if (gst_caps_is_any (caps) || gst_caps_is_empty (caps)) { media = gst_caps_to_string (caps); } else { GString *str = NULL; guint i; guint slen = 0; for (i = 0; i < gst_caps_get_size (caps); i++) { slen += 25 + STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure (caps, i)); } str = g_string_sized_new (slen); for (i = 0; i < gst_caps_get_size (caps); i++) { GstCapsFeatures *features = __gst_caps_get_features_unchecked (caps, i); GstStructure *structure = gst_caps_get_structure (caps, i); g_string_append (str, gst_structure_get_name (structure)); if (features && (gst_caps_features_is_any (features) || !gst_caps_features_is_equal (features, GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY))) { g_string_append_c (str, '('); priv_gst_caps_features_append_to_gstring (features, str); g_string_append_c (str, ')'); } g_string_append (str, "\\l"); gst_structure_foreach (structure, string_append_field, (gpointer) str); } media = g_string_free (str, FALSE); } } else { if (GST_CAPS_IS_SIMPLE (caps)) media = g_strdup (gst_structure_get_name (gst_caps_get_structure (caps, 0))); else media = g_strdup ("*"); } return media; }
static void print_properties (GstDiscovererInfo * info, gint tab) { const GstTagList *tags; g_print ("%*sDuration: %" GST_TIME_FORMAT "\n", tab + 1, " ", GST_TIME_ARGS (gst_discoverer_info_get_duration (info))); g_print ("%*sSeekable: %s\n", tab + 1, " ", (gst_discoverer_info_get_seekable (info) ? "yes" : "no")); if ((tags = gst_discoverer_info_get_tags (info))) { g_print ("%*sTags: \n", tab + 1, " "); gst_structure_foreach ((const GstStructure *) tags, print_tag_each, GINT_TO_POINTER (tab + 5)); } }
static void _add_children_properties (GESBaseXmlFormatterPrivate * priv, GList * childprops, GESClip * clip) { GList *tmpchildprops; for (tmpchildprops = childprops; tmpchildprops; tmpchildprops = tmpchildprops->next) { PendingChildProperties *pchildprops = tmpchildprops->data; GESTrackElement *element = _get_element_by_track_id (priv, pchildprops->track_id, clip); if (element && pchildprops->structure) gst_structure_foreach (pchildprops->structure, (GstStructureForeachFunc) _set_child_property, element); } }
static gboolean _append_accept_caps_failure_details (GstValidatePadMonitor * monitor, GString * str) { gint i, j; GstCaps *refused_caps = gst_caps_copy (monitor->last_refused_caps); GstCaps *possible_caps = gst_pad_query_caps (monitor->pad, NULL); gchar *caps_str = gst_caps_to_string (monitor->last_refused_caps); StructureIncompatibleFieldsInfo info = { .str = str, .found = FALSE }; g_string_append_printf (str, "\n Caps negotiation failed at pad '%s' as it refused caps: %s", gst_validate_reporter_get_name (GST_VALIDATE_REPORTER (monitor)), caps_str); g_free (caps_str); for (i = 0; i < gst_caps_get_size (refused_caps); i++) { GstStructure *refused_struct = gst_caps_get_structure (refused_caps, i); const gchar *filter_name; const gchar *refused_name = gst_structure_get_name (refused_struct); for (j = 0; j < gst_caps_get_size (possible_caps); j++) { info.caps_struct_num = i, info.filter_caps_struct_num = j, info.filter = gst_caps_get_structure (possible_caps, j); filter_name = gst_structure_get_name (info.filter); if (g_strcmp0 (refused_name, filter_name)) { g_string_append_printf (str, "\n -> Downstream caps struct %d name '%s' differs from " "filter caps struct %d name '%s'", i, refused_name, j, filter_name); continue; } gst_structure_foreach (refused_struct, (GstStructureForeachFunc) _find_structure_incompatible_fields, &info); } } gst_caps_unref (possible_caps); return TRUE; }
EXPORT_C #endif void gst_tag_list_foreach (const GstTagList * list, GstTagForeachFunc func, gpointer user_data) { TagForeachData data; g_return_if_fail (GST_IS_TAG_LIST (list)); g_return_if_fail (func != NULL); data.func = func; data.tag_list = list; data.data = user_data; gst_structure_foreach ((GstStructure *) list, structure_foreach_wrapper, &data); }
static void print_factory_details_info (GstElementFactory * factory) { char s[20]; n_print ("Factory Details:\n"); n_print (" Long name:\t%s\n", factory->details.longname); n_print (" Class:\t%s\n", factory->details.klass); n_print (" Description:\t%s\n", factory->details.description); n_print (" Author(s):\t%s\n", factory->details.author); n_print (" Rank:\t\t%s (%d)\n", get_rank_name (s, GST_PLUGIN_FEATURE (factory)->rank), GST_PLUGIN_FEATURE (factory)->rank); if (factory->meta_data != NULL) { gst_structure_foreach ((GstStructure *) factory->meta_data, print_factory_details_meta_data, NULL); } n_print ("\n"); }
EXPORT_C #endif void gst_tag_list_insert (GstTagList * into, const GstTagList * from, GstTagMergeMode mode) { GstTagCopyData data; g_return_if_fail (GST_IS_TAG_LIST (into)); g_return_if_fail (GST_IS_TAG_LIST (from)); g_return_if_fail (GST_TAG_MODE_IS_VALID (mode)); data.list = (GstStructure *) into; data.mode = mode; if (mode == GST_TAG_MERGE_REPLACE_ALL) { gst_structure_remove_all_fields (data.list); } gst_structure_foreach ((GstStructure *) from, gst_tag_list_copy_foreach, &data); }
static void gst_rtp_rtx_receive_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRtpRtxReceive *rtx = GST_RTP_RTX_RECEIVE (object); switch (prop_id) { case PROP_PAYLOAD_TYPE_MAP: GST_OBJECT_LOCK (rtx); if (rtx->rtx_pt_map_structure) gst_structure_free (rtx->rtx_pt_map_structure); rtx->rtx_pt_map_structure = g_value_dup_boxed (value); g_hash_table_remove_all (rtx->rtx_pt_map); gst_structure_foreach (rtx->rtx_pt_map_structure, structure_to_hash_table_inv, rtx->rtx_pt_map); GST_OBJECT_UNLOCK (rtx); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
void ges_base_xml_formatter_add_track (GESBaseXmlFormatter * self, GESTrackType track_type, GstCaps * caps, const gchar * id, GstStructure * properties, const gchar * metadatas, GError ** error) { GESTrack *track; GESBaseXmlFormatterPrivate *priv = _GET_PRIV (self); if (priv->check_only) { if (caps) gst_caps_unref (caps); return; } track = ges_track_new (track_type, caps); ges_timeline_add_track (GES_FORMATTER (self)->timeline, track); if (properties) { gchar *restriction; GstCaps *caps; gst_structure_get (properties, "restriction-caps", G_TYPE_STRING, &restriction, NULL); gst_structure_remove_fields (properties, "restriction-caps", "caps", "message-forward", NULL); if (g_strcmp0 (restriction, "NULL")) { caps = gst_caps_from_string (restriction); ges_track_set_restriction_caps (track, caps); } gst_structure_foreach (properties, (GstStructureForeachFunc) set_property_foreach, track); } g_hash_table_insert (priv->tracks, g_strdup (id), gst_object_ref (track)); if (metadatas) ges_meta_container_add_metas_from_string (GES_META_CONTAINER (track), metadatas); }
static void print_caps (const GstCaps * caps, const gchar * pfx) { guint i; g_return_if_fail (caps != NULL); if (gst_caps_is_any (caps)) { n_print ("%sANY\n", pfx); return; } if (gst_caps_is_empty (caps)) { n_print ("%sEMPTY\n", pfx); return; } for (i = 0; i < gst_caps_get_size (caps); i++) { GstStructure *structure = gst_caps_get_structure (caps, i); n_print ("%s%s\n", pfx, gst_structure_get_name (structure)); gst_structure_foreach (structure, print_field, (gpointer) pfx); } }
KmsSerializableMeta * kms_buffer_add_serializable_meta (GstBuffer * buffer, GstStructure * data) { KmsSerializableMeta *meta; g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL); meta = (KmsSerializableMeta *) gst_buffer_get_meta (buffer, KMS_SERIALIZABLE_META_API_TYPE); if (meta != NULL) { gst_structure_foreach (data, add_fields_to_structure, meta->data); gst_structure_free (data); } else { meta = (KmsSerializableMeta *) gst_buffer_add_meta (buffer, KMS_SERIALIZABLE_META_INFO, NULL); meta->data = data; } return meta; }
static void _append_query_caps_failure_details (GstValidatePadMonitor * monitor, GString * str) { gint i, j; gboolean found = FALSE, empty_filter; GstCaps *filter = gst_caps_copy (monitor->last_query_filter); GstCaps *possible_caps = gst_pad_query_caps (monitor->pad, NULL); const gchar *filter_name, *possible_name; GstStructure *filter_struct, *possible_struct; g_string_append_printf (str, "\n Caps negotiation failed starting from pad '%s'" " as the QUERY_CAPS returned EMPTY caps", gst_validate_reporter_get_name (GST_VALIDATE_REPORTER (monitor))); empty_filter = gst_caps_is_empty (filter); if (empty_filter) { GstPad *peer = _get_peer_pad (monitor->pad); gchar *prev_path = NULL; if (peer) { GstObject *prev = gst_pad_get_parent (peer); if (prev) { prev_path = gst_object_get_path_string (prev); gst_object_unref (prev); } } g_string_append_printf (str, "\n - The QUERY filter caps is EMPTY, this is invalid and is a bug in " " a previous element (probably in: '%s')\n", prev_path ? prev_path : "no suspect"); g_free (prev_path); } for (i = 0; i < gst_caps_get_size (possible_caps); i++) { possible_struct = gst_caps_get_structure (possible_caps, i); possible_name = gst_structure_get_name (possible_struct); for (j = 0; j < gst_caps_get_size (filter); j++) { StructureIncompatibleFieldsInfo info = { .caps_struct_num = i, .filter_caps_struct_num = j, .str = str, .found = found }; info.filter = filter_struct = gst_caps_get_structure (filter, j); filter_name = gst_structure_get_name (filter_struct); if (g_strcmp0 (possible_name, filter_name)) { _incompatible_fields_info_set_found (&info); g_string_append_printf (str, "\n -> Downstream caps struct %d name '%s' differs from " "filter caps struct %d name '%s'", i, possible_name, j, filter_name); continue; } gst_structure_foreach (possible_struct, (GstStructureForeachFunc) _find_structure_incompatible_fields, &info); if (info.found) found = TRUE; } } if (!found && !empty_filter) { gchar *filter_caps_str = gst_caps_to_string (filter); gchar *possible_caps_str = gst_caps_to_string (possible_caps); g_string_append_printf (str, ". The exact reason could not be determined but" " here is the gathered information:\n" " - %s last query caps filter: %s\n" " - %s possible caps (as returned by a query on it without filter): %s\n", gst_validate_reporter_get_name (GST_VALIDATE_REPORTER (monitor)), filter_caps_str, gst_validate_reporter_get_name (GST_VALIDATE_REPORTER (monitor)), possible_caps_str); } gst_caps_unref (possible_caps); gst_caps_unref (filter); }
/** * gst_rtp_base_payload_set_outcaps: * @payload: a #GstRTPBasePayload * @fieldname: the first field name or %NULL * @...: field values * * Configure the output caps with the optional parameters. * * Variable arguments should be in the form field name, field type * (as a GType), value(s). The last variable argument should be NULL. * * Returns: %TRUE if the caps could be set. */ gboolean gst_rtp_base_payload_set_outcaps (GstRTPBasePayload * payload, const gchar * fieldname, ...) { GstCaps *srccaps, *peercaps; gboolean res; /* fill in the defaults, their properties cannot be negotiated. */ srccaps = gst_caps_new_simple ("application/x-rtp", "media", G_TYPE_STRING, payload->media, "clock-rate", G_TYPE_INT, payload->clock_rate, "encoding-name", G_TYPE_STRING, payload->encoding_name, NULL); GST_DEBUG_OBJECT (payload, "defaults: %" GST_PTR_FORMAT, srccaps); if (fieldname) { va_list varargs; /* override with custom properties */ va_start (varargs, fieldname); gst_caps_set_simple_valist (srccaps, fieldname, varargs); va_end (varargs); GST_DEBUG_OBJECT (payload, "custom added: %" GST_PTR_FORMAT, srccaps); } payload->priv->caps_max_ptime = DEFAULT_MAX_PTIME; payload->ptime = 0; /* the peer caps can override some of the defaults */ peercaps = gst_pad_peer_query_caps (payload->srcpad, srccaps); if (peercaps == NULL) { /* no peer caps, just add the other properties */ gst_caps_set_simple (srccaps, "payload", G_TYPE_INT, GST_RTP_BASE_PAYLOAD_PT (payload), "ssrc", G_TYPE_UINT, payload->current_ssrc, "timestamp-offset", G_TYPE_UINT, payload->ts_base, "seqnum-offset", G_TYPE_UINT, payload->seqnum_base, NULL); GST_DEBUG_OBJECT (payload, "no peer caps: %" GST_PTR_FORMAT, srccaps); } else { GstCaps *temp; GstStructure *s, *d; const GValue *value; gint pt; guint max_ptime, ptime; /* peer provides caps we can use to fixate. They are already intersected * with our srccaps, just make them writable */ temp = gst_caps_make_writable (peercaps); gst_caps_unref (srccaps); if (gst_caps_is_empty (temp)) { gst_caps_unref (temp); return FALSE; } /* now fixate, start by taking the first caps */ temp = gst_caps_truncate (temp); /* get first structure */ s = gst_caps_get_structure (temp, 0); if (gst_structure_get_uint (s, "maxptime", &max_ptime)) payload->priv->caps_max_ptime = max_ptime * GST_MSECOND; if (gst_structure_get_uint (s, "ptime", &ptime)) payload->ptime = ptime * GST_MSECOND; if (gst_structure_get_int (s, "payload", &pt)) { /* use peer pt */ GST_RTP_BASE_PAYLOAD_PT (payload) = pt; GST_LOG_OBJECT (payload, "using peer pt %d", pt); } else { if (gst_structure_has_field (s, "payload")) { /* can only fixate if there is a field */ gst_structure_fixate_field_nearest_int (s, "payload", GST_RTP_BASE_PAYLOAD_PT (payload)); gst_structure_get_int (s, "payload", &pt); GST_LOG_OBJECT (payload, "using peer pt %d", pt); } else { /* no pt field, use the internal pt */ pt = GST_RTP_BASE_PAYLOAD_PT (payload); gst_structure_set (s, "payload", G_TYPE_INT, pt, NULL); GST_LOG_OBJECT (payload, "using internal pt %d", pt); } } if (gst_structure_has_field_typed (s, "ssrc", G_TYPE_UINT)) { value = gst_structure_get_value (s, "ssrc"); payload->current_ssrc = g_value_get_uint (value); GST_LOG_OBJECT (payload, "using peer ssrc %08x", payload->current_ssrc); } else { /* FIXME, fixate_nearest_uint would be even better */ gst_structure_set (s, "ssrc", G_TYPE_UINT, payload->current_ssrc, NULL); GST_LOG_OBJECT (payload, "using internal ssrc %08x", payload->current_ssrc); } if (gst_structure_has_field_typed (s, "timestamp-offset", G_TYPE_UINT)) { value = gst_structure_get_value (s, "timestamp-offset"); payload->ts_base = g_value_get_uint (value); GST_LOG_OBJECT (payload, "using peer timestamp-offset %u", payload->ts_base); } else { /* FIXME, fixate_nearest_uint would be even better */ gst_structure_set (s, "timestamp-offset", G_TYPE_UINT, payload->ts_base, NULL); GST_LOG_OBJECT (payload, "using internal timestamp-offset %u", payload->ts_base); } if (gst_structure_has_field_typed (s, "seqnum-offset", G_TYPE_UINT)) { value = gst_structure_get_value (s, "seqnum-offset"); payload->seqnum_base = g_value_get_uint (value); GST_LOG_OBJECT (payload, "using peer seqnum-offset %u", payload->seqnum_base); } else { /* FIXME, fixate_nearest_uint would be even better */ gst_structure_set (s, "seqnum-offset", G_TYPE_UINT, payload->seqnum_base, NULL); GST_LOG_OBJECT (payload, "using internal seqnum-offset %u", payload->seqnum_base); } /* make the target caps by copying over all the fixed caps, removing the * unfixed caps. */ srccaps = gst_caps_new_empty_simple (gst_structure_get_name (s)); d = gst_caps_get_structure (srccaps, 0); gst_structure_foreach (s, (GstStructureForeachFunc) copy_fixed, d); gst_caps_unref (temp); GST_DEBUG_OBJECT (payload, "with peer caps: %" GST_PTR_FORMAT, srccaps); } update_max_ptime (payload); res = gst_pad_set_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload), srccaps); gst_caps_unref (srccaps); return res; }
static void new_asset_cb (GESAsset * source, GAsyncResult * res, PendingAsset * passet) { GError *error = NULL; gchar *possible_id = NULL; GList *tmp, *pendings = NULL; GESFormatter *self = passet->formatter; const gchar *id = ges_asset_get_id (source); GESBaseXmlFormatterPrivate *priv = _GET_PRIV (self); GESAsset *asset = ges_asset_request_finish (res, &error); if (error) { GST_LOG_OBJECT (self, "Error %s creating asset id: %s", error->message, id); /* We set the metas on the Asset to give hints to the user */ if (passet->metadatas) ges_meta_container_add_metas_from_string (GES_META_CONTAINER (source), passet->metadatas); if (passet->properties) gst_structure_foreach (passet->properties, (GstStructureForeachFunc) set_property_foreach, source); possible_id = ges_project_try_updating_id (GES_FORMATTER (self)->project, source, error); if (possible_id == NULL) { GST_WARNING_OBJECT (self, "Abandoning creation of asset %s with ID %s" "- Error: %s", g_type_name (G_OBJECT_TYPE (source)), id, error->message); pendings = g_hash_table_lookup (priv->assetid_pendingclips, id); for (tmp = pendings; tmp; tmp = tmp->next) _free_pending_clip (priv, (PendingClip *) tmp->data); _free_pending_asset (priv, passet); goto done; } /* We got a possible ID replacement for that asset, create it, and * make sure the assetid_pendingclips will use it */ ges_asset_request_async (ges_asset_get_extractable_type (source), possible_id, NULL, (GAsyncReadyCallback) new_asset_cb, passet); ges_project_add_loading_asset (GES_FORMATTER (self)->project, ges_asset_get_extractable_type (source), possible_id); pendings = g_hash_table_lookup (priv->assetid_pendingclips, id); if (pendings) { g_hash_table_remove (priv->assetid_pendingclips, id); g_hash_table_insert (priv->assetid_pendingclips, g_strdup (possible_id), pendings); /* pendings should no be freed */ pendings = NULL; } goto done; } /* now that we have the GESAsset, we create the GESClips */ pendings = g_hash_table_lookup (priv->assetid_pendingclips, id); GST_DEBUG_OBJECT (self, "Asset created with ID %s, now creating pending " " Clips, nb pendings: %i", id, g_list_length (pendings)); for (tmp = pendings; tmp; tmp = tmp->next) { GList *tmpeffect; GESClip *clip; PendingClip *pend = (PendingClip *) tmp->data; clip = _add_object_to_layer (priv, pend->id, pend->layer, asset, pend->start, pend->inpoint, pend->duration, pend->track_types, pend->metadatas, pend->properties); if (clip == NULL) continue; _add_children_properties (priv, pend->children_props, clip); _add_pending_bindings (priv, pend->pending_bindings, clip); GST_DEBUG_OBJECT (self, "Adding %i effect to new object", g_list_length (pend->effects)); for (tmpeffect = pend->effects; tmpeffect; tmpeffect = tmpeffect->next) { PendingEffects *peffect = (PendingEffects *) tmpeffect->data; /* We keep a ref as _free_pending_effect unrefs it */ _add_track_element (self, clip, gst_object_ref (peffect->trackelement), peffect->track_id, peffect->children_properties, peffect->properties); } _free_pending_clip (priv, pend); } /* And now add to the project */ ges_project_add_asset (self->project, asset); gst_object_unref (self); _free_pending_asset (priv, passet); done: if (asset) gst_object_unref (asset); if (possible_id) g_free (possible_id); if (pendings) { g_hash_table_remove (priv->assetid_pendingclips, id); g_list_free (pendings); } if (g_hash_table_size (priv->assetid_pendingclips) == 0 && priv->pending_assets == NULL) _loading_done (self); }