You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

655 lines
17KB

  1. /*
  2. * RTP input/output format
  3. * Copyright (c) 2002 Fabrice Bellard.
  4. *
  5. * This library is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU Lesser General Public
  7. * License as published by the Free Software Foundation; either
  8. * version 2 of the License, or (at your option) any later version.
  9. *
  10. * This library 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 GNU
  13. * Lesser General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Lesser General Public
  16. * License along with this library; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18. */
  19. #include "avformat.h"
  20. #include <unistd.h>
  21. #include <sys/types.h>
  22. #include <sys/socket.h>
  23. #include <netinet/in.h>
  24. #include <arpa/inet.h>
  25. #include <netdb.h>
  26. //#define DEBUG
  27. /* TODO: - add RTCP statistics reporting (should be optional).
  28. - add support for h263/mpeg4 packetized output : IDEA: send a
  29. buffer to 'rtp_write_packet' contains all the packets for ONE
  30. frame. Each packet should have a four byte header containing
  31. the length in big endian format (same trick as
  32. 'url_open_dyn_packet_buf')
  33. */
  34. #define RTP_VERSION 2
  35. #define RTP_MAX_SDES 256 /* maximum text length for SDES */
  36. /* RTCP paquets use 0.5 % of the bandwidth */
  37. #define RTCP_TX_RATIO_NUM 5
  38. #define RTCP_TX_RATIO_DEN 1000
  39. typedef enum {
  40. RTCP_SR = 200,
  41. RTCP_RR = 201,
  42. RTCP_SDES = 202,
  43. RTCP_BYE = 203,
  44. RTCP_APP = 204
  45. } rtcp_type_t;
  46. typedef enum {
  47. RTCP_SDES_END = 0,
  48. RTCP_SDES_CNAME = 1,
  49. RTCP_SDES_NAME = 2,
  50. RTCP_SDES_EMAIL = 3,
  51. RTCP_SDES_PHONE = 4,
  52. RTCP_SDES_LOC = 5,
  53. RTCP_SDES_TOOL = 6,
  54. RTCP_SDES_NOTE = 7,
  55. RTCP_SDES_PRIV = 8,
  56. RTCP_SDES_IMG = 9,
  57. RTCP_SDES_DOOR = 10,
  58. RTCP_SDES_SOURCE = 11
  59. } rtcp_sdes_type_t;
  60. enum RTPPayloadType {
  61. RTP_PT_ULAW = 0,
  62. RTP_PT_GSM = 3,
  63. RTP_PT_G723 = 4,
  64. RTP_PT_ALAW = 8,
  65. RTP_PT_S16BE_STEREO = 10,
  66. RTP_PT_S16BE_MONO = 11,
  67. RTP_PT_MPEGAUDIO = 14,
  68. RTP_PT_JPEG = 26,
  69. RTP_PT_H261 = 31,
  70. RTP_PT_MPEGVIDEO = 32,
  71. RTP_PT_MPEG2TS = 33,
  72. RTP_PT_H263 = 34, /* old H263 encapsulation */
  73. };
  74. typedef struct RTPContext {
  75. int payload_type;
  76. UINT32 ssrc;
  77. UINT16 seq;
  78. UINT32 timestamp;
  79. UINT32 base_timestamp;
  80. UINT32 cur_timestamp;
  81. int max_payload_size;
  82. /* rtcp sender statistics receive */
  83. INT64 last_rtcp_ntp_time;
  84. UINT32 last_rtcp_timestamp;
  85. /* rtcp sender statistics */
  86. unsigned int packet_count;
  87. unsigned int octet_count;
  88. unsigned int last_octet_count;
  89. int first_packet;
  90. /* buffer for output */
  91. UINT8 buf[RTP_MAX_PACKET_LENGTH];
  92. UINT8 *buf_ptr;
  93. } RTPContext;
  94. int rtp_get_codec_info(AVCodecContext *codec, int payload_type)
  95. {
  96. switch(payload_type) {
  97. case RTP_PT_ULAW:
  98. codec->codec_id = CODEC_ID_PCM_MULAW;
  99. codec->channels = 1;
  100. codec->sample_rate = 8000;
  101. break;
  102. case RTP_PT_ALAW:
  103. codec->codec_id = CODEC_ID_PCM_ALAW;
  104. codec->channels = 1;
  105. codec->sample_rate = 8000;
  106. break;
  107. case RTP_PT_S16BE_STEREO:
  108. codec->codec_id = CODEC_ID_PCM_S16BE;
  109. codec->channels = 2;
  110. codec->sample_rate = 44100;
  111. break;
  112. case RTP_PT_S16BE_MONO:
  113. codec->codec_id = CODEC_ID_PCM_S16BE;
  114. codec->channels = 1;
  115. codec->sample_rate = 44100;
  116. break;
  117. case RTP_PT_MPEGAUDIO:
  118. codec->codec_id = CODEC_ID_MP2;
  119. break;
  120. case RTP_PT_JPEG:
  121. codec->codec_id = CODEC_ID_MJPEG;
  122. break;
  123. case RTP_PT_MPEGVIDEO:
  124. codec->codec_id = CODEC_ID_MPEG1VIDEO;
  125. break;
  126. default:
  127. return -1;
  128. }
  129. return 0;
  130. }
  131. /* return < 0 if unknown payload type */
  132. int rtp_get_payload_type(AVCodecContext *codec)
  133. {
  134. int payload_type;
  135. /* compute the payload type */
  136. payload_type = -1;
  137. switch(codec->codec_id) {
  138. case CODEC_ID_PCM_MULAW:
  139. payload_type = RTP_PT_ULAW;
  140. break;
  141. case CODEC_ID_PCM_ALAW:
  142. payload_type = RTP_PT_ALAW;
  143. break;
  144. case CODEC_ID_PCM_S16BE:
  145. if (codec->channels == 1) {
  146. payload_type = RTP_PT_S16BE_MONO;
  147. } else if (codec->channels == 2) {
  148. payload_type = RTP_PT_S16BE_STEREO;
  149. }
  150. break;
  151. case CODEC_ID_MP2:
  152. case CODEC_ID_MP3LAME:
  153. payload_type = RTP_PT_MPEGAUDIO;
  154. break;
  155. case CODEC_ID_MJPEG:
  156. payload_type = RTP_PT_JPEG;
  157. break;
  158. case CODEC_ID_MPEG1VIDEO:
  159. payload_type = RTP_PT_MPEGVIDEO;
  160. break;
  161. default:
  162. break;
  163. }
  164. return payload_type;
  165. }
  166. static inline UINT32 decode_be32(const UINT8 *p)
  167. {
  168. return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
  169. }
  170. static inline UINT32 decode_be64(const UINT8 *p)
  171. {
  172. return ((UINT64)decode_be32(p) << 32) | decode_be32(p + 4);
  173. }
  174. static int rtcp_parse_packet(AVFormatContext *s1, const unsigned char *buf, int len)
  175. {
  176. RTPContext *s = s1->priv_data;
  177. if (buf[1] != 200)
  178. return -1;
  179. s->last_rtcp_ntp_time = decode_be64(buf + 8);
  180. s->last_rtcp_timestamp = decode_be32(buf + 16);
  181. return 0;
  182. }
  183. /**
  184. * Parse an RTP packet directly sent as raw data. Can only be used if
  185. * 'raw' is given as input file
  186. * @param s1 media file context
  187. * @param pkt returned packet
  188. * @param buf input buffer
  189. * @param len buffer len
  190. * @return zero if no error.
  191. */
  192. int rtp_parse_packet(AVFormatContext *s1, AVPacket *pkt,
  193. const unsigned char *buf, int len)
  194. {
  195. RTPContext *s = s1->priv_data;
  196. unsigned int ssrc, h;
  197. int payload_type, seq, delta_timestamp;
  198. AVStream *st;
  199. UINT32 timestamp;
  200. if (len < 12)
  201. return -1;
  202. if ((buf[0] & 0xc0) != (RTP_VERSION << 6))
  203. return -1;
  204. if (buf[1] >= 200 && buf[1] <= 204) {
  205. rtcp_parse_packet(s1, buf, len);
  206. return -1;
  207. }
  208. payload_type = buf[1] & 0x7f;
  209. seq = (buf[2] << 8) | buf[3];
  210. timestamp = decode_be32(buf + 4);
  211. ssrc = decode_be32(buf + 8);
  212. if (s->payload_type < 0) {
  213. s->payload_type = payload_type;
  214. if (payload_type == RTP_PT_MPEG2TS) {
  215. /* XXX: special case : not a single codec but a whole stream */
  216. return -1;
  217. } else {
  218. st = av_new_stream(s1, 0);
  219. if (!st)
  220. return -1;
  221. rtp_get_codec_info(&st->codec, payload_type);
  222. }
  223. }
  224. /* NOTE: we can handle only one payload type */
  225. if (s->payload_type != payload_type)
  226. return -1;
  227. #if defined(DEBUG) || 1
  228. if (seq != ((s->seq + 1) & 0xffff)) {
  229. printf("RTP: PT=%02x: bad cseq %04x expected=%04x\n",
  230. payload_type, seq, ((s->seq + 1) & 0xffff));
  231. }
  232. s->seq = seq;
  233. #endif
  234. len -= 12;
  235. buf += 12;
  236. st = s1->streams[0];
  237. switch(st->codec.codec_id) {
  238. case CODEC_ID_MP2:
  239. /* better than nothing: skip mpeg audio RTP header */
  240. if (len <= 4)
  241. return -1;
  242. h = decode_be32(buf);
  243. len -= 4;
  244. buf += 4;
  245. av_new_packet(pkt, len);
  246. memcpy(pkt->data, buf, len);
  247. break;
  248. case CODEC_ID_MPEG1VIDEO:
  249. /* better than nothing: skip mpeg audio RTP header */
  250. if (len <= 4)
  251. return -1;
  252. h = decode_be32(buf);
  253. buf += 4;
  254. len -= 4;
  255. if (h & (1 << 26)) {
  256. /* mpeg2 */
  257. if (len <= 4)
  258. return -1;
  259. buf += 4;
  260. len -= 4;
  261. }
  262. av_new_packet(pkt, len);
  263. memcpy(pkt->data, buf, len);
  264. break;
  265. default:
  266. av_new_packet(pkt, len);
  267. memcpy(pkt->data, buf, len);
  268. break;
  269. }
  270. if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) {
  271. /* compute pts from timestamp with received ntp_time */
  272. delta_timestamp = timestamp - s->last_rtcp_timestamp;
  273. /* XXX: do conversion, but not needed for mpeg at 90 KhZ */
  274. pkt->pts = s->last_rtcp_ntp_time + delta_timestamp;
  275. }
  276. return 0;
  277. }
  278. static int rtp_read_header(AVFormatContext *s1,
  279. AVFormatParameters *ap)
  280. {
  281. RTPContext *s = s1->priv_data;
  282. s->payload_type = -1;
  283. s->last_rtcp_ntp_time = AV_NOPTS_VALUE;
  284. return 0;
  285. }
  286. static int rtp_read_packet(AVFormatContext *s1, AVPacket *pkt)
  287. {
  288. char buf[RTP_MAX_PACKET_LENGTH];
  289. int ret;
  290. /* XXX: needs a better API for packet handling ? */
  291. for(;;) {
  292. ret = url_read(url_fileno(&s1->pb), buf, sizeof(buf));
  293. if (ret < 0)
  294. return AVERROR_IO;
  295. if (rtp_parse_packet(s1, pkt, buf, ret) == 0)
  296. break;
  297. }
  298. return 0;
  299. }
  300. static int rtp_read_close(AVFormatContext *s1)
  301. {
  302. // RTPContext *s = s1->priv_data;
  303. return 0;
  304. }
  305. static int rtp_probe(AVProbeData *p)
  306. {
  307. if (strstart(p->filename, "rtp://", NULL))
  308. return AVPROBE_SCORE_MAX;
  309. return 0;
  310. }
  311. /* rtp output */
  312. static int rtp_write_header(AVFormatContext *s1)
  313. {
  314. RTPContext *s = s1->priv_data;
  315. int payload_type, max_packet_size;
  316. AVStream *st;
  317. if (s1->nb_streams != 1)
  318. return -1;
  319. st = s1->streams[0];
  320. payload_type = rtp_get_payload_type(&st->codec);
  321. if (payload_type < 0)
  322. return -1;
  323. s->payload_type = payload_type;
  324. s->base_timestamp = random();
  325. s->timestamp = s->base_timestamp;
  326. s->ssrc = random();
  327. s->first_packet = 1;
  328. max_packet_size = url_fget_max_packet_size(&s1->pb);
  329. if (max_packet_size <= 12)
  330. return AVERROR_IO;
  331. s->max_payload_size = max_packet_size - 12;
  332. switch(st->codec.codec_id) {
  333. case CODEC_ID_MP2:
  334. case CODEC_ID_MP3LAME:
  335. s->buf_ptr = s->buf + 4;
  336. s->cur_timestamp = 0;
  337. break;
  338. case CODEC_ID_MPEG1VIDEO:
  339. s->cur_timestamp = 0;
  340. break;
  341. default:
  342. s->buf_ptr = s->buf;
  343. break;
  344. }
  345. return 0;
  346. }
  347. /* send an rtcp sender report packet */
  348. static void rtcp_send_sr(AVFormatContext *s1, INT64 ntp_time)
  349. {
  350. RTPContext *s = s1->priv_data;
  351. #if defined(DEBUG)
  352. printf("RTCP: %02x %Lx %x\n", s->payload_type, ntp_time, s->timestamp);
  353. #endif
  354. put_byte(&s1->pb, (RTP_VERSION << 6));
  355. put_byte(&s1->pb, 200);
  356. put_be16(&s1->pb, 6); /* length in words - 1 */
  357. put_be32(&s1->pb, s->ssrc);
  358. put_be64(&s1->pb, ntp_time);
  359. put_be32(&s1->pb, s->timestamp);
  360. put_be32(&s1->pb, s->packet_count);
  361. put_be32(&s1->pb, s->octet_count);
  362. put_flush_packet(&s1->pb);
  363. }
  364. /* send an rtp packet. sequence number is incremented, but the caller
  365. must update the timestamp itself */
  366. static void rtp_send_data(AVFormatContext *s1, UINT8 *buf1, int len)
  367. {
  368. RTPContext *s = s1->priv_data;
  369. #ifdef DEBUG
  370. printf("rtp_send_data size=%d\n", len);
  371. #endif
  372. /* build the RTP header */
  373. put_byte(&s1->pb, (RTP_VERSION << 6));
  374. put_byte(&s1->pb, s->payload_type & 0x7f);
  375. put_be16(&s1->pb, s->seq);
  376. put_be32(&s1->pb, s->timestamp);
  377. put_be32(&s1->pb, s->ssrc);
  378. put_buffer(&s1->pb, buf1, len);
  379. put_flush_packet(&s1->pb);
  380. s->seq++;
  381. s->octet_count += len;
  382. s->packet_count++;
  383. }
  384. /* send an integer number of samples and compute time stamp and fill
  385. the rtp send buffer before sending. */
  386. static void rtp_send_samples(AVFormatContext *s1,
  387. UINT8 *buf1, int size, int sample_size)
  388. {
  389. RTPContext *s = s1->priv_data;
  390. int len, max_packet_size, n;
  391. max_packet_size = (s->max_payload_size / sample_size) * sample_size;
  392. /* not needed, but who nows */
  393. if ((size % sample_size) != 0)
  394. av_abort();
  395. while (size > 0) {
  396. len = (max_packet_size - (s->buf_ptr - s->buf));
  397. if (len > size)
  398. len = size;
  399. /* copy data */
  400. memcpy(s->buf_ptr, buf1, len);
  401. s->buf_ptr += len;
  402. buf1 += len;
  403. size -= len;
  404. n = (s->buf_ptr - s->buf);
  405. /* if buffer full, then send it */
  406. if (n >= max_packet_size) {
  407. rtp_send_data(s1, s->buf, n);
  408. s->buf_ptr = s->buf;
  409. /* update timestamp */
  410. s->timestamp += n / sample_size;
  411. }
  412. }
  413. }
  414. /* NOTE: we suppose that exactly one frame is given as argument here */
  415. /* XXX: test it */
  416. static void rtp_send_mpegaudio(AVFormatContext *s1,
  417. UINT8 *buf1, int size)
  418. {
  419. RTPContext *s = s1->priv_data;
  420. AVStream *st = s1->streams[0];
  421. int len, count, max_packet_size;
  422. max_packet_size = s->max_payload_size;
  423. /* test if we must flush because not enough space */
  424. len = (s->buf_ptr - s->buf);
  425. if ((len + size) > max_packet_size) {
  426. if (len > 4) {
  427. rtp_send_data(s1, s->buf, s->buf_ptr - s->buf);
  428. s->buf_ptr = s->buf + 4;
  429. /* 90 KHz time stamp */
  430. s->timestamp = s->base_timestamp +
  431. (s->cur_timestamp * 90000LL) / st->codec.sample_rate;
  432. }
  433. }
  434. /* add the packet */
  435. if (size > max_packet_size) {
  436. /* big packet: fragment */
  437. count = 0;
  438. while (size > 0) {
  439. len = max_packet_size - 4;
  440. if (len > size)
  441. len = size;
  442. /* build fragmented packet */
  443. s->buf[0] = 0;
  444. s->buf[1] = 0;
  445. s->buf[2] = count >> 8;
  446. s->buf[3] = count;
  447. memcpy(s->buf + 4, buf1, len);
  448. rtp_send_data(s1, s->buf, len + 4);
  449. size -= len;
  450. buf1 += len;
  451. count += len;
  452. }
  453. } else {
  454. if (s->buf_ptr == s->buf + 4) {
  455. /* no fragmentation possible */
  456. s->buf[0] = 0;
  457. s->buf[1] = 0;
  458. s->buf[2] = 0;
  459. s->buf[3] = 0;
  460. }
  461. memcpy(s->buf_ptr, buf1, size);
  462. s->buf_ptr += size;
  463. }
  464. s->cur_timestamp += st->codec.frame_size;
  465. }
  466. /* NOTE: a single frame must be passed with sequence header if
  467. needed. XXX: use slices. */
  468. static void rtp_send_mpegvideo(AVFormatContext *s1,
  469. UINT8 *buf1, int size)
  470. {
  471. RTPContext *s = s1->priv_data;
  472. AVStream *st = s1->streams[0];
  473. int len, h, max_packet_size;
  474. UINT8 *q;
  475. max_packet_size = s->max_payload_size;
  476. while (size > 0) {
  477. /* XXX: more correct headers */
  478. h = 0;
  479. if (st->codec.sub_id == 2)
  480. h |= 1 << 26; /* mpeg 2 indicator */
  481. q = s->buf;
  482. *q++ = h >> 24;
  483. *q++ = h >> 16;
  484. *q++ = h >> 8;
  485. *q++ = h;
  486. if (st->codec.sub_id == 2) {
  487. h = 0;
  488. *q++ = h >> 24;
  489. *q++ = h >> 16;
  490. *q++ = h >> 8;
  491. *q++ = h;
  492. }
  493. len = max_packet_size - (q - s->buf);
  494. if (len > size)
  495. len = size;
  496. memcpy(q, buf1, len);
  497. q += len;
  498. /* 90 KHz time stamp */
  499. /* XXX: overflow */
  500. s->timestamp = s->base_timestamp +
  501. (s->cur_timestamp * 90000LL * FRAME_RATE_BASE) / st->codec.frame_rate;
  502. rtp_send_data(s1, s->buf, q - s->buf);
  503. buf1 += len;
  504. size -= len;
  505. }
  506. s->cur_timestamp++;
  507. }
  508. /* write an RTP packet. 'buf1' must contain a single specific frame. */
  509. static int rtp_write_packet(AVFormatContext *s1, int stream_index,
  510. UINT8 *buf1, int size, int force_pts)
  511. {
  512. RTPContext *s = s1->priv_data;
  513. AVStream *st = s1->streams[0];
  514. int rtcp_bytes;
  515. INT64 ntp_time;
  516. #ifdef DEBUG
  517. printf("%d: write len=%d\n", stream_index, size);
  518. #endif
  519. /* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */
  520. rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
  521. RTCP_TX_RATIO_DEN;
  522. if (s->first_packet || rtcp_bytes >= 28) {
  523. /* compute NTP time */
  524. ntp_time = force_pts; // ((INT64)force_pts << 28) / 5625
  525. rtcp_send_sr(s1, ntp_time);
  526. s->last_octet_count = s->octet_count;
  527. s->first_packet = 0;
  528. }
  529. switch(st->codec.codec_id) {
  530. case CODEC_ID_PCM_MULAW:
  531. case CODEC_ID_PCM_ALAW:
  532. case CODEC_ID_PCM_U8:
  533. case CODEC_ID_PCM_S8:
  534. rtp_send_samples(s1, buf1, size, 1 * st->codec.channels);
  535. break;
  536. case CODEC_ID_PCM_U16BE:
  537. case CODEC_ID_PCM_U16LE:
  538. case CODEC_ID_PCM_S16BE:
  539. case CODEC_ID_PCM_S16LE:
  540. rtp_send_samples(s1, buf1, size, 2 * st->codec.channels);
  541. break;
  542. case CODEC_ID_MP2:
  543. case CODEC_ID_MP3LAME:
  544. rtp_send_mpegaudio(s1, buf1, size);
  545. break;
  546. case CODEC_ID_MPEG1VIDEO:
  547. rtp_send_mpegvideo(s1, buf1, size);
  548. break;
  549. default:
  550. return AVERROR_IO;
  551. }
  552. return 0;
  553. }
  554. static int rtp_write_trailer(AVFormatContext *s1)
  555. {
  556. // RTPContext *s = s1->priv_data;
  557. return 0;
  558. }
  559. AVInputFormat rtp_demux = {
  560. "rtp",
  561. "RTP input format",
  562. sizeof(RTPContext),
  563. rtp_probe,
  564. rtp_read_header,
  565. rtp_read_packet,
  566. rtp_read_close,
  567. flags: AVFMT_NOHEADER,
  568. };
  569. AVOutputFormat rtp_mux = {
  570. "rtp",
  571. "RTP output format",
  572. NULL,
  573. NULL,
  574. sizeof(RTPContext),
  575. CODEC_ID_PCM_MULAW,
  576. CODEC_ID_NONE,
  577. rtp_write_header,
  578. rtp_write_packet,
  579. rtp_write_trailer,
  580. };
  581. int rtp_init(void)
  582. {
  583. av_register_output_format(&rtp_mux);
  584. av_register_input_format(&rtp_demux);
  585. return 0;
  586. }