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.

751 lines
21KB

  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 "mpegts.h"
  21. #include <unistd.h>
  22. #include <sys/types.h>
  23. #include <sys/socket.h>
  24. #include <netinet/in.h>
  25. #ifndef __BEOS__
  26. # include <arpa/inet.h>
  27. #else
  28. # include "barpainet.h"
  29. #endif
  30. #include <netdb.h>
  31. //#define DEBUG
  32. /* TODO: - add RTCP statistics reporting (should be optional).
  33. - add support for h263/mpeg4 packetized output : IDEA: send a
  34. buffer to 'rtp_write_packet' contains all the packets for ONE
  35. frame. Each packet should have a four byte header containing
  36. the length in big endian format (same trick as
  37. 'url_open_dyn_packet_buf')
  38. */
  39. #define RTP_VERSION 2
  40. #define RTP_MAX_SDES 256 /* maximum text length for SDES */
  41. /* RTCP paquets use 0.5 % of the bandwidth */
  42. #define RTCP_TX_RATIO_NUM 5
  43. #define RTCP_TX_RATIO_DEN 1000
  44. typedef enum {
  45. RTCP_SR = 200,
  46. RTCP_RR = 201,
  47. RTCP_SDES = 202,
  48. RTCP_BYE = 203,
  49. RTCP_APP = 204
  50. } rtcp_type_t;
  51. typedef enum {
  52. RTCP_SDES_END = 0,
  53. RTCP_SDES_CNAME = 1,
  54. RTCP_SDES_NAME = 2,
  55. RTCP_SDES_EMAIL = 3,
  56. RTCP_SDES_PHONE = 4,
  57. RTCP_SDES_LOC = 5,
  58. RTCP_SDES_TOOL = 6,
  59. RTCP_SDES_NOTE = 7,
  60. RTCP_SDES_PRIV = 8,
  61. RTCP_SDES_IMG = 9,
  62. RTCP_SDES_DOOR = 10,
  63. RTCP_SDES_SOURCE = 11
  64. } rtcp_sdes_type_t;
  65. struct RTPDemuxContext {
  66. AVFormatContext *ic;
  67. AVStream *st;
  68. int payload_type;
  69. uint32_t ssrc;
  70. uint16_t seq;
  71. uint32_t timestamp;
  72. uint32_t base_timestamp;
  73. uint32_t cur_timestamp;
  74. int max_payload_size;
  75. MpegTSContext *ts; /* only used for RTP_PT_MPEG2TS payloads */
  76. int read_buf_index;
  77. int read_buf_size;
  78. /* rtcp sender statistics receive */
  79. int64_t last_rtcp_ntp_time;
  80. int64_t first_rtcp_ntp_time;
  81. uint32_t last_rtcp_timestamp;
  82. /* rtcp sender statistics */
  83. unsigned int packet_count;
  84. unsigned int octet_count;
  85. unsigned int last_octet_count;
  86. int first_packet;
  87. /* buffer for output */
  88. uint8_t buf[RTP_MAX_PACKET_LENGTH];
  89. uint8_t *buf_ptr;
  90. };
  91. int rtp_get_codec_info(AVCodecContext *codec, int payload_type)
  92. {
  93. switch(payload_type) {
  94. case RTP_PT_ULAW:
  95. codec->codec_type = CODEC_TYPE_AUDIO;
  96. codec->codec_id = CODEC_ID_PCM_MULAW;
  97. codec->channels = 1;
  98. codec->sample_rate = 8000;
  99. break;
  100. case RTP_PT_ALAW:
  101. codec->codec_type = CODEC_TYPE_AUDIO;
  102. codec->codec_id = CODEC_ID_PCM_ALAW;
  103. codec->channels = 1;
  104. codec->sample_rate = 8000;
  105. break;
  106. case RTP_PT_S16BE_STEREO:
  107. codec->codec_type = CODEC_TYPE_AUDIO;
  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_type = CODEC_TYPE_AUDIO;
  114. codec->codec_id = CODEC_ID_PCM_S16BE;
  115. codec->channels = 1;
  116. codec->sample_rate = 44100;
  117. break;
  118. case RTP_PT_MPEGAUDIO:
  119. codec->codec_type = CODEC_TYPE_AUDIO;
  120. codec->codec_id = CODEC_ID_MP2;
  121. break;
  122. case RTP_PT_JPEG:
  123. codec->codec_type = CODEC_TYPE_VIDEO;
  124. codec->codec_id = CODEC_ID_MJPEG;
  125. break;
  126. case RTP_PT_MPEGVIDEO:
  127. codec->codec_type = CODEC_TYPE_VIDEO;
  128. codec->codec_id = CODEC_ID_MPEG1VIDEO;
  129. break;
  130. case RTP_PT_MPEG2TS:
  131. codec->codec_type = CODEC_TYPE_DATA;
  132. codec->codec_id = CODEC_ID_MPEG2TS;
  133. break;
  134. default:
  135. return -1;
  136. }
  137. return 0;
  138. }
  139. /* return < 0 if unknown payload type */
  140. int rtp_get_payload_type(AVCodecContext *codec)
  141. {
  142. int payload_type;
  143. /* compute the payload type */
  144. payload_type = -1;
  145. switch(codec->codec_id) {
  146. case CODEC_ID_PCM_MULAW:
  147. payload_type = RTP_PT_ULAW;
  148. break;
  149. case CODEC_ID_PCM_ALAW:
  150. payload_type = RTP_PT_ALAW;
  151. break;
  152. case CODEC_ID_PCM_S16BE:
  153. if (codec->channels == 1) {
  154. payload_type = RTP_PT_S16BE_MONO;
  155. } else if (codec->channels == 2) {
  156. payload_type = RTP_PT_S16BE_STEREO;
  157. }
  158. break;
  159. case CODEC_ID_MP2:
  160. case CODEC_ID_MP3:
  161. payload_type = RTP_PT_MPEGAUDIO;
  162. break;
  163. case CODEC_ID_MJPEG:
  164. payload_type = RTP_PT_JPEG;
  165. break;
  166. case CODEC_ID_MPEG1VIDEO:
  167. payload_type = RTP_PT_MPEGVIDEO;
  168. break;
  169. case CODEC_ID_MPEG2TS:
  170. payload_type = RTP_PT_MPEG2TS;
  171. break;
  172. default:
  173. break;
  174. }
  175. return payload_type;
  176. }
  177. static inline uint32_t decode_be32(const uint8_t *p)
  178. {
  179. return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
  180. }
  181. static inline uint64_t decode_be64(const uint8_t *p)
  182. {
  183. return ((uint64_t)decode_be32(p) << 32) | decode_be32(p + 4);
  184. }
  185. static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len)
  186. {
  187. if (buf[1] != 200)
  188. return -1;
  189. s->last_rtcp_ntp_time = decode_be64(buf + 8);
  190. if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE)
  191. s->first_rtcp_ntp_time = s->last_rtcp_ntp_time;
  192. s->last_rtcp_timestamp = decode_be32(buf + 16);
  193. return 0;
  194. }
  195. /**
  196. * open a new RTP parse context for stream 'st'. 'st' can be NULL for
  197. * MPEG2TS streams to indicate that they should be demuxed inside the
  198. * rtp demux (otherwise CODEC_ID_MPEG2TS packets are returned)
  199. */
  200. RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, int payload_type)
  201. {
  202. RTPDemuxContext *s;
  203. s = av_mallocz(sizeof(RTPDemuxContext));
  204. if (!s)
  205. return NULL;
  206. s->payload_type = payload_type;
  207. s->last_rtcp_ntp_time = AV_NOPTS_VALUE;
  208. s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
  209. s->ic = s1;
  210. s->st = st;
  211. if (payload_type == RTP_PT_MPEG2TS) {
  212. s->ts = mpegts_parse_open(s->ic);
  213. if (s->ts == NULL) {
  214. av_free(s);
  215. return NULL;
  216. }
  217. } else {
  218. switch(st->codec.codec_id) {
  219. case CODEC_ID_MPEG1VIDEO:
  220. case CODEC_ID_MPEG2VIDEO:
  221. case CODEC_ID_MP2:
  222. case CODEC_ID_MP3:
  223. case CODEC_ID_MPEG4:
  224. st->need_parsing = 1;
  225. break;
  226. default:
  227. break;
  228. }
  229. }
  230. return s;
  231. }
  232. /**
  233. * Parse an RTP or RTCP packet directly sent as a buffer.
  234. * @param s RTP parse context.
  235. * @param pkt returned packet
  236. * @param buf input buffer or NULL to read the next packets
  237. * @param len buffer len
  238. * @return 0 if a packet is returned, 1 if a packet is returned and more can follow
  239. * (use buf as NULL to read the next). -1 if no packet (error or no more packet).
  240. */
  241. int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
  242. const uint8_t *buf, int len)
  243. {
  244. unsigned int ssrc, h;
  245. int payload_type, seq, delta_timestamp, ret;
  246. AVStream *st;
  247. uint32_t timestamp;
  248. if (!buf) {
  249. /* return the next packets, if any */
  250. if (s->read_buf_index >= s->read_buf_size)
  251. return -1;
  252. ret = mpegts_parse_packet(s->ts, pkt, s->buf + s->read_buf_index,
  253. s->read_buf_size - s->read_buf_index);
  254. if (ret < 0)
  255. return -1;
  256. s->read_buf_index += ret;
  257. if (s->read_buf_index < s->read_buf_size)
  258. return 1;
  259. else
  260. return 0;
  261. }
  262. if (len < 12)
  263. return -1;
  264. if ((buf[0] & 0xc0) != (RTP_VERSION << 6))
  265. return -1;
  266. if (buf[1] >= 200 && buf[1] <= 204) {
  267. rtcp_parse_packet(s, buf, len);
  268. return -1;
  269. }
  270. payload_type = buf[1] & 0x7f;
  271. seq = (buf[2] << 8) | buf[3];
  272. timestamp = decode_be32(buf + 4);
  273. ssrc = decode_be32(buf + 8);
  274. /* NOTE: we can handle only one payload type */
  275. if (s->payload_type != payload_type)
  276. return -1;
  277. #if defined(DEBUG) || 1
  278. if (seq != ((s->seq + 1) & 0xffff)) {
  279. av_log(&s->st->codec, AV_LOG_ERROR, "RTP: PT=%02x: bad cseq %04x expected=%04x\n",
  280. payload_type, seq, ((s->seq + 1) & 0xffff));
  281. }
  282. s->seq = seq;
  283. #endif
  284. len -= 12;
  285. buf += 12;
  286. st = s->st;
  287. if (!st) {
  288. /* specific MPEG2TS demux support */
  289. ret = mpegts_parse_packet(s->ts, pkt, buf, len);
  290. if (ret < 0)
  291. return -1;
  292. if (ret < len) {
  293. s->read_buf_size = len - ret;
  294. memcpy(s->buf, buf + ret, s->read_buf_size);
  295. s->read_buf_index = 0;
  296. return 1;
  297. }
  298. } else {
  299. switch(st->codec.codec_id) {
  300. case CODEC_ID_MP2:
  301. /* better than nothing: skip mpeg audio RTP header */
  302. if (len <= 4)
  303. return -1;
  304. h = decode_be32(buf);
  305. len -= 4;
  306. buf += 4;
  307. av_new_packet(pkt, len);
  308. memcpy(pkt->data, buf, len);
  309. break;
  310. case CODEC_ID_MPEG1VIDEO:
  311. /* better than nothing: skip mpeg video RTP header */
  312. if (len <= 4)
  313. return -1;
  314. h = decode_be32(buf);
  315. buf += 4;
  316. len -= 4;
  317. if (h & (1 << 26)) {
  318. /* mpeg2 */
  319. if (len <= 4)
  320. return -1;
  321. buf += 4;
  322. len -= 4;
  323. }
  324. av_new_packet(pkt, len);
  325. memcpy(pkt->data, buf, len);
  326. break;
  327. default:
  328. av_new_packet(pkt, len);
  329. memcpy(pkt->data, buf, len);
  330. break;
  331. }
  332. switch(st->codec.codec_id) {
  333. case CODEC_ID_MP2:
  334. case CODEC_ID_MPEG1VIDEO:
  335. if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) {
  336. int64_t addend;
  337. /* XXX: is it really necessary to unify the timestamp base ? */
  338. /* compute pts from timestamp with received ntp_time */
  339. delta_timestamp = timestamp - s->last_rtcp_timestamp;
  340. /* convert to 90 kHz without overflow */
  341. addend = (s->last_rtcp_ntp_time - s->first_rtcp_ntp_time) >> 14;
  342. addend = (addend * 5625) >> 14;
  343. pkt->pts = addend + delta_timestamp;
  344. }
  345. break;
  346. default:
  347. /* no timestamp info yet */
  348. break;
  349. }
  350. pkt->stream_index = s->st->index;
  351. }
  352. return 0;
  353. }
  354. void rtp_parse_close(RTPDemuxContext *s)
  355. {
  356. if (s->payload_type == RTP_PT_MPEG2TS) {
  357. mpegts_parse_close(s->ts);
  358. }
  359. av_free(s);
  360. }
  361. /* rtp output */
  362. static int rtp_write_header(AVFormatContext *s1)
  363. {
  364. RTPDemuxContext *s = s1->priv_data;
  365. int payload_type, max_packet_size, n;
  366. AVStream *st;
  367. if (s1->nb_streams != 1)
  368. return -1;
  369. st = s1->streams[0];
  370. payload_type = rtp_get_payload_type(&st->codec);
  371. if (payload_type < 0)
  372. payload_type = RTP_PT_PRIVATE; /* private payload type */
  373. s->payload_type = payload_type;
  374. s->base_timestamp = random();
  375. s->timestamp = s->base_timestamp;
  376. s->ssrc = random();
  377. s->first_packet = 1;
  378. max_packet_size = url_fget_max_packet_size(&s1->pb);
  379. if (max_packet_size <= 12)
  380. return AVERROR_IO;
  381. s->max_payload_size = max_packet_size - 12;
  382. switch(st->codec.codec_id) {
  383. case CODEC_ID_MP2:
  384. case CODEC_ID_MP3:
  385. s->buf_ptr = s->buf + 4;
  386. s->cur_timestamp = 0;
  387. break;
  388. case CODEC_ID_MPEG1VIDEO:
  389. s->cur_timestamp = 0;
  390. break;
  391. case CODEC_ID_MPEG2TS:
  392. n = s->max_payload_size / TS_PACKET_SIZE;
  393. if (n < 1)
  394. n = 1;
  395. s->max_payload_size = n * TS_PACKET_SIZE;
  396. s->buf_ptr = s->buf;
  397. break;
  398. default:
  399. s->buf_ptr = s->buf;
  400. break;
  401. }
  402. return 0;
  403. }
  404. /* send an rtcp sender report packet */
  405. static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time)
  406. {
  407. RTPDemuxContext *s = s1->priv_data;
  408. #if defined(DEBUG)
  409. printf("RTCP: %02x %Lx %x\n", s->payload_type, ntp_time, s->timestamp);
  410. #endif
  411. put_byte(&s1->pb, (RTP_VERSION << 6));
  412. put_byte(&s1->pb, 200);
  413. put_be16(&s1->pb, 6); /* length in words - 1 */
  414. put_be32(&s1->pb, s->ssrc);
  415. put_be64(&s1->pb, ntp_time);
  416. put_be32(&s1->pb, s->timestamp);
  417. put_be32(&s1->pb, s->packet_count);
  418. put_be32(&s1->pb, s->octet_count);
  419. put_flush_packet(&s1->pb);
  420. }
  421. /* send an rtp packet. sequence number is incremented, but the caller
  422. must update the timestamp itself */
  423. static void rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len)
  424. {
  425. RTPDemuxContext *s = s1->priv_data;
  426. #ifdef DEBUG
  427. printf("rtp_send_data size=%d\n", len);
  428. #endif
  429. /* build the RTP header */
  430. put_byte(&s1->pb, (RTP_VERSION << 6));
  431. put_byte(&s1->pb, s->payload_type & 0x7f);
  432. put_be16(&s1->pb, s->seq);
  433. put_be32(&s1->pb, s->timestamp);
  434. put_be32(&s1->pb, s->ssrc);
  435. put_buffer(&s1->pb, buf1, len);
  436. put_flush_packet(&s1->pb);
  437. s->seq++;
  438. s->octet_count += len;
  439. s->packet_count++;
  440. }
  441. /* send an integer number of samples and compute time stamp and fill
  442. the rtp send buffer before sending. */
  443. static void rtp_send_samples(AVFormatContext *s1,
  444. const uint8_t *buf1, int size, int sample_size)
  445. {
  446. RTPDemuxContext *s = s1->priv_data;
  447. int len, max_packet_size, n;
  448. max_packet_size = (s->max_payload_size / sample_size) * sample_size;
  449. /* not needed, but who nows */
  450. if ((size % sample_size) != 0)
  451. av_abort();
  452. while (size > 0) {
  453. len = (max_packet_size - (s->buf_ptr - s->buf));
  454. if (len > size)
  455. len = size;
  456. /* copy data */
  457. memcpy(s->buf_ptr, buf1, len);
  458. s->buf_ptr += len;
  459. buf1 += len;
  460. size -= len;
  461. n = (s->buf_ptr - s->buf);
  462. /* if buffer full, then send it */
  463. if (n >= max_packet_size) {
  464. rtp_send_data(s1, s->buf, n);
  465. s->buf_ptr = s->buf;
  466. /* update timestamp */
  467. s->timestamp += n / sample_size;
  468. }
  469. }
  470. }
  471. /* NOTE: we suppose that exactly one frame is given as argument here */
  472. /* XXX: test it */
  473. static void rtp_send_mpegaudio(AVFormatContext *s1,
  474. const uint8_t *buf1, int size)
  475. {
  476. RTPDemuxContext *s = s1->priv_data;
  477. AVStream *st = s1->streams[0];
  478. int len, count, max_packet_size;
  479. max_packet_size = s->max_payload_size;
  480. /* test if we must flush because not enough space */
  481. len = (s->buf_ptr - s->buf);
  482. if ((len + size) > max_packet_size) {
  483. if (len > 4) {
  484. rtp_send_data(s1, s->buf, s->buf_ptr - s->buf);
  485. s->buf_ptr = s->buf + 4;
  486. /* 90 KHz time stamp */
  487. s->timestamp = s->base_timestamp +
  488. (s->cur_timestamp * 90000LL) / st->codec.sample_rate;
  489. }
  490. }
  491. /* add the packet */
  492. if (size > max_packet_size) {
  493. /* big packet: fragment */
  494. count = 0;
  495. while (size > 0) {
  496. len = max_packet_size - 4;
  497. if (len > size)
  498. len = size;
  499. /* build fragmented packet */
  500. s->buf[0] = 0;
  501. s->buf[1] = 0;
  502. s->buf[2] = count >> 8;
  503. s->buf[3] = count;
  504. memcpy(s->buf + 4, buf1, len);
  505. rtp_send_data(s1, s->buf, len + 4);
  506. size -= len;
  507. buf1 += len;
  508. count += len;
  509. }
  510. } else {
  511. if (s->buf_ptr == s->buf + 4) {
  512. /* no fragmentation possible */
  513. s->buf[0] = 0;
  514. s->buf[1] = 0;
  515. s->buf[2] = 0;
  516. s->buf[3] = 0;
  517. }
  518. memcpy(s->buf_ptr, buf1, size);
  519. s->buf_ptr += size;
  520. }
  521. s->cur_timestamp += st->codec.frame_size;
  522. }
  523. /* NOTE: a single frame must be passed with sequence header if
  524. needed. XXX: use slices. */
  525. static void rtp_send_mpegvideo(AVFormatContext *s1,
  526. const uint8_t *buf1, int size)
  527. {
  528. RTPDemuxContext *s = s1->priv_data;
  529. AVStream *st = s1->streams[0];
  530. int len, h, max_packet_size;
  531. uint8_t *q;
  532. max_packet_size = s->max_payload_size;
  533. while (size > 0) {
  534. /* XXX: more correct headers */
  535. h = 0;
  536. if (st->codec.sub_id == 2)
  537. h |= 1 << 26; /* mpeg 2 indicator */
  538. q = s->buf;
  539. *q++ = h >> 24;
  540. *q++ = h >> 16;
  541. *q++ = h >> 8;
  542. *q++ = h;
  543. if (st->codec.sub_id == 2) {
  544. h = 0;
  545. *q++ = h >> 24;
  546. *q++ = h >> 16;
  547. *q++ = h >> 8;
  548. *q++ = h;
  549. }
  550. len = max_packet_size - (q - s->buf);
  551. if (len > size)
  552. len = size;
  553. memcpy(q, buf1, len);
  554. q += len;
  555. /* 90 KHz time stamp */
  556. s->timestamp = s->base_timestamp +
  557. av_rescale((int64_t)s->cur_timestamp * st->codec.frame_rate_base, 90000, st->codec.frame_rate);
  558. rtp_send_data(s1, s->buf, q - s->buf);
  559. buf1 += len;
  560. size -= len;
  561. }
  562. s->cur_timestamp++;
  563. }
  564. static void rtp_send_raw(AVFormatContext *s1,
  565. const uint8_t *buf1, int size)
  566. {
  567. RTPDemuxContext *s = s1->priv_data;
  568. AVStream *st = s1->streams[0];
  569. int len, max_packet_size;
  570. max_packet_size = s->max_payload_size;
  571. while (size > 0) {
  572. len = max_packet_size;
  573. if (len > size)
  574. len = size;
  575. /* 90 KHz time stamp */
  576. s->timestamp = s->base_timestamp +
  577. av_rescale((int64_t)s->cur_timestamp * st->codec.frame_rate_base, 90000, st->codec.frame_rate);
  578. rtp_send_data(s1, buf1, len);
  579. buf1 += len;
  580. size -= len;
  581. }
  582. s->cur_timestamp++;
  583. }
  584. /* NOTE: size is assumed to be an integer multiple of TS_PACKET_SIZE */
  585. static void rtp_send_mpegts_raw(AVFormatContext *s1,
  586. const uint8_t *buf1, int size)
  587. {
  588. RTPDemuxContext *s = s1->priv_data;
  589. int len, out_len;
  590. while (size >= TS_PACKET_SIZE) {
  591. len = s->max_payload_size - (s->buf_ptr - s->buf);
  592. if (len > size)
  593. len = size;
  594. memcpy(s->buf_ptr, buf1, len);
  595. buf1 += len;
  596. size -= len;
  597. s->buf_ptr += len;
  598. out_len = s->buf_ptr - s->buf;
  599. if (out_len >= s->max_payload_size) {
  600. rtp_send_data(s1, s->buf, out_len);
  601. s->buf_ptr = s->buf;
  602. }
  603. }
  604. }
  605. /* write an RTP packet. 'buf1' must contain a single specific frame. */
  606. static int rtp_write_packet(AVFormatContext *s1, int stream_index,
  607. const uint8_t *buf1, int size, int64_t pts)
  608. {
  609. RTPDemuxContext *s = s1->priv_data;
  610. AVStream *st = s1->streams[0];
  611. int rtcp_bytes;
  612. int64_t ntp_time;
  613. #ifdef DEBUG
  614. printf("%d: write len=%d\n", stream_index, size);
  615. #endif
  616. /* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */
  617. rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
  618. RTCP_TX_RATIO_DEN;
  619. if (s->first_packet || rtcp_bytes >= 28) {
  620. /* compute NTP time */
  621. /* XXX: 90 kHz timestamp hardcoded */
  622. ntp_time = (pts << 28) / 5625;
  623. rtcp_send_sr(s1, ntp_time);
  624. s->last_octet_count = s->octet_count;
  625. s->first_packet = 0;
  626. }
  627. switch(st->codec.codec_id) {
  628. case CODEC_ID_PCM_MULAW:
  629. case CODEC_ID_PCM_ALAW:
  630. case CODEC_ID_PCM_U8:
  631. case CODEC_ID_PCM_S8:
  632. rtp_send_samples(s1, buf1, size, 1 * st->codec.channels);
  633. break;
  634. case CODEC_ID_PCM_U16BE:
  635. case CODEC_ID_PCM_U16LE:
  636. case CODEC_ID_PCM_S16BE:
  637. case CODEC_ID_PCM_S16LE:
  638. rtp_send_samples(s1, buf1, size, 2 * st->codec.channels);
  639. break;
  640. case CODEC_ID_MP2:
  641. case CODEC_ID_MP3:
  642. rtp_send_mpegaudio(s1, buf1, size);
  643. break;
  644. case CODEC_ID_MPEG1VIDEO:
  645. rtp_send_mpegvideo(s1, buf1, size);
  646. break;
  647. case CODEC_ID_MPEG2TS:
  648. rtp_send_mpegts_raw(s1, buf1, size);
  649. break;
  650. default:
  651. /* better than nothing : send the codec raw data */
  652. rtp_send_raw(s1, buf1, size);
  653. break;
  654. }
  655. return 0;
  656. }
  657. static int rtp_write_trailer(AVFormatContext *s1)
  658. {
  659. // RTPDemuxContext *s = s1->priv_data;
  660. return 0;
  661. }
  662. AVOutputFormat rtp_mux = {
  663. "rtp",
  664. "RTP output format",
  665. NULL,
  666. NULL,
  667. sizeof(RTPDemuxContext),
  668. CODEC_ID_PCM_MULAW,
  669. CODEC_ID_NONE,
  670. rtp_write_header,
  671. rtp_write_packet,
  672. rtp_write_trailer,
  673. };
  674. int rtp_init(void)
  675. {
  676. av_register_output_format(&rtp_mux);
  677. return 0;
  678. }