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
* 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
* modify it under the terms of the GNU Library General Public
@ -22,6 +22,7 @@
#include <gst/gst.h>
#include <gst/base/gstbasesink.h>
#include <gio/gio.h>
G_BEGIN_DECLS
@ -40,10 +41,7 @@ typedef struct _GstMultiUDPSinkClass GstMultiUDPSinkClass;
typedef struct {
gint refcount;
int *sock;
struct sockaddr_storage theiraddr;
GSocketAddress *addr;
gchar *host;
gint port;
@ -59,7 +57,8 @@ typedef struct {
struct _GstMultiUDPSink {
GstBaseSink parent;
int sock;
GSocket *used_socket;
GCancellable *cancellable;
GMutex *client_lock;
GList *clients;
@ -67,17 +66,17 @@ struct _GstMultiUDPSink {
/* properties */
guint64 bytes_to_serve;
guint64 bytes_served;
int sockfd;
gboolean closefd;
GSocket *socket;
gboolean close_socket;
gboolean externalfd;
gboolean external_socket;
gboolean auto_multicast;
gint ttl;
gint ttl_mc;
gboolean loop;
gint qos_dscp;
guint16 ss_family;
GSocketFamily family;
gboolean send_duplicates;
gint buffer_size;
@ -90,7 +89,7 @@ struct _GstMultiUDPSinkClass {
void (*add) (GstMultiUDPSink *sink, const gchar *host, gint port);
void (*remove) (GstMultiUDPSink *sink, const gchar *host, gint port);
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 */
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_remove (GstMultiUDPSink *sink, const gchar *host, gint port);
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

View file

@ -1,5 +1,7 @@
/* GStreamer
* 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
* modify it under the terms of the GNU Library General Public
@ -35,14 +37,6 @@
#endif
#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_PORT 4951
@ -108,17 +102,22 @@ gst_udpsink_class_init (GstUDPSinkClass * klass)
static void
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,
udpsink->uri.port);
gst_multiudpsink_add (GST_MULTIUDPSINK (udpsink), udpsink->host,
udpsink->port);
}
static void
gst_udpsink_finalize (GstUDPSink * udpsink)
{
gst_udp_uri_free (&udpsink->uri);
g_free (udpsink->uristr);
g_free (udpsink->host);
udpsink->host = NULL;
g_free (udpsink->uri);
udpsink->uri = NULL;
G_OBJECT_CLASS (parent_class)->finalize ((GObject *) udpsink);
}
@ -126,14 +125,15 @@ gst_udpsink_finalize (GstUDPSink * udpsink)
static gboolean
gst_udpsink_set_uri (GstUDPSink * sink, const gchar * uri, GError ** error)
{
gst_multiudpsink_remove (GST_MULTIUDPSINK (sink), sink->uri.host,
sink->uri.port);
gst_multiudpsink_remove (GST_MULTIUDPSINK (sink), sink->host, sink->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;
gst_multiudpsink_add (GST_MULTIUDPSINK (sink), sink->uri.host,
sink->uri.port);
g_free (sink->uri);
sink->uri = g_strdup (uri);
gst_multiudpsink_add (GST_MULTIUDPSINK (sink), sink->host, sink->port);
return TRUE;
@ -158,7 +158,7 @@ gst_udpsink_set_property (GObject * object, guint prop_id, const GValue * value,
/* remove old host */
gst_multiudpsink_remove (GST_MULTIUDPSINK (udpsink),
udpsink->uri.host, udpsink->uri.port);
udpsink->host, udpsink->port);
switch (prop_id) {
case PROP_HOST:
@ -166,15 +166,18 @@ gst_udpsink_set_property (GObject * object, guint prop_id, const GValue * value,
const gchar *host;
host = g_value_get_string (value);
if (host)
gst_udp_uri_update (&udpsink->uri, host, -1);
else
gst_udp_uri_update (&udpsink->uri, UDP_DEFAULT_HOST, -1);
g_free (udpsink->host);
udpsink->host = g_strdup (host);
g_free (udpsink->uri);
udpsink->uri =
g_strdup_printf ("udp://%s:%d", udpsink->host, udpsink->port);
break;
}
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;
default:
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 */
gst_multiudpsink_add (GST_MULTIUDPSINK (udpsink),
udpsink->uri.host, udpsink->uri.port);
udpsink->host, udpsink->port);
}
static void
@ -195,10 +198,10 @@ gst_udpsink_get_property (GObject * object, guint prop_id, GValue * value,
switch (prop_id) {
case PROP_HOST:
g_value_set_string (value, udpsink->uri.host);
g_value_set_string (value, udpsink->host);
break;
case PROP_PORT:
g_value_set_int (value, udpsink->uri.port);
g_value_set_int (value, udpsink->port);
break;
default:
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);
g_free (sink->uristr);
sink->uristr = gst_udp_uri_string (&sink->uri);
return g_strdup (sink->uristr);
return g_strdup (sink->uri);
}
static gboolean

View file

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