diff --git a/src/rtp.c b/src/rtp.c index 8935badd..4df381a0 100644 --- a/src/rtp.c +++ b/src/rtp.c @@ -89,3 +89,54 @@ rtp_send_mpv(rtp_send_t *sender, void *opaque, rtp_stream_t *rs, } assert(len == 0); } + + +void +rtp_send_mpa(rtp_send_t *sender, void *opaque, rtp_stream_t *rs, + const uint8_t *data, size_t len, + int64_t pts) +{ + int payloadsize = RTP_MAX_PACKET_SIZE - (4 + 4 + 4 + 4); + int offset = 0, s; + uint8_t *buf; + + pts = av_rescale_q(pts, AV_TIME_BASE_Q, mpeg_tc); + + while(len > 0) { + + s = len > payloadsize ? payloadsize : len; + + buf = rs->rs_buf; + buf[0] = 0x80; + buf[1] = 14; + buf[2] = rs->rs_seq >> 8; + buf[3] = rs->rs_seq; + + buf[4] = pts >> 24; + buf[5] = pts >> 16; + buf[6] = pts >> 8; + buf[7] = pts; + + buf[8] = 0; + buf[9] = 0; + buf[10] = 0; + buf[11] = 0; + + buf[12] = 0; + buf[13] = 0; + buf[14] = offset >> 8; + buf[15] = offset; + + memcpy(buf + 16, data, s); + + len -= s; + data += s; + + sender(opaque, buf, s + 16); + rs->rs_seq++; + + offset += s; + + } + assert(len == 0); +} diff --git a/src/rtp.h b/src/rtp.h index c29cb776..9cd111bf 100644 --- a/src/rtp.h +++ b/src/rtp.h @@ -33,4 +33,7 @@ typedef struct rtp_stream { void rtp_send_mpv(rtp_send_t *sender, void *opaque, rtp_stream_t *rs, const uint8_t *data, size_t len, int64_t pts); +void rtp_send_mpa(rtp_send_t *sender, void *opaque, rtp_stream_t *rs, + const uint8_t *data, size_t len, int64_t pts); + #endif /* RTP_H_ */ diff --git a/src/rtsp.c b/src/rtsp.c index e5d06932..25b5bd6c 100644 --- a/src/rtsp.c +++ b/src/rtsp.c @@ -428,6 +428,10 @@ rtsp_streaming_send(rtsp_t *rtsp, th_pkt_t *pkt) rtp_send_mpv(rs->rs_sender, rs, &rs->rs_rtp, pkt->pkt_payload, pkt->pkt_payloadlen, pkt->pkt_pts); break; + case SCT_MPEG2AUDIO: + rtp_send_mpa(rs->rs_sender, rs, &rs->rs_rtp, pkt->pkt_payload, + pkt->pkt_payloadlen, pkt->pkt_pts); + break; } } @@ -681,6 +685,11 @@ rtsp_cmd_describe(http_connection_t *hc, rtsp_t *rtsp) "m=video 0 RTP/AVP 32\r\n" "a=control:streamid=%d\r\n", ssc->ssc_index); break; + case SCT_MPEG2AUDIO: + tvh_strlcatf(sdp, sizeof(sdp), + "m=audio 0 RTP/AVP 14\r\n" + "a=control:streamid=%d\r\n", ssc->ssc_index); + break; } }