2 Librtp - a library for the RTP/RTCP protocol
3 Copyright (C) 2000 Roland Dreier
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 #include <sys/types.h>
30 #include <netinet/in.h>
33 #include "rtp-packet.h"
36 rtp_packet_new_take_data(gpointer data, guint data_len)
40 //g_return_val_if_fail(data_len < RTP_MTU, NULL);
42 packet = g_malloc(sizeof *packet);
44 packet -> data = data;
45 packet -> data_len = data_len;
51 rtp_packet_new_copy_data(gpointer data, guint data_len)
55 //g_return_val_if_fail(data_len < RTP_MTU, NULL);
57 packet = g_malloc(sizeof *packet);
59 packet -> data = g_memdup(data, data_len);
60 packet -> data_len = data_len;
66 rtp_packet_new_allocate(guint payload_len, guint pad_len, guint csrc_count)
71 g_return_val_if_fail(csrc_count <= 15, NULL);
74 + csrc_count * sizeof(guint32)
75 + payload_len + pad_len;
77 //g_return_val_if_fail(len < RTP_MTU, NULL);
79 packet = g_malloc(sizeof *packet);
81 packet -> data_len = len;
82 packet -> data = g_malloc(len);
89 rtp_packet_free(Rtp_Packet packet)
91 g_return_if_fail(packet != NULL);
93 g_free(packet -> data);
98 rtp_packet_read(int fd, struct sockaddr *fromaddr, socklen_t *fromlen)
103 buf = g_malloc(RTP_MTU);
105 packlen = recvfrom(fd, buf, RTP_MTU, 0, fromaddr, fromlen);
108 g_error("rtp_packet_read: recvfrom: %d %s", errno, strerror(errno));
113 return rtp_packet_new_take_data(buf, packlen);
117 rtp_packet_send(Rtp_Packet packet, int fd, struct sockaddr *toaddr, socklen_t tolen)
119 g_return_if_fail(packet != NULL);
121 sendto(fd, (void *) packet -> data,
122 packet -> data_len, 0,
127 rtp_packet_get_version(Rtp_Packet packet)
129 g_return_val_if_fail(packet != NULL, 0);
131 return ((Rtp_Header) packet -> data) -> version;
135 rtp_packet_set_version(Rtp_Packet packet, guint8 version)
137 g_return_if_fail(packet != NULL);
138 g_return_if_fail(version < 0x04);
140 ((Rtp_Header) packet -> data) -> version = version;
144 rtp_packet_get_padding(Rtp_Packet packet)
146 g_return_val_if_fail(packet != NULL, 0);
148 return ((Rtp_Header) packet -> data) -> padding;
152 rtp_packet_set_padding(Rtp_Packet packet, guint8 padding)
154 g_return_if_fail(packet != NULL);
155 g_return_if_fail(padding < 0x02);
157 ((Rtp_Header) packet -> data) -> padding = padding;
161 rtp_packet_get_csrc_count(Rtp_Packet packet)
163 g_return_val_if_fail(packet != NULL, 0);
165 return ((Rtp_Header) packet -> data) -> csrc_count;
169 rtp_packet_get_extension(Rtp_Packet packet)
171 g_return_val_if_fail(packet != NULL, 0);
173 return ((Rtp_Header) packet -> data) -> extension;
177 rtp_packet_set_extension(Rtp_Packet packet, guint8 extension)
179 g_return_if_fail(packet != NULL);
180 g_return_if_fail(extension < 0x02);
182 ((Rtp_Header) packet -> data) -> extension = extension;
186 rtp_packet_set_csrc_count(Rtp_Packet packet, guint8 csrc_count)
188 g_return_if_fail(packet != NULL);
189 g_return_if_fail(csrc_count < 0x04);
191 ((Rtp_Header) packet -> data) -> csrc_count = csrc_count;
195 rtp_packet_get_marker(Rtp_Packet packet)
197 g_return_val_if_fail(packet != NULL, 0);
199 return ((Rtp_Header) packet -> data) -> marker;
203 rtp_packet_set_marker(Rtp_Packet packet, guint8 marker)
205 g_return_if_fail(packet != NULL);
206 g_return_if_fail(marker < 0x02);
208 ((Rtp_Header) packet -> data) -> marker = marker;
212 rtp_packet_get_payload_type(Rtp_Packet packet)
214 g_return_val_if_fail(packet != NULL, 0);
216 return ((Rtp_Header) packet -> data) -> payload_type;
220 rtp_packet_set_payload_type(Rtp_Packet packet, guint8 payload_type)
222 g_return_if_fail(packet != NULL);
223 g_return_if_fail(payload_type < 0x80);
225 ((Rtp_Header) packet -> data) -> payload_type = payload_type;
229 rtp_packet_get_seq(Rtp_Packet packet)
231 g_return_val_if_fail(packet != NULL, 0);
233 return g_ntohs(((Rtp_Header) packet -> data) -> seq);
237 rtp_packet_set_seq(Rtp_Packet packet, guint16 seq)
239 g_return_if_fail(packet != NULL);
241 ((Rtp_Header) packet -> data) -> seq = g_htons(seq);
245 rtp_packet_get_timestamp(Rtp_Packet packet)
247 g_return_val_if_fail(packet != NULL, 0);
249 return g_ntohl(((Rtp_Header) packet -> data) -> timestamp);
253 rtp_packet_set_timestamp(Rtp_Packet packet, guint32 timestamp)
255 g_return_if_fail(packet != NULL);
257 ((Rtp_Header) packet -> data) -> timestamp = g_htonl(timestamp);
261 rtp_packet_get_ssrc(Rtp_Packet packet)
263 g_return_val_if_fail(packet != NULL, 0);
265 return g_ntohl(((Rtp_Header) packet -> data) -> ssrc);
269 rtp_packet_set_ssrc(Rtp_Packet packet, guint32 ssrc)
271 g_return_if_fail(packet != NULL);
273 ((Rtp_Header) packet -> data) -> ssrc = g_htonl(ssrc);
277 rtp_packet_get_payload_len(Rtp_Packet packet)
281 g_return_val_if_fail(packet != NULL, 0);
283 len = packet -> data_len
285 - rtp_packet_get_csrc_count(packet) * sizeof(guint32);
287 if (rtp_packet_get_padding(packet)) {
288 len -= ((guint8 *) packet -> data)[packet -> data_len - 1];
295 rtp_packet_get_payload(Rtp_Packet packet)
297 g_return_val_if_fail(packet != NULL, NULL);
299 return ((char *) packet -> data)
301 + rtp_packet_get_csrc_count(packet) * sizeof(guint32);
305 rtp_packet_get_packet_len(Rtp_Packet packet)
307 g_return_val_if_fail(packet != NULL, 0);
309 return packet -> data_len;