From 0a4ec4c8a12f9bdf96074ab9e457d944f867f37c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 16 Jan 2012 13:34:28 +0100 Subject: [PATCH] netaddressmeta: Use GSocketAddress instead of our own wrapper type --- configure.ac | 16 ++ libs/gst/net/Makefile.am | 4 +- libs/gst/net/gstnetaddressmeta.c | 344 +++--------------------------- libs/gst/net/gstnetaddressmeta.h | 70 +----- pkgconfig/gstreamer-net-uninstalled.pc.in | 2 +- pkgconfig/gstreamer-net.pc.in | 2 +- 6 files changed, 53 insertions(+), 385 deletions(-) diff --git a/configure.ac b/configure.ac index b2bc5f8..2983e96 100644 --- a/configure.ac +++ b/configure.ac @@ -534,6 +534,22 @@ AG_GST_GLIB_CHECK([$GLIB_REQ]) dnl Check for glib2 without extra fat, useful for the unversioned tool frontends PKG_CHECK_MODULES(GLIB_ONLY, glib-2.0 >= $GLIB_REQ) +dnl Check for GIO +translit(dnm, m, l) AM_CONDITIONAL(USE_GIO, true) +AG_GST_CHECK_FEATURE(GIO, [GIO library], gio, [ + PKG_CHECK_MODULES(GIO, gio-2.0 >= 2.31.10) + GIO_MODULE_DIR="`$PKG_CONFIG --variable=giomoduledir gio-2.0`" + AC_DEFINE_UNQUOTED(GIO_MODULE_DIR, "$GIO_MODULE_DIR", + [The GIO modules directory.]) + GIO_LIBDIR="`$PKG_CONFIG --variable=libdir gio-2.0`" + AC_DEFINE_UNQUOTED(GIO_LIBDIR, "$GIO_LIBDIR", + [The GIO library directory.]) + + AC_SUBST(GIO_CFLAGS) + AC_SUBST(GIO_LIBS) + AC_SUBST(GIO_LDFLAGS) +]) + dnl Check for documentation xrefs GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`" AC_SUBST(GLIB_PREFIX) diff --git a/libs/gst/net/Makefile.am b/libs/gst/net/Makefile.am index 2a758d4..33bd014 100644 --- a/libs/gst/net/Makefile.am +++ b/libs/gst/net/Makefile.am @@ -14,8 +14,8 @@ libgstnet_@GST_MAJORMINOR@_la_SOURCES = \ gstnettimepacket.c \ gstnettimeprovider.c -libgstnet_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS) -libgstnet_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS) $(INET_ATON_LIBS) $(WIN32_LIBS) +libgstnet_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS) $(GIO_CFLAGS) +libgstnet_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS) $(INET_ATON_LIBS) $(WIN32_LIBS) $(GIO_LIBS) libgstnet_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS) CLEANFILES = *.gcno *.gcda *.gcov diff --git a/libs/gst/net/gstnetaddressmeta.c b/libs/gst/net/gstnetaddressmeta.c index d9f1ddd..5e687d4 100644 --- a/libs/gst/net/gstnetaddressmeta.c +++ b/libs/gst/net/gstnetaddressmeta.c @@ -32,14 +32,28 @@ #include "gstnetaddressmeta.h" +static gboolean +net_address_meta_init (GstNetAddressMeta * meta, gpointer params, + GstBuffer * buffer) +{ + meta->addr = NULL; + + return TRUE; +} + static void net_address_meta_copy (GstBuffer * copybuf, GstNetAddressMeta * meta, GstBuffer * buffer, gsize offset, gsize size) { - GstNetAddressMeta *naddr; + gst_buffer_add_net_address_meta (copybuf, meta->addr); +} - naddr = gst_buffer_add_net_address_meta (copybuf); - memcpy (&naddr->naddr, &meta->naddr, sizeof (meta->naddr)); +static void +net_address_meta_free (GstNetAddressMeta * meta, GstBuffer * buffer) +{ + if (meta->addr) + g_object_unref (meta->addr); + meta->addr = NULL; } const GstMetaInfo * @@ -50,327 +64,27 @@ gst_net_address_meta_get_info (void) if (meta_info == NULL) { meta_info = gst_meta_register ("GstNetAddressMeta", "GstNetAddressMeta", sizeof (GstNetAddressMeta), - (GstMetaInitFunction) NULL, - (GstMetaFreeFunction) NULL, + (GstMetaInitFunction) net_address_meta_init, + (GstMetaFreeFunction) net_address_meta_free, (GstMetaCopyFunction) net_address_meta_copy, (GstMetaTransformFunction) NULL); } return meta_info; } -/** - * gst_net_address_set_ip4_address: - * @naddr: a network address - * @address: an IPv4 network address. - * @port: a port number to set. - * - * Set @naddr with the IPv4 @address and @port pair. - * - * Note that @port and @address must be expressed in network byte order, - * use g_htons() and g_htonl() to convert them to network byte order. - */ -void -gst_net_address_set_ip4_address (GstNetAddress * naddr, guint32 address, - guint16 port) -{ - g_return_if_fail (naddr != NULL); - - naddr->type = GST_NET_TYPE_IP4; - naddr->address.ip4 = address; - naddr->port = port; -} - -/** - * gst_net_address_set_ip6_address: - * @naddr: a network address - * @address: an IPv6 network address. - * @port: a port number to set. - * - * Set @naddr with the IPv6 @address and @port pair. - * - * Note that @port must be expressed in network byte order, use g_htons() to convert - * it to network byte order. - */ -void -gst_net_address_set_ip6_address (GstNetAddress * naddr, guint8 address[16], - guint16 port) -{ - g_return_if_fail (naddr != NULL); - - naddr->type = GST_NET_TYPE_IP6; - memcpy (&naddr->address.ip6, address, 16); - naddr->port = port; -} - -/** - * gst_net_address_get_net_type: - * @naddr: a network address - * - * Get the type of address stored in @naddr. - * - * Returns: the network type stored in @naddr. - */ -GstNetType -gst_net_address_get_net_type (const GstNetAddress * naddr) -{ - g_return_val_if_fail (naddr != NULL, GST_NET_TYPE_UNKNOWN); - - return naddr->type; -} - -/** - * gst_net_address_get_ip4_address: - * @naddr: a network address - * @address: a location to store the address. - * @port: a location to store the port. - * - * Get the IPv4 address stored in @naddr into @address. This function requires - * that the address type of @naddr is of type #GST_NET_TYPE_IP4. - * - * Note that @port and @address are expressed in network byte order, use - * g_ntohs() and g_ntohl() to convert them to host order. - * - * Returns: TRUE if the address could be retrieved. - */ -gboolean -gst_net_address_get_ip4_address (const GstNetAddress * naddr, guint32 * address, - guint16 * port) +GstNetAddressMeta * +gst_buffer_add_net_address_meta (GstBuffer * buffer, GSocketAddress * addr) { - g_return_val_if_fail (naddr != NULL, FALSE); + GstNetAddressMeta *meta; - if (naddr->type == GST_NET_TYPE_UNKNOWN || naddr->type == GST_NET_TYPE_IP6) - return FALSE; + g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL); + g_return_val_if_fail (G_IS_SOCKET_ADDRESS (addr), NULL); - if (address) - *address = naddr->address.ip4; - if (port) - *port = naddr->port; + meta = + (GstNetAddressMeta *) gst_buffer_add_meta (buffer, + GST_NET_ADDRESS_META_INFO, NULL); - return TRUE; -} + meta->addr = g_object_ref (addr); -/** - * gst_net_address_get_ip6_address: - * @naddr: a network address - * @address: a location to store the result. - * @port: a location to store the port. - * - * Get the IPv6 address stored in @naddr into @address. - * - * If @naddr is of type GST_NET_TYPE_IP4, the transitional IP6 address is - * returned. - * - * Note that @port is expressed in network byte order, use g_ntohs() to convert - * it to host order. - * - * Returns: TRUE if the address could be retrieved. - */ -gboolean -gst_net_address_get_ip6_address (const GstNetAddress * naddr, - guint8 address[16], guint16 * port) -{ - static guint8 ip4_transition[16] = - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF }; - g_return_val_if_fail (naddr != NULL, FALSE); - - if (naddr->type == GST_NET_TYPE_UNKNOWN) - return FALSE; - - if (address) { - if (naddr->type == GST_NET_TYPE_IP6) { - memcpy (address, naddr->address.ip6, 16); - } else { /* naddr->type == GST_NET_TYPE_IP4 */ - memcpy (address, ip4_transition, 12); - memcpy (address + 12, (guint8 *) & (naddr->address.ip4), 4); - } - } - if (port) - *port = naddr->port; - - return TRUE; -} - -/** - * gst_net_address_get_address_bytes: - * @naddr: a network address - * @address: a location to store the result. - * @port: a location to store the port. - * - * Get just the address bytes stored in @naddr into @address. - * - * Note that @port is expressed in network byte order, use g_ntohs() to convert - * it to host order. IP4 addresses are also stored in network byte order. - * - * Returns: number of bytes actually copied - * - * Since: 0.10.22 - */ -gint -gst_net_address_get_address_bytes (const GstNetAddress * naddr, - guint8 address[16], guint16 * port) -{ - gint ret = 0; - - g_return_val_if_fail (naddr != NULL, FALSE); - - if (naddr->type == GST_NET_TYPE_UNKNOWN) - return 0; - - if (address) { - if (naddr->type == GST_NET_TYPE_IP6) { - memcpy (address, naddr->address.ip6, 16); - ret = 16; - } else { /* naddr->type == GST_NET_TYPE_IP4 */ - memcpy (address, (guint8 *) & (naddr->address.ip4), 4); - ret = 4; - } - } - if (port) - *port = naddr->port; - - return ret; -} - -/** - * gst_net_address_set_address_bytes: - * @naddr: a network address - * @type: the address type (IPv4 or IPV6) - * @address: a location to store the result. - * @port: a location to store the port. - * - * Set just the address bytes stored in @naddr into @address. - * - * Note that @port must be expressed in network byte order, use g_htons() to - * convert it to network byte order order. IP4 address bytes must also be - * stored in network byte order. - * - * Returns: number of bytes actually copied - * - * Since: 0.10.22 - */ -gint -gst_net_address_set_address_bytes (GstNetAddress * naddr, GstNetType type, - guint8 address[16], guint16 port) -{ - gint len = 0; - - g_return_val_if_fail (naddr != NULL, 0); - - naddr->type = type; - switch (naddr->type) { - case GST_NET_TYPE_UNKNOWN: - case GST_NET_TYPE_IP6: - len = 16; - memcpy (naddr->address.ip6, address, 16); - break; - case GST_NET_TYPE_IP4: - len = 4; - memcpy ((guint8 *) & (naddr->address.ip4), address, 4); - break; - } - - if (port) - naddr->port = port; - - return len; -} - -/** - * gst_net_address_equal: - * @naddr1: The first #GstNetAddress - * @naddr2: The second #GstNetAddress - * - * Compare two #GstNetAddress structures - * - * Returns: TRUE if they are identical, FALSE otherwise - * - * Since: 0.10.18 - */ -gboolean -gst_net_address_equal (const GstNetAddress * naddr1, - const GstNetAddress * naddr2) -{ - g_return_val_if_fail (naddr1 != NULL, FALSE); - g_return_val_if_fail (naddr2 != NULL, FALSE); - - if (naddr1->type != naddr2->type) - return FALSE; - - if (naddr1->port != naddr2->port) - return FALSE; - - switch (naddr1->type) { - case GST_NET_TYPE_IP4: - if (naddr1->address.ip4 != naddr2->address.ip4) - return FALSE; - break; - case GST_NET_TYPE_IP6: - if (memcmp (naddr1->address.ip6, naddr2->address.ip6, - sizeof (naddr1->address.ip6))) - return FALSE; - break; - default: - break; - } - return TRUE; -} - -/** - * gst_net_address_to_string: - * @naddr: a #GstNetAddress - * @dest: destination - * @len: len of @dest - * - * Copies a string representation of @naddr into @dest. Up to @len bytes are - * copied. - * - * Returns: the number of bytes which would be produced if the buffer was large - * enough - * - * Since: 0.10.24 - */ -gint -gst_net_address_to_string (const GstNetAddress * naddr, gchar * dest, gsize len) -{ - gint result; - - g_return_val_if_fail (naddr != NULL, FALSE); - g_return_val_if_fail (dest != NULL, FALSE); - - switch (naddr->type) { - case GST_NET_TYPE_IP4: - { - guint32 address; - guint16 port; - - gst_net_address_get_ip4_address (naddr, &address, &port); - address = g_ntohl (address); - - result = g_snprintf (dest, len, "%d.%d.%d.%d:%d", (address >> 24) & 0xff, - (address >> 16) & 0xff, (address >> 8) & 0xff, address & 0xff, - g_ntohs (port)); - break; - } - case GST_NET_TYPE_IP6: - { - guint8 address[16]; - guint16 port; - - gst_net_address_get_ip6_address (naddr, address, &port); - - result = - g_snprintf (dest, len, "[%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]:%d", - (address[0] << 8) | address[1], (address[2] << 8) | address[3], - (address[4] << 8) | address[5], (address[6] << 8) | address[7], - (address[8] << 8) | address[9], (address[10] << 8) | address[11], - (address[12] << 8) | address[13], (address[14] << 8) | address[15], - g_ntohs (port)); - break; - } - default: - dest[0] = 0; - result = 0; - break; - } - return result; + return meta; } diff --git a/libs/gst/net/gstnetaddressmeta.h b/libs/gst/net/gstnetaddressmeta.h index 0687406..c40cf48 100644 --- a/libs/gst/net/gstnetaddressmeta.h +++ b/libs/gst/net/gstnetaddressmeta.h @@ -21,52 +21,10 @@ #define __GST_NET_ADDRESS_META_H__ #include +#include G_BEGIN_DECLS -typedef struct _GstNetAddress GstNetAddress; - -/** - * GstNetType: - * @GST_NET_TYPE_UNKNOWN: unknown address type - * @GST_NET_TYPE_IP4: an IPv4 address type - * @GST_NET_TYPE_IP6: and IPv6 address type - * - * The Address type used in #GstNetAddress. - */ -typedef enum { - GST_NET_TYPE_UNKNOWN, - GST_NET_TYPE_IP4, - GST_NET_TYPE_IP6, -} GstNetType; - -/** - * GST_NETADDRESS_MAX_LEN: - * - * The maximum length of a string representation of a GstNetAddress as produced - * by gst_net_address_to_string(). - * - * Since: 0.10.24 - */ -#define GST_NETADDRESS_MAX_LEN 64 - -/** - * GstNetAddress: - * - * An opaque network address as used in #GstNetAddressMeta. - */ -struct _GstNetAddress { - /*< private >*/ - GstNetType type; - union { - guint8 ip6[16]; - guint32 ip4; - } address; - guint16 port; - /*< private >*/ - gpointer _gst_reserved[GST_PADDING]; -}; - typedef struct _GstNetAddressMeta GstNetAddressMeta; /** @@ -77,7 +35,7 @@ typedef struct _GstNetAddressMeta GstNetAddressMeta; struct _GstNetAddressMeta { GstMeta meta; - GstNetAddress naddr; + GSocketAddress *addr; }; const GstMetaInfo *gst_net_address_meta_get_info (void); @@ -85,28 +43,8 @@ const GstMetaInfo *gst_net_address_meta_get_info (void); #define gst_buffer_get_net_address_meta(b) \ ((GstNetAddressMeta*)gst_buffer_get_meta((b),GST_NET_ADDRESS_META_INFO)) -#define gst_buffer_add_net_address_meta(b) \ - ((GstNetAddressMeta*)gst_buffer_add_meta((b),GST_NET_ADDRESS_META_INFO,NULL)) - -/* address operations */ -void gst_net_address_set_ip4_address (GstNetAddress *naddr, guint32 address, guint16 port); -void gst_net_address_set_ip6_address (GstNetAddress *naddr, guint8 address[16], guint16 port); -gint gst_net_address_set_address_bytes (GstNetAddress *naddr, GstNetType type, - guint8 address[16], guint16 port); - -GstNetType gst_net_address_get_net_type (const GstNetAddress *naddr); -gboolean gst_net_address_get_ip4_address (const GstNetAddress *naddr, - guint32 *address, guint16 *port); -gboolean gst_net_address_get_ip6_address (const GstNetAddress *naddr, - guint8 address[16], guint16 *port); -gint gst_net_address_get_address_bytes (const GstNetAddress *naddr, - guint8 address[16], guint16 *port); - -gboolean gst_net_address_equal (const GstNetAddress *naddr1, - const GstNetAddress *naddr2); - -gint gst_net_address_to_string (const GstNetAddress *naddr, - gchar *dest, gsize len); +GstNetAddressMeta * gst_buffer_add_net_address_meta (GstBuffer *buffer, + GSocketAddress *addr); G_END_DECLS diff --git a/pkgconfig/gstreamer-net-uninstalled.pc.in b/pkgconfig/gstreamer-net-uninstalled.pc.in index 80a1691..366df18 100644 --- a/pkgconfig/gstreamer-net-uninstalled.pc.in +++ b/pkgconfig/gstreamer-net-uninstalled.pc.in @@ -8,7 +8,7 @@ typelibdir=@abs_top_builddir@/libs/gst/net Name: GStreamer networking library, uninstalled Description: Network-enabled GStreamer plug-ins and clocking, uninstalled -Requires: gstreamer-@GST_MAJORMINOR@ = @VERSION@ +Requires: gstreamer-@GST_MAJORMINOR@ = @VERSION@ gio-2.0 Version: @VERSION@ Libs: @abs_top_builddir@/libs/gst/net/libgstnet-@GST_MAJORMINOR@.la diff --git a/pkgconfig/gstreamer-net.pc.in b/pkgconfig/gstreamer-net.pc.in index d8b510b..582f00c 100644 --- a/pkgconfig/gstreamer-net.pc.in +++ b/pkgconfig/gstreamer-net.pc.in @@ -9,7 +9,7 @@ typelibdir=${libdir}/girepository-1.0 Name: GStreamer networking library Description: Network-enabled GStreamer plug-ins and clocking -Requires: gstreamer-@GST_MAJORMINOR@ +Requires: gstreamer-@GST_MAJORMINOR@ gio-2.0 Version: @VERSION@ Libs: -L${libdir} -lgstnet-@GST_MAJORMINOR@ Cflags: -I${includedir} -- 2.7.4