From: <ra...@fr...> - 2004-08-21 17:21:13
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sat Aug 21 2004 10:21:12 PDT Log message: rtp_report.c: the sdes chunk did not including rounding to the next 32 bit boundary Modified files: rtpdec : rtp_report.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_report.c.diff?r1=1.16&r2=1.17 ====Begin Diffs==== Index: rtp_report.c =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_report.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- rtp_report.c 21 Aug 2004 12:00:07 -0000 1.16 +++ rtp_report.c 21 Aug 2004 17:20:59 -0000 1.17 @@ -70,6 +70,8 @@ static guint size_sdes_cname(const GString* cname); +static guint round_next_cuadruple(guint n); + static void init_rtcp_cname(struct rtcp_sdes* sdes, guint32 myid, const GString* cname); static void fill_reception_block (struct reception_block *reception_block, @@ -277,8 +279,10 @@ return c; } -/* Send a control report with current statistics */ - +/** Send a RTP control packet, including current statistics + @do_bye: if the packet includes a BYE packet, saying + that we are leaving the conference + */ static void send_report (GstRtpdec * rtpdec, gboolean do_bye) { @@ -509,19 +513,29 @@ guint size_block_31; guint size_single_recp; + guint unrounded_size, rounded_size; size_single_recp = sizeof(struct reception_block); size_block_31 = sizeof(struct rtcp_recv_report) + 30*sizeof(struct reception_block); - return (num_recp_block/31)*size_block_31 + (num_recp_block % 31)*size_single_recp; + unrounded_size = (num_recp_block/31)*size_block_31 + (num_recp_block % 31)*size_single_recp; + rounded_size = round_next_cuadruple(chunk_size); static guint size_sdes_cname(const GString* cname) - guint cname_item_size, chunk_size; - cname_item_size = sizeof(struct sdes_item) - 1 + cname->len; + guint cname_item_size, chunk_size, packet_size; + cname_item_size = sizeof(struct sdes_item) - 1 + cname->len + 1; chunk_size = sizeof(struct sdes_chunk) - sizeof(struct sdes_item) + cname_item_size; - chunk_size = ((chunk_size + 7)/8)*8; /* round up to next multiple of 8 */ - return sizeof(struct rtcp_sdes) - sizeof(struct sdes_chunk) + chunk_size; + chunk_size = round_next_cuadruple(chunk_size); + packet_size = sizeof(struct rtcp_sdes) - sizeof(struct sdes_chunk) + chunk_size; + packet_size = round_next_cuadruple(packet_size); + return packet_size; +} +static guint +round_next_cuadruple(guint n) +{ + return ((n + 3)/4)*4; @@ -529,6 +543,7 @@ struct sdes_chunk* chunk; struct sdes_item* item; + char* next_item; init_rtcp_common(&sdes->common, SOURCE_DESCRIPTION, size_sdes_cname(cname), 1); chunk = &sdes->chunks[0]; chunk->identifier = myid; @@ -536,6 +551,16 @@ item->type = CNAME; item->length = cname->len; memcpy(item->text, cname->str, cname->len); + item_size = sizeof(struct sdes_item) - sizeof(item->text) + cname->len; + next_item = ( (char*) item) + item_size; + *next_item = 0; + chunk_size_unrounded = sizeof(struct sdes_chunk) - sizeof(struct sdes_item) + + item_size; + if (chunk_size_unrounded % 4 != 0) { + char* start_of_chunk_round = ( (char*) chunk) + chunk_size_unrounded; + memset(start_of_chunk_round, 0, 4 - (chunk_size_unrounded % 4)); + } + |
From: <ra...@fr...> - 2004-08-21 17:59:38
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sat Aug 21 2004 10:59:37 PDT Log message: big/little endian (hopefully correct now) Modified files: rtpdec : rtp_packet.h rtp_report.c rtpdec.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.h.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_report.c.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtpdec.c.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: rtp_packet.h =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- rtp_packet.h 9 Apr 2004 16:47:57 -0000 1.5 +++ rtp_packet.h 21 Aug 2004 17:59:25 -0000 1.6 @@ -1,6 +1,7 @@ #ifndef __RTP_PACKET_H__ #define __RTP_PACKET_H__ 1 +#ifdef BIG_ENDIAN struct __attribute__ ((packed)) rtp_packet { unsigned int version:2; unsigned int padding:1; @@ -13,6 +14,20 @@ unsigned int identifier:32; unsigned int contrib_sources[1]; }; +#else +struct __attribute__ ((packed)) rtp_packet { + unsigned int sequence_number:16; + unsigned int payload_type:7; + unsigned int mark:1; + unsigned int num_contrib_sources:4; + unsigned int extension:1; + unsigned int padding:1; + unsigned int version:2; + unsigned int timestamp:32; + unsigned int identifier:32; + unsigned int contrib_sources[1]; +}; +#endif struct __attribute__ ((packed)) rtp_packet_extension { guint16 tag; @@ -25,6 +40,7 @@ BYE = 203, APP = 204 } rtcp_packet_type; struct __attribute__ ((packed)) rtcp_common_header { @@ -32,7 +48,17 @@ rtcp_packet_type packet_type:8; unsigned int length:16; +struct __attribute__ ((packed)) rtcp_common_header { + unsigned int length:16; + rtcp_packet_type packet_type:8; + unsigned int num_sources:5; struct __attribute__ ((packed)) reception_block { guint32 identifier; guint8 fraction_lost_last; @@ -42,6 +68,17 @@ guint32 last_ntp_timestamp_seen_sr; guint32 time_since_last_sr_packet; +struct __attribute__ ((packed)) reception_block { + guint32 identifier; + unsigned int cumul_packets_lost:24; + guint8 fraction_lost_last; + guint32 highest_sequence_number; + guint32 jitter; + guint32 last_ntp_timestamp_seen_sr; + guint32 time_since_last_sr_packet; struct __attribute__ ((packed)) ntptime { guint32 integer; Index: rtp_report.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_report.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- rtp_report.c 21 Aug 2004 17:20:59 -0000 1.17 +++ rtp_report.c 21 Aug 2004 17:59:25 -0000 1.18 @@ -387,7 +387,7 @@ rtcp->padding = 0; rtcp->num_sources = num_sources; rtcp->packet_type = packet_type; - rtcp->length = length; + rtcp->length = htons(length); } /* Initialize the fields of a RTCP receiver record */ @@ -397,7 +397,7 @@ { init_rtcp_common (&recv->common, RECEIVER_REPORT, sizeof (struct rtcp_recv_report), num_reception_blocks); - recv->sync_src_rtcp_sender = id; + recv->sync_src_rtcp_sender = htonl(id); @@ -475,7 +475,7 @@ fill_reception_block (struct reception_block *reception_block, const struct sender_info *sender_info) - reception_block->identifier = sender_info->identifier; + reception_block->identifier = g_htonl(sender_info->identifier); if ((sender_info->packets_received + sender_info->packets_lost) > 0) { reception_block->fraction_lost_last = sender_info->packets_lost * 256 / @@ -484,11 +484,11 @@ reception_block->fraction_lost_last = 0; } reception_block->cumul_packets_lost = sender_info->total_packets_lost; - reception_block->highest_sequence_number = sender_info->last_sequence_number; - reception_block->jitter = sender_info->jitter; + reception_block->highest_sequence_number = htonl(sender_info->last_sequence_number); + reception_block->jitter = htonl(sender_info->jitter); reception_block->last_ntp_timestamp_seen_sr = middle_bits(sender_info->last_ctl_ntptime); reception_block->time_since_last_sr_packet = - current_time_sub_ntptime(sender_info->last_ctl_ntptime); + g_htonl(current_time_sub_ntptime(sender_info->last_ctl_ntptime)); @@ -496,7 +496,7 @@ init_rtcp_bye(struct rtcp_bye* rtcp_bye, guint32 myid) init_rtcp_common(&rtcp_bye->common, BYE, sizeof(struct rtcp_bye), 1); - rtcp_bye->identifier[0] = myid; + rtcp_bye->identifier[0] = htonl(myid); static void @@ -546,7 +546,7 @@ char* next_item; init_rtcp_common(&sdes->common, SOURCE_DESCRIPTION, size_sdes_cname(cname), 1); chunk = &sdes->chunks[0]; - chunk->identifier = myid; + chunk->identifier = htonl(myid); item = &chunk->items[0]; item->type = CNAME; item->length = cname->len; Index: rtpdec.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtpdec.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- rtpdec.c 21 Aug 2004 12:00:07 -0000 1.8 +++ rtpdec.c 21 Aug 2004 17:59:25 -0000 1.9 @@ -180,7 +180,7 @@ (packet->common.num_sources - 1) * sizeof (struct reception_block)) { return; - sync_src = ntohl (packet->sync_src_rtcp_sender); + sync_src = g_ntohl (packet->sync_src_rtcp_sender); sender_info = gst_rtpdec_get_sender_info (element, sync_src, TRUE); sender_info->received_srvctl = TRUE; sender_info->last_ctl_ntptime.integer = ntohl (packet->ntp_timestamp.integer); |
From: <ra...@fr...> - 2004-08-21 18:03:17
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sat Aug 21 2004 11:03:17 PDT Log message: htonl->g_htonl Modified files: rtpdec : rtp_report.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_report.c.diff?r1=1.18&r2=1.19 ====Begin Diffs==== Index: rtp_report.c =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_report.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- rtp_report.c 21 Aug 2004 17:59:25 -0000 1.18 +++ rtp_report.c 21 Aug 2004 18:03:04 -0000 1.19 @@ -397,7 +397,7 @@ { init_rtcp_common (&recv->common, RECEIVER_REPORT, sizeof (struct rtcp_recv_report), num_reception_blocks); - recv->sync_src_rtcp_sender = htonl(id); + recv->sync_src_rtcp_sender = g_htonl(id); } @@ -484,8 +484,8 @@ reception_block->fraction_lost_last = 0; } reception_block->cumul_packets_lost = sender_info->total_packets_lost; - reception_block->highest_sequence_number = htonl(sender_info->last_sequence_number); - reception_block->jitter = htonl(sender_info->jitter); + reception_block->highest_sequence_number = g_htonl(sender_info->last_sequence_number); + reception_block->jitter = g_htonl(sender_info->jitter); reception_block->last_ntp_timestamp_seen_sr = middle_bits(sender_info->last_ctl_ntptime); reception_block->time_since_last_sr_packet = g_htonl(current_time_sub_ntptime(sender_info->last_ctl_ntptime)); @@ -496,7 +496,7 @@ init_rtcp_bye(struct rtcp_bye* rtcp_bye, guint32 myid) init_rtcp_common(&rtcp_bye->common, BYE, sizeof(struct rtcp_bye), 1); - rtcp_bye->identifier[0] = htonl(myid); + rtcp_bye->identifier[0] = g_htonl(myid); static void @@ -546,7 +546,7 @@ char* next_item; init_rtcp_common(&sdes->common, SOURCE_DESCRIPTION, size_sdes_cname(cname), 1); chunk = &sdes->chunks[0]; - chunk->identifier = htonl(myid); + chunk->identifier = g_htonl(myid); item = &chunk->items[0]; item->type = CNAME; item->length = cname->len; |
From: <ra...@fr...> - 2004-08-21 22:35:40
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sat Aug 21 2004 15:35:37 PDT Log message: compilation fixes Modified files: rtpdec : rtp_packet.h rtp_report.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.h.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_report.c.diff?r1=1.19&r2=1.20 ====Begin Diffs==== Index: rtp_packet.h =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- rtp_packet.h 21 Aug 2004 17:59:25 -0000 1.6 +++ rtp_packet.h 21 Aug 2004 22:35:25 -0000 1.7 @@ -1,7 +1,7 @@ #ifndef __RTP_PACKET_H__ #define __RTP_PACKET_H__ 1 -#ifdef BIG_ENDIAN +#if G_BYTE_ORDER == G_BIG_ENDIAN struct __attribute__ ((packed)) rtp_packet { unsigned int version:2; unsigned int padding:1; @@ -40,7 +40,7 @@ BYE = 203, APP = 204 } rtcp_packet_type; struct __attribute__ ((packed)) rtcp_common_header { @@ -58,7 +58,7 @@ }; #endif struct __attribute__ ((packed)) reception_block { guint32 identifier; guint8 fraction_lost_last; Index: rtp_report.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_report.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- rtp_report.c 21 Aug 2004 18:03:04 -0000 1.19 +++ rtp_report.c 21 Aug 2004 22:35:25 -0000 1.20 @@ -517,7 +517,8 @@ size_single_recp = sizeof(struct reception_block); size_block_31 = sizeof(struct rtcp_recv_report) + 30*sizeof(struct reception_block); unrounded_size = (num_recp_block/31)*size_block_31 + (num_recp_block % 31)*size_single_recp; - rounded_size = round_next_cuadruple(chunk_size); + rounded_size = round_next_cuadruple(unrounded_size); + return rounded_size; } static guint @@ -544,6 +545,8 @@ struct sdes_chunk* chunk; struct sdes_item* item; char* next_item; + guint item_size; + guint chunk_size_unrounded; init_rtcp_common(&sdes->common, SOURCE_DESCRIPTION, size_sdes_cname(cname), 1); chunk = &sdes->chunks[0]; chunk->identifier = g_htonl(myid); |
From: <ra...@fr...> - 2004-08-25 03:07:07
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Tue Aug 24 2004 20:07:03 PDT Log message: address.c: Now compiles gstrtpdec.c: Fixes in param specs. Modified files: rtpdec : Makefile address.c gstrtpdec.c gstrtpdec.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/Makefile.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/address.c.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gstrtpdec.c.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gstrtpdec.h.diff?r1=1.12&r2=1.13 ====Begin Diffs==== Index: Makefile =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/Makefile,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- Makefile 25 Aug 2004 01:20:38 -0000 1.7 +++ Makefile 25 Aug 2004 03:06:51 -0000 1.8 @@ -1,22 +1,31 @@ CFLAGS=$(shell pkg-config --cflags gstreamer-0.8) -DGST_PACKAGE='"GStreamer"' -DGST_ORIGIN='"http://gstreamer.net"' -DVERSION='"0.0"' -DHAVE_USER_MTU -Wall -Werror -rtpdec.so: gstrtpdec.o rtpdec.o rtp_report.o socket_fns.o address.o - libtool --mode=link gcc -module -export-symbols-regex gst_plugin_desc \ - -o rtpdec.so \ - gstrtpdec.o rtpdec.o rtp_report.o socket_fns.o address.o \ + +rtpdec.la: gstrtpdec.lo rtpdec.lo rtp_report.lo socket_fns.lo address.lo + libtool --mode=link gcc -module \ + -rpath /home/ramon/projects/internet-radio/gstreamer/gst-sandbox/rtpdec \ + -export-symbols-regex gst_plugin_desc \ + -o rtpdec.la \ + gstrtpdec.lo rtpdec.lo rtp_report.lo socket_fns.lo address.lo \ $$(pkg-config --libs gstreamer-0.8) -gstrtpdec.o: gstrtpdec.c - libtool --mode=compile gcc $(CFLAGS) -c gstrtpdec.c +gstrtpdec.lo: gstrtpdec.c + libtool --mode=compile gcc $(CFLAGS) -o gstrtpdec.lo -c gstrtpdec.c -rtpdec.o: rtpdec.c - libtool --mode=compile gcc $(CFLAGS) -c rtpdec.c +rtpdec.lo: rtpdec.c + libtool --mode=compile gcc $(CFLAGS) -o rtpdec.lo -c rtpdec.c -rtp_report.o: rtp_report.c - libtool --mode=compile gcc $(CFLAGS) -c rtp_report.c +rtp_report.lo: rtp_report.c + libtool --mode=compile gcc $(CFLAGS) -o rtp_report.lo -c rtp_report.c -socket_fns.o: socket_fns.c - libtool --mode=compile gcc $(CFLAGS) -c socket_fns.c +socket_fns.lo: socket_fns.c + libtool --mode=compile gcc $(CFLAGS) -o socket_fns.lo -c socket_fns.c -address.o: address.c - libtool --mode=compile gcc $(CFLAGS) -c address.c +address.lo: address.c + libtool --mode=compile gcc $(CFLAGS) -o address.o -c address.c +.PHONY: install +install: rtpdec.la + libtool --mode=install install rtpdec.la /home/ramon/projects/internet-radio/gstreamer-build/lib/gstreamer-0.8/ Index: address.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/address.c,v retrieving revision 1.6 diff -u -d -r1.6 -r1.7 --- address.c 25 Aug 2004 01:20:38 -0000 1.6 +++ address.c 25 Aug 2004 03:06:51 -0000 1.7 @@ -1,5 +1,6 @@ #include "address.h" #include <netdb.h> +#include <string.h> static gpointer gst_address_copy (gpointer); @@ -7,6 +8,8 @@ static void resolve_name (const gchar * name, GstNumAddress * result); +static void map_ipv4_to_ipv6(const struct in_addr* ipv4_addr, const struct in6_addr* ipv6_addr); GType gst_address_get_type (void) { @@ -55,26 +58,20 @@ void gst_addr_resolve_address (const GstAddress * address, GstNumAddress * result) - if (result->alternatives != NULL) { - g_free (result->alternatives); - } - result->num_alternatives = 0; - result->alternatives = NULL; + struct in6_addr addr6; + g_assert(result->alternatives == NULL); + // result->alternatives = g_array_new(FALSE, TRUE, sizeof(struct in6_addr)); switch (address->type) { case ADDR_IPV4: - result->num_alternatives = 1; - result->alternatives = g_new (struct in6_addr, 1); - - map_ipv4_to_ipv6 (address->addr.ipv4_address, result->alternatives[0]); + map_ipv4_to_ipv6 (&address->addr.ipv4_address, &addr6); + result->alternatives = g_array_sized_new(FALSE, TRUE, sizeof(struct in6_addr), 1); + g_array_append_vals(result->alternatives, (gpointer) &addr6, 1); break; case ADDR_IPV6: - result->alternatives[0] = address->addr.ipv6_address; + g_array_append_vals(result->alternatives, (gpointer) &address->addr.ipv6_address , 1); case ADDR_NAME: resolve_name (address->addr.name, result); } } @@ -82,32 +79,32 @@ resolve_name (const gchar * name, GstNumAddress * result) int error; - struct addrinfo *result; + struct addrinfo *result_ai; struct addrinfo *link; - error = getaddrinfo (name, NULL, NULL, &result); + guint num_alternatives, alternative; + error = getaddrinfo (name, NULL, NULL, &result_ai); if (error != 0) return; - link = result; + link = result_ai; while (link != NULL) { if (link->ai_family == AF_INET || link->ai_family == AF_INET6) { - result->num_alternatives++; + num_alternatives++; } link = link->ai_next; - result->alternatives = g_new0 (struct in6_addr, result->num_alternatives); + result->alternatives = g_array_sized_new(FALSE, FALSE, sizeof(struct in6_addr), num_alternatives); - alternative = result->alternatives; + alternative = 0; if (link->ai_protocol == AF_INET || link->ai_family == AF_INET6) { - *alternative = ((struct sockaddr_in6 *) link->ai_addr)->sin6_addr; + g_array_index(result->alternatives, struct in6_addr, alternative) = ((struct sockaddr_in6 *) link->ai_addr)->sin6_addr; alternative++; - freeaddrinfo (result); + freeaddrinfo (result_ai); gboolean @@ -115,14 +112,16 @@ int i; - struct in6_addr addr; - g_assert (address->len > 0); - for (i = 0; i < address->len; i++) { - addr = g_array_index (address, struct in6_addr, i); + struct sockaddr_in6 addr; + g_assert (address->alternatives->len > 0); + for (i = 0; i < address->alternatives->len; i++) { + addr.sin6_family = AF_INET6; + addr.sin6_flowinfo = 0; + addr.sin6_scope_id = 0; + addr.sin6_addr = g_array_index (address->alternatives, struct in6_addr, i); addr.sin6_port = port; - error = bind (socket, &addr, sizeof (struct in6_addr)); + error = bind (socket, (struct sockaddr*) &addr, sizeof (struct sockaddr_in6)); if (error == 0) { @@ -135,14 +134,16 @@ - struct in6_adr addr; - g_assert (addess->len > 0); - error = connect (socket, &addr, sizeof (struct in6_addr)); + error = connect (socket, (struct sockaddr*) &addr, sizeof (struct sockaddr_in6)); @@ -152,18 +153,19 @@ -try_send (int socket, GstNumAddressPort * remote, const char *data, guint size) +gst_addr_try_send (int socket, const GstNumAddress * remote, in_port_t port, const char *data, guint size) struct sockaddr_in6 peer; guint i; gboolean sucess; + int error; - peer.sin6_port = remote->port; + peer.sin6_port = htons(port); peer.sin6_flowinfo = 0; peer.sin6_scope_id = 0; - for (i = 0; i < remote->address.num_alternatives; i++) { - peer.sin6_addr = remote->address.alternatives[i]; - error = sendto (socket, data, size, 0, &peer, sizeof (sockaddr_in6)); + for (i = 0; i < remote->alternatives->len; i++) { + peer.sin6_addr = g_array_index(remote->alternatives, struct in6_addr, i); + error = sendto (socket, data, size, 0, (struct sockaddr*) &peer, sizeof (struct sockaddr_in6)); sucess = error >= 0; if (sucess) @@ -174,23 +176,29 @@ gst_addr_allowed (const GstAuthorizedAddrs * acls, struct sockaddr_in6 *peer) - GstAuthorizedAddr *acl_entry; - GstNumAddr *addr; - struct in6_addr *addr_alt; + const GstAuthorizedAddr *acl_entry; + const GstNumAddress *addr; + const struct in6_addr *addr_alt; unsigned int i, j; for (i = 0; i < acls->authorized_addrs->len; i++) { - acl_entry = g_array_index (acls->authorized_addrs, GstAuthorizedAddr, i); + acl_entry = & g_array_index (acls->authorized_addrs, const GstAuthorizedAddr, i); if (peer->sin6_port < acl_entry->low || peer->sin6_port > acl_entry->high) continue; addr = &acl_entry->addr; for (j = 0; j < addr->alternatives->len; j++) { - addr_alt = ((struct in6_addr *) + addr_alt = &((const struct in6_addr *) addr->alternatives->data)[j]; - if (memcpy (addr_alt, peer->sin6_addr, sizeof (struct sockaddr_in6))) { + if (memcmp (addr_alt, &peer->sin6_addr, sizeof (struct sockaddr_in6))) { return TRUE; } return FALSE; +static void map_ipv4_to_ipv6(const struct in_addr* ipv4_addr, const struct in6_addr* ipv6_addr) +{ + /* FIXME: implement */ +} Index: gstrtpdec.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/gstrtpdec.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gstrtpdec.c 25 Aug 2004 01:20:38 -0000 1.15 +++ gstrtpdec.c 25 Aug 2004 03:06:51 -0000 1.16 @@ -145,10 +145,10 @@ GST_TYPE_ADDRESS, G_PARAM_WRITABLE)); g_object_class_install_property (gobject_class, ARG_REMOTE_DATA_PORT, g_param_spec_int ("remote_data_port", "remote_data_port", "the port in machine we will connect, from where data will be delivered", - 0, 32767, -1, G_PARAM_READWRITE)); + 0, 32767, 0, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, ARG_REMOTE_CONTROL_PORT, - g_param_spec_int ("remote_data_port", "remote_data_port", "the port in machine we will connect, from where data will be delivered", + g_param_spec_int ("remote_control_port", "remote_control_port", "the port in machine we will connect, from where data will be delivered", g_object_class_install_property (gobject_class, ARG_REMOTE_HOST, g_param_spec_boxed("remote_addr", "remote_addr", "the address of the remote machine that we will talk to", Index: gstrtpdec.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/gstrtpdec.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstrtpdec.h 13 Aug 2004 10:30:53 -0000 1.12 +++ gstrtpdec.h 25 Aug 2004 03:06:51 -0000 1.13 @@ -28,8 +28,8 @@ typedef struct _GstRtpdec GstRtpdec; typedef struct _GstRtpdecClass GstRtpdecClass; -const guint32 sender_magic = 0x0c0deb12; -const guint32 recv_magic = 0x0badbeef; +static const guint32 sender_magic = 0x0c0deb12; +static const guint32 recv_magic = 0x0badbeef; struct _GstRtpdecHandler; |
From: <ra...@fr...> - 2004-08-25 13:17:57
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Wed Aug 25 2004 06:17:52 PDT Log message: gstrtphandler.c : new file, standard wrappers around GLib interface GstIRtpdec. gstrtpdec.c: fixes in registration. socket_fns.c: added (stubs) of missing functions. address.h: renamed _delete_ functions to _free, for consistency address.c: added (stubs) of missing functions. Modified files: rtpdec : Makefile address.c address.h gstrtpdec.c gstrtphandler.h rtpdec.c rtpdec.h socket_fns.c todo Added files: rtpdec : gstrtphandler.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/Makefile.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/address.c.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/address.h.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gstrtpdec.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gstrtphandler.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gstrtphandler.h.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtpdec.c.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtpdec.h.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/socket_fns.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/todo.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: Makefile =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/Makefile,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- Makefile 25 Aug 2004 03:06:51 -0000 1.8 +++ Makefile 25 Aug 2004 13:17:40 -0000 1.9 @@ -1,20 +1,24 @@ -CFLAGS=$(shell pkg-config --cflags gstreamer-0.8) -DGST_PACKAGE='"GStreamer"' -DGST_ORIGIN='"http://gstreamer.net"' -DVERSION='"0.0"' -DHAVE_USER_MTU -Wall -Werror +CFLAGS=$(shell pkg-config --cflags gstreamer-0.8) -DGST_PACKAGE='"GStreamer"' -DGST_ORIGIN='"http://gstreamer.net"' -DVERSION='"0.0"' -DHAVE_USER_MTU -Wall -Wimplicit -Werror -g -rtpdec.la: gstrtpdec.lo rtpdec.lo rtp_report.lo socket_fns.lo address.lo - libtool --mode=link gcc -module \ +gstrtpdec.la: gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo address.lo + libtool --mode=link gcc -module -avoid-version\ -rpath /home/ramon/projects/internet-radio/gstreamer/gst-sandbox/rtpdec \ -export-symbols-regex gst_plugin_desc \ - -o rtpdec.la \ - gstrtpdec.lo rtpdec.lo rtp_report.lo socket_fns.lo address.lo \ + -o gstrtpdec.la \ + gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo address.lo \ $$(pkg-config --libs gstreamer-0.8) + gstrtpdec.lo: gstrtpdec.c libtool --mode=compile gcc $(CFLAGS) -o gstrtpdec.lo -c gstrtpdec.c rtpdec.lo: rtpdec.c libtool --mode=compile gcc $(CFLAGS) -o rtpdec.lo -c rtpdec.c +gstrtphandler.lo: gstrtphandler.c + libtool --mode=compile gcc $(CFLAGS) -o gstrtphandler.lo -c gstrtphandler.c rtp_report.lo: rtp_report.c libtool --mode=compile gcc $(CFLAGS) -o rtp_report.lo -c rtp_report.c @@ -27,5 +31,5 @@ .PHONY: install -install: rtpdec.la - libtool --mode=install install rtpdec.la /home/ramon/projects/internet-radio/gstreamer-build/lib/gstreamer-0.8/ +install: gstrtpdec.la + libtool --mode=install install gstrtpdec.la /home/ramon/projects/internet-radio/gstreamer-build/lib/gstreamer-0.8/ Index: address.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/address.c,v retrieving revision 1.7 diff -u -d -r1.7 -r1.8 --- address.c 25 Aug 2004 03:06:51 -0000 1.7 +++ address.c 25 Aug 2004 13:17:40 -0000 1.8 @@ -8,7 +8,7 @@ static void resolve_name (const gchar * name, GstNumAddress * result); -static void map_ipv4_to_ipv6(const struct in_addr* ipv4_addr, const struct in6_addr* ipv6_addr); +static void map_ipv4_to_ipv6(const struct in_addr* ipv4_addr, struct in6_addr* ipv6_addr); GType gst_address_get_type (void) @@ -75,6 +75,11 @@ } } +void gst_addr_num_address_free (GstNumAddress * addr) +{ + /* FIXME: implement */ +} static void resolve_name (const gchar * name, GstNumAddress * result) { @@ -172,6 +177,21 @@ +gboolean +gst_addr_in_list (const GstNumAddress * address, + struct in6_addr *addr) + return FALSE; +GstNumAddress +gst_addr_any() + GstNumAddress result; + return result; gboolean gst_addr_allowed (const GstAuthorizedAddrs * acls, struct sockaddr_in6 *peer) @@ -187,8 +207,7 @@ continue; addr = &acl_entry->addr; for (j = 0; j < addr->alternatives->len; j++) { - addr_alt = &((const struct in6_addr *) - addr->alternatives->data)[j]; + addr_alt = & g_array_index(addr->alternatives, const struct in6_addr, j); if (memcmp (addr_alt, &peer->sin6_addr, sizeof (struct sockaddr_in6))) { return TRUE; } @@ -197,8 +216,18 @@ return FALSE; - -static void map_ipv4_to_ipv6(const struct in_addr* ipv4_addr, const struct in6_addr* ipv6_addr) +void +gst_addr_authorized_addrs_free (GstAuthorizedAddrs * addr) /* FIXME: implement */ +static void +map_ipv4_to_ipv6(const struct in_addr* ipv4_addr, struct in6_addr* ipv6_addr) + ipv6_addr->s6_addr32[0] = 0; + ipv6_addr->s6_addr32[1] = 0; + ipv6_addr->s6_addr16[4] = 0; + ipv6_addr->s6_addr16[5] = 0xFFFF; + ipv6_addr->s6_addr32[3] = ipv4_addr->s_addr; Index: address.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/address.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- address.h 21 Aug 2004 12:00:07 -0000 1.10 +++ address.h 25 Aug 2004 13:17:40 -0000 1.11 @@ -71,10 +71,8 @@ gboolean gst_addr_allowed (const GstAuthorizedAddrs * acls, struct sockaddr_in6 *peer); -void gst_addr_delete_address (GstAddress * addr); -void gst_addr_delete_num_address (GstNumAddress * addr); +void gst_addr_num_address_free (GstNumAddress * addr); -void gst_addr_delete_authorized_addrs (GstAuthorizedAddrs * addr); +void gst_addr_authorized_addrs_free (GstAuthorizedAddrs * addr); #endif Index: gstrtpdec.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/gstrtpdec.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstrtpdec.c 25 Aug 2004 03:06:51 -0000 1.16 +++ gstrtpdec.c 25 Aug 2004 13:17:40 -0000 1.17 @@ -23,9 +23,9 @@ static GstElementDetails rtpdec_details = GST_ELEMENT_DETAILS( "Rtpdec", - "Source/Rtpdec", + "Source/Network", "Rtp decoder", - "Ramon Garcia Fernandez. "); + "Ramon Garcia Fernandez <ram...@ya...>"); /* Filter signals and args */ @@ -94,8 +94,8 @@ if (!rtpdec_type) { static const GTypeInfo rtpdec_info = { sizeof (GstRtpdecClass), - NULL, (GBaseInitFunc) gst_rtpdec_base_init, + NULL, (GClassInitFunc) gst_rtpdec_class_init, NULL, @@ -232,9 +232,9 @@ if (element->recv_list) { gst_rtpdec_delete_recv_list (element->recv_list); - gst_addr_delete_num_address (&element->remote_address); - gst_addr_delete_num_address (&element->multicast_addr); - gst_addr_delete_authorized_addrs (&element->authorized_senders); + gst_addr_num_address_free (&element->remote_address); + gst_addr_num_address_free (&element->multicast_addr); + gst_addr_authorized_addrs_free (&element->authorized_senders); parent_class->finalize (G_OBJECT (element)); @@ -400,5 +400,5 @@ GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, - "rtpdec", + "gstrtpdec", "RTP decoding", rtpdec_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) --- NEW FILE: gstrtphandler.c --- #include "gstrtphandler.h" GType gst_irtpdec_handler_get_type() { static GType gst_irtpdec_handler_type = 0; if (!gst_irtpdec_handler_type) { static const GTypeInfo gst_irtpdec_handler_info = { sizeof (GstIRtpdecHandlerClass), (GBaseInitFunc) NULL, /* base_init */ (GBaseFinalizeFunc) NULL, /* base_finalize */ }; gst_irtpdec_handler_type = g_type_register_static (G_TYPE_INTERFACE, "GstIRtpdecHandler", &gst_irtpdec_handler_info, 0); g_type_interface_add_prerequisite (gst_irtpdec_handler_type, G_TYPE_OBJECT); } return gst_irtpdec_handler_type; } void gst_irtpdec_handler_init (GstIRtpdecHandler * this, GstPad * output, GHashTable * metadata) GST_IRTPDEC_HANDLER_CLASS(this)->init(this, output, metadata); void gst_irtpdec_handler_get_data_packet (GstIRtpdecHandler * this, char *buffer, guint size, guint data_offset, GstClockTime timestamp) GST_IRTPDEC_HANDLER_CLASS(this)->get_data_packet(this, buffer, size, data_offset, timestamp); void gst_irtpdec_handler_get_app_packet (GstIRtpdecHandler * this, guint32 tag, gconstpointer data, guint data_size) GST_IRTPDEC_HANDLER_CLASS(this)->get_app_packet(this, tag, data, data_size); unsigned int gst_irtpdec_handler_get_sample_rate (GstIRtpdecHandler * this, char *buffer, guint size, guint data_offset) return GST_IRTPDEC_HANDLER_CLASS(this)->get_sample_rate(this, buffer, size, data_offset); void gst_irtpdec_set_caps_properties (GstIRtpdecHandler * this, GstCaps * caps, GHashTable * properties) GST_IRTPDEC_HANDLER_CLASS(this)->set_caps_properties(this, caps, properties); Index: gstrtphandler.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/gstrtphandler.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstrtphandler.h 20 Mar 2004 23:33:28 -0000 1.2 +++ gstrtphandler.h 25 Aug 2004 13:17:40 -0000 1.3 @@ -21,12 +21,12 @@ typedef struct _GstIRtpdecHandlerClass GTypeInterface parent; - void (*init) (GstPad * output, GHashTable * metadata); - void (*get_data_packet) (char *buffer, guint size, guint data_offset, + void (*init) (GstIRtpdecHandler * this, GstPad * output, GHashTable * metadata); + void (*get_data_packet) (GstIRtpdecHandler * this, char *buffer, guint size, guint data_offset, GstClockTime timestamp); - unsigned int (*get_sample_rate) (char *buffer, guint size, guint data_offset); - void (*get_app_packet) (guint32 tag, gconstpointer data, guint data_size); - void (*set_caps_properties) (GstCaps * caps, GHashTable * properties); + unsigned int (*get_sample_rate) (GstIRtpdecHandler * this, char *buffer, guint size, guint data_offset); + void (*get_app_packet) (GstIRtpdecHandler * this, guint32 tag, gconstpointer data, guint data_size); + void (*set_caps_properties) (GstIRtpdecHandler * this, GstCaps * caps, GHashTable * properties); } GstIRtpdecHandlerClass; @@ -41,4 +41,4 @@ /* This is used for Vorbis codec, that sends the sample rate in out of band data, and so it can change on the fly */ unsigned int gst_irtpdec_handler_get_sample_rate (GstIRtpdecHandler * this, char *buffer, guint size, guint data_offset); -void gst_irtpdec_set_caps_properties (GstCaps * caps, GHashTable * properties); +void gst_irtpdec_set_caps_properties (GstIRtpdecHandler * this, GstCaps * caps, GHashTable * properties); Index: rtpdec.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtpdec.c,v diff -u -d -r1.9 -r1.10 --- rtpdec.c 21 Aug 2004 17:59:25 -0000 1.9 +++ rtpdec.c 25 Aug 2004 13:17:40 -0000 1.10 @@ -85,18 +85,14 @@ result = g_hash_table_new (g_int_hash, g_int_equal); for (i = 0; i < sizeof (fixed_payloads) / sizeof (struct fixed_payload); i++) { int *number; - GValue sample_rate, num_channels; GstStructure *payload_desc; - g_value_init (&sample_rate, G_TYPE_UINT); - g_value_set_uint (&sample_rate, fixed_payloads[i].sample_rate); - g_value_init (&num_channels, G_TYPE_UINT); - g_value_set_uint (&num_channels, fixed_payloads[i].sample_rate); payload_desc = gst_structure_new (fixed_payloads[i].name, - "sample-rate", sample_rate, "num-channels", num_channels, NULL); + "sample-rate", G_TYPE_INT, fixed_payloads[i].sample_rate, + "num-channels", G_TYPE_INT, fixed_payloads[i].num_channels, NULL); number = g_new (int, 1); - *number = 0; + *number = fixed_payloads[i].number; g_hash_table_insert (result, (gpointer) number, (gpointer) payload_desc); return result; @@ -706,6 +702,7 @@ void gst_rtpdec_set_mapping (GstRtpdec * rtpdec, GHashTable * mapping) Index: rtpdec.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtpdec.h,v --- rtpdec.h 21 Aug 2004 12:00:07 -0000 1.8 +++ rtpdec.h 25 Aug 2004 13:17:40 -0000 1.9 @@ -11,6 +11,7 @@ void gst_rtpdec_dispatch_packet (GstRtpdec * rtpdec, guint size, gchar * data, struct sockaddr_in6 *source, packet_type type); void gst_rtpdec_set_mapping (GstRtpdec * rtpdec, GHashTable * mapping); void gst_rtpdec_set_bandwidth (GstRtpdec * rtpdec, guint bandwidth); Index: socket_fns.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/socket_fns.c,v --- socket_fns.c 21 Aug 2004 12:00:07 -0000 1.10 +++ socket_fns.c 25 Aug 2004 13:17:40 -0000 1.11 @@ -316,3 +316,46 @@ close (element->data_socket); close (element->control_socket); +void +gst_rtpdec_set_data_port (GstRtpdec* rtpdec, int port_val) +gst_rtpdec_set_ctl_port (GstRtpdec* rtpdec, int port_val) +gst_rtpdec_set_local_addr (GstRtpdec* rtpdec, GstAddress* addr) +gst_rtpdec_set_remote_addr (GstRtpdec* rtpdec, GstAddress* addr) +gst_rtpdec_set_remote_data_port (GstRtpdec* rtpdec, int port_val) +gst_rtpdec_set_remote_ctl_port (GstRtpdec* rtpdec , int port_val) +gst_rtpdec_set_multicast_addr (GstRtpdec* rtpdec, GstAddress* address) Index: todo RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/todo,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- todo 20 Aug 2004 21:37:15 -0000 1.4 +++ todo 25 Aug 2004 13:17:40 -0000 1.5 @@ -4,12 +4,10 @@ Remember, now we have new_num_members in GstRtpdec, that must be used for this purpose. Implement gclist.c and actually update GCLists. +Ensure that gst_irtpdec_init is called, it is not now. * Long term -Implement sending of reports (doing it now). Check addr functions. Implement some handlers. |
From: <ra...@fr...> - 2004-08-27 01:25:32
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Thu Aug 26 2004 18:25:26 PDT Log message: gstrtpdec.c: correctly split initialization between object initialization and connection. initialize hash tables with destructors of keys and values. gstrtpdec.h: typo, clarify some members, added the reporting thread to the list of members. gstrtphandler.h: use GstStructure instead of GHashTable for metadata about a data type transmitted. gstrtphandler.c: synchronize with the changes above to gstrtphandler.h rtpdec.h, rtpdec.c: correct the logic of maintaining the number of members in the session. Also update correctly the average packet size. Remove functions to destroy hash tables; instead, destructors of the components of the hash table are passed to the constructor of the hash table. Modified files: rtpdec : gstrtpdec.c gstrtpdec.h gstrtphandler.c gstrtphandler.h rtp_report.c rtpdec.c rtpdec.h todo Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gstrtpdec.c.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gstrtpdec.h.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gstrtphandler.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gstrtphandler.h.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_report.c.diff?r1=1.20&r2=1.21 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtpdec.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtpdec.h.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/todo.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: gstrtpdec.c =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/gstrtpdec.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gstrtpdec.c 25 Aug 2004 13:17:40 -0000 1.17 +++ gstrtpdec.c 27 Aug 2004 01:25:13 -0000 1.18 @@ -181,20 +181,20 @@ rtpdec->myid = create_id (); rtpdec->mapping = NULL; - rtpdec->sender_list = g_hash_table_new (g_int_hash, g_int_equal); - rtpdec->recv_list = g_hash_table_new (g_int_hash, g_int_equal); - rtpdec->cname = make_cname (); + rtpdec->sender_list = NULL; + rtpdec->recv_list = NULL; + rtpdec->cname = NULL; rtpdec->email = NULL; rtpdec->clock = NULL; - rtpdec->bandwith = 8000; + rtpdec->bandwidth = 8000; rtpdec->num_members = 0; rtpdec->num_senders = 0; - rtpdec->rtcp_bw = rtpdec->bandwith / 20; + rtpdec->rtcp_bw = 0; rtpdec->avg_rtcp_size = 0; - rtpdec->initial = 0; + rtpdec->initial = FALSE; rtpdec->control_socket = -1; rtpdec->data_socket = -1; @@ -215,7 +215,9 @@ rtpdec->mtu = G_MAXINT; pipe (rtpdec->pipe); - pipe (rtpdec->report_thread_pipe); + rtpdec->report_thread = NULL; + rtpdec->report_thread_pipe[0] = -1; + rtpdec->report_thread_pipe[1] = -1; } static void @@ -224,13 +226,13 @@ GstRtpdec * element = GST_RTPDEC(object); g_assert(element != NULL); if (element->mapping) { - gst_rtpdec_delete_mapping (element->mapping); + g_hash_table_destroy (element->mapping); } if (element->sender_list) { - gst_rtpdec_delete_sender_list (element->sender_list); + g_hash_table_destroy (element->sender_list); if (element->recv_list) { - gst_rtpdec_delete_recv_list (element->recv_list); + g_hash_table_destroy (element->recv_list); gst_addr_num_address_free (&element->remote_address); gst_addr_num_address_free (&element->multicast_addr); @@ -365,8 +367,7 @@ sucess = gst_rtpdec_open_conn (rtpdec); return sucess ? GST_STATE_SUCCESS : GST_STATE_FAILURE; } else if (current_state == GST_STATE_READY && next_state == GST_STATE_PAUSED) { - gst_rtpdec_connect (rtpdec); - return GST_STATE_SUCCESS; + return gst_rtpdec_connect (rtpdec); } else if (current_state == GST_STATE_PAUSED && next_state == GST_STATE_PLAYING) { return GST_STATE_SUCCESS; Index: gstrtpdec.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/gstrtpdec.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstrtpdec.h 25 Aug 2004 03:06:51 -0000 1.13 +++ gstrtpdec.h 27 Aug 2004 01:25:13 -0000 1.14 @@ -64,7 +64,7 @@ GstElement *handler_element; GstIRtpdecHandler *handler; gboolean removed; /* a BYE packet was received */ - GCList *link_at_rr; + GCList *link_at_rr; /* Pointer to the link in GstRtpdec->sender_list_rr */ }; struct recv_info @@ -99,13 +99,13 @@ GstClock *clock; /* Information for scheduling the sending of control info */ - guint bandwith; /* in bytes/second */ + guint bandwidth; /* in bytes/second */ guint num_members, new_num_members; guint num_senders; guint rtcp_bw; /* bandwidth for RTCP in bytes per second */ /* we_sent is false */ - guint avg_rtcp_size; + guint avg_rtcp_packet_size; gboolean initial; /* True if no RTCP packet yet sent */ /* Network stuff */ @@ -132,6 +132,8 @@ /* Pipe for communicating with the thread that sends reports */ int report_thread_pipe[2]; + GThread* report_thread; + /* Possible messages sent to that thread */ /* A new member has been received. This causes the scheduling of the sending of the next packet to change */ Index: gstrtphandler.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/gstrtphandler.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtphandler.c 25 Aug 2004 13:17:40 -0000 1.1 +++ gstrtphandler.c 27 Aug 2004 01:25:13 -0000 1.2 @@ -20,7 +20,7 @@ void gst_irtpdec_handler_init (GstIRtpdecHandler * this, GstPad * output, - GHashTable * metadata) + GstStructure * metadata) { GST_IRTPDEC_HANDLER_CLASS(this)->init(this, output, metadata); Index: gstrtphandler.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/gstrtphandler.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstrtphandler.h 25 Aug 2004 13:17:40 -0000 1.3 +++ gstrtphandler.h 27 Aug 2004 01:25:13 -0000 1.4 @@ -21,7 +21,7 @@ typedef struct _GstIRtpdecHandlerClass GTypeInterface parent; - void (*init) (GstIRtpdecHandler * this, GstPad * output, GHashTable * metadata); + void (*init) (GstIRtpdecHandler * this, GstPad * output, GstStructure * metadata); void (*get_data_packet) (GstIRtpdecHandler * this, char *buffer, guint size, guint data_offset, GstClockTime timestamp); unsigned int (*get_sample_rate) (GstIRtpdecHandler * this, char *buffer, guint size, guint data_offset); @@ -33,7 +33,7 @@ GType gst_irtpdec_handler_get_type (void); - GHashTable * metadata); + GstStructure * metadata); void gst_irtpdec_handler_get_data_packet (GstIRtpdecHandler * this, char *buffer, guint size, guint data_offset, GstClockTime timestamp); void gst_irtpdec_handler_get_app_packet (GstIRtpdecHandler * this, guint32 tag, Index: rtp_report.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_report.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- rtp_report.c 21 Aug 2004 22:35:25 -0000 1.20 +++ rtp_report.c 27 Aug 2004 01:25:13 -0000 1.21 @@ -174,10 +174,10 @@ } else { if (rtpdec->num_senders > rtpdec->num_members / 4) { n = rtpdec->num_senders; - C = ((float) rtpdec->avg_rtcp_size) / rtpdec->rtcp_bw; + C = ((float) rtpdec->avg_rtcp_packet_size) / rtpdec->rtcp_bw; } else { n = rtpdec->num_members; } Td = C * n; if (Td < min_interval) { @@ -315,6 +315,7 @@ init_rtcp_bye (bye, rtpdec->myid); send_rtcp (rtpdec, buffer, bufsize); Index: rtpdec.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtpdec.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- rtpdec.c 25 Aug 2004 13:17:40 -0000 1.10 +++ rtpdec.c 27 Aug 2004 01:25:13 -0000 1.11 @@ -1,4 +1,6 @@ #include "rtpdec.h" +#include "rtp_report.h" +#include "rtp_packet.h" #include <pwd.h> #include <string.h> #include <unistd.h> @@ -38,6 +40,8 @@ static void gst_rtpdec_remove_sender (GstRtpdec * element, guint32 identifier); +static gboolean gst_rtpdec_is_known_sender(const GstRtpdec* element, guint32 identifier); static struct recv_info *gst_rtpdec_get_recv_info (GstRtpdec * element, guint32 identifier); @@ -51,10 +55,15 @@ gchar * text, guint length); static void gst_rtpdec_remove_receiver (GstRtpdec * element, - guint32 identifier); + guint32 identifier, gboolean decrease_members); +static void gst_rtpdec_report_new_member (GstRtpdec* rtpdec); +static void gst_rtpdec_report_removed_member (GstRtpdec* rtpdec); static void getusername (char *buffer, guint buf_size); +const guint UDP_HEADER_SIZE = 32; GHashTable * @@ -82,7 +91,7 @@ }; guint i; - result = g_hash_table_new (g_int_hash, g_int_equal); + result = g_hash_table_new_full (g_int_hash, g_int_equal, g_free, g_object_unref); for (i = 0; i < sizeof (fixed_payloads) / sizeof (struct fixed_payload); i++) { int *number; GstStructure *payload_desc; @@ -115,6 +124,10 @@ gst_rtpdec_handle_control_packet (GstRtpdec * element, char *data, guint data_size) + guint raw_packet_size; + raw_packet_size = data_size + UDP_HEADER_SIZE; + element->avg_rtcp_packet_size = raw_packet_size/16 + + 15*element->avg_rtcp_packet_size/16; while (1) { char *current_packet = data; guint remaining_data = data_size; @@ -310,10 +323,13 @@ for (i = 0; i < num_srcs; i++) { guint32 id; - + gboolean is_sender; id = ntohl (packet->identifier[i]); - gst_rtpdec_remove_sender (element, id); - gst_rtpdec_remove_receiver (element, id); + is_sender = gst_rtpdec_is_known_sender(element, packet->identifier[i]); + if (is_sender) { + gst_rtpdec_remove_sender (element, id); + } + gst_rtpdec_remove_receiver (element, id, !is_sender); @@ -368,6 +384,7 @@ guint32 this_data_timestamp; GstClockTime buffer_timestamp; guint runtime_sample_rate; if (packet_size < sizeof (struct rtp_packet)) { /* Invalid packet */ return; @@ -398,7 +415,7 @@ sender_info = gst_rtpdec_get_sender_info (element, identifier, TRUE); /* Update statistics */ sender_info->total_packets_received++; - /* FIXME: byte count should include UDP/IP headers */ + raw_packet_size = packet_size + UDP_HEADER_SIZE; sender_info->total_bytes_received += packet_size; sender_info->bytes_received += packet_size; sender_info->packets_received++; @@ -519,7 +536,7 @@ g_string_append_len (handler_name, "rtp-", sizeof ("rtp-")); g_string_append (handler_name, g_quark_to_string (payload_desc->name)); handler_element = gst_element_factory_make (handler_name->str, NULL); - if (handler_element == NULL || GST_IS_IRTPDEC_HANDLER (handler_element)) { + if (handler_element == NULL || !GST_IS_IRTPDEC_HANDLER (handler_element)) { /* Could not find a handler for this type */ g_string_free (handler_name, TRUE); if (handler_element != NULL) { @@ -534,6 +551,7 @@ } sender_info->handler_element = handler_element; sender_info->handler = GST_IRTPDEC_HANDLER (handler_element); + gst_irtpdec_handler_init(sender_info->handler, sender_info->output, payload_desc); { GstCaps *caps = gst_caps_new_empty (); @@ -581,6 +599,8 @@ result->handler_element = NULL; g_hash_table_insert (element->sender_list, (gpointer) ptr_id, (gpointer) result); + element->num_senders++; + gst_rtpdec_report_new_member(element); } else { g_assert (result->magic == sender_magic); @@ -588,6 +608,7 @@ return result; gst_rtpdec_remove_sender (GstRtpdec * element, guint32 identifier) @@ -617,9 +638,18 @@ g_free (sender_info); g_free (stored_identifier); g_hash_table_remove (element->sender_list, (gconstpointer) & identifier); + element->num_senders--; +static gboolean +gst_rtpdec_is_known_sender(const GstRtpdec* element, guint32 identifier) +{ + gpointer search_result; + search_result = g_hash_table_lookup (element->sender_list, (gconstpointer) &identifier); + return search_result != NULL; +} static struct recv_info * gst_rtpdec_get_recv_info (GstRtpdec * element, guint32 identifier) @@ -636,6 +666,9 @@ result->cname = NULL; result->name = NULL; result->email = NULL; + if (!gst_rtpdec_is_known_sender(element, identifier)) { g_assert (result->magic == recv_magic); @@ -643,7 +676,7 @@ -gst_rtpdec_remove_receiver (GstRtpdec * element, guint32 identifier) +gst_rtpdec_remove_receiver (GstRtpdec * element, guint32 identifier, gboolean decrease_members) struct recv_info *result; guint32 *stored_identifier; @@ -667,6 +700,9 @@ if (result->email != NULL) { g_string_free (result->email, TRUE); + if (decrease_members) { + gst_rtpdec_report_removed_member(element); @@ -701,34 +737,64 @@ recv_info->email = g_string_new_len (text, length); +static void +gst_rtpdec_report_new_member (GstRtpdec * rtpdec) + char msg = NEW_MEMBER; + rtpdec->new_num_members++; + write (rtpdec->report_thread_pipe[1], &msg, 1); +gst_rtpdec_report_removed_member (GstRtpdec * rtpdec) + char msg = LEFT_MEMBER; + rtpdec->new_num_members--; + g_assert(rtpdec->new_num_members > 0); void gst_rtpdec_set_mapping (GstRtpdec * rtpdec, GHashTable * mapping) - /* FIXME: implement */ + if (GST_STATE(GST_ELEMENT(rtpdec)) > GST_STATE_READY) { + return; + } + g_hash_table_destroy(rtpdec->mapping); + rtpdec->mapping = mapping; gst_rtpdec_set_bandwidth (GstRtpdec *rtpdec, guint bandwidth) + rtpdec->bandwidth = bandwidth; -gst_rtpdec_delete_mapping (GHashTable * mapping) -{ -} -void gst_rtpdec_delete_sender_list (GHashTable * sender_list) +gst_rtpdec_sender_info_free (struct sender_info * sender_info) + if (sender_info->output) { + g_object_unref(sender_info->output); + if (sender_info->handler_element) { + g_object_unref(sender_info->handler_element); + // We assume that sender_info->handler_element and sender_info->handler share the ref count. + g_free(sender_info); -void gst_rtpdec_delete_recv_list (GHashTable * recv_list) +void +gst_rtpdec_recv_info_free(struct recv_info * recv_info) + if (recv_info->name) { + g_free(recv_info->name); + if (recv_info->cname) { + g_free(recv_info->cname); + if (recv_info->email) { + g_free(recv_info->email); @@ -773,14 +839,44 @@ -void -gst_rtpdec_connect (GstRtpdec * element) +gboolean +gst_rtpdec_connect (GstRtpdec * rtpdec) + GError *error; + g_assert(rtpdec->control_socket >= 0 && + rtpdec->data_socket >= 0); + rtpdec->sender_list = g_hash_table_new_full (g_int_hash, g_int_equal, g_free, (GDestroyNotify) gst_rtpdec_sender_info_free); + rtpdec->recv_list = g_hash_table_new_full (g_int_hash, g_int_equal, g_free, (GDestroyNotify) gst_rtpdec_recv_info_free); + rtpdec->cname = make_cname (); + rtpdec->num_members = 1; + rtpdec->initial = TRUE; + rtpdec->avg_rtcp_packet_size = sizeof(struct rtcp_recv_report) + sizeof(struct rtcp_sdes) + UDP_HEADER_SIZE; + pipe(rtpdec->report_thread_pipe); + rtpdec->report_thread = g_thread_create(gst_rtpdec_send_report_thread, rtpdec, TRUE, &error); + if (error != NULL) { + g_hash_table_destroy(rtpdec->sender_list); + g_hash_table_destroy(rtpdec->recv_list); + g_string_free(rtpdec->cname, TRUE); + g_error_free(error); + rtpdec->report_thread = NULL; + return FALSE; + return TRUE; -gst_rtpdec_disconnect (GstRtpdec * element) +gst_rtpdec_disconnect (GstRtpdec * rtpdec) + char msg = TERMINATE; + write(rtpdec->report_thread_pipe[1], &msg, 1); + g_thread_join(rtpdec->report_thread); + close(rtpdec->report_thread_pipe[0]); + close(rtpdec->report_thread_pipe[1]); + rtpdec->num_members = 0; + g_string_free(rtpdec->cname, TRUE); + g_hash_table_destroy(rtpdec->recv_list); + g_hash_table_destroy(rtpdec->sender_list); Index: rtpdec.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtpdec.h,v retrieving revision 1.9 diff -u -d -r1.9 -r1.10 --- rtpdec.h 25 Aug 2004 13:17:40 -0000 1.9 +++ rtpdec.h 27 Aug 2004 01:25:13 -0000 1.10 @@ -18,16 +18,14 @@ void gst_rtpdec_disconnect (GstRtpdec * rtpdec); -void gst_rtpdec_connect (GstRtpdec * rtpdec); -guint32 create_id (void); +gboolean gst_rtpdec_connect (GstRtpdec * rtpdec); -GString *make_cname (void); +void gst_rtpdec_sender_info_free (struct sender_info * sender_info); -void gst_rtpdec_delete_mapping (GHashTable * mapping); +void gst_rtpdec_recv_info_free (struct recv_info * recv_info); -void gst_rtpdec_delete_sender_list (GHashTable * sender_list); +guint32 create_id (void); -void gst_rtpdec_delete_recv_list (GHashTable * recv_list); +GString *make_cname (void); #endif Index: todo RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/todo,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- todo 25 Aug 2004 13:17:40 -0000 1.5 +++ todo 27 Aug 2004 01:25:13 -0000 1.6 @@ -1,10 +1,8 @@ * Short term -Update rtpdec.c, so that it sends a message when a new receiver is got or dropped. -Remember, now we have new_num_members in GstRtpdec, that must be used for this purpose. Implement gclist.c and actually update GCLists. -Ensure that gst_irtpdec_init is called, it is not now. +Implement types for each of the boxed argument types. * Long term |
From: <ra...@fr...> - 2004-09-04 14:43:58
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sat Sep 04 2004 07:43:56 PDT Log message: gclist.h, gclist.c: implementations Modified files: rtpdec : gclist.h Added files: rtpdec : gclist.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gclist.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gclist.h.diff?r1=1.1&r2=1.2 ====Begin Diffs==== --- NEW FILE: gclist.c --- #include <glist/gmem.h> #include "gclist.h" void g_clist_append (GCList ** list, gpointer data) { GCList *slab; if (*list == NULL) { *list = g_new (GCList, 1); (*list)->next = *list; (*list)->prev = *list; slab = *list; } else { slab = g_new (GCList, 1); slab->prev = (*list)->prev; slab->next = *list; (*list)->prev->next = slab; (*list)->prev = slab; } slab->data = data; } g_clist_remove (GCList ** list, GCList * link) if (link->prev == link) { g_assert (*list = link); *list = NULL; link->prev->next = link->next; link->next->prev = link->prev; g_free (link); Index: gclist.h =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/gclist.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gclist.h 13 Aug 2004 10:30:53 -0000 1.1 +++ gclist.h 4 Sep 2004 14:43:44 -0000 1.2 @@ -1,10 +1,23 @@ -#include <glib.h> +/* Circular list */ -struct _GCList { +#ifndef __GCLIST_H__ +#define __GCLIST_H__ 1 + +#include <glib/gtypes.h> +typedef struct _GCList GCList; +struct _GCList +{ gpointer data; - struct _GCList* next; + GCList *prev; + GCList *next; }; -typedef struct _GCList GCList; - +void g_clist_append (GCList ** list, gpointer data); +void g_clist_remove (GCList ** list, GCList * link); +#endif |
From: <ra...@fr...> - 2004-09-13 00:11:54
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sun Sep 12 2004 17:11:47 PDT Log message: Makefile: added gclist gclist.c: compilation fixes socket_fns.c: implemented some functions Modified files: rtpdec : Makefile gclist.c socket_fns.c todo Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/Makefile.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gclist.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/socket_fns.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/todo.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: Makefile =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/Makefile,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- Makefile 25 Aug 2004 13:17:40 -0000 1.9 +++ Makefile 13 Sep 2004 00:11:35 -0000 1.10 @@ -1,12 +1,12 @@ CFLAGS=$(shell pkg-config --cflags gstreamer-0.8) -DGST_PACKAGE='"GStreamer"' -DGST_ORIGIN='"http://gstreamer.net"' -DVERSION='"0.0"' -DHAVE_USER_MTU -Wall -Wimplicit -Werror -g -gstrtpdec.la: gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo address.lo +gstrtpdec.la: gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo address.lo gclist.lo libtool --mode=link gcc -module -avoid-version\ -rpath /home/ramon/projects/internet-radio/gstreamer/gst-sandbox/rtpdec \ -export-symbols-regex gst_plugin_desc \ -o gstrtpdec.la \ - gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo address.lo \ + gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo address.lo gclist.lo \ $$(pkg-config --libs gstreamer-0.8) @@ -28,6 +28,8 @@ address.lo: address.c libtool --mode=compile gcc $(CFLAGS) -o address.o -c address.c +gclist.lo: gclist.c + libtool --mode=compile gcc $(CFLAGS) -o gclist.o -c gclist.c .PHONY: install Index: gclist.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/gclist.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gclist.c 4 Sep 2004 14:43:44 -0000 1.1 +++ gclist.c 13 Sep 2004 00:11:35 -0000 1.2 @@ -1,4 +1,5 @@ -#include <glist/gmem.h> +#include <glib/gmem.h> +#include <glib/gmessages.h> #include "gclist.h" void @@ -25,7 +26,7 @@ g_clist_remove (GCList ** list, GCList * link) { if (link->prev == link) { - g_assert (*list = link); + g_assert (*list == link); *list = NULL; } else { link->prev->next = link->next; Index: socket_fns.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/socket_fns.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- socket_fns.c 25 Aug 2004 13:17:40 -0000 1.11 +++ socket_fns.c 13 Sep 2004 00:11:35 -0000 1.12 @@ -320,42 +320,61 @@ gst_rtpdec_set_data_port (GstRtpdec* rtpdec, int port_val) - /* FIXME: implement */ + if (GST_STATE(GST_ELEMENT(rtpdec)) != GST_STATE_NULL) + return; + rtpdec->data_port = port_val; + } gst_rtpdec_set_ctl_port (GstRtpdec* rtpdec, int port_val) + rtpdec->control_port = port_val; + gst_rtpdec_set_local_addr (GstRtpdec* rtpdec, GstAddress* addr) + gst_addr_free_num_address(&rtpdec->local_address); + gst_addr_resolve_address(addr, &rtpdec->local_address); gst_rtpdec_set_remote_addr (GstRtpdec* rtpdec, GstAddress* addr) + gst_addr_free_num_address(&rtpdec->remote_address); + gst_addr_resolve_address(addr, &rtpdec->remote_address); gst_rtpdec_set_remote_data_port (GstRtpdec* rtpdec, int port_val) + rtpdec->remote_data_port = port_val; gst_rtpdec_set_remote_ctl_port (GstRtpdec* rtpdec , int port_val) + rtpdec->remote_control_port = port_val; gst_rtpdec_set_multicast_addr (GstRtpdec* rtpdec, GstAddress* address) + gst_addr_free_num_address(&rtpdec->multicast_addr); + gst_addr_resolve_address(address, &rtpdec->multicast_addr); Index: todo RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/todo,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- todo 27 Aug 2004 01:25:13 -0000 1.6 +++ todo 13 Sep 2004 00:11:35 -0000 1.7 @@ -4,6 +4,12 @@ Implement types for each of the boxed argument types. +Improve synchonization. +Syncrhonization shall be implemented as: +- After creating a new output pad, generate the discontinous event; +- After receiving the first RTCP timing info, generate another discontinous event; +- Then simply set the appropiate timestamp in buffers. * Long term Check addr functions. |
From: <ra...@fr...> - 2004-09-25 13:13:13
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sat Sep 25 2004 06:13:11 PDT Log message: address.c: implement missing functions address.h: add const to an argument. gstrtpdec.c: add property ARG_MULTICAST_MODE, so that the user can control whether the element uses the multicast addr or not. (review) socket_fns.c: support the new property ARG_MULTICAST_MODE todo: update pending tasks: it seems that there are not unimplemented functions, but synchronization is still pending. Modified files: rtpdec : address.c address.h gstrtpdec.c socket_fns.c socket_fns.h todo Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/address.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/address.h.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gstrtpdec.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/socket_fns.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/socket_fns.h.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/todo.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: address.c =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/address.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- address.c 25 Aug 2004 13:17:40 -0000 1.8 +++ address.c 25 Sep 2004 13:12:59 -0000 1.9 @@ -48,7 +48,7 @@ } void -gst_addr_free_num_address (GstNumAddress * addr) +gst_addr_free_num_address (GstNumAddress* addr) { if (addr->alternatives) { g_free (addr->alternatives); @@ -77,7 +77,7 @@ void gst_addr_num_address_free (GstNumAddress * addr) - /* FIXME: implement */ + g_array_free(addr->alternatives, TRUE); static void @@ -179,17 +179,24 @@ gboolean gst_addr_in_list (const GstNumAddress * address, - struct in6_addr *addr) + const struct in6_addr *addr) - return FALSE; + int i; + for (i = 0; i <= address->alternatives->len; i++) { + const struct in6_addr* alternative = & g_array_index(address->alternatives, const struct in6_addr, i); + if (memcmp(alternative, addr, sizeof(struct in6_addr)) == 0) { + return TRUE; + } + } + return FALSE; GstNumAddress gst_addr_any() GstNumAddress result; + result.alternatives = g_array_sized_new(FALSE, FALSE, sizeof(struct in6_addr), 1); + g_array_append_val(result.alternatives, in6addr_any); return result; @@ -219,7 +226,12 @@ void gst_addr_authorized_addrs_free (GstAuthorizedAddrs * addr) + int i; + for (i = 0; i < addr->authorized_addrs->len; i++) { + GstAuthorizedAddr* a = &g_array_index(addr->authorized_addrs, GstAuthorizedAddr, i); + gst_addr_num_address_free(&a->addr); + } + g_array_free(addr->authorized_addrs, TRUE); static void Index: address.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/address.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- address.h 25 Aug 2004 13:17:40 -0000 1.11 +++ address.h 25 Sep 2004 13:12:59 -0000 1.12 @@ -46,7 +46,7 @@ struct _GstAuthorizedAddrs - GArray *authorized_addrs; + GArray *authorized_addrs; /* Array of GstAuthorizedAddr */ }; @@ -58,7 +58,7 @@ GstNumAddress * result); gboolean gst_addr_in_list (const GstNumAddress * address, - struct in6_addr *addr); + const struct in6_addr *addr); gboolean gst_addr_try_bind (int socket, const GstNumAddress * address, in_port_t port); Index: gstrtpdec.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/gstrtpdec.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstrtpdec.c 27 Aug 2004 01:25:13 -0000 1.18 +++ gstrtpdec.c 25 Sep 2004 13:12:59 -0000 1.19 @@ -44,6 +44,7 @@ ARG_REMOTE_HOST, ARG_REMOTE_DATA_PORT, ARG_REMOTE_CONTROL_PORT, + ARG_MULTICAST_MODE, ARG_MULTICAST_ADDR, ARG_AUTHORIZED_SENDERS, ARG_MEDIA_MIME_MAPPING, @@ -152,6 +153,9 @@ g_object_class_install_property (gobject_class, ARG_REMOTE_HOST, g_param_spec_boxed("remote_addr", "remote_addr", "the address of the remote machine that we will talk to", GST_TYPE_ADDRESS, G_PARAM_WRITABLE)); + g_object_class_install_property (gobject_class, ARG_MULTICAST_MODE, + g_param_spec_boolean("multicast_mode", "multicast_mode", "whether this element will use a multicast address", + FALSE, G_PARAM_WRITABLE)); g_object_class_install_property (gobject_class, ARG_MULTICAST_ADDR, g_param_spec_boxed("multicast_addr", "multicast_addr", "the address of the multicast address, if we are multicasting", @@ -192,7 +196,7 @@ rtpdec->num_members = 0; rtpdec->num_senders = 0; rtpdec->rtcp_bw = 0; - rtpdec->avg_rtcp_size = 0; + rtpdec->avg_rtcp_packet_size = 0; rtpdec->initial = FALSE; @@ -271,6 +275,7 @@ GstRtpdec *rtpdec; int port_val; + gboolean mode; GstAddress *addr; GHashTable *mapping; int bandwidth; @@ -305,6 +310,9 @@ port_val = g_value_get_int (value); gst_rtpdec_set_remote_ctl_port (rtpdec, port_val); break; + case ARG_MULTICAST_MODE: + mode = g_value_get_boolean(value); + gst_rtpdec_set_multicast_mode (rtpdec, mode); case ARG_MULTICAST_ADDR: addr = (GstAddress *) g_value_get_boxed (value); gst_rtpdec_set_multicast_addr (rtpdec, addr); Index: socket_fns.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/socket_fns.c,v retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- socket_fns.c 13 Sep 2004 00:11:35 -0000 1.12 +++ socket_fns.c 25 Sep 2004 13:12:59 -0000 1.13 @@ -286,7 +286,7 @@ the_addr = &g_array_index (multicast_addr.alternatives, struct in6_addr, i); ipv6_mreq.ipv6mr_multiaddr = *the_addr; - /* FIXME: the user should be able to choose an interface */ + /* FIXME: the user should be able to choose an interface ?? */ ipv6_mreq.ipv6mr_interface = 0; error = setsockopt (fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &ipv6_mreq, sizeof (ipv6_mreq)); @@ -378,3 +378,11 @@ gst_addr_free_num_address(&rtpdec->multicast_addr); gst_addr_resolve_address(address, &rtpdec->multicast_addr); + +void +gst_rtpdec_set_multicast_mode (GstRtpdec* rtpdec, gboolean mode) +{ + if (GST_STATE(GST_ELEMENT(rtpdec)) != GST_STATE_NULL) + return; + rtpdec->multicast_mode = mode; +} Index: socket_fns.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/socket_fns.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- socket_fns.h 20 Mar 2004 23:33:28 -0000 1.6 +++ socket_fns.h 25 Sep 2004 13:12:59 -0000 1.7 @@ -29,5 +29,7 @@ void gst_rtpdec_set_multicast_addr (GstRtpdec * rtpdec, GstAddress * addr); +void gst_rtpdec_set_multicast_mode (GstRtpdec * rtpdec, gboolean mode); #endif Index: todo RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/todo,v diff -u -d -r1.7 -r1.8 --- todo 13 Sep 2004 00:11:35 -0000 1.7 +++ todo 25 Sep 2004 13:12:59 -0000 1.8 @@ -1,8 +1,8 @@ * Short term -Implement gclist.c and actually update GCLists. - -Implement types for each of the boxed argument types. +rtp_packet: do not use bitfields. Instead, implement functions for accessing +different fields. Bitfields are not portable (differences between big and +little endian), and handling endianess is error prone. Improve synchonization. Syncrhonization shall be implemented as: @@ -10,6 +10,8 @@ - After receiving the first RTCP timing info, generate another discontinous event; - Then simply set the appropiate timestamp in buffers. +- Implement conversion functions. * Long term Check addr functions. |
From: <ra...@fr...> - 2004-10-09 19:21:24
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sat Oct 09 2004 12:20:54 PDT Log message: rtp_packet.c : new file, routines for manipulating the bits of an rtp_packet. Rationale: it is better to use functions that to use bitfields and C. bitfields are not portable: the positions of bits are different in different machines. Modified files: rtpdec : Makefile rtp_packet.h rtpdec.c Added files: rtpdec : rtp_packet.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/Makefile.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.h.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtpdec.c.diff?r1=1.12&r2=1.13 ====Begin Diffs==== Index: Makefile =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/Makefile,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- Makefile 4 Oct 2004 22:39:14 -0000 1.11 +++ Makefile 9 Oct 2004 19:20:42 -0000 1.12 @@ -1,12 +1,12 @@ CFLAGS=$(shell pkg-config --cflags gstreamer-0.8) -DGST_PACKAGE='"GStreamer"' -DGST_ORIGIN='"http://gstreamer.net"' -DVERSION='"0.0"' -DHAVE_USER_MTU -Wall -Wimplicit -Werror -g -gstrtpdec.la: gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo address.lo gclist.lo +gstrtpdec.la: gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo rtp_packet.lo address.lo gclist.lo libtool --mode=link gcc -module -avoid-version\ -rpath /home/ramon/projects/internet-radio/gstreamer/gst-sandbox/rtpdec \ -export-symbols-regex gst_plugin_desc \ -o gstrtpdec.la \ - gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo address.lo gclist.lo \ + gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo rtp_packet.lo address.lo gclist.lo \ $$(pkg-config --libs gstreamer-0.8) @@ -25,6 +25,9 @@ socket_fns.lo: socket_fns.c libtool --mode=compile gcc $(CFLAGS) -o socket_fns.lo -c socket_fns.c +rtp_packet.lo: rtp_packet.c + libtool --mode=compile gcc $(CFLAGS) -o rtp_packet.o -c rtp_packet.c + address.lo: address.c libtool --mode=compile gcc $(CFLAGS) -o address.o -c address.c @@ -37,4 +40,4 @@ libtool --mode=install install gstrtpdec.la /home/ramon/projects/internet-radio/gstreamer-build/lib/gstreamer-0.8/ clean: - rm -rf *.o *.lo *.a *.la .libs \ No newline at end of file + rm -rf *.o *.lo *.a *.la .libs --- NEW FILE: rtp_packet.c --- #include "rtp_packet.h" /* Mask to select the n lowest bits of a number */ /* For instance, get_low_bits_mask(3) returns the number 0000111 in binary */ static inline guint8 get_low_bits_mask(guint8 n) { return (1 << n) - 1; } /* Return bits, being first the lowest bit, and len the total number of bits, of the number x Bits are numbered starting with 0 as the lowest. */ static inline guint8 get_bits(guint8 x, guint8 first, guint8 len) return (x >> first) & get_low_bits_mask(len); /* Set bits, being num the lowest bit number, and len the total number of bits of the number x to the value v */ static inline void set_bits(guint8* x, guint8 first, guint8 len, guint8 val) *x &= ~(get_low_bits_mask(len) << first); *x |= (get_low_bits_mask(len) & val) << first; static inline guint16 get_uint16(const guint8 x[2]) return (((guint16)x[0]) << 8) + (guint16)x[1]; static inline void set_uint16(guint8 x[2], guint16 v) x[0] = (guint8) (v >> 8); x[1] = (guint8) v; static inline guint32 get_uint32(const guint8 x[4]) return (((guint32) x[0]) << 24) + (((guint32) x[1]) << 16) + (((guint32) x[2]) << 8) + (guint32) x[3]; static inline void set_uint32(guint8 x[4], guint32 v) x[0] = (guint8) (v >> 24); x[1] = (guint8) (v >> 16); x[2] = (guint8) (v >> 8); x[3] = (guint8) v; guint8 rtp_packet_get_version(const struct rtp_packet* this) return get_bits(this->content[0], 0, 2); void rtp_packet_set_version(struct rtp_packet* this, guint8 version) set_bits(&this->content[0], 0, 2, version); guint8 rtp_packet_get_padding(const struct rtp_packet* this) return get_bits(this->content[0], 2, 1); void rtp_packet_set_padding(struct rtp_packet* this, guint8 padding) set_bits(&this->content[0], 2, 1, padding); guint8 rtp_packet_get_extension(const struct rtp_packet* this) return get_bits(this->content[0], 3, 1); void rtp_packet_set_extension(struct rtp_packet* this, guint8 extension) set_bits(&this->content[0], 3, 1, extension); guint8 rtp_packet_get_num_contrib_sources(const struct rtp_packet* this) return get_bits(this->content[0], 4, 4); void rtp_packet_set_num_contrib_sources(struct rtp_packet* this, guint8 num_contrib_sources) return set_bits(&this->content[0], 4, 4, num_contrib_sources); guint8 rtp_packet_get_mark(const struct rtp_packet* this) return get_bits(this->content[1], 0, 1); void rtp_packet_set_mark(struct rtp_packet* this, guint8 mark) set_bits(&this->content[1], 0, 1, mark); guint8 rtp_packet_get_payload_type(const struct rtp_packet* this) return get_bits(this->content[1], 1, 7); void rtp_packet_set_payload_type(struct rtp_packet* this, guint8 payload_type) set_bits(&this->content[1], 1, 7, payload_type); guint16 rtp_packet_get_sequence_number(const struct rtp_packet* this) return get_uint16(&this->content[2]); void rtp_packet_set_sequence_number(struct rtp_packet* this, guint16 number) set_uint16(&this->content[2], number); guint32 rtp_packet_get_timestamp(const struct rtp_packet* this) return get_uint32(&this->content[4]); void rtp_packet_set_timestamp(struct rtp_packet* this, guint32 timestamp) set_uint32(&this->content[4], timestamp); guint32 rtp_packet_get_identifier(const struct rtp_packet* this) return get_uint32(&this->content[8]); void rtp_packet_set_identifier(struct rtp_packet* this, guint32 timestamp) set_uint32(&this->content[8], timestamp); guint32 rtp_packet_get_contrib_source(const struct rtp_packet* this, unsigned int n) return get_uint32(&this->content[12 + 4*n]); void rtp_packet_set_contrib_source(struct rtp_packet* this, unsigned int n, guint32 value) set_uint32(&this->content[12 + 4*n], value); Index: rtp_packet.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- rtp_packet.h 21 Aug 2004 22:35:25 -0000 1.7 +++ rtp_packet.h 9 Oct 2004 19:20:42 -0000 1.8 @@ -1,33 +1,50 @@ #ifndef __RTP_PACKET_H__ #define __RTP_PACKET_H__ 1 +#include <glib.h> -#if G_BYTE_ORDER == G_BIG_ENDIAN -struct __attribute__ ((packed)) rtp_packet { - unsigned int version:2; - unsigned int padding:1; - unsigned int extension:1; - unsigned int num_contrib_sources:4; - unsigned int mark:1; - unsigned int payload_type:7; - unsigned int sequence_number:16; - unsigned int timestamp:32; - unsigned int identifier:32; - unsigned int contrib_sources[1]; -}; -#else +struct rtp_packet { + guint8 content[12]; }; -#endif +guint8 rtp_packet_get_version(const struct rtp_packet* this); +void rtp_packet_set_version(struct rtp_packet* this, guint8 version); +guint8 rtp_packet_get_padding(const struct rtp_packet* this); +void rtp_packet_set_padding(struct rtp_packet* this, guint8 padding); +guint8 rtp_packet_get_extension(const struct rtp_packet* this); +void rtp_packet_set_extension(struct rtp_packet* this, guint8 extension); +guint8 rtp_packet_get_num_contrib_sources(const struct rtp_packet* this); +void rtp_packet_set_num_contrib_sources(struct rtp_packet* this, guint8 num_contrib_sources); +guint8 rtp_packet_get_mark(const struct rtp_packet* this); +void rtp_packet_set_mark(struct rtp_packet* this, guint8 mark); +guint8 rtp_packet_get_payload_type(const struct rtp_packet* this); +void rtp_packet_set_payload_type(struct rtp_packet* this, guint8 payload_type); +guint16 rtp_packet_get_sequence_number(const struct rtp_packet* this); +void rtp_packet_set_sequence_number(struct rtp_packet* this, guint16 number); +guint32 rtp_packet_get_timestamp(const struct rtp_packet* this); +void rtp_packet_set_timestamp(struct rtp_packet* this, guint32 timestamp); +guint32 rtp_packet_get_identifier(const struct rtp_packet* this); +void rtp_packet_set_identifier(struct rtp_packet* this, guint32 timestamp); +guint32 rtp_packet_get_contrib_source(const struct rtp_packet* this, unsigned int n); +void rtp_packet_set_contrib_source(struct rtp_packet* this, unsigned int n, guint32 value); struct __attribute__ ((packed)) rtp_packet_extension { guint16 tag; @@ -40,6 +57,7 @@ BYE = 203, APP = 204 } rtcp_packet_type; #if G_BYTE_ORDER == G_BIG_ENDIAN struct __attribute__ ((packed)) rtcp_common_header { unsigned int version:2; Index: rtpdec.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtpdec.c,v retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- rtpdec.c 4 Oct 2004 23:21:44 -0000 1.12 +++ rtpdec.c 9 Oct 2004 19:20:42 -0000 1.13 @@ -390,20 +390,20 @@ return; } packet = (struct rtp_packet *) data; - if (packet->padding == 1) { + if (rtp_packet_get_padding(packet) == 1) { packet_size = ntohl (*(guint32 *) ((char *) packet + packet_size - sizeof (guint32))); payload_offset = - sizeof (struct rtp_packet) + (packet->num_contrib_sources - + sizeof (struct rtp_packet) + (rtp_packet_get_num_contrib_sources(packet) - 1) * sizeof (unsigned long); if (packet_size < payload_offset) { /* Invalid packet */ - if (packet->extension) { + if (rtp_packet_get_extension(packet) != 0) { struct rtp_packet_extension *extension = (struct rtp_packet_extension *) - ((char *) packet + packet->extension); + ((char *) packet + rtp_packet_get_extension(packet)); packet_size += sizeof (struct rtp_packet_extension) + ntohs (extension->length); @@ -411,7 +411,7 @@ - identifier = ntohl (packet->identifier); + identifier = rtp_packet_get_identifier(packet); sender_info = gst_rtpdec_get_sender_info (element, identifier, TRUE); /* Update statistics */ sender_info->total_packets_received++; @@ -424,13 +424,13 @@ /* Be careful with cycling numbers */ num_packets_lost = - ntohs (packet->sequence_number) - sender_info->last_sequence_number - + rtp_packet_get_sequence_number(packet) - sender_info->last_sequence_number - (guint16) 1; sender_info->total_packets_lost += num_packets_lost; sender_info->packets_lost += num_packets_lost; now = gst_clock_get_time (element->clock); - this_data_timestamp = ntohl (packet->timestamp); + this_data_timestamp = rtp_packet_get_timestamp(packet); if (sender_info->received_data) { GstClockTimeDiff time_diff; guint32 new_diff; @@ -448,7 +448,7 @@ sender_info->last_data_timestamp = this_data_timestamp; sender_info->time_last_data_packet_received = now; sender_info->received_data = TRUE; - sender_info->last_sequence_number = ntohs (packet->sequence_number); + sender_info->last_sequence_number = rtp_packet_get_sequence_number(packet); if (!sender_info->received_srvctl) { /* FIXME: For now we ignore data packets if we didn't receive a control packet because then we cannot know the correct timestamp. @@ -461,9 +461,9 @@ (&gst_rtpdec_src_template), g_strdup_printf ("src_%d", identifier)); gst_element_add_pad (GST_ELEMENT (element), sender_info->output); - if (sender_info->payload_type != packet->payload_type) { + if (sender_info->payload_type != rtp_packet_get_payload_type(packet)) { if (!gst_rtpdec_change_payload_type (element, sender_info, - packet->payload_type)) { + rtp_packet_get_payload_type(packet))) { /* We do not know how to handle this payload type. Exit */ return; } |
From: <ra...@fr...> - 2004-10-10 11:27:18
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sun Oct 10 2004 04:27:11 PDT Log message: rtp_packet.h, rtp_packet.c: provide a clean interface to separace parsing/composing packets. It does not compile for now. Modified files: rtpdec : rtp_packet.c rtp_packet.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.h.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: rtp_packet.c =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- rtp_packet.c 9 Oct 2004 19:20:42 -0000 1.1 +++ rtp_packet.c 10 Oct 2004 11:26:59 -0000 1.2 @@ -51,102 +51,88 @@ x[3] = (guint8) v; } -guint8 rtp_packet_get_version(const struct rtp_packet* this) -{ - return get_bits(this->content[0], 0, 2); -} - -void rtp_packet_set_version(struct rtp_packet* this, guint8 version) - set_bits(&this->content[0], 0, 2, version); -guint8 rtp_packet_get_padding(const struct rtp_packet* this) - return get_bits(this->content[0], 2, 1); -void rtp_packet_set_padding(struct rtp_packet* this, guint8 padding) - set_bits(&this->content[0], 2, 1, padding); -guint8 rtp_packet_get_extension(const struct rtp_packet* this) - return get_bits(this->content[0], 3, 1); -void rtp_packet_set_extension(struct rtp_packet* this, guint8 extension) - set_bits(&this->content[0], 3, 1, extension); -guint8 rtp_packet_get_num_contrib_sources(const struct rtp_packet* this) - return get_bits(this->content[0], 4, 4); +/* +struct rtp_packet { + unsigned int version:2; + unsigned int padding:1; + unsigned int extension:1; + unsigned int num_contrib_sources:4; + unsigned int mark:1; + unsigned int payload_type:7; + unsigned int sequence_number:16; + unsigned int timestamp:32; + unsigned int identifier:32; + unsigned int contrib_sources[1]; +}; -void rtp_packet_set_num_contrib_sources(struct rtp_packet* this, guint8 num_contrib_sources) - return set_bits(&this->content[0], 4, 4, num_contrib_sources); +struct __attribute__ ((packed)) rtcp_common_header { + unsigned int num_sources:5; + rtcp_packet_type packet_type:8; + unsigned int length:16; -guint8 rtp_packet_get_mark(const struct rtp_packet* this) - return get_bits(this->content[1], 0, 1); +struct __attribute__ ((packed)) reception_block { + guint32 identifier; + guint8 fraction_lost_last; + unsigned int cumul_packets_lost:24; + guint32 highest_sequence_number; + guint32 jitter; + guint32 last_ntp_timestamp_seen_sr; + guint32 time_since_last_sr_packet; -void rtp_packet_set_mark(struct rtp_packet* this, guint8 mark) - set_bits(&this->content[1], 0, 1, mark); +struct __attribute__ ((packed)) ntptime { + guint32 integer; + guint32 frac; -guint8 rtp_packet_get_payload_type(const struct rtp_packet* this) - return get_bits(this->content[1], 1, 7); -void rtp_packet_set_payload_type(struct rtp_packet* this, guint8 payload_type) - set_bits(&this->content[1], 1, 7, payload_type); +struct __attribute__ ((packed)) rtcp_sender_report { + struct rtcp_common_header common; + guint32 sync_src_rtcp_sender; + struct ntptime ntp_timestamp; + guint32 rtp_timestamp; + guint32 num_packets_sent; + guint32 num_bytes_sent; + struct reception_block reception_blocks[1]; -guint16 rtp_packet_get_sequence_number(const struct rtp_packet* this) - return get_uint16(&this->content[2]); +struct __attribute__ ((packed)) rtcp_recv_report { -void rtp_packet_set_sequence_number(struct rtp_packet* this, guint16 number) - set_uint16(&this->content[2], number); -guint32 rtp_packet_get_timestamp(const struct rtp_packet* this) - return get_uint32(&this->content[4]); -void rtp_packet_set_timestamp(struct rtp_packet* this, guint32 timestamp) - set_uint32(&this->content[4], timestamp); +struct __attribute__ ((packed)) rtcp_sdes { + struct __attribute__ ((packed)) sdes_chunk { + guint32 identifier; // sync source or contrib source + struct __attribute__ ((packed)) sdes_item { + enum + { END = 0, CNAME = 1, NAME = 2, EMAIL = 3, PHONE = 4, STREET_ADDRESS = + 5, TOOL = 6, NOTE = 7, PRIV = 8 + } type:8; + guint8 length; + gchar text[1]; + } items[1]; // WARNING: Variable length struct. Do not use the array index for values other than 0 + } chunks[1]; // Idem here -guint32 rtp_packet_get_identifier(const struct rtp_packet* this) - return get_uint32(&this->content[8]); +struct __attribute__ ((packed)) rtcp_bye { + guint32 identifier[1]; -void rtp_packet_set_identifier(struct rtp_packet* this, guint32 timestamp) - set_uint32(&this->content[8], timestamp); +struct __attribute__ ((packed)) rtcp_app { + guint32 name; + char data[1]; -guint32 rtp_packet_get_contrib_source(const struct rtp_packet* this, unsigned int n) - return get_uint32(&this->content[12 + 4*n]); +*/ -void rtp_packet_set_contrib_source(struct rtp_packet* this, unsigned int n, guint32 value) - set_uint32(&this->content[12 + 4*n], value); Index: rtp_packet.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- rtp_packet.h 9 Oct 2004 19:20:42 -0000 1.8 +++ rtp_packet.h 10 Oct 2004 11:26:59 -0000 1.9 @@ -6,147 +6,40 @@ guint8 content[12]; }; -guint8 rtp_packet_get_version(const struct rtp_packet* this); -void rtp_packet_set_version(struct rtp_packet* this, guint8 version); -guint8 rtp_packet_get_padding(const struct rtp_packet* this); -void rtp_packet_set_padding(struct rtp_packet* this, guint8 padding); -guint8 rtp_packet_get_extension(const struct rtp_packet* this); -void rtp_packet_set_extension(struct rtp_packet* this, guint8 extension); -guint8 rtp_packet_get_num_contrib_sources(const struct rtp_packet* this); -void rtp_packet_set_num_contrib_sources(struct rtp_packet* this, guint8 num_contrib_sources); -guint8 rtp_packet_get_mark(const struct rtp_packet* this); -void rtp_packet_set_mark(struct rtp_packet* this, guint8 mark); -guint8 rtp_packet_get_payload_type(const struct rtp_packet* this); -void rtp_packet_set_payload_type(struct rtp_packet* this, guint8 payload_type); -guint16 rtp_packet_get_sequence_number(const struct rtp_packet* this); -void rtp_packet_set_sequence_number(struct rtp_packet* this, guint16 number); -guint32 rtp_packet_get_timestamp(const struct rtp_packet* this); -void rtp_packet_set_timestamp(struct rtp_packet* this, guint32 timestamp); -guint32 rtp_packet_get_identifier(const struct rtp_packet* this); -void rtp_packet_set_identifier(struct rtp_packet* this, guint32 timestamp); -guint32 rtp_packet_get_contrib_source(const struct rtp_packet* this, unsigned int n); -void rtp_packet_set_contrib_source(struct rtp_packet* this, unsigned int n, guint32 value); -struct __attribute__ ((packed)) rtp_packet_extension { - guint16 tag; - guint16 length; +struct rtp_packet_digested { + unsigned int padding; + unsigned int extension; + unsigned int mark; + unsigned int payload_type; + unsigned int sequence_number; + unsigned int timestamp; + unsigned int identifier; + const char* payload; + // We don't care about extensions and number of contrib sources for now +void rtp_packet_parse(const char* raw_packet, guint packet_size, struct rtp_packet_digested* digested_packet); typedef enum { SENDER_REPORT = 200, RECEIVER_REPORT = 201, SOURCE_DESCRIPTION = 202, BYE = 203, APP = 204 } rtcp_packet_type; -#if G_BYTE_ORDER == G_BIG_ENDIAN -struct __attribute__ ((packed)) rtcp_common_header { - unsigned int version:2; - unsigned int padding:1; - unsigned int num_sources:5; - rtcp_packet_type packet_type:8; - unsigned int length:16; -}; -#else -#endif -struct __attribute__ ((packed)) reception_block { - guint32 identifier; - guint8 fraction_lost_last; - unsigned int cumul_packets_lost:24; - guint32 highest_sequence_number; - guint32 jitter; - guint32 last_ntp_timestamp_seen_sr; - guint32 time_since_last_sr_packet; -struct __attribute__ ((packed)) ntptime { - guint32 integer; - guint32 frac; -struct __attribute__ ((packed)) rtcp_sender_report { - struct rtcp_common_header common; - guint32 sync_src_rtcp_sender; - struct ntptime ntp_timestamp; - guint32 rtp_timestamp; - guint32 num_packets_sent; - guint32 num_bytes_sent; - struct reception_block reception_blocks[1]; -struct __attribute__ ((packed)) rtcp_recv_report { -struct __attribute__ ((packed)) rtcp_sdes { - struct __attribute__ ((packed)) sdes_chunk { - guint32 identifier; /* sync source or contrib source */ - struct __attribute__ ((packed)) sdes_item { - enum - { END = 0, CNAME = 1, NAME = 2, EMAIL = 3, PHONE = 4, STREET_ADDRESS = - 5, TOOL = 6, NOTE = 7, PRIV = 8 - } type:8; - guint8 length; - gchar text[1]; - } items[1]; /* WARNING: Variable length struct. Do not use the array index for values other than 0 */ - } chunks[1]; /* Idem here */ -struct __attribute__ ((packed)) rtcp_bye { - guint32 identifier[1]; +struct rtcp_packet { + unsigned int num_sources; + rtcp_packet_type packet_type; + union { + struct rtcp_sender_report { + + } sr; + struct rtcp_recv_report {} rr; + struct rtcp_sdes {} sdes; + struct rtcp_bye {} bye; + struct rtcp_app {} app; + } u; -struct __attribute__ ((packed)) rtcp_app { - guint32 name; - char data[1]; +void parse_rtcp_packet(const char* data, unsigned int data_size, + unsigned int num_rtcp_packets struct rtcp_packet* packets, gboolean* error); #endif |
From: <ra...@fr...> - 2004-10-10 21:58:38
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sun Oct 10 2004 14:58:21 PDT Log message: rtp_packet.h, rtpdec.c: reverted changes of using array of chars instead of bitfields. Return to using bitfields. Modified files: rtpdec : Makefile rtp_packet.h rtpdec.c Removed files: rtpdec : rtp_packet.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/Makefile.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.c http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.h.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtpdec.c.diff?r1=1.13&r2=1.14 ====Begin Diffs==== Index: Makefile =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/Makefile,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- Makefile 9 Oct 2004 19:20:42 -0000 1.12 +++ Makefile 10 Oct 2004 21:58:09 -0000 1.13 @@ -1,12 +1,12 @@ CFLAGS=$(shell pkg-config --cflags gstreamer-0.8) -DGST_PACKAGE='"GStreamer"' -DGST_ORIGIN='"http://gstreamer.net"' -DVERSION='"0.0"' -DHAVE_USER_MTU -Wall -Wimplicit -Werror -g -gstrtpdec.la: gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo rtp_packet.lo address.lo gclist.lo +gstrtpdec.la: gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo address.lo gclist.lo libtool --mode=link gcc -module -avoid-version\ -rpath /home/ramon/projects/internet-radio/gstreamer/gst-sandbox/rtpdec \ -export-symbols-regex gst_plugin_desc \ -o gstrtpdec.la \ - gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo rtp_packet.lo address.lo gclist.lo \ + gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo address.lo gclist.lo \ $$(pkg-config --libs gstreamer-0.8) @@ -25,9 +25,6 @@ socket_fns.lo: socket_fns.c libtool --mode=compile gcc $(CFLAGS) -o socket_fns.lo -c socket_fns.c -rtp_packet.lo: rtp_packet.c - libtool --mode=compile gcc $(CFLAGS) -o rtp_packet.o -c rtp_packet.c - address.lo: address.c libtool --mode=compile gcc $(CFLAGS) -o address.o -c address.c --- rtp_packet.c DELETED --- Index: rtp_packet.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- rtp_packet.h 10 Oct 2004 11:26:59 -0000 1.9 +++ rtp_packet.h 10 Oct 2004 21:58:09 -0000 1.10 @@ -1,45 +1,134 @@ #ifndef __RTP_PACKET_H__ #define __RTP_PACKET_H__ 1 -#include <glib.h> -struct rtp_packet { - guint8 content[12]; +#if G_BYTE_ORDER == G_BIG_ENDIAN +struct __attribute__ ((packed)) rtp_packet { + unsigned int version:2; + unsigned int padding:1; + unsigned int extension:1; + unsigned int num_contrib_sources:4; + unsigned int mark:1; + unsigned int payload_type:7; + unsigned int sequence_number:16; + unsigned int timestamp:32; + unsigned int identifier:32; + unsigned int contrib_sources[1]; }; +#else +}; +#endif -struct rtp_packet_digested { - unsigned int padding; - unsigned int extension; - unsigned int mark; - unsigned int payload_type; - unsigned int sequence_number; - unsigned int timestamp; - unsigned int identifier; - const char* payload; - // We don't care about extensions and number of contrib sources for now +struct __attribute__ ((packed)) rtp_packet_extension { + guint16 tag; + guint16 length; -void rtp_packet_parse(const char* raw_packet, guint packet_size, struct rtp_packet_digested* digested_packet); typedef enum { SENDER_REPORT = 200, RECEIVER_REPORT = 201, SOURCE_DESCRIPTION = 202, BYE = 203, APP = 204 } rtcp_packet_type; -struct rtcp_packet { - unsigned int num_sources; - rtcp_packet_type packet_type; - union { - struct rtcp_sender_report { - - } sr; - struct rtcp_recv_report {} rr; - struct rtcp_sdes {} sdes; - struct rtcp_bye {} bye; - struct rtcp_app {} app; - } u; +struct __attribute__ ((packed)) rtcp_common_header { + unsigned int num_sources:5; + rtcp_packet_type packet_type:8; + unsigned int length:16; -void parse_rtcp_packet(const char* data, unsigned int data_size, - unsigned int num_rtcp_packets struct rtcp_packet* packets, gboolean* error); +struct __attribute__ ((packed)) reception_block { + guint32 identifier; + guint8 fraction_lost_last; + unsigned int cumul_packets_lost:24; + guint32 highest_sequence_number; + guint32 jitter; + guint32 last_ntp_timestamp_seen_sr; + guint32 time_since_last_sr_packet; + +struct __attribute__ ((packed)) ntptime { + guint32 integer; + guint32 frac; +struct __attribute__ ((packed)) rtcp_sender_report { + struct rtcp_common_header common; + guint32 sync_src_rtcp_sender; + struct ntptime ntp_timestamp; + guint32 rtp_timestamp; + guint32 num_packets_sent; + guint32 num_bytes_sent; + struct reception_block reception_blocks[1]; +struct __attribute__ ((packed)) rtcp_recv_report { +struct __attribute__ ((packed)) rtcp_sdes { + struct __attribute__ ((packed)) sdes_chunk { + guint32 identifier; /* sync source or contrib source */ + struct __attribute__ ((packed)) sdes_item { + enum + { END = 0, CNAME = 1, NAME = 2, EMAIL = 3, PHONE = 4, STREET_ADDRESS = + 5, TOOL = 6, NOTE = 7, PRIV = 8 + } type:8; + guint8 length; + gchar text[1]; + } items[1]; /* WARNING: Variable length struct. Do not use the array index for values other than 0 */ + } chunks[1]; /* Idem here */ +struct __attribute__ ((packed)) rtcp_bye { + guint32 identifier[1]; +struct __attribute__ ((packed)) rtcp_app { + guint32 name; + char data[1]; #endif Index: rtpdec.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtpdec.c,v retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- rtpdec.c 9 Oct 2004 19:20:42 -0000 1.13 +++ rtpdec.c 10 Oct 2004 21:58:09 -0000 1.14 @@ -390,20 +390,20 @@ return; } packet = (struct rtp_packet *) data; - if (rtp_packet_get_padding(packet) == 1) { + if (packet->padding == 1) { packet_size = ntohl (*(guint32 *) ((char *) packet + packet_size - sizeof (guint32))); payload_offset = - sizeof (struct rtp_packet) + (rtp_packet_get_num_contrib_sources(packet) - + sizeof (struct rtp_packet) + (packet->num_contrib_sources - 1) * sizeof (unsigned long); if (packet_size < payload_offset) { /* Invalid packet */ - if (rtp_packet_get_extension(packet) != 0) { + if (packet->extension) { struct rtp_packet_extension *extension = (struct rtp_packet_extension *) - ((char *) packet + rtp_packet_get_extension(packet)); + ((char *) packet + packet->extension); packet_size += sizeof (struct rtp_packet_extension) + ntohs (extension->length); @@ -411,7 +411,7 @@ - identifier = rtp_packet_get_identifier(packet); + identifier = ntohl (packet->identifier); sender_info = gst_rtpdec_get_sender_info (element, identifier, TRUE); /* Update statistics */ sender_info->total_packets_received++; @@ -424,13 +424,13 @@ /* Be careful with cycling numbers */ num_packets_lost = - rtp_packet_get_sequence_number(packet) - sender_info->last_sequence_number - + ntohs (packet->sequence_number) - sender_info->last_sequence_number - (guint16) 1; sender_info->total_packets_lost += num_packets_lost; sender_info->packets_lost += num_packets_lost; now = gst_clock_get_time (element->clock); - this_data_timestamp = rtp_packet_get_timestamp(packet); + this_data_timestamp = ntohl (packet->timestamp); if (sender_info->received_data) { GstClockTimeDiff time_diff; guint32 new_diff; @@ -448,7 +448,7 @@ sender_info->last_data_timestamp = this_data_timestamp; sender_info->time_last_data_packet_received = now; sender_info->received_data = TRUE; - sender_info->last_sequence_number = rtp_packet_get_sequence_number(packet); + sender_info->last_sequence_number = ntohs (packet->sequence_number); if (!sender_info->received_srvctl) { /* FIXME: For now we ignore data packets if we didn't receive a control packet because then we cannot know the correct timestamp. @@ -461,9 +461,9 @@ (&gst_rtpdec_src_template), g_strdup_printf ("src_%d", identifier)); gst_element_add_pad (GST_ELEMENT (element), sender_info->output); - if (sender_info->payload_type != rtp_packet_get_payload_type(packet)) { + if (sender_info->payload_type != packet->payload_type) { if (!gst_rtpdec_change_payload_type (element, sender_info, - rtp_packet_get_payload_type(packet))) { + packet->payload_type)) { /* We do not know how to handle this payload type. Exit */ return; } |
From: <ra...@fr...> - 2004-10-12 00:59:20
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Mon Oct 11 2004 17:59:06 PDT Log message: rtp_packet.h: After consulting other GStreamer developers, I decided that it was better not using bitfields. So we have an interface for digesting RTP packets into structures readable by C. rtp_packet.c: started RTP parser. Modified files: rtpdec : rtp_packet.c rtp_packet.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.h.diff?r1=1.10&r2=1.11 ====Begin Diffs==== Index: rtp_packet.c =================================================================== RCS file: rtp_packet.c diff -N rtp_packet.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ rtp_packet.c 12 Oct 2004 00:58:54 -0000 1.4 @@ -0,0 +1,216 @@ +#include "rtp_packet.h" + +/* Mask to select the n lowest bits of a number */ +/* For instance, get_low_bits_mask(3) returns the number 0000111 in binary */ +static inline guint8 get_low_bits_mask(guint8 n) +{ + return (1 << n) - 1; +} +/* Return bits, being first the lowest bit, and len the total number of bits, of the number x + Bits are numbered starting with 0 as the lowest. +*/ +static inline guint8 get_bits(guint8 x, guint8 first, guint8 len) + return (x >> first) & get_low_bits_mask(len); +/* Set bits, being num the lowest bit number, and len the total number of bits of the number x + to the value v */ +static inline void set_bits(guint8* x, guint8 first, guint8 len, guint8 val) + *x &= ~(get_low_bits_mask(len) << first); + *x |= (get_low_bits_mask(len) & val) << first; +static inline guint16 get_uint16(const guint8 x[2]) + return (((guint16)x[0]) << 8) + + (guint16)x[1]; +static inline void set_uint16(guint8 x[2], guint16 v) + x[0] = (guint8) (v >> 8); + x[1] = (guint8) v; +static inline guint32 get_uint32(const guint8 x[4]) + return (((guint32) x[0]) << 24) + + (((guint32) x[1]) << 16) + + (((guint32) x[2]) << 8) + + (guint32) x[3]; +static inline void set_uint32(guint8 x[4], guint32 v) + x[0] = (guint8) (v >> 24); + x[1] = (guint8) (v >> 16); + x[2] = (guint8) (v >> 8); + x[3] = (guint8) v; +/* +struct rtp_packet { + unsigned int version:2; + unsigned int padding:1; + unsigned int extension:1; + unsigned int num_contrib_sources:4; + unsigned int mark:1; + unsigned int payload_type:7; + unsigned int sequence_number:16; + unsigned int timestamp:32; + unsigned int identifier:32; + unsigned int contrib_sources[1]; +}; +struct __attribute__ ((packed)) rtcp_common_header { + unsigned int num_sources:5; + rtcp_packet_type packet_type:8; + unsigned int length:16; +struct __attribute__ ((packed)) reception_block { + guint32 identifier; + guint8 fraction_lost_last; + unsigned int cumul_packets_lost:24; + guint32 highest_sequence_number; + guint32 jitter; + guint32 last_ntp_timestamp_seen_sr; + guint32 time_since_last_sr_packet; +struct __attribute__ ((packed)) ntptime { + guint32 integer; + guint32 frac; +struct __attribute__ ((packed)) rtcp_sender_report { + struct rtcp_common_header common; + guint32 sync_src_rtcp_sender; + struct ntptime ntp_timestamp; + guint32 rtp_timestamp; + guint32 num_packets_sent; + guint32 num_bytes_sent; + struct reception_block reception_blocks[1]; +struct __attribute__ ((packed)) rtcp_recv_report { +struct __attribute__ ((packed)) rtcp_sdes { + struct __attribute__ ((packed)) sdes_chunk { + guint32 identifier; // sync source or contrib source + struct __attribute__ ((packed)) sdes_item { + enum + { END = 0, CNAME = 1, NAME = 2, EMAIL = 3, PHONE = 4, STREET_ADDRESS = + 5, TOOL = 6, NOTE = 7, PRIV = 8 + } type:8; + guint8 length; + gchar text[1]; + } items[1]; // WARNING: Variable length struct. Do not use the array index for values other than 0 + } chunks[1]; // Idem here +struct __attribute__ ((packed)) rtcp_bye { + guint32 identifier[1]; +struct __attribute__ ((packed)) rtcp_app { + guint32 name; + char data[1]; +/* + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | sequence number | + | timestamp | + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | .... | +void +rtp_packet_parse(const char* raw_packet, guint packet_size, struct rtp_packet_digested* digested_packet, gboolean* error) + guint8 version; + guint8 num_contrib_sources; + guint rtp_header_size; + if (packet_size < 12) { + *error = TRUE; + return; + } + version = get_bits(raw_packet[0], 6, 2); + if (version != 2) { + digested_packet->padding = get_bits(raw_packet[0], 5, 1) != 0; + digested_packet->extension = get_bits(raw_packet[0], 4, 1) != 0; + num_contrib_sources = get_bits(raw_packet[0], 0, 4); + digested_packet->mark = get_bits(raw_packet[1], 7, 1); + digested_packet->payload_type = get_bits(raw_packet[1], 0, 7); + digested_packet->sequence_number = get_uint16(&raw_packet[2]); + digested_packet->timestamp = get_uint32(&raw_packet[4]); + digested_packet->identifier = get_uint32(&raw_packet[8]); + rtp_header_size = 9 + 4*num_contrib_sources; + if (packet_size < rtp_header_size) { + if (digested_packet->extension) { + guint16 extension_size; + rtp_header_size += 4; + if (packet_size < rtp_header_size) { + *error = TRUE; + return; + } + extension_size = get_uint16(&raw_packet[9 + 4*num_contrib_sources + 2]); + rtp_header_size += extension_size; + digested_packet->payload = &raw_packet[rtp_header_size]; +rtcp_packet_parse(const char* data, unsigned int data_size, + struct rtcp_packet_digested* packet, unsigned int packet_size, gboolean* error) + +void +rtcp_packet_free(struct rtcp_packet_digested* packet) +void rtcp_packet_make(const struct rtcp_packet_digested* packet, + char* data, + unsigned int* packet_size) Index: rtp_packet.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- rtp_packet.h 10 Oct 2004 21:58:09 -0000 1.10 +++ rtp_packet.h 12 Oct 2004 00:58:54 -0000 1.11 @@ -1,134 +1,101 @@ #ifndef __RTP_PACKET_H__ #define __RTP_PACKET_H__ 1 +#include <glib.h> -#if G_BYTE_ORDER == G_BIG_ENDIAN -struct __attribute__ ((packed)) rtp_packet { - unsigned int version:2; - unsigned int padding:1; - unsigned int extension:1; - unsigned int num_contrib_sources:4; - unsigned int mark:1; - unsigned int payload_type:7; - unsigned int sequence_number:16; - unsigned int timestamp:32; - unsigned int identifier:32; - unsigned int contrib_sources[1]; -}; -#else -#endif - -struct __attribute__ ((packed)) rtp_packet_extension { - guint16 tag; - guint16 length; +struct rtp_packet_digested { + gboolean padding; + gboolean extension; + gboolean mark; + guint8 payload_type; + guint16 sequence_number; + guint32 timestamp; + const char* payload; + // We don't care about extensions and number of contrib sources for now }; +void rtp_packet_parse(const char* raw_packet, guint packet_size, + struct rtp_packet_digested* digested_packet, gboolean *error); typedef enum { SENDER_REPORT = 200, RECEIVER_REPORT = 201, SOURCE_DESCRIPTION = 202, BYE = 203, APP = 204 } rtcp_packet_type; -struct __attribute__ ((packed)) rtcp_common_header { - unsigned int num_sources:5; - rtcp_packet_type packet_type:8; - unsigned int length:16; -struct __attribute__ ((packed)) reception_block { - guint32 identifier; - guint8 fraction_lost_last; - unsigned int cumul_packets_lost:24; - guint32 highest_sequence_number; - guint32 jitter; - guint32 last_ntp_timestamp_seen_sr; - guint32 time_since_last_sr_packet; +struct rtcp_reception_block { guint32 identifier; guint8 fraction_lost_last; + guint32 cumul_packets_lost; guint32 highest_sequence_number; guint32 jitter; guint32 last_ntp_timestamp_seen_sr; guint32 time_since_last_sr_packet; -struct __attribute__ ((packed)) ntptime { +struct ntptime { guint32 integer; guint32 frac; -struct __attribute__ ((packed)) rtcp_sender_report { - struct rtcp_common_header common; +struct rtcp_sender_report { guint32 sync_src_rtcp_sender; struct ntptime ntp_timestamp; guint32 rtp_timestamp; guint32 num_packets_sent; guint32 num_bytes_sent; - struct reception_block reception_blocks[1]; + struct rtcp_reception_block reception_blocks[1]; -struct __attribute__ ((packed)) rtcp_recv_report { +struct rtcp_recv_report { -struct __attribute__ ((packed)) rtcp_sdes { - struct __attribute__ ((packed)) sdes_chunk { - guint32 identifier; /* sync source or contrib source */ - struct __attribute__ ((packed)) sdes_item { +struct rtcp_sdes { + struct sdes_chunk { + guint32 identifier; // sync source or contrib source + struct sdes_item { enum { END = 0, CNAME = 1, NAME = 2, EMAIL = 3, PHONE = 4, STREET_ADDRESS = 5, TOOL = 6, NOTE = 7, PRIV = 8 - } type:8; - guint8 length; - gchar text[1]; - } items[1]; /* WARNING: Variable length struct. Do not use the array index for values other than 0 */ - } chunks[1]; /* Idem here */ + } type; + GString* text; + } *items; + } *chunks; -struct __attribute__ ((packed)) rtcp_bye { - guint32 identifier[1]; +struct rtcp_bye { + guint32* identifiers; -struct __attribute__ ((packed)) rtcp_app { +struct rtcp_app { guint32 name; - char data[1]; + guint16 length; + char* data; +struct rtcp_packet_digested { + unsigned int num_sources; + rtcp_packet_type packet_type; + union { + struct rtcp_sender_report sr; + struct rtcp_recv_report rr; + struct rtcp_sdes sdes; + struct rtcp_bye bye; + struct rtcp_app app; + } u; +void rtcp_packet_parse(const char* data, unsigned int data_size, + struct rtcp_packet_digested* packet, unsigned int packet_size, gboolean* error); +void rtcp_packet_free(struct rtcp_packet_digested* packet); + unsigned int* packet_size); #endif |
From: <ra...@fr...> - 2004-10-16 02:02:08
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Fri Oct 15 2004 19:02:04 PDT Log message: rtp_packet.h: fix interface design mistakes. use pointers in structures for denoting fields that are arrays with variable number of elements. rtp_packet.c: continue implementation of rtp packet parsing. Modified files: rtpdec : Makefile rtp_packet.c rtp_packet.h todo Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/Makefile.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.c.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.h.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/todo.diff?r1=1.9&r2=1.10 ====Begin Diffs==== Index: Makefile =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/Makefile,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- Makefile 10 Oct 2004 21:58:09 -0000 1.13 +++ Makefile 16 Oct 2004 02:01:52 -0000 1.14 @@ -1,7 +1,7 @@ CFLAGS=$(shell pkg-config --cflags gstreamer-0.8) -DGST_PACKAGE='"GStreamer"' -DGST_ORIGIN='"http://gstreamer.net"' -DVERSION='"0.0"' -DHAVE_USER_MTU -Wall -Wimplicit -Werror -g -gstrtpdec.la: gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo address.lo gclist.lo +gstrtpdec.la: gstrtpdec.lo rtpdec.lo gstrtphandler.lo rtp_report.lo socket_fns.lo rtp_packet.lo address.lo gclist.lo libtool --mode=link gcc -module -avoid-version\ -rpath /home/ramon/projects/internet-radio/gstreamer/gst-sandbox/rtpdec \ -export-symbols-regex gst_plugin_desc \ @@ -25,6 +25,9 @@ socket_fns.lo: socket_fns.c libtool --mode=compile gcc $(CFLAGS) -o socket_fns.lo -c socket_fns.c +rtp_packet.lo: rtp_packet.c + libtool --mode=compile gcc $(CFLAGS) -o rtp_packet.o -c rtp_packet.c + address.lo: address.c libtool --mode=compile gcc $(CFLAGS) -o address.o -c address.c Index: rtp_packet.c RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- rtp_packet.c 12 Oct 2004 00:58:54 -0000 1.4 +++ rtp_packet.c 16 Oct 2004 02:01:52 -0000 1.5 @@ -136,6 +136,9 @@ */ +static void rtcp_parse_reception_block(const char data[6], struct rtcp_reception_block* rtcp_reception_block); /* 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 @@ -197,11 +200,75 @@ digested_packet->payload = &raw_packet[rtp_header_size]; } void rtcp_packet_parse(const char* data, unsigned int data_size, - struct rtcp_packet_digested* packet, unsigned int packet_size, gboolean* error) + struct rtcp_packet_digested* packet, unsigned int* packet_size, gboolean* error) { - + gboolean padding; + *error = FALSE; + if (data_size < 4) { + *error = TRUE; + packet->packet_type = 0; + return; + } + if (get_bits(data[0], 6, 2) != 2) { /* version */ + padding = get_bits(data[0], 5, 1); + packet->num_sources = get_bits(data[0], 0, 5); + packet->packet_type = data[1]; + *packet_size = (get_uint16(&data[2]) + 1)*4; + if (data_size < *packet_size) { + switch(packet->packet_type) { + unsigned int num_src; + case SENDER_REPORT: + if (*packet_size < 4*(7 + packet->num_sources*6)) { + *error = TRUE; + packet->packet_type = 0; + return; + } + packet->u.sr.sync_src_rtcp_sender = get_uint32(&data[4]); + packet->u.sr.ntp_timestamp.integer = get_uint32(&data[8]); + packet->u.sr.ntp_timestamp.frac = get_uint32(&data[12]); + packet->u.sr.rtp_timestamp = get_uint32(&data[16]); + packet->u.sr.num_packets_sent = get_uint32(&data[20]); + packet->u.sr.num_bytes_sent = get_uint32(&data[24]); + packet->u.sr.reception_blocks = g_new(struct rtcp_reception_block, packet->num_sources); + for (num_src = 0; num_src < packet->num_sources; num_src++) { + rtcp_parse_reception_block(data + 7*4 + 6*4*num_src, &packet->u.sr.reception_blocks[num_src]); + break; + case RECEIVER_REPORT: + if (*packet_size < 4*(2 + packet->num_sources*6)) { + packet->u.rr.sync_src_rtcp_sender = get_uint32(&data[4]); + packet->u.rr.reception_blocks = g_new(struct rtcp_reception_block, packet->num_sources); + rtcp_parse_reception_block(data + 2*4 + 6*4*num_src, &packet->u.rr.reception_blocks[num_src]); + case SOURCE_DESCRIPTION: + + case BYE: + case APP: + default: void @@ -209,8 +276,22 @@ -void rtcp_packet_make(const struct rtcp_packet_digested* packet, +void +rtcp_packet_make(const struct rtcp_packet_digested* packet, char* data, unsigned int* packet_size) +static void +rtcp_parse_reception_block(const char data[6*4], struct rtcp_reception_block* rtcp_reception_block) +{ + rtcp_reception_block->identifier = get_uint32(&data[0]); + rtcp_reception_block->fraction_lost_last = data[4]; + rtcp_reception_block->cumul_packets_lost = data[5]*(1 << 16) + get_uint16(&data[6]); + rtcp_reception_block->highest_sequence_number = get_uint32(&data[8]); + rtcp_reception_block->jitter = get_uint32(&data[12]); + rtcp_reception_block->last_ntp_timestamp_seen_sr = get_uint32(&data[16]); + rtcp_reception_block->time_since_last_sr_packet = get_uint32(&data[20]); +} Index: rtp_packet.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- rtp_packet.h 12 Oct 2004 00:58:54 -0000 1.11 +++ rtp_packet.h 16 Oct 2004 02:01:52 -0000 1.12 @@ -45,12 +45,12 @@ guint32 rtp_timestamp; guint32 num_packets_sent; guint32 num_bytes_sent; - struct rtcp_reception_block reception_blocks[1]; + struct rtcp_reception_block* reception_blocks; }; struct rtcp_recv_report { guint32 sync_src_rtcp_sender; struct rtcp_sdes { @@ -90,7 +90,7 @@ void rtcp_packet_parse(const char* data, unsigned int data_size, - struct rtcp_packet_digested* packet, unsigned int packet_size, gboolean* error); + struct rtcp_packet_digested* packet, unsigned int* packet_size, gboolean* error); void rtcp_packet_free(struct rtcp_packet_digested* packet); Index: todo RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/todo,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- todo 25 Sep 2004 22:59:02 -0000 1.9 +++ todo 16 Oct 2004 02:01:52 -0000 1.10 @@ -2,10 +2,6 @@ complete the test -rtp_packet: do not use bitfields. Instead, implement functions for accessing -different fields. Bitfields are not portable (differences between big and -little endian), and handling endianess is error prone. - Improve synchonization. Syncrhonization shall be implemented as: - After creating a new output pad, generate the discontinous event; |
From: <ra...@fr...> - 2004-10-16 13:33:06
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sat Oct 16 2004 06:33:05 PDT Log message: Continued RTCP parsing. Modified files: rtpdec : rtp_packet.c rtp_packet.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.c.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.h.diff?r1=1.12&r2=1.13 ====Begin Diffs==== Index: rtp_packet.c =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- rtp_packet.c 16 Oct 2004 02:01:52 -0000 1.5 +++ rtp_packet.c 16 Oct 2004 13:32:53 -0000 1.6 @@ -139,6 +139,11 @@ static void rtcp_parse_reception_block(const char data[6], struct rtcp_reception_block* rtcp_reception_block); +static void rtcp_sdes_packet_parse(struct rtcp_packet_digested* packet, const char* data, guint packet_size, gboolean* error); + +static void rtcp_sdes_packet_free(struct rtcp_packet_digested* packet); /* 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 @@ -258,7 +263,7 @@ } break; case SOURCE_DESCRIPTION: - + rtcp_sdes_packet_parse(packet, data, *packet_size, error); case BYE: @@ -271,9 +276,113 @@ } } +static void +rtcp_sdes_packet_parse(struct rtcp_packet_digested* packet, const char* data, guint packet_size, gboolean* error) +{ + unsigned int remaining_length = packet_size - 4; + const char* next_data = data + 4; + unsigned int num_chunk; + packet->u.sdes.chunks = g_new0(struct sdes_chunk, packet->num_sources); + for (num_chunk = 0; num_chunk < packet->num_sources; num_chunk++) { + struct sdes_chunk* sdes_chunk = &packet->u.sdes.chunks[num_chunk]; + if (remaining_length < 4) { + g_free(packet->u.rr.reception_blocks); + packet->packet_type = 0; + *error = TRUE; + return; + } + sdes_chunk->identifier = get_uint32(next_data); + remaining_length -= 4; + next_data += 4; + { + guint8 item_identifier; + guint8 item_length; + struct sdes_item** pointer_to_this; + struct sdes_item* this; + pointer_to_this = &sdes_chunk->items; + while(1) { + if (remaining_length < 1) { + *pointer_to_this = NULL; + rtcp_packet_free(packet); + packet->packet_type = 0; + *error = TRUE; + return; + } + item_identifier = *next_data; + next_data++; + remaining_length -= 1; + if (item_identifier == 0) { + break; + item_length = *next_data; + if (remaining_length < item_length) { + this = g_new(struct sdes_item, 1); + this->type = item_identifier; + this->text = g_string_new_len(next_data, item_length); + *pointer_to_this = this; + pointer_to_this = &this->next_item; + next_data += item_length; + remaining_length -= item_length; + } + next_data += (remaining_length/4)*4 - remaining_length; + remaining_length = (remaining_length/4)*4; + } +} void rtcp_packet_free(struct rtcp_packet_digested* packet) { + switch (packet->packet_type) { + case SENDER_REPORT: + g_free(packet->u.sr.reception_blocks); + break; + case RECEIVER_REPORT: + g_free(packet->u.rr.reception_blocks); + case SOURCE_DESCRIPTION: + rtcp_sdes_packet_free(packet); + case BYE: + case APP: +rtcp_sdes_packet_free(struct rtcp_packet_digested* packet) + unsigned int num_chunks, num_chunk; + g_assert(packet->packet_type == SOURCE_DESCRIPTION); + num_chunks = packet->num_sources; + for (num_chunk = 0; num_chunk < num_chunks; num_chunk++) { + struct sdes_item* item = sdes_chunk->items; + while (item != NULL) { + struct sdes_item* next; + g_string_free(item->text, TRUE); + next = item->next_item; + g_free(item); + item = next; + g_free(packet->u.sdes.chunks); void @@ -281,6 +390,7 @@ char* data, unsigned int* packet_size) + Index: rtp_packet.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- rtp_packet.h 16 Oct 2004 02:01:52 -0000 1.12 +++ rtp_packet.h 16 Oct 2004 13:32:53 -0000 1.13 @@ -62,6 +62,7 @@ 5, TOOL = 6, NOTE = 7, PRIV = 8 } type; GString* text; + struct sdes_item* next_item; } *items; } *chunks; }; |
From: <ra...@fr...> - 2004-10-16 14:10:48
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sat Oct 16 2004 07:10:47 PDT Log message: rtp_packet.c: small bits for freeing packets. rtp_packet.h: some small bits concerting app. Modified files: rtpdec : rtp_packet.c rtp_packet.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.c.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.h.diff?r1=1.13&r2=1.14 ====Begin Diffs==== Index: rtp_packet.c =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- rtp_packet.c 16 Oct 2004 13:32:53 -0000 1.6 +++ rtp_packet.c 16 Oct 2004 14:10:35 -0000 1.7 @@ -359,8 +359,10 @@ rtcp_sdes_packet_free(packet); break; case BYE: + g_free(packet->u.bye.identifiers); case APP: + g_free(packet->u.app.data); } } Index: rtp_packet.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- rtp_packet.h 16 Oct 2004 13:32:53 -0000 1.13 +++ rtp_packet.h 16 Oct 2004 14:10:35 -0000 1.14 @@ -72,6 +72,7 @@ }; struct rtcp_app { + guint8 type; guint32 identifier; guint32 name; guint16 length; |
From: <ra...@fr...> - 2004-10-17 00:14:32
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sat Oct 16 2004 17:14:29 PDT Log message: rtp_packet.c: More bits for parsing RTCP headers. rtp_packet.h: Fixes for APP. Modified files: rtpdec : rtp_packet.c rtp_packet.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.c.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.h.diff?r1=1.14&r2=1.15 ====Begin Diffs==== Index: rtp_packet.c =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- rtp_packet.c 16 Oct 2004 14:10:35 -0000 1.7 +++ rtp_packet.c 17 Oct 2004 00:14:17 -0000 1.8 @@ -1,3 +1,5 @@ +#include <string.h> + #include "rtp_packet.h" /* Mask to select the n lowest bits of a number */ @@ -266,8 +268,29 @@ rtcp_sdes_packet_parse(packet, data, *packet_size, error); break; case BYE: + if (*packet_size < 4*(packet->num_sources + 1)) { + *error = TRUE; + packet->packet_type = 0; + return; + } + packet->u.bye.identifiers = g_new(guint32, packet->num_sources); + for (num_src = 0; num_src < packet->num_sources; num_src ++) { + packet->u.bye.identifiers[num_src] = get_uint32(&data[4*(num_src + 1)]); case APP: + if (*packet_size < 4*3) { + packet->u.app.type = packet->num_sources; + packet->num_sources = 1; + packet->u.app.identifier = get_uint32(&data[4]); + memcpy(packet->u.app.name, &data[8], 4); + packet->u.app.length = *packet_size - 12; + packet->u.app.data = g_new(char, packet->u.app.length); + memcpy(packet->u.app.data, &data[12], packet->u.app.length); default: *error = TRUE; Index: rtp_packet.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- rtp_packet.h 16 Oct 2004 14:10:35 -0000 1.14 +++ rtp_packet.h 17 Oct 2004 00:14:17 -0000 1.15 @@ -74,7 +74,7 @@ struct rtcp_app { guint8 type; guint32 identifier; - guint32 name; + char name[4]; guint16 length; char* data; }; |
From: <ra...@fr...> - 2004-10-17 13:02:30
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sun Oct 17 2004 06:02:29 PDT Log message: Partial implementation of rtcp packet building. Modified files: rtpdec : rtp_packet.c rtp_packet.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.h.diff?r1=1.15&r2=1.16 ====Begin Diffs==== Index: rtp_packet.c =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- rtp_packet.c 17 Oct 2004 00:14:17 -0000 1.8 +++ rtp_packet.c 17 Oct 2004 13:02:17 -0000 1.9 @@ -145,6 +145,16 @@ static void rtcp_sdes_packet_free(struct rtcp_packet_digested* packet); +static void rtcp_sr_packet_make(const struct rtcp_packet_digested* packet, const char* data); + +static void rtcp_rr_packet_make(const struct rtcp_packet_digested* packet, const char* data); +static void rtcp_sdes_packet_make(const struct rtcp_packet_digested* packet, const char* data); +static void rtcp_app_packet_make(const struct rtcp_packet_digested* packet, const char* data); +static void rtcp_bye_packet_make(const struct rtcp_packet_digested* packet, const char* data); /* 0 1 2 3 @@ -208,6 +218,8 @@ } void rtcp_packet_parse(const char* data, unsigned int data_size, struct rtcp_packet_digested* packet, unsigned int* packet_size, gboolean* error) @@ -299,6 +311,20 @@ } +static void +rtcp_parse_reception_block(const char data[6*4], struct rtcp_reception_block* rtcp_reception_block) +{ + rtcp_reception_block->identifier = get_uint32(&data[0]); + rtcp_reception_block->fraction_lost_last = data[4]; + rtcp_reception_block->cumul_packets_lost = data[5]*(1 << 16) + get_uint16(&data[6]); + rtcp_reception_block->highest_sequence_number = get_uint32(&data[8]); + rtcp_reception_block->jitter = get_uint32(&data[12]); + rtcp_reception_block->last_ntp_timestamp_seen_sr = get_uint32(&data[16]); + rtcp_reception_block->time_since_last_sr_packet = get_uint32(&data[20]); +} static void rtcp_sdes_packet_parse(struct rtcp_packet_digested* packet, const char* data, guint packet_size, gboolean* error) { @@ -410,23 +436,107 @@ g_free(packet->u.sdes.chunks); +/* Common RTCP header + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +header |V=2|P| RC | PT=SR=200 | length | +*/ rtcp_packet_make(const struct rtcp_packet_digested* packet, char* data, + unsigned int buffer_size, unsigned int* packet_size) - + unsigned int packet_length_longs; + g_assert(buffer_size >= 4); + set_bits(&data[0], 6, 2, 2); + set_bits(&data[0], 5, 1, 0); /* no padding */ + if (packet->packet_type != SOURCE_DESCRIPTION) { + set_bits(&data[0], 0, 5, packet->num_sources); + } + data[1] = packet->packet_type; + switch (packet->packet_type) { + case SENDER_REPORT: + packet_length_longs = 7 + 6*packet->num_sources; + break; + case RECEIVER_REPORT: + packet_length_longs = 2 + 6*packet->num_sources; + case SOURCE_DESCRIPTION: + { + unsigned int num_src; + unsigned int packet_length_bytes; + packet_length_bytes = 4; + for (num_src = 0; num_src < packet->num_sources; num_src ++) { + struct sdes_chunk* sdes_chunk = &packet->u.sdes.chunks[num_src]; + struct sdes_item* sdes_item = sdes_chunk->items; + packet_length_bytes += 4; + while (sdes_item) { + packet_length_bytes += sdes_item->text->len + 1; + sdes_item = sdes_item->next_item; + } + packet_length_bytes++; /* final end item */ + } + packet_length_longs = packet_length_bytes/4; + } + case APP: + packet_length_longs = 3 + packet->u.app.length; + case BYE: + packet_length_longs = 1 + packet->num_sources; + default: + g_assert_not_reached(); + g_assert(buffer_size >= 4*packet_length_longs); + *packet_size = 4*packet_length_longs; + set_uint16(&data[2], packet_length_longs - 1); + rtcp_sr_packet_make(packet, data); + rtcp_rr_packet_make(packet, data); + rtcp_sdes_packet_make(packet, data); + rtcp_app_packet_make(packet, data); + rtcp_bye_packet_make(packet, data); +static void +rtcp_sr_packet_make(const struct rtcp_packet_digested* packet, const char* data) -static void -rtcp_parse_reception_block(const char data[6*4], struct rtcp_reception_block* rtcp_reception_block) +rtcp_rr_packet_make(const struct rtcp_packet_digested* packet, const char* data) - rtcp_reception_block->identifier = get_uint32(&data[0]); - rtcp_reception_block->fraction_lost_last = data[4]; - rtcp_reception_block->cumul_packets_lost = data[5]*(1 << 16) + get_uint16(&data[6]); - rtcp_reception_block->highest_sequence_number = get_uint32(&data[8]); - rtcp_reception_block->jitter = get_uint32(&data[12]); - rtcp_reception_block->last_ntp_timestamp_seen_sr = get_uint32(&data[16]); - rtcp_reception_block->time_since_last_sr_packet = get_uint32(&data[20]); +rtcp_sdes_packet_make(const struct rtcp_packet_digested* packet, const char* data) +rtcp_app_packet_make(const struct rtcp_packet_digested* packet, const char* data) +rtcp_bye_packet_make(const struct rtcp_packet_digested* packet, const char* data) Index: rtp_packet.h RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.h,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- rtp_packet.h 17 Oct 2004 00:14:17 -0000 1.15 +++ rtp_packet.h 17 Oct 2004 13:02:17 -0000 1.16 @@ -98,6 +98,7 @@ void rtcp_packet_make(const struct rtcp_packet_digested* packet, unsigned int* packet_size); #endif |
From: <ra...@fr...> - 2004-10-23 16:41:41
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Sat Oct 23 2004 09:41:38 PDT Log message: rtp_packet.c: completed implementation of RTCP packet building. Modified files: rtpdec : rtp_packet.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/rtp_packet.c.diff?r1=1.9&r2=1.10 ====Begin Diffs==== Index: rtp_packet.c =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/rtpdec/rtp_packet.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- rtp_packet.c 17 Oct 2004 13:02:17 -0000 1.9 +++ rtp_packet.c 23 Oct 2004 16:41:26 -0000 1.10 @@ -145,15 +145,17 @@ static void rtcp_sdes_packet_free(struct rtcp_packet_digested* packet); -static void rtcp_sr_packet_make(const struct rtcp_packet_digested* packet, const char* data); +static void rtcp_sr_packet_make(const struct rtcp_packet_digested* packet, char* data); -static void rtcp_rr_packet_make(const struct rtcp_packet_digested* packet, const char* data); +static void rtcp_rr_packet_make(const struct rtcp_packet_digested* packet, char* data); -static void rtcp_sdes_packet_make(const struct rtcp_packet_digested* packet, const char* data); +static void rtcp_recp_block_make(const struct rtcp_reception_block* reception_block, char* data); -static void rtcp_app_packet_make(const struct rtcp_packet_digested* packet, const char* data); +static void rtcp_sdes_packet_make(const struct rtcp_packet_digested* packet, char* data); -static void rtcp_bye_packet_make(const struct rtcp_packet_digested* packet, const char* data); +static void rtcp_app_packet_make(const struct rtcp_packet_digested* packet, char* data); + +static void rtcp_bye_packet_make(const struct rtcp_packet_digested* packet, char* data); /* @@ -455,7 +457,7 @@ g_assert(buffer_size >= 4); set_bits(&data[0], 6, 2, 2); set_bits(&data[0], 5, 1, 0); /* no padding */ - if (packet->packet_type != SOURCE_DESCRIPTION) { + if (packet->packet_type != APP) { set_bits(&data[0], 0, 5, packet->num_sources); } data[1] = packet->packet_type; @@ -516,27 +518,94 @@ } static void -rtcp_sr_packet_make(const struct rtcp_packet_digested* packet, const char* data) +rtcp_sr_packet_make(const struct rtcp_packet_digested* packet, char* data) { + unsigned int num_src; + set_uint32(&data[4], packet->u.sr.sync_src_rtcp_sender); + set_uint32(&data[8], packet->u.sr.ntp_timestamp.integer); + set_uint32(&data[12], packet->u.sr.ntp_timestamp.frac); + set_uint32(&data[16], packet->u.sr.rtp_timestamp); + set_uint32(&data[20], packet->u.sr.num_packets_sent); + set_uint32(&data[24], packet->u.sr.num_bytes_sent); + for (num_src = 0; num_src < packet->num_sources; num_src++) { + char* recp_block_data = data + 28 + num_src*24; + rtcp_recp_block_make(&packet->u.sr.reception_blocks[num_src], recp_block_data); + } -rtcp_rr_packet_make(const struct rtcp_packet_digested* packet, const char* data) +rtcp_rr_packet_make(const struct rtcp_packet_digested* packet, char* data) + set_uint32(&data[4], packet->u.rr.sync_src_rtcp_sender); + char* recp_block_data = data + 8 + num_src*24; + rtcp_recp_block_make(&packet->u.rr.reception_blocks[num_src], recp_block_data); -rtcp_sdes_packet_make(const struct rtcp_packet_digested* packet, const char* data) +rtcp_recp_block_make(const struct rtcp_reception_block* reception_block, char* data) + set_uint32(&data[0], reception_block->identifier); + data[4] = reception_block->fraction_lost_last; + data[5] = (unsigned char) (reception_block->cumul_packets_lost >> 16); + set_uint16(&data[6], (guint16) reception_block->cumul_packets_lost); + set_uint32(&data[8], reception_block->highest_sequence_number); + set_uint32(&data[12], reception_block->jitter); + set_uint32(&data[20], reception_block->last_ntp_timestamp_seen_sr); + set_uint32(&data[24], reception_block->time_since_last_sr_packet); -rtcp_app_packet_make(const struct rtcp_packet_digested* packet, const char* data) +rtcp_sdes_packet_make(const struct rtcp_packet_digested* packet, char* data) + char* my_data; + my_data = &data[4]; + for (num_src = 0 ; num_src < packet->num_sources; num_src++) { + struct sdes_chunk* chunk = &packet->u.sdes.chunks[num_src]; + struct sdes_item* item = chunk->items; + set_uint32(my_data, chunk->identifier); + my_data += 4; + while(item) { + my_data[0] = item->type; + g_assert(item->text->len > 256); + my_data[1] = item->text->len; + memcpy(&my_data[2], item->text->str, item->text->len); + item = item->next_item; + my_data += 2 + item->text->len; + } + *my_data = 0; + my_data++; + { + unsigned int chunk_end_offset = my_data - data; + if ((chunk_end_offset % 8) != 0) { + unsigned int r = 8 - (chunk_end_offset % 8); + memset(my_data, '\0', r); + my_data += r; + } -rtcp_bye_packet_make(const struct rtcp_packet_digested* packet, const char* data) +rtcp_app_packet_make(const struct rtcp_packet_digested* packet, char* data) +{ + set_bits(&data[0], 0, 5, packet->u.app.type); + set_uint32(&data[4], packet->u.app.identifier); + memcpy(&data[8], packet->u.app.name, 4); + memcpy(&data[12], packet->u.app.data, packet->u.app.length); + +} +static void +rtcp_bye_packet_make(const struct rtcp_packet_digested* packet, char* data) + for(num_src = 0; num_src < packet->num_sources; num_src++) { + set_uint32(&data[4*num_src + 4], packet->u.bye.identifiers[num_src]); |
From: <ra...@fr...> - 2004-11-22 16:14:19
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ramon Date: Mon Nov 22 2004 17:14:29 CET Log message: gstrtppayload.h: new file for the payload description. Added files: rtpdec : gstrtppayload.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/rtpdec/gstrtppayload.h?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== --- NEW FILE: gstrtppayload.h --- #ifndef GSTRTPPAYLOAD_H #define GSTRTPPAYLOAD_H /* Descriptor of a particular payload type */ struct GstRtpdecPayloadDesc_ { GString* name; GstStructure* contained_type; }; typedef struct GstRtpdecPayloadDesc_ GstRtpdecPayloadDesc; #endif |