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.

743 lines
22KB

  1. /*
  2. * MPEG2 transport stream (aka DVB) muxer
  3. * Copyright (c) 2003 Fabrice Bellard.
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include "libavutil/bswap.h"
  22. #include "libavutil/crc.h"
  23. #include "avformat.h"
  24. #include "mpegts.h"
  25. /* write DVB SI sections */
  26. /*********************************************/
  27. /* mpegts section writer */
  28. typedef struct MpegTSSection {
  29. int pid;
  30. int cc;
  31. void (*write_packet)(struct MpegTSSection *s, const uint8_t *packet);
  32. void *opaque;
  33. } MpegTSSection;
  34. /* NOTE: 4 bytes must be left at the end for the crc32 */
  35. static void mpegts_write_section(MpegTSSection *s, uint8_t *buf, int len)
  36. {
  37. unsigned int crc;
  38. unsigned char packet[TS_PACKET_SIZE];
  39. const unsigned char *buf_ptr;
  40. unsigned char *q;
  41. int first, b, len1, left;
  42. crc = bswap_32(av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, buf, len - 4));
  43. buf[len - 4] = (crc >> 24) & 0xff;
  44. buf[len - 3] = (crc >> 16) & 0xff;
  45. buf[len - 2] = (crc >> 8) & 0xff;
  46. buf[len - 1] = (crc) & 0xff;
  47. /* send each packet */
  48. buf_ptr = buf;
  49. while (len > 0) {
  50. first = (buf == buf_ptr);
  51. q = packet;
  52. *q++ = 0x47;
  53. b = (s->pid >> 8);
  54. if (first)
  55. b |= 0x40;
  56. *q++ = b;
  57. *q++ = s->pid;
  58. *q++ = 0x10 | s->cc;
  59. s->cc = (s->cc + 1) & 0xf;
  60. if (first)
  61. *q++ = 0; /* 0 offset */
  62. len1 = TS_PACKET_SIZE - (q - packet);
  63. if (len1 > len)
  64. len1 = len;
  65. memcpy(q, buf_ptr, len1);
  66. q += len1;
  67. /* add known padding data */
  68. left = TS_PACKET_SIZE - (q - packet);
  69. if (left > 0)
  70. memset(q, 0xff, left);
  71. s->write_packet(s, packet);
  72. buf_ptr += len1;
  73. len -= len1;
  74. }
  75. }
  76. static inline void put16(uint8_t **q_ptr, int val)
  77. {
  78. uint8_t *q;
  79. q = *q_ptr;
  80. *q++ = val >> 8;
  81. *q++ = val;
  82. *q_ptr = q;
  83. }
  84. static int mpegts_write_section1(MpegTSSection *s, int tid, int id,
  85. int version, int sec_num, int last_sec_num,
  86. uint8_t *buf, int len)
  87. {
  88. uint8_t section[1024], *q;
  89. unsigned int tot_len;
  90. tot_len = 3 + 5 + len + 4;
  91. /* check if not too big */
  92. if (tot_len > 1024)
  93. return -1;
  94. q = section;
  95. *q++ = tid;
  96. put16(&q, 0xb000 | (len + 5 + 4)); /* 5 byte header + 4 byte CRC */
  97. put16(&q, id);
  98. *q++ = 0xc1 | (version << 1); /* current_next_indicator = 1 */
  99. *q++ = sec_num;
  100. *q++ = last_sec_num;
  101. memcpy(q, buf, len);
  102. mpegts_write_section(s, section, tot_len);
  103. return 0;
  104. }
  105. /*********************************************/
  106. /* mpegts writer */
  107. #define DEFAULT_PMT_START_PID 0x1000
  108. #define DEFAULT_START_PID 0x0100
  109. #define DEFAULT_PROVIDER_NAME "FFmpeg"
  110. #define DEFAULT_SERVICE_NAME "Service01"
  111. /* default network id, transport stream and service identifiers */
  112. #define DEFAULT_ONID 0x0001
  113. #define DEFAULT_TSID 0x0001
  114. #define DEFAULT_SID 0x0001
  115. /* a PES packet header is generated every DEFAULT_PES_HEADER_FREQ packets */
  116. #define DEFAULT_PES_HEADER_FREQ 16
  117. #define DEFAULT_PES_PAYLOAD_SIZE ((DEFAULT_PES_HEADER_FREQ - 1) * 184 + 170)
  118. /* we retransmit the SI info at this rate */
  119. #define SDT_RETRANS_TIME 500
  120. #define PAT_RETRANS_TIME 100
  121. #define PCR_RETRANS_TIME 20
  122. typedef struct MpegTSWriteStream {
  123. struct MpegTSService *service;
  124. int pid; /* stream associated pid */
  125. int cc;
  126. int payload_index;
  127. int64_t payload_pts;
  128. int64_t payload_dts;
  129. uint8_t payload[DEFAULT_PES_PAYLOAD_SIZE];
  130. } MpegTSWriteStream;
  131. typedef struct MpegTSService {
  132. MpegTSSection pmt; /* MPEG2 pmt table context */
  133. int sid; /* service ID */
  134. char *name;
  135. char *provider_name;
  136. int pcr_pid;
  137. int pcr_packet_count;
  138. int pcr_packet_freq;
  139. } MpegTSService;
  140. typedef struct MpegTSWrite {
  141. MpegTSSection pat; /* MPEG2 pat table */
  142. MpegTSSection sdt; /* MPEG2 sdt table context */
  143. MpegTSService **services;
  144. int sdt_packet_count;
  145. int sdt_packet_freq;
  146. int pat_packet_count;
  147. int pat_packet_freq;
  148. int nb_services;
  149. int onid;
  150. int tsid;
  151. } MpegTSWrite;
  152. static void mpegts_write_pat(AVFormatContext *s)
  153. {
  154. MpegTSWrite *ts = s->priv_data;
  155. MpegTSService *service;
  156. uint8_t data[1012], *q;
  157. int i;
  158. q = data;
  159. for(i = 0; i < ts->nb_services; i++) {
  160. service = ts->services[i];
  161. put16(&q, service->sid);
  162. put16(&q, 0xe000 | service->pmt.pid);
  163. }
  164. mpegts_write_section1(&ts->pat, PAT_TID, ts->tsid, 0, 0, 0,
  165. data, q - data);
  166. }
  167. static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
  168. {
  169. // MpegTSWrite *ts = s->priv_data;
  170. uint8_t data[1012], *q, *desc_length_ptr, *program_info_length_ptr;
  171. int val, stream_type, i;
  172. q = data;
  173. put16(&q, 0xe000 | service->pcr_pid);
  174. program_info_length_ptr = q;
  175. q += 2; /* patched after */
  176. /* put program info here */
  177. val = 0xf000 | (q - program_info_length_ptr - 2);
  178. program_info_length_ptr[0] = val >> 8;
  179. program_info_length_ptr[1] = val;
  180. for(i = 0; i < s->nb_streams; i++) {
  181. AVStream *st = s->streams[i];
  182. MpegTSWriteStream *ts_st = st->priv_data;
  183. switch(st->codec->codec_id) {
  184. case CODEC_ID_MPEG1VIDEO:
  185. case CODEC_ID_MPEG2VIDEO:
  186. stream_type = STREAM_TYPE_VIDEO_MPEG2;
  187. break;
  188. case CODEC_ID_MPEG4:
  189. stream_type = STREAM_TYPE_VIDEO_MPEG4;
  190. break;
  191. case CODEC_ID_H264:
  192. stream_type = STREAM_TYPE_VIDEO_H264;
  193. break;
  194. case CODEC_ID_DIRAC:
  195. stream_type = STREAM_TYPE_VIDEO_DIRAC;
  196. break;
  197. case CODEC_ID_MP2:
  198. case CODEC_ID_MP3:
  199. stream_type = STREAM_TYPE_AUDIO_MPEG1;
  200. break;
  201. case CODEC_ID_AAC:
  202. stream_type = STREAM_TYPE_AUDIO_AAC;
  203. break;
  204. case CODEC_ID_AC3:
  205. stream_type = STREAM_TYPE_AUDIO_AC3;
  206. break;
  207. default:
  208. stream_type = STREAM_TYPE_PRIVATE_DATA;
  209. break;
  210. }
  211. *q++ = stream_type;
  212. put16(&q, 0xe000 | ts_st->pid);
  213. desc_length_ptr = q;
  214. q += 2; /* patched after */
  215. /* write optional descriptors here */
  216. switch(st->codec->codec_type) {
  217. case CODEC_TYPE_AUDIO:
  218. if (strlen(st->language) == 3) {
  219. *q++ = 0x0a; /* ISO 639 language descriptor */
  220. *q++ = 4;
  221. *q++ = st->language[0];
  222. *q++ = st->language[1];
  223. *q++ = st->language[2];
  224. *q++ = 0; /* undefined type */
  225. }
  226. break;
  227. case CODEC_TYPE_SUBTITLE:
  228. {
  229. const char *language;
  230. language = st->language;
  231. if (strlen(language) != 3)
  232. language = "eng";
  233. *q++ = 0x59;
  234. *q++ = 8;
  235. *q++ = language[0];
  236. *q++ = language[1];
  237. *q++ = language[2];
  238. *q++ = 0x10; /* normal subtitles (0x20 = if hearing pb) */
  239. put16(&q, 1); /* page id */
  240. put16(&q, 1); /* ancillary page id */
  241. }
  242. break;
  243. case CODEC_TYPE_VIDEO:
  244. if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
  245. *q++ = 0x05; /*MPEG-2 registration descriptor*/
  246. *q++ = 4;
  247. *q++ = 'd';
  248. *q++ = 'r';
  249. *q++ = 'a';
  250. *q++ = 'c';
  251. }
  252. break;
  253. }
  254. val = 0xf000 | (q - desc_length_ptr - 2);
  255. desc_length_ptr[0] = val >> 8;
  256. desc_length_ptr[1] = val;
  257. }
  258. mpegts_write_section1(&service->pmt, PMT_TID, service->sid, 0, 0, 0,
  259. data, q - data);
  260. }
  261. /* NOTE: str == NULL is accepted for an empty string */
  262. static void putstr8(uint8_t **q_ptr, const char *str)
  263. {
  264. uint8_t *q;
  265. int len;
  266. q = *q_ptr;
  267. if (!str)
  268. len = 0;
  269. else
  270. len = strlen(str);
  271. *q++ = len;
  272. memcpy(q, str, len);
  273. q += len;
  274. *q_ptr = q;
  275. }
  276. static void mpegts_write_sdt(AVFormatContext *s)
  277. {
  278. MpegTSWrite *ts = s->priv_data;
  279. MpegTSService *service;
  280. uint8_t data[1012], *q, *desc_list_len_ptr, *desc_len_ptr;
  281. int i, running_status, free_ca_mode, val;
  282. q = data;
  283. put16(&q, ts->onid);
  284. *q++ = 0xff;
  285. for(i = 0; i < ts->nb_services; i++) {
  286. service = ts->services[i];
  287. put16(&q, service->sid);
  288. *q++ = 0xfc | 0x00; /* currently no EIT info */
  289. desc_list_len_ptr = q;
  290. q += 2;
  291. running_status = 4; /* running */
  292. free_ca_mode = 0;
  293. /* write only one descriptor for the service name and provider */
  294. *q++ = 0x48;
  295. desc_len_ptr = q;
  296. q++;
  297. *q++ = 0x01; /* digital television service */
  298. putstr8(&q, service->provider_name);
  299. putstr8(&q, service->name);
  300. desc_len_ptr[0] = q - desc_len_ptr - 1;
  301. /* fill descriptor length */
  302. val = (running_status << 13) | (free_ca_mode << 12) |
  303. (q - desc_list_len_ptr - 2);
  304. desc_list_len_ptr[0] = val >> 8;
  305. desc_list_len_ptr[1] = val;
  306. }
  307. mpegts_write_section1(&ts->sdt, SDT_TID, ts->tsid, 0, 0, 0,
  308. data, q - data);
  309. }
  310. static MpegTSService *mpegts_add_service(MpegTSWrite *ts,
  311. int sid,
  312. const char *provider_name,
  313. const char *name)
  314. {
  315. MpegTSService *service;
  316. service = av_mallocz(sizeof(MpegTSService));
  317. if (!service)
  318. return NULL;
  319. service->pmt.pid = DEFAULT_PMT_START_PID + ts->nb_services - 1;
  320. service->sid = sid;
  321. service->provider_name = av_strdup(provider_name);
  322. service->name = av_strdup(name);
  323. service->pcr_pid = 0x1fff;
  324. dynarray_add(&ts->services, &ts->nb_services, service);
  325. return service;
  326. }
  327. static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
  328. {
  329. AVFormatContext *ctx = s->opaque;
  330. put_buffer(ctx->pb, packet, TS_PACKET_SIZE);
  331. }
  332. static int mpegts_write_header(AVFormatContext *s)
  333. {
  334. MpegTSWrite *ts = s->priv_data;
  335. MpegTSWriteStream *ts_st;
  336. MpegTSService *service;
  337. AVStream *st;
  338. int i, total_bit_rate;
  339. const char *service_name;
  340. ts->tsid = DEFAULT_TSID;
  341. ts->onid = DEFAULT_ONID;
  342. /* allocate a single DVB service */
  343. service_name = s->title;
  344. if (service_name[0] == '\0')
  345. service_name = DEFAULT_SERVICE_NAME;
  346. service = mpegts_add_service(ts, DEFAULT_SID,
  347. DEFAULT_PROVIDER_NAME, service_name);
  348. service->pmt.write_packet = section_write_packet;
  349. service->pmt.opaque = s;
  350. ts->pat.pid = PAT_PID;
  351. ts->pat.cc = 0;
  352. ts->pat.write_packet = section_write_packet;
  353. ts->pat.opaque = s;
  354. ts->sdt.pid = SDT_PID;
  355. ts->sdt.cc = 0;
  356. ts->sdt.write_packet = section_write_packet;
  357. ts->sdt.opaque = s;
  358. /* assign pids to each stream */
  359. total_bit_rate = 0;
  360. for(i = 0;i < s->nb_streams; i++) {
  361. st = s->streams[i];
  362. ts_st = av_mallocz(sizeof(MpegTSWriteStream));
  363. if (!ts_st)
  364. goto fail;
  365. st->priv_data = ts_st;
  366. ts_st->service = service;
  367. ts_st->pid = DEFAULT_START_PID + i;
  368. ts_st->payload_pts = AV_NOPTS_VALUE;
  369. ts_st->payload_dts = AV_NOPTS_VALUE;
  370. /* update PCR pid by using the first video stream */
  371. if (st->codec->codec_type == CODEC_TYPE_VIDEO &&
  372. service->pcr_pid == 0x1fff)
  373. service->pcr_pid = ts_st->pid;
  374. total_bit_rate += st->codec->bit_rate;
  375. }
  376. /* if no video stream, use the first stream as PCR */
  377. if (service->pcr_pid == 0x1fff && s->nb_streams > 0) {
  378. ts_st = s->streams[0]->priv_data;
  379. service->pcr_pid = ts_st->pid;
  380. }
  381. if (total_bit_rate <= 8 * 1024)
  382. total_bit_rate = 8 * 1024;
  383. service->pcr_packet_freq = (total_bit_rate * PCR_RETRANS_TIME) /
  384. (TS_PACKET_SIZE * 8 * 1000);
  385. ts->sdt_packet_freq = (total_bit_rate * SDT_RETRANS_TIME) /
  386. (TS_PACKET_SIZE * 8 * 1000);
  387. ts->pat_packet_freq = (total_bit_rate * PAT_RETRANS_TIME) /
  388. (TS_PACKET_SIZE * 8 * 1000);
  389. #if 0
  390. printf("%d %d %d\n",
  391. total_bit_rate, ts->sdt_packet_freq, ts->pat_packet_freq);
  392. #endif
  393. /* write info at the start of the file, so that it will be fast to
  394. find them */
  395. mpegts_write_sdt(s);
  396. mpegts_write_pat(s);
  397. for(i = 0; i < ts->nb_services; i++) {
  398. mpegts_write_pmt(s, ts->services[i]);
  399. }
  400. put_flush_packet(s->pb);
  401. return 0;
  402. fail:
  403. for(i = 0;i < s->nb_streams; i++) {
  404. st = s->streams[i];
  405. av_free(st->priv_data);
  406. }
  407. return -1;
  408. }
  409. /* send SDT, PAT and PMT tables regulary */
  410. static void retransmit_si_info(AVFormatContext *s)
  411. {
  412. MpegTSWrite *ts = s->priv_data;
  413. int i;
  414. if (++ts->sdt_packet_count == ts->sdt_packet_freq) {
  415. ts->sdt_packet_count = 0;
  416. mpegts_write_sdt(s);
  417. }
  418. if (++ts->pat_packet_count == ts->pat_packet_freq) {
  419. ts->pat_packet_count = 0;
  420. mpegts_write_pat(s);
  421. for(i = 0; i < ts->nb_services; i++) {
  422. mpegts_write_pmt(s, ts->services[i]);
  423. }
  424. }
  425. }
  426. static void write_pts(uint8_t *q, int fourbits, int64_t pts)
  427. {
  428. int val;
  429. val = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1;
  430. *q++ = val;
  431. val = (((pts >> 15) & 0x7fff) << 1) | 1;
  432. *q++ = val >> 8;
  433. *q++ = val;
  434. val = (((pts) & 0x7fff) << 1) | 1;
  435. *q++ = val >> 8;
  436. *q++ = val;
  437. }
  438. /* NOTE: pes_data contains all the PES packet */
  439. static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
  440. const uint8_t *payload, int payload_size,
  441. int64_t pts, int64_t dts)
  442. {
  443. MpegTSWriteStream *ts_st = st->priv_data;
  444. uint8_t buf[TS_PACKET_SIZE];
  445. uint8_t *q;
  446. int val, is_start, len, header_len, write_pcr, private_code, flags;
  447. int afc_len, stuffing_len;
  448. int64_t pcr = -1; /* avoid warning */
  449. is_start = 1;
  450. while (payload_size > 0) {
  451. retransmit_si_info(s);
  452. write_pcr = 0;
  453. if (ts_st->pid == ts_st->service->pcr_pid) {
  454. ts_st->service->pcr_packet_count++;
  455. if (ts_st->service->pcr_packet_count >=
  456. ts_st->service->pcr_packet_freq) {
  457. ts_st->service->pcr_packet_count = 0;
  458. write_pcr = 1;
  459. /* XXX: this is incorrect, but at least we have a PCR
  460. value */
  461. pcr = pts;
  462. }
  463. }
  464. /* prepare packet header */
  465. q = buf;
  466. *q++ = 0x47;
  467. val = (ts_st->pid >> 8);
  468. if (is_start)
  469. val |= 0x40;
  470. *q++ = val;
  471. *q++ = ts_st->pid;
  472. *q++ = 0x10 | ts_st->cc | (write_pcr ? 0x20 : 0);
  473. ts_st->cc = (ts_st->cc + 1) & 0xf;
  474. if (write_pcr) {
  475. *q++ = 7; /* AFC length */
  476. *q++ = 0x10; /* flags: PCR present */
  477. *q++ = pcr >> 25;
  478. *q++ = pcr >> 17;
  479. *q++ = pcr >> 9;
  480. *q++ = pcr >> 1;
  481. *q++ = (pcr & 1) << 7;
  482. *q++ = 0;
  483. }
  484. if (is_start) {
  485. int pes_extension = 0;
  486. /* write PES header */
  487. *q++ = 0x00;
  488. *q++ = 0x00;
  489. *q++ = 0x01;
  490. private_code = 0;
  491. if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
  492. if (st->codec->codec_id == CODEC_ID_DIRAC) {
  493. *q++ = 0xfd;
  494. } else
  495. *q++ = 0xe0;
  496. } else if (st->codec->codec_type == CODEC_TYPE_AUDIO &&
  497. (st->codec->codec_id == CODEC_ID_MP2 ||
  498. st->codec->codec_id == CODEC_ID_MP3)) {
  499. *q++ = 0xc0;
  500. } else {
  501. *q++ = 0xbd;
  502. if (st->codec->codec_type == CODEC_TYPE_SUBTITLE) {
  503. private_code = 0x20;
  504. }
  505. }
  506. header_len = 0;
  507. flags = 0;
  508. if (pts != AV_NOPTS_VALUE) {
  509. header_len += 5;
  510. flags |= 0x80;
  511. }
  512. if (dts != AV_NOPTS_VALUE) {
  513. header_len += 5;
  514. flags |= 0x40;
  515. }
  516. if (st->codec->codec_type == CODEC_TYPE_VIDEO &&
  517. st->codec->codec_id == CODEC_ID_DIRAC) {
  518. /* set PES_extension_flag */
  519. pes_extension = 1;
  520. flags |= 0x01;
  521. /*
  522. * One byte for PES2 extension flag +
  523. * one byte for extension length +
  524. * one byte for extension id
  525. */
  526. header_len += 3;
  527. }
  528. len = payload_size + header_len + 3;
  529. if (private_code != 0)
  530. len++;
  531. *q++ = len >> 8;
  532. *q++ = len;
  533. val = 0x80;
  534. /* data alignment indicator is required for subtitle data */
  535. if (st->codec->codec_type == CODEC_TYPE_SUBTITLE)
  536. val |= 0x04;
  537. *q++ = val;
  538. *q++ = flags;
  539. *q++ = header_len;
  540. if (pts != AV_NOPTS_VALUE) {
  541. write_pts(q, flags >> 6, pts);
  542. q += 5;
  543. }
  544. if (dts != AV_NOPTS_VALUE) {
  545. write_pts(q, 1, dts);
  546. q += 5;
  547. }
  548. if (pes_extension && st->codec->codec_id == CODEC_ID_DIRAC) {
  549. flags = 0x01; /* set PES_extension_flag_2 */
  550. *q++ = flags;
  551. *q++ = 0x80 | 0x01; /* marker bit + extension length */
  552. /*
  553. * Set the stream id extension flag bit to 0 and
  554. * write the extended stream id
  555. */
  556. *q++ = 0x00 | 0x60;
  557. }
  558. if (private_code != 0)
  559. *q++ = private_code;
  560. is_start = 0;
  561. }
  562. /* header size */
  563. header_len = q - buf;
  564. /* data len */
  565. len = TS_PACKET_SIZE - header_len;
  566. if (len > payload_size)
  567. len = payload_size;
  568. stuffing_len = TS_PACKET_SIZE - header_len - len;
  569. if (stuffing_len > 0) {
  570. /* add stuffing with AFC */
  571. if (buf[3] & 0x20) {
  572. /* stuffing already present: increase its size */
  573. afc_len = buf[4] + 1;
  574. memmove(buf + 4 + afc_len + stuffing_len,
  575. buf + 4 + afc_len,
  576. header_len - (4 + afc_len));
  577. buf[4] += stuffing_len;
  578. memset(buf + 4 + afc_len, 0xff, stuffing_len);
  579. } else {
  580. /* add stuffing */
  581. memmove(buf + 4 + stuffing_len, buf + 4, header_len - 4);
  582. buf[3] |= 0x20;
  583. buf[4] = stuffing_len - 1;
  584. if (stuffing_len >= 2) {
  585. buf[5] = 0x00;
  586. memset(buf + 6, 0xff, stuffing_len - 2);
  587. }
  588. }
  589. }
  590. memcpy(buf + TS_PACKET_SIZE - len, payload, len);
  591. payload += len;
  592. payload_size -= len;
  593. put_buffer(s->pb, buf, TS_PACKET_SIZE);
  594. }
  595. put_flush_packet(s->pb);
  596. }
  597. static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
  598. {
  599. AVStream *st = s->streams[pkt->stream_index];
  600. int size= pkt->size;
  601. uint8_t *buf= pkt->data;
  602. MpegTSWriteStream *ts_st = st->priv_data;
  603. int len, max_payload_size;
  604. if (st->codec->codec_type == CODEC_TYPE_SUBTITLE) {
  605. /* for subtitle, a single PES packet must be generated */
  606. mpegts_write_pes(s, st, buf, size, pkt->pts, AV_NOPTS_VALUE);
  607. return 0;
  608. }
  609. if (st->codec->codec_id == CODEC_ID_DIRAC) {
  610. /* for Dirac, a single PES packet must be generated */
  611. mpegts_write_pes(s, st, buf, size, pkt->pts, pkt->dts);
  612. return 0;
  613. }
  614. max_payload_size = DEFAULT_PES_PAYLOAD_SIZE;
  615. while (size > 0) {
  616. len = max_payload_size - ts_st->payload_index;
  617. if (len > size)
  618. len = size;
  619. memcpy(ts_st->payload + ts_st->payload_index, buf, len);
  620. buf += len;
  621. size -= len;
  622. ts_st->payload_index += len;
  623. if (ts_st->payload_pts == AV_NOPTS_VALUE)
  624. ts_st->payload_pts = pkt->pts;
  625. if (ts_st->payload_dts == AV_NOPTS_VALUE)
  626. ts_st->payload_dts = pkt->dts;
  627. if (ts_st->payload_index >= max_payload_size) {
  628. mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
  629. ts_st->payload_pts, ts_st->payload_dts);
  630. ts_st->payload_pts = AV_NOPTS_VALUE;
  631. ts_st->payload_dts = AV_NOPTS_VALUE;
  632. ts_st->payload_index = 0;
  633. }
  634. }
  635. return 0;
  636. }
  637. static int mpegts_write_end(AVFormatContext *s)
  638. {
  639. MpegTSWrite *ts = s->priv_data;
  640. MpegTSWriteStream *ts_st;
  641. MpegTSService *service;
  642. AVStream *st;
  643. int i;
  644. /* flush current packets */
  645. for(i = 0; i < s->nb_streams; i++) {
  646. st = s->streams[i];
  647. ts_st = st->priv_data;
  648. if (ts_st->payload_index > 0) {
  649. mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
  650. ts_st->payload_pts, ts_st->payload_dts);
  651. }
  652. }
  653. put_flush_packet(s->pb);
  654. for(i = 0; i < ts->nb_services; i++) {
  655. service = ts->services[i];
  656. av_freep(&service->provider_name);
  657. av_freep(&service->name);
  658. av_free(service);
  659. }
  660. av_free(ts->services);
  661. return 0;
  662. }
  663. AVOutputFormat mpegts_muxer = {
  664. "mpegts",
  665. NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),
  666. "video/x-mpegts",
  667. "ts,m2t",
  668. sizeof(MpegTSWrite),
  669. CODEC_ID_MP2,
  670. CODEC_ID_MPEG2VIDEO,
  671. mpegts_write_header,
  672. mpegts_write_packet,
  673. mpegts_write_end,
  674. };