Hi,

A patch for a new optional parameter for the mpegtsenc muxer.

Regards.
A.H.

---
From 7f9f1a992615e15121b661d4cd1b9c1e32e1c894 Mon Sep 17 00:00:00 2001
From: Andreas Hakon <andreas.ha...@protonmail.com>
Date: Thu, 25 Apr 2019 09:49:29 +0100
Subject: [PATCH] libavformat/mpegtsenc: enforce PCR packets without payload

This patch provides a new optional parameter for the mpegtsenc muxer.
The parameter "-pcr_without_payload" can be used to override the default
behaviour of writing PCR timestamps in TS packets with payload.
Using a value greater than 0 all TS packets carrying PCR timestamps will
be forced to have an empty payload. Otherwise (with 0) the regular behaviour is
used and PCR packets can have payload. Futhermore with a value greater than 1
the packet with the PCR will be repeated the number of times indicated.
The default value is "-pcr_without_payload 0", which corresponds to the current
behaviour.
This can be handy for many reasons.

Signed-off-by: Andreas Hakon <andreas.ha...@protonmail.com>
---
 doc/muxers.texi         |    5 +++++
 libavformat/mpegtsenc.c |   18 ++++++++++++++----
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/doc/muxers.texi b/doc/muxers.texi
index 83ae017..9acdee3 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -1564,6 +1564,11 @@ Set a constant muxrate. Default is VBR.
 @item pes_payload_size @var{integer}
 Set minimum PES packet payload in bytes. Default is @code{2930}.
 
+@item pcr_without_payload @var{integer}
+Generates PCR packets without payload. When the value is greater than 1
+it repeats the PCR packet N times. With a 0 value it generates regular
+PCR packets with payload. Default is @code{0}.
+
 @item mpegts_flags @var{flags}
 Set mpegts flags. Accepts the following options:
 @table @samp
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index fc0ea22..0cc42cd 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -97,6 +97,7 @@ typedef struct MpegTSWrite {
     int pmt_start_pid;
     int start_pid;
     int m2ts_mode;
+    int pcr_repetition;
 
     int reemit_pat_pmt; // backward compatibility
 
@@ -1093,12 +1094,13 @@ static void mpegts_insert_null_packet(AVFormatContext 
*s)
 }
 
 /* Write a single transport stream packet with a PCR and no payload */
-static void mpegts_insert_pcr_only(AVFormatContext *s, AVStream *st)
+static void mpegts_insert_pcr_only(AVFormatContext *s, AVStream *st, int 
repetition)
 {
     MpegTSWrite *ts = s->priv_data;
     MpegTSWriteStream *ts_st = st->priv_data;
     uint8_t *q;
     uint8_t buf[TS_PACKET_SIZE];
+    int i;
 
     q    = buf;
     *q++ = 0x47;
@@ -1119,7 +1121,9 @@ static void mpegts_insert_pcr_only(AVFormatContext *s, 
AVStream *st)
     /* stuffing bytes */
     memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
     mpegts_prefix_m2ts_header(s);
-    avio_write(s->pb, buf, TS_PACKET_SIZE);
+    for (i=0; i<repetition; i++) {
+        avio_write(s->pb, buf, TS_PACKET_SIZE);
+    }
 }
 
 static void write_pts(uint8_t *q, int fourbits, int64_t pts)
@@ -1212,12 +1216,15 @@ static void mpegts_write_pes(AVFormatContext *s, 
AVStream *st,
             (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);
+                mpegts_insert_pcr_only(s, st, ts->pcr_repetition < 1 ? 1 : 
ts->pcr_repetition);
             else
                 mpegts_insert_null_packet(s);
             /* recalculate write_pcr and possibly retransmit si_info */
             continue;
         }
+        if (write_pcr && ts->pcr_repetition > 0) {
+            mpegts_insert_pcr_only(s, st, ts->pcr_repetition);
+        }
 
         /* prepare packet header */
         q    = buf;
@@ -1241,7 +1248,7 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream 
*st,
             set_af_flag(buf, 0x40);
             q = get_ts_payload_start(buf);
         }
-        if (write_pcr) {
+        if (write_pcr && ts->pcr_repetition == 0) {
             set_af_flag(buf, 0x10);
             q = get_ts_payload_start(buf);
             // add 11, pcr references the last byte of program clock reference 
base
@@ -1926,6 +1933,9 @@ static const AVOption options[] = {
     { "pes_payload_size", "Minimum PES packet payload in bytes",
       offsetof(MpegTSWrite, pes_payload_size), AV_OPT_TYPE_INT,
       { .i64 = DEFAULT_PES_PAYLOAD_SIZE }, 0, INT_MAX, 
AV_OPT_FLAG_ENCODING_PARAM },
+    { "pcr_without_payload", "Generate PCR packets without payload",
+      offsetof(MpegTSWrite, pcr_repetition), AV_OPT_TYPE_INT,
+      { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     { "mpegts_flags", "MPEG-TS muxing flags",
       offsetof(MpegTSWrite, flags), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, 0, 
INT_MAX,
       AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
-- 
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