VBR for ffmpeg mpegts, user mount for udf images, widget fixes
[goodguy/history.git] / cinelerra-5.1 / thirdparty / src / ffmpeg.patch4
1 --- a/libavformat/mpegtsenc.c   2017-02-02 10:53:52.235702393 -0700
2 +++ b/libavformat/mpegtsenc.c   2017-02-02 11:53:38.863560974 -0700
3 @@ -55,9 +55,8 @@
4      int sid;           /* service ID */
5      char *name;
6      char *provider_name;
7 -    int pcr_pid;
8 -    int pcr_packet_count;
9 -    int pcr_packet_period;
10 +    int64_t pcr, pcr_packet_timer, pcr_packet_period;
11 +    int pcr_sid, pcr_pid;
12      AVProgram *program;
13  } MpegTSService;
14  
15 @@ -77,14 +76,12 @@
16      MpegTSSection pat; /* MPEG-2 PAT table */
17      MpegTSSection sdt; /* MPEG-2 SDT table context */
18      MpegTSService **services;
19 -    int sdt_packet_count;
20 -    int sdt_packet_period;
21 -    int pat_packet_count;
22 -    int pat_packet_period;
23 +    int64_t sdt_packet_timer, sdt_packet_period;
24 +    int64_t pat_packet_timer, pat_packet_period;
25      int nb_services;
26      int onid;
27      int tsid;
28 -    int64_t first_pcr;
29 +    int64_t pcr, first_pcr, delay;
30      int mux_rate; ///< set to 1 when VBR
31      int pes_payload_size;
32  
33 @@ -94,12 +91,14 @@
34      int service_type;
35  
36      int pmt_start_pid;
37 +    int pcr_start_pid;
38      int start_pid;
39      int m2ts_mode;
40 +    int64_t ts_offset;
41  
42      int reemit_pat_pmt; // backward compatibility
43  
44 -    int pcr_period;
45 +    double pcr_period;
46  #define MPEGTS_FLAG_REEMIT_PAT_PMT  0x01
47  #define MPEGTS_FLAG_AAC_LATM        0x02
48  #define MPEGTS_FLAG_PAT_PMT_AT_FRAMES           0x04
49 @@ -109,8 +108,6 @@
50      int tables_version;
51      double pat_period;
52      double sdt_period;
53 -    int64_t last_pat_ts;
54 -    int64_t last_sdt_ts;
55  
56      int omit_video_pes_length;
57  } MpegTSWrite;
58 @@ -214,10 +211,10 @@
59  #define DEFAULT_PROVIDER_NAME   "FFmpeg"
60  #define DEFAULT_SERVICE_NAME    "Service01"
61  
62 -/* we retransmit the SI info at this rate */
63 +/* we retransmit the SI info at this rate (ms) */
64  #define SDT_RETRANS_TIME 500
65  #define PAT_RETRANS_TIME 100
66 -#define PCR_RETRANS_TIME 20
67 +#define PCR_RETRANS_TIME 50
68  
69  typedef struct MpegTSWriteStream {
70      struct MpegTSService *service;
71 @@ -704,6 +701,7 @@
72      service->pmt.pid       = ts->pmt_start_pid + ts->nb_services;
73      service->sid           = sid;
74      service->pcr_pid       = 0x1fff;
75 +    service->pcr_sid       = 0x1fff;
76      service->provider_name = av_strdup(provider_name);
77      service->name          = av_strdup(name);
78      if (!service->provider_name || !service->name)
79 @@ -719,18 +717,11 @@
80      return NULL;
81  }
82  
83 -static int64_t get_pcr(const MpegTSWrite *ts, AVIOContext *pb)
84 -{
85 -    return av_rescale(avio_tell(pb) + 11, 8 * PCR_TIME_BASE, ts->mux_rate) +
86 -           ts->first_pcr;
87 -}
88 -
89  static void mpegts_prefix_m2ts_header(AVFormatContext *s)
90  {
91      MpegTSWrite *ts = s->priv_data;
92      if (ts->m2ts_mode) {
93 -        int64_t pcr = get_pcr(s->priv_data, s->pb);
94 -        uint32_t tp_extra_header = pcr % 0x3fffffff;
95 +        uint32_t tp_extra_header = ts->pcr % 0x3fffffff;
96          tp_extra_header = AV_RB32(&tp_extra_header);
97          avio_write(s->pb, (unsigned char *) &tp_extra_header,
98                     sizeof(tp_extra_header));
99 @@ -751,6 +742,7 @@
100      MpegTSService *service;
101      AVStream *st, *pcr_st = NULL;
102      AVDictionaryEntry *title, *provider;
103 +    double clk_rate;
104      int i, j;
105      const char *service_name;
106      const char *provider_name;
107 @@ -759,6 +751,15 @@
108  
109      if (s->max_delay < 0) /* Not set by the caller */
110          s->max_delay = 0;
111 +    ts->delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
112 +
113 +    if (ts->m2ts_mode == -1) {
114 +        if (av_match_ext(s->filename, "m2ts")) {
115 +            ts->m2ts_mode = 1;
116 +        } else {
117 +            ts->m2ts_mode = 0;
118 +        }
119 +    }
120  
121      // round up to a whole number of TS packets
122      ts->pes_payload_size = (ts->pes_payload_size + 14 + 183) / 184 * 184 - 14;
123 @@ -803,6 +804,8 @@
124              service->program          = program;
125          }
126      }
127 +    if (ts->m2ts_mode > 1)
128 +        service->pmt.pid = 0x00ff + ts->service_id;
129  
130      ts->pat.pid          = PAT_PID;
131      /* Initialize at 15 so that it wraps and is equal to 0 for the
132 @@ -885,10 +888,9 @@
133          ts_st->cc              = 15;
134          /* update PCR pid by using the first video stream */
135          if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
136 -            service->pcr_pid == 0x1fff) {
137 -            service->pcr_pid = ts_st->pid;
138 +            service->pcr_sid == 0x1fff)
139              pcr_st           = st;
140 -        }
141 +
142          if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
143              st->codecpar->extradata_size > 0) {
144              AVStream *ast;
145 @@ -924,78 +926,47 @@
146      av_freep(&pids);
147  
148      /* if no video stream, use the first stream as PCR */
149 -    if (service->pcr_pid == 0x1fff && s->nb_streams > 0) {
150 -        pcr_st           = s->streams[0];
151 -        ts_st            = pcr_st->priv_data;
152 -        service->pcr_pid = ts_st->pid;
153 -    } else
154 -        ts_st = pcr_st->priv_data;
155 -
156 -    if (ts->mux_rate > 1) {
157 -        service->pcr_packet_period = (int64_t)ts->mux_rate * ts->pcr_period /
158 -                                     (TS_PACKET_SIZE * 8 * 1000);
159 -        ts->sdt_packet_period      = (int64_t)ts->mux_rate * SDT_RETRANS_TIME /
160 -                                     (TS_PACKET_SIZE * 8 * 1000);
161 -        ts->pat_packet_period      = (int64_t)ts->mux_rate * PAT_RETRANS_TIME /
162 -                                     (TS_PACKET_SIZE * 8 * 1000);
163 -
164 -        if (ts->copyts < 1)
165 -            ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);
166 -    } else {
167 -        /* Arbitrary values, PAT/PMT will also be written on video key frames */
168 -        ts->sdt_packet_period = 200;
169 -        ts->pat_packet_period = 40;
170 -        if (pcr_st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
171 -            int frame_size = av_get_audio_frame_duration2(pcr_st->codecpar, 0);
172 -            if (!frame_size) {
173 -                av_log(s, AV_LOG_WARNING, "frame size not set\n");
174 -                service->pcr_packet_period =
175 -                    pcr_st->codecpar->sample_rate / (10 * 512);
176 -            } else {
177 -                service->pcr_packet_period =
178 -                    pcr_st->codecpar->sample_rate / (10 * frame_size);
179 -            }
180 -        } else {
181 -            // max delta PCR 0.1s
182 -            // TODO: should be avg_frame_rate
183 -            service->pcr_packet_period =
184 -                ts_st->user_tb.den / (10 * ts_st->user_tb.num);
185 -        }
186 -        if (!service->pcr_packet_period)
187 -            service->pcr_packet_period = 1;
188 -    }
189 -
190 -    ts->last_pat_ts = AV_NOPTS_VALUE;
191 -    ts->last_sdt_ts = AV_NOPTS_VALUE;
192 -    // The user specified a period, use only it
193 -    if (ts->pat_period < INT_MAX/2) {
194 -        ts->pat_packet_period = INT_MAX;
195 +    if (!pcr_st && s->nb_streams > 0)
196 +        pcr_st = s->streams[0];
197 +    if (!pcr_st) {
198 +        av_log(s, AV_LOG_ERROR, "no streams\n");
199 +        ret = AVERROR(EINVAL);
200 +        goto fail;
201      }
202 -    if (ts->sdt_period < INT_MAX/2) {
203 -        ts->sdt_packet_period = INT_MAX;
204 +    ts_st  = pcr_st->priv_data;
205 +    if (service->pcr_sid == 0x1fff)
206 +        service->pcr_sid   = ts_st->pid;
207 +    if (service->pcr_pid == 0x1fff)
208 +        service->pcr_pid   = ts->m2ts_mode > 1 ?
209 +            0x1000 + ts->service_id : service->pcr_sid ;
210 +    if (service->pmt.pid == service->pcr_pid) {
211 +        av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", service->pcr_pid);
212 +        ret = AVERROR(EINVAL);
213 +        goto fail;
214      }
215  
216 +    clk_rate = ts->mux_rate > 1 ? ts->mux_rate : PCR_TIME_BASE;
217 +    ts->sdt_packet_period      = ts->sdt_period < 0 ? -1 : ts->sdt_period/1000 * clk_rate;
218 +    ts->pat_packet_period      = ts->pat_period/1000 * clk_rate;
219 +    service->pcr_packet_period = ts->pcr_period/1000 * clk_rate;
220 +    if (service->pcr_packet_period < (TS_PACKET_SIZE*8*10))
221 +        service->pcr_packet_period = (TS_PACKET_SIZE*8*10);
222 +    av_log(s, AV_LOG_VERBOSE, "clk_rate %f: ticks/pkt %d pcr, %d sdt, %d pmt\n", clk_rate,
223 +        (int)service->pcr_packet_period, (int)ts->sdt_packet_period, (int)ts->pat_packet_period);
224 +
225 +    if (ts->copyts < 1)
226 +        ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);
227 +
228      // output a PCR as soon as possible
229 -    service->pcr_packet_count = service->pcr_packet_period;
230 -    ts->pat_packet_count      = ts->pat_packet_period - 1;
231 -    ts->sdt_packet_count      = ts->sdt_packet_period - 1;
232 +    ts->pcr = 0;
233 +    service->pcr_packet_timer = 0;
234 +    ts->pat_packet_timer      = 0;
235 +    ts->sdt_packet_timer      = 0;
236  
237      if (ts->mux_rate == 1)
238          av_log(s, AV_LOG_VERBOSE, "muxrate VBR, ");
239      else
240          av_log(s, AV_LOG_VERBOSE, "muxrate %d, ", ts->mux_rate);
241 -    av_log(s, AV_LOG_VERBOSE,
242 -           "pcr every %d pkts, sdt every %d, pat/pmt every %d pkts\n",
243 -           service->pcr_packet_period,
244 -           ts->sdt_packet_period, ts->pat_packet_period);
245 -
246 -    if (ts->m2ts_mode == -1) {
247 -        if (av_match_ext(s->filename, "m2ts")) {
248 -            ts->m2ts_mode = 1;
249 -        } else {
250 -            ts->m2ts_mode = 0;
251 -        }
252 -    }
253  
254      return 0;
255  
256 @@ -1010,22 +981,12 @@
257      MpegTSWrite *ts = s->priv_data;
258      int i;
259  
260 -    if (++ts->sdt_packet_count == ts->sdt_packet_period ||
261 -        (dts != AV_NOPTS_VALUE && ts->last_sdt_ts == AV_NOPTS_VALUE) ||
262 -        (dts != AV_NOPTS_VALUE && dts - ts->last_sdt_ts >= ts->sdt_period*90000.0)
263 -    ) {
264 -        ts->sdt_packet_count = 0;
265 -        if (dts != AV_NOPTS_VALUE)
266 -            ts->last_sdt_ts = FFMAX(dts, ts->last_sdt_ts);
267 +    if ( ts->sdt_packet_period >= 0 && ts->pcr >= ts->sdt_packet_timer ) {
268 +        ts->sdt_packet_timer = ts->pcr + ts->sdt_packet_period;
269          mpegts_write_sdt(s);
270      }
271 -    if (++ts->pat_packet_count == ts->pat_packet_period ||
272 -        (dts != AV_NOPTS_VALUE && ts->last_pat_ts == AV_NOPTS_VALUE) ||
273 -        (dts != AV_NOPTS_VALUE && dts - ts->last_pat_ts >= ts->pat_period*90000.0) ||
274 -        force_pat) {
275 -        ts->pat_packet_count = 0;
276 -        if (dts != AV_NOPTS_VALUE)
277 -            ts->last_pat_ts = FFMAX(dts, ts->last_pat_ts);
278 +    if (ts->pcr >= ts->pat_packet_timer || force_pat) {
279 +        ts->pat_packet_timer = ts->pcr + ts->pat_packet_period;
280          mpegts_write_pat(s);
281          for (i = 0; i < ts->nb_services; i++)
282              mpegts_write_pmt(s, ts->services[i]);
283 @@ -1067,20 +1028,21 @@
284  {
285      MpegTSWrite *ts = s->priv_data;
286      MpegTSWriteStream *ts_st = st->priv_data;
287 +    uint32_t pcr_pid = ts_st->service->pcr_pid;
288      uint8_t *q;
289      uint8_t buf[TS_PACKET_SIZE];
290  
291      q    = buf;
292      *q++ = 0x47;
293 -    *q++ = ts_st->pid >> 8;
294 -    *q++ = ts_st->pid;
295 +    *q++ = pcr_pid >> 8;
296 +    *q++ = pcr_pid;
297      *q++ = 0x20 | ts_st->cc;   /* Adaptation only */
298      /* Continuity Count field does not increment (see 13818-1 section 2.4.3.3) */
299      *q++ = TS_PACKET_SIZE - 5; /* Adaptation Field Length */
300      *q++ = 0x10;               /* Adaptation flags: PCR present */
301  
302      /* PCR coded into 6 bytes */
303 -    q += write_pcr_bits(q, get_pcr(ts, s->pb));
304 +    q += write_pcr_bits(q, ts->pcr);
305  
306      /* stuffing bytes */
307      memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
308 @@ -1149,8 +1111,6 @@
309      uint8_t *q;
310      int val, is_start, len, header_len, write_pcr, is_dvb_subtitle, is_dvb_teletext, flags;
311      int afc_len, stuffing_len;
312 -    int64_t pcr = -1; /* avoid warning */
313 -    int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
314      int force_pat = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && key && !ts_st->prev_payload_key;
315  
316      av_assert0(ts_st->payload != buf || st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO);
317 @@ -1160,28 +1120,33 @@
318  
319      is_start = 1;
320      while (payload_size > 0) {
321 +        ts->pcr = ts->first_pcr + (ts->mux_rate == 1 ?
322 +            (dts == AV_NOPTS_VALUE ? 0 : (dts - ts->delay) * 300) :
323 +            // add 11, pcr references the last byte of program clock reference base
324 +            av_rescale(avio_tell(s->pb) + 11, 8 * PCR_TIME_BASE, ts->mux_rate));
325 +
326          retransmit_si_info(s, force_pat, dts);
327          force_pat = 0;
328  
329          write_pcr = 0;
330 -        if (ts_st->pid == ts_st->service->pcr_pid) {
331 -            if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on frames
332 -                ts_st->service->pcr_packet_count++;
333 -            if (ts_st->service->pcr_packet_count >=
334 -                ts_st->service->pcr_packet_period) {
335 -                ts_st->service->pcr_packet_count = 0;
336 +        if (ts_st->pid == ts_st->service->pcr_sid) {
337 +            if( ts->pcr >= ts_st->service->pcr_packet_timer ) {
338 +                ts_st->service->pcr_packet_timer = ts->pcr + ts_st->service->pcr_packet_period;
339                  write_pcr = 1;
340              }
341          }
342 -
343 +        if (write_pcr && ts_st->service->pcr_sid != ts_st->service->pcr_pid) {
344 +           mpegts_insert_pcr_only(s, st);
345 +           continue;
346 +        }
347          if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE &&
348 -            (dts - get_pcr(ts, s->pb) / 300) > delay) {
349 -            /* pcr insert gets priority over null packet insert */
350 -            if (write_pcr)
351 -                mpegts_insert_pcr_only(s, st);
352 +               (dts - ts->pcr / 300) > ts->delay) {
353 +           /* pcr insert gets priority over null packet insert */
354 +           if (write_pcr)
355 +               mpegts_insert_pcr_only(s, st);
356              else
357 -                mpegts_insert_null_packet(s);
358 -            /* recalculate write_pcr and possibly retransmit si_info */
359 +               mpegts_insert_null_packet(s);
360 +            /* recalculate write_pcr and possibly retransimit si_info */
361              continue;
362          }
363  
364 @@ -1191,13 +1156,17 @@
365          val  = ts_st->pid >> 8;
366          if (is_start)
367              val |= 0x40;
368 +        if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
369 +          st->codecpar->codec_id == AV_CODEC_ID_AC3 &&
370 +          ts->m2ts_mode > 1)
371 +            val |= 0x20;
372          *q++      = val;
373          *q++      = ts_st->pid;
374          ts_st->cc = ts_st->cc + 1 & 0xf;
375          *q++      = 0x10 | ts_st->cc; // payload indicator + CC
376          if (key && is_start && pts != AV_NOPTS_VALUE) {
377              // set Random Access for key frames
378 -            if (ts_st->pid == ts_st->service->pcr_pid)
379 +            if (ts_st->pid == ts_st->service->pcr_sid)
380                  write_pcr = 1;
381              set_af_flag(buf, 0x40);
382              q = get_ts_payload_start(buf);
383 @@ -1205,14 +1174,10 @@
384          if (write_pcr) {
385              set_af_flag(buf, 0x10);
386              q = get_ts_payload_start(buf);
387 -            // add 11, pcr references the last byte of program clock reference base
388              if (ts->mux_rate > 1)
389 -                pcr = get_pcr(ts, s->pb);
390 -            else
391 -                pcr = (dts - delay) * 300;
392 -            if (dts != AV_NOPTS_VALUE && dts < pcr / 300)
393 +            if (dts != AV_NOPTS_VALUE && dts < ts->pcr / 300)
394                  av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n");
395 -            extend_af(buf, write_pcr_bits(q, pcr));
396 +            extend_af(buf, write_pcr_bits(q, ts->pcr));
397              q = get_ts_payload_start(buf);
398          }
399          if (is_start) {
400 @@ -1310,11 +1275,13 @@
401              *q++ = flags;
402              *q++ = header_len;
403              if (pts != AV_NOPTS_VALUE) {
404 -                write_pts(q, flags >> 6, pts);
405 +                int64_t ts_pts = pts + ts->ts_offset;
406 +                write_pts(q, flags >> 6, ts_pts);
407                  q += 5;
408              }
409              if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
410 -                write_pts(q, 1, dts);
411 +                int64_t ts_dts = dts + ts->ts_offset;
412 +                write_pts(q, 1, ts_dts);
413                  q += 5;
414              }
415              if (pes_extension && st->codecpar->codec_id == AV_CODEC_ID_DIRAC) {
416 @@ -1483,7 +1450,6 @@
417      uint8_t *data = NULL;
418      MpegTSWrite *ts = s->priv_data;
419      MpegTSWriteStream *ts_st = st->priv_data;
420 -    const int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) * 2;
421      int64_t dts = pkt->dts, pts = pkt->pts;
422      int opus_samples = 0;
423      int side_data_size;
424 @@ -1504,16 +1470,15 @@
425      }
426  
427      if (ts->flags & MPEGTS_FLAG_REEMIT_PAT_PMT) {
428 -        ts->pat_packet_count = ts->pat_packet_period - 1;
429 -        ts->sdt_packet_count = ts->sdt_packet_period - 1;
430 +        ts->pat_packet_timer = ts->sdt_packet_timer = 0;
431          ts->flags           &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
432      }
433  
434      if (ts->copyts < 1) {
435          if (pts != AV_NOPTS_VALUE)
436 -            pts += delay;
437 +            pts += 2*ts->delay;
438          if (dts != AV_NOPTS_VALUE)
439 -            dts += delay;
440 +            dts += 2*ts->delay;
441      }
442  
443      if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
444 @@ -1671,7 +1636,7 @@
445              AVStream *st2 = s->streams[i];
446              MpegTSWriteStream *ts_st2 = st2->priv_data;
447              if (   ts_st2->payload_size
448 -               && (ts_st2->payload_dts == AV_NOPTS_VALUE || dts - ts_st2->payload_dts > delay/2)) {
449 +               && (ts_st2->payload_dts == AV_NOPTS_VALUE || dts - ts_st2->payload_dts > ts->delay)) {
450                  mpegts_write_pes(s, st2, ts_st2->payload, ts_st2->payload_size,
451                                   ts_st2->payload_pts, ts_st2->payload_dts,
452                                   ts_st2->payload_flags & AV_PKT_FLAG_KEY, stream_id);
453 @@ -1838,12 +1803,18 @@
454      { "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
455        offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT,
456        { .i64 = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM },
457 +    { "mpegts_pcr_start_pid", "Set the first pid of the PCR.",
458 +      offsetof(MpegTSWrite, pcr_start_pid), AV_OPT_TYPE_INT,
459 +      { .i64 = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM },
460      { "mpegts_start_pid", "Set the first pid.",
461        offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT,
462        { .i64 = 0x0100 }, 0x0020, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM },
463      { "mpegts_m2ts_mode", "Enable m2ts mode.",
464        offsetof(MpegTSWrite, m2ts_mode), AV_OPT_TYPE_BOOL,
465 -      { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM },
466 +      { .i64 = -1 }, -1, 2, AV_OPT_FLAG_ENCODING_PARAM },
467 +    { "mpegts_pcr_offset", "clock offset.",
468 +      offsetof(MpegTSWrite, ts_offset), AV_OPT_TYPE_BOOL,
469 +      { .i64 = 0 }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
470      { "muxrate", NULL,
471        offsetof(MpegTSWrite, mux_rate), AV_OPT_TYPE_INT,
472        { .i64 = 1 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
473 @@ -1878,15 +1849,15 @@
474      { "omit_video_pes_length", "Omit the PES packet length for video packets",
475        offsetof(MpegTSWrite, omit_video_pes_length), AV_OPT_TYPE_BOOL,
476        { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
477 -    { "pcr_period", "PCR retransmission time",
478 -      offsetof(MpegTSWrite, pcr_period), AV_OPT_TYPE_INT,
479 -      { .i64 = PCR_RETRANS_TIME }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
480 -    { "pat_period", "PAT/PMT retransmission time limit in seconds",
481 +    { "pcr_period", "PCR retransmission time limit in msecs",
482 +      offsetof(MpegTSWrite, pcr_period), AV_OPT_TYPE_DOUBLE,
483 +      { .dbl = PCR_RETRANS_TIME }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
484 +    { "pat_period", "PAT/PMT retransmission time limit in msecs",
485        offsetof(MpegTSWrite, pat_period), AV_OPT_TYPE_DOUBLE,
486 -      { .dbl = INT_MAX }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
487 -    { "sdt_period", "SDT retransmission time limit in seconds",
488 +      { .dbl = PAT_RETRANS_TIME }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
489 +    { "sdt_period", "SDT retransmission time limit in msecs",
490        offsetof(MpegTSWrite, sdt_period), AV_OPT_TYPE_DOUBLE,
491 -      { .dbl = INT_MAX }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
492 +      { .dbl = SDT_RETRANS_TIME }, -1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
493      { NULL },
494  };
495