no longer need ffmpeg patch0 which was for Termux
[goodguy/cinelerra.git] / cinelerra-5.1 / thirdparty / src / ffmpeg-4.3.patch2
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
4 @@ -56,7 +56,8 @@
5      int sid;           /* service ID */
6      uint8_t name[256];
7      uint8_t provider_name[256];
8 -    int pcr_pid;
9 +    int64_t pcr, pcr_packet_timer, pcr_packet_period;
10 +    int pcr_sid, pcr_pid;
11      AVProgram *program;
12  } MpegTSService;
13  
14 @@ -76,11 +77,12 @@
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;
22      int nb_services;
23 -    int64_t first_pcr;
24 -    int64_t next_pcr;
25 +    int onid;
26 +    int tsid;
27 +    int64_t pcr, first_pcr, delay;
28      int mux_rate; ///< set to 1 when VBR
29      int pes_payload_size;
30  
31 @@ -90,14 +92,14 @@
32      int service_type;
33  
34      int pmt_start_pid;
35 +    int pcr_start_pid;
36      int start_pid;
37      int m2ts_mode;
38 -    int m2ts_video_pid;
39 -    int m2ts_audio_pid;
40 -    int m2ts_pgssub_pid;
41 -    int m2ts_textsub_pid;
42 +    int64_t ts_offset;
43  
44 -    int pcr_period_ms;
45 +    int reemit_pat_pmt; // backward compatibility
46 +
47 +    double pcr_period;
48  #define MPEGTS_FLAG_REEMIT_PAT_PMT  0x01
49  #define MPEGTS_FLAG_AAC_LATM        0x02
50  #define MPEGTS_FLAG_PAT_PMT_AT_FRAMES           0x04
51 @@ -106,10 +108,8 @@
52      int flags;
53      int copyts;
54      int tables_version;
55 -    int64_t pat_period_us;
56 -    int64_t sdt_period_us;
57 -    int64_t last_pat_ts;
58 -    int64_t last_sdt_ts;
59 +    double pat_period;
60 +    double sdt_period;
61  
62      int omit_video_pes_length;
63  } MpegTSWrite;
64 @@ -217,14 +217,15 @@
65  /* mpegts writer */
66  
67  #define DEFAULT_PROVIDER_NAME   "FFmpeg"
68 -#define DEFAULT_SERVICE_NAME    "Service"
69 +#define DEFAULT_SERVICE_NAME    "Service01"
70  
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
77  
78  typedef struct MpegTSWriteStream {
79 +    struct MpegTSService *service;
80      int pid; /* stream associated pid */
81      int cc;
82      int discontinuity;
83 @@ -236,10 +237,7 @@
84      int payload_flags;
85      uint8_t *payload;
86      AVFormatContext *amux;
87 -    int data_st_warning;
88 -
89 -    int64_t pcr_period; /* PCR period in PCR time base */
90 -    int64_t last_pcr;
91 +    AVRational user_tb;
92  
93      /* For Opus */
94      int opus_queued_samples;
95 @@ -259,7 +257,7 @@
96          put16(&q, service->sid);
97          put16(&q, 0xe000 | service->pmt.pid);
98      }
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,
101                            data, q - data);
102  }
103  
104 @@ -281,148 +279,6 @@
105      *q_ptr = q;
106  }
107  
108 -static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
109 -{
110 -    MpegTSWrite *ts = s->priv_data;
111 -    MpegTSWriteStream *ts_st = st->priv_data;
112 -    int stream_type;
113 -
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;
118 -        break;
119 -    case AV_CODEC_ID_MPEG4:
120 -        stream_type = STREAM_TYPE_VIDEO_MPEG4;
121 -        break;
122 -    case AV_CODEC_ID_H264:
123 -        stream_type = STREAM_TYPE_VIDEO_H264;
124 -        break;
125 -    case AV_CODEC_ID_HEVC:
126 -        stream_type = STREAM_TYPE_VIDEO_HEVC;
127 -        break;
128 -    case AV_CODEC_ID_CAVS:
129 -        stream_type = STREAM_TYPE_VIDEO_CAVS;
130 -        break;
131 -    case AV_CODEC_ID_DIRAC:
132 -        stream_type = STREAM_TYPE_VIDEO_DIRAC;
133 -        break;
134 -    case AV_CODEC_ID_VC1:
135 -        stream_type = STREAM_TYPE_VIDEO_VC1;
136 -        break;
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;
142 -        } else {
143 -            stream_type = STREAM_TYPE_AUDIO_MPEG1;
144 -        }
145 -        break;
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;
150 -        break;
151 -    case AV_CODEC_ID_AAC_LATM:
152 -        stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
153 -        break;
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;
158 -        break;
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;
163 -        break;
164 -    case AV_CODEC_ID_DTS:
165 -        stream_type = STREAM_TYPE_AUDIO_DTS;
166 -        break;
167 -    case AV_CODEC_ID_TRUEHD:
168 -        stream_type = STREAM_TYPE_AUDIO_TRUEHD;
169 -        break;
170 -    case AV_CODEC_ID_OPUS:
171 -        stream_type = STREAM_TYPE_PRIVATE_DATA;
172 -        break;
173 -    case AV_CODEC_ID_TIMED_ID3:
174 -        stream_type = STREAM_TYPE_METADATA;
175 -        break;
176 -    case AV_CODEC_ID_DVB_SUBTITLE:
177 -    case AV_CODEC_ID_DVB_TELETEXT:
178 -        stream_type = STREAM_TYPE_PRIVATE_DATA;
179 -        break;
180 -    case AV_CODEC_ID_SMPTE_KLV:
181 -        if (st->codecpar->profile == FF_PROFILE_KLVA_SYNC) {
182 -            stream_type = STREAM_TYPE_METADATA;
183 -        } else {
184 -            stream_type = STREAM_TYPE_PRIVATE_DATA;
185 -        }
186 -        break;
187 -    default:
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;
193 -        break;
194 -    }
195 -
196 -    return stream_type;
197 -}
198 -
199 -static int get_m2ts_stream_type(AVFormatContext *s, AVStream *st)
200 -{
201 -    int stream_type;
202 -    MpegTSWriteStream *ts_st = st->priv_data;
203 -
204 -    switch (st->codecpar->codec_id) {
205 -    case AV_CODEC_ID_MPEG2VIDEO:
206 -        stream_type = STREAM_TYPE_VIDEO_MPEG2;
207 -        break;
208 -    case AV_CODEC_ID_H264:
209 -        stream_type = STREAM_TYPE_VIDEO_H264;
210 -        break;
211 -    case AV_CODEC_ID_VC1:
212 -        stream_type = STREAM_TYPE_VIDEO_VC1;
213 -        break;
214 -    case AV_CODEC_ID_HEVC:
215 -        stream_type = STREAM_TYPE_VIDEO_HEVC;
216 -        break;
217 -    case AV_CODEC_ID_PCM_BLURAY:
218 -        stream_type = 0x80;
219 -        break;
220 -    case AV_CODEC_ID_AC3:
221 -        stream_type = 0x81;
222 -        break;
223 -    case AV_CODEC_ID_DTS:
224 -        stream_type = (st->codecpar->channels > 6) ? 0x85 : 0x82;
225 -        break;
226 -    case AV_CODEC_ID_TRUEHD:
227 -        stream_type = 0x83;
228 -        break;
229 -    case AV_CODEC_ID_EAC3:
230 -        stream_type = 0x84;
231 -        break;
232 -    case AV_CODEC_ID_HDMV_PGS_SUBTITLE:
233 -        stream_type = 0x90;
234 -        break;
235 -    case AV_CODEC_ID_HDMV_TEXT_SUBTITLE:
236 -        stream_type = 0x92;
237 -        break;
238 -    default:
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;
244 -        break;
245 -    }
246 -
247 -    return stream_type;
248 -}
249 -
250  static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
251  {
252      MpegTSWrite *ts = s->priv_data;
253 @@ -436,14 +292,6 @@
254      q += 2; /* patched after */
255  
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
264 -    }
265  
266      val = 0xf000 | (q - program_info_length_ptr - 2);
267      program_info_length_ptr[0] = val >> 8;
268 @@ -472,8 +320,72 @@
269              err = 1;
270              break;
271          }
272 -
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;
278 +            break;
279 +        case AV_CODEC_ID_MPEG4:
280 +            stream_type = STREAM_TYPE_VIDEO_MPEG4;
281 +            break;
282 +        case AV_CODEC_ID_H264:
283 +            stream_type = STREAM_TYPE_VIDEO_H264;
284 +            break;
285 +        case AV_CODEC_ID_HEVC:
286 +            stream_type = STREAM_TYPE_VIDEO_HEVC;
287 +            break;
288 +        case AV_CODEC_ID_CAVS:
289 +            stream_type = STREAM_TYPE_VIDEO_CAVS;
290 +            break;
291 +        case AV_CODEC_ID_DIRAC:
292 +            stream_type = STREAM_TYPE_VIDEO_DIRAC;
293 +            break;
294 +        case AV_CODEC_ID_VC1:
295 +            stream_type = STREAM_TYPE_VIDEO_VC1;
296 +            break;
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;
302 +            } else {
303 +                stream_type = STREAM_TYPE_AUDIO_MPEG1;
304 +            }
305 +            break;
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;
310 +            break;
311 +        case AV_CODEC_ID_AAC_LATM:
312 +            stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
313 +            break;
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;
318 +            break;
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;
323 +            break;
324 +        case AV_CODEC_ID_DTS:
325 +            stream_type = STREAM_TYPE_AUDIO_DTS;
326 +            break;
327 +        case AV_CODEC_ID_TRUEHD:
328 +            stream_type = STREAM_TYPE_AUDIO_TRUEHD;
329 +            break;
330 +        case AV_CODEC_ID_OPUS:
331 +            stream_type = STREAM_TYPE_PRIVATE_DATA;
332 +            break;
333 +        case AV_CODEC_ID_TIMED_ID3:
334 +            stream_type = STREAM_TYPE_METADATA;
335 +            break;
336 +        default:
337 +            stream_type = STREAM_TYPE_PRIVATE_DATA;
338 +            break;
339 +        }
340  
341          *q++ = stream_type;
342          put16(&q, 0xe000 | ts_st->pid);
343 @@ -736,7 +648,7 @@
344      int i, running_status, free_ca_mode, val;
345  
346      q = data;
347 -    put16(&q, ts->original_network_id);
348 +    put16(&q, ts->onid);
349      *q++ = 0xff;
350      for (i = 0; i < ts->nb_services; i++) {
351          service = ts->services[i];
352 @@ -762,7 +674,7 @@
353          desc_list_len_ptr[0] = val >> 8;
354          desc_list_len_ptr[1] = val;
355      }
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,
358                            data, q - data);
359  }
360  
361 @@ -802,49 +714,12 @@
362      return 0;
363  }
364  
365 -static int64_t get_pcr(const MpegTSWrite *ts, AVIOContext *pb)
366 -{
367 -    return av_rescale(avio_tell(pb) + 11, 8 * PCR_TIME_BASE, ts->mux_rate) +
368 -           ts->first_pcr;
369 -}
370 -
371 -static void write_packet(AVFormatContext *s, const uint8_t *packet)
372 -{
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));
380 -    }
381 -    avio_write(s->pb, packet, TS_PACKET_SIZE);
382 -}
383 -
384 -static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
385 -{
386 -    AVFormatContext *ctx = s->opaque;
387 -    write_packet(ctx, packet);
388 -}
389 -
390  static MpegTSService *mpegts_add_service(AVFormatContext *s, int sid,
391 -                                         const AVDictionary *metadata,
392 -                                         AVProgram *program)
393 +                                         const char *provider_name,
394 +                                         const char *name)
395  {
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;
402 -
403 -    title = av_dict_get(metadata, "service_name", NULL, 0);
404 -    if (!title)
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;
410  
411      service = av_mallocz(sizeof(MpegTSService));
412      if (!service)
413 @@ -852,92 +727,57 @@
414      service->pmt.pid       = ts->pmt_start_pid + ts->nb_services;
415      service->sid           = sid;
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");
422          goto fail;
423      }
424      if (av_dynarray_add_nofree(&ts->services, &ts->nb_services, service) < 0)
425          goto fail;
426  
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;
432 -
433      return service;
434  fail:
435      av_free(service);
436      return NULL;
437  }
438  
439 -static void enable_pcr_generation_for_stream(AVFormatContext *s, AVStream *pcr_st)
440 +static void mpegts_prefix_m2ts_header(AVFormatContext *s)
441  {
442      MpegTSWrite *ts = s->priv_data;
443 -    MpegTSWriteStream *ts_st = pcr_st->priv_data;
444 -
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);
448 -    } else {
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);
453 -            if (!frame_size) {
454 -               av_log(s, AV_LOG_WARNING, "frame size not set\n");
455 -               frame_size = 512;
456 -            }
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);
460 -        }
461 -        if (frame_period > 0 && frame_period <= PCR_TIME_BASE / 10)
462 -            ts_st->pcr_period = frame_period * (PCR_TIME_BASE / 10 / frame_period);
463 -        else
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));
470      }
471 -
472 -    // output a PCR as soon as possible
473 -    ts_st->last_pcr   = ts->first_pcr - ts_st->pcr_period;
474  }
475  
476 -static void select_pcr_streams(AVFormatContext *s)
477 +static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
478  {
479 -    MpegTSWrite *ts = s->priv_data;
480 -
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;
486 -
487 -        for (int j = 0; j < nb_streams; j++) {
488 -            AVStream *st = s->streams[program ? program->stream_index[j] : j];
489 -            if (!pcr_st ||
490 -                pcr_st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
491 -            {
492 -                pcr_st = st;
493 -            }
494 -        }
495 -
496 -        if (pcr_st) {
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));
502 -        }
503 -    }
504 +    AVFormatContext *ctx = s->opaque;
505 +    mpegts_prefix_m2ts_header(ctx);
506 +    avio_write(ctx->pb, packet, TS_PACKET_SIZE);
507  }
508  
509  static int mpegts_init(AVFormatContext *s)
510  {
511      MpegTSWrite *ts = s->priv_data;
512 +    MpegTSWriteStream *ts_st;
513 +    MpegTSService *service;
514 +    AVStream *st, *pcr_st = NULL;
515 +    AVDictionaryEntry *title, *provider;
516 +    double clk_rate;
517      int i, j;
518 +    const char *service_name;
519 +    const char *provider_name;
520 +    int *pids;
521      int ret;
522  
523 +    if (s->max_delay < 0) /* Not set by the caller */
524 +        s->max_delay = 0;
525 +    ts->delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
526 +
527      if (ts->m2ts_mode == -1) {
528          if (av_match_ext(s->url, "m2ts")) {
529              ts->m2ts_mode = 1;
530 @@ -946,36 +786,53 @@
531          }
532      }
533  
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;
538 -
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);
544 -        }
545 -    }
546 -
547 -    if (s->max_delay < 0) /* Not set by the caller */
548 -        s->max_delay = 0;
549 -
550      // round up to a whole number of TS packets
551      ts->pes_payload_size = (ts->pes_payload_size + 14 + 183) / 184 * 184 - 14;
552  
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);
559 +        if (!title)
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);
566 +
567 +        if (!service)
568              return AVERROR(ENOMEM);
569 +
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;
574      } else {
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);
579 +            if (!title)
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);
586 +
587 +            if (!service)
588                  return AVERROR(ENOMEM);
589 +
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;
595          }
596      }
597 +    if (ts->m2ts_mode > 1)
598 +        service->pmt.pid = 0x00ff + ts->service_id;
599  
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;
604      ts->sdt.opaque       = s;
605  
606 +    pids = av_malloc_array(s->nb_streams, sizeof(*pids));
607 +    if (!pids) {
608 +        ret = AVERROR(ENOMEM);
609 +        goto fail;
610 +    }
611 +
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];
618  
619          ts_st = av_mallocz(sizeof(MpegTSWriteStream));
620          if (!ts_st) {
621 -            return AVERROR(ENOMEM);
622 +            ret = AVERROR(ENOMEM);
623 +            goto fail;
624          }
625          st->priv_data = ts_st;
626  
627 +        ts_st->user_tb = st->time_base;
628          avpriv_set_pts_info(st, 33, 1, 90000);
629  
630          ts_st->payload = av_mallocz(ts->pes_payload_size);
631          if (!ts_st->payload) {
632 -            return AVERROR(ENOMEM);
633 +            ret = AVERROR(ENOMEM);
634 +            goto fail;
635          }
636  
637 -        /* MPEG pid values < 16 are reserved. Applications which set st->id in
638 -         * this range are assigned a calculated pid. */
639 -        if (st->id < 16) {
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);
645 +        if (program) {
646 +            for (j = 0; j < ts->nb_services; j++) {
647 +                if (ts->services[j]->program == program) {
648 +                    service = ts->services[j];
649                      break;
650 -                case AVMEDIA_TYPE_AUDIO:
651 -                    ts_st->pid = ts->m2ts_audio_pid++;
652 -                    break;
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++;
657 -                        break;
658 -                    case AV_CODEC_ID_HDMV_TEXT_SUBTITLE:
659 -                        ts_st->pid = ts->m2ts_textsub_pid++;
660 -                        break;
661 -                    }
662 -                    break;
663 -                }
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        ||
668 -                    ts_st->pid < 16) {
669 -                    av_log(s, AV_LOG_ERROR, "Cannot automatically assign PID for stream %d\n", st->index);
670 -                    return AVERROR(EINVAL);
671                  }
672 -            } else {
673 -                ts_st->pid = ts->start_pid + i;
674              }
675 -        } else {
676 -            ts_st->pid = st->id;
677          }
678 -        if (ts_st->pid >= 0x1FFF) {
679 +
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. */
683 +        if (st->id < 16) {
684 +            ts_st->pid = ts->start_pid + i;
685 +        } else if (st->id < 0x1FFF) {
686 +            ts_st->pid = st->id;
687 +        } else {
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);
692 +            goto fail;
693          }
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);
699 -            }
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);
703 -            }
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);
707 +            goto fail;
708          }
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);
716 +                goto fail;
717              }
718          }
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;
723          ts_st->cc              = 15;
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)
728 +            pcr_st           = st;
729 +
730          if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
731              st->codecpar->extradata_size > 0) {
732              AVStream *ast;
733              ts_st->amux = avformat_alloc_context();
734              if (!ts_st->amux) {
735 -                return AVERROR(ENOMEM);
736 +                ret = AVERROR(ENOMEM);
737 +                goto fail;
738              }
739              ts_st->amux->oformat =
740                  av_guess_format((ts->flags & MPEGTS_FLAG_AAC_LATM) ? "latm" : "adts",
741                                  NULL, NULL);
742              if (!ts_st->amux->oformat) {
743 -                return AVERROR(EINVAL);
744 +                ret = AVERROR(EINVAL);
745 +                goto fail;
746              }
747              if (!(ast = avformat_new_stream(ts_st->amux, NULL))) {
748 -                return AVERROR(ENOMEM);
749 +                ret = AVERROR(ENOMEM);
750 +                goto fail;
751              }
752              ret = avcodec_parameters_copy(ast->codecpar, st->codecpar);
753              if (ret != 0)
754 -                return ret;
755 +                goto fail;
756              ast->time_base = st->time_base;
757              ret = avformat_write_header(ts_st->amux, NULL);
758              if (ret < 0)
759 -                return ret;
760 +                goto fail;
761          }
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;
764          }
765      }
766  
767 +    av_freep(&pids);
768 +
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];
772 +    if (!pcr_st) {
773 +        av_log(s, AV_LOG_ERROR, "no streams\n");
774 +        ret = AVERROR(EINVAL);
775 +        goto fail;
776 +    }
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);
786 +        goto fail;
787 +    }
788 +
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);
797 +
798      if (ts->copyts < 1)
799          ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);
800  
801 -    select_pcr_streams(s);
802 -
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
808 +    ts->pcr = 0;
809 +    service->pcr_packet_timer = 0;
810 +    ts->pat_packet_timer      = 0;
811 +    ts->sdt_packet_timer      = 0;
812  
813      if (ts->mux_rate == 1)
814          av_log(s, AV_LOG_VERBOSE, "muxrate VBR, ");
815      else
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));
821  
822      return 0;
823 +
824 +fail:
825 +    av_freep(&pids);
826 +    return ret;
827  }
828  
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)
832  {
833      MpegTSWrite *ts = s->priv_data;
834      int i;
835  
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) ||
838 -        force_sdt
839 -    ) {
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;
844          mpegts_write_sdt(s);
845      }
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) ||
848 -        force_pat) {
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;
853          mpegts_write_pat(s);
854          for (i = 0; i < ts->nb_services; i++)
855              mpegts_write_pmt(s, ts->services[i]);
856 @@ -1175,7 +1049,8 @@
857      *q++ = 0xff;
858      *q++ = 0x10;
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);
863  }
864  
865  /* Write a single transport stream packet with a PCR and no payload */
866 @@ -1183,13 +1058,14 @@
867  {
868      MpegTSWrite *ts = s->priv_data;
869      MpegTSWriteStream *ts_st = st->priv_data;
870 +    uint32_t pcr_pid = ts_st->service->pcr_pid;
871      uint8_t *q;
872      uint8_t buf[TS_PACKET_SIZE];
873  
874      q    = buf;
875      *q++ = 0x47;
876 -    *q++ = ts_st->pid >> 8;
877 -    *q++ = ts_st->pid;
878 +    *q++ = pcr_pid >> 8;
879 +    *q++ = pcr_pid;
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 @@
884      }
885  
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);
889  
890      /* stuffing bytes */
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);
895  }
896  
897  static void write_pts(uint8_t *q, int fourbits, int64_t pts)
898 @@ -1268,84 +1145,55 @@
899      uint8_t *q;
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;
904 -    int force_sdt = 0;
905  
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) {
908          force_pat = 1;
909      }
910  
911 -    if (ts->flags & MPEGTS_FLAG_REEMIT_PAT_PMT) {
912 -        force_pat = 1;
913 -        force_sdt = 1;
914 -        ts->flags &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
915 -    }
916 -
917      is_start = 1;
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));
928  
929 -        retransmit_si_info(s, force_pat, force_sdt, pcr);
930 +        retransmit_si_info(s, force_pat, dts);
931          force_pat = 0;
932 -        force_sdt = 0;
933  
934          write_pcr = 0;
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);
949 -                            if (st2 != st) {
950 -                                mpegts_insert_pcr_only(s, st2);
951 -                                pcr = get_pcr(ts, s->pb);
952 -                            } else {
953 -                                write_pcr = 1;
954 -                            }
955 -                        }
956 -                        next_pcr = FFMIN(next_pcr, ts_st2->last_pcr + ts_st2->pcr_period);
957 -                    }
958 -                }
959 -                ts->next_pcr = next_pcr;
960 -            }
961 -            if (dts != AV_NOPTS_VALUE && (dts - pcr / 300) > delay) {
962 -                /* pcr insert gets priority over null packet insert */
963 -                if (write_pcr)
964 -                    mpegts_insert_pcr_only(s, st);
965 -                else
966 -                    mpegts_insert_null_packet(s);
967 -                /* recalculate write_pcr and possibly retransmit si_info */
968 -                continue;
969 -            }
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;
976                  write_pcr = 1;
977              }
978          }
979 +        if (write_pcr && ts_st->service->pcr_sid != ts_st->service->pcr_pid) {
980 +           mpegts_insert_pcr_only(s, st);
981 +           continue;
982 +        }
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 */
986 +           if (write_pcr)
987 +               mpegts_insert_pcr_only(s, st);
988 +            else
989 +               mpegts_insert_null_packet(s);
990 +            /* recalculate write_pcr and possibly retransimit si_info */
991 +            continue;
992 +        }
993  
994          /* prepare packet header */
995          q    = buf;
996          *q++ = 0x47;
997          val  = ts_st->pid >> 8;
998 -        if (ts->m2ts_mode && st->codecpar->codec_id == AV_CODEC_ID_AC3)
999 -            val |= 0x20;
1000          if (is_start)
1001              val |= 0x40;
1002 +        if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
1003 +          st->codecpar->codec_id == AV_CODEC_ID_AC3 &&
1004 +          ts->m2ts_mode > 1)
1005 +            val |= 0x20;
1006          *q++      = val;
1007          *q++      = ts_st->pid;
1008          ts_st->cc = ts_st->cc + 1 & 0xf;
1009 @@ -1357,7 +1205,7 @@
1010          }
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)
1015                  write_pcr = 1;
1016              set_af_flag(buf, 0x40);
1017              q = get_ts_payload_start(buf);
1018 @@ -1365,10 +1213,10 @@
1019          if (write_pcr) {
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);
1030          }
1031          if (is_start) {
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;
1038 -                flags |= 0x01;
1039 -                header_len += 3;
1040 +                        /* set PES_extension_flag */
1041 +                        pes_extension = 1;
1042 +                        flags |= 0x01;
1043 +                        header_len += 3;
1044              }
1045              if (is_dvb_teletext) {
1046                  pes_header_stuffing_bytes = 0x24 - header_len;
1047 @@ -1469,11 +1317,13 @@
1048              *q++ = flags;
1049              *q++ = header_len;
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);
1054                  q += 5;
1055              }
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);
1060                  q += 5;
1061              }
1062              if (pes_extension && st->codecpar->codec_id == AV_CODEC_ID_DIRAC) {
1063 @@ -1485,14 +1335,14 @@
1064                  *q++ = 0x00 | 0x60;
1065              }
1066              /* For Blu-ray AC3 Audio Setting extended flags */
1067 -            if (ts->m2ts_mode &&
1068 -                pes_extension &&
1069 -                st->codecpar->codec_id == AV_CODEC_ID_AC3) {
1070 -                flags = 0x01; /* set PES_extension_flag_2 */
1071 -                *q++ = flags;
1072 -                *q++ = 0x80 | 0x01; /* marker bit + extension length */
1073 -                *q++ = 0x00 | 0x71; /* for AC3 Audio (specifically on blue-rays) */
1074 -            }
1075 +          if (ts->m2ts_mode &&
1076 +              pes_extension &&
1077 +              st->codecpar->codec_id == AV_CODEC_ID_AC3) {
1078 +                      flags = 0x01; /* set PES_extension_flag_2 */
1079 +                      *q++ = flags;
1080 +                      *q++ = 0x80 | 0x01; /* marker bit + extension length */
1081 +                      *q++ = 0x00 | 0x71; /* for AC3 Audio (specifically on blue-rays) */
1082 +              }
1083  
1084  
1085              if (is_dvb_subtitle) {
1086 @@ -1546,7 +1396,8 @@
1087  
1088          payload      += len;
1089          payload_size -= len;
1090 -        write_packet(s, buf);
1091 +        mpegts_prefix_m2ts_header(s);
1092 +        avio_write(s->pb, buf, TS_PACKET_SIZE);
1093      }
1094      ts_st->prev_payload_key = key;
1095  }
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;
1104      int side_data_size;
1105 @@ -1657,11 +1506,23 @@
1106      if (side_data)
1107          stream_id = side_data[0];
1108  
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;
1114 +    }
1115 +
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;
1119 +    }
1120 +
1121      if (ts->copyts < 1) {
1122          if (pts != AV_NOPTS_VALUE)
1123 -            pts += delay;
1124 +            pts += 2*ts->delay;
1125          if (dts != AV_NOPTS_VALUE)
1126 -            dts += delay;
1127 +            dts += 2*ts->delay;
1128      }
1129  
1130      if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
1131 @@ -1724,7 +1585,7 @@
1132  
1133              ret = avio_open_dyn_buf(&ts_st->amux->pb);
1134              if (ret < 0)
1135 -                return ret;
1136 +                return AVERROR(ENOMEM);
1137  
1138              ret = av_write_frame(ts_st->amux, &pkt2);
1139              if (ret < 0) {
1140 @@ -1755,7 +1616,7 @@
1141          } while (p < buf_end && (state & 0x7e) != 2*35 &&
1142                   (state & 0x7e) >= 2*32);
1143  
1144 -        if ((state & 0x7e) < 2*16 || (state & 0x7e) >= 2*24)
1145 +        if ((state & 0x7e) < 2*16 && (state & 0x7e) >= 2*24)
1146              extradd = 0;
1147          if ((state & 0x7e) != 2*35) { // AUD NAL
1148              data = av_malloc(pkt->size + 7 + extradd);
1149 @@ -1843,9 +1704,25 @@
1150          }
1151      }
1152  
1153 +    if (pkt->dts != AV_NOPTS_VALUE) {
1154 +        int i;
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;
1164 +            }
1165 +        }
1166 +    }
1167 +
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 @@
1177  
1178  static void mpegts_write_flush(AVFormatContext *s)
1179  {
1180 -    MpegTSWrite *ts = s->priv_data;
1181      int i;
1182  
1183      /* flush current packets */
1184 @@ -1896,12 +1772,6 @@
1185              ts_st->opus_queued_samples = 0;
1186          }
1187      }
1188 -
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);
1193 -    }
1194  }
1195  
1196  static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
1197 @@ -1969,62 +1839,104 @@
1198      return ret;
1199  }
1200  
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 },
1333      { NULL },
1334  };
1335