/* * Connect UDP/RTP */ static int iptv_udp_start ( iptv_input_t *mi, iptv_mux_t *im, const char *raw, const url_t *url ) { udp_connection_t *conn; udp_multirecv_t *um; /* Note: url->user is used for specifying multicast source address (SSM) here. The URL format is rtp://<srcaddr>@<grpaddr>:<port> */ conn = udp_bind(LS_IPTV, im->mm_nicename, url->host, url->port, url->user, im->mm_iptv_interface, IPTV_BUF_SIZE, 4*1024); if (conn == UDP_FATAL_ERROR) return SM_CODE_TUNING_FAILED; if (conn == NULL) return -1; /* Done */ im->mm_iptv_fd = conn->fd; im->mm_iptv_connection = conn; um = calloc(1, sizeof(*um)); udp_multirecv_init(um, IPTV_PKTS, IPTV_PKT_PAYLOAD); im->im_data = um; iptv_input_mux_started(mi, im, 1); return 0; }
/* * Setup RTSP(S) connection */ static int iptv_rtsp_start ( iptv_mux_t *im, const char *raw, const url_t *u ) { rtsp_priv_t *rp; http_client_t *hc; udp_connection_t *rtp, *rtcp; int r; if (!(hc = http_client_connect(im, RTSP_VERSION_1_0, u->scheme, u->host, u->port, NULL))) return SM_CODE_TUNING_FAILED; if (u->user) hc->hc_rtsp_user = strdup(u->user); if (u->pass) hc->hc_rtsp_pass = strdup(u->pass); if (udp_bind_double(&rtp, &rtcp, "IPTV", "rtp", "rtcp", NULL, 0, NULL, 128*1024, 16384, 4*1024, 4*1024) < 0) { http_client_close(hc); return SM_CODE_TUNING_FAILED; } hc->hc_hdr_received = iptv_rtsp_header; hc->hc_data_received = iptv_rtsp_data; hc->hc_handle_location = 1; /* allow redirects */ hc->hc_rtsp_keep_alive_cmd = RTSP_CMD_GET_PARAMETER; /* start keep alive loop with GET_PARAMETER */ http_client_register(hc); /* register to the HTTP thread */ r = rtsp_setup(hc, u->path, u->query, NULL, ntohs(IP_PORT(rtp->ip)), ntohs(IP_PORT(rtcp->ip))); if (r < 0) { udp_close(rtcp); udp_close(rtp); http_client_close(hc); return SM_CODE_TUNING_FAILED; } rp = calloc(1, sizeof(*rp)); rp->rtcp_info = calloc(1, sizeof(iptv_rtcp_info_t)); rtcp_init(rp->rtcp_info); rp->rtcp_info->connection = rtcp; rp->hc = hc; udp_multirecv_init(&rp->um, IPTV_PKTS, IPTV_PKT_PAYLOAD); rp->path = strdup(u->path ?: ""); rp->query = strdup(u->query ?: ""); im->im_data = rp; im->mm_iptv_fd = rtp->fd; im->mm_iptv_connection = rtp; im->mm_iptv_fd2 = rtcp->fd; im->mm_iptv_connection2 = rtcp; return 0; }