‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Thursday, 18 de April de 2019 11:01, Andreas Håkon via ffmpeg-devel 
<ffmpeg-devel@ffmpeg.org> wrote:

> Hi,
>
> This patch resolves one very specific use case:
>
> -   When you use the mpegts muxer;
> -   And use the global parameter “-copyts”;
> -   And use the parameter “-muxrate” for the mpegts muxer;
> -   And use too the parameter “-mpegts_copyts”.
>
>     The problem is created because the member “first_pcr” of the MpegTSWrite 
> struct isn’t initialized with a correct timestamp (so when copying the 
> timestamps the initial value is 0). And in this case an infinite loop is 
> created because the code never writes PES packets when the “mux_rate” isn’t 
> VBR (equals to 1). See the block that creates the loop here (note the 
> "continue" command at end):
>     
> https://github.com/FFmpeg/FFmpeg/blob/a0559fcd81f42f446c93357a943699f9d44eeb79/libavformat/mpegtsenc.c#L1211
>
>     So, this patch fixes the problem initializing the “first_pcr” with the 
> first DTS value that comes when using the incoming timestamps.
>
>     Regards.
>     A.H.
>

Hi,

Here a new version of the patch.

The "fist_pcr" value is now derived from DTS in a more consistent way.

Regards,
A.H.


---

From c59569ca9426fef455edabfa648cb2ff678c1640 Mon Sep 17 00:00:00 2001
From: Andreas Hakon <andreas.ha...@protonmail.com>
Date: Fri, 19 Apr 2019 09:32:33 +0100
Subject: [PATCH] libavformat: fix copyts and muxrate in mpegts muxer v2

When using "-copyts" and "-muxrate" with the mpegts muxer the muxing fails
because the member "first_pcr" of the MpegTSWrite struct isn't initialized
with a correct timestamp.

The behaviour of the error is an infinite loop created in the function
mpegts_write_pes() because the code never writes PES packets.

This patch resolves the problem initializing the "first_pcr" with a value
derived from the first DTS value seen.

Signed-off-by: Andreas Hakon <andreas.ha...@protonmail.com>
---
 libavformat/mpegtsenc.c |   10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index fc0ea22..858b0d7 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -971,6 +971,9 @@ static int mpegts_init(AVFormatContext *s)
 
         if (ts->copyts < 1)
             ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, 
AV_TIME_BASE);
+        else
+            ts->first_pcr = AV_NOPTS_VALUE;
+
     } else {
         /* Arbitrary values, PAT/PMT will also be written on video key frames 
*/
         ts->sdt_packet_period = 200;
@@ -1186,12 +1189,16 @@ static void mpegts_write_pes(AVFormatContext *s, 
AVStream *st,
     int64_t pcr = -1; /* avoid warning */
     int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
     int force_pat = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && key && 
!ts_st->prev_payload_key;
+    int last_payload_size = 0;
 
     av_assert0(ts_st->payload != buf || st->codecpar->codec_type != 
AVMEDIA_TYPE_VIDEO);
     if (ts->flags & MPEGTS_FLAG_PAT_PMT_AT_FRAMES && st->codecpar->codec_type 
== AVMEDIA_TYPE_VIDEO) {
         force_pat = 1;
     }
 
+    if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE && ts->first_pcr == 
AV_NOPTS_VALUE)
+        ts->first_pcr = (dts * 300) - av_rescale(s->max_delay, PCR_TIME_BASE, 
AV_TIME_BASE);
+
     is_start = 1;
     while (payload_size > 0) {
         retransmit_si_info(s, force_pat, dts);
@@ -1209,12 +1216,13 @@ static void mpegts_write_pes(AVFormatContext *s, 
AVStream *st,
         }
 
         if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE &&
-            (dts - get_pcr(ts, s->pb) / 300) > delay) {
+            last_payload_size != payload_size && (dts - get_pcr(ts, s->pb) / 
300) > delay) {
             /* pcr insert gets priority over null packet insert */
             if (write_pcr)
                 mpegts_insert_pcr_only(s, st);
             else
                 mpegts_insert_null_packet(s);
+            last_payload_size = payload_size;
             /* recalculate write_pcr and possibly retransmit si_info */
             continue;
         }
-- 
1.7.10.4

_______________________________________________
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