static void print_topology (GstDiscovererStreamInfo * info, gint depth) { GstDiscovererStreamInfo *next; if (!info) return; print_stream_info (info, GINT_TO_POINTER (depth)); next = gst_discoverer_stream_info_get_next (info); if (next) { print_topology (next, depth + 1); gst_discoverer_stream_info_unref (next); } else if (GST_IS_DISCOVERER_CONTAINER_INFO (info)) { GList *tmp, *streams; streams = gst_discoverer_container_info_get_streams (GST_DISCOVERER_CONTAINER_INFO (info)); for (tmp = streams; tmp; tmp = tmp->next) { GstDiscovererStreamInfo *tmpinf = (GstDiscovererStreamInfo *) tmp->data; print_topology (tmpinf, depth + 1); } gst_discoverer_stream_info_list_free (streams); } }
/** * gst_encoding_profile_from_discoverer: * @info: (transfer none): The #GstDiscovererInfo to read from * * Creates a #GstEncodingProfile matching the formats from the given * #GstDiscovererInfo. Streams other than audio or video (eg, * subtitles), are currently ignored. * * Returns: (transfer full): The new #GstEncodingProfile or %NULL. */ GstEncodingProfile * gst_encoding_profile_from_discoverer (GstDiscovererInfo * info) { GstEncodingContainerProfile *profile; GstDiscovererStreamInfo *sinfo; GList *streams, *stream; GstCaps *caps = NULL; guint n_streams = 0; if (!info || gst_discoverer_info_get_result (info) != GST_DISCOVERER_OK) return NULL; sinfo = gst_discoverer_info_get_stream_info (info); if (!sinfo) return NULL; caps = gst_discoverer_stream_info_get_caps (sinfo); GST_LOG ("Container: %" GST_PTR_FORMAT "\n", caps); profile = gst_encoding_container_profile_new ("auto-generated", "Automatically generated from GstDiscovererInfo", caps, NULL); gst_caps_unref (caps); if (!profile) { GST_ERROR ("Failed to create container profile from caps %" GST_PTR_FORMAT, caps); return NULL; } streams = gst_discoverer_container_info_get_streams (GST_DISCOVERER_CONTAINER_INFO (sinfo)); for (stream = streams; stream; stream = stream->next) { if (add_stream_to_profile (profile, (GstDiscovererStreamInfo *) stream->data)) n_streams++; } gst_discoverer_stream_info_list_free (streams); if (n_streams == 0) { GST_ERROR ("Failed to add any streams"); g_object_unref (profile); return NULL; } return (GstEncodingProfile *) profile; }
static GstValidateStreamInfo * gst_validate_stream_info_from_discoverer_info (GstDiscovererStreamInfo * info) { GstValidateStreamInfo *ret = g_new0 (GstValidateStreamInfo, 1); ret->caps = gst_discoverer_stream_info_get_caps (info); if (GST_IS_DISCOVERER_CONTAINER_INFO (info)) { GList *streams = gst_discoverer_container_info_get_streams (GST_DISCOVERER_CONTAINER_INFO (info)); GList *iter; for (iter = streams; iter; iter = g_list_next (iter)) { ret->children = g_list_append (ret->children, gst_validate_stream_info_from_discoverer_info (iter->data)); } gst_discoverer_stream_info_list_free (streams); } return ret; }
static gboolean add_stream_to_profile (GstEncodingContainerProfile * profile, GstDiscovererStreamInfo * sinfo) { GstEncodingProfile *sprofile = NULL; GstStructure *s; GstCaps *caps; caps = gst_discoverer_stream_info_get_caps (sinfo); /* Should unify this with copy_and_clean_caps() */ s = gst_caps_get_structure (caps, 0); if (gst_structure_has_field (s, "codec_data") || gst_structure_has_field (s, "streamheader") || gst_structure_has_field (s, "parsed") || gst_structure_has_field (s, "framed") || gst_structure_has_field (s, "stream-format") || gst_structure_has_field (s, "alignment")) { caps = gst_caps_make_writable (caps); s = gst_caps_get_structure (caps, 0); gst_structure_remove_field (s, "codec_data"); gst_structure_remove_field (s, "streamheader"); gst_structure_remove_field (s, "parsed"); gst_structure_remove_field (s, "framed"); gst_structure_remove_field (s, "stream-format"); gst_structure_remove_field (s, "alignment"); } GST_LOG ("Stream: %" GST_PTR_FORMAT "\n", caps); if (GST_IS_DISCOVERER_AUDIO_INFO (sinfo)) { sprofile = (GstEncodingProfile *) gst_encoding_audio_profile_new (caps, NULL, NULL, 0); } else if (GST_IS_DISCOVERER_VIDEO_INFO (sinfo)) { sprofile = (GstEncodingProfile *) gst_encoding_video_profile_new (caps, NULL, NULL, 0); } else if (GST_IS_DISCOVERER_CONTAINER_INFO (sinfo)) { GList *streams, *stream; guint n_streams = 0; streams = gst_discoverer_container_info_get_streams (GST_DISCOVERER_CONTAINER_INFO (sinfo)); for (stream = streams; stream; stream = stream->next) { if (add_stream_to_profile (profile, (GstDiscovererStreamInfo *) stream->data)) n_streams++; } gst_discoverer_stream_info_list_free (streams); gst_caps_unref (caps); return n_streams != 0; } else { GST_WARNING ("Ignoring stream of type '%s'", g_type_name (G_OBJECT_TYPE (sinfo))); /* subtitles or other ? ignore for now */ } if (sprofile) gst_encoding_container_profile_add_profile (profile, sprofile); else GST_ERROR ("Failed to create stream profile from caps %" GST_PTR_FORMAT, caps); gst_caps_unref (caps); return sprofile != NULL; }