/* * tvheadend, RTP interface * Copyright (C) 2007 Andreas Öman * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include "tvhead.h" #include "channels.h" #include "rtp.h" #include "dispatch.h" int rtp_sendmsg(uint8_t *pkt, int blocks, int64_t pcr, int fd, struct sockaddr *dst, socklen_t dstlen, uint16_t seq) { struct msghdr msg; struct iovec vec[2]; AVRational mpeg_tc = {1, 90000}; char hdr[12]; pcr = av_rescale_q(pcr, AV_TIME_BASE_Q, mpeg_tc); hdr[0] = 0x80; hdr[1] = 33; /* M2TS */ hdr[2] = seq >> 8; hdr[3] = seq; hdr[4] = pcr >> 24; hdr[5] = pcr >> 16; hdr[6] = pcr >> 8; hdr[7] = pcr; hdr[8] = 0; hdr[9] = 0; hdr[10] = 0; hdr[11] = 0; vec[0].iov_base = hdr; vec[0].iov_len = 12; vec[1].iov_base = pkt; vec[1].iov_len = blocks * 188; memset(&msg, 0, sizeof(msg)); msg.msg_name = dst; msg.msg_namelen = dstlen; msg.msg_iov = vec; msg.msg_iovlen = 2; return sendmsg(fd, &msg, 0); } void rtp_output_ts(void *opaque, th_subscription_t *s, uint8_t *pkt, int blocks, int64_t pcr) { th_rtp_streamer_t *trs = opaque; rtp_sendmsg(pkt, blocks, pcr, trs->trs_fd, (struct sockaddr *)&trs->trs_dest, sizeof(struct sockaddr_in), trs->trs_seq); trs->trs_seq++; } void rtp_streamer_init(th_rtp_streamer_t *trs, int fd, struct sockaddr_in *dst) { trs->trs_fd = fd; trs->trs_dest = *dst; trs->trs_seq = 0; }