mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 04:06:12 +00:00
elements: update fd + file sources and sinks for GstUriHandler changes
This commit is contained in:
parent
682704750c
commit
dfa9bb8088
4 changed files with 57 additions and 50 deletions
|
@ -315,7 +315,7 @@ write_error:
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_fd_sink_check_fd (GstFdSink * fdsink, int fd)
|
gst_fd_sink_check_fd (GstFdSink * fdsink, int fd, GError ** error)
|
||||||
{
|
{
|
||||||
struct stat stat_results;
|
struct stat stat_results;
|
||||||
off_t result;
|
off_t result;
|
||||||
|
@ -347,6 +347,8 @@ invalid:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (fdsink, RESOURCE, WRITE, (NULL),
|
GST_ELEMENT_ERROR (fdsink, RESOURCE, WRITE, (NULL),
|
||||||
("File descriptor %d is not valid: %s", fd, g_strerror (errno)));
|
("File descriptor %d is not valid: %s", fd, g_strerror (errno)));
|
||||||
|
g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_REFERENCE,
|
||||||
|
"File descriptor %d is not valid: %s", fd, g_strerror (errno));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
not_seekable:
|
not_seekable:
|
||||||
|
@ -363,7 +365,7 @@ gst_fd_sink_start (GstBaseSink * basesink)
|
||||||
GstPollFD fd = GST_POLL_FD_INIT;
|
GstPollFD fd = GST_POLL_FD_INIT;
|
||||||
|
|
||||||
fdsink = GST_FD_SINK (basesink);
|
fdsink = GST_FD_SINK (basesink);
|
||||||
if (!gst_fd_sink_check_fd (fdsink, fdsink->fd))
|
if (!gst_fd_sink_check_fd (fdsink, fdsink->fd, NULL))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if ((fdsink->fdset = gst_poll_new (TRUE)) == NULL)
|
if ((fdsink->fdset = gst_poll_new (TRUE)) == NULL)
|
||||||
|
@ -427,12 +429,15 @@ gst_fd_sink_unlock_stop (GstBaseSink * basesink)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_fd_sink_update_fd (GstFdSink * fdsink, int new_fd)
|
gst_fd_sink_update_fd (GstFdSink * fdsink, int new_fd, GError ** error)
|
||||||
{
|
{
|
||||||
if (new_fd < 0)
|
if (new_fd < 0) {
|
||||||
|
g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_REFERENCE,
|
||||||
|
"File descriptor %d is not valid", new_fd);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (!gst_fd_sink_check_fd (fdsink, new_fd))
|
if (!gst_fd_sink_check_fd (fdsink, new_fd, error))
|
||||||
goto invalid;
|
goto invalid;
|
||||||
|
|
||||||
/* assign the fd */
|
/* assign the fd */
|
||||||
|
@ -474,7 +479,7 @@ gst_fd_sink_set_property (GObject * object, guint prop_id,
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
fd = g_value_get_int (value);
|
fd = g_value_get_int (value);
|
||||||
gst_fd_sink_update_fd (fdsink, fd);
|
gst_fd_sink_update_fd (fdsink, fd, NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -594,32 +599,29 @@ gst_fd_sink_uri_get_protocols (GType type)
|
||||||
return protocols;
|
return protocols;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const gchar *
|
static gchar *
|
||||||
gst_fd_sink_uri_get_uri (GstURIHandler * handler)
|
gst_fd_sink_uri_get_uri (GstURIHandler * handler)
|
||||||
{
|
{
|
||||||
GstFdSink *sink = GST_FD_SINK (handler);
|
GstFdSink *sink = GST_FD_SINK (handler);
|
||||||
|
|
||||||
return sink->uri;
|
/* FIXME: make thread-safe */
|
||||||
|
return g_strdup (sink->uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_fd_sink_uri_set_uri (GstURIHandler * handler, const gchar * uri)
|
gst_fd_sink_uri_set_uri (GstURIHandler * handler, const gchar * uri,
|
||||||
|
GError ** error)
|
||||||
{
|
{
|
||||||
gchar *protocol;
|
|
||||||
GstFdSink *sink = GST_FD_SINK (handler);
|
GstFdSink *sink = GST_FD_SINK (handler);
|
||||||
gint fd;
|
gint fd;
|
||||||
|
|
||||||
protocol = gst_uri_get_protocol (uri);
|
if (sscanf (uri, "fd://%d", &fd) != 1) {
|
||||||
if (strcmp (protocol, "fd") != 0) {
|
g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI,
|
||||||
g_free (protocol);
|
"File descriptor URI could not be parsed");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
g_free (protocol);
|
|
||||||
|
|
||||||
if (sscanf (uri, "fd://%d", &fd) != 1)
|
return gst_fd_sink_update_fd (sink, fd, error);
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
return gst_fd_sink_update_fd (sink, fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -613,16 +613,18 @@ gst_fd_src_uri_get_protocols (GType type)
|
||||||
return protocols;
|
return protocols;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const gchar *
|
static gchar *
|
||||||
gst_fd_src_uri_get_uri (GstURIHandler * handler)
|
gst_fd_src_uri_get_uri (GstURIHandler * handler)
|
||||||
{
|
{
|
||||||
GstFdSrc *src = GST_FD_SRC (handler);
|
GstFdSrc *src = GST_FD_SRC (handler);
|
||||||
|
|
||||||
return src->uri;
|
/* FIXME: make thread-safe */
|
||||||
|
return g_strdup (src->uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_fd_src_uri_set_uri (GstURIHandler * handler, const gchar * uri)
|
gst_fd_src_uri_set_uri (GstURIHandler * handler, const gchar * uri,
|
||||||
|
GError ** err)
|
||||||
{
|
{
|
||||||
gchar *protocol, *q;
|
gchar *protocol, *q;
|
||||||
GstFdSrc *src = GST_FD_SRC (handler);
|
GstFdSrc *src = GST_FD_SRC (handler);
|
||||||
|
|
|
@ -269,7 +269,8 @@ gst_file_sink_dispose (GObject * object)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_file_sink_set_location (GstFileSink * sink, const gchar * location)
|
gst_file_sink_set_location (GstFileSink * sink, const gchar * location,
|
||||||
|
GError ** error)
|
||||||
{
|
{
|
||||||
if (sink->file)
|
if (sink->file)
|
||||||
goto was_open;
|
goto was_open;
|
||||||
|
@ -295,6 +296,9 @@ was_open:
|
||||||
{
|
{
|
||||||
g_warning ("Changing the `location' property on filesink when a file is "
|
g_warning ("Changing the `location' property on filesink when a file is "
|
||||||
"open is not supported.");
|
"open is not supported.");
|
||||||
|
g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_STATE,
|
||||||
|
"Changing the 'location' property on filesink when a file is "
|
||||||
|
"open is not supported");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -307,7 +311,7 @@ gst_file_sink_set_property (GObject * object, guint prop_id,
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_LOCATION:
|
case PROP_LOCATION:
|
||||||
gst_file_sink_set_location (sink, g_value_get_string (value));
|
gst_file_sink_set_location (sink, g_value_get_string (value), NULL);
|
||||||
break;
|
break;
|
||||||
case PROP_BUFFER_MODE:
|
case PROP_BUFFER_MODE:
|
||||||
sink->buffer_mode = g_value_get_enum (value);
|
sink->buffer_mode = g_value_get_enum (value);
|
||||||
|
@ -693,28 +697,23 @@ gst_file_sink_uri_get_protocols (GType type)
|
||||||
return protocols;
|
return protocols;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const gchar *
|
static gchar *
|
||||||
gst_file_sink_uri_get_uri (GstURIHandler * handler)
|
gst_file_sink_uri_get_uri (GstURIHandler * handler)
|
||||||
{
|
{
|
||||||
GstFileSink *sink = GST_FILE_SINK (handler);
|
GstFileSink *sink = GST_FILE_SINK (handler);
|
||||||
|
|
||||||
return sink->uri;
|
/* FIXME: make thread-safe */
|
||||||
|
return g_strdup (sink->uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_file_sink_uri_set_uri (GstURIHandler * handler, const gchar * uri)
|
gst_file_sink_uri_set_uri (GstURIHandler * handler, const gchar * uri,
|
||||||
|
GError ** error)
|
||||||
{
|
{
|
||||||
gchar *protocol, *location;
|
gchar *location;
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
GstFileSink *sink = GST_FILE_SINK (handler);
|
GstFileSink *sink = GST_FILE_SINK (handler);
|
||||||
|
|
||||||
protocol = gst_uri_get_protocol (uri);
|
|
||||||
if (strcmp (protocol, "file") != 0) {
|
|
||||||
g_free (protocol);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
g_free (protocol);
|
|
||||||
|
|
||||||
/* allow file://localhost/foo/bar by stripping localhost but fail
|
/* allow file://localhost/foo/bar by stripping localhost but fail
|
||||||
* for every other hostname */
|
* for every other hostname */
|
||||||
if (g_str_has_prefix (uri, "file://localhost/")) {
|
if (g_str_has_prefix (uri, "file://localhost/")) {
|
||||||
|
@ -730,20 +729,26 @@ gst_file_sink_uri_set_uri (GstURIHandler * handler, const gchar * uri)
|
||||||
/* Special case for "file://" as this is used by some applications
|
/* Special case for "file://" as this is used by some applications
|
||||||
* to test with gst_element_make_from_uri if there's an element
|
* to test with gst_element_make_from_uri if there's an element
|
||||||
* that supports the URI protocol. */
|
* that supports the URI protocol. */
|
||||||
gst_file_sink_set_location (sink, NULL);
|
gst_file_sink_set_location (sink, NULL, NULL);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
} else {
|
} else {
|
||||||
location = gst_uri_get_location (uri);
|
location = gst_uri_get_location (uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!location)
|
if (!location) {
|
||||||
|
g_set_error_literal (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI,
|
||||||
|
"File URI without location");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (!g_path_is_absolute (location)) {
|
if (!g_path_is_absolute (location)) {
|
||||||
|
g_set_error_literal (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI,
|
||||||
|
"File URI location must be an absolute path");
|
||||||
g_free (location);
|
g_free (location);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = gst_file_sink_set_location (sink, location);
|
ret = gst_file_sink_set_location (sink, location, error);
|
||||||
g_free (location);
|
g_free (location);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -590,21 +590,22 @@ gst_file_src_uri_get_protocols (GType type)
|
||||||
return protocols;
|
return protocols;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const gchar *
|
static gchar *
|
||||||
gst_file_src_uri_get_uri (GstURIHandler * handler)
|
gst_file_src_uri_get_uri (GstURIHandler * handler)
|
||||||
{
|
{
|
||||||
GstFileSrc *src = GST_FILE_SRC (handler);
|
GstFileSrc *src = GST_FILE_SRC (handler);
|
||||||
|
|
||||||
return src->uri;
|
/* FIXME: make thread-safe */
|
||||||
|
return g_strdup (src->uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_file_src_uri_set_uri (GstURIHandler * handler, const gchar * uri)
|
gst_file_src_uri_set_uri (GstURIHandler * handler, const gchar * uri,
|
||||||
|
GError ** err)
|
||||||
{
|
{
|
||||||
gchar *location, *hostname = NULL;
|
gchar *location, *hostname = NULL;
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
GstFileSrc *src = GST_FILE_SRC (handler);
|
GstFileSrc *src = GST_FILE_SRC (handler);
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
if (strcmp (uri, "file://") == 0) {
|
if (strcmp (uri, "file://") == 0) {
|
||||||
/* Special case for "file://" as this is used by some applications
|
/* Special case for "file://" as this is used by some applications
|
||||||
|
@ -614,22 +615,19 @@ gst_file_src_uri_set_uri (GstURIHandler * handler, const gchar * uri)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
location = g_filename_from_uri (uri, &hostname, &error);
|
location = g_filename_from_uri (uri, &hostname, err);
|
||||||
|
|
||||||
if (!location || error) {
|
if (!location || (err != NULL && *err != NULL)) {
|
||||||
if (error) {
|
GST_WARNING_OBJECT (src, "Invalid URI '%s' for filesrc: %s", uri,
|
||||||
GST_WARNING_OBJECT (src, "Invalid URI '%s' for filesrc: %s", uri,
|
(err != NULL && *err != NULL) ? (*err)->message : "unknown error");
|
||||||
error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
} else {
|
|
||||||
GST_WARNING_OBJECT (src, "Invalid URI '%s' for filesrc", uri);
|
|
||||||
}
|
|
||||||
goto beach;
|
goto beach;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((hostname) && (strcmp (hostname, "localhost"))) {
|
if ((hostname) && (strcmp (hostname, "localhost"))) {
|
||||||
/* Only 'localhost' is permitted */
|
/* Only 'localhost' is permitted */
|
||||||
GST_WARNING_OBJECT (src, "Invalid hostname '%s' for filesrc", hostname);
|
GST_WARNING_OBJECT (src, "Invalid hostname '%s' for filesrc", hostname);
|
||||||
|
g_set_error (err, GST_URI_ERROR, GST_URI_ERROR_BAD_URI,
|
||||||
|
"File URI with invalid hostname '%s'", hostname);
|
||||||
goto beach;
|
goto beach;
|
||||||
}
|
}
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
|
|
Loading…
Reference in a new issue