diff options
author | Thibault Saunier <tsaunier@igalia.com> | 2020-03-19 09:35:57 -0300 |
---|---|---|
committer | GStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2020-10-29 13:30:07 +0000 |
commit | a5fd2a4bc36586d69480361ab8c974a33681b2d6 (patch) | |
tree | b4e47f36313c365ac82dcb4aaf55f8727bb2d9f9 | |
parent | 7d1f5e951f6ebdc72c64bef6c7559eae25abaadf (diff) | |
download | gstreamer-plugins-bad-a5fd2a4bc36586d69480361ab8c974a33681b2d6.tar.gz |
uritranscodebin: Move to using a urisourcebin for our source.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1151>
-rw-r--r-- | gst-libs/gst/transcoder/gsttranscoder.c | 2 | ||||
-rw-r--r-- | gst/transcode/gsturitranscodebin.c | 91 |
2 files changed, 61 insertions, 32 deletions
diff --git a/gst-libs/gst/transcoder/gsttranscoder.c b/gst-libs/gst/transcoder/gsttranscoder.c index cbf4629b0..4b26c9bf2 100644 --- a/gst-libs/gst/transcoder/gsttranscoder.c +++ b/gst-libs/gst/transcoder/gsttranscoder.c @@ -593,7 +593,7 @@ dump_dot_file (GstTranscoder * self, const gchar * name) full_name = g_strdup_printf ("gst-transcoder.%p.%s", self, name); GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (self->transcodebin), - GST_DEBUG_GRAPH_SHOW_VERBOSE, full_name); + GST_DEBUG_GRAPH_SHOW_ALL, full_name); g_free (full_name); } diff --git a/gst/transcode/gsturitranscodebin.c b/gst/transcode/gsturitranscodebin.c index 9b74ae469..212c04d52 100644 --- a/gst/transcode/gsturitranscodebin.c +++ b/gst/transcode/gsturitranscodebin.c @@ -110,7 +110,7 @@ make_transcodebin (GstUriTranscodeBin * self) self->transcodebin = gst_element_factory_make ("transcodebin", NULL); if (!self->transcodebin) - goto no_decodebin; + goto no_transcodebin; g_object_set (self->transcodebin, "profile", self->profile, "video-filter", self->video_filter, @@ -118,13 +118,15 @@ make_transcodebin (GstUriTranscodeBin * self) "avoid-reencoding", self->avoid_reencoding, NULL); gst_bin_add (GST_BIN (self), self->transcodebin); - if (!gst_element_link (self->transcodebin, self->sink)) + if (!gst_element_link (self->transcodebin, self->sink)) { + GST_ERROR ("Could not link transcodbin"); return FALSE; + } return TRUE; /* ERRORS */ -no_decodebin: +no_transcodebin: { post_missing_plugin_error (GST_ELEMENT_CAST (self), "transcodebin"); @@ -191,6 +193,49 @@ no_sink: } } +static void +src_pad_added_cb (GstElement * src, GstPad * pad, GstUriTranscodeBin * self) +{ + GstPad *sinkpad = NULL; + GstPadLinkReturn res; + + GST_DEBUG_OBJECT (self, + "New pad %" GST_PTR_FORMAT " from source %" GST_PTR_FORMAT, pad, src); + + if (sinkpad == NULL) + sinkpad = gst_element_get_static_pad (self->transcodebin, "sink"); + + if (gst_pad_is_linked (sinkpad)) { + GST_WARNING_OBJECT (self, "Pad already linked...."); + return; + } + + if (sinkpad) { + GST_DEBUG_OBJECT (self, + "Linking %" GST_PTR_FORMAT " to %" GST_PTR_FORMAT, pad, sinkpad); + res = gst_pad_link (pad, sinkpad); + gst_object_unref (sinkpad); + if (GST_PAD_LINK_FAILED (res)) + goto link_failed; + } + return; + +link_failed: + { + GST_ERROR_OBJECT (self, + "failed to link pad %s:%s to decodebin, reason %s (%d)", + GST_DEBUG_PAD_NAME (pad), gst_pad_link_get_name (res), res); + return; + } +} + +static void +src_pad_removed_cb (GstElement * element, GstPad * pad, + GstUriTranscodeBin * self) +{ + /* FIXME : IMPLEMENT */ +} + static gboolean make_source (GstUriTranscodeBin * self) { @@ -199,15 +244,17 @@ make_source (GstUriTranscodeBin * self) if (!gst_uri_is_valid (self->source_uri)) goto invalid_uri; - self->src = gst_element_make_from_uri (GST_URI_SRC, self->source_uri, - "src", &err); + self->src = gst_element_factory_make ("urisourcebin", NULL); if (!self->src) - goto no_sink; + goto no_urisourcebin; gst_bin_add (GST_BIN (self), self->src); - if (!gst_element_link (self->src, self->transcodebin)) - return FALSE; + g_object_set (self->src, "uri", self->source_uri, NULL); + + g_signal_connect (self->src, "pad-added", (GCallback) src_pad_added_cb, self); + g_signal_connect (self->src, "pad-removed", + (GCallback) src_pad_removed_cb, self); return TRUE; @@ -219,34 +266,16 @@ invalid_uri: return FALSE; } -no_sink: +no_urisourcebin: { - /* whoops, could not create the source element, dig a little deeper to - * figure out what might be wrong. */ - if (err != NULL && err->code == GST_URI_ERROR_UNSUPPORTED_PROTOCOL) { - gchar *prot; - - prot = gst_uri_get_protocol (self->source_uri); - if (prot == NULL) - goto invalid_uri; - - gst_element_post_message (GST_ELEMENT_CAST (self), - gst_missing_uri_source_message_new (GST_ELEMENT (self), prot)); - - GST_ELEMENT_ERROR (self, CORE, MISSING_PLUGIN, - ("No URI handler implemented for \"%s\".", prot), (NULL)); + post_missing_plugin_error (GST_ELEMENT_CAST (self), "urisourcebin"); - g_free (prot); - } else { - GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, - ("%s", (err) ? err->message : "URI was not accepted by any element"), - ("No element accepted URI '%s'", self->dest_uri)); - } - - g_clear_error (&err); + GST_ELEMENT_ERROR (self, CORE, MISSING_PLUGIN, (NULL), + ("No urisourcebin element, check your installation")); return FALSE; } + } static void |