1 diff -u a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
2 --- a/libavformat/mpegtsenc.c 2020-06-15 12:54:24.000000000 -0600
3 +++ b/libavformat/mpegtsenc.c 2020-07-10 11:21:45.303839343 -0600
5 int sid; /* service ID */
7 uint8_t provider_name[256];
9 + int64_t pcr, pcr_packet_timer, pcr_packet_period;
10 + int pcr_sid, pcr_pid;
15 MpegTSSection pat; /* MPEG-2 PAT table */
16 MpegTSSection sdt; /* MPEG-2 SDT table context */
17 MpegTSService **services;
18 - int64_t sdt_period; /* SDT period in PCR time base */
19 - int64_t pat_period; /* PAT/PMT period in PCR time base */
20 + int64_t sdt_packet_timer, sdt_packet_period;
21 + int64_t pat_packet_timer, pat_packet_period;
27 + int64_t pcr, first_pcr, delay;
28 int mux_rate; ///< set to 1 when VBR
40 - int m2ts_pgssub_pid;
41 - int m2ts_textsub_pid;
45 + int reemit_pat_pmt; // backward compatibility
48 #define MPEGTS_FLAG_REEMIT_PAT_PMT 0x01
49 #define MPEGTS_FLAG_AAC_LATM 0x02
50 #define MPEGTS_FLAG_PAT_PMT_AT_FRAMES 0x04
55 - int64_t pat_period_us;
56 - int64_t sdt_period_us;
57 - int64_t last_pat_ts;
58 - int64_t last_sdt_ts;
62 int omit_video_pes_length;
67 #define DEFAULT_PROVIDER_NAME "FFmpeg"
68 -#define DEFAULT_SERVICE_NAME "Service"
69 +#define DEFAULT_SERVICE_NAME "Service01"
71 -/* we retransmit the SI info at this rate */
72 +/* we retransmit the SI info at this rate (ms) */
73 #define SDT_RETRANS_TIME 500
74 #define PAT_RETRANS_TIME 100
75 -#define PCR_RETRANS_TIME 20
76 +#define PCR_RETRANS_TIME 50
78 typedef struct MpegTSWriteStream {
79 + struct MpegTSService *service;
80 int pid; /* stream associated pid */
86 AVFormatContext *amux;
87 - int data_st_warning;
89 - int64_t pcr_period; /* PCR period in PCR time base */
94 int opus_queued_samples;
96 put16(&q, service->sid);
97 put16(&q, 0xe000 | service->pmt.pid);
99 - mpegts_write_section1(&ts->pat, PAT_TID, ts->transport_stream_id, ts->tables_version, 0, 0,
100 + mpegts_write_section1(&ts->pat, PAT_TID, ts->tsid, ts->tables_version, 0, 0,
104 @@ -281,148 +279,6 @@
108 -static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
110 - MpegTSWrite *ts = s->priv_data;
111 - MpegTSWriteStream *ts_st = st->priv_data;
114 - switch (st->codecpar->codec_id) {
115 - case AV_CODEC_ID_MPEG1VIDEO:
116 - case AV_CODEC_ID_MPEG2VIDEO:
117 - stream_type = STREAM_TYPE_VIDEO_MPEG2;
119 - case AV_CODEC_ID_MPEG4:
120 - stream_type = STREAM_TYPE_VIDEO_MPEG4;
122 - case AV_CODEC_ID_H264:
123 - stream_type = STREAM_TYPE_VIDEO_H264;
125 - case AV_CODEC_ID_HEVC:
126 - stream_type = STREAM_TYPE_VIDEO_HEVC;
128 - case AV_CODEC_ID_CAVS:
129 - stream_type = STREAM_TYPE_VIDEO_CAVS;
131 - case AV_CODEC_ID_DIRAC:
132 - stream_type = STREAM_TYPE_VIDEO_DIRAC;
134 - case AV_CODEC_ID_VC1:
135 - stream_type = STREAM_TYPE_VIDEO_VC1;
137 - case AV_CODEC_ID_MP2:
138 - case AV_CODEC_ID_MP3:
139 - if ( st->codecpar->sample_rate > 0
140 - && st->codecpar->sample_rate < 32000) {
141 - stream_type = STREAM_TYPE_AUDIO_MPEG2;
143 - stream_type = STREAM_TYPE_AUDIO_MPEG1;
146 - case AV_CODEC_ID_AAC:
147 - stream_type = (ts->flags & MPEGTS_FLAG_AAC_LATM)
148 - ? STREAM_TYPE_AUDIO_AAC_LATM
149 - : STREAM_TYPE_AUDIO_AAC;
151 - case AV_CODEC_ID_AAC_LATM:
152 - stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
154 - case AV_CODEC_ID_AC3:
155 - stream_type = (ts->flags & MPEGTS_FLAG_SYSTEM_B)
156 - ? STREAM_TYPE_PRIVATE_DATA
157 - : STREAM_TYPE_AUDIO_AC3;
159 - case AV_CODEC_ID_EAC3:
160 - stream_type = (ts->flags & MPEGTS_FLAG_SYSTEM_B)
161 - ? STREAM_TYPE_PRIVATE_DATA
162 - : STREAM_TYPE_AUDIO_EAC3;
164 - case AV_CODEC_ID_DTS:
165 - stream_type = STREAM_TYPE_AUDIO_DTS;
167 - case AV_CODEC_ID_TRUEHD:
168 - stream_type = STREAM_TYPE_AUDIO_TRUEHD;
170 - case AV_CODEC_ID_OPUS:
171 - stream_type = STREAM_TYPE_PRIVATE_DATA;
173 - case AV_CODEC_ID_TIMED_ID3:
174 - stream_type = STREAM_TYPE_METADATA;
176 - case AV_CODEC_ID_DVB_SUBTITLE:
177 - case AV_CODEC_ID_DVB_TELETEXT:
178 - stream_type = STREAM_TYPE_PRIVATE_DATA;
180 - case AV_CODEC_ID_SMPTE_KLV:
181 - if (st->codecpar->profile == FF_PROFILE_KLVA_SYNC) {
182 - stream_type = STREAM_TYPE_METADATA;
184 - stream_type = STREAM_TYPE_PRIVATE_DATA;
188 - av_log_once(s, AV_LOG_WARNING, AV_LOG_DEBUG, &ts_st->data_st_warning,
189 - "Stream %d, codec %s, is muxed as a private data stream "
190 - "and may not be recognized upon reading.\n", st->index,
191 - avcodec_get_name(st->codecpar->codec_id));
192 - stream_type = STREAM_TYPE_PRIVATE_DATA;
196 - return stream_type;
199 -static int get_m2ts_stream_type(AVFormatContext *s, AVStream *st)
202 - MpegTSWriteStream *ts_st = st->priv_data;
204 - switch (st->codecpar->codec_id) {
205 - case AV_CODEC_ID_MPEG2VIDEO:
206 - stream_type = STREAM_TYPE_VIDEO_MPEG2;
208 - case AV_CODEC_ID_H264:
209 - stream_type = STREAM_TYPE_VIDEO_H264;
211 - case AV_CODEC_ID_VC1:
212 - stream_type = STREAM_TYPE_VIDEO_VC1;
214 - case AV_CODEC_ID_HEVC:
215 - stream_type = STREAM_TYPE_VIDEO_HEVC;
217 - case AV_CODEC_ID_PCM_BLURAY:
218 - stream_type = 0x80;
220 - case AV_CODEC_ID_AC3:
221 - stream_type = 0x81;
223 - case AV_CODEC_ID_DTS:
224 - stream_type = (st->codecpar->channels > 6) ? 0x85 : 0x82;
226 - case AV_CODEC_ID_TRUEHD:
227 - stream_type = 0x83;
229 - case AV_CODEC_ID_EAC3:
230 - stream_type = 0x84;
232 - case AV_CODEC_ID_HDMV_PGS_SUBTITLE:
233 - stream_type = 0x90;
235 - case AV_CODEC_ID_HDMV_TEXT_SUBTITLE:
236 - stream_type = 0x92;
239 - av_log_once(s, AV_LOG_WARNING, AV_LOG_DEBUG, &ts_st->data_st_warning,
240 - "Stream %d, codec %s, is muxed as a private data stream "
241 - "and may not be recognized upon reading.\n", st->index,
242 - avcodec_get_name(st->codecpar->codec_id));
243 - stream_type = STREAM_TYPE_PRIVATE_DATA;
247 - return stream_type;
250 static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
252 MpegTSWrite *ts = s->priv_data;
254 q += 2; /* patched after */
256 /* put program info here */
257 - if (ts->m2ts_mode) {
258 - put_registration_descriptor(&q, MKTAG('H', 'D', 'M', 'V'));
259 - *q++ = 0x88; // descriptor_tag - hdmv_copy_control_descriptor
260 - *q++ = 0x04; // descriptor_length
261 - put16(&q, 0x0fff); // CA_System_ID
262 - *q++ = 0xfc; // private_data_byte
263 - *q++ = 0xfc; // private_data_byte
266 val = 0xf000 | (q - program_info_length_ptr - 2);
267 program_info_length_ptr[0] = val >> 8;
273 - stream_type = ts->m2ts_mode ? get_m2ts_stream_type(s, st) : get_dvb_stream_type(s, st);
274 + switch (st->codecpar->codec_id) {
275 + case AV_CODEC_ID_MPEG1VIDEO:
276 + case AV_CODEC_ID_MPEG2VIDEO:
277 + stream_type = STREAM_TYPE_VIDEO_MPEG2;
279 + case AV_CODEC_ID_MPEG4:
280 + stream_type = STREAM_TYPE_VIDEO_MPEG4;
282 + case AV_CODEC_ID_H264:
283 + stream_type = STREAM_TYPE_VIDEO_H264;
285 + case AV_CODEC_ID_HEVC:
286 + stream_type = STREAM_TYPE_VIDEO_HEVC;
288 + case AV_CODEC_ID_CAVS:
289 + stream_type = STREAM_TYPE_VIDEO_CAVS;
291 + case AV_CODEC_ID_DIRAC:
292 + stream_type = STREAM_TYPE_VIDEO_DIRAC;
294 + case AV_CODEC_ID_VC1:
295 + stream_type = STREAM_TYPE_VIDEO_VC1;
297 + case AV_CODEC_ID_MP2:
298 + case AV_CODEC_ID_MP3:
299 + if ( st->codecpar->sample_rate > 0
300 + && st->codecpar->sample_rate < 32000) {
301 + stream_type = STREAM_TYPE_AUDIO_MPEG2;
303 + stream_type = STREAM_TYPE_AUDIO_MPEG1;
306 + case AV_CODEC_ID_AAC:
307 + stream_type = (ts->flags & MPEGTS_FLAG_AAC_LATM)
308 + ? STREAM_TYPE_AUDIO_AAC_LATM
309 + : STREAM_TYPE_AUDIO_AAC;
311 + case AV_CODEC_ID_AAC_LATM:
312 + stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
314 + case AV_CODEC_ID_AC3:
315 + stream_type = (ts->flags & MPEGTS_FLAG_SYSTEM_B)
316 + ? STREAM_TYPE_PRIVATE_DATA
317 + : STREAM_TYPE_AUDIO_AC3;
319 + case AV_CODEC_ID_EAC3:
320 + stream_type = (ts->flags & MPEGTS_FLAG_SYSTEM_B)
321 + ? STREAM_TYPE_PRIVATE_DATA
322 + : STREAM_TYPE_AUDIO_EAC3;
324 + case AV_CODEC_ID_DTS:
325 + stream_type = STREAM_TYPE_AUDIO_DTS;
327 + case AV_CODEC_ID_TRUEHD:
328 + stream_type = STREAM_TYPE_AUDIO_TRUEHD;
330 + case AV_CODEC_ID_OPUS:
331 + stream_type = STREAM_TYPE_PRIVATE_DATA;
333 + case AV_CODEC_ID_TIMED_ID3:
334 + stream_type = STREAM_TYPE_METADATA;
337 + stream_type = STREAM_TYPE_PRIVATE_DATA;
342 put16(&q, 0xe000 | ts_st->pid);
344 int i, running_status, free_ca_mode, val;
347 - put16(&q, ts->original_network_id);
348 + put16(&q, ts->onid);
350 for (i = 0; i < ts->nb_services; i++) {
351 service = ts->services[i];
353 desc_list_len_ptr[0] = val >> 8;
354 desc_list_len_ptr[1] = val;
356 - mpegts_write_section1(&ts->sdt, SDT_TID, ts->transport_stream_id, ts->tables_version, 0, 0,
357 + mpegts_write_section1(&ts->sdt, SDT_TID, ts->tsid, ts->tables_version, 0, 0,
361 @@ -802,49 +714,12 @@
365 -static int64_t get_pcr(const MpegTSWrite *ts, AVIOContext *pb)
367 - return av_rescale(avio_tell(pb) + 11, 8 * PCR_TIME_BASE, ts->mux_rate) +
371 -static void write_packet(AVFormatContext *s, const uint8_t *packet)
373 - MpegTSWrite *ts = s->priv_data;
374 - if (ts->m2ts_mode) {
375 - int64_t pcr = get_pcr(s->priv_data, s->pb);
376 - uint32_t tp_extra_header = pcr % 0x3fffffff;
377 - tp_extra_header = AV_RB32(&tp_extra_header);
378 - avio_write(s->pb, (unsigned char *) &tp_extra_header,
379 - sizeof(tp_extra_header));
381 - avio_write(s->pb, packet, TS_PACKET_SIZE);
384 -static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
386 - AVFormatContext *ctx = s->opaque;
387 - write_packet(ctx, packet);
390 static MpegTSService *mpegts_add_service(AVFormatContext *s, int sid,
391 - const AVDictionary *metadata,
392 - AVProgram *program)
393 + const char *provider_name,
396 MpegTSWrite *ts = s->priv_data;
397 MpegTSService *service;
398 - AVDictionaryEntry *title, *provider;
399 - char default_service_name[32];
400 - const char *service_name;
401 - const char *provider_name;
403 - title = av_dict_get(metadata, "service_name", NULL, 0);
405 - title = av_dict_get(metadata, "title", NULL, 0);
406 - snprintf(default_service_name, sizeof(default_service_name), "%s%02d", DEFAULT_SERVICE_NAME, ts->nb_services + 1);
407 - service_name = title ? title->value : default_service_name;
408 - provider = av_dict_get(metadata, "service_provider", NULL, 0);
409 - provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
411 service = av_mallocz(sizeof(MpegTSService));
413 @@ -852,92 +727,57 @@
414 service->pmt.pid = ts->pmt_start_pid + ts->nb_services;
416 service->pcr_pid = 0x1fff;
417 + service->pcr_sid = 0x1fff;
418 if (encode_str8(service->provider_name, provider_name) < 0 ||
419 - encode_str8(service->name, service_name) < 0) {
420 + encode_str8(service->name, name) < 0) {
421 av_log(s, AV_LOG_ERROR, "Too long service or provider name\n");
424 if (av_dynarray_add_nofree(&ts->services, &ts->nb_services, service) < 0)
427 - service->pmt.write_packet = section_write_packet;
428 - service->pmt.opaque = s;
429 - service->pmt.cc = 15;
430 - service->pmt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
431 - service->program = program;
439 -static void enable_pcr_generation_for_stream(AVFormatContext *s, AVStream *pcr_st)
440 +static void mpegts_prefix_m2ts_header(AVFormatContext *s)
442 MpegTSWrite *ts = s->priv_data;
443 - MpegTSWriteStream *ts_st = pcr_st->priv_data;
445 - if (ts->mux_rate > 1 || ts->pcr_period_ms >= 0) {
446 - int pcr_period_ms = ts->pcr_period_ms == -1 ? PCR_RETRANS_TIME : ts->pcr_period_ms;
447 - ts_st->pcr_period = av_rescale(pcr_period_ms, PCR_TIME_BASE, 1000);
449 - /* By default, for VBR we select the highest multiple of frame duration which is less than 100 ms. */
450 - int64_t frame_period = 0;
451 - if (pcr_st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
452 - int frame_size = av_get_audio_frame_duration2(pcr_st->codecpar, 0);
454 - av_log(s, AV_LOG_WARNING, "frame size not set\n");
457 - frame_period = av_rescale_rnd(frame_size, PCR_TIME_BASE, pcr_st->codecpar->sample_rate, AV_ROUND_UP);
458 - } else if (pcr_st->avg_frame_rate.num) {
459 - frame_period = av_rescale_rnd(pcr_st->avg_frame_rate.den, PCR_TIME_BASE, pcr_st->avg_frame_rate.num, AV_ROUND_UP);
461 - if (frame_period > 0 && frame_period <= PCR_TIME_BASE / 10)
462 - ts_st->pcr_period = frame_period * (PCR_TIME_BASE / 10 / frame_period);
464 - ts_st->pcr_period = 1;
465 + if (ts->m2ts_mode) {
466 + uint32_t tp_extra_header = ts->pcr % 0x3fffffff;
467 + tp_extra_header = AV_RB32(&tp_extra_header);
468 + avio_write(s->pb, (unsigned char *) &tp_extra_header,
469 + sizeof(tp_extra_header));
472 - // output a PCR as soon as possible
473 - ts_st->last_pcr = ts->first_pcr - ts_st->pcr_period;
476 -static void select_pcr_streams(AVFormatContext *s)
477 +static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
479 - MpegTSWrite *ts = s->priv_data;
481 - for (int i = 0; i < ts->nb_services; i++) {
482 - MpegTSService *service = ts->services[i];
483 - AVStream *pcr_st = NULL;
484 - AVProgram *program = service->program;
485 - int nb_streams = program ? program->nb_stream_indexes : s->nb_streams;
487 - for (int j = 0; j < nb_streams; j++) {
488 - AVStream *st = s->streams[program ? program->stream_index[j] : j];
490 - pcr_st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
497 - MpegTSWriteStream *ts_st = pcr_st->priv_data;
498 - service->pcr_pid = ts_st->pid;
499 - enable_pcr_generation_for_stream(s, pcr_st);
500 - av_log(s, AV_LOG_VERBOSE, "service %i using PCR in pid=%i, pcr_period=%"PRId64"ms\n",
501 - service->sid, service->pcr_pid, av_rescale(ts_st->pcr_period, 1000, PCR_TIME_BASE));
504 + AVFormatContext *ctx = s->opaque;
505 + mpegts_prefix_m2ts_header(ctx);
506 + avio_write(ctx->pb, packet, TS_PACKET_SIZE);
509 static int mpegts_init(AVFormatContext *s)
511 MpegTSWrite *ts = s->priv_data;
512 + MpegTSWriteStream *ts_st;
513 + MpegTSService *service;
514 + AVStream *st, *pcr_st = NULL;
515 + AVDictionaryEntry *title, *provider;
518 + const char *service_name;
519 + const char *provider_name;
523 + if (s->max_delay < 0) /* Not set by the caller */
525 + ts->delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
527 if (ts->m2ts_mode == -1) {
528 if (av_match_ext(s->url, "m2ts")) {
530 @@ -946,36 +786,53 @@
534 - ts->m2ts_video_pid = M2TS_VIDEO_PID;
535 - ts->m2ts_audio_pid = M2TS_AUDIO_START_PID;
536 - ts->m2ts_pgssub_pid = M2TS_PGSSUB_START_PID;
537 - ts->m2ts_textsub_pid = M2TS_TEXTSUB_PID;
539 - if (ts->m2ts_mode) {
540 - ts->pmt_start_pid = M2TS_PMT_PID;
541 - if (s->nb_programs > 1) {
542 - av_log(s, AV_LOG_ERROR, "Only one program is allowed in m2ts mode!\n");
543 - return AVERROR(EINVAL);
547 - if (s->max_delay < 0) /* Not set by the caller */
550 // round up to a whole number of TS packets
551 ts->pes_payload_size = (ts->pes_payload_size + 14 + 183) / 184 * 184 - 14;
553 + ts->tsid = ts->transport_stream_id;
554 + ts->onid = ts->original_network_id;
555 if (!s->nb_programs) {
556 /* allocate a single DVB service */
557 - if (!mpegts_add_service(s, ts->service_id, s->metadata, NULL))
558 + title = av_dict_get(s->metadata, "service_name", NULL, 0);
560 + title = av_dict_get(s->metadata, "title", NULL, 0);
561 + service_name = title ? title->value : DEFAULT_SERVICE_NAME;
562 + provider = av_dict_get(s->metadata, "service_provider", NULL, 0);
563 + provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
564 + service = mpegts_add_service(s, ts->service_id,
565 + provider_name, service_name);
568 return AVERROR(ENOMEM);
570 + service->pmt.write_packet = section_write_packet;
571 + service->pmt.opaque = s;
572 + service->pmt.cc = 15;
573 + service->pmt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
575 for (i = 0; i < s->nb_programs; i++) {
576 AVProgram *program = s->programs[i];
577 - if (!mpegts_add_service(s, program->id, program->metadata, program))
578 + title = av_dict_get(program->metadata, "service_name", NULL, 0);
580 + title = av_dict_get(program->metadata, "title", NULL, 0);
581 + service_name = title ? title->value : DEFAULT_SERVICE_NAME;
582 + provider = av_dict_get(program->metadata, "service_provider", NULL, 0);
583 + provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
584 + service = mpegts_add_service(s, program->id,
585 + provider_name, service_name);
588 return AVERROR(ENOMEM);
590 + service->pmt.write_packet = section_write_packet;
591 + service->pmt.opaque = s;
592 + service->pmt.cc = 15;
593 + service->pmt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
594 + service->program = program;
597 + if (ts->m2ts_mode > 1)
598 + service->pmt.pid = 0x00ff + ts->service_id;
600 ts->pat.pid = PAT_PID;
601 /* Initialize at 15 so that it wraps and is equal to 0 for the
602 @@ -991,158 +848,175 @@
603 ts->sdt.write_packet = section_write_packet;
606 + pids = av_malloc_array(s->nb_streams, sizeof(*pids));
608 + ret = AVERROR(ENOMEM);
612 /* assign pids to each stream */
613 for (i = 0; i < s->nb_streams; i++) {
614 - AVStream *st = s->streams[i];
615 - MpegTSWriteStream *ts_st;
616 + AVProgram *program;
617 + st = s->streams[i];
619 ts_st = av_mallocz(sizeof(MpegTSWriteStream));
621 - return AVERROR(ENOMEM);
622 + ret = AVERROR(ENOMEM);
625 st->priv_data = ts_st;
627 + ts_st->user_tb = st->time_base;
628 avpriv_set_pts_info(st, 33, 1, 90000);
630 ts_st->payload = av_mallocz(ts->pes_payload_size);
631 if (!ts_st->payload) {
632 - return AVERROR(ENOMEM);
633 + ret = AVERROR(ENOMEM);
637 - /* MPEG pid values < 16 are reserved. Applications which set st->id in
638 - * this range are assigned a calculated pid. */
640 - if (ts->m2ts_mode) {
641 - switch (st->codecpar->codec_type) {
642 - case AVMEDIA_TYPE_VIDEO:
643 - ts_st->pid = ts->m2ts_video_pid++;
644 + program = av_find_program_from_stream(s, NULL, i);
646 + for (j = 0; j < ts->nb_services; j++) {
647 + if (ts->services[j]->program == program) {
648 + service = ts->services[j];
650 - case AVMEDIA_TYPE_AUDIO:
651 - ts_st->pid = ts->m2ts_audio_pid++;
653 - case AVMEDIA_TYPE_SUBTITLE:
654 - switch (st->codecpar->codec_id) {
655 - case AV_CODEC_ID_HDMV_PGS_SUBTITLE:
656 - ts_st->pid = ts->m2ts_pgssub_pid++;
658 - case AV_CODEC_ID_HDMV_TEXT_SUBTITLE:
659 - ts_st->pid = ts->m2ts_textsub_pid++;
664 - if (ts->m2ts_video_pid > M2TS_VIDEO_PID + 1 ||
665 - ts->m2ts_audio_pid > M2TS_AUDIO_START_PID + 32 ||
666 - ts->m2ts_pgssub_pid > M2TS_PGSSUB_START_PID + 32 ||
667 - ts->m2ts_textsub_pid > M2TS_TEXTSUB_PID + 1 ||
669 - av_log(s, AV_LOG_ERROR, "Cannot automatically assign PID for stream %d\n", st->index);
670 - return AVERROR(EINVAL);
673 - ts_st->pid = ts->start_pid + i;
676 - ts_st->pid = st->id;
678 - if (ts_st->pid >= 0x1FFF) {
680 + ts_st->service = service;
681 + /* MPEG pid values < 16 are reserved. Applications which set st->id in
682 + * this range are assigned a calculated pid. */
684 + ts_st->pid = ts->start_pid + i;
685 + } else if (st->id < 0x1FFF) {
686 + ts_st->pid = st->id;
688 av_log(s, AV_LOG_ERROR,
689 "Invalid stream id %d, must be less than 8191\n", st->id);
690 - return AVERROR(EINVAL);
691 + ret = AVERROR(EINVAL);
694 - for (j = 0; j < ts->nb_services; j++) {
695 - if (ts->services[j]->pmt.pid > LAST_OTHER_PID) {
696 - av_log(s, AV_LOG_ERROR,
697 - "Invalid PMT PID %d, must be less than %d\n", ts->services[j]->pmt.pid, LAST_OTHER_PID + 1);
698 - return AVERROR(EINVAL);
700 - if (ts_st->pid == ts->services[j]->pmt.pid) {
701 - av_log(s, AV_LOG_ERROR, "PID %d cannot be both elementary and PMT PID\n", ts_st->pid);
702 - return AVERROR(EINVAL);
704 + if (ts_st->pid == service->pmt.pid) {
705 + av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
706 + ret = AVERROR(EINVAL);
709 for (j = 0; j < i; j++) {
710 - MpegTSWriteStream *ts_st_prev = s->streams[j]->priv_data;
711 - if (ts_st_prev->pid == ts_st->pid) {
712 + if (pids[j] == ts_st->pid) {
713 av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
714 - return AVERROR(EINVAL);
715 + ret = AVERROR(EINVAL);
719 + pids[i] = ts_st->pid;
720 ts_st->payload_pts = AV_NOPTS_VALUE;
721 ts_st->payload_dts = AV_NOPTS_VALUE;
722 ts_st->first_pts_check = 1;
724 ts_st->discontinuity = ts->flags & MPEGTS_FLAG_DISCONT;
725 + /* update PCR pid by using the first video stream */
726 + if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
727 + service->pcr_sid == 0x1fff)
730 if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
731 st->codecpar->extradata_size > 0) {
733 ts_st->amux = avformat_alloc_context();
735 - return AVERROR(ENOMEM);
736 + ret = AVERROR(ENOMEM);
739 ts_st->amux->oformat =
740 av_guess_format((ts->flags & MPEGTS_FLAG_AAC_LATM) ? "latm" : "adts",
742 if (!ts_st->amux->oformat) {
743 - return AVERROR(EINVAL);
744 + ret = AVERROR(EINVAL);
747 if (!(ast = avformat_new_stream(ts_st->amux, NULL))) {
748 - return AVERROR(ENOMEM);
749 + ret = AVERROR(ENOMEM);
752 ret = avcodec_parameters_copy(ast->codecpar, st->codecpar);
756 ast->time_base = st->time_base;
757 ret = avformat_write_header(ts_st->amux, NULL);
762 if (st->codecpar->codec_id == AV_CODEC_ID_OPUS) {
763 ts_st->opus_pending_trim_start = st->codecpar->initial_padding * 48000 / st->codecpar->sample_rate;
769 + /* if no video stream, use the first stream as PCR */
770 + if (!pcr_st && s->nb_streams > 0)
771 + pcr_st = s->streams[0];
773 + av_log(s, AV_LOG_ERROR, "no streams\n");
774 + ret = AVERROR(EINVAL);
777 + ts_st = pcr_st->priv_data;
778 + if (service->pcr_sid == 0x1fff)
779 + service->pcr_sid = ts_st->pid;
780 + if (service->pcr_pid == 0x1fff)
781 + service->pcr_pid = ts->m2ts_mode > 1 ?
782 + 0x1000 + ts->service_id : service->pcr_sid ;
783 + if (service->pmt.pid == service->pcr_pid) {
784 + av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", service->pcr_pid);
785 + ret = AVERROR(EINVAL);
789 + clk_rate = ts->mux_rate > 1 ? ts->mux_rate : PCR_TIME_BASE;
790 + ts->sdt_packet_period = ts->sdt_period < 0 ? -1 : ts->sdt_period/1000 * clk_rate;
791 + ts->pat_packet_period = ts->pat_period/1000 * clk_rate;
792 + service->pcr_packet_period = ts->pcr_period/1000 * clk_rate;
793 + if (service->pcr_packet_period < (TS_PACKET_SIZE*8*10))
794 + service->pcr_packet_period = (TS_PACKET_SIZE*8*10);
795 + av_log(s, AV_LOG_VERBOSE, "clk_rate %f: ticks/pkt %d pcr, %d sdt, %d pmt\n", clk_rate,
796 + (int)service->pcr_packet_period, (int)ts->sdt_packet_period, (int)ts->pat_packet_period);
799 ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);
801 - select_pcr_streams(s);
803 - ts->last_pat_ts = AV_NOPTS_VALUE;
804 - ts->last_sdt_ts = AV_NOPTS_VALUE;
805 - ts->pat_period = av_rescale(ts->pat_period_us, PCR_TIME_BASE, AV_TIME_BASE);
806 - ts->sdt_period = av_rescale(ts->sdt_period_us, PCR_TIME_BASE, AV_TIME_BASE);
807 + // output a PCR as soon as possible
809 + service->pcr_packet_timer = 0;
810 + ts->pat_packet_timer = 0;
811 + ts->sdt_packet_timer = 0;
813 if (ts->mux_rate == 1)
814 av_log(s, AV_LOG_VERBOSE, "muxrate VBR, ");
816 av_log(s, AV_LOG_VERBOSE, "muxrate %d, ", ts->mux_rate);
817 - av_log(s, AV_LOG_VERBOSE,
818 - "sdt every %"PRId64" ms, pat/pmt every %"PRId64" ms\n",
819 - av_rescale(ts->sdt_period, 1000, PCR_TIME_BASE),
820 - av_rescale(ts->pat_period, 1000, PCR_TIME_BASE));
829 /* send SDT, PAT and PMT tables regularly */
830 -static void retransmit_si_info(AVFormatContext *s, int force_pat, int force_sdt, int64_t pcr)
831 +static void retransmit_si_info(AVFormatContext *s, int force_pat, int64_t dts)
833 MpegTSWrite *ts = s->priv_data;
836 - if ((pcr != AV_NOPTS_VALUE && ts->last_sdt_ts == AV_NOPTS_VALUE) ||
837 - (pcr != AV_NOPTS_VALUE && pcr - ts->last_sdt_ts >= ts->sdt_period) ||
840 - if (pcr != AV_NOPTS_VALUE)
841 - ts->last_sdt_ts = FFMAX(pcr, ts->last_sdt_ts);
842 + if ( ts->sdt_packet_period >= 0 && ts->pcr >= ts->sdt_packet_timer ) {
843 + ts->sdt_packet_timer = ts->pcr + ts->sdt_packet_period;
846 - if ((pcr != AV_NOPTS_VALUE && ts->last_pat_ts == AV_NOPTS_VALUE) ||
847 - (pcr != AV_NOPTS_VALUE && pcr - ts->last_pat_ts >= ts->pat_period) ||
849 - if (pcr != AV_NOPTS_VALUE)
850 - ts->last_pat_ts = FFMAX(pcr, ts->last_pat_ts);
851 + if (ts->pcr >= ts->pat_packet_timer || force_pat) {
852 + ts->pat_packet_timer = ts->pcr + ts->pat_packet_period;
854 for (i = 0; i < ts->nb_services; i++)
855 mpegts_write_pmt(s, ts->services[i]);
856 @@ -1175,7 +1049,8 @@
859 memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf));
860 - write_packet(s, buf);
861 + mpegts_prefix_m2ts_header(s);
862 + avio_write(s->pb, buf, TS_PACKET_SIZE);
865 /* Write a single transport stream packet with a PCR and no payload */
866 @@ -1183,13 +1058,14 @@
868 MpegTSWrite *ts = s->priv_data;
869 MpegTSWriteStream *ts_st = st->priv_data;
870 + uint32_t pcr_pid = ts_st->service->pcr_pid;
872 uint8_t buf[TS_PACKET_SIZE];
876 - *q++ = ts_st->pid >> 8;
878 + *q++ = pcr_pid >> 8;
880 *q++ = 0x20 | ts_st->cc; /* Adaptation only */
881 /* Continuity Count field does not increment (see 13818-1 section 2.4.3.3) */
882 *q++ = TS_PACKET_SIZE - 5; /* Adaptation Field Length */
883 @@ -1200,11 +1076,12 @@
886 /* PCR coded into 6 bytes */
887 - q += write_pcr_bits(q, get_pcr(ts, s->pb));
888 + q += write_pcr_bits(q, ts->pcr);
891 memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
892 - write_packet(s, buf);
893 + mpegts_prefix_m2ts_header(s);
894 + avio_write(s->pb, buf, TS_PACKET_SIZE);
897 static void write_pts(uint8_t *q, int fourbits, int64_t pts)
898 @@ -1268,84 +1145,55 @@
900 int val, is_start, len, header_len, write_pcr, is_dvb_subtitle, is_dvb_teletext, flags;
901 int afc_len, stuffing_len;
902 - int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
903 int force_pat = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && key && !ts_st->prev_payload_key;
906 av_assert0(ts_st->payload != buf || st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO);
907 if (ts->flags & MPEGTS_FLAG_PAT_PMT_AT_FRAMES && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
911 - if (ts->flags & MPEGTS_FLAG_REEMIT_PAT_PMT) {
914 - ts->flags &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
918 while (payload_size > 0) {
919 - int64_t pcr = AV_NOPTS_VALUE;
920 - if (ts->mux_rate > 1)
921 - pcr = get_pcr(ts, s->pb);
922 - else if (dts != AV_NOPTS_VALUE)
923 - pcr = (dts - delay) * 300;
924 + ts->pcr = ts->first_pcr + (ts->mux_rate == 1 ?
925 + (dts == AV_NOPTS_VALUE ? 0 : (dts - ts->delay) * 300) :
926 + // add 11, pcr references the last byte of program clock reference base
927 + av_rescale(avio_tell(s->pb) + 11, 8 * PCR_TIME_BASE, ts->mux_rate));
929 - retransmit_si_info(s, force_pat, force_sdt, pcr);
930 + retransmit_si_info(s, force_pat, dts);
935 - if (ts->mux_rate > 1) {
936 - /* Send PCR packets for all PCR streams if needed */
937 - pcr = get_pcr(ts, s->pb);
938 - if (pcr >= ts->next_pcr) {
939 - int64_t next_pcr = INT64_MAX;
940 - for (int i = 0; i < s->nb_streams; i++) {
941 - /* Make the current stream the last, because for that we
942 - * can insert the pcr into the payload later */
943 - int st2_index = i < st->index ? i : (i + 1 == s->nb_streams ? st->index : i + 1);
944 - AVStream *st2 = s->streams[st2_index];
945 - MpegTSWriteStream *ts_st2 = st2->priv_data;
946 - if (ts_st2->pcr_period) {
947 - if (pcr - ts_st2->last_pcr >= ts_st2->pcr_period) {
948 - ts_st2->last_pcr = FFMAX(pcr - ts_st2->pcr_period, ts_st2->last_pcr + ts_st2->pcr_period);
950 - mpegts_insert_pcr_only(s, st2);
951 - pcr = get_pcr(ts, s->pb);
956 - next_pcr = FFMIN(next_pcr, ts_st2->last_pcr + ts_st2->pcr_period);
959 - ts->next_pcr = next_pcr;
961 - if (dts != AV_NOPTS_VALUE && (dts - pcr / 300) > delay) {
962 - /* pcr insert gets priority over null packet insert */
964 - mpegts_insert_pcr_only(s, st);
966 - mpegts_insert_null_packet(s);
967 - /* recalculate write_pcr and possibly retransmit si_info */
970 - } else if (ts_st->pcr_period && pcr != AV_NOPTS_VALUE) {
971 - if (pcr - ts_st->last_pcr >= ts_st->pcr_period && is_start) {
972 - ts_st->last_pcr = FFMAX(pcr - ts_st->pcr_period, ts_st->last_pcr + ts_st->pcr_period);
973 + if (ts_st->pid == ts_st->service->pcr_sid) {
974 + if( ts->pcr >= ts_st->service->pcr_packet_timer ) {
975 + ts_st->service->pcr_packet_timer = ts->pcr + ts_st->service->pcr_packet_period;
979 + if (write_pcr && ts_st->service->pcr_sid != ts_st->service->pcr_pid) {
980 + mpegts_insert_pcr_only(s, st);
983 + if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE &&
984 + (dts - ts->pcr / 300) > ts->delay) {
985 + /* pcr insert gets priority over null packet insert */
987 + mpegts_insert_pcr_only(s, st);
989 + mpegts_insert_null_packet(s);
990 + /* recalculate write_pcr and possibly retransimit si_info */
994 /* prepare packet header */
997 val = ts_st->pid >> 8;
998 - if (ts->m2ts_mode && st->codecpar->codec_id == AV_CODEC_ID_AC3)
1002 + if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
1003 + st->codecpar->codec_id == AV_CODEC_ID_AC3 &&
1004 + ts->m2ts_mode > 1)
1008 ts_st->cc = ts_st->cc + 1 & 0xf;
1009 @@ -1357,7 +1205,7 @@
1011 if (key && is_start && pts != AV_NOPTS_VALUE) {
1012 // set Random Access for key frames
1013 - if (ts_st->pcr_period)
1014 + if (ts_st->pid == ts_st->service->pcr_sid)
1016 set_af_flag(buf, 0x40);
1017 q = get_ts_payload_start(buf);
1018 @@ -1365,10 +1213,10 @@
1020 set_af_flag(buf, 0x10);
1021 q = get_ts_payload_start(buf);
1022 - // add 11, pcr references the last byte of program clock reference base
1023 - if (dts != AV_NOPTS_VALUE && dts < pcr / 300)
1024 + if (ts->mux_rate > 1)
1025 + if (dts != AV_NOPTS_VALUE && dts < ts->pcr / 300)
1026 av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n");
1027 - extend_af(buf, write_pcr_bits(q, pcr));
1028 + extend_af(buf, write_pcr_bits(q, ts->pcr));
1029 q = get_ts_payload_start(buf);
1032 @@ -1439,10 +1287,10 @@
1033 if (ts->m2ts_mode &&
1034 st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
1035 st->codecpar->codec_id == AV_CODEC_ID_AC3) {
1036 - /* set PES_extension_flag */
1037 - pes_extension = 1;
1040 + /* set PES_extension_flag */
1041 + pes_extension = 1;
1045 if (is_dvb_teletext) {
1046 pes_header_stuffing_bytes = 0x24 - header_len;
1047 @@ -1469,11 +1317,13 @@
1050 if (pts != AV_NOPTS_VALUE) {
1051 - write_pts(q, flags >> 6, pts);
1052 + int64_t ts_pts = pts + ts->ts_offset;
1053 + write_pts(q, flags >> 6, ts_pts);
1056 if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
1057 - write_pts(q, 1, dts);
1058 + int64_t ts_dts = dts + ts->ts_offset;
1059 + write_pts(q, 1, ts_dts);
1062 if (pes_extension && st->codecpar->codec_id == AV_CODEC_ID_DIRAC) {
1063 @@ -1485,14 +1335,14 @@
1066 /* For Blu-ray AC3 Audio Setting extended flags */
1067 - if (ts->m2ts_mode &&
1069 - st->codecpar->codec_id == AV_CODEC_ID_AC3) {
1070 - flags = 0x01; /* set PES_extension_flag_2 */
1072 - *q++ = 0x80 | 0x01; /* marker bit + extension length */
1073 - *q++ = 0x00 | 0x71; /* for AC3 Audio (specifically on blue-rays) */
1075 + if (ts->m2ts_mode &&
1077 + st->codecpar->codec_id == AV_CODEC_ID_AC3) {
1078 + flags = 0x01; /* set PES_extension_flag_2 */
1080 + *q++ = 0x80 | 0x01; /* marker bit + extension length */
1081 + *q++ = 0x00 | 0x71; /* for AC3 Audio (specifically on blue-rays) */
1085 if (is_dvb_subtitle) {
1086 @@ -1546,7 +1396,8 @@
1089 payload_size -= len;
1090 - write_packet(s, buf);
1091 + mpegts_prefix_m2ts_header(s);
1092 + avio_write(s->pb, buf, TS_PACKET_SIZE);
1094 ts_st->prev_payload_key = key;
1096 @@ -1643,8 +1494,6 @@
1097 uint8_t *data = NULL;
1098 MpegTSWrite *ts = s->priv_data;
1099 MpegTSWriteStream *ts_st = st->priv_data;
1100 - const int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) * 2;
1101 - const int64_t max_audio_delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) / 2;
1102 int64_t dts = pkt->dts, pts = pkt->pts;
1103 int opus_samples = 0;
1105 @@ -1657,11 +1506,23 @@
1107 stream_id = side_data[0];
1109 + if (ts->reemit_pat_pmt) {
1110 + av_log(s, AV_LOG_WARNING,
1111 + "resend_headers option is deprecated, use -mpegts_flags resend_headers\n");
1112 + ts->reemit_pat_pmt = 0;
1113 + ts->flags |= MPEGTS_FLAG_REEMIT_PAT_PMT;
1116 + if (ts->flags & MPEGTS_FLAG_REEMIT_PAT_PMT) {
1117 + ts->pat_packet_timer = ts->sdt_packet_timer = 0;
1118 + ts->flags &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
1121 if (ts->copyts < 1) {
1122 if (pts != AV_NOPTS_VALUE)
1124 + pts += 2*ts->delay;
1125 if (dts != AV_NOPTS_VALUE)
1127 + dts += 2*ts->delay;
1130 if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
1131 @@ -1724,7 +1585,7 @@
1133 ret = avio_open_dyn_buf(&ts_st->amux->pb);
1136 + return AVERROR(ENOMEM);
1138 ret = av_write_frame(ts_st->amux, &pkt2);
1140 @@ -1755,7 +1616,7 @@
1141 } while (p < buf_end && (state & 0x7e) != 2*35 &&
1142 (state & 0x7e) >= 2*32);
1144 - if ((state & 0x7e) < 2*16 || (state & 0x7e) >= 2*24)
1145 + if ((state & 0x7e) < 2*16 && (state & 0x7e) >= 2*24)
1147 if ((state & 0x7e) != 2*35) { // AUD NAL
1148 data = av_malloc(pkt->size + 7 + extradd);
1149 @@ -1843,9 +1704,25 @@
1153 + if (pkt->dts != AV_NOPTS_VALUE) {
1155 + for(i=0; i<s->nb_streams; i++) {
1156 + AVStream *st2 = s->streams[i];
1157 + MpegTSWriteStream *ts_st2 = st2->priv_data;
1158 + if ( ts_st2->payload_size
1159 + && (ts_st2->payload_dts == AV_NOPTS_VALUE || dts - ts_st2->payload_dts > ts->delay)) {
1160 + mpegts_write_pes(s, st2, ts_st2->payload, ts_st2->payload_size,
1161 + ts_st2->payload_pts, ts_st2->payload_dts,
1162 + ts_st2->payload_flags & AV_PKT_FLAG_KEY, stream_id);
1163 + ts_st2->payload_size = 0;
1168 if (ts_st->payload_size && (ts_st->payload_size + size > ts->pes_payload_size ||
1169 (dts != AV_NOPTS_VALUE && ts_st->payload_dts != AV_NOPTS_VALUE &&
1170 - dts - ts_st->payload_dts >= max_audio_delay) ||
1171 + av_compare_ts(dts - ts_st->payload_dts, st->time_base,
1172 + s->max_delay, AV_TIME_BASE_Q) >= 0) ||
1173 ts_st->opus_queued_samples + opus_samples >= 5760 /* 120ms */)) {
1174 mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
1175 ts_st->payload_pts, ts_st->payload_dts,
1176 @@ -1881,7 +1758,6 @@
1178 static void mpegts_write_flush(AVFormatContext *s)
1180 - MpegTSWrite *ts = s->priv_data;
1183 /* flush current packets */
1184 @@ -1896,12 +1772,6 @@
1185 ts_st->opus_queued_samples = 0;
1189 - if (ts->m2ts_mode) {
1190 - int packets = (avio_tell(s->pb) / (TS_PACKET_SIZE + 4)) % 32;
1191 - while (packets++ < 32)
1192 - mpegts_insert_null_packet(s);
1196 static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
1197 @@ -1969,62 +1839,104 @@
1201 -#define OFFSET(x) offsetof(MpegTSWrite, x)
1202 -#define ENC AV_OPT_FLAG_ENCODING_PARAM
1203 static const AVOption options[] = {
1204 { "mpegts_transport_stream_id", "Set transport_stream_id field.",
1205 - OFFSET(transport_stream_id), AV_OPT_TYPE_INT, { .i64 = 0x0001 }, 0x0001, 0xffff, ENC },
1206 + offsetof(MpegTSWrite, transport_stream_id), AV_OPT_TYPE_INT,
1207 + { .i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1208 { "mpegts_original_network_id", "Set original_network_id field.",
1209 - OFFSET(original_network_id), AV_OPT_TYPE_INT, { .i64 = DVB_PRIVATE_NETWORK_START }, 0x0001, 0xffff, ENC },
1210 + offsetof(MpegTSWrite, original_network_id), AV_OPT_TYPE_INT,
1211 + { .i64 = DVB_PRIVATE_NETWORK_START }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1212 { "mpegts_service_id", "Set service_id field.",
1213 - OFFSET(service_id), AV_OPT_TYPE_INT, { .i64 = 0x0001 }, 0x0001, 0xffff, ENC },
1214 + offsetof(MpegTSWrite, service_id), AV_OPT_TYPE_INT,
1215 + { .i64 = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM },
1216 { "mpegts_service_type", "Set service_type field.",
1217 - OFFSET(service_type), AV_OPT_TYPE_INT, { .i64 = 0x01 }, 0x01, 0xff, ENC, "mpegts_service_type" },
1218 + offsetof(MpegTSWrite, service_type), AV_OPT_TYPE_INT,
1219 + { .i64 = 0x01 }, 0x01, 0xff, AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
1220 { "digital_tv", "Digital Television.",
1221 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_DIGITAL_TV }, 0x01, 0xff, ENC, "mpegts_service_type" },
1222 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_DIGITAL_TV }, 0x01, 0xff,
1223 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
1224 { "digital_radio", "Digital Radio.",
1225 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_DIGITAL_RADIO }, 0x01, 0xff, ENC, "mpegts_service_type" },
1226 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_DIGITAL_RADIO }, 0x01, 0xff,
1227 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
1228 { "teletext", "Teletext.",
1229 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_TELETEXT }, 0x01, 0xff, ENC, "mpegts_service_type" },
1230 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_TELETEXT }, 0x01, 0xff,
1231 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
1232 { "advanced_codec_digital_radio", "Advanced Codec Digital Radio.",
1233 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_RADIO }, 0x01, 0xff, ENC, "mpegts_service_type" },
1234 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_RADIO }, 0x01, 0xff,
1235 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
1236 { "mpeg2_digital_hdtv", "MPEG2 Digital HDTV.",
1237 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_MPEG2_DIGITAL_HDTV }, 0x01, 0xff, ENC, "mpegts_service_type" },
1238 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_MPEG2_DIGITAL_HDTV }, 0x01, 0xff,
1239 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
1240 { "advanced_codec_digital_sdtv", "Advanced Codec Digital SDTV.",
1241 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_SDTV }, 0x01, 0xff, ENC, "mpegts_service_type" },
1242 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_SDTV }, 0x01, 0xff,
1243 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
1244 { "advanced_codec_digital_hdtv", "Advanced Codec Digital HDTV.",
1245 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_HDTV }, 0x01, 0xff, ENC, "mpegts_service_type" },
1246 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_ADVANCED_CODEC_DIGITAL_HDTV }, 0x01, 0xff,
1247 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
1248 { "hevc_digital_hdtv", "HEVC Digital Television Service.",
1249 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_HEVC_DIGITAL_HDTV }, 0x01, 0xff, ENC, "mpegts_service_type" },
1250 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_SERVICE_TYPE_HEVC_DIGITAL_HDTV }, 0x01, 0xff,
1251 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
1252 { "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
1253 - OFFSET(pmt_start_pid), AV_OPT_TYPE_INT, { .i64 = 0x1000 }, FIRST_OTHER_PID, LAST_OTHER_PID, ENC },
1254 + offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT,
1255 + { .i64 = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM },
1256 + { "mpegts_pcr_start_pid", "Set the first pid of the PCR.",
1257 + offsetof(MpegTSWrite, pcr_start_pid), AV_OPT_TYPE_INT,
1258 + { .i64 = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM },
1259 { "mpegts_start_pid", "Set the first pid.",
1260 - OFFSET(start_pid), AV_OPT_TYPE_INT, { .i64 = 0x0100 }, FIRST_OTHER_PID, LAST_OTHER_PID, ENC },
1261 - { "mpegts_m2ts_mode", "Enable m2ts mode.", OFFSET(m2ts_mode), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, ENC },
1262 - { "muxrate", NULL, OFFSET(mux_rate), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, INT_MAX, ENC },
1263 + offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT,
1264 + { .i64 = 0x0100 }, 0x0010, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM },
1265 + { "mpegts_m2ts_mode", "Enable m2ts mode.",
1266 + offsetof(MpegTSWrite, m2ts_mode), AV_OPT_TYPE_BOOL,
1267 + { .i64 = -1 }, -1, 2, AV_OPT_FLAG_ENCODING_PARAM },
1268 + { "mpegts_pcr_offset", "clock offset.",
1269 + offsetof(MpegTSWrite, ts_offset), AV_OPT_TYPE_BOOL,
1270 + { .i64 = 0 }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1271 + { "muxrate", NULL,
1272 + offsetof(MpegTSWrite, mux_rate), AV_OPT_TYPE_INT,
1273 + { .i64 = 1 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1274 { "pes_payload_size", "Minimum PES packet payload in bytes",
1275 - OFFSET(pes_payload_size), AV_OPT_TYPE_INT, { .i64 = DEFAULT_PES_PAYLOAD_SIZE }, 0, INT_MAX, ENC },
1276 - { "mpegts_flags", "MPEG-TS muxing flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, 0, INT_MAX, ENC, "mpegts_flags" },
1277 + offsetof(MpegTSWrite, pes_payload_size), AV_OPT_TYPE_INT,
1278 + { .i64 = DEFAULT_PES_PAYLOAD_SIZE }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1279 + { "mpegts_flags", "MPEG-TS muxing flags",
1280 + offsetof(MpegTSWrite, flags), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, 0, INT_MAX,
1281 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1282 { "resend_headers", "Reemit PAT/PMT before writing the next packet",
1283 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_REEMIT_PAT_PMT }, 0, INT_MAX, ENC, "mpegts_flags" },
1284 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_REEMIT_PAT_PMT }, 0, INT_MAX,
1285 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1286 { "latm", "Use LATM packetization for AAC",
1287 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_AAC_LATM }, 0, INT_MAX, ENC, "mpegts_flags" },
1288 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_AAC_LATM }, 0, INT_MAX,
1289 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1290 { "pat_pmt_at_frames", "Reemit PAT and PMT at each video frame",
1291 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_PAT_PMT_AT_FRAMES}, 0, INT_MAX, ENC, "mpegts_flags" },
1292 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_PAT_PMT_AT_FRAMES}, 0, INT_MAX,
1293 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1294 { "system_b", "Conform to System B (DVB) instead of System A (ATSC)",
1295 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_SYSTEM_B }, 0, INT_MAX, ENC, "mpegts_flags" },
1296 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_SYSTEM_B }, 0, INT_MAX,
1297 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1298 { "initial_discontinuity", "Mark initial packets as discontinuous",
1299 - 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_DISCONT }, 0, INT_MAX, ENC, "mpegts_flags" },
1300 - { "mpegts_copyts", "don't offset dts/pts", OFFSET(copyts), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, ENC },
1301 - { "tables_version", "set PAT, PMT and SDT version", OFFSET(tables_version), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 31, ENC },
1302 + 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_DISCONT }, 0, INT_MAX,
1303 + AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
1304 + // backward compatibility
1305 + { "resend_headers", "Reemit PAT/PMT before writing the next packet",
1306 + offsetof(MpegTSWrite, reemit_pat_pmt), AV_OPT_TYPE_INT,
1307 + { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1308 + { "mpegts_copyts", "don't offset dts/pts",
1309 + offsetof(MpegTSWrite, copyts), AV_OPT_TYPE_BOOL,
1310 + { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM },
1311 + { "tables_version", "set PAT, PMT and SDT version",
1312 + offsetof(MpegTSWrite, tables_version), AV_OPT_TYPE_INT,
1313 + { .i64 = 0 }, 0, 31, AV_OPT_FLAG_ENCODING_PARAM },
1314 { "omit_video_pes_length", "Omit the PES packet length for video packets",
1315 - OFFSET(omit_video_pes_length), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, ENC },
1316 - { "pcr_period", "PCR retransmission time in milliseconds",
1317 - OFFSET(pcr_period_ms), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, ENC },
1318 - { "pat_period", "PAT/PMT retransmission time limit in seconds",
1319 - OFFSET(pat_period_us), AV_OPT_TYPE_DURATION, { .i64 = PAT_RETRANS_TIME * 1000LL }, 0, INT64_MAX, ENC },
1320 - { "sdt_period", "SDT retransmission time limit in seconds",
1321 - OFFSET(sdt_period_us), AV_OPT_TYPE_DURATION, { .i64 = SDT_RETRANS_TIME * 1000LL }, 0, INT64_MAX, ENC },
1322 + offsetof(MpegTSWrite, omit_video_pes_length), AV_OPT_TYPE_BOOL,
1323 + { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
1324 + { "pcr_period", "PCR retransmission time limit in msecs",
1325 + offsetof(MpegTSWrite, pcr_period), AV_OPT_TYPE_DOUBLE,
1326 + { .dbl = PCR_RETRANS_TIME }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1327 + { "pat_period", "PAT/PMT retransmission time limit in msecs",
1328 + offsetof(MpegTSWrite, pat_period), AV_OPT_TYPE_DOUBLE,
1329 + { .dbl = PAT_RETRANS_TIME }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
1330 + { "sdt_period", "SDT retransmission time limit in msecs",
1331 + offsetof(MpegTSWrite, sdt_period), AV_OPT_TYPE_DOUBLE,
1332 + { .dbl = SDT_RETRANS_TIME }, -1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },