udpsink/multiudpsink: Port to GIO

This commit is contained in:
Sebastian Dröge 2012-01-17 11:18:15 +01:00
parent 6f055d554b
commit bb38a849e5
4 changed files with 337 additions and 495 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/* GStreamer /* GStreamer
* Copyright (C) <2005> Wim Taymand <wim@fluendo.com> * Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public * modify it under the terms of the GNU Library General Public
@ -22,6 +22,7 @@
#include <gst/gst.h> #include <gst/gst.h>
#include <gst/base/gstbasesink.h> #include <gst/base/gstbasesink.h>
#include <gio/gio.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@ -40,10 +41,7 @@ typedef struct _GstMultiUDPSinkClass GstMultiUDPSinkClass;
typedef struct { typedef struct {
gint refcount; gint refcount;
int *sock; GSocketAddress *addr;
struct sockaddr_storage theiraddr;
gchar *host; gchar *host;
gint port; gint port;
@ -59,7 +57,8 @@ typedef struct {
struct _GstMultiUDPSink { struct _GstMultiUDPSink {
GstBaseSink parent; GstBaseSink parent;
int sock; GSocket *used_socket;
GCancellable *cancellable;
GMutex *client_lock; GMutex *client_lock;
GList *clients; GList *clients;
@ -67,17 +66,17 @@ struct _GstMultiUDPSink {
/* properties */ /* properties */
guint64 bytes_to_serve; guint64 bytes_to_serve;
guint64 bytes_served; guint64 bytes_served;
int sockfd; GSocket *socket;
gboolean closefd; gboolean close_socket;
gboolean externalfd; gboolean external_socket;
gboolean auto_multicast; gboolean auto_multicast;
gint ttl; gint ttl;
gint ttl_mc; gint ttl_mc;
gboolean loop; gboolean loop;
gint qos_dscp; gint qos_dscp;
guint16 ss_family; GSocketFamily family;
gboolean send_duplicates; gboolean send_duplicates;
gint buffer_size; gint buffer_size;
@ -90,7 +89,7 @@ struct _GstMultiUDPSinkClass {
void (*add) (GstMultiUDPSink *sink, const gchar *host, gint port); void (*add) (GstMultiUDPSink *sink, const gchar *host, gint port);
void (*remove) (GstMultiUDPSink *sink, const gchar *host, gint port); void (*remove) (GstMultiUDPSink *sink, const gchar *host, gint port);
void (*clear) (GstMultiUDPSink *sink); void (*clear) (GstMultiUDPSink *sink);
GValueArray* (*get_stats) (GstMultiUDPSink *sink, const gchar *host, gint port); GstStructure* (*get_stats) (GstMultiUDPSink *sink, const gchar *host, gint port);
/* signals */ /* signals */
void (*client_added) (GstElement *element, const gchar *host, gint port); void (*client_added) (GstElement *element, const gchar *host, gint port);
@ -102,7 +101,7 @@ GType gst_multiudpsink_get_type(void);
void gst_multiudpsink_add (GstMultiUDPSink *sink, const gchar *host, gint port); void gst_multiudpsink_add (GstMultiUDPSink *sink, const gchar *host, gint port);
void gst_multiudpsink_remove (GstMultiUDPSink *sink, const gchar *host, gint port); void gst_multiudpsink_remove (GstMultiUDPSink *sink, const gchar *host, gint port);
void gst_multiudpsink_clear (GstMultiUDPSink *sink); void gst_multiudpsink_clear (GstMultiUDPSink *sink);
GValueArray* gst_multiudpsink_get_stats (GstMultiUDPSink *sink, const gchar *host, gint port); GstStructure* gst_multiudpsink_get_stats (GstMultiUDPSink *sink, const gchar *host, gint port);
G_END_DECLS G_END_DECLS

View file

@ -1,5 +1,7 @@
/* GStreamer /* GStreamer
* Copyright (C) <2005> Wim Taymans <wim@fluendo.com> * Copyright (C) <2005> Wim Taymans <wim@fluendo.com>
* Copyright (C) <2012> Collabora Ltd.
* Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public * modify it under the terms of the GNU Library General Public
@ -35,14 +37,6 @@
#endif #endif
#include "gstudpsink.h" #include "gstudpsink.h"
#include <stdio.h>
#include <stdlib.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <errno.h>
#include <string.h>
#define UDP_DEFAULT_HOST "localhost" #define UDP_DEFAULT_HOST "localhost"
#define UDP_DEFAULT_PORT 4951 #define UDP_DEFAULT_PORT 4951
@ -108,17 +102,22 @@ gst_udpsink_class_init (GstUDPSinkClass * klass)
static void static void
gst_udpsink_init (GstUDPSink * udpsink) gst_udpsink_init (GstUDPSink * udpsink)
{ {
gst_udp_uri_init (&udpsink->uri, UDP_DEFAULT_HOST, UDP_DEFAULT_PORT); udpsink->host = g_strdup (UDP_DEFAULT_HOST);
udpsink->port = UDP_DEFAULT_PORT;
udpsink->uri = g_strdup_printf ("udp://%s:%d", udpsink->host, udpsink->port);
gst_multiudpsink_add (GST_MULTIUDPSINK (udpsink), udpsink->uri.host, gst_multiudpsink_add (GST_MULTIUDPSINK (udpsink), udpsink->host,
udpsink->uri.port); udpsink->port);
} }
static void static void
gst_udpsink_finalize (GstUDPSink * udpsink) gst_udpsink_finalize (GstUDPSink * udpsink)
{ {
gst_udp_uri_free (&udpsink->uri); g_free (udpsink->host);
g_free (udpsink->uristr); udpsink->host = NULL;
g_free (udpsink->uri);
udpsink->uri = NULL;
G_OBJECT_CLASS (parent_class)->finalize ((GObject *) udpsink); G_OBJECT_CLASS (parent_class)->finalize ((GObject *) udpsink);
} }
@ -126,14 +125,15 @@ gst_udpsink_finalize (GstUDPSink * udpsink)
static gboolean static gboolean
gst_udpsink_set_uri (GstUDPSink * sink, const gchar * uri, GError ** error) gst_udpsink_set_uri (GstUDPSink * sink, const gchar * uri, GError ** error)
{ {
gst_multiudpsink_remove (GST_MULTIUDPSINK (sink), sink->uri.host, gst_multiudpsink_remove (GST_MULTIUDPSINK (sink), sink->host, sink->port);
sink->uri.port);
if (gst_udp_parse_uri (uri, &sink->uri.host, &sink->uri.port) < 0) if (!gst_udp_parse_uri (uri, &sink->host, &sink->port))
goto wrong_uri; goto wrong_uri;
gst_multiudpsink_add (GST_MULTIUDPSINK (sink), sink->uri.host, g_free (sink->uri);
sink->uri.port); sink->uri = g_strdup (uri);
gst_multiudpsink_add (GST_MULTIUDPSINK (sink), sink->host, sink->port);
return TRUE; return TRUE;
@ -158,7 +158,7 @@ gst_udpsink_set_property (GObject * object, guint prop_id, const GValue * value,
/* remove old host */ /* remove old host */
gst_multiudpsink_remove (GST_MULTIUDPSINK (udpsink), gst_multiudpsink_remove (GST_MULTIUDPSINK (udpsink),
udpsink->uri.host, udpsink->uri.port); udpsink->host, udpsink->port);
switch (prop_id) { switch (prop_id) {
case PROP_HOST: case PROP_HOST:
@ -166,15 +166,18 @@ gst_udpsink_set_property (GObject * object, guint prop_id, const GValue * value,
const gchar *host; const gchar *host;
host = g_value_get_string (value); host = g_value_get_string (value);
g_free (udpsink->host);
if (host) udpsink->host = g_strdup (host);
gst_udp_uri_update (&udpsink->uri, host, -1); g_free (udpsink->uri);
else udpsink->uri =
gst_udp_uri_update (&udpsink->uri, UDP_DEFAULT_HOST, -1); g_strdup_printf ("udp://%s:%d", udpsink->host, udpsink->port);
break; break;
} }
case PROP_PORT: case PROP_PORT:
gst_udp_uri_update (&udpsink->uri, NULL, g_value_get_int (value)); udpsink->port = g_value_get_int (value);
g_free (udpsink->uri);
udpsink->uri =
g_strdup_printf ("udp://%s:%d", udpsink->host, udpsink->port);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -182,7 +185,7 @@ gst_udpsink_set_property (GObject * object, guint prop_id, const GValue * value,
} }
/* add new host */ /* add new host */
gst_multiudpsink_add (GST_MULTIUDPSINK (udpsink), gst_multiudpsink_add (GST_MULTIUDPSINK (udpsink),
udpsink->uri.host, udpsink->uri.port); udpsink->host, udpsink->port);
} }
static void static void
@ -195,10 +198,10 @@ gst_udpsink_get_property (GObject * object, guint prop_id, GValue * value,
switch (prop_id) { switch (prop_id) {
case PROP_HOST: case PROP_HOST:
g_value_set_string (value, udpsink->uri.host); g_value_set_string (value, udpsink->host);
break; break;
case PROP_PORT: case PROP_PORT:
g_value_set_int (value, udpsink->uri.port); g_value_set_int (value, udpsink->port);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -227,10 +230,7 @@ gst_udpsink_uri_get_uri (GstURIHandler * handler)
{ {
GstUDPSink *sink = GST_UDPSINK (handler); GstUDPSink *sink = GST_UDPSINK (handler);
g_free (sink->uristr); return g_strdup (sink->uri);
sink->uristr = gst_udp_uri_string (&sink->uri);
return g_strdup (sink->uristr);
} }
static gboolean static gboolean

View file

@ -41,8 +41,10 @@ typedef struct _GstUDPSinkClass GstUDPSinkClass;
struct _GstUDPSink { struct _GstUDPSink {
GstMultiUDPSink parent; GstMultiUDPSink parent;
GstUDPUri uri; gchar *host;
gchar *uristr; guint16 port;
gchar *uri;
}; };
struct _GstUDPSinkClass { struct _GstUDPSinkClass {