summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xine_input_vdr_net.h201
1 files changed, 71 insertions, 130 deletions
diff --git a/xine_input_vdr_net.h b/xine_input_vdr_net.h
index 31d9a41c..480a5664 100644
--- a/xine_input_vdr_net.h
+++ b/xine_input_vdr_net.h
@@ -4,7 +4,7 @@
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
- * $Id: xine_input_vdr_net.h,v 1.3 2006-07-05 01:21:36 phintuka Exp $
+ * $Id: xine_input_vdr_net.h,v 1.4 2006-12-14 12:23:06 phintuka Exp $
*
*/
@@ -14,6 +14,9 @@
#include <arpa/inet.h>
#include <endian.h>
+#include "tools/rtp.h"
+
+
/*
* Default port(s)
*/
@@ -25,11 +28,24 @@
# define DISCOVERY_PORT 37890
#endif
+/* discovery protocol strings (v1.0) */
+#define DISCOVERY_1_0_HDR "VDR xineliboutput DISCOVERY 1.0" "\r\n"
+#define DISCOVERY_1_0_CLI "Client: %s:%d" "\r\n"
+#define DISCOVERY_1_0_SVR "Server port: %d" "\r\n"
+#define DISCOVERY_1_0_VERSION "Server version: vdr-" VDRVERSION "\r\n" \
+ "\txineliboutput-" XINELIBOUTPUT_VERSION "\r\n"
+
/*
* Byte-order conversions
*/
#if __BYTE_ORDER == __BIG_ENDIAN
+#elif __BYTE_ORDER == __LITTLE_ENDIAN
+#else
+# error __BYTE_ORDER not defined !
+#endif
+
+#if __BYTE_ORDER == __BIG_ENDIAN
# define ntohll(val) (val)
# define htonll(val) (val)
# define ntohull(val) (val)
@@ -45,6 +61,7 @@
(uint64_t) htonl((uint32_t)(val)) << 32)
#endif
+
/*
* Network packet headers
*/
@@ -52,7 +69,10 @@
#if defined __cplusplus
extern "C" {
#endif
-
+
+#define PACKED __attribute__((packed))
+
+
/*
* TCP / PIPE
*/
@@ -60,9 +80,11 @@ extern "C" {
typedef struct stream_tcp_header {
uint64_t pos; /* stream position of first byte */
uint32_t len; /* length of following PES packet */
-} __attribute__ ((packed)) stream_tcp_header_t;
-#define TCP_PAYLOAD(frame) (((uchar *)frame) + sizeof(stream_tcp_header_t))
+ uint8_t payload[0];
+
+} PACKED stream_tcp_header_t;
+
/*
* UDP
@@ -74,152 +96,71 @@ typedef struct stream_udp_header {
/* --> embedded control stream data */
uint16_t seq; /* packet sequence number
(for re-ordering and detecting missing packets) */
-} __attribute__ ((packed)) stream_udp_header_t;
-#define UDP_PAYLOAD(frame) (((uchar *)frame) + sizeof(stream_udp_header_t))
+ uint8_t payload[0];
+
+} PACKED stream_udp_header_t;
+
#define UDP_SEQ_MASK 0xff
-/*
- * RTP (RFC 1889): A Transport Protocol for Real-Time Applications
+/*
+ * RTP
*/
-/* RTP data header */
-typedef struct stream_rtp_header {
+/* xineliboutput RTP header extension */
+typedef struct stream_rtp_header_ext_x {
+
+ stream_rtp_header_ext_t hdr;
+
union {
- uint8_t raw[12];
- struct {
-#if __BYTE_ORDER == __BIG_ENDIAN
- unsigned int version:2; /* protocol version */
- unsigned int padding:1; /* padding flag */
- unsigned int ext:1; /* header extension flag */
- unsigned int cc:4; /* CSRC count */
+ uint8_t raw[12]; /* 3 DWORDs */
+ uint32_t rawd[3];
- unsigned int marker:1; /* marker bit */
- unsigned int paytype:7; /* payload type */
-#else
- unsigned int cc:4; /* CSRC count */
- unsigned int ext:1; /* header extension flag */
- unsigned int padding:1; /* padding flag */
- unsigned int version:2; /* protocol version */
+ union {
+
+ struct {
+ uint8_t padding0[2]; /* must be padded to full DWORDs */
+ stream_udp_header_t udphdr;
+ } PACKED;
+
+ struct {
+ uint8_t padding1[2]; /* must be padded to full DWORDs */
+
+ uint64_t pos;
+ uint16_t seq;
+ } PACKED;
+
+ } PACKED;
+ } PACKED;
+
+ uint8_t payload[0];
+
+} PACKED stream_rtp_header_ext_x_t;
- unsigned int paytype:7; /* payload type */
- unsigned int marker:1; /* marker bit */
-#endif
- uint16_t seq; /* sequence number */
- uint32_t ts; /* timestamp */
- uint32_t ssrc; /* synchronization source */
- /*uint32_t csrc[0];*/ /* optional CSRC list */
- };
- };
+/* xineliboutput RTP header */
+typedef struct stream_rtp_header_impl {
- uint8_t payload[0];
+ stream_rtp_header_t rtp_hdr;
+ stream_rtp_header_ext_x_t hdr_ext;
+
+ uint8_t payload[0];
+
+} PACKED stream_rtp_header_impl_t;
-} __attribute__ ((packed)) stream_rtp_header_t;
#define RTP_VERSION 2
#define RTP_MARKER_BIT 0x80
+#define RTP_HDREXT_BIT 0x10
#define RTP_PAYLOAD_TYPE 96 /* application */
#define RTP_VERSION_BYTE (RTP_VERSION<<6)
#define RTP_PAYLOAD_TYPE_M (RTP_PAYLOAD_TYPE|RTP_MARKER_BIT)
-
-#define RTP_PAYLOAD(frame) (((uchar *)frame) + sizeof(stream_rtp_header_t))
-
-/* RTCP packet types */
-typedef enum {
- RTCP_SR = 200,
- RTCP_RR = 201,
- RTCP_SDES = 202,
- RTCP_BYE = 203,
- RTCP_APP = 204
-} rtcp_type_t;
-
-/* RTCP SDES types */
-typedef enum {
- RTCP_SDES_END = 0,
- RTCP_SDES_CNAME = 1,
-
- RTCP_SDES_NAME = 2,
- RTCP_SDES_EMAIL = 3,
- RTCP_SDES_PHONE = 4,
- RTCP_SDES_LOC = 5,
- RTCP_SDES_TOOL = 6,
- RTCP_SDES_NOTE = 7,
- RTCP_SDES_PRIV = 8
-} rtcp_sdes_type_t;
-
-/* RTCP common header word */
-typedef struct {
- union {
- struct {
-#if __BYTE_ORDER == __BIG_ENDIAN
- unsigned int version:2; /* protocol version */
- unsigned int padding:1; /* padding flag */
- unsigned int count:5; /* varies by packet type */
-#else
- unsigned int count:5; /* varies by packet type */
- unsigned int padding:1; /* padding flag */
- unsigned int version:2; /* protocol version */
-#endif
- unsigned int ptype:8; /* RTCP packet type */
-
- uint16_t length; /* pkt len in words, w/o this word */
- };
- uint8_t raw[4];
- };
-} __attribute__ ((packed)) rtcp_common_t;
-
-/* RTCP RR (Reception report) */
-typedef struct {
- uint32_t ssrc; /* data source being reported */
- unsigned int fraction:8; /* fraction lost since last SR/RR */
- int lost:24; /* cumul. no. pkts lost (signed!) */
- uint32_t last_seq; /* extended last seq. no. received */
- uint32_t jitter; /* interarrival jitter */
- uint32_t lsr; /* last SR packet from this source */
- uint32_t dlsr; /* delay since last SR packet */
-} __attribute__ ((packed)) rtcp_rr_t;
-
-/* RTCP SR (Sender report) */
-typedef struct {
- uint32_t ssrc;
- uint32_t ntp_sec; /* NTP timestamp, most significant word / seconds */
- uint32_t ntp_frac;
- uint32_t rtp_ts;
- uint32_t psent; /* packets sent */
- uint32_t osent; /* octets sent */
- rtcp_rr_t rr[0]; /* variable-length list */
-} __attribute__ ((packed)) rtcp_sr_t;
-
-/* RTCP SDES item */
-typedef struct {
- uint8_t type; /* type of item (rtcp_sdes_type_t) */
- uint8_t length; /* length of item (in octets) */
- char data[0]; /* text, not null-terminated */
-} __attribute__ ((packed)) rtcp_sdes_item_t;
-
-/* RTCP packet */
-typedef struct {
- rtcp_common_t hdr;
- union {
- rtcp_sr_t sr;
- struct {
- uint32_t ssrc;
- rtcp_rr_t rr[0];
- } rr;
- struct {
- uint32_t ssrc; /* first SSRC/CSRC */
- rtcp_sdes_item_t item[0]; /* list of SDES items */
- } sdes;
- struct {
- uint32_t src[0]; /* list of sources */
- /* can't express trailing text for reason */
- } bye;
- };
-} __attribute__ ((packed)) rtcp_packet_t;
+#define RTP_HEADER_EXT_X_SIZE 3 /* dwords, not counting stream_rtp_header_ext_t */
+#define RTP_HEADER_EXT_X_TYPE 0x54d3
+
#if defined __cplusplus
}