[FFmpeg-devel] [PATCH] avformat/mpegtsenc: add pcr_at_keyframe flag
Zhao Zhili
quinkblack at foxmail.com
Tue Sep 27 23:37:59 EEST 2022
From: Zhao Zhili <zhilizhao at tencent.com>
Add PCR at keyframe can be undesirable when -pcr_period is
specified. Add an flag to disable this behavior.
Signed-off-by: Zhao Zhili <zhilizhao at tencent.com>
---
doc/muxers.texi | 2 ++
libavformat/mpegtsenc.c | 8 ++++++--
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/doc/muxers.texi b/doc/muxers.texi
index b2f4326aae..0f576d8096 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -1915,6 +1915,8 @@ Conform to System B (DVB) instead of System A (ATSC).
Mark the initial packet of each stream as discontinuity.
@item nit
Emit NIT table.
+ at item pcr_at_keyframe
+Write PCR at key frame.
@end table
@item mpegts_copyts @var{boolean}
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 5148a6aecd..808d2c04a2 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -112,6 +112,7 @@ typedef struct MpegTSWrite {
#define MPEGTS_FLAG_SYSTEM_B 0x08
#define MPEGTS_FLAG_DISCONT 0x10
#define MPEGTS_FLAG_NIT 0x20
+#define MPEGTS_FLAG_PCR_AT_KEYFRAME 0x40
int flags;
int copyts;
int tables_version;
@@ -1566,7 +1567,8 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
q = get_ts_payload_start(buf);
ts_st->discontinuity = 0;
}
- if (key && is_start && pts != AV_NOPTS_VALUE &&
+ if ((ts->flags & MPEGTS_FLAG_PCR_AT_KEYFRAME) &&
+ key && is_start && pts != AV_NOPTS_VALUE &&
!is_dvb_teletext /* adaptation+payload forbidden for teletext (ETSI EN 300 472 V1.3.1 4.1) */) {
// set Random Access for key frames
if (ts_st->pcr_period)
@@ -2269,7 +2271,7 @@ static const AVOption options[] = {
{ "muxrate", NULL, OFFSET(mux_rate), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, INT_MAX, ENC },
{ "pes_payload_size", "Minimum PES packet payload in bytes",
OFFSET(pes_payload_size), AV_OPT_TYPE_INT, { .i64 = DEFAULT_PES_PAYLOAD_SIZE }, 0, INT_MAX, ENC },
- { "mpegts_flags", "MPEG-TS muxing flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, 0, INT_MAX, ENC, "mpegts_flags" },
+ { "mpegts_flags", "MPEG-TS muxing flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, { .i64 = MPEGTS_FLAG_PCR_AT_KEYFRAME }, 0, INT_MAX, ENC, "mpegts_flags" },
{ "resend_headers", "Reemit PAT/PMT before writing the next packet",
0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_REEMIT_PAT_PMT }, 0, INT_MAX, ENC, "mpegts_flags" },
{ "latm", "Use LATM packetization for AAC",
@@ -2282,6 +2284,8 @@ static const AVOption options[] = {
0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_DISCONT }, 0, INT_MAX, ENC, "mpegts_flags" },
{ "nit", "Enable NIT transmission",
0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_NIT}, 0, INT_MAX, ENC, "mpegts_flags" },
+ { "pcr_at_keyframe", "Write PCR at key frame",
+ 0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_PCR_AT_KEYFRAME }, 0, INT_MAX, ENC, "mpegts_flags" },
{ "mpegts_copyts", "don't offset dts/pts", OFFSET(copyts), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, ENC },
{ "tables_version", "set PAT, PMT, SDT and NIT version", OFFSET(tables_version), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 31, ENC },
{ "omit_video_pes_length", "Omit the PES packet length for video packets",
--
2.25.1
More information about the ffmpeg-devel
mailing list