Hi Marton,

‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Sunday, 4 de August de 2019 22:30, Marton Balint <c...@passwd.hu> wrote:

> PCR generation was based on counting packets for both CBR and VBR streams.
> Couting packets might have worked for CBR streams (when muxrate was specified)
> but it only took into account the packets of a service (or the packets of the
> PCR stream lately), so even that was problematic for multi program streams.
>
> The new code works on actual PCR for CBR and packet DTS values for VBR 
> streams,
> so the default 20ms PCR retransmission time is now respected for both CBR and
> VBR.
>

I do some tests with this patch and the previous 
https://patchwork.ffmpeg.org/patch/14210/

And the result is that the repetition rate of PCR is inconsistent: it's never
constant and varies between different PCR streams.

But fortunately I have an idea...


> Signed-off-by: Marton Balint c...@passwd.hu
>
> libavformat/mpegtsenc.c | 60 +++++++++++++++----------------------------------
> tests/ref/lavf/ts | 2 +-
> 2 files changed, 19 insertions(+), 43 deletions(-)
>
> diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c

[...]

> @@ -1194,18 +1168,24 @@  static void mpegts_write_pes(AVFormatContext *s, 
> AVStream *st,
>
>      is_start = 1;
>      while (payload_size > 0) {
> +        int64_t pcr = -1; /* avoid warning */
> +
>          retransmit_si_info(s, force_pat, dts);
>          force_pat = 0;
>
>          write_pcr = 0;
> -        if (ts_st->pcr_packet_period) {
> -            if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on 
> frames
> -                ts_st->pcr_packet_count++;
> -            if (ts_st->pcr_packet_count >=
> -                ts_st->pcr_packet_period) {
> -                ts_st->pcr_packet_count = 0;
> -                write_pcr = 1;
> +        if (ts_st->pcr_period) {
> +            if (ts->mux_rate > 1) {
> +                pcr = get_pcr(ts, s->pb);
> +                if (pcr - ts_st->last_pcr >= ts_st->pcr_period)
> +                    write_pcr = 1;
> +            } else if (dts != AV_NOPTS_VALUE) {
> +                pcr = (dts - delay) * 300;
> +                if (pcr - ts_st->last_pcr >= ts_st->pcr_period && is_start)
> +                    write_pcr = 1;
>              }
> +            if (write_pcr)
> +                ts_st->last_pcr = FFMAX(pcr - ts_st->pcr_period, 
> ts_st->last_pcr + ts_st->pcr_period);
>          }

IMHO, here you return to make the same mistake of the previous code:
only consider one PCR stream. Instead of the "if (ts_st->pcr_period)" it's
required to iterate over all PCR streams and do the corresponding checks.
And if some PCR stream has exceeded the pcr_period limit then enforce to
write an empty TS packet with a PCR mark.

In fact, the root cause is the sequential PES writing on the MPEG-TS muxer.
And this is the reason for my interleaving mux patch:
https://patchwork.ffmpeg.org/patch/13745/

However, until I rebase your code for the interleave mux mode, the PCR
generation of this patch needs to be fixed.

[...]


Regards.
A.H.

---
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to