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
29
31
36
37 #define PCR_TIME_BASE 27000000
38
39 /* write DVB SI sections */
40
41 /*********************************************/
42 /* mpegts section writer */
43
50
53 int sid;
/* service ID */
60
61 // service_type values as defined in ETSI 300 468
62 enum {
70 };
86
91
95
97
99 #define MPEGTS_FLAG_REEMIT_PAT_PMT 0x01
100 #define MPEGTS_FLAG_AAC_LATM 0x02
104
107
108 /* a PES packet header is generated every DEFAULT_PES_HEADER_FREQ packets */
109 #define DEFAULT_PES_HEADER_FREQ 16
110 #define DEFAULT_PES_PAYLOAD_SIZE ((DEFAULT_PES_HEADER_FREQ - 1) * 184 + 170)
111
112 /* The section length is 12 bits. The first 2 are set to 0, the remaining
113 * 10 bits should not exceed 1021. */
114 #define SECTION_LENGTH 1020
115
116 /* NOTE: 4 bytes must be left at the end for the crc32 */
118 {
119 unsigned int crc;
121 const unsigned char *buf_ptr;
122 unsigned char *q;
123 int first,
b, len1, left;
124
126 -1, buf, len - 4));
127
128 buf[len - 4] = (crc >> 24) & 0xff;
129 buf[len - 3] = (crc >> 16) & 0xff;
130 buf[len - 2] = (crc >> 8) & 0xff;
131 buf[len - 1] = crc & 0xff;
132
133 /* send each packet */
135 while (len > 0) {
136 first = buf == buf_ptr;
137 q = packet;
138 *q++ = 0x47;
140 if (first)
141 b |= 0x40;
144 s->
cc = s->
cc + 1 & 0xf;
146 if (first)
147 *q++ = 0; /* 0 offset */
149 if (len1 > len)
151 memcpy(q, buf_ptr, len1);
152 q += len1;
153 /* add known padding data */
155 if (left > 0)
156 memset(q, 0xff, left);
157
159
160 buf_ptr += len1;
161 len -= len1;
162 }
163 }
164
166 {
168 q = *q_ptr;
169 *q++ = val >> 8;
171 *q_ptr = q;
172 }
173
175 int version,
int sec_num,
int last_sec_num,
177 {
179 unsigned int tot_len;
180 /* reserved_future_use field must be set to 1 for SDT */
182
183 tot_len = 3 + 5 + len + 4;
184 /* check if not too big */
185 if (tot_len > 1024)
187
188 q = section;
189 *q++ = tid;
190 put16(&q, flags | (len + 5 + 4));
/* 5 byte header + 4 byte CRC */
192 *q++ = 0xc1 | (version << 1); /* current_next_indicator = 1 */
193 *q++ = sec_num;
194 *q++ = last_sec_num;
195 memcpy(q, buf, len);
196
198 return 0;
199 }
200
201 /*********************************************/
202 /* mpegts writer */
203
204 #define DEFAULT_PROVIDER_NAME "FFmpeg"
205 #define DEFAULT_SERVICE_NAME "Service01"
206
207 /* we retransmit the SI info at this rate */
208 #define SDT_RETRANS_TIME 500
209 #define PAT_RETRANS_TIME 100
210 #define PCR_RETRANS_TIME 20
211
214 int pid;
/* stream associated pid */
226
228 {
232 int i;
233
239 }
241 data, q - data);
242 }
243
245 {
248 int val, stream_type, i, err = 0;
249
252
253 program_info_length_ptr = q;
254 q += 2; /* patched after */
255
256 /* put program info here */
257
258 val = 0xf000 | (q - program_info_length_ptr - 2);
259 program_info_length_ptr[0] = val >> 8;
260 program_info_length_ptr[1] =
val;
261
266
268 err = 1;
269 break;
270 }
275 break;
278 break;
281 break;
284 break;
287 break;
290 break;
294 break;
299 break;
302 break;
305 break;
308 break;
311 break;
312 default:
314 break;
315 }
316
317 *q++ = stream_type;
319 desc_length_ptr = q;
320 q += 2; /* patched after */
321
322 /* write optional descriptors here */
326 *q++=0x7a; // EAC3 descriptor see A038 DVB SI
327 *q++=1; // 1 byte, all flags sets to 0
328 *q++=0; // omit all fields...
329 }
331 *q++ = 0x05; /* MPEG-2 registration descriptor*/
332 *q++ = 4;
333 *q++ = 'B';
334 *q++ = 'S';
335 *q++ = 'S';
336 *q++ = 'D';
337 }
338
339 if (lang) {
340 char *p;
341 char *next = lang->
value;
343
344 *q++ = 0x0a; /* ISO 639 language descriptor */
345 len_ptr = q++;
346 *len_ptr = 0;
347
348 for (p = lang->
value; next && *len_ptr < 255 / 4 * 4; p = next + 1) {
350 err = 1;
351 break;
352 }
353 next = strchr(p, ',');
354 if (strlen(p) != 3 && (!next || next != p + 3))
355 continue; /* not a 3-letter code */
356
357 *q++ = *p++;
358 *q++ = *p++;
359 *q++ = *p++;
360
362 *q++ = 0x01;
364 *q++ = 0x02;
366 *q++ = 0x03;
367 else
368 *q++ = 0; /* undefined type */
369
370 *len_ptr += 4;
371 }
372
373 if (*len_ptr == 0)
374 q -= 2; /* no language codes were written */
375 }
376 break;
378 {
379 const char default_language[] = "und";
380 const char *language = lang && strlen(lang->
value) >= 3 ? lang->
value : default_language;
381
384 int extradata_copied = 0;
385
386 *q++ = 0x59; /* subtitling_descriptor */
387 len_ptr = q++;
388
389 while (strlen(language) >= 3) {
390 if (sizeof(data) - (q - data) < 8) { /* 8 bytes per DVB subtitle substream data */
391 err = 1;
392 break;
393 }
394 *q++ = *language++;
395 *q++ = *language++;
396 *q++ = *language++;
397 /* Skip comma */
398 if (*language != '0円')
399 language++;
400
402 *q++ = st->
codec->
extradata[extradata_copied + 4];
/* subtitling_type */
403 memcpy(q, st->
codec->
extradata + extradata_copied, 4);
/* composition_page_id and ancillary_page_id */
404 extradata_copied += 5;
405 q += 4;
406 } else {
407 /* subtitling_type:
408 * 0x10 - normal with no monitor aspect ratio criticality
409 * 0x20 - for the hard of hearing with no monitor aspect ratio criticality */
412 /* support of old 4-byte extradata format */
413 memcpy(q, st->
codec->
extradata, 4);
/* composition_page_id and ancillary_page_id */
414 extradata_copied += 4;
415 q += 4;
416 } else {
417 put16(&q, 1);
/* composition_page_id */
418 put16(&q, 1);
/* ancillary_page_id */
419 }
420 }
421 }
422
423 *len_ptr = q - len_ptr - 1;
426 int extradata_copied = 0;
427
428 /* The descriptor tag. teletext_descriptor */
429 *q++ = 0x56;
430 len_ptr = q++;
431
432 while (strlen(language) >= 3 && q - data < sizeof(data) - 6) {
433 *q++ = *language++;
434 *q++ = *language++;
435 *q++ = *language++;
436 /* Skip comma */
437 if (*language != '0円')
438 language++;
439
442 extradata_copied += 2;
443 q += 2;
444 } else {
445 /* The Teletext descriptor:
446 * teletext_type: This 5-bit field indicates the type of Teletext page indicated. (0x01 Initial Teletext page)
447 * teletext_magazine_number: This is a 3-bit field which identifies the magazine number.
448 * teletext_page_number: This is an 8-bit field giving two 4-bit hex digits identifying the page number. */
449 *q++ = 0x08;
450 *q++ = 0x00;
451 }
452 }
453
454 *len_ptr = q - len_ptr - 1;
455 }
456 }
457 break;
460 *q++ = 0x05; /*MPEG-2 registration descriptor*/
461 *q++ = 4;
462 *q++ = 'd';
463 *q++ = 'r';
464 *q++ = 'a';
465 *q++ = 'c';
466 }
467 break;
470 *q++ = 0x05; /* MPEG-2 registration descriptor */
471 *q++ = 4;
472 *q++ = 'K';
473 *q++ = 'L';
474 *q++ = 'V';
475 *q++ = 'A';
476 }
477 break;
478 }
479
480 val = 0xf000 | (q - desc_length_ptr - 2);
481 desc_length_ptr[0] = val >> 8;
482 desc_length_ptr[1] =
val;
483 }
484
485 if (err)
487 "The PMT section cannot fit stream %d and all following streams.\n"
488 "Try reducing the number of languages in the audio streams "
489 "or the total number of streams.\n", i);
490
492 data, q - data);
493 return 0;
494 }
495
496 /* NOTE: !str is accepted for an empty string */
498 {
501
502 q = *q_ptr;
503 if (!str)
504 len = 0;
505 else
506 len = strlen(str);
508 memcpy(q, str, len);
510 *q_ptr = q;
511 }
512
514 {
518 int i, running_status, free_ca_mode,
val;
519
522 *q++ = 0xff;
526 *q++ = 0xfc | 0x00; /* currently no EIT info */
527 desc_list_len_ptr = q;
528 q += 2;
529 running_status = 4; /* running */
530 free_ca_mode = 0;
531
532 /* write only one descriptor for the service name and provider */
533 *q++ = 0x48;
534 desc_len_ptr = q;
535 q++;
539 desc_len_ptr[0] = q - desc_len_ptr - 1;
540
541 /* fill descriptor length */
542 val = (running_status << 13) | (free_ca_mode << 12) |
543 (q - desc_list_len_ptr - 2);
544 desc_list_len_ptr[0] = val >> 8;
545 desc_list_len_ptr[1] =
val;
546 }
548 data, q - data);
549 }
550
554 {
556
558 if (!service)
566 goto fail;
568 goto fail;
569
570 return service;
571 fail:
576 }
577
579 {
582 }
583
585 {
589 uint32_t tp_extra_header = pcr % 0x3fffffff;
590 tp_extra_header =
AV_RB32(&tp_extra_header);
592 sizeof(tp_extra_header));
593 }
594 }
595
597 {
601 }
602
604 {
610 int i, j;
611 const char *service_name;
613 int *pids;
615
616 if (s->
max_delay < 0)
/* Not set by the caller */
618
619 // round up to a whole number of TS packets
621
624 /* allocate a single DVB service */
626 if (!title)
632 provider_name, service_name);
633
634 if (!service)
636
639 service->
pmt.
cc = 15;
640
642 /* Initialize at 15 so that it wraps and is equal to 0 for the
643 * first packet we write. */
647
652
654 if (!pids) {
656 goto fail;
657 }
658
659 /* assign pids to each stream */
662
664 if (!ts_st) {
666 goto fail;
667 }
669
672
676 goto fail;
677 }
679 /* MPEG pid values < 16 are reserved. Applications which set st->id in
680 * this range are assigned a calculated pid. */
683 }
else if (st->
id < 0x1FFF) {
685 } else {
687 "Invalid stream id %d, must be less than 8191\n", st->
id);
689 goto fail;
690 }
694 goto fail;
695 }
696 for (j = 0; j < i; j++) {
697 if (pids[j] == ts_st->
pid) {
700 goto fail;
701 }
702 }
703 pids[i] = ts_st->
pid;
708 /* update PCR pid by using the first video stream */
712 pcr_st = st;
713 }
720 goto fail;
721 }
727 goto fail;
728 }
731 goto fail;
732 }
734 if (ret != 0)
735 goto fail;
738 if (ret < 0)
739 goto fail;
740 }
741 }
742
744
745 /* if no video stream, use the first stream as PCR */
750 } else
752
760
763 } else {
764 /* Arbitrary values, PAT/PMT will also be written on video key frames */
772 } else {
775 }
776 } else {
777 // max delta PCR 0.1s
778 // TODO: should be avg_frame_rate
781 }
784 }
785
786 // output a PCR as soon as possible
790
793 else
796 "pcr every %d pkts, sdt every %d, pat/pmt every %d pkts\n",
799
803 } else {
805 }
806 }
807
808 return 0;
809
810 fail:
815 if (ts_st) {
820 }
821 }
823 }
824
830 }
833 }
834
835 /* send SDT, PAT and PMT tables regulary */
837 {
839 int i;
840
844 }
850 }
851 }
852
854 {
855 int64_t pcr_low = pcr % 300, pcr_high = pcr / 300;
856
857 *buf++ = pcr_high >> 25;
858 *buf++ = pcr_high >> 17;
859 *buf++ = pcr_high >> 9;
860 *buf++ = pcr_high >> 1;
861 *buf++ = pcr_high << 7 | pcr_low >> 8 | 0x7e;
862 *buf++ = pcr_low;
863
864 return 6;
865 }
866
867 /* Write a single null transport stream packet */
869 {
872
874 *q++ = 0x47;
875 *q++ = 0x00 | 0x1f;
876 *q++ = 0xff;
877 *q++ = 0x10;
881 }
882
883 /* Write a single transport stream packet with a PCR and no payload */
885 {
890
892 *q++ = 0x47;
893 *q++ = ts_st->
pid >> 8;
895 *q++ = 0x20 | ts_st->
cc;
/* Adaptation only */
896 /* Continuity Count field does not increment (see 13818-1 section 2.4.3.3) */
898 *q++ = 0x10; /* Adaptation flags: PCR present */
899
900 /* PCR coded into 6 bytes */
902
903 /* stuffing bytes */
907 }
908
910 {
912
913 val = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1;
915 val = (((pts >> 15) & 0x7fff) << 1) | 1;
916 *q++ = val >> 8;
918 val = (((
pts) & 0x7fff) << 1) | 1;
919 *q++ = val >> 8;
921 }
922
923 /* Set an adaptation field flag in an MPEG-TS packet*/
925 {
926 // expect at least one flag to set
928
929 if ((pkt[3] & 0x20) == 0) {
930 // no AF yet, set adaptation field flag
931 pkt[3] |= 0x20;
932 // 1 byte length, no flags
933 pkt[4] = 1;
934 pkt[5] = 0;
935 }
936 pkt[5] |= flag;
937 }
938
939 /* Extend the adaptation field by size bytes */
941 {
942 // expect already existing adaptation field
945 }
946
947 /* Get a pointer to MPEG-TS payload (right after TS packet header) */
949 {
950 if (pkt[3] & 0x20)
951 return pkt + 5 + pkt[4];
952 else
953 return pkt + 4;
954 }
955
956 /* Add a PES header to the front of the payload, and segment into an integer
957 * number of TS packets. The final TS packet is padded using an oversized
958 * adaptation header to exactly fill the last TS packet.
959 * NOTE: 'payload' contains a complete PES payload. */
961 const uint8_t *payload,
int payload_size,
962 int64_t
pts, int64_t dts,
int key)
963 {
968 int val, is_start,
len, header_len, write_pcr, is_dvb_subtitle, is_dvb_teletext,
flags;
969 int afc_len, stuffing_len;
970 int64_t pcr = -1; /* avoid warning */
973
974 is_start = 1;
975 while (payload_size > 0) {
977 force_pat = 0;
978
979 write_pcr = 0;
981 if (ts->
mux_rate > 1 || is_start)
// VBR pcr period is based on frames
986 write_pcr = 1;
987 }
988 }
989
991 (dts -
get_pcr(ts, s->
pb) / 300) > delay) {
992 /* pcr insert gets priority over null packet insert */
993 if (write_pcr)
995 else
997 /* recalculate write_pcr and possibly retransmit si_info */
998 continue;
999 }
1000
1001 /* prepare packet header */
1003 *q++ = 0x47;
1004 val = ts_st->
pid >> 8;
1005 if (is_start)
1006 val |= 0x40;
1009 ts_st->
cc = ts_st->
cc + 1 & 0xf;
1010 *q++ = 0x10 | ts_st->
cc;
// payload indicator + CC
1012 // set Random Access for key frames
1014 write_pcr = 1;
1017 }
1018 if (write_pcr) {
1021 // add 11, pcr references the last byte of program clock reference base
1024 else
1025 pcr = (dts - delay) * 300;
1030 }
1031 if (is_start) {
1032 int pes_extension = 0;
1033 int pes_header_stuffing_bytes = 0;
1034 /* write PES header */
1035 *q++ = 0x00;
1036 *q++ = 0x00;
1037 *q++ = 0x01;
1038 is_dvb_subtitle = 0;
1039 is_dvb_teletext = 0;
1042 *q++ = 0xfd;
1043 else
1044 *q++ = 0xe0;
1049 *q++ = 0xc0;
1053 *q++ = 0xfd;
1054 } else {
1055 *q++ = 0xbd;
1058 is_dvb_subtitle = 1;
1060 is_dvb_teletext = 1;
1061 }
1062 }
1063 }
1064 header_len = 0;
1065 flags = 0;
1067 header_len += 5;
1068 flags |= 0x80;
1069 }
1071 header_len += 5;
1072 flags |= 0x40;
1073 }
1076 /* set PES_extension_flag */
1077 pes_extension = 1;
1078 flags |= 0x01;
1079
1080 /* One byte for PES2 extension flag +
1081 * one byte for extension length +
1082 * one byte for extension id */
1083 header_len += 3;
1084 }
1085 /* for Blu-ray AC3 Audio the PES Extension flag should be as follow
1086 * otherwise it will not play sound on blu-ray
1087 */
1091 /* set PES_extension_flag */
1092 pes_extension = 1;
1093 flags |= 0x01;
1094 header_len += 3;
1095 }
1096 if (is_dvb_teletext) {
1097 pes_header_stuffing_bytes = 0x24 - header_len;
1098 header_len = 0x24;
1099 }
1100 len = payload_size + header_len + 3;
1101 /* 3 extra bytes should be added to DVB subtitle payload: 0x20 0x00 at the beginning and trailing 0xff */
1102 if (is_dvb_subtitle) {
1103 len += 3;
1104 payload_size++;
1105 }
1106 if (len > 0xffff)
1107 len = 0;
1109 len = 0;
1110 }
1111 *q++ = len >> 8;
1113 val = 0x80;
1114 /* data alignment indicator is required for subtitle and data streams */
1116 val |= 0x04;
1119 *q++ = header_len;
1122 q += 5;
1123 }
1126 q += 5;
1127 }
1129 flags = 0x01; /* set PES_extension_flag_2 */
1131 *q++ = 0x80 | 0x01; /* marker bit + extension length */
1132 /* Set the stream ID extension flag bit to 0 and
1133 * write the extended stream ID. */
1134 *q++ = 0x00 | 0x60;
1135 }
1136 /* For Blu-ray AC3 Audio Setting extended flags */
1138 pes_extension &&
1140 flags = 0x01; /* set PES_extension_flag_2 */
1142 *q++ = 0x80 | 0x01; /* marker bit + extension length */
1143 *q++ = 0x00 | 0x71; /* for AC3 Audio (specifically on blue-rays) */
1144 }
1145
1146
1147 if (is_dvb_subtitle) {
1148 /* First two fields of DVB subtitles PES data:
1149 * data_identifier: for DVB subtitle streams shall be coded with the value 0x20
1150 * subtitle_stream_id: for DVB subtitle stream shall be identified by the value 0x00 */
1151 *q++ = 0x20;
1152 *q++ = 0x00;
1153 }
1154 if (is_dvb_teletext) {
1155 memset(q, 0xff, pes_header_stuffing_bytes);
1156 q += pes_header_stuffing_bytes;
1157 }
1158 is_start = 0;
1159 }
1160 /* header size */
1161 header_len = q -
buf;
1162 /* data len */
1164 if (len > payload_size)
1165 len = payload_size;
1167 if (stuffing_len > 0) {
1168 /* add stuffing with AFC */
1169 if (buf[3] & 0x20) {
1170 /* stuffing already present: increase its size */
1171 afc_len = buf[4] + 1;
1172 memmove(buf + 4 + afc_len + stuffing_len,
1173 buf + 4 + afc_len,
1174 header_len - (4 + afc_len));
1175 buf[4] += stuffing_len;
1176 memset(buf + 4 + afc_len, 0xff, stuffing_len);
1177 } else {
1178 /* add stuffing */
1179 memmove(buf + 4 + stuffing_len, buf + 4, header_len - 4);
1180 buf[3] |= 0x20;
1181 buf[4] = stuffing_len - 1;
1182 if (stuffing_len >= 2) {
1183 buf[5] = 0x00;
1184 memset(buf + 6, 0xff, stuffing_len - 2);
1185 }
1186 }
1187 }
1188
1189 if (is_dvb_subtitle && payload_size == len) {
1191 buf[
TS_PACKET_SIZE - 1] = 0xff;
/* end_of_PES_data_field_marker: an 8-bit field with fixed contents 0xff for DVB subtitle */
1192 } else {
1194 }
1195
1197 payload_size -=
len;
1200 }
1202 }
1203
1205 {
1209 "no startcode found, use the video bitstream filter 'h264_mp4toannexb' to fix it "
1210 "('-bsf:v h264_mp4toannexb' option with ffmpeg)\n");
1212 }
1216 }
1217 return 0;
1218 }
1219
1221 {
1226 }
1230 }
1231 return 0;
1232 }
1233
1235 {
1244
1247 "resend_headers option is deprecated, use -mpegts_flags resend_headers\n");
1250 }
1251
1256 }
1257
1262 dts += delay;
1263 }
1264
1268 }
1270
1273 uint32_t
state = -1;
1278
1280 extradd = 0;
1281
1282 do {
1284 av_dlog(s,
"nal %d\n", state & 0x1f);
1285 if ((state & 0x1f) == 7)
1286 extradd = 0;
1287 } while (p < buf_end && (state & 0x1f) != 9 &&
1288 (state & 0x1f) != 5 && (state & 0x1f) != 1);
1289
1290 if ((state & 0x1f) != 5)
1291 extradd = 0;
1292 if ((state & 0x1f) != 9) { // AUD NAL
1294 if (!data)
1297 memcpy(data + 6 + extradd, pkt->
data, pkt->
size);
1299 data[4] = 0x09;
1300 data[5] = 0xf0; // any slice type (0xe) + rbsp stop one bit
1302 size = pkt->
size + 6 + extradd;
1303 }
1305 if (pkt->
size < 2) {
1308 }
1312
1315 "and extradata missing\n");
1317 }
1318
1324
1326 if (ret < 0)
1328
1330 if (ret < 0) {
1333 }
1337 }
1340 if (ret < 0)
1342 }
1343
1345 int i;
1355 }
1356 }
1357 }
1358
1364 }
1365
1368 // for video and subtitle, write a single pes packet
1372 return 0;
1373 }
1374
1379 }
1380
1383
1385
1386 return 0;
1387 }
1388
1390 {
1391 int i;
1392
1393 /* flush current packets */
1402 }
1403 }
1404 }
1405
1407 {
1408 if (!pkt) {
1410 return 1;
1411 } else {
1413 }
1414 }
1415
1417 {
1420 int i;
1421
1424
1432 }
1433 }
1434
1440 }
1442
1443 return 0;
1444 }
1445
1447 { "mpegts_transport_stream_id", "Set transport_stream_id field.",
1450 { "mpegts_original_network_id", "Set original_network_id field.",
1453 { "mpegts_service_id", "Set service_id field.",
1456 { "mpegts_service_type", "Set service_type field.",
1459 { "digital_tv", "Digital Television.",
1462 { "digital_radio", "Digital Radio.",
1465 { "teletext", "Teletext.",
1468 { "advanced_codec_digital_radio", "Advanced Codec Digital Radio.",
1471 { "mpeg2_digital_hdtv", "MPEG2 Digital HDTV.",
1474 { "advanced_codec_digital_sdtv", "Advanced Codec Digital SDTV.",
1477 { "advanced_codec_digital_hdtv", "Advanced Codec Digital HDTV.",
1480 { "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
1483 { "mpegts_start_pid", "Set the first pid.",
1486 { "mpegts_m2ts_mode", "Enable m2ts mode.",
1492 { "pes_payload_size", "Minimum PES packet payload in bytes",
1495 { "mpegts_flags", "MPEG-TS muxing flags",
1498 { "resend_headers", "Reemit PAT/PMT before writing the next packet",
1501 { "latm", "Use LATM packetization for AAC",
1504 // backward compatibility
1505 { "resend_headers", "Reemit PAT/PMT before writing the next packet",
1508 { "mpegts_copyts", "don't offset dts/pts",
1511 { "tables_version", "set PAT, PMT and SDT version",
1514 { "omit_video_pes_length", "Omit the PES packet length for video packets",
1517 { "pcr_period", "PCR retransmission time",
1521 };
1522
1528 };
1529
1533 .mime_type = "video/MP2T",
1534 .extensions = "ts,m2t,m2ts,mts",
1542 .priv_class = &mpegts_muxer_class,
1543 };