[FFmpeg-devel,2/4] avformat/mpegtsenc: add support for setting PCR interval for VBR streams

Submitted by Marton Balint on Aug. 14, 2019, 11:51 p.m.

Details

Message ID 20190814235130.5973-2-cus@passwd.hu
State New
Headers show

Commit Message

Marton Balint Aug. 14, 2019, 11:51 p.m.
Also document the algorithm for the default PCR interval.

Fixes ticket #8061.

Signed-off-by: Marton Balint <cus@passwd.hu>
---
 doc/muxers.texi         | 6 ++++--
 libavformat/mpegtsenc.c | 7 ++++---
 2 files changed, 8 insertions(+), 5 deletions(-)

Comments

Andreas Håkon Aug. 16, 2019, 8:25 a.m.
Hi Marton,

Very good work with your series of patches on the mpegtsenc!

‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Thursday, 15 de August de 2019 1:51, Marton Balint <cus@passwd.hu> wrote:

> Also document the algorithm for the default PCR interval.

> [...]

> +   if (ts->mux_rate > 1 || ts->pcr_period_ms >= 0) {
> +          int pcr_period_ms = ts->pcr_period_ms == -1 ? PCR_RETRANS_TIME : ts->pcr_period_ms;
> +          ts_st->pcr_period = av_rescale(pcr_period_ms, PCR_TIME_BASE, 1000);
>     } else {
>     /* For VBR we select the highest multiple of frame duration which is less than 100 ms. */

A simple aesthetic comment:
Please, change this to...
/* By default, for VBR we select the highest multiple of frame duration which is less than 100 ms. */

Regards.
A.H.

---
Marton Balint Aug. 22, 2019, 10:28 p.m.
On Fri, 16 Aug 2019, Andreas Håkon wrote:

> Hi Marton,
>
> Very good work with your series of patches on the mpegtsenc!
>
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> On Thursday, 15 de August de 2019 1:51, Marton Balint <cus@passwd.hu> wrote:
>
>> Also document the algorithm for the default PCR interval.
>
>> [...]
>
>> +   if (ts->mux_rate > 1 || ts->pcr_period_ms >= 0) {
>> +          int pcr_period_ms = ts->pcr_period_ms == -1 ? PCR_RETRANS_TIME : ts->pcr_period_ms;
>> +          ts_st->pcr_period = av_rescale(pcr_period_ms, PCR_TIME_BASE, 1000);
>>     } else {
>>     /* For VBR we select the highest multiple of frame duration which is less than 100 ms. */
>
> A simple aesthetic comment:
> Please, change this to...
> /* By default, for VBR we select the highest multiple of frame duration which is less than 100 ms. */

Ok, changed locally.

Will apply patchset soon.

Regards,
Marton
Marton Balint Aug. 23, 2019, 9:13 p.m.
On Fri, 23 Aug 2019, Marton Balint wrote:

>
>
> On Fri, 16 Aug 2019, Andreas Håkon wrote:
>
>> Hi Marton,
>>
>> Very good work with your series of patches on the mpegtsenc!
>>
>> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
>> On Thursday, 15 de August de 2019 1:51, Marton Balint <cus@passwd.hu> 
> wrote:
>>
>>> Also document the algorithm for the default PCR interval.
>>
>>> [...]
>>
>>> +   if (ts->mux_rate > 1 || ts->pcr_period_ms >= 0) {
>>> +          int pcr_period_ms = ts->pcr_period_ms == -1 ? PCR_RETRANS_TIME 
> : ts->pcr_period_ms;
>>> +          ts_st->pcr_period = av_rescale(pcr_period_ms, PCR_TIME_BASE, 
> 1000);
>>>     } else {
>>>     /* For VBR we select the highest multiple of frame duration which is 
> less than 100 ms. */
>>
>> A simple aesthetic comment:
>> Please, change this to...
>> /* By default, for VBR we select the highest multiple of frame duration 
> which is less than 100 ms. */
>
> Ok, changed locally.
>
> Will apply patchset soon.

Applied patchset.

Regards,
Marton
Andreas Håkon Aug. 26, 2019, 10:11 a.m.
Hi Marton,


‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Friday, 23 de August de 2019 23:13, Marton Balint <cus@passwd.hu> wrote:

> On Fri, 23 Aug 2019, Marton Balint wrote:
>
> > On Fri, 16 Aug 2019, Andreas Håkon wrote:
> >
> > > Hi Marton,
> > > Very good work with your series of patches on the mpegtsenc!
> >
> > > A simple aesthetic comment:
> > > Please, change this to...
> > > /* By default, for VBR we select the highest multiple of frame duration
> > > which is less than 100 ms. */
> >
> > Ok, changed locally.
> > Will apply patchset soon.
>
> Applied patchset.
>

Great! I'm testing it (last patchset) with my Interleaved MUX patch and it seems to play well.
https://patchwork.ffmpeg.org/patch/14589/

So, please, can you start reviewing it?
Regards.
A.H.

---

Patch hide | download patch | download mbox

diff --git a/doc/muxers.texi b/doc/muxers.texi
index 019eee6145..c27bfee4f5 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -1619,8 +1619,10 @@  is @code{-1}, which results in shifting timestamps so that they start from 0.
 Omit the PES packet length for video packets. Default is @code{1} (true).
 
 @item pcr_period @var{integer}
-Override the default PCR retransmission time in milliseconds. Ignored if
-variable muxrate is selected. Default is @code{20}.
+Override the default PCR retransmission time in milliseconds. Default is
+@code{-1} which means that the PCR interval will be determined automatically:
+20 ms is used for CBR streams, the highest multiple of the frame duration which
+is less than 100 ms is used for VBR streams.
 
 @item pat_period @var{double}
 Maximum time in seconds between PAT/PMT tables.
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 5cdd9d3313..9dee5fa1d0 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -790,8 +790,9 @@  static void enable_pcr_generation_for_stream(AVFormatContext *s, AVStream *pcr_s
     MpegTSWrite *ts = s->priv_data;
     MpegTSWriteStream *ts_st = pcr_st->priv_data;
 
-    if (ts->mux_rate > 1) {
-        ts_st->pcr_period = av_rescale(ts->pcr_period_ms, PCR_TIME_BASE, 1000);
+    if (ts->mux_rate > 1 || ts->pcr_period_ms >= 0) {
+        int pcr_period_ms = ts->pcr_period_ms == -1 ? PCR_RETRANS_TIME : ts->pcr_period_ms;
+        ts_st->pcr_period = av_rescale(pcr_period_ms, PCR_TIME_BASE, 1000);
     } else {
         /* For VBR we select the highest multiple of frame duration which is less than 100 ms. */
         int64_t frame_period = 0;
@@ -1964,7 +1965,7 @@  static const AVOption options[] = {
       { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
     { "pcr_period", "PCR retransmission time in milliseconds",
       offsetof(MpegTSWrite, pcr_period_ms), AV_OPT_TYPE_INT,
-      { .i64 = PCR_RETRANS_TIME }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
+      { .i64 = -1 }, -1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     { "pat_period", "PAT/PMT retransmission time limit in seconds",
       offsetof(MpegTSWrite, pat_period), AV_OPT_TYPE_DOUBLE,
       { .dbl = INT_MAX }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },