[FFmpeg-devel] Using copyts with mpegts output fails after 26, 5 hours
Panagiotis Malakoudis
malakudi at gmail.com
Thu May 2 21:45:33 EEST 2019
> On Thu, May 02, 2019 at 08:13:10PM +0300, Panagiotis Malakoudis wrote:
> > When outputing to mpegts format, using -copyts option makes program
> > fail after the oveflow of mpegts PCR happens at around 26 hours and 30
> > minutes. When not using -copyts, only a warning is reported.
> > In order to reproduce the issue, you first have to create a 27 hour
> > mpegts video.
> > I have described the problem in thorough at ticket
> > https://trac.ffmpeg.org/ticket/7876
> >
> > The issue is resolved if you use a patch created originally by Arut
> > (Roman Arutyunyan) at
> > https://github.com/arut/ffmpeg-patches/blob/master/mpegts-33bit
> >
> > I have converted the patch in order to apply with current git and
> > confirmed working fine, fixing the above mentioned issue. Original
> > author describes the patch as: "Implements smooth 33-bit mpeg-ts
> > timestamp overflow in mpegts muxer."
> >
> > Here it is:
> > --- libavformat/mpegts.c 2019-04-30 16:11:49.000000000 +0300
> > +++ libavformat/mpegts.c 2019-04-30 18:55:12.736428766 +0300
>
> doesnt apply with git am
> Applying: Using copyts with mpegts output fails after 26, 5 hours
> error: mpegts.c: does not exist in index
> Patch failed at 0001 Using copyts with mpegts output fails after 26, 5 hours
>
Sorry, it was a simple diff, not a git am compatible diff. Hope I made
it correctly this time:
>From 5273daaf8e568fc2a2b9a77d91cb8a834b9e14e7 Mon Sep 17 00:00:00 2001
From: Panagiotis Malakoudis <malakudi at gmail.com>
Date: Thu, 2 May 2019 21:34:44 +0300
Subject: [PATCH] Implement smooth 33bit mpegts timestamp overflow in mpegts
muxer
---
libavformat/mpegts.c | 27 +++++++++++++++++++++++++--
1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 8a84e5cc19..b7f5d8ea4e 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -163,6 +163,9 @@ struct MpegTSContext {
/** structure to keep track of Program->pids mapping */
unsigned int nb_prg;
struct Program *prg;
+
+ /** base timestamp for smooth rolling over 33bits */
+ int64_t base_ts;
int8_t crc_validity[NB_PID_MAX];
/** filters for various streams specified by PMT + for the PAT and PMT */
@@ -982,6 +985,26 @@ static void new_data_packet(const uint8_t
*buffer, int len, AVPacket *pkt)
pkt->size = len;
}
+static int64_t unroll_timestamp(MpegTSContext *ts, int64_t t)
+{
+ int64_t dt;
+
+ if (t == AV_NOPTS_VALUE)
+ return t;
+
+ if (!ts->base_ts)
+ ts->base_ts = t;
+
+ dt = (t - ts->base_ts) & 0x01ffffffffll;
+ if (dt & 0x0100000000ll) {
+ dt |= 0xffffffff00000000ll;
+ }
+
+ ts->base_ts += dt;
+
+ return ts->base_ts;
+}
+
static int new_pes_packet(PESContext *pes, AVPacket *pkt)
{
uint8_t *sd;
@@ -1005,8 +1028,8 @@ static int new_pes_packet(PESContext *pes, AVPacket *pkt)
pkt->stream_index = pes->sub_st->index;
else
pkt->stream_index = pes->st->index;
- pkt->pts = pes->pts;
- pkt->dts = pes->dts;
+ pkt->pts = unroll_timestamp(pes->ts, pes->pts);
+ pkt->dts = unroll_timestamp(pes->ts, pes->dts);
/* store position of first TS packet of this PES packet */
pkt->pos = pes->ts_packet_pos;
pkt->flags = pes->flags;
--
2.20.1
More information about the ffmpeg-devel
mailing list